diff --git a/contracts/partials/ITTDex.ligo b/contracts/partials/ITTDex.ligo index 633ee497..3433abc9 100644 --- a/contracts/partials/ITTDex.ligo +++ b/contracts/partials/ITTDex.ligo @@ -18,10 +18,9 @@ type token_identifier_fa12 is address type transfer_type_fa12 is TransferTypeFA12 of token_transfer_params_fa12 type transfer_type_fa2 is TransferTypeFA2 of token_transfer_params_fa2 -type pair_type is +type token_type is | Fa12 | Fa2 -| Mixed type pair_info is record [ token_a_pool : nat; (* tez reserves in the pool *) @@ -34,7 +33,8 @@ type tokens_info is record [ token_b_address : address; token_a_id : nat; token_b_id : nat; - standard : pair_type; + token_a_type : token_type; + token_b_type : token_type; ] type token_pair is bytes diff --git a/contracts/partials/TTMethodDex.ligo b/contracts/partials/TTMethodDex.ligo index af689023..335429f2 100644 --- a/contracts/partials/TTMethodDex.ligo +++ b/contracts/partials/TTMethodDex.ligo @@ -95,9 +95,12 @@ function initialize_exchange (const p : dex_action ; const s : dex_storage ; con case p of | InitializeExchange(params) -> { (* check preconditions *) - if params.pair.token_a_address = params.pair.token_b_address and params.pair.token_a_id > params.pair.token_b_id then + if params.pair.token_a_address = params.pair.token_b_address and params.pair.token_a_id >= params.pair.token_b_id then failwith("Dex/wrong-token-id") else skip; + if params.pair.token_a_address > params.pair.token_b_address then + failwith("Dex/wrong-pair") + else skip; (* get par info*) const res : (pair_info * nat) = get_pair(params.pair, s); @@ -142,55 +145,45 @@ function initialize_exchange (const p : dex_action ; const s : dex_storage ; con s.tokens[token_id] := params.pair; (* prepare operations to get initial liquidity *) - case params.pair.standard of + case params.pair.token_a_type of | Fa12 -> { - if params.pair.token_a_address > params.pair.token_b_address then - failwith("Dex/wrong-pair") - else skip; operations := list[ transfer_fa12( Tezos.sender, this, params.token_a_in, - params.pair.token_a_address); - transfer_fa12( - Tezos.sender, - this, - params.token_b_in, - params.pair.token_b_address)]; + params.pair.token_a_address)]; } | Fa2 -> { - if params.pair.token_a_address > params.pair.token_b_address then - failwith("Dex/wrong-pair") - else skip; operations := list[ transfer_fa2( Tezos.sender, this, params.token_a_in, params.pair.token_a_id, - params.pair.token_a_address); - transfer_fa2( + params.pair.token_a_address) + ]; + } + end; + + (* prepare operations to get initial liquidity *) + case params.pair.token_b_type of + | Fa12 -> { + operations := + transfer_fa12( Tezos.sender, this, params.token_b_in, - params.pair.token_b_id, - params.pair.token_b_address); - ]; + params.pair.token_b_address) # operations; } - | Mixed -> { - operations :=list[ + | Fa2 -> { + operations := transfer_fa2( - Tezos.sender, - this, - params.token_a_in, - params.pair.token_a_id, - params.pair.token_a_address); - transfer_fa12( Tezos.sender, this, params.token_b_in, - params.pair.token_b_address)]; + params.pair.token_b_id, + params.pair.token_b_address) # operations; } end; } @@ -211,10 +204,12 @@ function token_to_token (const p : dex_action; const s : dex_storage; const this | TokenToTokenRoutePayment(n) -> skip | TokenToTokenPayment(params) -> { (* check preconditions *) - if params.pair.token_a_address = params.pair.token_b_address and params.pair.token_a_id > params.pair.token_b_id then + if params.pair.token_a_address = params.pair.token_b_address and params.pair.token_a_id >= params.pair.token_b_id then failwith("Dex/wrong-token-id") else skip; - + if params.pair.token_a_address > params.pair.token_b_address then + failwith("Dex/wrong-pair") + else skip; (* get par info*) const res : (pair_info * nat) = get_pair(params.pair, s); const pair : pair_info = res.0; @@ -256,55 +251,44 @@ function token_to_token (const p : dex_action; const s : dex_storage; const this } else failwith("Dex/high-out"); (* prepare operations to withdraw user's tokens and transfer XTZ *) - case params.pair.standard of + case params.pair.token_a_type of | Fa12 -> { - if params.pair.token_a_address > params.pair.token_b_address then - failwith("Dex/wrong-pair") - else skip; operations := list[ transfer_fa12( Tezos.sender, this, params.amount_in, params.pair.token_a_address); - transfer_fa12( - this, - params.receiver, - token_b_out, - params.pair.token_b_address)]; + ]; } | Fa2 -> { - if params.pair.token_a_address > params.pair.token_b_address then - failwith("Dex/wrong-pair") - else skip; operations := list[ transfer_fa2( Tezos.sender, this, params.amount_in, params.pair.token_a_id, - params.pair.token_a_address); - transfer_fa2( + params.pair.token_a_address) + ]; + } + end; + case params.pair.token_b_type of + | Fa12 -> { + operations := + transfer_fa12( this, params.receiver, token_b_out, - params.pair.token_b_id, - params.pair.token_b_address); - ]; + params.pair.token_b_address) # operations; } - | Mixed -> { - operations := list[ + | Fa2 -> { + operations := transfer_fa2( - Tezos.sender, - this, - params.amount_in, - params.pair.token_a_id, - params.pair.token_a_address); - transfer_fa12( this, params.receiver, token_b_out, - params.pair.token_b_address)]; + params.pair.token_b_id, + params.pair.token_b_address) # operations; } end; } @@ -330,60 +314,43 @@ function token_to_token (const p : dex_action; const s : dex_storage; const this } else failwith("Dex/high-out"); (* prepare operations to withdraw user's tokens and transfer XTZ *) - case params.pair.standard of + case params.pair.token_a_type of | Fa12 -> { - if params.pair.token_a_address > params.pair.token_b_address then - failwith("Dex/wrong-pair") - else skip; operations := list[ - transfer_fa12( - Tezos.sender, - this, - params.amount_in, - params.pair.token_b_address); transfer_fa12( this, params.receiver, token_a_out, - params.pair.token_a_address)]; + params.pair.token_a_address) + ]; } | Fa2 -> { - if params.pair.token_a_address > params.pair.token_b_address then - failwith("Dex/wrong-pair") - else skip; - operations := list[ - transfer_fa2( - Tezos.sender, - this, - params.amount_in, - params.pair.token_b_id, - params.pair.token_b_address); - Tezos.transaction( - wrap_fa2_transfer_trx( - this, - params.receiver, - token_a_out, - params.pair.token_a_id), - 0mutez, - get_fa2_token_contract( - params.pair.token_a_address) - )]; - } - | Mixed -> { operations := list[ - transfer_fa12( - Tezos.sender, - this, - params.amount_in, - params.pair.token_b_address); transfer_fa2( this, params.receiver, token_a_out, params.pair.token_a_id, - params.pair.token_a_address); + params.pair.token_a_address) ]; + } + end; + case params.pair.token_b_type of + | Fa12 -> { + operations := transfer_fa12( + Tezos.sender, + this, + params.amount_in, + params.pair.token_b_address) # operations; } + | Fa2 -> { + operations := transfer_fa2( + Tezos.sender, + this, + params.amount_in, + params.pair.token_b_id, + params.pair.token_b_address) # operations; + } end; } end; @@ -398,9 +365,12 @@ function token_to_token (const p : dex_action; const s : dex_storage; const this function internal_token_to_token_swap (const tmp : internal_swap_type; const params : swap_slice_type ) : internal_swap_type is block { (* check preconditions *) - if params.pair.token_a_address = params.pair.token_b_address and params.pair.token_a_id > params.pair.token_b_id then + if params.pair.token_a_address = params.pair.token_b_address and params.pair.token_a_id >= params.pair.token_b_id then failwith("Dex/wrong-token-id") else skip; + if params.pair.token_a_address > params.pair.token_b_address then + failwith("Dex/wrong-pair") + else skip; (* get par info*) const res : (pair_info * nat) = get_pair(params.pair, tmp.s); @@ -442,11 +412,8 @@ function internal_token_to_token_swap (const tmp : internal_swap_type; const par tmp.token_id_in := params.pair.token_b_id; (* prepare operations to withdraw user's tokens and transfer XTZ *) - case params.pair.standard of + case params.pair.token_b_type of | Fa12 -> { - if params.pair.token_a_address > params.pair.token_b_address then - failwith("Dex/wrong-pair") - else skip; tmp.operation := Some( transfer_fa12( tmp.sender, @@ -455,9 +422,6 @@ function internal_token_to_token_swap (const tmp : internal_swap_type; const par params.pair.token_b_address)); } | Fa2 -> { - if params.pair.token_a_address > params.pair.token_b_address then - failwith("Dex/wrong-pair") - else skip; tmp.operation := Some( transfer_fa2( tmp.sender, @@ -467,13 +431,6 @@ function internal_token_to_token_swap (const tmp : internal_swap_type; const par params.pair.token_b_address) ); } - | Mixed -> { - tmp.operation := Some(transfer_fa12( - tmp.sender, - tmp.receiver, - token_b_out, - params.pair.token_b_address)); - } end; } | Buy -> { @@ -502,11 +459,8 @@ function internal_token_to_token_swap (const tmp : internal_swap_type; const par pair.token_a_address; tmp.token_id_in := params.pair.token_a_id; (* prepare operations to withdraw user's tokens and transfer XTZ *) - case params.pair.standard of + case params.pair.token_a_type of | Fa12 -> { - if params.pair.token_a_address > params.pair.token_b_address then - failwith("Dex/wrong-pair") - else skip; tmp.operation := Some( transfer_fa12( tmp.sender, @@ -515,9 +469,6 @@ function internal_token_to_token_swap (const tmp : internal_swap_type; const par params.pair.token_a_address)); } | Fa2 -> { - if params.pair.token_a_address > params.pair.token_b_address then - failwith("Dex/wrong-pair") - else skip; tmp.operation := Some( transfer_fa2( tmp.sender, @@ -527,16 +478,6 @@ function internal_token_to_token_swap (const tmp : internal_swap_type; const par params.pair.token_a_address) ); } - | Mixed -> { - tmp.operation := Some( - transfer_fa2( - tmp.sender, - tmp.receiver, - token_a_out, - params.pair.token_a_id, - params.pair.token_a_address) - ); - } end; } end; @@ -573,10 +514,10 @@ function token_to_token_route (const p : dex_action; const s : dex_storage; cons var token_id_in : nat := first_swap.pair.token_a_id; var token_address_in : address := first_swap.pair.token_a_address; - case first_swap.pair.standard of - | Fa12 -> { - case first_swap.operation of - | Sell -> { + case first_swap.operation of + | Sell -> { + case first_swap.pair.token_a_type of + | Fa12 -> { operations := list[ transfer_fa12( Tezos.sender, @@ -584,64 +525,39 @@ function token_to_token_route (const p : dex_action; const s : dex_storage; cons params.amount_in, first_swap.pair.token_a_address)]; } - | Buy -> { - token_id_in := first_swap.pair.token_b_id; - token_address_in := first_swap.pair.token_b_address; + | Fa2 -> { operations := list[ - transfer_fa12( - Tezos.sender, - this, - params.amount_in, - first_swap.pair.token_b_address)]; - } - end - } - | Fa2 -> { - case first_swap.operation of - | Sell -> { - operations := list[ - transfer_fa2( + transfer_fa2( Tezos.sender, this, params.amount_in, first_swap.pair.token_a_id, first_swap.pair.token_a_address)] } - | Buy -> { + end; + } + | Buy -> { token_id_in := first_swap.pair.token_b_id; token_address_in := first_swap.pair.token_b_address; - operations := list[ - transfer_fa2( - Tezos.sender, - this, - params.amount_in, - first_swap.pair.token_b_id, - first_swap.pair.token_b_address)] - } - end - } - | Mixed -> { - case first_swap.operation of - | Sell -> { + case first_swap.pair.token_b_type of + | Fa12 -> { operations := list[ - transfer_fa2( + transfer_fa12( Tezos.sender, this, params.amount_in, - first_swap.pair.token_a_id, - first_swap.pair.token_a_address)] + first_swap.pair.token_b_address)]; } - | Buy -> { - token_id_in := first_swap.pair.token_b_id; - token_address_in := first_swap.pair.token_b_address; + | Fa2 -> { operations := list[ - transfer_fa12( + transfer_fa2( Tezos.sender, this, params.amount_in, + first_swap.pair.token_b_id, first_swap.pair.token_b_address)] - } - end + } + end; } end; @@ -685,9 +601,12 @@ function invest_liquidity (const p : dex_action; const s : dex_storage; const th | TokenToTokenPayment(n) -> skip | InvestLiquidity(params) -> { (* check preconditions *) - if params.pair.token_a_address = params.pair.token_b_address and params.pair.token_a_id > params.pair.token_b_id then + if params.pair.token_a_address = params.pair.token_b_address and params.pair.token_a_id >= params.pair.token_b_id then failwith("Dex/wrong-token-id") else skip; + if params.pair.token_a_address > params.pair.token_b_address then + failwith("Dex/wrong-pair") + else skip; (* get par info*) const res : (pair_info * nat) = get_pair(params.pair, s); @@ -748,54 +667,40 @@ function invest_liquidity (const p : dex_action; const s : dex_storage; const th s.pairs[token_id] := pair; (* prepare operations to get initial liquidity *) - case params.pair.standard of + case params.pair.token_a_type of | Fa12 -> { - if params.pair.token_a_address > params.pair.token_b_address then - failwith("Dex/wrong-pair") - else skip; - operations := list[ + operations := list[ transfer_fa12( Tezos.sender, this, tokens_a_required, - params.pair.token_a_address); - transfer_fa12( - Tezos.sender, - this, - tokens_b_required, - params.pair.token_b_address)]; + params.pair.token_a_address)]; } | Fa2 -> { - if params.pair.token_a_address > params.pair.token_b_address then - failwith("Dex/wrong-pair") - else skip; operations := list[ transfer_fa2( Tezos.sender, this, tokens_a_required, params.pair.token_a_id, - params.pair.token_a_address); - transfer_fa2( - Tezos.sender, - this, - tokens_b_required, - params.pair.token_b_id, - params.pair.token_b_address)]; + params.pair.token_a_address);]; } - | Mixed -> { - operations := list[ - transfer_fa2( - Tezos.sender, - this, - tokens_a_required, - params.pair.token_a_id, - params.pair.token_a_address); - transfer_fa12( + end; + case params.pair.token_b_type of + | Fa12 -> { + operations := transfer_fa12( Tezos.sender, this, tokens_b_required, - params.pair.token_b_address)] + params.pair.token_b_address) # operations; + } + | Fa2 -> { + operations := transfer_fa2( + Tezos.sender, + this, + tokens_b_required, + params.pair.token_b_id, + params.pair.token_b_address) # operations; } end; } @@ -814,9 +719,12 @@ function divest_liquidity (const p : dex_action; const s : dex_storage; const th | InvestLiquidity(n) -> skip | DivestLiquidity(params) -> { (* check preconditions *) - if params.pair.token_a_address = params.pair.token_b_address and params.pair.token_a_id > params.pair.token_b_id then + if params.pair.token_a_address = params.pair.token_b_address and params.pair.token_a_id >= params.pair.token_b_id then failwith("Dex/wrong-token-id") else skip; + if params.pair.token_a_address > params.pair.token_b_address then + failwith("Dex/wrong-pair") + else skip; (* get par info*) const res : (pair_info * nat) = get_pair(params.pair, s); @@ -873,55 +781,40 @@ function divest_liquidity (const p : dex_action; const s : dex_storage; const th s.pairs[token_id] := pair; (* prepare operations with XTZ and tokens to user *) - case params.pair.standard of + case params.pair.token_a_type of | Fa12 -> { - if params.pair.token_a_address > params.pair.token_b_address then - failwith("Dex/wrong-pair") - else skip; operations := list[ transfer_fa12( this, Tezos.sender, token_a_divested, - params.pair.token_a_address); - transfer_fa12( - this, - Tezos.sender, - token_b_divested, - params.pair.token_b_address)]; + params.pair.token_a_address)]; } | Fa2 -> { - if params.pair.token_a_address > params.pair.token_b_address then - failwith("Dex/wrong-pair") - else skip; operations := list[ transfer_fa2( this, Tezos.sender, token_a_divested, params.pair.token_a_id, - params.pair.token_a_address); - transfer_fa2( + params.pair.token_a_address)]; + } + end; + case params.pair.token_b_type of + | Fa12 -> { + operations := transfer_fa12( this, Tezos.sender, token_b_divested, - params.pair.token_b_id, - params.pair.token_b_address)]; + params.pair.token_b_address) # operations; } - | Mixed -> { - operations := list[ - transfer_fa2( - this, - Tezos.sender, - token_a_divested, - params.pair.token_a_id, - params.pair.token_a_address); - transfer_fa12( + | Fa2 -> { + operations := transfer_fa2( this, Tezos.sender, token_b_divested, - params.pair.token_b_address) - ]; + params.pair.token_b_id, + params.pair.token_b_address) # operations; } end; } diff --git a/test/BuyTokenWithRouter.spec.ts b/test/BuyTokenWithRouter.spec.ts index 655bb8d8..bc41f72b 100644 --- a/test/BuyTokenWithRouter.spec.ts +++ b/test/BuyTokenWithRouter.spec.ts @@ -93,7 +93,14 @@ contract("BuyTokenWithRoute()", function () { token_b_address: tokenBAddress, token_a_id: new BigNumber(0), token_b_id: new BigNumber(0), - standard: { [standard.toLowerCase()]: null }, + token_a_type: + standard.toLowerCase() == "mixed" + ? "fa2" + : standard.toLowerCase(), + token_b_type: + standard.toLowerCase() == "mixed" + ? "fa12" + : standard.toLowerCase(), }, operation: { buy: null }, }, @@ -103,7 +110,14 @@ contract("BuyTokenWithRoute()", function () { token_b_address: reverseOrder ? tokenAAddress : tokenCAddress, token_a_id: new BigNumber(0), token_b_id: new BigNumber(0), - standard: { [standard.toLowerCase()]: null }, + token_a_type: + standard.toLowerCase() == "mixed" + ? "fa2" + : standard.toLowerCase(), + token_b_type: + standard.toLowerCase() == "mixed" + ? "fa12" + : standard.toLowerCase(), }, operation: { sell: null }, }, @@ -199,7 +213,14 @@ contract("BuyTokenWithRoute()", function () { token_b_address: tokenBAddress, token_a_id: new BigNumber(0), token_b_id: new BigNumber(0), - standard: { [standard.toLowerCase()]: null }, + token_a_type: + standard.toLowerCase() == "mixed" + ? "fa2" + : standard.toLowerCase(), + token_b_type: + standard.toLowerCase() == "mixed" + ? "fa12" + : standard.toLowerCase(), }, operation: { buy: null }, }, @@ -209,7 +230,14 @@ contract("BuyTokenWithRoute()", function () { token_b_address: reverseOrder ? tokenAAddress : tokenCAddress, token_a_id: new BigNumber(0), token_b_id: new BigNumber(0), - standard: { [standard.toLowerCase()]: null }, + token_a_type: + standard.toLowerCase() == "mixed" + ? "fa2" + : standard.toLowerCase(), + token_b_type: + standard.toLowerCase() == "mixed" + ? "fa12" + : standard.toLowerCase(), }, operation: { sell: null }, }, diff --git a/test/SellTokenWithRoute.spec.ts b/test/SellTokenWithRoute.spec.ts index 2abec25c..e036df6b 100644 --- a/test/SellTokenWithRoute.spec.ts +++ b/test/SellTokenWithRoute.spec.ts @@ -90,7 +90,14 @@ contract("SellTokenWithRoute()", function () { token_b_address: tokenBAddress, token_a_id: new BigNumber(0), token_b_id: new BigNumber(0), - standard: { [standard.toLowerCase()]: null }, + token_a_type: + standard.toLowerCase() == "mixed" + ? "fa2" + : standard.toLowerCase(), + token_b_type: + standard.toLowerCase() == "mixed" + ? "fa12" + : standard.toLowerCase(), }, operation: { sell: null }, }, @@ -100,7 +107,14 @@ contract("SellTokenWithRoute()", function () { token_b_address: reverseOrder ? tokenCAddress : tokenBAddress, token_a_id: new BigNumber(0), token_b_id: new BigNumber(0), - standard: { [standard.toLowerCase()]: null }, + token_a_type: + standard.toLowerCase() == "mixed" + ? "fa2" + : standard.toLowerCase(), + token_b_type: + standard.toLowerCase() == "mixed" + ? "fa12" + : standard.toLowerCase(), }, operation: { buy: null }, }, @@ -196,7 +210,14 @@ contract("SellTokenWithRoute()", function () { token_b_address: tokenBAddress, token_a_id: new BigNumber(0), token_b_id: new BigNumber(0), - standard: { [standard.toLowerCase()]: null }, + token_a_type: + standard.toLowerCase() == "mixed" + ? "fa2" + : standard.toLowerCase(), + token_b_type: + standard.toLowerCase() == "mixed" + ? "fa12" + : standard.toLowerCase(), }, operation: { sell: null }, }, @@ -206,7 +227,14 @@ contract("SellTokenWithRoute()", function () { token_b_address: reverseOrder ? tokenCAddress : tokenBAddress, token_a_id: new BigNumber(0), token_b_id: new BigNumber(0), - standard: { [standard.toLowerCase()]: null }, + token_a_type: + standard.toLowerCase() == "mixed" + ? "fa2" + : standard.toLowerCase(), + token_b_type: + standard.toLowerCase() == "mixed" + ? "fa12" + : standard.toLowerCase(), }, operation: { buy: null }, }, diff --git a/test/helpers/types.ts b/test/helpers/types.ts index 6cd85bfd..4cfa72b1 100644 --- a/test/helpers/types.ts +++ b/test/helpers/types.ts @@ -5,9 +5,8 @@ export declare type TokenInfo = { token_b_address: string; token_a_id?: BigNumber; token_b_id?: BigNumber; - standard: { - [key: string]: any; - }; + token_a_type: string; + token_b_type: string; }; export declare type PairInfo = {