diff --git a/batcher/errors.mligo b/batcher/errors.mligo index db5da42f..d6e50bd0 100644 --- a/batcher/errors.mligo +++ b/batcher/errors.mligo @@ -1,4 +1,3 @@ - [@inline] let no_rate_available_for_swap : nat = 100n [@inline] let invalid_token_address : nat = 101n [@inline] let invalid_tezos_address : nat = 102n @@ -68,4 +67,5 @@ [@inline] let unable_to_get_vaults_from_marketmaker = 166n [@inline] let unable_to_get_current_batches_from_batcher = 167n [@inline] let sender_not_marketmaker : nat = 168n - +[@inline] let unable_to_get_response_entrypoint_from_vault : nat = 169n +[@inline] let unable_to_get_balance_of_entrypoint_from_token : nat = 170n diff --git a/batcher/michelson/btctz-vault-ghostnet.tz b/batcher/michelson/btctz-vault-ghostnet.tz index 67557279..488c5eaf 100644 --- a/batcher/michelson/btctz-vault-ghostnet.tz +++ b/batcher/michelson/btctz-vault-ghostnet.tz @@ -1,24 +1,28 @@ { parameter (or (or (or (or (nat %addLiquidity) (mutez %addReward)) - (or (address %change_admin_address) (address %change_batcher_address))) - (or (or (address %change_marketmaker_address) (address %change_tokenmanager_address)) - (or (unit %claim) - (pair %injectLiquidity - (pair (nat %amount) - (pair %from_token - (nat %token_id) - (string %name) - (option %address address) - (nat %decimals) - (option %standard string))) - (or %side (unit %buy) (unit %sell)) - (pair %to_token - (nat %token_id) - (string %name) - (option %address address) - (nat %decimals) - (option %standard string)))))) - (unit %removeLiquidity)) ; + (or (nat %balance_response_fa12) + (pair %balance_response_fa2 + (nat %balance) + (pair %request (address %owner) (nat %token_id))))) + (or (or (address %change_admin_address) (address %change_batcher_address)) + (or (address %change_marketmaker_address) (address %change_tokenmanager_address)))) + (or (or (unit %claim) + (pair %injectLiquidity + (pair (nat %amount) + (pair %from_token + (nat %token_id) + (string %name) + (option %address address) + (nat %decimals) + (option %standard string))) + (or %side (unit %buy) (unit %sell)) + (pair %to_token + (nat %token_id) + (string %name) + (option %address address) + (nat %decimals) + (option %standard string)))) + (unit %removeLiquidity))) ; storage (pair (pair (pair (address %administrator) (address %batcher)) (map %foreign_tokens @@ -47,6 +51,11 @@ address (pair (pair (address %holder) (nat %shares)) (mutez %unclaimed))))) ; code { LAMBDA + (pair (option address) nat) + address + { UNPAIR ; IF_NONE { FAILWITH } { SWAP ; DROP } } ; + EMPTY_MAP string (pair (pair nat string (option address) nat (option string)) nat) ; + LAMBDA (pair (pair (pair nat string (option address) nat (option string)) nat) (map string (pair (pair nat string (option address) nat (option string)) nat))) (map string (pair (pair nat string (option address) nat (option string)) nat)) @@ -82,111 +91,7 @@ SOME ; DIG 2 ; UPDATE } } ; - LAMBDA - (pair (lambda - (pair (pair (pair nat string (option address) nat (option string)) nat) - (map string (pair (pair nat string (option address) nat (option string)) nat))) - (map string (pair (pair nat string (option address) nat (option string)) nat))) - (pair (pair int int) - (pair (pair nat string (option address) nat (option string)) nat) - (map string (pair (pair nat string (option address) nat (option string)) nat)))) - (pair (pair (pair nat string (option address) nat (option string)) nat) - (map string (pair (pair nat string (option address) nat (option string)) nat))) - { UNPAIR ; - SWAP ; - UNPAIR 3 ; - DUP 2 ; - CDR ; - INT ; - PUSH int 1 ; - SWAP ; - PAIR ; - DUP ; - CDR ; - DUP 3 ; - CDR ; - MUL ; - SWAP ; - CAR ; - DIG 2 ; - CAR ; - MUL ; - PAIR ; - PUSH int 0 ; - DUP 2 ; - CAR ; - COMPARE ; - LT ; - IF { PUSH int -1 ; DUP 2 ; CDR ; MUL ; PUSH int -1 ; DIG 2 ; CAR ; MUL ; PAIR } - {} ; - DUP ; - CDR ; - PUSH nat 1 ; - PUSH nat 0 ; - PUSH nat 10 ; - PAIR ; - PAIR ; - LEFT nat ; - LOOP_LEFT - { UNPAIR ; - UNPAIR ; - PUSH nat 0 ; - DUP 3 ; - COMPARE ; - EQ ; - IF { DROP 2 ; RIGHT (pair (pair nat nat) nat) } - { PUSH nat 1 ; - PUSH nat 1 ; - DUP 4 ; - AND ; - COMPARE ; - EQ ; - IF { DUP ; DIG 3 ; MUL } { DIG 2 } ; - PUSH nat 1 ; - DIG 3 ; - LSR ; - DUP 3 ; - DIG 3 ; - MUL ; - PAIR ; - PAIR ; - LEFT nat } } ; - DIG 2 ; - CAR ; - MUL ; - EDIV ; - IF_NONE { PUSH string "DIV by 0" ; FAILWITH } {} ; - CAR ; - ISNAT ; - IF_NONE { PUSH nat 119 ; FAILWITH } {} ; - DUP 2 ; - CDR ; - DUP 2 ; - COMPARE ; - GT ; - IF { DROP 4 ; PUSH nat 153 ; FAILWITH } - { DUP ; - DUP 3 ; - CDR ; - INT ; - SUB ; - ABS ; - DUP 3 ; - DIG 2 ; - UPDATE 2 ; - PUSH nat 0 ; - DUP 2 ; - CDR ; - COMPARE ; - EQ ; - IF { DIG 4 ; DROP 2 ; DIG 2 } - { DIG 3 ; SWAP ; PAIR ; DIG 3 ; SWAP ; EXEC } ; - DUG 2 ; - UPDATE 2 ; - PAIR } } ; - DUP 2 ; - APPLY ; - DIG 2 ; + DIG 3 ; UNPAIR ; IF_LEFT { DIG 2 ; @@ -194,7 +99,9 @@ DROP 2 ; IF_LEFT { IF_LEFT - { IF_LEFT + { DIG 2 ; + DROP ; + IF_LEFT { PUSH mutez 1 ; AMOUNT ; COMPARE ; @@ -255,13 +162,138 @@ CONS ; TRANSFER_TOKENS } { DROP 2 ; PUSH nat 108 ; FAILWITH } } } } ; - DUP 4 ; + SELF_ADDRESS ; + DUP 5 ; CDR ; CAR ; CAR ; + CAR ; DUP ; + GET 5 ; + IF_NONE { PUSH nat 101 ; FAILWITH } {} ; + DUP 2 ; + GET 8 ; + IF_NONE { PUSH nat 108 ; FAILWITH } {} ; + PUSH string "FA2 standard" ; + DUP 2 ; + COMPARE ; + EQ ; + IF { DIG 2 ; + DROP 2 ; + DUP 2 ; + CONTRACT %balance_response_fa12 nat ; + SWAP ; + CONTRACT %getbalance (pair (contract %callback nat) (address %owner)) ; + SWAP ; + IF_NONE + { DROP ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DROP ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; DUP 4 ; DIG 3 ; PAIR ; TRANSFER_TOKENS } } } + { PUSH string "FA1.2 standard" ; + SWAP ; + COMPARE ; + EQ ; + IF { DUP 3 ; + CONTRACT %balance_response_fa2 + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id)))) ; + SWAP ; + CONTRACT %balance_of + (pair (contract %callback + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id))))) + (list %requests (pair (address %owner) (nat %token_id)))) ; + SWAP ; + IF_NONE + { DROP 2 ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DROP 2 ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; + NIL (pair address nat) ; + DIG 4 ; + CAR ; + DUP 6 ; + PAIR ; + CONS ; + DIG 3 ; + PAIR ; + TRANSFER_TOKENS } } } + { DROP 2 ; PUSH nat 108 ; FAILWITH } } ; + NIL operation ; + SWAP ; + CONS ; + DUP 6 ; CAR ; - DUP 4 ; + CDR ; + CAR ; + ITER { CDR ; + SWAP ; + DUP 2 ; + CAR ; + GET 5 ; + IF_NONE { PUSH nat 101 ; FAILWITH } {} ; + DUP 3 ; + CAR ; + GET 8 ; + IF_NONE { PUSH nat 108 ; FAILWITH } {} ; + PUSH string "FA2 standard" ; + DUP 2 ; + COMPARE ; + EQ ; + IF { DIG 3 ; + DROP 2 ; + DUP 3 ; + CONTRACT %balance_response_fa12 nat ; + SWAP ; + CONTRACT %getbalance (pair (contract %callback nat) (address %owner)) ; + SWAP ; + IF_NONE + { DROP ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DROP ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; DUP 5 ; DIG 3 ; PAIR ; TRANSFER_TOKENS } } } + { PUSH string "FA1.2 standard" ; + SWAP ; + COMPARE ; + EQ ; + IF { DUP 4 ; + CONTRACT %balance_response_fa2 + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id)))) ; + SWAP ; + CONTRACT %balance_of + (pair (contract %callback + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id))))) + (list %requests (pair (address %owner) (nat %token_id)))) ; + SWAP ; + IF_NONE + { DIG 2 ; DROP 2 ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DIG 2 ; DROP 2 ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; + NIL (pair address nat) ; + DIG 5 ; + CAR ; + CAR ; + DUP 7 ; + PAIR ; + CONS ; + DIG 3 ; + PAIR ; + TRANSFER_TOKENS } } } + { DIG 2 ; DROP 2 ; PUSH nat 108 ; FAILWITH } } ; + CONS } ; + SWAP ; + DROP ; + DUP 5 ; + CDR ; + CAR ; + CAR ; + DUP ; + CAR ; + DUP 5 ; CAR ; DUP 2 ; GET 8 ; @@ -298,37 +330,37 @@ AND ; AND ; NOT ; - IF { DIG 2 ; DIG 3 ; DIG 4 ; DROP 4 ; PUSH nat 115 ; FAILWITH } - { DUP 3 ; + IF { DIG 3 ; DIG 4 ; DIG 5 ; DROP 4 ; PUSH nat 115 ; FAILWITH } + { DUP 4 ; CDR ; - DUP 6 ; + DUP 7 ; CDR ; CDR ; CAR ; ADD ; DUP 2 ; - DUP 5 ; + DUP 6 ; CDR ; DIG 3 ; CDR ; ADD ; UPDATE 2 ; - DUP 6 ; + DUP 7 ; CDR ; CDR ; CDR ; DUP ; CAR ; - DUP 7 ; + DUP 8 ; MEM ; IF { CDR ; - DUP 6 ; + DUP 7 ; GET ; IF_NONE { NONE (pair (pair address nat) mutez) } { SOME } } { DROP ; NONE (pair (pair address nat) mutez) } ; IF_NONE - { PUSH mutez 0 ; DIG 4 ; CDR ; DUP 6 ; PAIR ; PAIR } - { DIG 4 ; + { PUSH mutez 0 ; DIG 5 ; CDR ; DUP 7 ; PAIR ; PAIR } + { DIG 5 ; CDR ; DUP 2 ; CAR ; @@ -340,8 +372,8 @@ DIG 2 ; UPDATE 2 ; UPDATE 1 } ; - DUP 6 ; DUP 7 ; + DUP 8 ; CDR ; DUP ; CDR ; @@ -353,19 +385,19 @@ CDR ; DUP ; CDR ; - DIG 7 ; + DIG 8 ; CDR ; CDR ; CDR ; DUP ; CAR ; - DUP 9 ; + DUP 10 ; MEM ; - IF { DUP ; CDR ; DIG 5 ; SOME ; DIG 8 ; UPDATE ; UPDATE 2 } + IF { DUP ; CDR ; DIG 5 ; SOME ; DIG 9 ; UPDATE ; UPDATE 2 } { DUP ; DUP 2 ; CAR ; - DUP 10 ; + DUP 11 ; PUSH bool True ; SWAP ; UPDATE ; @@ -373,7 +405,7 @@ SWAP ; CDR ; DIG 5 ; - DIG 8 ; + DIG 9 ; SWAP ; SOME ; SWAP ; @@ -390,7 +422,7 @@ UPDATE 1 ; UPDATE 1 ; UPDATE 2 } ; - NIL operation ; + SWAP ; DIG 2 ; CONS } { DUP 2 ; @@ -551,6 +583,171 @@ UPDATE 2 ; UPDATE 2 ; NIL operation } } + { IF_LEFT + { SENDER ; + DUP 3 ; + CDR ; + CAR ; + CAR ; + CAR ; + GET 5 ; + IF_NONE { PUSH nat 101 ; FAILWITH } {} ; + PUSH nat 0 ; + DUP 5 ; + CDR ; + CAR ; + CAR ; + CAR ; + CAR ; + COMPARE ; + EQ ; + DUP 3 ; + DIG 2 ; + COMPARE ; + EQ ; + AND ; + IF { DUP 3 ; + DUP 4 ; + CDR ; + DUP ; + CAR ; + DIG 5 ; + CDR ; + CAR ; + CAR ; + DUP 6 ; + UPDATE 2 ; + UPDATE 1 ; + UPDATE 1 ; + UPDATE 2 } + { DIG 2 } ; + DUP ; + CAR ; + CDR ; + CAR ; + DUP ; + ITER { CDR ; + PUSH nat 101 ; + DUP 2 ; + CAR ; + GET 5 ; + PAIR ; + DUP 7 ; + SWAP ; + EXEC ; + PUSH nat 0 ; + DUP 3 ; + CAR ; + CAR ; + COMPARE ; + EQ ; + DUP 6 ; + DIG 2 ; + COMPARE ; + EQ ; + AND ; + IF { DUP 5 ; UPDATE 2 ; SWAP ; DUP 2 ; SOME ; DIG 2 ; CAR ; GET 3 ; UPDATE } + { DROP } } ; + DIG 2 ; + DIG 3 ; + DIG 4 ; + DROP 3 ; + DUP 2 ; + DIG 2 ; + CAR ; + DUP ; + CDR ; + DIG 3 ; + UPDATE 1 ; + UPDATE 2 ; + UPDATE 1 } + { SENDER ; + DUP 2 ; + CAR ; + DIG 2 ; + CDR ; + CDR ; + DUP 4 ; + CDR ; + CAR ; + CAR ; + CAR ; + GET 5 ; + IF_NONE { PUSH nat 101 ; FAILWITH } {} ; + DUP 2 ; + DUP 6 ; + CDR ; + CAR ; + CAR ; + CAR ; + CAR ; + COMPARE ; + EQ ; + DUP 5 ; + DIG 2 ; + COMPARE ; + EQ ; + AND ; + IF { DUP 4 ; + DUP 5 ; + CDR ; + DUP ; + CAR ; + DIG 6 ; + CDR ; + CAR ; + CAR ; + DUP 6 ; + UPDATE 2 ; + UPDATE 1 ; + UPDATE 1 ; + UPDATE 2 } + { DIG 3 } ; + DUP ; + CAR ; + CDR ; + CAR ; + DUP ; + ITER { CDR ; + PUSH nat 101 ; + DUP 2 ; + CAR ; + GET 5 ; + PAIR ; + DUP 8 ; + SWAP ; + EXEC ; + DUP 5 ; + DUP 3 ; + CAR ; + CAR ; + COMPARE ; + EQ ; + DUP 8 ; + DIG 2 ; + COMPARE ; + EQ ; + AND ; + IF { DUP 5 ; UPDATE 2 ; SWAP ; DUP 2 ; SOME ; DIG 2 ; CAR ; GET 3 ; UPDATE } + { DROP } } ; + DIG 2 ; + DIG 3 ; + DIG 4 ; + DIG 5 ; + DROP 4 ; + DUP 2 ; + DIG 2 ; + CAR ; + DUP ; + CDR ; + DIG 3 ; + UPDATE 1 ; + UPDATE 2 ; + UPDATE 1 } ; + NIL operation } } + { DIG 2 ; + DROP ; + IF_LEFT { IF_LEFT { DUP 2 ; CAR ; @@ -595,10 +792,7 @@ DIG 3 ; UPDATE 2 ; UPDATE 1 ; - UPDATE 1 } ; - NIL operation } ; - PAIR } - { IF_LEFT + UPDATE 1 } } { IF_LEFT { DUP 2 ; CAR ; @@ -643,470 +837,912 @@ DIG 3 ; UPDATE 2 ; UPDATE 1 ; - UPDATE 2 } ; - NIL operation ; - PAIR } - { IF_LEFT - { DROP ; - PUSH mutez 1 ; - AMOUNT ; - COMPARE ; - LT ; - IF {} { PUSH nat 118 ; FAILWITH } ; - SENDER ; - DUP 2 ; - CDR ; - CDR ; + UPDATE 2 } } ; + NIL operation } ; + PAIR } + { DIG 4 ; + DROP ; + IF_LEFT + { DIG 2 ; + DIG 3 ; + DROP 2 ; + IF_LEFT + { DROP ; + PUSH mutez 1 ; + AMOUNT ; + COMPARE ; + LT ; + IF {} { PUSH nat 118 ; FAILWITH } ; + SENDER ; + DUP 2 ; + CDR ; + CDR ; + CDR ; + DUP ; + CAR ; + DUP 3 ; + MEM ; + IF { CDR ; + SWAP ; + GET ; + IF_NONE { NONE (pair (pair address nat) mutez) } { SOME } } + { DROP 2 ; NONE (pair (pair address nat) mutez) } ; + IF_NONE + { DROP ; PUSH nat 155 ; FAILWITH } + { DUP ; CDR ; - DUP ; - CAR ; - DUP 3 ; - MEM ; - IF { CDR ; - SWAP ; - GET ; - IF_NONE { NONE (pair (pair address nat) mutez) } { SOME } } - { DROP 2 ; NONE (pair (pair address nat) mutez) } ; - IF_NONE - { DROP ; PUSH nat 155 ; FAILWITH } - { DUP ; - CDR ; - PUSH mutez 0 ; - DUP 2 ; - COMPARE ; - EQ ; - IF { DROP 3 ; PUSH nat 155 ; FAILWITH } - { SWAP ; - PUSH mutez 0 ; - UPDATE 2 ; - DUP ; - CAR ; - CAR ; - CONTRACT unit ; - IF_NONE - { SWAP ; DROP ; PUSH nat 102 ; FAILWITH } - { DIG 2 ; UNIT ; TRANSFER_TOKENS } ; - DUP 3 ; - DUP 4 ; - CDR ; - DUP ; - CDR ; - DIG 5 ; - CDR ; - CDR ; - CDR ; - DUP 6 ; - CAR ; - CAR ; - DUP 2 ; - CAR ; - DUP 2 ; - MEM ; - IF { DUP 2 ; DIG 2 ; CDR ; DIG 7 ; SOME ; DIG 3 ; UPDATE ; UPDATE 2 } - { DUP 2 ; - DUP 3 ; - CAR ; - DUP 3 ; - PUSH bool True ; - SWAP ; - UPDATE ; - UPDATE 1 ; - DIG 2 ; - CDR ; - DIG 7 ; - DIG 3 ; - SWAP ; - SOME ; - SWAP ; - UPDATE ; - UPDATE 2 } ; - UPDATE 2 ; - UPDATE 2 ; - UPDATE 2 ; - NIL operation ; - DIG 2 ; - CONS ; - PAIR } } } - { DUP 2 ; - CAR ; - CDR ; - CDR ; - SENDER ; + PUSH mutez 0 ; + DUP 2 ; COMPARE ; EQ ; - IF {} { PUSH nat 168 ; FAILWITH } ; - PUSH mutez 1 ; - AMOUNT ; - COMPARE ; - LT ; - IF {} { PUSH nat 118 ; FAILWITH } ; - UNIT ; - LEFT unit ; - LEFT unit ; - IF_LEFT - { IF_LEFT { DROP ; PUSH nat 1 } { DROP ; PUSH nat 0 } } - { DROP ; PUSH nat 2 } ; - DUP 2 ; - CDR ; - CAR ; - IF_LEFT { DROP ; PUSH nat 0 } { DROP ; PUSH nat 1 } ; - NOW ; - DUP 4 ; - CDR ; - CDR ; - DUP 5 ; - CAR ; - CAR ; - DIG 5 ; + IF { DROP 3 ; PUSH nat 155 ; FAILWITH } + { SWAP ; + PUSH mutez 0 ; + UPDATE 2 ; + DUP ; + CAR ; + CAR ; + CONTRACT unit ; + IF_NONE + { SWAP ; DROP ; PUSH nat 102 ; FAILWITH } + { DIG 2 ; UNIT ; TRANSFER_TOKENS } ; + DUP 3 ; + DUP 4 ; + CDR ; + DUP ; + CDR ; + DIG 5 ; + CDR ; + CDR ; + CDR ; + DUP 6 ; + CAR ; + CAR ; + DUP 2 ; + CAR ; + DUP 2 ; + MEM ; + IF { DUP 2 ; DIG 2 ; CDR ; DIG 7 ; SOME ; DIG 3 ; UPDATE ; UPDATE 2 } + { DUP 2 ; + DUP 3 ; + CAR ; + DUP 3 ; + PUSH bool True ; + SWAP ; + UPDATE ; + UPDATE 1 ; + DIG 2 ; + CDR ; + DIG 7 ; + DIG 3 ; + SWAP ; + SOME ; + SWAP ; + UPDATE ; + UPDATE 2 } ; + UPDATE 2 ; + UPDATE 2 ; + UPDATE 2 ; + NIL operation ; + DIG 2 ; + CONS ; + PAIR } } } + { DUP 2 ; + CAR ; + CDR ; + CDR ; + SENDER ; + COMPARE ; + EQ ; + IF {} { PUSH nat 168 ; FAILWITH } ; + PUSH mutez 1 ; + AMOUNT ; + COMPARE ; + LT ; + IF {} { PUSH nat 118 ; FAILWITH } ; + UNIT ; + LEFT unit ; + LEFT unit ; + IF_LEFT + { IF_LEFT { DROP ; PUSH nat 1 } { DROP ; PUSH nat 0 } } + { DROP ; PUSH nat 2 } ; + DUP 2 ; + CDR ; + CAR ; + IF_LEFT { DROP ; PUSH nat 0 } { DROP ; PUSH nat 1 } ; + NOW ; + DUP 4 ; + CDR ; + CDR ; + DUP 5 ; + CAR ; + CAR ; + DIG 5 ; + CAR ; + CDR ; + PAIR ; + PAIR ; + PAIR 4 ; + DUP 2 ; + CAR ; + CAR ; + CDR ; + DUP 2 ; + CAR ; + CAR ; + CAR ; + GET 5 ; + IF_NONE + { DROP 2 ; PUSH nat 109 ; FAILWITH } + { DUP 3 ; CAR ; - CDR ; - PAIR ; - PAIR ; - PAIR 4 ; - DUP 2 ; CAR ; CAR ; - CDR ; - DUP 2 ; + GET 8 ; + IF_NONE + { PUSH bool False } + { PUSH string "FA1.2 token" ; SWAP ; COMPARE ; EQ } ; + IF { DUP ; + CONTRACT %approve (pair (address %spender) (nat %value)) ; + IF_NONE { PUSH nat 157 ; FAILWITH } {} ; + PUSH mutez 0 ; + DUP 5 ; + CAR ; + CAR ; + CDR ; + DUP 5 ; + PAIR ; + TRANSFER_TOKENS } + { DUP 3 ; + CAR ; + CAR ; + CAR ; + GET 8 ; + IF_NONE + { PUSH bool False } + { PUSH string "FA2 token" ; SWAP ; COMPARE ; EQ } ; + IF { SELF_ADDRESS ; + DUP 2 ; + CONTRACT %add_operator + (pair (pair (address %operator) (address %owner)) (nat %token_id)) ; + IF_NONE { PUSH nat 157 ; FAILWITH } {} ; + PUSH mutez 0 ; + DUP 6 ; + CAR ; + CAR ; + CAR ; + CAR ; + DIG 3 ; + DUP 6 ; + PAIR ; + PAIR ; + TRANSFER_TOKENS } + { PUSH nat 108 ; FAILWITH } } ; + DUP 3 ; + CONTRACT %deposit + (pair (pair %swap + (pair %from + (pair %token + (nat %token_id) + (string %name) + (option %address address) + (nat %decimals) + (option %standard string)) + (nat %amount)) + (pair %to + (nat %token_id) + (string %name) + (option %address address) + (nat %decimals) + (option %standard string))) + (timestamp %created_at) + (nat %side) + (nat %tolerance)) ; + IF_NONE { PUSH nat 157 ; FAILWITH } {} ; + PUSH mutez 0 ; + DUP 6 ; + TRANSFER_TOKENS ; + DUP 5 ; CAR ; CAR ; CAR ; - GET 5 ; + GET 8 ; IF_NONE - { DROP 2 ; PUSH nat 109 ; FAILWITH } - { DUP 3 ; - CAR ; - CAR ; - CAR ; - GET 8 ; - IF_NONE - { PUSH bool False } - { PUSH string "FA1.2 token" ; SWAP ; COMPARE ; EQ } ; - IF { DUP ; - CONTRACT %approve (pair (address %spender) (nat %value)) ; - IF_NONE { PUSH nat 157 ; FAILWITH } {} ; - PUSH mutez 0 ; - DUP 5 ; - CAR ; - CAR ; - CDR ; - DUP 5 ; - PAIR ; - TRANSFER_TOKENS } - { DUP 3 ; - CAR ; - CAR ; - CAR ; - GET 8 ; - IF_NONE - { PUSH bool False } - { PUSH string "FA2 token" ; SWAP ; COMPARE ; EQ } ; - IF { SELF_ADDRESS ; - DUP 2 ; - CONTRACT %add_operator - (pair (pair (address %operator) (address %owner)) (nat %token_id)) ; - IF_NONE { PUSH nat 157 ; FAILWITH } {} ; - PUSH mutez 0 ; - DUP 6 ; - CAR ; - CAR ; - CAR ; + { PUSH bool False } + { PUSH string "FA1.2 token" ; SWAP ; COMPARE ; EQ } ; + IF { DIG 2 ; DIG 3 ; DIG 4 ; DROP 3 ; NONE operation } + { DUP 5 ; + CAR ; + CAR ; + CAR ; + GET 8 ; + IF_NONE + { PUSH bool False } + { PUSH string "FA2 token" ; SWAP ; COMPARE ; EQ } ; + IF { SELF_ADDRESS ; + DIG 3 ; + CONTRACT %remove_operator + (pair (pair (address %operator) (address %owner)) (nat %token_id)) ; + IF_NONE { PUSH nat 157 ; FAILWITH } {} ; + PUSH mutez 0 ; + DIG 6 ; + CAR ; + CAR ; + CAR ; + CAR ; + DIG 3 ; + DIG 6 ; + PAIR ; + PAIR ; + TRANSFER_TOKENS ; + SOME } + { DIG 2 ; DIG 3 ; DIG 4 ; DROP 3 ; PUSH nat 108 ; FAILWITH } } ; + IF_NONE { NIL operation } { NIL operation ; SWAP ; CONS } ; + SWAP ; + CONS ; + SWAP ; + CONS } ; + SELF_ADDRESS ; + DUP 3 ; + CDR ; + CAR ; + CAR ; + CAR ; + DUP ; + GET 5 ; + IF_NONE { PUSH nat 101 ; FAILWITH } {} ; + DUP 2 ; + GET 8 ; + IF_NONE { PUSH nat 108 ; FAILWITH } {} ; + PUSH string "FA2 standard" ; + DUP 2 ; + COMPARE ; + EQ ; + IF { DIG 2 ; + DROP 2 ; + DUP 2 ; + CONTRACT %balance_response_fa12 nat ; + SWAP ; + CONTRACT %getbalance (pair (contract %callback nat) (address %owner)) ; + SWAP ; + IF_NONE + { DROP ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DROP ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; DUP 4 ; DIG 3 ; PAIR ; TRANSFER_TOKENS } } } + { PUSH string "FA1.2 standard" ; + SWAP ; + COMPARE ; + EQ ; + IF { DUP 3 ; + CONTRACT %balance_response_fa2 + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id)))) ; + SWAP ; + CONTRACT %balance_of + (pair (contract %callback + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id))))) + (list %requests (pair (address %owner) (nat %token_id)))) ; + SWAP ; + IF_NONE + { DROP 2 ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DROP 2 ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; + NIL (pair address nat) ; + DIG 4 ; CAR ; - DIG 3 ; DUP 6 ; PAIR ; - PAIR ; - TRANSFER_TOKENS } - { PUSH nat 108 ; FAILWITH } } ; - DUP 3 ; - CONTRACT %deposit - (pair (pair %swap - (pair %from - (pair %token - (nat %token_id) - (string %name) - (option %address address) - (nat %decimals) - (option %standard string)) - (nat %amount)) - (pair %to - (nat %token_id) - (string %name) - (option %address address) - (nat %decimals) - (option %standard string))) - (timestamp %created_at) - (nat %side) - (nat %tolerance)) ; - IF_NONE { PUSH nat 157 ; FAILWITH } {} ; - PUSH mutez 0 ; - DUP 6 ; - TRANSFER_TOKENS ; - DUP 5 ; - CAR ; - CAR ; - CAR ; - GET 8 ; - IF_NONE - { PUSH bool False } - { PUSH string "FA1.2 token" ; SWAP ; COMPARE ; EQ } ; - IF { DIG 2 ; DIG 3 ; DIG 4 ; DROP 3 ; NONE operation } - { DUP 5 ; - CAR ; - CAR ; - CAR ; - GET 8 ; - IF_NONE - { PUSH bool False } - { PUSH string "FA2 token" ; SWAP ; COMPARE ; EQ } ; - IF { SELF_ADDRESS ; - DIG 3 ; - CONTRACT %remove_operator - (pair (pair (address %operator) (address %owner)) (nat %token_id)) ; - IF_NONE { PUSH nat 157 ; FAILWITH } {} ; - PUSH mutez 0 ; - DIG 6 ; - CAR ; - CAR ; - CAR ; - CAR ; + CONS ; DIG 3 ; - DIG 6 ; PAIR ; - PAIR ; - TRANSFER_TOKENS ; - SOME } - { DIG 2 ; DIG 3 ; DIG 4 ; DROP 3 ; PUSH nat 108 ; FAILWITH } } ; - IF_NONE { NIL operation } { NIL operation ; SWAP ; CONS } ; - SWAP ; - CONS ; - SWAP ; - CONS } ; - PAIR } } } } - { DROP ; - PUSH mutez 1 ; - AMOUNT ; - COMPARE ; - LT ; - IF {} { PUSH nat 118 ; FAILWITH } ; - SENDER ; - DUP 2 ; - CDR ; - CDR ; - CDR ; - DUP ; - CAR ; - DUP 3 ; - MEM ; - IF { CDR ; - DUP 2 ; - GET ; - IF_NONE { NONE (pair (pair address nat) mutez) } { SOME } } - { DROP ; NONE (pair (pair address nat) mutez) } ; - IF_NONE - { DROP 4 ; PUSH nat 151 ; FAILWITH } - { UNPAIR ; - CDR ; - DUP 4 ; - CDR ; - CDR ; - CAR ; - INT ; - PUSH int 1 ; - SWAP ; - PAIR ; - DUP 2 ; - INT ; - PUSH int 1 ; - SWAP ; - PAIR ; - DUP 2 ; - CAR ; + TRANSFER_TOKENS } } } + { DROP 2 ; PUSH nat 108 ; FAILWITH } } ; + NIL operation ; + SWAP ; + CONS ; + DUP 4 ; + CAR ; + CDR ; + CAR ; + ITER { CDR ; + SWAP ; + DUP 2 ; + CAR ; + GET 5 ; + IF_NONE { PUSH nat 101 ; FAILWITH } {} ; + DUP 3 ; + CAR ; + GET 8 ; + IF_NONE { PUSH nat 108 ; FAILWITH } {} ; + PUSH string "FA2 standard" ; + DUP 2 ; + COMPARE ; + EQ ; + IF { DIG 3 ; + DROP 2 ; + DUP 3 ; + CONTRACT %balance_response_fa12 nat ; + SWAP ; + CONTRACT %getbalance (pair (contract %callback nat) (address %owner)) ; + SWAP ; + IF_NONE + { DROP ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DROP ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; DUP 5 ; DIG 3 ; PAIR ; TRANSFER_TOKENS } } } + { PUSH string "FA1.2 standard" ; + SWAP ; + COMPARE ; + EQ ; + IF { DUP 4 ; + CONTRACT %balance_response_fa2 + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id)))) ; + SWAP ; + CONTRACT %balance_of + (pair (contract %callback + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id))))) + (list %requests (pair (address %owner) (nat %token_id)))) ; + SWAP ; + IF_NONE + { DIG 2 ; DROP 2 ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DIG 2 ; DROP 2 ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; + NIL (pair address nat) ; + DIG 5 ; + CAR ; + CAR ; + DUP 7 ; + PAIR ; + CONS ; + DIG 3 ; + PAIR ; + TRANSFER_TOKENS } } } + { DIG 2 ; DROP 2 ; PUSH nat 108 ; FAILWITH } } ; + CONS } ; + SWAP ; + DROP ; + NIL operation ; + SWAP ; + ITER { CONS } ; + SWAP ; + NIL operation ; + SWAP ; + ITER { CONS } ; + ITER { CONS } ; + NIL operation ; + SWAP ; + ITER { CONS } ; + PAIR } } + { DROP ; + PUSH mutez 1 ; + AMOUNT ; + COMPARE ; + LT ; + IF {} { PUSH nat 118 ; FAILWITH } ; + SENDER ; DUP 2 ; CDR ; - MUL ; - DIG 2 ; CDR ; - DIG 2 ; - CAR ; - MUL ; - PAIR ; - EMPTY_MAP string (pair (pair nat string (option address) nat (option string)) nat) ; - DUP 6 ; CDR ; - CAR ; + DUP ; CAR ; DUP 3 ; - PAIR 3 ; - DUP 7 ; - SWAP ; - EXEC ; - UNPAIR ; - SWAP ; - EMPTY_MAP string (pair (pair nat string (option address) nat (option string)) nat) ; - DIG 3 ; - PAIR ; - PAIR ; - DUP 6 ; - CAR ; - CDR ; - CAR ; - ITER { CDR ; - SWAP ; - UNPAIR ; - UNPAIR ; - DIG 2 ; - DIG 3 ; - DUP 3 ; - PAIR 3 ; - DUP 9 ; - SWAP ; - EXEC ; - UNPAIR ; - DIG 3 ; - SWAP ; - PAIR ; - DUP 10 ; - SWAP ; - EXEC ; - DIG 2 ; - PAIR ; - PAIR } ; - DIG 6 ; - DIG 7 ; - DROP 2 ; - UNPAIR ; - CDR ; - DUP 7 ; - CDR ; - CDR ; - CAR ; - DUP 5 ; - COMPARE ; - GT ; - IF { SWAP ; DIG 2 ; DIG 3 ; DIG 6 ; DROP 5 ; PUSH nat 154 ; FAILWITH } - { DIG 3 ; - DUP 7 ; - CDR ; - CDR ; - CAR ; - SUB ; - ABS ; - DIG 2 ; - DUP 7 ; - DIG 7 ; - CDR ; - DUP ; - CAR ; - DIG 6 ; - UPDATE 1 ; - UPDATE 1 ; - UPDATE 2 ; - DUP ; - CAR ; - DUP ; - CDR ; - DIG 5 ; - UPDATE 1 ; - UPDATE 2 ; - UPDATE 1 ; - DUP ; - CDR ; - DUP ; - CDR ; - DIG 4 ; - UPDATE 1 ; - UPDATE 2 ; - UPDATE 2 ; - PAIR } ; - UNPAIR ; - DUP 4 ; - CONTRACT unit ; - IF_NONE { PUSH nat 102 ; FAILWITH } { DUP 4 ; UNIT ; TRANSFER_TOKENS } ; - SELF_ADDRESS ; - NIL operation ; - DIG 4 ; - ITER { CDR ; - DUP ; - CAR ; - GET 5 ; - IF_NONE - { DROP ; PUSH nat 109 ; FAILWITH } - { DUP 2 ; + MEM ; + IF { CDR ; + DUP 2 ; + GET ; + IF_NONE { NONE (pair (pair address nat) mutez) } { SOME } } + { DROP ; NONE (pair (pair address nat) mutez) } ; + IF_NONE + { DROP 4 ; PUSH nat 151 ; FAILWITH } + { UNPAIR ; + CDR ; + DUP 4 ; + CDR ; + CDR ; + CAR ; + INT ; + PUSH int 1 ; + SWAP ; + PAIR ; + DUP 2 ; + INT ; + PUSH int 1 ; + SWAP ; + PAIR ; + DUP 2 ; + CAR ; + DUP 2 ; + CDR ; + MUL ; + DIG 2 ; + CDR ; + DIG 2 ; + CAR ; + MUL ; + PAIR ; + DUP 5 ; + CDR ; + CAR ; + CAR ; + DUP ; + CDR ; + INT ; + PUSH int 1 ; + SWAP ; + PAIR ; + DUP ; + CDR ; + DUP 4 ; + CDR ; + MUL ; + SWAP ; + CAR ; + DUP 4 ; + CAR ; + MUL ; + PAIR ; + PUSH int 0 ; + DUP 2 ; + CAR ; + COMPARE ; + LT ; + IF { PUSH int -1 ; DUP 2 ; CDR ; MUL ; PUSH int -1 ; DIG 2 ; CAR ; MUL ; PAIR } + {} ; + DUP ; + CDR ; + PUSH nat 1 ; + PUSH nat 0 ; + PUSH nat 10 ; + PAIR ; + PAIR ; + LEFT nat ; + LOOP_LEFT + { UNPAIR ; + UNPAIR ; + PUSH nat 0 ; + DUP 3 ; + COMPARE ; + EQ ; + IF { DROP 2 ; RIGHT (pair (pair nat nat) nat) } + { PUSH nat 1 ; + PUSH nat 1 ; + DUP 4 ; + AND ; + COMPARE ; + EQ ; + IF { DUP ; DIG 3 ; MUL } { DIG 2 } ; + PUSH nat 1 ; + DIG 3 ; + LSR ; + DUP 3 ; + DIG 3 ; + MUL ; + PAIR ; + PAIR ; + LEFT nat } } ; + DIG 2 ; + CAR ; + MUL ; + EDIV ; + IF_NONE { PUSH string "DIV by 0" ; FAILWITH } {} ; + CAR ; + ISNAT ; + IF_NONE { PUSH nat 119 ; FAILWITH } {} ; + DUP 2 ; + CDR ; + DUP 2 ; + COMPARE ; + GT ; + IF { DROP 2 ; PUSH nat 153 ; FAILWITH } + { DUP ; + DUP 3 ; + CDR ; + INT ; + SUB ; + ABS ; + DUP 3 ; + DIG 2 ; + UPDATE 2 ; + PUSH nat 0 ; + DUP 2 ; + CDR ; + COMPARE ; + EQ ; + IF { DROP ; DUP 9 } { DUP 10 ; SWAP ; PAIR ; DUP 9 ; SWAP ; EXEC } ; + DUG 2 ; + UPDATE 2 ; + PAIR } ; + UNPAIR ; + SWAP ; + DIG 8 ; + DIG 3 ; + PAIR ; + PAIR ; + DUP 6 ; + CAR ; + CDR ; + CAR ; + ITER { CDR ; + SWAP ; + UNPAIR ; + UNPAIR ; + DUP 4 ; + CDR ; + INT ; + PUSH int 1 ; + SWAP ; + PAIR ; + DUP ; + CDR ; + DUP 3 ; + CDR ; + MUL ; + SWAP ; CAR ; - GET 8 ; - IF_NONE - { DROP 2 ; PUSH nat 108 ; FAILWITH } - { PUSH string "FA1.2 token" ; - DUP 2 ; + DUP 3 ; + CAR ; + MUL ; + PAIR ; + PUSH int 0 ; + DUP 2 ; + CAR ; + COMPARE ; + LT ; + IF { PUSH int -1 ; DUP 2 ; CDR ; MUL ; PUSH int -1 ; DIG 2 ; CAR ; MUL ; PAIR } + {} ; + DUP ; + CDR ; + PUSH nat 1 ; + PUSH nat 0 ; + PUSH nat 10 ; + PAIR ; + PAIR ; + LEFT nat ; + LOOP_LEFT + { UNPAIR ; + UNPAIR ; + PUSH nat 0 ; + DUP 3 ; COMPARE ; EQ ; - IF { DROP ; - CONTRACT %transfer (pair (address %from) (address %to) (nat %value)) ; - IF_NONE { PUSH nat 101 ; FAILWITH } {} ; - PUSH mutez 0 ; - DIG 2 ; - CDR ; - DUP 9 ; - DUP 6 ; - PAIR 3 ; - TRANSFER_TOKENS } - { PUSH string "FA2 token" ; - SWAP ; + IF { DROP 2 ; RIGHT (pair (pair nat nat) nat) } + { PUSH nat 1 ; + PUSH nat 1 ; + DUP 4 ; + AND ; COMPARE ; EQ ; - IF { CONTRACT %transfer - (list (pair (address %from_) (list %tx (pair (address %to_) (nat %token_id) (nat %amount))))) ; - IF_NONE { PUSH nat 101 ; FAILWITH } {} ; - PUSH mutez 0 ; - NIL (pair address (list (pair address nat nat))) ; - NIL (pair address nat nat) ; - DUP 5 ; - CDR ; - DIG 5 ; - CAR ; - CAR ; - DUP 12 ; - PAIR 3 ; - CONS ; - DUP 6 ; - PAIR ; - CONS ; - TRANSFER_TOKENS } - { DROP 2 ; PUSH nat 108 ; FAILWITH } } } } ; - CONS } ; - SWAP ; - DROP ; - DUP 3 ; - DUP 4 ; - CDR ; - DUP ; - CDR ; - DIG 5 ; - CDR ; - CDR ; - CDR ; - DUP ; - CAR ; - DUP 9 ; - MEM ; - IF { DUP ; - CDR ; - DIG 8 ; - NONE (pair (pair address nat) mutez) ; - SWAP ; - UPDATE ; - UPDATE 2 } - { DIG 7 ; DROP } ; - UPDATE 2 ; - UPDATE 2 ; - UPDATE 2 ; - PUSH mutez 0 ; - DIG 4 ; - COMPARE ; - GT ; - IF { SWAP ; DIG 2 ; CONS } { DIG 2 ; DROP ; SWAP } ; - PAIR } } } ; + IF { DUP ; DIG 3 ; MUL } { DIG 2 } ; + PUSH nat 1 ; + DIG 3 ; + LSR ; + DUP 3 ; + DIG 3 ; + MUL ; + PAIR ; + PAIR ; + LEFT nat } } ; + DIG 2 ; + CAR ; + MUL ; + EDIV ; + IF_NONE { PUSH string "DIV by 0" ; FAILWITH } {} ; + CAR ; + ISNAT ; + IF_NONE { PUSH nat 119 ; FAILWITH } {} ; + DUP 5 ; + CDR ; + DUP 2 ; + COMPARE ; + GT ; + IF { DIG 3 ; DIG 4 ; DROP 3 ; PUSH nat 153 ; FAILWITH } + { DUP ; + DUP 6 ; + CDR ; + INT ; + SUB ; + ABS ; + DUP 6 ; + DIG 2 ; + UPDATE 2 ; + PUSH nat 0 ; + DUP 2 ; + CDR ; + COMPARE ; + EQ ; + IF { DROP ; DIG 3 } { DIG 4 ; SWAP ; PAIR ; DUP 11 ; SWAP ; EXEC } ; + DIG 4 ; + DIG 2 ; + UPDATE 2 ; + PAIR } ; + UNPAIR ; + DIG 3 ; + SWAP ; + PAIR ; + DUP 9 ; + SWAP ; + EXEC ; + DIG 2 ; + PAIR ; + PAIR } ; + DIG 6 ; + DROP ; + UNPAIR ; + CDR ; + DUP 7 ; + CDR ; + CDR ; + CAR ; + DUP 5 ; + COMPARE ; + GT ; + IF { SWAP ; DIG 2 ; DIG 3 ; DIG 6 ; DROP 5 ; PUSH nat 154 ; FAILWITH } + { DIG 3 ; + DUP 7 ; + CDR ; + CDR ; + CAR ; + SUB ; + ABS ; + DIG 2 ; + DUP 7 ; + DIG 7 ; + CDR ; + DUP ; + CAR ; + DIG 6 ; + UPDATE 1 ; + UPDATE 1 ; + UPDATE 2 ; + DUP ; + CAR ; + DUP ; + CDR ; + DIG 5 ; + UPDATE 1 ; + UPDATE 2 ; + UPDATE 1 ; + DUP ; + CDR ; + DUP ; + CDR ; + DIG 4 ; + UPDATE 1 ; + UPDATE 2 ; + UPDATE 2 ; + PAIR } ; + UNPAIR ; + DUP 4 ; + CONTRACT unit ; + IF_NONE { PUSH nat 102 ; FAILWITH } { DUP 4 ; UNIT ; TRANSFER_TOKENS } ; + SELF_ADDRESS ; + NIL operation ; + DIG 4 ; + ITER { CDR ; + DUP ; + CAR ; + GET 5 ; + IF_NONE + { DROP ; PUSH nat 109 ; FAILWITH } + { DUP 2 ; + CAR ; + GET 8 ; + IF_NONE + { DROP 2 ; PUSH nat 108 ; FAILWITH } + { PUSH string "FA1.2 token" ; + DUP 2 ; + COMPARE ; + EQ ; + IF { DROP ; + CONTRACT %transfer (pair (address %from) (address %to) (nat %value)) ; + IF_NONE { PUSH nat 101 ; FAILWITH } {} ; + PUSH mutez 0 ; + DIG 2 ; + CDR ; + DUP 9 ; + DUP 6 ; + PAIR 3 ; + TRANSFER_TOKENS } + { PUSH string "FA2 token" ; + SWAP ; + COMPARE ; + EQ ; + IF { CONTRACT %transfer + (list (pair (address %from_) (list %tx (pair (address %to_) (nat %token_id) (nat %amount))))) ; + IF_NONE { PUSH nat 101 ; FAILWITH } {} ; + PUSH mutez 0 ; + NIL (pair address (list (pair address nat nat))) ; + NIL (pair address nat nat) ; + DUP 5 ; + CDR ; + DIG 5 ; + CAR ; + CAR ; + DUP 12 ; + PAIR 3 ; + CONS ; + DUP 6 ; + PAIR ; + CONS ; + TRANSFER_TOKENS } + { DROP 2 ; PUSH nat 108 ; FAILWITH } } } } ; + CONS } ; + SWAP ; + DROP ; + DUP 3 ; + CDR ; + CDR ; + CDR ; + SELF_ADDRESS ; + DUP 5 ; + CDR ; + CAR ; + CAR ; + CAR ; + DUP ; + GET 5 ; + IF_NONE { PUSH nat 101 ; FAILWITH } {} ; + DUP 2 ; + GET 8 ; + IF_NONE { PUSH nat 108 ; FAILWITH } {} ; + PUSH string "FA2 standard" ; + DUP 2 ; + COMPARE ; + EQ ; + IF { DIG 2 ; + DROP 2 ; + DUP 2 ; + CONTRACT %balance_response_fa12 nat ; + SWAP ; + CONTRACT %getbalance (pair (contract %callback nat) (address %owner)) ; + SWAP ; + IF_NONE + { DROP ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DROP ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; DUP 4 ; DIG 3 ; PAIR ; TRANSFER_TOKENS } } } + { PUSH string "FA1.2 standard" ; + SWAP ; + COMPARE ; + EQ ; + IF { DUP 3 ; + CONTRACT %balance_response_fa2 + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id)))) ; + SWAP ; + CONTRACT %balance_of + (pair (contract %callback + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id))))) + (list %requests (pair (address %owner) (nat %token_id)))) ; + SWAP ; + IF_NONE + { DROP 2 ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DROP 2 ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; + NIL (pair address nat) ; + DIG 4 ; + CAR ; + DUP 6 ; + PAIR ; + CONS ; + DIG 3 ; + PAIR ; + TRANSFER_TOKENS } } } + { DROP 2 ; PUSH nat 108 ; FAILWITH } } ; + NIL operation ; + SWAP ; + CONS ; + DUP 6 ; + CAR ; + CDR ; + CAR ; + ITER { CDR ; + SWAP ; + DUP 2 ; + CAR ; + GET 5 ; + IF_NONE { PUSH nat 101 ; FAILWITH } {} ; + DUP 3 ; + CAR ; + GET 8 ; + IF_NONE { PUSH nat 108 ; FAILWITH } {} ; + PUSH string "FA2 standard" ; + DUP 2 ; + COMPARE ; + EQ ; + IF { DIG 3 ; + DROP 2 ; + DUP 3 ; + CONTRACT %balance_response_fa12 nat ; + SWAP ; + CONTRACT %getbalance (pair (contract %callback nat) (address %owner)) ; + SWAP ; + IF_NONE + { DROP ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DROP ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; DUP 5 ; DIG 3 ; PAIR ; TRANSFER_TOKENS } } } + { PUSH string "FA1.2 standard" ; + SWAP ; + COMPARE ; + EQ ; + IF { DUP 4 ; + CONTRACT %balance_response_fa2 + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id)))) ; + SWAP ; + CONTRACT %balance_of + (pair (contract %callback + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id))))) + (list %requests (pair (address %owner) (nat %token_id)))) ; + SWAP ; + IF_NONE + { DIG 2 ; DROP 2 ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DIG 2 ; DROP 2 ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; + NIL (pair address nat) ; + DIG 5 ; + CAR ; + CAR ; + DUP 7 ; + PAIR ; + CONS ; + DIG 3 ; + PAIR ; + TRANSFER_TOKENS } } } + { DIG 2 ; DROP 2 ; PUSH nat 108 ; FAILWITH } } ; + CONS } ; + SWAP ; + DROP ; + NIL operation ; + SWAP ; + ITER { CONS } ; + PUSH mutez 0 ; + DIG 6 ; + COMPARE ; + GT ; + IF { DIG 2 ; DIG 3 ; CONS } { DIG 3 ; DROP ; DIG 2 } ; + NIL operation ; + SWAP ; + ITER { CONS } ; + ITER { CONS } ; + NIL operation ; + SWAP ; + ITER { CONS } ; + DUP 3 ; + DIG 3 ; + CDR ; + DUP ; + CDR ; + DUP 5 ; + CAR ; + DUP 7 ; + MEM ; + IF { DUP 5 ; + DIG 5 ; + CDR ; + DIG 6 ; + NONE (pair (pair address nat) mutez) ; + SWAP ; + UPDATE ; + UPDATE 2 } + { DIG 5 ; DROP ; DIG 4 } ; + UPDATE 2 ; + UPDATE 2 ; + UPDATE 2 ; + SWAP ; + PAIR } } } } ; view "get_native_token_of_vault" unit (pair (nat %token_id) @@ -1114,23 +1750,5 @@ (option %address address) (nat %decimals) (option %standard string)) - { CDR ; CDR ; CAR ; CAR ; CAR } ; - view "get_vault_balances" - unit - (pair (pair (pair %token - (nat %token_id) - (string %name) - (option %address address) - (nat %decimals) - (option %standard string)) - (nat %amount)) - (map string - (pair (pair %token - (nat %token_id) - (string %name) - (option %address address) - (nat %decimals) - (option %standard string)) - (nat %amount)))) - { CDR ; DUP ; CAR ; CDR ; CAR ; SWAP ; CDR ; CAR ; CAR ; PAIR } } + { CDR ; CDR ; CAR ; CAR ; CAR } } diff --git a/batcher/michelson/eurl-vault-ghostnet.tz b/batcher/michelson/eurl-vault-ghostnet.tz index 67557279..488c5eaf 100644 --- a/batcher/michelson/eurl-vault-ghostnet.tz +++ b/batcher/michelson/eurl-vault-ghostnet.tz @@ -1,24 +1,28 @@ { parameter (or (or (or (or (nat %addLiquidity) (mutez %addReward)) - (or (address %change_admin_address) (address %change_batcher_address))) - (or (or (address %change_marketmaker_address) (address %change_tokenmanager_address)) - (or (unit %claim) - (pair %injectLiquidity - (pair (nat %amount) - (pair %from_token - (nat %token_id) - (string %name) - (option %address address) - (nat %decimals) - (option %standard string))) - (or %side (unit %buy) (unit %sell)) - (pair %to_token - (nat %token_id) - (string %name) - (option %address address) - (nat %decimals) - (option %standard string)))))) - (unit %removeLiquidity)) ; + (or (nat %balance_response_fa12) + (pair %balance_response_fa2 + (nat %balance) + (pair %request (address %owner) (nat %token_id))))) + (or (or (address %change_admin_address) (address %change_batcher_address)) + (or (address %change_marketmaker_address) (address %change_tokenmanager_address)))) + (or (or (unit %claim) + (pair %injectLiquidity + (pair (nat %amount) + (pair %from_token + (nat %token_id) + (string %name) + (option %address address) + (nat %decimals) + (option %standard string))) + (or %side (unit %buy) (unit %sell)) + (pair %to_token + (nat %token_id) + (string %name) + (option %address address) + (nat %decimals) + (option %standard string)))) + (unit %removeLiquidity))) ; storage (pair (pair (pair (address %administrator) (address %batcher)) (map %foreign_tokens @@ -47,6 +51,11 @@ address (pair (pair (address %holder) (nat %shares)) (mutez %unclaimed))))) ; code { LAMBDA + (pair (option address) nat) + address + { UNPAIR ; IF_NONE { FAILWITH } { SWAP ; DROP } } ; + EMPTY_MAP string (pair (pair nat string (option address) nat (option string)) nat) ; + LAMBDA (pair (pair (pair nat string (option address) nat (option string)) nat) (map string (pair (pair nat string (option address) nat (option string)) nat))) (map string (pair (pair nat string (option address) nat (option string)) nat)) @@ -82,111 +91,7 @@ SOME ; DIG 2 ; UPDATE } } ; - LAMBDA - (pair (lambda - (pair (pair (pair nat string (option address) nat (option string)) nat) - (map string (pair (pair nat string (option address) nat (option string)) nat))) - (map string (pair (pair nat string (option address) nat (option string)) nat))) - (pair (pair int int) - (pair (pair nat string (option address) nat (option string)) nat) - (map string (pair (pair nat string (option address) nat (option string)) nat)))) - (pair (pair (pair nat string (option address) nat (option string)) nat) - (map string (pair (pair nat string (option address) nat (option string)) nat))) - { UNPAIR ; - SWAP ; - UNPAIR 3 ; - DUP 2 ; - CDR ; - INT ; - PUSH int 1 ; - SWAP ; - PAIR ; - DUP ; - CDR ; - DUP 3 ; - CDR ; - MUL ; - SWAP ; - CAR ; - DIG 2 ; - CAR ; - MUL ; - PAIR ; - PUSH int 0 ; - DUP 2 ; - CAR ; - COMPARE ; - LT ; - IF { PUSH int -1 ; DUP 2 ; CDR ; MUL ; PUSH int -1 ; DIG 2 ; CAR ; MUL ; PAIR } - {} ; - DUP ; - CDR ; - PUSH nat 1 ; - PUSH nat 0 ; - PUSH nat 10 ; - PAIR ; - PAIR ; - LEFT nat ; - LOOP_LEFT - { UNPAIR ; - UNPAIR ; - PUSH nat 0 ; - DUP 3 ; - COMPARE ; - EQ ; - IF { DROP 2 ; RIGHT (pair (pair nat nat) nat) } - { PUSH nat 1 ; - PUSH nat 1 ; - DUP 4 ; - AND ; - COMPARE ; - EQ ; - IF { DUP ; DIG 3 ; MUL } { DIG 2 } ; - PUSH nat 1 ; - DIG 3 ; - LSR ; - DUP 3 ; - DIG 3 ; - MUL ; - PAIR ; - PAIR ; - LEFT nat } } ; - DIG 2 ; - CAR ; - MUL ; - EDIV ; - IF_NONE { PUSH string "DIV by 0" ; FAILWITH } {} ; - CAR ; - ISNAT ; - IF_NONE { PUSH nat 119 ; FAILWITH } {} ; - DUP 2 ; - CDR ; - DUP 2 ; - COMPARE ; - GT ; - IF { DROP 4 ; PUSH nat 153 ; FAILWITH } - { DUP ; - DUP 3 ; - CDR ; - INT ; - SUB ; - ABS ; - DUP 3 ; - DIG 2 ; - UPDATE 2 ; - PUSH nat 0 ; - DUP 2 ; - CDR ; - COMPARE ; - EQ ; - IF { DIG 4 ; DROP 2 ; DIG 2 } - { DIG 3 ; SWAP ; PAIR ; DIG 3 ; SWAP ; EXEC } ; - DUG 2 ; - UPDATE 2 ; - PAIR } } ; - DUP 2 ; - APPLY ; - DIG 2 ; + DIG 3 ; UNPAIR ; IF_LEFT { DIG 2 ; @@ -194,7 +99,9 @@ DROP 2 ; IF_LEFT { IF_LEFT - { IF_LEFT + { DIG 2 ; + DROP ; + IF_LEFT { PUSH mutez 1 ; AMOUNT ; COMPARE ; @@ -255,13 +162,138 @@ CONS ; TRANSFER_TOKENS } { DROP 2 ; PUSH nat 108 ; FAILWITH } } } } ; - DUP 4 ; + SELF_ADDRESS ; + DUP 5 ; CDR ; CAR ; CAR ; + CAR ; DUP ; + GET 5 ; + IF_NONE { PUSH nat 101 ; FAILWITH } {} ; + DUP 2 ; + GET 8 ; + IF_NONE { PUSH nat 108 ; FAILWITH } {} ; + PUSH string "FA2 standard" ; + DUP 2 ; + COMPARE ; + EQ ; + IF { DIG 2 ; + DROP 2 ; + DUP 2 ; + CONTRACT %balance_response_fa12 nat ; + SWAP ; + CONTRACT %getbalance (pair (contract %callback nat) (address %owner)) ; + SWAP ; + IF_NONE + { DROP ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DROP ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; DUP 4 ; DIG 3 ; PAIR ; TRANSFER_TOKENS } } } + { PUSH string "FA1.2 standard" ; + SWAP ; + COMPARE ; + EQ ; + IF { DUP 3 ; + CONTRACT %balance_response_fa2 + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id)))) ; + SWAP ; + CONTRACT %balance_of + (pair (contract %callback + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id))))) + (list %requests (pair (address %owner) (nat %token_id)))) ; + SWAP ; + IF_NONE + { DROP 2 ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DROP 2 ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; + NIL (pair address nat) ; + DIG 4 ; + CAR ; + DUP 6 ; + PAIR ; + CONS ; + DIG 3 ; + PAIR ; + TRANSFER_TOKENS } } } + { DROP 2 ; PUSH nat 108 ; FAILWITH } } ; + NIL operation ; + SWAP ; + CONS ; + DUP 6 ; CAR ; - DUP 4 ; + CDR ; + CAR ; + ITER { CDR ; + SWAP ; + DUP 2 ; + CAR ; + GET 5 ; + IF_NONE { PUSH nat 101 ; FAILWITH } {} ; + DUP 3 ; + CAR ; + GET 8 ; + IF_NONE { PUSH nat 108 ; FAILWITH } {} ; + PUSH string "FA2 standard" ; + DUP 2 ; + COMPARE ; + EQ ; + IF { DIG 3 ; + DROP 2 ; + DUP 3 ; + CONTRACT %balance_response_fa12 nat ; + SWAP ; + CONTRACT %getbalance (pair (contract %callback nat) (address %owner)) ; + SWAP ; + IF_NONE + { DROP ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DROP ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; DUP 5 ; DIG 3 ; PAIR ; TRANSFER_TOKENS } } } + { PUSH string "FA1.2 standard" ; + SWAP ; + COMPARE ; + EQ ; + IF { DUP 4 ; + CONTRACT %balance_response_fa2 + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id)))) ; + SWAP ; + CONTRACT %balance_of + (pair (contract %callback + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id))))) + (list %requests (pair (address %owner) (nat %token_id)))) ; + SWAP ; + IF_NONE + { DIG 2 ; DROP 2 ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DIG 2 ; DROP 2 ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; + NIL (pair address nat) ; + DIG 5 ; + CAR ; + CAR ; + DUP 7 ; + PAIR ; + CONS ; + DIG 3 ; + PAIR ; + TRANSFER_TOKENS } } } + { DIG 2 ; DROP 2 ; PUSH nat 108 ; FAILWITH } } ; + CONS } ; + SWAP ; + DROP ; + DUP 5 ; + CDR ; + CAR ; + CAR ; + DUP ; + CAR ; + DUP 5 ; CAR ; DUP 2 ; GET 8 ; @@ -298,37 +330,37 @@ AND ; AND ; NOT ; - IF { DIG 2 ; DIG 3 ; DIG 4 ; DROP 4 ; PUSH nat 115 ; FAILWITH } - { DUP 3 ; + IF { DIG 3 ; DIG 4 ; DIG 5 ; DROP 4 ; PUSH nat 115 ; FAILWITH } + { DUP 4 ; CDR ; - DUP 6 ; + DUP 7 ; CDR ; CDR ; CAR ; ADD ; DUP 2 ; - DUP 5 ; + DUP 6 ; CDR ; DIG 3 ; CDR ; ADD ; UPDATE 2 ; - DUP 6 ; + DUP 7 ; CDR ; CDR ; CDR ; DUP ; CAR ; - DUP 7 ; + DUP 8 ; MEM ; IF { CDR ; - DUP 6 ; + DUP 7 ; GET ; IF_NONE { NONE (pair (pair address nat) mutez) } { SOME } } { DROP ; NONE (pair (pair address nat) mutez) } ; IF_NONE - { PUSH mutez 0 ; DIG 4 ; CDR ; DUP 6 ; PAIR ; PAIR } - { DIG 4 ; + { PUSH mutez 0 ; DIG 5 ; CDR ; DUP 7 ; PAIR ; PAIR } + { DIG 5 ; CDR ; DUP 2 ; CAR ; @@ -340,8 +372,8 @@ DIG 2 ; UPDATE 2 ; UPDATE 1 } ; - DUP 6 ; DUP 7 ; + DUP 8 ; CDR ; DUP ; CDR ; @@ -353,19 +385,19 @@ CDR ; DUP ; CDR ; - DIG 7 ; + DIG 8 ; CDR ; CDR ; CDR ; DUP ; CAR ; - DUP 9 ; + DUP 10 ; MEM ; - IF { DUP ; CDR ; DIG 5 ; SOME ; DIG 8 ; UPDATE ; UPDATE 2 } + IF { DUP ; CDR ; DIG 5 ; SOME ; DIG 9 ; UPDATE ; UPDATE 2 } { DUP ; DUP 2 ; CAR ; - DUP 10 ; + DUP 11 ; PUSH bool True ; SWAP ; UPDATE ; @@ -373,7 +405,7 @@ SWAP ; CDR ; DIG 5 ; - DIG 8 ; + DIG 9 ; SWAP ; SOME ; SWAP ; @@ -390,7 +422,7 @@ UPDATE 1 ; UPDATE 1 ; UPDATE 2 } ; - NIL operation ; + SWAP ; DIG 2 ; CONS } { DUP 2 ; @@ -551,6 +583,171 @@ UPDATE 2 ; UPDATE 2 ; NIL operation } } + { IF_LEFT + { SENDER ; + DUP 3 ; + CDR ; + CAR ; + CAR ; + CAR ; + GET 5 ; + IF_NONE { PUSH nat 101 ; FAILWITH } {} ; + PUSH nat 0 ; + DUP 5 ; + CDR ; + CAR ; + CAR ; + CAR ; + CAR ; + COMPARE ; + EQ ; + DUP 3 ; + DIG 2 ; + COMPARE ; + EQ ; + AND ; + IF { DUP 3 ; + DUP 4 ; + CDR ; + DUP ; + CAR ; + DIG 5 ; + CDR ; + CAR ; + CAR ; + DUP 6 ; + UPDATE 2 ; + UPDATE 1 ; + UPDATE 1 ; + UPDATE 2 } + { DIG 2 } ; + DUP ; + CAR ; + CDR ; + CAR ; + DUP ; + ITER { CDR ; + PUSH nat 101 ; + DUP 2 ; + CAR ; + GET 5 ; + PAIR ; + DUP 7 ; + SWAP ; + EXEC ; + PUSH nat 0 ; + DUP 3 ; + CAR ; + CAR ; + COMPARE ; + EQ ; + DUP 6 ; + DIG 2 ; + COMPARE ; + EQ ; + AND ; + IF { DUP 5 ; UPDATE 2 ; SWAP ; DUP 2 ; SOME ; DIG 2 ; CAR ; GET 3 ; UPDATE } + { DROP } } ; + DIG 2 ; + DIG 3 ; + DIG 4 ; + DROP 3 ; + DUP 2 ; + DIG 2 ; + CAR ; + DUP ; + CDR ; + DIG 3 ; + UPDATE 1 ; + UPDATE 2 ; + UPDATE 1 } + { SENDER ; + DUP 2 ; + CAR ; + DIG 2 ; + CDR ; + CDR ; + DUP 4 ; + CDR ; + CAR ; + CAR ; + CAR ; + GET 5 ; + IF_NONE { PUSH nat 101 ; FAILWITH } {} ; + DUP 2 ; + DUP 6 ; + CDR ; + CAR ; + CAR ; + CAR ; + CAR ; + COMPARE ; + EQ ; + DUP 5 ; + DIG 2 ; + COMPARE ; + EQ ; + AND ; + IF { DUP 4 ; + DUP 5 ; + CDR ; + DUP ; + CAR ; + DIG 6 ; + CDR ; + CAR ; + CAR ; + DUP 6 ; + UPDATE 2 ; + UPDATE 1 ; + UPDATE 1 ; + UPDATE 2 } + { DIG 3 } ; + DUP ; + CAR ; + CDR ; + CAR ; + DUP ; + ITER { CDR ; + PUSH nat 101 ; + DUP 2 ; + CAR ; + GET 5 ; + PAIR ; + DUP 8 ; + SWAP ; + EXEC ; + DUP 5 ; + DUP 3 ; + CAR ; + CAR ; + COMPARE ; + EQ ; + DUP 8 ; + DIG 2 ; + COMPARE ; + EQ ; + AND ; + IF { DUP 5 ; UPDATE 2 ; SWAP ; DUP 2 ; SOME ; DIG 2 ; CAR ; GET 3 ; UPDATE } + { DROP } } ; + DIG 2 ; + DIG 3 ; + DIG 4 ; + DIG 5 ; + DROP 4 ; + DUP 2 ; + DIG 2 ; + CAR ; + DUP ; + CDR ; + DIG 3 ; + UPDATE 1 ; + UPDATE 2 ; + UPDATE 1 } ; + NIL operation } } + { DIG 2 ; + DROP ; + IF_LEFT { IF_LEFT { DUP 2 ; CAR ; @@ -595,10 +792,7 @@ DIG 3 ; UPDATE 2 ; UPDATE 1 ; - UPDATE 1 } ; - NIL operation } ; - PAIR } - { IF_LEFT + UPDATE 1 } } { IF_LEFT { DUP 2 ; CAR ; @@ -643,470 +837,912 @@ DIG 3 ; UPDATE 2 ; UPDATE 1 ; - UPDATE 2 } ; - NIL operation ; - PAIR } - { IF_LEFT - { DROP ; - PUSH mutez 1 ; - AMOUNT ; - COMPARE ; - LT ; - IF {} { PUSH nat 118 ; FAILWITH } ; - SENDER ; - DUP 2 ; - CDR ; - CDR ; + UPDATE 2 } } ; + NIL operation } ; + PAIR } + { DIG 4 ; + DROP ; + IF_LEFT + { DIG 2 ; + DIG 3 ; + DROP 2 ; + IF_LEFT + { DROP ; + PUSH mutez 1 ; + AMOUNT ; + COMPARE ; + LT ; + IF {} { PUSH nat 118 ; FAILWITH } ; + SENDER ; + DUP 2 ; + CDR ; + CDR ; + CDR ; + DUP ; + CAR ; + DUP 3 ; + MEM ; + IF { CDR ; + SWAP ; + GET ; + IF_NONE { NONE (pair (pair address nat) mutez) } { SOME } } + { DROP 2 ; NONE (pair (pair address nat) mutez) } ; + IF_NONE + { DROP ; PUSH nat 155 ; FAILWITH } + { DUP ; CDR ; - DUP ; - CAR ; - DUP 3 ; - MEM ; - IF { CDR ; - SWAP ; - GET ; - IF_NONE { NONE (pair (pair address nat) mutez) } { SOME } } - { DROP 2 ; NONE (pair (pair address nat) mutez) } ; - IF_NONE - { DROP ; PUSH nat 155 ; FAILWITH } - { DUP ; - CDR ; - PUSH mutez 0 ; - DUP 2 ; - COMPARE ; - EQ ; - IF { DROP 3 ; PUSH nat 155 ; FAILWITH } - { SWAP ; - PUSH mutez 0 ; - UPDATE 2 ; - DUP ; - CAR ; - CAR ; - CONTRACT unit ; - IF_NONE - { SWAP ; DROP ; PUSH nat 102 ; FAILWITH } - { DIG 2 ; UNIT ; TRANSFER_TOKENS } ; - DUP 3 ; - DUP 4 ; - CDR ; - DUP ; - CDR ; - DIG 5 ; - CDR ; - CDR ; - CDR ; - DUP 6 ; - CAR ; - CAR ; - DUP 2 ; - CAR ; - DUP 2 ; - MEM ; - IF { DUP 2 ; DIG 2 ; CDR ; DIG 7 ; SOME ; DIG 3 ; UPDATE ; UPDATE 2 } - { DUP 2 ; - DUP 3 ; - CAR ; - DUP 3 ; - PUSH bool True ; - SWAP ; - UPDATE ; - UPDATE 1 ; - DIG 2 ; - CDR ; - DIG 7 ; - DIG 3 ; - SWAP ; - SOME ; - SWAP ; - UPDATE ; - UPDATE 2 } ; - UPDATE 2 ; - UPDATE 2 ; - UPDATE 2 ; - NIL operation ; - DIG 2 ; - CONS ; - PAIR } } } - { DUP 2 ; - CAR ; - CDR ; - CDR ; - SENDER ; + PUSH mutez 0 ; + DUP 2 ; COMPARE ; EQ ; - IF {} { PUSH nat 168 ; FAILWITH } ; - PUSH mutez 1 ; - AMOUNT ; - COMPARE ; - LT ; - IF {} { PUSH nat 118 ; FAILWITH } ; - UNIT ; - LEFT unit ; - LEFT unit ; - IF_LEFT - { IF_LEFT { DROP ; PUSH nat 1 } { DROP ; PUSH nat 0 } } - { DROP ; PUSH nat 2 } ; - DUP 2 ; - CDR ; - CAR ; - IF_LEFT { DROP ; PUSH nat 0 } { DROP ; PUSH nat 1 } ; - NOW ; - DUP 4 ; - CDR ; - CDR ; - DUP 5 ; - CAR ; - CAR ; - DIG 5 ; + IF { DROP 3 ; PUSH nat 155 ; FAILWITH } + { SWAP ; + PUSH mutez 0 ; + UPDATE 2 ; + DUP ; + CAR ; + CAR ; + CONTRACT unit ; + IF_NONE + { SWAP ; DROP ; PUSH nat 102 ; FAILWITH } + { DIG 2 ; UNIT ; TRANSFER_TOKENS } ; + DUP 3 ; + DUP 4 ; + CDR ; + DUP ; + CDR ; + DIG 5 ; + CDR ; + CDR ; + CDR ; + DUP 6 ; + CAR ; + CAR ; + DUP 2 ; + CAR ; + DUP 2 ; + MEM ; + IF { DUP 2 ; DIG 2 ; CDR ; DIG 7 ; SOME ; DIG 3 ; UPDATE ; UPDATE 2 } + { DUP 2 ; + DUP 3 ; + CAR ; + DUP 3 ; + PUSH bool True ; + SWAP ; + UPDATE ; + UPDATE 1 ; + DIG 2 ; + CDR ; + DIG 7 ; + DIG 3 ; + SWAP ; + SOME ; + SWAP ; + UPDATE ; + UPDATE 2 } ; + UPDATE 2 ; + UPDATE 2 ; + UPDATE 2 ; + NIL operation ; + DIG 2 ; + CONS ; + PAIR } } } + { DUP 2 ; + CAR ; + CDR ; + CDR ; + SENDER ; + COMPARE ; + EQ ; + IF {} { PUSH nat 168 ; FAILWITH } ; + PUSH mutez 1 ; + AMOUNT ; + COMPARE ; + LT ; + IF {} { PUSH nat 118 ; FAILWITH } ; + UNIT ; + LEFT unit ; + LEFT unit ; + IF_LEFT + { IF_LEFT { DROP ; PUSH nat 1 } { DROP ; PUSH nat 0 } } + { DROP ; PUSH nat 2 } ; + DUP 2 ; + CDR ; + CAR ; + IF_LEFT { DROP ; PUSH nat 0 } { DROP ; PUSH nat 1 } ; + NOW ; + DUP 4 ; + CDR ; + CDR ; + DUP 5 ; + CAR ; + CAR ; + DIG 5 ; + CAR ; + CDR ; + PAIR ; + PAIR ; + PAIR 4 ; + DUP 2 ; + CAR ; + CAR ; + CDR ; + DUP 2 ; + CAR ; + CAR ; + CAR ; + GET 5 ; + IF_NONE + { DROP 2 ; PUSH nat 109 ; FAILWITH } + { DUP 3 ; CAR ; - CDR ; - PAIR ; - PAIR ; - PAIR 4 ; - DUP 2 ; CAR ; CAR ; - CDR ; - DUP 2 ; + GET 8 ; + IF_NONE + { PUSH bool False } + { PUSH string "FA1.2 token" ; SWAP ; COMPARE ; EQ } ; + IF { DUP ; + CONTRACT %approve (pair (address %spender) (nat %value)) ; + IF_NONE { PUSH nat 157 ; FAILWITH } {} ; + PUSH mutez 0 ; + DUP 5 ; + CAR ; + CAR ; + CDR ; + DUP 5 ; + PAIR ; + TRANSFER_TOKENS } + { DUP 3 ; + CAR ; + CAR ; + CAR ; + GET 8 ; + IF_NONE + { PUSH bool False } + { PUSH string "FA2 token" ; SWAP ; COMPARE ; EQ } ; + IF { SELF_ADDRESS ; + DUP 2 ; + CONTRACT %add_operator + (pair (pair (address %operator) (address %owner)) (nat %token_id)) ; + IF_NONE { PUSH nat 157 ; FAILWITH } {} ; + PUSH mutez 0 ; + DUP 6 ; + CAR ; + CAR ; + CAR ; + CAR ; + DIG 3 ; + DUP 6 ; + PAIR ; + PAIR ; + TRANSFER_TOKENS } + { PUSH nat 108 ; FAILWITH } } ; + DUP 3 ; + CONTRACT %deposit + (pair (pair %swap + (pair %from + (pair %token + (nat %token_id) + (string %name) + (option %address address) + (nat %decimals) + (option %standard string)) + (nat %amount)) + (pair %to + (nat %token_id) + (string %name) + (option %address address) + (nat %decimals) + (option %standard string))) + (timestamp %created_at) + (nat %side) + (nat %tolerance)) ; + IF_NONE { PUSH nat 157 ; FAILWITH } {} ; + PUSH mutez 0 ; + DUP 6 ; + TRANSFER_TOKENS ; + DUP 5 ; CAR ; CAR ; CAR ; - GET 5 ; + GET 8 ; IF_NONE - { DROP 2 ; PUSH nat 109 ; FAILWITH } - { DUP 3 ; - CAR ; - CAR ; - CAR ; - GET 8 ; - IF_NONE - { PUSH bool False } - { PUSH string "FA1.2 token" ; SWAP ; COMPARE ; EQ } ; - IF { DUP ; - CONTRACT %approve (pair (address %spender) (nat %value)) ; - IF_NONE { PUSH nat 157 ; FAILWITH } {} ; - PUSH mutez 0 ; - DUP 5 ; - CAR ; - CAR ; - CDR ; - DUP 5 ; - PAIR ; - TRANSFER_TOKENS } - { DUP 3 ; - CAR ; - CAR ; - CAR ; - GET 8 ; - IF_NONE - { PUSH bool False } - { PUSH string "FA2 token" ; SWAP ; COMPARE ; EQ } ; - IF { SELF_ADDRESS ; - DUP 2 ; - CONTRACT %add_operator - (pair (pair (address %operator) (address %owner)) (nat %token_id)) ; - IF_NONE { PUSH nat 157 ; FAILWITH } {} ; - PUSH mutez 0 ; - DUP 6 ; - CAR ; - CAR ; - CAR ; + { PUSH bool False } + { PUSH string "FA1.2 token" ; SWAP ; COMPARE ; EQ } ; + IF { DIG 2 ; DIG 3 ; DIG 4 ; DROP 3 ; NONE operation } + { DUP 5 ; + CAR ; + CAR ; + CAR ; + GET 8 ; + IF_NONE + { PUSH bool False } + { PUSH string "FA2 token" ; SWAP ; COMPARE ; EQ } ; + IF { SELF_ADDRESS ; + DIG 3 ; + CONTRACT %remove_operator + (pair (pair (address %operator) (address %owner)) (nat %token_id)) ; + IF_NONE { PUSH nat 157 ; FAILWITH } {} ; + PUSH mutez 0 ; + DIG 6 ; + CAR ; + CAR ; + CAR ; + CAR ; + DIG 3 ; + DIG 6 ; + PAIR ; + PAIR ; + TRANSFER_TOKENS ; + SOME } + { DIG 2 ; DIG 3 ; DIG 4 ; DROP 3 ; PUSH nat 108 ; FAILWITH } } ; + IF_NONE { NIL operation } { NIL operation ; SWAP ; CONS } ; + SWAP ; + CONS ; + SWAP ; + CONS } ; + SELF_ADDRESS ; + DUP 3 ; + CDR ; + CAR ; + CAR ; + CAR ; + DUP ; + GET 5 ; + IF_NONE { PUSH nat 101 ; FAILWITH } {} ; + DUP 2 ; + GET 8 ; + IF_NONE { PUSH nat 108 ; FAILWITH } {} ; + PUSH string "FA2 standard" ; + DUP 2 ; + COMPARE ; + EQ ; + IF { DIG 2 ; + DROP 2 ; + DUP 2 ; + CONTRACT %balance_response_fa12 nat ; + SWAP ; + CONTRACT %getbalance (pair (contract %callback nat) (address %owner)) ; + SWAP ; + IF_NONE + { DROP ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DROP ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; DUP 4 ; DIG 3 ; PAIR ; TRANSFER_TOKENS } } } + { PUSH string "FA1.2 standard" ; + SWAP ; + COMPARE ; + EQ ; + IF { DUP 3 ; + CONTRACT %balance_response_fa2 + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id)))) ; + SWAP ; + CONTRACT %balance_of + (pair (contract %callback + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id))))) + (list %requests (pair (address %owner) (nat %token_id)))) ; + SWAP ; + IF_NONE + { DROP 2 ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DROP 2 ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; + NIL (pair address nat) ; + DIG 4 ; CAR ; - DIG 3 ; DUP 6 ; PAIR ; - PAIR ; - TRANSFER_TOKENS } - { PUSH nat 108 ; FAILWITH } } ; - DUP 3 ; - CONTRACT %deposit - (pair (pair %swap - (pair %from - (pair %token - (nat %token_id) - (string %name) - (option %address address) - (nat %decimals) - (option %standard string)) - (nat %amount)) - (pair %to - (nat %token_id) - (string %name) - (option %address address) - (nat %decimals) - (option %standard string))) - (timestamp %created_at) - (nat %side) - (nat %tolerance)) ; - IF_NONE { PUSH nat 157 ; FAILWITH } {} ; - PUSH mutez 0 ; - DUP 6 ; - TRANSFER_TOKENS ; - DUP 5 ; - CAR ; - CAR ; - CAR ; - GET 8 ; - IF_NONE - { PUSH bool False } - { PUSH string "FA1.2 token" ; SWAP ; COMPARE ; EQ } ; - IF { DIG 2 ; DIG 3 ; DIG 4 ; DROP 3 ; NONE operation } - { DUP 5 ; - CAR ; - CAR ; - CAR ; - GET 8 ; - IF_NONE - { PUSH bool False } - { PUSH string "FA2 token" ; SWAP ; COMPARE ; EQ } ; - IF { SELF_ADDRESS ; - DIG 3 ; - CONTRACT %remove_operator - (pair (pair (address %operator) (address %owner)) (nat %token_id)) ; - IF_NONE { PUSH nat 157 ; FAILWITH } {} ; - PUSH mutez 0 ; - DIG 6 ; - CAR ; - CAR ; - CAR ; - CAR ; + CONS ; DIG 3 ; - DIG 6 ; PAIR ; - PAIR ; - TRANSFER_TOKENS ; - SOME } - { DIG 2 ; DIG 3 ; DIG 4 ; DROP 3 ; PUSH nat 108 ; FAILWITH } } ; - IF_NONE { NIL operation } { NIL operation ; SWAP ; CONS } ; - SWAP ; - CONS ; - SWAP ; - CONS } ; - PAIR } } } } - { DROP ; - PUSH mutez 1 ; - AMOUNT ; - COMPARE ; - LT ; - IF {} { PUSH nat 118 ; FAILWITH } ; - SENDER ; - DUP 2 ; - CDR ; - CDR ; - CDR ; - DUP ; - CAR ; - DUP 3 ; - MEM ; - IF { CDR ; - DUP 2 ; - GET ; - IF_NONE { NONE (pair (pair address nat) mutez) } { SOME } } - { DROP ; NONE (pair (pair address nat) mutez) } ; - IF_NONE - { DROP 4 ; PUSH nat 151 ; FAILWITH } - { UNPAIR ; - CDR ; - DUP 4 ; - CDR ; - CDR ; - CAR ; - INT ; - PUSH int 1 ; - SWAP ; - PAIR ; - DUP 2 ; - INT ; - PUSH int 1 ; - SWAP ; - PAIR ; - DUP 2 ; - CAR ; + TRANSFER_TOKENS } } } + { DROP 2 ; PUSH nat 108 ; FAILWITH } } ; + NIL operation ; + SWAP ; + CONS ; + DUP 4 ; + CAR ; + CDR ; + CAR ; + ITER { CDR ; + SWAP ; + DUP 2 ; + CAR ; + GET 5 ; + IF_NONE { PUSH nat 101 ; FAILWITH } {} ; + DUP 3 ; + CAR ; + GET 8 ; + IF_NONE { PUSH nat 108 ; FAILWITH } {} ; + PUSH string "FA2 standard" ; + DUP 2 ; + COMPARE ; + EQ ; + IF { DIG 3 ; + DROP 2 ; + DUP 3 ; + CONTRACT %balance_response_fa12 nat ; + SWAP ; + CONTRACT %getbalance (pair (contract %callback nat) (address %owner)) ; + SWAP ; + IF_NONE + { DROP ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DROP ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; DUP 5 ; DIG 3 ; PAIR ; TRANSFER_TOKENS } } } + { PUSH string "FA1.2 standard" ; + SWAP ; + COMPARE ; + EQ ; + IF { DUP 4 ; + CONTRACT %balance_response_fa2 + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id)))) ; + SWAP ; + CONTRACT %balance_of + (pair (contract %callback + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id))))) + (list %requests (pair (address %owner) (nat %token_id)))) ; + SWAP ; + IF_NONE + { DIG 2 ; DROP 2 ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DIG 2 ; DROP 2 ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; + NIL (pair address nat) ; + DIG 5 ; + CAR ; + CAR ; + DUP 7 ; + PAIR ; + CONS ; + DIG 3 ; + PAIR ; + TRANSFER_TOKENS } } } + { DIG 2 ; DROP 2 ; PUSH nat 108 ; FAILWITH } } ; + CONS } ; + SWAP ; + DROP ; + NIL operation ; + SWAP ; + ITER { CONS } ; + SWAP ; + NIL operation ; + SWAP ; + ITER { CONS } ; + ITER { CONS } ; + NIL operation ; + SWAP ; + ITER { CONS } ; + PAIR } } + { DROP ; + PUSH mutez 1 ; + AMOUNT ; + COMPARE ; + LT ; + IF {} { PUSH nat 118 ; FAILWITH } ; + SENDER ; DUP 2 ; CDR ; - MUL ; - DIG 2 ; CDR ; - DIG 2 ; - CAR ; - MUL ; - PAIR ; - EMPTY_MAP string (pair (pair nat string (option address) nat (option string)) nat) ; - DUP 6 ; CDR ; - CAR ; + DUP ; CAR ; DUP 3 ; - PAIR 3 ; - DUP 7 ; - SWAP ; - EXEC ; - UNPAIR ; - SWAP ; - EMPTY_MAP string (pair (pair nat string (option address) nat (option string)) nat) ; - DIG 3 ; - PAIR ; - PAIR ; - DUP 6 ; - CAR ; - CDR ; - CAR ; - ITER { CDR ; - SWAP ; - UNPAIR ; - UNPAIR ; - DIG 2 ; - DIG 3 ; - DUP 3 ; - PAIR 3 ; - DUP 9 ; - SWAP ; - EXEC ; - UNPAIR ; - DIG 3 ; - SWAP ; - PAIR ; - DUP 10 ; - SWAP ; - EXEC ; - DIG 2 ; - PAIR ; - PAIR } ; - DIG 6 ; - DIG 7 ; - DROP 2 ; - UNPAIR ; - CDR ; - DUP 7 ; - CDR ; - CDR ; - CAR ; - DUP 5 ; - COMPARE ; - GT ; - IF { SWAP ; DIG 2 ; DIG 3 ; DIG 6 ; DROP 5 ; PUSH nat 154 ; FAILWITH } - { DIG 3 ; - DUP 7 ; - CDR ; - CDR ; - CAR ; - SUB ; - ABS ; - DIG 2 ; - DUP 7 ; - DIG 7 ; - CDR ; - DUP ; - CAR ; - DIG 6 ; - UPDATE 1 ; - UPDATE 1 ; - UPDATE 2 ; - DUP ; - CAR ; - DUP ; - CDR ; - DIG 5 ; - UPDATE 1 ; - UPDATE 2 ; - UPDATE 1 ; - DUP ; - CDR ; - DUP ; - CDR ; - DIG 4 ; - UPDATE 1 ; - UPDATE 2 ; - UPDATE 2 ; - PAIR } ; - UNPAIR ; - DUP 4 ; - CONTRACT unit ; - IF_NONE { PUSH nat 102 ; FAILWITH } { DUP 4 ; UNIT ; TRANSFER_TOKENS } ; - SELF_ADDRESS ; - NIL operation ; - DIG 4 ; - ITER { CDR ; - DUP ; - CAR ; - GET 5 ; - IF_NONE - { DROP ; PUSH nat 109 ; FAILWITH } - { DUP 2 ; + MEM ; + IF { CDR ; + DUP 2 ; + GET ; + IF_NONE { NONE (pair (pair address nat) mutez) } { SOME } } + { DROP ; NONE (pair (pair address nat) mutez) } ; + IF_NONE + { DROP 4 ; PUSH nat 151 ; FAILWITH } + { UNPAIR ; + CDR ; + DUP 4 ; + CDR ; + CDR ; + CAR ; + INT ; + PUSH int 1 ; + SWAP ; + PAIR ; + DUP 2 ; + INT ; + PUSH int 1 ; + SWAP ; + PAIR ; + DUP 2 ; + CAR ; + DUP 2 ; + CDR ; + MUL ; + DIG 2 ; + CDR ; + DIG 2 ; + CAR ; + MUL ; + PAIR ; + DUP 5 ; + CDR ; + CAR ; + CAR ; + DUP ; + CDR ; + INT ; + PUSH int 1 ; + SWAP ; + PAIR ; + DUP ; + CDR ; + DUP 4 ; + CDR ; + MUL ; + SWAP ; + CAR ; + DUP 4 ; + CAR ; + MUL ; + PAIR ; + PUSH int 0 ; + DUP 2 ; + CAR ; + COMPARE ; + LT ; + IF { PUSH int -1 ; DUP 2 ; CDR ; MUL ; PUSH int -1 ; DIG 2 ; CAR ; MUL ; PAIR } + {} ; + DUP ; + CDR ; + PUSH nat 1 ; + PUSH nat 0 ; + PUSH nat 10 ; + PAIR ; + PAIR ; + LEFT nat ; + LOOP_LEFT + { UNPAIR ; + UNPAIR ; + PUSH nat 0 ; + DUP 3 ; + COMPARE ; + EQ ; + IF { DROP 2 ; RIGHT (pair (pair nat nat) nat) } + { PUSH nat 1 ; + PUSH nat 1 ; + DUP 4 ; + AND ; + COMPARE ; + EQ ; + IF { DUP ; DIG 3 ; MUL } { DIG 2 } ; + PUSH nat 1 ; + DIG 3 ; + LSR ; + DUP 3 ; + DIG 3 ; + MUL ; + PAIR ; + PAIR ; + LEFT nat } } ; + DIG 2 ; + CAR ; + MUL ; + EDIV ; + IF_NONE { PUSH string "DIV by 0" ; FAILWITH } {} ; + CAR ; + ISNAT ; + IF_NONE { PUSH nat 119 ; FAILWITH } {} ; + DUP 2 ; + CDR ; + DUP 2 ; + COMPARE ; + GT ; + IF { DROP 2 ; PUSH nat 153 ; FAILWITH } + { DUP ; + DUP 3 ; + CDR ; + INT ; + SUB ; + ABS ; + DUP 3 ; + DIG 2 ; + UPDATE 2 ; + PUSH nat 0 ; + DUP 2 ; + CDR ; + COMPARE ; + EQ ; + IF { DROP ; DUP 9 } { DUP 10 ; SWAP ; PAIR ; DUP 9 ; SWAP ; EXEC } ; + DUG 2 ; + UPDATE 2 ; + PAIR } ; + UNPAIR ; + SWAP ; + DIG 8 ; + DIG 3 ; + PAIR ; + PAIR ; + DUP 6 ; + CAR ; + CDR ; + CAR ; + ITER { CDR ; + SWAP ; + UNPAIR ; + UNPAIR ; + DUP 4 ; + CDR ; + INT ; + PUSH int 1 ; + SWAP ; + PAIR ; + DUP ; + CDR ; + DUP 3 ; + CDR ; + MUL ; + SWAP ; CAR ; - GET 8 ; - IF_NONE - { DROP 2 ; PUSH nat 108 ; FAILWITH } - { PUSH string "FA1.2 token" ; - DUP 2 ; + DUP 3 ; + CAR ; + MUL ; + PAIR ; + PUSH int 0 ; + DUP 2 ; + CAR ; + COMPARE ; + LT ; + IF { PUSH int -1 ; DUP 2 ; CDR ; MUL ; PUSH int -1 ; DIG 2 ; CAR ; MUL ; PAIR } + {} ; + DUP ; + CDR ; + PUSH nat 1 ; + PUSH nat 0 ; + PUSH nat 10 ; + PAIR ; + PAIR ; + LEFT nat ; + LOOP_LEFT + { UNPAIR ; + UNPAIR ; + PUSH nat 0 ; + DUP 3 ; COMPARE ; EQ ; - IF { DROP ; - CONTRACT %transfer (pair (address %from) (address %to) (nat %value)) ; - IF_NONE { PUSH nat 101 ; FAILWITH } {} ; - PUSH mutez 0 ; - DIG 2 ; - CDR ; - DUP 9 ; - DUP 6 ; - PAIR 3 ; - TRANSFER_TOKENS } - { PUSH string "FA2 token" ; - SWAP ; + IF { DROP 2 ; RIGHT (pair (pair nat nat) nat) } + { PUSH nat 1 ; + PUSH nat 1 ; + DUP 4 ; + AND ; COMPARE ; EQ ; - IF { CONTRACT %transfer - (list (pair (address %from_) (list %tx (pair (address %to_) (nat %token_id) (nat %amount))))) ; - IF_NONE { PUSH nat 101 ; FAILWITH } {} ; - PUSH mutez 0 ; - NIL (pair address (list (pair address nat nat))) ; - NIL (pair address nat nat) ; - DUP 5 ; - CDR ; - DIG 5 ; - CAR ; - CAR ; - DUP 12 ; - PAIR 3 ; - CONS ; - DUP 6 ; - PAIR ; - CONS ; - TRANSFER_TOKENS } - { DROP 2 ; PUSH nat 108 ; FAILWITH } } } } ; - CONS } ; - SWAP ; - DROP ; - DUP 3 ; - DUP 4 ; - CDR ; - DUP ; - CDR ; - DIG 5 ; - CDR ; - CDR ; - CDR ; - DUP ; - CAR ; - DUP 9 ; - MEM ; - IF { DUP ; - CDR ; - DIG 8 ; - NONE (pair (pair address nat) mutez) ; - SWAP ; - UPDATE ; - UPDATE 2 } - { DIG 7 ; DROP } ; - UPDATE 2 ; - UPDATE 2 ; - UPDATE 2 ; - PUSH mutez 0 ; - DIG 4 ; - COMPARE ; - GT ; - IF { SWAP ; DIG 2 ; CONS } { DIG 2 ; DROP ; SWAP } ; - PAIR } } } ; + IF { DUP ; DIG 3 ; MUL } { DIG 2 } ; + PUSH nat 1 ; + DIG 3 ; + LSR ; + DUP 3 ; + DIG 3 ; + MUL ; + PAIR ; + PAIR ; + LEFT nat } } ; + DIG 2 ; + CAR ; + MUL ; + EDIV ; + IF_NONE { PUSH string "DIV by 0" ; FAILWITH } {} ; + CAR ; + ISNAT ; + IF_NONE { PUSH nat 119 ; FAILWITH } {} ; + DUP 5 ; + CDR ; + DUP 2 ; + COMPARE ; + GT ; + IF { DIG 3 ; DIG 4 ; DROP 3 ; PUSH nat 153 ; FAILWITH } + { DUP ; + DUP 6 ; + CDR ; + INT ; + SUB ; + ABS ; + DUP 6 ; + DIG 2 ; + UPDATE 2 ; + PUSH nat 0 ; + DUP 2 ; + CDR ; + COMPARE ; + EQ ; + IF { DROP ; DIG 3 } { DIG 4 ; SWAP ; PAIR ; DUP 11 ; SWAP ; EXEC } ; + DIG 4 ; + DIG 2 ; + UPDATE 2 ; + PAIR } ; + UNPAIR ; + DIG 3 ; + SWAP ; + PAIR ; + DUP 9 ; + SWAP ; + EXEC ; + DIG 2 ; + PAIR ; + PAIR } ; + DIG 6 ; + DROP ; + UNPAIR ; + CDR ; + DUP 7 ; + CDR ; + CDR ; + CAR ; + DUP 5 ; + COMPARE ; + GT ; + IF { SWAP ; DIG 2 ; DIG 3 ; DIG 6 ; DROP 5 ; PUSH nat 154 ; FAILWITH } + { DIG 3 ; + DUP 7 ; + CDR ; + CDR ; + CAR ; + SUB ; + ABS ; + DIG 2 ; + DUP 7 ; + DIG 7 ; + CDR ; + DUP ; + CAR ; + DIG 6 ; + UPDATE 1 ; + UPDATE 1 ; + UPDATE 2 ; + DUP ; + CAR ; + DUP ; + CDR ; + DIG 5 ; + UPDATE 1 ; + UPDATE 2 ; + UPDATE 1 ; + DUP ; + CDR ; + DUP ; + CDR ; + DIG 4 ; + UPDATE 1 ; + UPDATE 2 ; + UPDATE 2 ; + PAIR } ; + UNPAIR ; + DUP 4 ; + CONTRACT unit ; + IF_NONE { PUSH nat 102 ; FAILWITH } { DUP 4 ; UNIT ; TRANSFER_TOKENS } ; + SELF_ADDRESS ; + NIL operation ; + DIG 4 ; + ITER { CDR ; + DUP ; + CAR ; + GET 5 ; + IF_NONE + { DROP ; PUSH nat 109 ; FAILWITH } + { DUP 2 ; + CAR ; + GET 8 ; + IF_NONE + { DROP 2 ; PUSH nat 108 ; FAILWITH } + { PUSH string "FA1.2 token" ; + DUP 2 ; + COMPARE ; + EQ ; + IF { DROP ; + CONTRACT %transfer (pair (address %from) (address %to) (nat %value)) ; + IF_NONE { PUSH nat 101 ; FAILWITH } {} ; + PUSH mutez 0 ; + DIG 2 ; + CDR ; + DUP 9 ; + DUP 6 ; + PAIR 3 ; + TRANSFER_TOKENS } + { PUSH string "FA2 token" ; + SWAP ; + COMPARE ; + EQ ; + IF { CONTRACT %transfer + (list (pair (address %from_) (list %tx (pair (address %to_) (nat %token_id) (nat %amount))))) ; + IF_NONE { PUSH nat 101 ; FAILWITH } {} ; + PUSH mutez 0 ; + NIL (pair address (list (pair address nat nat))) ; + NIL (pair address nat nat) ; + DUP 5 ; + CDR ; + DIG 5 ; + CAR ; + CAR ; + DUP 12 ; + PAIR 3 ; + CONS ; + DUP 6 ; + PAIR ; + CONS ; + TRANSFER_TOKENS } + { DROP 2 ; PUSH nat 108 ; FAILWITH } } } } ; + CONS } ; + SWAP ; + DROP ; + DUP 3 ; + CDR ; + CDR ; + CDR ; + SELF_ADDRESS ; + DUP 5 ; + CDR ; + CAR ; + CAR ; + CAR ; + DUP ; + GET 5 ; + IF_NONE { PUSH nat 101 ; FAILWITH } {} ; + DUP 2 ; + GET 8 ; + IF_NONE { PUSH nat 108 ; FAILWITH } {} ; + PUSH string "FA2 standard" ; + DUP 2 ; + COMPARE ; + EQ ; + IF { DIG 2 ; + DROP 2 ; + DUP 2 ; + CONTRACT %balance_response_fa12 nat ; + SWAP ; + CONTRACT %getbalance (pair (contract %callback nat) (address %owner)) ; + SWAP ; + IF_NONE + { DROP ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DROP ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; DUP 4 ; DIG 3 ; PAIR ; TRANSFER_TOKENS } } } + { PUSH string "FA1.2 standard" ; + SWAP ; + COMPARE ; + EQ ; + IF { DUP 3 ; + CONTRACT %balance_response_fa2 + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id)))) ; + SWAP ; + CONTRACT %balance_of + (pair (contract %callback + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id))))) + (list %requests (pair (address %owner) (nat %token_id)))) ; + SWAP ; + IF_NONE + { DROP 2 ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DROP 2 ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; + NIL (pair address nat) ; + DIG 4 ; + CAR ; + DUP 6 ; + PAIR ; + CONS ; + DIG 3 ; + PAIR ; + TRANSFER_TOKENS } } } + { DROP 2 ; PUSH nat 108 ; FAILWITH } } ; + NIL operation ; + SWAP ; + CONS ; + DUP 6 ; + CAR ; + CDR ; + CAR ; + ITER { CDR ; + SWAP ; + DUP 2 ; + CAR ; + GET 5 ; + IF_NONE { PUSH nat 101 ; FAILWITH } {} ; + DUP 3 ; + CAR ; + GET 8 ; + IF_NONE { PUSH nat 108 ; FAILWITH } {} ; + PUSH string "FA2 standard" ; + DUP 2 ; + COMPARE ; + EQ ; + IF { DIG 3 ; + DROP 2 ; + DUP 3 ; + CONTRACT %balance_response_fa12 nat ; + SWAP ; + CONTRACT %getbalance (pair (contract %callback nat) (address %owner)) ; + SWAP ; + IF_NONE + { DROP ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DROP ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; DUP 5 ; DIG 3 ; PAIR ; TRANSFER_TOKENS } } } + { PUSH string "FA1.2 standard" ; + SWAP ; + COMPARE ; + EQ ; + IF { DUP 4 ; + CONTRACT %balance_response_fa2 + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id)))) ; + SWAP ; + CONTRACT %balance_of + (pair (contract %callback + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id))))) + (list %requests (pair (address %owner) (nat %token_id)))) ; + SWAP ; + IF_NONE + { DIG 2 ; DROP 2 ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DIG 2 ; DROP 2 ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; + NIL (pair address nat) ; + DIG 5 ; + CAR ; + CAR ; + DUP 7 ; + PAIR ; + CONS ; + DIG 3 ; + PAIR ; + TRANSFER_TOKENS } } } + { DIG 2 ; DROP 2 ; PUSH nat 108 ; FAILWITH } } ; + CONS } ; + SWAP ; + DROP ; + NIL operation ; + SWAP ; + ITER { CONS } ; + PUSH mutez 0 ; + DIG 6 ; + COMPARE ; + GT ; + IF { DIG 2 ; DIG 3 ; CONS } { DIG 3 ; DROP ; DIG 2 } ; + NIL operation ; + SWAP ; + ITER { CONS } ; + ITER { CONS } ; + NIL operation ; + SWAP ; + ITER { CONS } ; + DUP 3 ; + DIG 3 ; + CDR ; + DUP ; + CDR ; + DUP 5 ; + CAR ; + DUP 7 ; + MEM ; + IF { DUP 5 ; + DIG 5 ; + CDR ; + DIG 6 ; + NONE (pair (pair address nat) mutez) ; + SWAP ; + UPDATE ; + UPDATE 2 } + { DIG 5 ; DROP ; DIG 4 } ; + UPDATE 2 ; + UPDATE 2 ; + UPDATE 2 ; + SWAP ; + PAIR } } } } ; view "get_native_token_of_vault" unit (pair (nat %token_id) @@ -1114,23 +1750,5 @@ (option %address address) (nat %decimals) (option %standard string)) - { CDR ; CDR ; CAR ; CAR ; CAR } ; - view "get_vault_balances" - unit - (pair (pair (pair %token - (nat %token_id) - (string %name) - (option %address address) - (nat %decimals) - (option %standard string)) - (nat %amount)) - (map string - (pair (pair %token - (nat %token_id) - (string %name) - (option %address address) - (nat %decimals) - (option %standard string)) - (nat %amount)))) - { CDR ; DUP ; CAR ; CDR ; CAR ; SWAP ; CDR ; CAR ; CAR ; PAIR } } + { CDR ; CDR ; CAR ; CAR ; CAR } } diff --git a/batcher/michelson/tzbtc-vault-ghostnet.tz b/batcher/michelson/tzbtc-vault-ghostnet.tz index 67557279..488c5eaf 100644 --- a/batcher/michelson/tzbtc-vault-ghostnet.tz +++ b/batcher/michelson/tzbtc-vault-ghostnet.tz @@ -1,24 +1,28 @@ { parameter (or (or (or (or (nat %addLiquidity) (mutez %addReward)) - (or (address %change_admin_address) (address %change_batcher_address))) - (or (or (address %change_marketmaker_address) (address %change_tokenmanager_address)) - (or (unit %claim) - (pair %injectLiquidity - (pair (nat %amount) - (pair %from_token - (nat %token_id) - (string %name) - (option %address address) - (nat %decimals) - (option %standard string))) - (or %side (unit %buy) (unit %sell)) - (pair %to_token - (nat %token_id) - (string %name) - (option %address address) - (nat %decimals) - (option %standard string)))))) - (unit %removeLiquidity)) ; + (or (nat %balance_response_fa12) + (pair %balance_response_fa2 + (nat %balance) + (pair %request (address %owner) (nat %token_id))))) + (or (or (address %change_admin_address) (address %change_batcher_address)) + (or (address %change_marketmaker_address) (address %change_tokenmanager_address)))) + (or (or (unit %claim) + (pair %injectLiquidity + (pair (nat %amount) + (pair %from_token + (nat %token_id) + (string %name) + (option %address address) + (nat %decimals) + (option %standard string))) + (or %side (unit %buy) (unit %sell)) + (pair %to_token + (nat %token_id) + (string %name) + (option %address address) + (nat %decimals) + (option %standard string)))) + (unit %removeLiquidity))) ; storage (pair (pair (pair (address %administrator) (address %batcher)) (map %foreign_tokens @@ -47,6 +51,11 @@ address (pair (pair (address %holder) (nat %shares)) (mutez %unclaimed))))) ; code { LAMBDA + (pair (option address) nat) + address + { UNPAIR ; IF_NONE { FAILWITH } { SWAP ; DROP } } ; + EMPTY_MAP string (pair (pair nat string (option address) nat (option string)) nat) ; + LAMBDA (pair (pair (pair nat string (option address) nat (option string)) nat) (map string (pair (pair nat string (option address) nat (option string)) nat))) (map string (pair (pair nat string (option address) nat (option string)) nat)) @@ -82,111 +91,7 @@ SOME ; DIG 2 ; UPDATE } } ; - LAMBDA - (pair (lambda - (pair (pair (pair nat string (option address) nat (option string)) nat) - (map string (pair (pair nat string (option address) nat (option string)) nat))) - (map string (pair (pair nat string (option address) nat (option string)) nat))) - (pair (pair int int) - (pair (pair nat string (option address) nat (option string)) nat) - (map string (pair (pair nat string (option address) nat (option string)) nat)))) - (pair (pair (pair nat string (option address) nat (option string)) nat) - (map string (pair (pair nat string (option address) nat (option string)) nat))) - { UNPAIR ; - SWAP ; - UNPAIR 3 ; - DUP 2 ; - CDR ; - INT ; - PUSH int 1 ; - SWAP ; - PAIR ; - DUP ; - CDR ; - DUP 3 ; - CDR ; - MUL ; - SWAP ; - CAR ; - DIG 2 ; - CAR ; - MUL ; - PAIR ; - PUSH int 0 ; - DUP 2 ; - CAR ; - COMPARE ; - LT ; - IF { PUSH int -1 ; DUP 2 ; CDR ; MUL ; PUSH int -1 ; DIG 2 ; CAR ; MUL ; PAIR } - {} ; - DUP ; - CDR ; - PUSH nat 1 ; - PUSH nat 0 ; - PUSH nat 10 ; - PAIR ; - PAIR ; - LEFT nat ; - LOOP_LEFT - { UNPAIR ; - UNPAIR ; - PUSH nat 0 ; - DUP 3 ; - COMPARE ; - EQ ; - IF { DROP 2 ; RIGHT (pair (pair nat nat) nat) } - { PUSH nat 1 ; - PUSH nat 1 ; - DUP 4 ; - AND ; - COMPARE ; - EQ ; - IF { DUP ; DIG 3 ; MUL } { DIG 2 } ; - PUSH nat 1 ; - DIG 3 ; - LSR ; - DUP 3 ; - DIG 3 ; - MUL ; - PAIR ; - PAIR ; - LEFT nat } } ; - DIG 2 ; - CAR ; - MUL ; - EDIV ; - IF_NONE { PUSH string "DIV by 0" ; FAILWITH } {} ; - CAR ; - ISNAT ; - IF_NONE { PUSH nat 119 ; FAILWITH } {} ; - DUP 2 ; - CDR ; - DUP 2 ; - COMPARE ; - GT ; - IF { DROP 4 ; PUSH nat 153 ; FAILWITH } - { DUP ; - DUP 3 ; - CDR ; - INT ; - SUB ; - ABS ; - DUP 3 ; - DIG 2 ; - UPDATE 2 ; - PUSH nat 0 ; - DUP 2 ; - CDR ; - COMPARE ; - EQ ; - IF { DIG 4 ; DROP 2 ; DIG 2 } - { DIG 3 ; SWAP ; PAIR ; DIG 3 ; SWAP ; EXEC } ; - DUG 2 ; - UPDATE 2 ; - PAIR } } ; - DUP 2 ; - APPLY ; - DIG 2 ; + DIG 3 ; UNPAIR ; IF_LEFT { DIG 2 ; @@ -194,7 +99,9 @@ DROP 2 ; IF_LEFT { IF_LEFT - { IF_LEFT + { DIG 2 ; + DROP ; + IF_LEFT { PUSH mutez 1 ; AMOUNT ; COMPARE ; @@ -255,13 +162,138 @@ CONS ; TRANSFER_TOKENS } { DROP 2 ; PUSH nat 108 ; FAILWITH } } } } ; - DUP 4 ; + SELF_ADDRESS ; + DUP 5 ; CDR ; CAR ; CAR ; + CAR ; DUP ; + GET 5 ; + IF_NONE { PUSH nat 101 ; FAILWITH } {} ; + DUP 2 ; + GET 8 ; + IF_NONE { PUSH nat 108 ; FAILWITH } {} ; + PUSH string "FA2 standard" ; + DUP 2 ; + COMPARE ; + EQ ; + IF { DIG 2 ; + DROP 2 ; + DUP 2 ; + CONTRACT %balance_response_fa12 nat ; + SWAP ; + CONTRACT %getbalance (pair (contract %callback nat) (address %owner)) ; + SWAP ; + IF_NONE + { DROP ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DROP ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; DUP 4 ; DIG 3 ; PAIR ; TRANSFER_TOKENS } } } + { PUSH string "FA1.2 standard" ; + SWAP ; + COMPARE ; + EQ ; + IF { DUP 3 ; + CONTRACT %balance_response_fa2 + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id)))) ; + SWAP ; + CONTRACT %balance_of + (pair (contract %callback + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id))))) + (list %requests (pair (address %owner) (nat %token_id)))) ; + SWAP ; + IF_NONE + { DROP 2 ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DROP 2 ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; + NIL (pair address nat) ; + DIG 4 ; + CAR ; + DUP 6 ; + PAIR ; + CONS ; + DIG 3 ; + PAIR ; + TRANSFER_TOKENS } } } + { DROP 2 ; PUSH nat 108 ; FAILWITH } } ; + NIL operation ; + SWAP ; + CONS ; + DUP 6 ; CAR ; - DUP 4 ; + CDR ; + CAR ; + ITER { CDR ; + SWAP ; + DUP 2 ; + CAR ; + GET 5 ; + IF_NONE { PUSH nat 101 ; FAILWITH } {} ; + DUP 3 ; + CAR ; + GET 8 ; + IF_NONE { PUSH nat 108 ; FAILWITH } {} ; + PUSH string "FA2 standard" ; + DUP 2 ; + COMPARE ; + EQ ; + IF { DIG 3 ; + DROP 2 ; + DUP 3 ; + CONTRACT %balance_response_fa12 nat ; + SWAP ; + CONTRACT %getbalance (pair (contract %callback nat) (address %owner)) ; + SWAP ; + IF_NONE + { DROP ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DROP ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; DUP 5 ; DIG 3 ; PAIR ; TRANSFER_TOKENS } } } + { PUSH string "FA1.2 standard" ; + SWAP ; + COMPARE ; + EQ ; + IF { DUP 4 ; + CONTRACT %balance_response_fa2 + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id)))) ; + SWAP ; + CONTRACT %balance_of + (pair (contract %callback + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id))))) + (list %requests (pair (address %owner) (nat %token_id)))) ; + SWAP ; + IF_NONE + { DIG 2 ; DROP 2 ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DIG 2 ; DROP 2 ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; + NIL (pair address nat) ; + DIG 5 ; + CAR ; + CAR ; + DUP 7 ; + PAIR ; + CONS ; + DIG 3 ; + PAIR ; + TRANSFER_TOKENS } } } + { DIG 2 ; DROP 2 ; PUSH nat 108 ; FAILWITH } } ; + CONS } ; + SWAP ; + DROP ; + DUP 5 ; + CDR ; + CAR ; + CAR ; + DUP ; + CAR ; + DUP 5 ; CAR ; DUP 2 ; GET 8 ; @@ -298,37 +330,37 @@ AND ; AND ; NOT ; - IF { DIG 2 ; DIG 3 ; DIG 4 ; DROP 4 ; PUSH nat 115 ; FAILWITH } - { DUP 3 ; + IF { DIG 3 ; DIG 4 ; DIG 5 ; DROP 4 ; PUSH nat 115 ; FAILWITH } + { DUP 4 ; CDR ; - DUP 6 ; + DUP 7 ; CDR ; CDR ; CAR ; ADD ; DUP 2 ; - DUP 5 ; + DUP 6 ; CDR ; DIG 3 ; CDR ; ADD ; UPDATE 2 ; - DUP 6 ; + DUP 7 ; CDR ; CDR ; CDR ; DUP ; CAR ; - DUP 7 ; + DUP 8 ; MEM ; IF { CDR ; - DUP 6 ; + DUP 7 ; GET ; IF_NONE { NONE (pair (pair address nat) mutez) } { SOME } } { DROP ; NONE (pair (pair address nat) mutez) } ; IF_NONE - { PUSH mutez 0 ; DIG 4 ; CDR ; DUP 6 ; PAIR ; PAIR } - { DIG 4 ; + { PUSH mutez 0 ; DIG 5 ; CDR ; DUP 7 ; PAIR ; PAIR } + { DIG 5 ; CDR ; DUP 2 ; CAR ; @@ -340,8 +372,8 @@ DIG 2 ; UPDATE 2 ; UPDATE 1 } ; - DUP 6 ; DUP 7 ; + DUP 8 ; CDR ; DUP ; CDR ; @@ -353,19 +385,19 @@ CDR ; DUP ; CDR ; - DIG 7 ; + DIG 8 ; CDR ; CDR ; CDR ; DUP ; CAR ; - DUP 9 ; + DUP 10 ; MEM ; - IF { DUP ; CDR ; DIG 5 ; SOME ; DIG 8 ; UPDATE ; UPDATE 2 } + IF { DUP ; CDR ; DIG 5 ; SOME ; DIG 9 ; UPDATE ; UPDATE 2 } { DUP ; DUP 2 ; CAR ; - DUP 10 ; + DUP 11 ; PUSH bool True ; SWAP ; UPDATE ; @@ -373,7 +405,7 @@ SWAP ; CDR ; DIG 5 ; - DIG 8 ; + DIG 9 ; SWAP ; SOME ; SWAP ; @@ -390,7 +422,7 @@ UPDATE 1 ; UPDATE 1 ; UPDATE 2 } ; - NIL operation ; + SWAP ; DIG 2 ; CONS } { DUP 2 ; @@ -551,6 +583,171 @@ UPDATE 2 ; UPDATE 2 ; NIL operation } } + { IF_LEFT + { SENDER ; + DUP 3 ; + CDR ; + CAR ; + CAR ; + CAR ; + GET 5 ; + IF_NONE { PUSH nat 101 ; FAILWITH } {} ; + PUSH nat 0 ; + DUP 5 ; + CDR ; + CAR ; + CAR ; + CAR ; + CAR ; + COMPARE ; + EQ ; + DUP 3 ; + DIG 2 ; + COMPARE ; + EQ ; + AND ; + IF { DUP 3 ; + DUP 4 ; + CDR ; + DUP ; + CAR ; + DIG 5 ; + CDR ; + CAR ; + CAR ; + DUP 6 ; + UPDATE 2 ; + UPDATE 1 ; + UPDATE 1 ; + UPDATE 2 } + { DIG 2 } ; + DUP ; + CAR ; + CDR ; + CAR ; + DUP ; + ITER { CDR ; + PUSH nat 101 ; + DUP 2 ; + CAR ; + GET 5 ; + PAIR ; + DUP 7 ; + SWAP ; + EXEC ; + PUSH nat 0 ; + DUP 3 ; + CAR ; + CAR ; + COMPARE ; + EQ ; + DUP 6 ; + DIG 2 ; + COMPARE ; + EQ ; + AND ; + IF { DUP 5 ; UPDATE 2 ; SWAP ; DUP 2 ; SOME ; DIG 2 ; CAR ; GET 3 ; UPDATE } + { DROP } } ; + DIG 2 ; + DIG 3 ; + DIG 4 ; + DROP 3 ; + DUP 2 ; + DIG 2 ; + CAR ; + DUP ; + CDR ; + DIG 3 ; + UPDATE 1 ; + UPDATE 2 ; + UPDATE 1 } + { SENDER ; + DUP 2 ; + CAR ; + DIG 2 ; + CDR ; + CDR ; + DUP 4 ; + CDR ; + CAR ; + CAR ; + CAR ; + GET 5 ; + IF_NONE { PUSH nat 101 ; FAILWITH } {} ; + DUP 2 ; + DUP 6 ; + CDR ; + CAR ; + CAR ; + CAR ; + CAR ; + COMPARE ; + EQ ; + DUP 5 ; + DIG 2 ; + COMPARE ; + EQ ; + AND ; + IF { DUP 4 ; + DUP 5 ; + CDR ; + DUP ; + CAR ; + DIG 6 ; + CDR ; + CAR ; + CAR ; + DUP 6 ; + UPDATE 2 ; + UPDATE 1 ; + UPDATE 1 ; + UPDATE 2 } + { DIG 3 } ; + DUP ; + CAR ; + CDR ; + CAR ; + DUP ; + ITER { CDR ; + PUSH nat 101 ; + DUP 2 ; + CAR ; + GET 5 ; + PAIR ; + DUP 8 ; + SWAP ; + EXEC ; + DUP 5 ; + DUP 3 ; + CAR ; + CAR ; + COMPARE ; + EQ ; + DUP 8 ; + DIG 2 ; + COMPARE ; + EQ ; + AND ; + IF { DUP 5 ; UPDATE 2 ; SWAP ; DUP 2 ; SOME ; DIG 2 ; CAR ; GET 3 ; UPDATE } + { DROP } } ; + DIG 2 ; + DIG 3 ; + DIG 4 ; + DIG 5 ; + DROP 4 ; + DUP 2 ; + DIG 2 ; + CAR ; + DUP ; + CDR ; + DIG 3 ; + UPDATE 1 ; + UPDATE 2 ; + UPDATE 1 } ; + NIL operation } } + { DIG 2 ; + DROP ; + IF_LEFT { IF_LEFT { DUP 2 ; CAR ; @@ -595,10 +792,7 @@ DIG 3 ; UPDATE 2 ; UPDATE 1 ; - UPDATE 1 } ; - NIL operation } ; - PAIR } - { IF_LEFT + UPDATE 1 } } { IF_LEFT { DUP 2 ; CAR ; @@ -643,470 +837,912 @@ DIG 3 ; UPDATE 2 ; UPDATE 1 ; - UPDATE 2 } ; - NIL operation ; - PAIR } - { IF_LEFT - { DROP ; - PUSH mutez 1 ; - AMOUNT ; - COMPARE ; - LT ; - IF {} { PUSH nat 118 ; FAILWITH } ; - SENDER ; - DUP 2 ; - CDR ; - CDR ; + UPDATE 2 } } ; + NIL operation } ; + PAIR } + { DIG 4 ; + DROP ; + IF_LEFT + { DIG 2 ; + DIG 3 ; + DROP 2 ; + IF_LEFT + { DROP ; + PUSH mutez 1 ; + AMOUNT ; + COMPARE ; + LT ; + IF {} { PUSH nat 118 ; FAILWITH } ; + SENDER ; + DUP 2 ; + CDR ; + CDR ; + CDR ; + DUP ; + CAR ; + DUP 3 ; + MEM ; + IF { CDR ; + SWAP ; + GET ; + IF_NONE { NONE (pair (pair address nat) mutez) } { SOME } } + { DROP 2 ; NONE (pair (pair address nat) mutez) } ; + IF_NONE + { DROP ; PUSH nat 155 ; FAILWITH } + { DUP ; CDR ; - DUP ; - CAR ; - DUP 3 ; - MEM ; - IF { CDR ; - SWAP ; - GET ; - IF_NONE { NONE (pair (pair address nat) mutez) } { SOME } } - { DROP 2 ; NONE (pair (pair address nat) mutez) } ; - IF_NONE - { DROP ; PUSH nat 155 ; FAILWITH } - { DUP ; - CDR ; - PUSH mutez 0 ; - DUP 2 ; - COMPARE ; - EQ ; - IF { DROP 3 ; PUSH nat 155 ; FAILWITH } - { SWAP ; - PUSH mutez 0 ; - UPDATE 2 ; - DUP ; - CAR ; - CAR ; - CONTRACT unit ; - IF_NONE - { SWAP ; DROP ; PUSH nat 102 ; FAILWITH } - { DIG 2 ; UNIT ; TRANSFER_TOKENS } ; - DUP 3 ; - DUP 4 ; - CDR ; - DUP ; - CDR ; - DIG 5 ; - CDR ; - CDR ; - CDR ; - DUP 6 ; - CAR ; - CAR ; - DUP 2 ; - CAR ; - DUP 2 ; - MEM ; - IF { DUP 2 ; DIG 2 ; CDR ; DIG 7 ; SOME ; DIG 3 ; UPDATE ; UPDATE 2 } - { DUP 2 ; - DUP 3 ; - CAR ; - DUP 3 ; - PUSH bool True ; - SWAP ; - UPDATE ; - UPDATE 1 ; - DIG 2 ; - CDR ; - DIG 7 ; - DIG 3 ; - SWAP ; - SOME ; - SWAP ; - UPDATE ; - UPDATE 2 } ; - UPDATE 2 ; - UPDATE 2 ; - UPDATE 2 ; - NIL operation ; - DIG 2 ; - CONS ; - PAIR } } } - { DUP 2 ; - CAR ; - CDR ; - CDR ; - SENDER ; + PUSH mutez 0 ; + DUP 2 ; COMPARE ; EQ ; - IF {} { PUSH nat 168 ; FAILWITH } ; - PUSH mutez 1 ; - AMOUNT ; - COMPARE ; - LT ; - IF {} { PUSH nat 118 ; FAILWITH } ; - UNIT ; - LEFT unit ; - LEFT unit ; - IF_LEFT - { IF_LEFT { DROP ; PUSH nat 1 } { DROP ; PUSH nat 0 } } - { DROP ; PUSH nat 2 } ; - DUP 2 ; - CDR ; - CAR ; - IF_LEFT { DROP ; PUSH nat 0 } { DROP ; PUSH nat 1 } ; - NOW ; - DUP 4 ; - CDR ; - CDR ; - DUP 5 ; - CAR ; - CAR ; - DIG 5 ; + IF { DROP 3 ; PUSH nat 155 ; FAILWITH } + { SWAP ; + PUSH mutez 0 ; + UPDATE 2 ; + DUP ; + CAR ; + CAR ; + CONTRACT unit ; + IF_NONE + { SWAP ; DROP ; PUSH nat 102 ; FAILWITH } + { DIG 2 ; UNIT ; TRANSFER_TOKENS } ; + DUP 3 ; + DUP 4 ; + CDR ; + DUP ; + CDR ; + DIG 5 ; + CDR ; + CDR ; + CDR ; + DUP 6 ; + CAR ; + CAR ; + DUP 2 ; + CAR ; + DUP 2 ; + MEM ; + IF { DUP 2 ; DIG 2 ; CDR ; DIG 7 ; SOME ; DIG 3 ; UPDATE ; UPDATE 2 } + { DUP 2 ; + DUP 3 ; + CAR ; + DUP 3 ; + PUSH bool True ; + SWAP ; + UPDATE ; + UPDATE 1 ; + DIG 2 ; + CDR ; + DIG 7 ; + DIG 3 ; + SWAP ; + SOME ; + SWAP ; + UPDATE ; + UPDATE 2 } ; + UPDATE 2 ; + UPDATE 2 ; + UPDATE 2 ; + NIL operation ; + DIG 2 ; + CONS ; + PAIR } } } + { DUP 2 ; + CAR ; + CDR ; + CDR ; + SENDER ; + COMPARE ; + EQ ; + IF {} { PUSH nat 168 ; FAILWITH } ; + PUSH mutez 1 ; + AMOUNT ; + COMPARE ; + LT ; + IF {} { PUSH nat 118 ; FAILWITH } ; + UNIT ; + LEFT unit ; + LEFT unit ; + IF_LEFT + { IF_LEFT { DROP ; PUSH nat 1 } { DROP ; PUSH nat 0 } } + { DROP ; PUSH nat 2 } ; + DUP 2 ; + CDR ; + CAR ; + IF_LEFT { DROP ; PUSH nat 0 } { DROP ; PUSH nat 1 } ; + NOW ; + DUP 4 ; + CDR ; + CDR ; + DUP 5 ; + CAR ; + CAR ; + DIG 5 ; + CAR ; + CDR ; + PAIR ; + PAIR ; + PAIR 4 ; + DUP 2 ; + CAR ; + CAR ; + CDR ; + DUP 2 ; + CAR ; + CAR ; + CAR ; + GET 5 ; + IF_NONE + { DROP 2 ; PUSH nat 109 ; FAILWITH } + { DUP 3 ; CAR ; - CDR ; - PAIR ; - PAIR ; - PAIR 4 ; - DUP 2 ; CAR ; CAR ; - CDR ; - DUP 2 ; + GET 8 ; + IF_NONE + { PUSH bool False } + { PUSH string "FA1.2 token" ; SWAP ; COMPARE ; EQ } ; + IF { DUP ; + CONTRACT %approve (pair (address %spender) (nat %value)) ; + IF_NONE { PUSH nat 157 ; FAILWITH } {} ; + PUSH mutez 0 ; + DUP 5 ; + CAR ; + CAR ; + CDR ; + DUP 5 ; + PAIR ; + TRANSFER_TOKENS } + { DUP 3 ; + CAR ; + CAR ; + CAR ; + GET 8 ; + IF_NONE + { PUSH bool False } + { PUSH string "FA2 token" ; SWAP ; COMPARE ; EQ } ; + IF { SELF_ADDRESS ; + DUP 2 ; + CONTRACT %add_operator + (pair (pair (address %operator) (address %owner)) (nat %token_id)) ; + IF_NONE { PUSH nat 157 ; FAILWITH } {} ; + PUSH mutez 0 ; + DUP 6 ; + CAR ; + CAR ; + CAR ; + CAR ; + DIG 3 ; + DUP 6 ; + PAIR ; + PAIR ; + TRANSFER_TOKENS } + { PUSH nat 108 ; FAILWITH } } ; + DUP 3 ; + CONTRACT %deposit + (pair (pair %swap + (pair %from + (pair %token + (nat %token_id) + (string %name) + (option %address address) + (nat %decimals) + (option %standard string)) + (nat %amount)) + (pair %to + (nat %token_id) + (string %name) + (option %address address) + (nat %decimals) + (option %standard string))) + (timestamp %created_at) + (nat %side) + (nat %tolerance)) ; + IF_NONE { PUSH nat 157 ; FAILWITH } {} ; + PUSH mutez 0 ; + DUP 6 ; + TRANSFER_TOKENS ; + DUP 5 ; CAR ; CAR ; CAR ; - GET 5 ; + GET 8 ; IF_NONE - { DROP 2 ; PUSH nat 109 ; FAILWITH } - { DUP 3 ; - CAR ; - CAR ; - CAR ; - GET 8 ; - IF_NONE - { PUSH bool False } - { PUSH string "FA1.2 token" ; SWAP ; COMPARE ; EQ } ; - IF { DUP ; - CONTRACT %approve (pair (address %spender) (nat %value)) ; - IF_NONE { PUSH nat 157 ; FAILWITH } {} ; - PUSH mutez 0 ; - DUP 5 ; - CAR ; - CAR ; - CDR ; - DUP 5 ; - PAIR ; - TRANSFER_TOKENS } - { DUP 3 ; - CAR ; - CAR ; - CAR ; - GET 8 ; - IF_NONE - { PUSH bool False } - { PUSH string "FA2 token" ; SWAP ; COMPARE ; EQ } ; - IF { SELF_ADDRESS ; - DUP 2 ; - CONTRACT %add_operator - (pair (pair (address %operator) (address %owner)) (nat %token_id)) ; - IF_NONE { PUSH nat 157 ; FAILWITH } {} ; - PUSH mutez 0 ; - DUP 6 ; - CAR ; - CAR ; - CAR ; + { PUSH bool False } + { PUSH string "FA1.2 token" ; SWAP ; COMPARE ; EQ } ; + IF { DIG 2 ; DIG 3 ; DIG 4 ; DROP 3 ; NONE operation } + { DUP 5 ; + CAR ; + CAR ; + CAR ; + GET 8 ; + IF_NONE + { PUSH bool False } + { PUSH string "FA2 token" ; SWAP ; COMPARE ; EQ } ; + IF { SELF_ADDRESS ; + DIG 3 ; + CONTRACT %remove_operator + (pair (pair (address %operator) (address %owner)) (nat %token_id)) ; + IF_NONE { PUSH nat 157 ; FAILWITH } {} ; + PUSH mutez 0 ; + DIG 6 ; + CAR ; + CAR ; + CAR ; + CAR ; + DIG 3 ; + DIG 6 ; + PAIR ; + PAIR ; + TRANSFER_TOKENS ; + SOME } + { DIG 2 ; DIG 3 ; DIG 4 ; DROP 3 ; PUSH nat 108 ; FAILWITH } } ; + IF_NONE { NIL operation } { NIL operation ; SWAP ; CONS } ; + SWAP ; + CONS ; + SWAP ; + CONS } ; + SELF_ADDRESS ; + DUP 3 ; + CDR ; + CAR ; + CAR ; + CAR ; + DUP ; + GET 5 ; + IF_NONE { PUSH nat 101 ; FAILWITH } {} ; + DUP 2 ; + GET 8 ; + IF_NONE { PUSH nat 108 ; FAILWITH } {} ; + PUSH string "FA2 standard" ; + DUP 2 ; + COMPARE ; + EQ ; + IF { DIG 2 ; + DROP 2 ; + DUP 2 ; + CONTRACT %balance_response_fa12 nat ; + SWAP ; + CONTRACT %getbalance (pair (contract %callback nat) (address %owner)) ; + SWAP ; + IF_NONE + { DROP ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DROP ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; DUP 4 ; DIG 3 ; PAIR ; TRANSFER_TOKENS } } } + { PUSH string "FA1.2 standard" ; + SWAP ; + COMPARE ; + EQ ; + IF { DUP 3 ; + CONTRACT %balance_response_fa2 + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id)))) ; + SWAP ; + CONTRACT %balance_of + (pair (contract %callback + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id))))) + (list %requests (pair (address %owner) (nat %token_id)))) ; + SWAP ; + IF_NONE + { DROP 2 ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DROP 2 ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; + NIL (pair address nat) ; + DIG 4 ; CAR ; - DIG 3 ; DUP 6 ; PAIR ; - PAIR ; - TRANSFER_TOKENS } - { PUSH nat 108 ; FAILWITH } } ; - DUP 3 ; - CONTRACT %deposit - (pair (pair %swap - (pair %from - (pair %token - (nat %token_id) - (string %name) - (option %address address) - (nat %decimals) - (option %standard string)) - (nat %amount)) - (pair %to - (nat %token_id) - (string %name) - (option %address address) - (nat %decimals) - (option %standard string))) - (timestamp %created_at) - (nat %side) - (nat %tolerance)) ; - IF_NONE { PUSH nat 157 ; FAILWITH } {} ; - PUSH mutez 0 ; - DUP 6 ; - TRANSFER_TOKENS ; - DUP 5 ; - CAR ; - CAR ; - CAR ; - GET 8 ; - IF_NONE - { PUSH bool False } - { PUSH string "FA1.2 token" ; SWAP ; COMPARE ; EQ } ; - IF { DIG 2 ; DIG 3 ; DIG 4 ; DROP 3 ; NONE operation } - { DUP 5 ; - CAR ; - CAR ; - CAR ; - GET 8 ; - IF_NONE - { PUSH bool False } - { PUSH string "FA2 token" ; SWAP ; COMPARE ; EQ } ; - IF { SELF_ADDRESS ; - DIG 3 ; - CONTRACT %remove_operator - (pair (pair (address %operator) (address %owner)) (nat %token_id)) ; - IF_NONE { PUSH nat 157 ; FAILWITH } {} ; - PUSH mutez 0 ; - DIG 6 ; - CAR ; - CAR ; - CAR ; - CAR ; + CONS ; DIG 3 ; - DIG 6 ; PAIR ; - PAIR ; - TRANSFER_TOKENS ; - SOME } - { DIG 2 ; DIG 3 ; DIG 4 ; DROP 3 ; PUSH nat 108 ; FAILWITH } } ; - IF_NONE { NIL operation } { NIL operation ; SWAP ; CONS } ; - SWAP ; - CONS ; - SWAP ; - CONS } ; - PAIR } } } } - { DROP ; - PUSH mutez 1 ; - AMOUNT ; - COMPARE ; - LT ; - IF {} { PUSH nat 118 ; FAILWITH } ; - SENDER ; - DUP 2 ; - CDR ; - CDR ; - CDR ; - DUP ; - CAR ; - DUP 3 ; - MEM ; - IF { CDR ; - DUP 2 ; - GET ; - IF_NONE { NONE (pair (pair address nat) mutez) } { SOME } } - { DROP ; NONE (pair (pair address nat) mutez) } ; - IF_NONE - { DROP 4 ; PUSH nat 151 ; FAILWITH } - { UNPAIR ; - CDR ; - DUP 4 ; - CDR ; - CDR ; - CAR ; - INT ; - PUSH int 1 ; - SWAP ; - PAIR ; - DUP 2 ; - INT ; - PUSH int 1 ; - SWAP ; - PAIR ; - DUP 2 ; - CAR ; + TRANSFER_TOKENS } } } + { DROP 2 ; PUSH nat 108 ; FAILWITH } } ; + NIL operation ; + SWAP ; + CONS ; + DUP 4 ; + CAR ; + CDR ; + CAR ; + ITER { CDR ; + SWAP ; + DUP 2 ; + CAR ; + GET 5 ; + IF_NONE { PUSH nat 101 ; FAILWITH } {} ; + DUP 3 ; + CAR ; + GET 8 ; + IF_NONE { PUSH nat 108 ; FAILWITH } {} ; + PUSH string "FA2 standard" ; + DUP 2 ; + COMPARE ; + EQ ; + IF { DIG 3 ; + DROP 2 ; + DUP 3 ; + CONTRACT %balance_response_fa12 nat ; + SWAP ; + CONTRACT %getbalance (pair (contract %callback nat) (address %owner)) ; + SWAP ; + IF_NONE + { DROP ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DROP ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; DUP 5 ; DIG 3 ; PAIR ; TRANSFER_TOKENS } } } + { PUSH string "FA1.2 standard" ; + SWAP ; + COMPARE ; + EQ ; + IF { DUP 4 ; + CONTRACT %balance_response_fa2 + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id)))) ; + SWAP ; + CONTRACT %balance_of + (pair (contract %callback + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id))))) + (list %requests (pair (address %owner) (nat %token_id)))) ; + SWAP ; + IF_NONE + { DIG 2 ; DROP 2 ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DIG 2 ; DROP 2 ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; + NIL (pair address nat) ; + DIG 5 ; + CAR ; + CAR ; + DUP 7 ; + PAIR ; + CONS ; + DIG 3 ; + PAIR ; + TRANSFER_TOKENS } } } + { DIG 2 ; DROP 2 ; PUSH nat 108 ; FAILWITH } } ; + CONS } ; + SWAP ; + DROP ; + NIL operation ; + SWAP ; + ITER { CONS } ; + SWAP ; + NIL operation ; + SWAP ; + ITER { CONS } ; + ITER { CONS } ; + NIL operation ; + SWAP ; + ITER { CONS } ; + PAIR } } + { DROP ; + PUSH mutez 1 ; + AMOUNT ; + COMPARE ; + LT ; + IF {} { PUSH nat 118 ; FAILWITH } ; + SENDER ; DUP 2 ; CDR ; - MUL ; - DIG 2 ; CDR ; - DIG 2 ; - CAR ; - MUL ; - PAIR ; - EMPTY_MAP string (pair (pair nat string (option address) nat (option string)) nat) ; - DUP 6 ; CDR ; - CAR ; + DUP ; CAR ; DUP 3 ; - PAIR 3 ; - DUP 7 ; - SWAP ; - EXEC ; - UNPAIR ; - SWAP ; - EMPTY_MAP string (pair (pair nat string (option address) nat (option string)) nat) ; - DIG 3 ; - PAIR ; - PAIR ; - DUP 6 ; - CAR ; - CDR ; - CAR ; - ITER { CDR ; - SWAP ; - UNPAIR ; - UNPAIR ; - DIG 2 ; - DIG 3 ; - DUP 3 ; - PAIR 3 ; - DUP 9 ; - SWAP ; - EXEC ; - UNPAIR ; - DIG 3 ; - SWAP ; - PAIR ; - DUP 10 ; - SWAP ; - EXEC ; - DIG 2 ; - PAIR ; - PAIR } ; - DIG 6 ; - DIG 7 ; - DROP 2 ; - UNPAIR ; - CDR ; - DUP 7 ; - CDR ; - CDR ; - CAR ; - DUP 5 ; - COMPARE ; - GT ; - IF { SWAP ; DIG 2 ; DIG 3 ; DIG 6 ; DROP 5 ; PUSH nat 154 ; FAILWITH } - { DIG 3 ; - DUP 7 ; - CDR ; - CDR ; - CAR ; - SUB ; - ABS ; - DIG 2 ; - DUP 7 ; - DIG 7 ; - CDR ; - DUP ; - CAR ; - DIG 6 ; - UPDATE 1 ; - UPDATE 1 ; - UPDATE 2 ; - DUP ; - CAR ; - DUP ; - CDR ; - DIG 5 ; - UPDATE 1 ; - UPDATE 2 ; - UPDATE 1 ; - DUP ; - CDR ; - DUP ; - CDR ; - DIG 4 ; - UPDATE 1 ; - UPDATE 2 ; - UPDATE 2 ; - PAIR } ; - UNPAIR ; - DUP 4 ; - CONTRACT unit ; - IF_NONE { PUSH nat 102 ; FAILWITH } { DUP 4 ; UNIT ; TRANSFER_TOKENS } ; - SELF_ADDRESS ; - NIL operation ; - DIG 4 ; - ITER { CDR ; - DUP ; - CAR ; - GET 5 ; - IF_NONE - { DROP ; PUSH nat 109 ; FAILWITH } - { DUP 2 ; + MEM ; + IF { CDR ; + DUP 2 ; + GET ; + IF_NONE { NONE (pair (pair address nat) mutez) } { SOME } } + { DROP ; NONE (pair (pair address nat) mutez) } ; + IF_NONE + { DROP 4 ; PUSH nat 151 ; FAILWITH } + { UNPAIR ; + CDR ; + DUP 4 ; + CDR ; + CDR ; + CAR ; + INT ; + PUSH int 1 ; + SWAP ; + PAIR ; + DUP 2 ; + INT ; + PUSH int 1 ; + SWAP ; + PAIR ; + DUP 2 ; + CAR ; + DUP 2 ; + CDR ; + MUL ; + DIG 2 ; + CDR ; + DIG 2 ; + CAR ; + MUL ; + PAIR ; + DUP 5 ; + CDR ; + CAR ; + CAR ; + DUP ; + CDR ; + INT ; + PUSH int 1 ; + SWAP ; + PAIR ; + DUP ; + CDR ; + DUP 4 ; + CDR ; + MUL ; + SWAP ; + CAR ; + DUP 4 ; + CAR ; + MUL ; + PAIR ; + PUSH int 0 ; + DUP 2 ; + CAR ; + COMPARE ; + LT ; + IF { PUSH int -1 ; DUP 2 ; CDR ; MUL ; PUSH int -1 ; DIG 2 ; CAR ; MUL ; PAIR } + {} ; + DUP ; + CDR ; + PUSH nat 1 ; + PUSH nat 0 ; + PUSH nat 10 ; + PAIR ; + PAIR ; + LEFT nat ; + LOOP_LEFT + { UNPAIR ; + UNPAIR ; + PUSH nat 0 ; + DUP 3 ; + COMPARE ; + EQ ; + IF { DROP 2 ; RIGHT (pair (pair nat nat) nat) } + { PUSH nat 1 ; + PUSH nat 1 ; + DUP 4 ; + AND ; + COMPARE ; + EQ ; + IF { DUP ; DIG 3 ; MUL } { DIG 2 } ; + PUSH nat 1 ; + DIG 3 ; + LSR ; + DUP 3 ; + DIG 3 ; + MUL ; + PAIR ; + PAIR ; + LEFT nat } } ; + DIG 2 ; + CAR ; + MUL ; + EDIV ; + IF_NONE { PUSH string "DIV by 0" ; FAILWITH } {} ; + CAR ; + ISNAT ; + IF_NONE { PUSH nat 119 ; FAILWITH } {} ; + DUP 2 ; + CDR ; + DUP 2 ; + COMPARE ; + GT ; + IF { DROP 2 ; PUSH nat 153 ; FAILWITH } + { DUP ; + DUP 3 ; + CDR ; + INT ; + SUB ; + ABS ; + DUP 3 ; + DIG 2 ; + UPDATE 2 ; + PUSH nat 0 ; + DUP 2 ; + CDR ; + COMPARE ; + EQ ; + IF { DROP ; DUP 9 } { DUP 10 ; SWAP ; PAIR ; DUP 9 ; SWAP ; EXEC } ; + DUG 2 ; + UPDATE 2 ; + PAIR } ; + UNPAIR ; + SWAP ; + DIG 8 ; + DIG 3 ; + PAIR ; + PAIR ; + DUP 6 ; + CAR ; + CDR ; + CAR ; + ITER { CDR ; + SWAP ; + UNPAIR ; + UNPAIR ; + DUP 4 ; + CDR ; + INT ; + PUSH int 1 ; + SWAP ; + PAIR ; + DUP ; + CDR ; + DUP 3 ; + CDR ; + MUL ; + SWAP ; CAR ; - GET 8 ; - IF_NONE - { DROP 2 ; PUSH nat 108 ; FAILWITH } - { PUSH string "FA1.2 token" ; - DUP 2 ; + DUP 3 ; + CAR ; + MUL ; + PAIR ; + PUSH int 0 ; + DUP 2 ; + CAR ; + COMPARE ; + LT ; + IF { PUSH int -1 ; DUP 2 ; CDR ; MUL ; PUSH int -1 ; DIG 2 ; CAR ; MUL ; PAIR } + {} ; + DUP ; + CDR ; + PUSH nat 1 ; + PUSH nat 0 ; + PUSH nat 10 ; + PAIR ; + PAIR ; + LEFT nat ; + LOOP_LEFT + { UNPAIR ; + UNPAIR ; + PUSH nat 0 ; + DUP 3 ; COMPARE ; EQ ; - IF { DROP ; - CONTRACT %transfer (pair (address %from) (address %to) (nat %value)) ; - IF_NONE { PUSH nat 101 ; FAILWITH } {} ; - PUSH mutez 0 ; - DIG 2 ; - CDR ; - DUP 9 ; - DUP 6 ; - PAIR 3 ; - TRANSFER_TOKENS } - { PUSH string "FA2 token" ; - SWAP ; + IF { DROP 2 ; RIGHT (pair (pair nat nat) nat) } + { PUSH nat 1 ; + PUSH nat 1 ; + DUP 4 ; + AND ; COMPARE ; EQ ; - IF { CONTRACT %transfer - (list (pair (address %from_) (list %tx (pair (address %to_) (nat %token_id) (nat %amount))))) ; - IF_NONE { PUSH nat 101 ; FAILWITH } {} ; - PUSH mutez 0 ; - NIL (pair address (list (pair address nat nat))) ; - NIL (pair address nat nat) ; - DUP 5 ; - CDR ; - DIG 5 ; - CAR ; - CAR ; - DUP 12 ; - PAIR 3 ; - CONS ; - DUP 6 ; - PAIR ; - CONS ; - TRANSFER_TOKENS } - { DROP 2 ; PUSH nat 108 ; FAILWITH } } } } ; - CONS } ; - SWAP ; - DROP ; - DUP 3 ; - DUP 4 ; - CDR ; - DUP ; - CDR ; - DIG 5 ; - CDR ; - CDR ; - CDR ; - DUP ; - CAR ; - DUP 9 ; - MEM ; - IF { DUP ; - CDR ; - DIG 8 ; - NONE (pair (pair address nat) mutez) ; - SWAP ; - UPDATE ; - UPDATE 2 } - { DIG 7 ; DROP } ; - UPDATE 2 ; - UPDATE 2 ; - UPDATE 2 ; - PUSH mutez 0 ; - DIG 4 ; - COMPARE ; - GT ; - IF { SWAP ; DIG 2 ; CONS } { DIG 2 ; DROP ; SWAP } ; - PAIR } } } ; + IF { DUP ; DIG 3 ; MUL } { DIG 2 } ; + PUSH nat 1 ; + DIG 3 ; + LSR ; + DUP 3 ; + DIG 3 ; + MUL ; + PAIR ; + PAIR ; + LEFT nat } } ; + DIG 2 ; + CAR ; + MUL ; + EDIV ; + IF_NONE { PUSH string "DIV by 0" ; FAILWITH } {} ; + CAR ; + ISNAT ; + IF_NONE { PUSH nat 119 ; FAILWITH } {} ; + DUP 5 ; + CDR ; + DUP 2 ; + COMPARE ; + GT ; + IF { DIG 3 ; DIG 4 ; DROP 3 ; PUSH nat 153 ; FAILWITH } + { DUP ; + DUP 6 ; + CDR ; + INT ; + SUB ; + ABS ; + DUP 6 ; + DIG 2 ; + UPDATE 2 ; + PUSH nat 0 ; + DUP 2 ; + CDR ; + COMPARE ; + EQ ; + IF { DROP ; DIG 3 } { DIG 4 ; SWAP ; PAIR ; DUP 11 ; SWAP ; EXEC } ; + DIG 4 ; + DIG 2 ; + UPDATE 2 ; + PAIR } ; + UNPAIR ; + DIG 3 ; + SWAP ; + PAIR ; + DUP 9 ; + SWAP ; + EXEC ; + DIG 2 ; + PAIR ; + PAIR } ; + DIG 6 ; + DROP ; + UNPAIR ; + CDR ; + DUP 7 ; + CDR ; + CDR ; + CAR ; + DUP 5 ; + COMPARE ; + GT ; + IF { SWAP ; DIG 2 ; DIG 3 ; DIG 6 ; DROP 5 ; PUSH nat 154 ; FAILWITH } + { DIG 3 ; + DUP 7 ; + CDR ; + CDR ; + CAR ; + SUB ; + ABS ; + DIG 2 ; + DUP 7 ; + DIG 7 ; + CDR ; + DUP ; + CAR ; + DIG 6 ; + UPDATE 1 ; + UPDATE 1 ; + UPDATE 2 ; + DUP ; + CAR ; + DUP ; + CDR ; + DIG 5 ; + UPDATE 1 ; + UPDATE 2 ; + UPDATE 1 ; + DUP ; + CDR ; + DUP ; + CDR ; + DIG 4 ; + UPDATE 1 ; + UPDATE 2 ; + UPDATE 2 ; + PAIR } ; + UNPAIR ; + DUP 4 ; + CONTRACT unit ; + IF_NONE { PUSH nat 102 ; FAILWITH } { DUP 4 ; UNIT ; TRANSFER_TOKENS } ; + SELF_ADDRESS ; + NIL operation ; + DIG 4 ; + ITER { CDR ; + DUP ; + CAR ; + GET 5 ; + IF_NONE + { DROP ; PUSH nat 109 ; FAILWITH } + { DUP 2 ; + CAR ; + GET 8 ; + IF_NONE + { DROP 2 ; PUSH nat 108 ; FAILWITH } + { PUSH string "FA1.2 token" ; + DUP 2 ; + COMPARE ; + EQ ; + IF { DROP ; + CONTRACT %transfer (pair (address %from) (address %to) (nat %value)) ; + IF_NONE { PUSH nat 101 ; FAILWITH } {} ; + PUSH mutez 0 ; + DIG 2 ; + CDR ; + DUP 9 ; + DUP 6 ; + PAIR 3 ; + TRANSFER_TOKENS } + { PUSH string "FA2 token" ; + SWAP ; + COMPARE ; + EQ ; + IF { CONTRACT %transfer + (list (pair (address %from_) (list %tx (pair (address %to_) (nat %token_id) (nat %amount))))) ; + IF_NONE { PUSH nat 101 ; FAILWITH } {} ; + PUSH mutez 0 ; + NIL (pair address (list (pair address nat nat))) ; + NIL (pair address nat nat) ; + DUP 5 ; + CDR ; + DIG 5 ; + CAR ; + CAR ; + DUP 12 ; + PAIR 3 ; + CONS ; + DUP 6 ; + PAIR ; + CONS ; + TRANSFER_TOKENS } + { DROP 2 ; PUSH nat 108 ; FAILWITH } } } } ; + CONS } ; + SWAP ; + DROP ; + DUP 3 ; + CDR ; + CDR ; + CDR ; + SELF_ADDRESS ; + DUP 5 ; + CDR ; + CAR ; + CAR ; + CAR ; + DUP ; + GET 5 ; + IF_NONE { PUSH nat 101 ; FAILWITH } {} ; + DUP 2 ; + GET 8 ; + IF_NONE { PUSH nat 108 ; FAILWITH } {} ; + PUSH string "FA2 standard" ; + DUP 2 ; + COMPARE ; + EQ ; + IF { DIG 2 ; + DROP 2 ; + DUP 2 ; + CONTRACT %balance_response_fa12 nat ; + SWAP ; + CONTRACT %getbalance (pair (contract %callback nat) (address %owner)) ; + SWAP ; + IF_NONE + { DROP ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DROP ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; DUP 4 ; DIG 3 ; PAIR ; TRANSFER_TOKENS } } } + { PUSH string "FA1.2 standard" ; + SWAP ; + COMPARE ; + EQ ; + IF { DUP 3 ; + CONTRACT %balance_response_fa2 + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id)))) ; + SWAP ; + CONTRACT %balance_of + (pair (contract %callback + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id))))) + (list %requests (pair (address %owner) (nat %token_id)))) ; + SWAP ; + IF_NONE + { DROP 2 ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DROP 2 ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; + NIL (pair address nat) ; + DIG 4 ; + CAR ; + DUP 6 ; + PAIR ; + CONS ; + DIG 3 ; + PAIR ; + TRANSFER_TOKENS } } } + { DROP 2 ; PUSH nat 108 ; FAILWITH } } ; + NIL operation ; + SWAP ; + CONS ; + DUP 6 ; + CAR ; + CDR ; + CAR ; + ITER { CDR ; + SWAP ; + DUP 2 ; + CAR ; + GET 5 ; + IF_NONE { PUSH nat 101 ; FAILWITH } {} ; + DUP 3 ; + CAR ; + GET 8 ; + IF_NONE { PUSH nat 108 ; FAILWITH } {} ; + PUSH string "FA2 standard" ; + DUP 2 ; + COMPARE ; + EQ ; + IF { DIG 3 ; + DROP 2 ; + DUP 3 ; + CONTRACT %balance_response_fa12 nat ; + SWAP ; + CONTRACT %getbalance (pair (contract %callback nat) (address %owner)) ; + SWAP ; + IF_NONE + { DROP ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DROP ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; DUP 5 ; DIG 3 ; PAIR ; TRANSFER_TOKENS } } } + { PUSH string "FA1.2 standard" ; + SWAP ; + COMPARE ; + EQ ; + IF { DUP 4 ; + CONTRACT %balance_response_fa2 + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id)))) ; + SWAP ; + CONTRACT %balance_of + (pair (contract %callback + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id))))) + (list %requests (pair (address %owner) (nat %token_id)))) ; + SWAP ; + IF_NONE + { DIG 2 ; DROP 2 ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DIG 2 ; DROP 2 ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; + NIL (pair address nat) ; + DIG 5 ; + CAR ; + CAR ; + DUP 7 ; + PAIR ; + CONS ; + DIG 3 ; + PAIR ; + TRANSFER_TOKENS } } } + { DIG 2 ; DROP 2 ; PUSH nat 108 ; FAILWITH } } ; + CONS } ; + SWAP ; + DROP ; + NIL operation ; + SWAP ; + ITER { CONS } ; + PUSH mutez 0 ; + DIG 6 ; + COMPARE ; + GT ; + IF { DIG 2 ; DIG 3 ; CONS } { DIG 3 ; DROP ; DIG 2 } ; + NIL operation ; + SWAP ; + ITER { CONS } ; + ITER { CONS } ; + NIL operation ; + SWAP ; + ITER { CONS } ; + DUP 3 ; + DIG 3 ; + CDR ; + DUP ; + CDR ; + DUP 5 ; + CAR ; + DUP 7 ; + MEM ; + IF { DUP 5 ; + DIG 5 ; + CDR ; + DIG 6 ; + NONE (pair (pair address nat) mutez) ; + SWAP ; + UPDATE ; + UPDATE 2 } + { DIG 5 ; DROP ; DIG 4 } ; + UPDATE 2 ; + UPDATE 2 ; + UPDATE 2 ; + SWAP ; + PAIR } } } } ; view "get_native_token_of_vault" unit (pair (nat %token_id) @@ -1114,23 +1750,5 @@ (option %address address) (nat %decimals) (option %standard string)) - { CDR ; CDR ; CAR ; CAR ; CAR } ; - view "get_vault_balances" - unit - (pair (pair (pair %token - (nat %token_id) - (string %name) - (option %address address) - (nat %decimals) - (option %standard string)) - (nat %amount)) - (map string - (pair (pair %token - (nat %token_id) - (string %name) - (option %address address) - (nat %decimals) - (option %standard string)) - (nat %amount)))) - { CDR ; DUP ; CAR ; CDR ; CAR ; SWAP ; CDR ; CAR ; CAR ; PAIR } } + { CDR ; CDR ; CAR ; CAR ; CAR } } diff --git a/batcher/michelson/usdt-vault-ghostnet.tz b/batcher/michelson/usdt-vault-ghostnet.tz index 67557279..488c5eaf 100644 --- a/batcher/michelson/usdt-vault-ghostnet.tz +++ b/batcher/michelson/usdt-vault-ghostnet.tz @@ -1,24 +1,28 @@ { parameter (or (or (or (or (nat %addLiquidity) (mutez %addReward)) - (or (address %change_admin_address) (address %change_batcher_address))) - (or (or (address %change_marketmaker_address) (address %change_tokenmanager_address)) - (or (unit %claim) - (pair %injectLiquidity - (pair (nat %amount) - (pair %from_token - (nat %token_id) - (string %name) - (option %address address) - (nat %decimals) - (option %standard string))) - (or %side (unit %buy) (unit %sell)) - (pair %to_token - (nat %token_id) - (string %name) - (option %address address) - (nat %decimals) - (option %standard string)))))) - (unit %removeLiquidity)) ; + (or (nat %balance_response_fa12) + (pair %balance_response_fa2 + (nat %balance) + (pair %request (address %owner) (nat %token_id))))) + (or (or (address %change_admin_address) (address %change_batcher_address)) + (or (address %change_marketmaker_address) (address %change_tokenmanager_address)))) + (or (or (unit %claim) + (pair %injectLiquidity + (pair (nat %amount) + (pair %from_token + (nat %token_id) + (string %name) + (option %address address) + (nat %decimals) + (option %standard string))) + (or %side (unit %buy) (unit %sell)) + (pair %to_token + (nat %token_id) + (string %name) + (option %address address) + (nat %decimals) + (option %standard string)))) + (unit %removeLiquidity))) ; storage (pair (pair (pair (address %administrator) (address %batcher)) (map %foreign_tokens @@ -47,6 +51,11 @@ address (pair (pair (address %holder) (nat %shares)) (mutez %unclaimed))))) ; code { LAMBDA + (pair (option address) nat) + address + { UNPAIR ; IF_NONE { FAILWITH } { SWAP ; DROP } } ; + EMPTY_MAP string (pair (pair nat string (option address) nat (option string)) nat) ; + LAMBDA (pair (pair (pair nat string (option address) nat (option string)) nat) (map string (pair (pair nat string (option address) nat (option string)) nat))) (map string (pair (pair nat string (option address) nat (option string)) nat)) @@ -82,111 +91,7 @@ SOME ; DIG 2 ; UPDATE } } ; - LAMBDA - (pair (lambda - (pair (pair (pair nat string (option address) nat (option string)) nat) - (map string (pair (pair nat string (option address) nat (option string)) nat))) - (map string (pair (pair nat string (option address) nat (option string)) nat))) - (pair (pair int int) - (pair (pair nat string (option address) nat (option string)) nat) - (map string (pair (pair nat string (option address) nat (option string)) nat)))) - (pair (pair (pair nat string (option address) nat (option string)) nat) - (map string (pair (pair nat string (option address) nat (option string)) nat))) - { UNPAIR ; - SWAP ; - UNPAIR 3 ; - DUP 2 ; - CDR ; - INT ; - PUSH int 1 ; - SWAP ; - PAIR ; - DUP ; - CDR ; - DUP 3 ; - CDR ; - MUL ; - SWAP ; - CAR ; - DIG 2 ; - CAR ; - MUL ; - PAIR ; - PUSH int 0 ; - DUP 2 ; - CAR ; - COMPARE ; - LT ; - IF { PUSH int -1 ; DUP 2 ; CDR ; MUL ; PUSH int -1 ; DIG 2 ; CAR ; MUL ; PAIR } - {} ; - DUP ; - CDR ; - PUSH nat 1 ; - PUSH nat 0 ; - PUSH nat 10 ; - PAIR ; - PAIR ; - LEFT nat ; - LOOP_LEFT - { UNPAIR ; - UNPAIR ; - PUSH nat 0 ; - DUP 3 ; - COMPARE ; - EQ ; - IF { DROP 2 ; RIGHT (pair (pair nat nat) nat) } - { PUSH nat 1 ; - PUSH nat 1 ; - DUP 4 ; - AND ; - COMPARE ; - EQ ; - IF { DUP ; DIG 3 ; MUL } { DIG 2 } ; - PUSH nat 1 ; - DIG 3 ; - LSR ; - DUP 3 ; - DIG 3 ; - MUL ; - PAIR ; - PAIR ; - LEFT nat } } ; - DIG 2 ; - CAR ; - MUL ; - EDIV ; - IF_NONE { PUSH string "DIV by 0" ; FAILWITH } {} ; - CAR ; - ISNAT ; - IF_NONE { PUSH nat 119 ; FAILWITH } {} ; - DUP 2 ; - CDR ; - DUP 2 ; - COMPARE ; - GT ; - IF { DROP 4 ; PUSH nat 153 ; FAILWITH } - { DUP ; - DUP 3 ; - CDR ; - INT ; - SUB ; - ABS ; - DUP 3 ; - DIG 2 ; - UPDATE 2 ; - PUSH nat 0 ; - DUP 2 ; - CDR ; - COMPARE ; - EQ ; - IF { DIG 4 ; DROP 2 ; DIG 2 } - { DIG 3 ; SWAP ; PAIR ; DIG 3 ; SWAP ; EXEC } ; - DUG 2 ; - UPDATE 2 ; - PAIR } } ; - DUP 2 ; - APPLY ; - DIG 2 ; + DIG 3 ; UNPAIR ; IF_LEFT { DIG 2 ; @@ -194,7 +99,9 @@ DROP 2 ; IF_LEFT { IF_LEFT - { IF_LEFT + { DIG 2 ; + DROP ; + IF_LEFT { PUSH mutez 1 ; AMOUNT ; COMPARE ; @@ -255,13 +162,138 @@ CONS ; TRANSFER_TOKENS } { DROP 2 ; PUSH nat 108 ; FAILWITH } } } } ; - DUP 4 ; + SELF_ADDRESS ; + DUP 5 ; CDR ; CAR ; CAR ; + CAR ; DUP ; + GET 5 ; + IF_NONE { PUSH nat 101 ; FAILWITH } {} ; + DUP 2 ; + GET 8 ; + IF_NONE { PUSH nat 108 ; FAILWITH } {} ; + PUSH string "FA2 standard" ; + DUP 2 ; + COMPARE ; + EQ ; + IF { DIG 2 ; + DROP 2 ; + DUP 2 ; + CONTRACT %balance_response_fa12 nat ; + SWAP ; + CONTRACT %getbalance (pair (contract %callback nat) (address %owner)) ; + SWAP ; + IF_NONE + { DROP ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DROP ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; DUP 4 ; DIG 3 ; PAIR ; TRANSFER_TOKENS } } } + { PUSH string "FA1.2 standard" ; + SWAP ; + COMPARE ; + EQ ; + IF { DUP 3 ; + CONTRACT %balance_response_fa2 + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id)))) ; + SWAP ; + CONTRACT %balance_of + (pair (contract %callback + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id))))) + (list %requests (pair (address %owner) (nat %token_id)))) ; + SWAP ; + IF_NONE + { DROP 2 ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DROP 2 ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; + NIL (pair address nat) ; + DIG 4 ; + CAR ; + DUP 6 ; + PAIR ; + CONS ; + DIG 3 ; + PAIR ; + TRANSFER_TOKENS } } } + { DROP 2 ; PUSH nat 108 ; FAILWITH } } ; + NIL operation ; + SWAP ; + CONS ; + DUP 6 ; CAR ; - DUP 4 ; + CDR ; + CAR ; + ITER { CDR ; + SWAP ; + DUP 2 ; + CAR ; + GET 5 ; + IF_NONE { PUSH nat 101 ; FAILWITH } {} ; + DUP 3 ; + CAR ; + GET 8 ; + IF_NONE { PUSH nat 108 ; FAILWITH } {} ; + PUSH string "FA2 standard" ; + DUP 2 ; + COMPARE ; + EQ ; + IF { DIG 3 ; + DROP 2 ; + DUP 3 ; + CONTRACT %balance_response_fa12 nat ; + SWAP ; + CONTRACT %getbalance (pair (contract %callback nat) (address %owner)) ; + SWAP ; + IF_NONE + { DROP ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DROP ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; DUP 5 ; DIG 3 ; PAIR ; TRANSFER_TOKENS } } } + { PUSH string "FA1.2 standard" ; + SWAP ; + COMPARE ; + EQ ; + IF { DUP 4 ; + CONTRACT %balance_response_fa2 + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id)))) ; + SWAP ; + CONTRACT %balance_of + (pair (contract %callback + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id))))) + (list %requests (pair (address %owner) (nat %token_id)))) ; + SWAP ; + IF_NONE + { DIG 2 ; DROP 2 ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DIG 2 ; DROP 2 ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; + NIL (pair address nat) ; + DIG 5 ; + CAR ; + CAR ; + DUP 7 ; + PAIR ; + CONS ; + DIG 3 ; + PAIR ; + TRANSFER_TOKENS } } } + { DIG 2 ; DROP 2 ; PUSH nat 108 ; FAILWITH } } ; + CONS } ; + SWAP ; + DROP ; + DUP 5 ; + CDR ; + CAR ; + CAR ; + DUP ; + CAR ; + DUP 5 ; CAR ; DUP 2 ; GET 8 ; @@ -298,37 +330,37 @@ AND ; AND ; NOT ; - IF { DIG 2 ; DIG 3 ; DIG 4 ; DROP 4 ; PUSH nat 115 ; FAILWITH } - { DUP 3 ; + IF { DIG 3 ; DIG 4 ; DIG 5 ; DROP 4 ; PUSH nat 115 ; FAILWITH } + { DUP 4 ; CDR ; - DUP 6 ; + DUP 7 ; CDR ; CDR ; CAR ; ADD ; DUP 2 ; - DUP 5 ; + DUP 6 ; CDR ; DIG 3 ; CDR ; ADD ; UPDATE 2 ; - DUP 6 ; + DUP 7 ; CDR ; CDR ; CDR ; DUP ; CAR ; - DUP 7 ; + DUP 8 ; MEM ; IF { CDR ; - DUP 6 ; + DUP 7 ; GET ; IF_NONE { NONE (pair (pair address nat) mutez) } { SOME } } { DROP ; NONE (pair (pair address nat) mutez) } ; IF_NONE - { PUSH mutez 0 ; DIG 4 ; CDR ; DUP 6 ; PAIR ; PAIR } - { DIG 4 ; + { PUSH mutez 0 ; DIG 5 ; CDR ; DUP 7 ; PAIR ; PAIR } + { DIG 5 ; CDR ; DUP 2 ; CAR ; @@ -340,8 +372,8 @@ DIG 2 ; UPDATE 2 ; UPDATE 1 } ; - DUP 6 ; DUP 7 ; + DUP 8 ; CDR ; DUP ; CDR ; @@ -353,19 +385,19 @@ CDR ; DUP ; CDR ; - DIG 7 ; + DIG 8 ; CDR ; CDR ; CDR ; DUP ; CAR ; - DUP 9 ; + DUP 10 ; MEM ; - IF { DUP ; CDR ; DIG 5 ; SOME ; DIG 8 ; UPDATE ; UPDATE 2 } + IF { DUP ; CDR ; DIG 5 ; SOME ; DIG 9 ; UPDATE ; UPDATE 2 } { DUP ; DUP 2 ; CAR ; - DUP 10 ; + DUP 11 ; PUSH bool True ; SWAP ; UPDATE ; @@ -373,7 +405,7 @@ SWAP ; CDR ; DIG 5 ; - DIG 8 ; + DIG 9 ; SWAP ; SOME ; SWAP ; @@ -390,7 +422,7 @@ UPDATE 1 ; UPDATE 1 ; UPDATE 2 } ; - NIL operation ; + SWAP ; DIG 2 ; CONS } { DUP 2 ; @@ -551,6 +583,171 @@ UPDATE 2 ; UPDATE 2 ; NIL operation } } + { IF_LEFT + { SENDER ; + DUP 3 ; + CDR ; + CAR ; + CAR ; + CAR ; + GET 5 ; + IF_NONE { PUSH nat 101 ; FAILWITH } {} ; + PUSH nat 0 ; + DUP 5 ; + CDR ; + CAR ; + CAR ; + CAR ; + CAR ; + COMPARE ; + EQ ; + DUP 3 ; + DIG 2 ; + COMPARE ; + EQ ; + AND ; + IF { DUP 3 ; + DUP 4 ; + CDR ; + DUP ; + CAR ; + DIG 5 ; + CDR ; + CAR ; + CAR ; + DUP 6 ; + UPDATE 2 ; + UPDATE 1 ; + UPDATE 1 ; + UPDATE 2 } + { DIG 2 } ; + DUP ; + CAR ; + CDR ; + CAR ; + DUP ; + ITER { CDR ; + PUSH nat 101 ; + DUP 2 ; + CAR ; + GET 5 ; + PAIR ; + DUP 7 ; + SWAP ; + EXEC ; + PUSH nat 0 ; + DUP 3 ; + CAR ; + CAR ; + COMPARE ; + EQ ; + DUP 6 ; + DIG 2 ; + COMPARE ; + EQ ; + AND ; + IF { DUP 5 ; UPDATE 2 ; SWAP ; DUP 2 ; SOME ; DIG 2 ; CAR ; GET 3 ; UPDATE } + { DROP } } ; + DIG 2 ; + DIG 3 ; + DIG 4 ; + DROP 3 ; + DUP 2 ; + DIG 2 ; + CAR ; + DUP ; + CDR ; + DIG 3 ; + UPDATE 1 ; + UPDATE 2 ; + UPDATE 1 } + { SENDER ; + DUP 2 ; + CAR ; + DIG 2 ; + CDR ; + CDR ; + DUP 4 ; + CDR ; + CAR ; + CAR ; + CAR ; + GET 5 ; + IF_NONE { PUSH nat 101 ; FAILWITH } {} ; + DUP 2 ; + DUP 6 ; + CDR ; + CAR ; + CAR ; + CAR ; + CAR ; + COMPARE ; + EQ ; + DUP 5 ; + DIG 2 ; + COMPARE ; + EQ ; + AND ; + IF { DUP 4 ; + DUP 5 ; + CDR ; + DUP ; + CAR ; + DIG 6 ; + CDR ; + CAR ; + CAR ; + DUP 6 ; + UPDATE 2 ; + UPDATE 1 ; + UPDATE 1 ; + UPDATE 2 } + { DIG 3 } ; + DUP ; + CAR ; + CDR ; + CAR ; + DUP ; + ITER { CDR ; + PUSH nat 101 ; + DUP 2 ; + CAR ; + GET 5 ; + PAIR ; + DUP 8 ; + SWAP ; + EXEC ; + DUP 5 ; + DUP 3 ; + CAR ; + CAR ; + COMPARE ; + EQ ; + DUP 8 ; + DIG 2 ; + COMPARE ; + EQ ; + AND ; + IF { DUP 5 ; UPDATE 2 ; SWAP ; DUP 2 ; SOME ; DIG 2 ; CAR ; GET 3 ; UPDATE } + { DROP } } ; + DIG 2 ; + DIG 3 ; + DIG 4 ; + DIG 5 ; + DROP 4 ; + DUP 2 ; + DIG 2 ; + CAR ; + DUP ; + CDR ; + DIG 3 ; + UPDATE 1 ; + UPDATE 2 ; + UPDATE 1 } ; + NIL operation } } + { DIG 2 ; + DROP ; + IF_LEFT { IF_LEFT { DUP 2 ; CAR ; @@ -595,10 +792,7 @@ DIG 3 ; UPDATE 2 ; UPDATE 1 ; - UPDATE 1 } ; - NIL operation } ; - PAIR } - { IF_LEFT + UPDATE 1 } } { IF_LEFT { DUP 2 ; CAR ; @@ -643,470 +837,912 @@ DIG 3 ; UPDATE 2 ; UPDATE 1 ; - UPDATE 2 } ; - NIL operation ; - PAIR } - { IF_LEFT - { DROP ; - PUSH mutez 1 ; - AMOUNT ; - COMPARE ; - LT ; - IF {} { PUSH nat 118 ; FAILWITH } ; - SENDER ; - DUP 2 ; - CDR ; - CDR ; + UPDATE 2 } } ; + NIL operation } ; + PAIR } + { DIG 4 ; + DROP ; + IF_LEFT + { DIG 2 ; + DIG 3 ; + DROP 2 ; + IF_LEFT + { DROP ; + PUSH mutez 1 ; + AMOUNT ; + COMPARE ; + LT ; + IF {} { PUSH nat 118 ; FAILWITH } ; + SENDER ; + DUP 2 ; + CDR ; + CDR ; + CDR ; + DUP ; + CAR ; + DUP 3 ; + MEM ; + IF { CDR ; + SWAP ; + GET ; + IF_NONE { NONE (pair (pair address nat) mutez) } { SOME } } + { DROP 2 ; NONE (pair (pair address nat) mutez) } ; + IF_NONE + { DROP ; PUSH nat 155 ; FAILWITH } + { DUP ; CDR ; - DUP ; - CAR ; - DUP 3 ; - MEM ; - IF { CDR ; - SWAP ; - GET ; - IF_NONE { NONE (pair (pair address nat) mutez) } { SOME } } - { DROP 2 ; NONE (pair (pair address nat) mutez) } ; - IF_NONE - { DROP ; PUSH nat 155 ; FAILWITH } - { DUP ; - CDR ; - PUSH mutez 0 ; - DUP 2 ; - COMPARE ; - EQ ; - IF { DROP 3 ; PUSH nat 155 ; FAILWITH } - { SWAP ; - PUSH mutez 0 ; - UPDATE 2 ; - DUP ; - CAR ; - CAR ; - CONTRACT unit ; - IF_NONE - { SWAP ; DROP ; PUSH nat 102 ; FAILWITH } - { DIG 2 ; UNIT ; TRANSFER_TOKENS } ; - DUP 3 ; - DUP 4 ; - CDR ; - DUP ; - CDR ; - DIG 5 ; - CDR ; - CDR ; - CDR ; - DUP 6 ; - CAR ; - CAR ; - DUP 2 ; - CAR ; - DUP 2 ; - MEM ; - IF { DUP 2 ; DIG 2 ; CDR ; DIG 7 ; SOME ; DIG 3 ; UPDATE ; UPDATE 2 } - { DUP 2 ; - DUP 3 ; - CAR ; - DUP 3 ; - PUSH bool True ; - SWAP ; - UPDATE ; - UPDATE 1 ; - DIG 2 ; - CDR ; - DIG 7 ; - DIG 3 ; - SWAP ; - SOME ; - SWAP ; - UPDATE ; - UPDATE 2 } ; - UPDATE 2 ; - UPDATE 2 ; - UPDATE 2 ; - NIL operation ; - DIG 2 ; - CONS ; - PAIR } } } - { DUP 2 ; - CAR ; - CDR ; - CDR ; - SENDER ; + PUSH mutez 0 ; + DUP 2 ; COMPARE ; EQ ; - IF {} { PUSH nat 168 ; FAILWITH } ; - PUSH mutez 1 ; - AMOUNT ; - COMPARE ; - LT ; - IF {} { PUSH nat 118 ; FAILWITH } ; - UNIT ; - LEFT unit ; - LEFT unit ; - IF_LEFT - { IF_LEFT { DROP ; PUSH nat 1 } { DROP ; PUSH nat 0 } } - { DROP ; PUSH nat 2 } ; - DUP 2 ; - CDR ; - CAR ; - IF_LEFT { DROP ; PUSH nat 0 } { DROP ; PUSH nat 1 } ; - NOW ; - DUP 4 ; - CDR ; - CDR ; - DUP 5 ; - CAR ; - CAR ; - DIG 5 ; + IF { DROP 3 ; PUSH nat 155 ; FAILWITH } + { SWAP ; + PUSH mutez 0 ; + UPDATE 2 ; + DUP ; + CAR ; + CAR ; + CONTRACT unit ; + IF_NONE + { SWAP ; DROP ; PUSH nat 102 ; FAILWITH } + { DIG 2 ; UNIT ; TRANSFER_TOKENS } ; + DUP 3 ; + DUP 4 ; + CDR ; + DUP ; + CDR ; + DIG 5 ; + CDR ; + CDR ; + CDR ; + DUP 6 ; + CAR ; + CAR ; + DUP 2 ; + CAR ; + DUP 2 ; + MEM ; + IF { DUP 2 ; DIG 2 ; CDR ; DIG 7 ; SOME ; DIG 3 ; UPDATE ; UPDATE 2 } + { DUP 2 ; + DUP 3 ; + CAR ; + DUP 3 ; + PUSH bool True ; + SWAP ; + UPDATE ; + UPDATE 1 ; + DIG 2 ; + CDR ; + DIG 7 ; + DIG 3 ; + SWAP ; + SOME ; + SWAP ; + UPDATE ; + UPDATE 2 } ; + UPDATE 2 ; + UPDATE 2 ; + UPDATE 2 ; + NIL operation ; + DIG 2 ; + CONS ; + PAIR } } } + { DUP 2 ; + CAR ; + CDR ; + CDR ; + SENDER ; + COMPARE ; + EQ ; + IF {} { PUSH nat 168 ; FAILWITH } ; + PUSH mutez 1 ; + AMOUNT ; + COMPARE ; + LT ; + IF {} { PUSH nat 118 ; FAILWITH } ; + UNIT ; + LEFT unit ; + LEFT unit ; + IF_LEFT + { IF_LEFT { DROP ; PUSH nat 1 } { DROP ; PUSH nat 0 } } + { DROP ; PUSH nat 2 } ; + DUP 2 ; + CDR ; + CAR ; + IF_LEFT { DROP ; PUSH nat 0 } { DROP ; PUSH nat 1 } ; + NOW ; + DUP 4 ; + CDR ; + CDR ; + DUP 5 ; + CAR ; + CAR ; + DIG 5 ; + CAR ; + CDR ; + PAIR ; + PAIR ; + PAIR 4 ; + DUP 2 ; + CAR ; + CAR ; + CDR ; + DUP 2 ; + CAR ; + CAR ; + CAR ; + GET 5 ; + IF_NONE + { DROP 2 ; PUSH nat 109 ; FAILWITH } + { DUP 3 ; CAR ; - CDR ; - PAIR ; - PAIR ; - PAIR 4 ; - DUP 2 ; CAR ; CAR ; - CDR ; - DUP 2 ; + GET 8 ; + IF_NONE + { PUSH bool False } + { PUSH string "FA1.2 token" ; SWAP ; COMPARE ; EQ } ; + IF { DUP ; + CONTRACT %approve (pair (address %spender) (nat %value)) ; + IF_NONE { PUSH nat 157 ; FAILWITH } {} ; + PUSH mutez 0 ; + DUP 5 ; + CAR ; + CAR ; + CDR ; + DUP 5 ; + PAIR ; + TRANSFER_TOKENS } + { DUP 3 ; + CAR ; + CAR ; + CAR ; + GET 8 ; + IF_NONE + { PUSH bool False } + { PUSH string "FA2 token" ; SWAP ; COMPARE ; EQ } ; + IF { SELF_ADDRESS ; + DUP 2 ; + CONTRACT %add_operator + (pair (pair (address %operator) (address %owner)) (nat %token_id)) ; + IF_NONE { PUSH nat 157 ; FAILWITH } {} ; + PUSH mutez 0 ; + DUP 6 ; + CAR ; + CAR ; + CAR ; + CAR ; + DIG 3 ; + DUP 6 ; + PAIR ; + PAIR ; + TRANSFER_TOKENS } + { PUSH nat 108 ; FAILWITH } } ; + DUP 3 ; + CONTRACT %deposit + (pair (pair %swap + (pair %from + (pair %token + (nat %token_id) + (string %name) + (option %address address) + (nat %decimals) + (option %standard string)) + (nat %amount)) + (pair %to + (nat %token_id) + (string %name) + (option %address address) + (nat %decimals) + (option %standard string))) + (timestamp %created_at) + (nat %side) + (nat %tolerance)) ; + IF_NONE { PUSH nat 157 ; FAILWITH } {} ; + PUSH mutez 0 ; + DUP 6 ; + TRANSFER_TOKENS ; + DUP 5 ; CAR ; CAR ; CAR ; - GET 5 ; + GET 8 ; IF_NONE - { DROP 2 ; PUSH nat 109 ; FAILWITH } - { DUP 3 ; - CAR ; - CAR ; - CAR ; - GET 8 ; - IF_NONE - { PUSH bool False } - { PUSH string "FA1.2 token" ; SWAP ; COMPARE ; EQ } ; - IF { DUP ; - CONTRACT %approve (pair (address %spender) (nat %value)) ; - IF_NONE { PUSH nat 157 ; FAILWITH } {} ; - PUSH mutez 0 ; - DUP 5 ; - CAR ; - CAR ; - CDR ; - DUP 5 ; - PAIR ; - TRANSFER_TOKENS } - { DUP 3 ; - CAR ; - CAR ; - CAR ; - GET 8 ; - IF_NONE - { PUSH bool False } - { PUSH string "FA2 token" ; SWAP ; COMPARE ; EQ } ; - IF { SELF_ADDRESS ; - DUP 2 ; - CONTRACT %add_operator - (pair (pair (address %operator) (address %owner)) (nat %token_id)) ; - IF_NONE { PUSH nat 157 ; FAILWITH } {} ; - PUSH mutez 0 ; - DUP 6 ; - CAR ; - CAR ; - CAR ; + { PUSH bool False } + { PUSH string "FA1.2 token" ; SWAP ; COMPARE ; EQ } ; + IF { DIG 2 ; DIG 3 ; DIG 4 ; DROP 3 ; NONE operation } + { DUP 5 ; + CAR ; + CAR ; + CAR ; + GET 8 ; + IF_NONE + { PUSH bool False } + { PUSH string "FA2 token" ; SWAP ; COMPARE ; EQ } ; + IF { SELF_ADDRESS ; + DIG 3 ; + CONTRACT %remove_operator + (pair (pair (address %operator) (address %owner)) (nat %token_id)) ; + IF_NONE { PUSH nat 157 ; FAILWITH } {} ; + PUSH mutez 0 ; + DIG 6 ; + CAR ; + CAR ; + CAR ; + CAR ; + DIG 3 ; + DIG 6 ; + PAIR ; + PAIR ; + TRANSFER_TOKENS ; + SOME } + { DIG 2 ; DIG 3 ; DIG 4 ; DROP 3 ; PUSH nat 108 ; FAILWITH } } ; + IF_NONE { NIL operation } { NIL operation ; SWAP ; CONS } ; + SWAP ; + CONS ; + SWAP ; + CONS } ; + SELF_ADDRESS ; + DUP 3 ; + CDR ; + CAR ; + CAR ; + CAR ; + DUP ; + GET 5 ; + IF_NONE { PUSH nat 101 ; FAILWITH } {} ; + DUP 2 ; + GET 8 ; + IF_NONE { PUSH nat 108 ; FAILWITH } {} ; + PUSH string "FA2 standard" ; + DUP 2 ; + COMPARE ; + EQ ; + IF { DIG 2 ; + DROP 2 ; + DUP 2 ; + CONTRACT %balance_response_fa12 nat ; + SWAP ; + CONTRACT %getbalance (pair (contract %callback nat) (address %owner)) ; + SWAP ; + IF_NONE + { DROP ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DROP ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; DUP 4 ; DIG 3 ; PAIR ; TRANSFER_TOKENS } } } + { PUSH string "FA1.2 standard" ; + SWAP ; + COMPARE ; + EQ ; + IF { DUP 3 ; + CONTRACT %balance_response_fa2 + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id)))) ; + SWAP ; + CONTRACT %balance_of + (pair (contract %callback + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id))))) + (list %requests (pair (address %owner) (nat %token_id)))) ; + SWAP ; + IF_NONE + { DROP 2 ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DROP 2 ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; + NIL (pair address nat) ; + DIG 4 ; CAR ; - DIG 3 ; DUP 6 ; PAIR ; - PAIR ; - TRANSFER_TOKENS } - { PUSH nat 108 ; FAILWITH } } ; - DUP 3 ; - CONTRACT %deposit - (pair (pair %swap - (pair %from - (pair %token - (nat %token_id) - (string %name) - (option %address address) - (nat %decimals) - (option %standard string)) - (nat %amount)) - (pair %to - (nat %token_id) - (string %name) - (option %address address) - (nat %decimals) - (option %standard string))) - (timestamp %created_at) - (nat %side) - (nat %tolerance)) ; - IF_NONE { PUSH nat 157 ; FAILWITH } {} ; - PUSH mutez 0 ; - DUP 6 ; - TRANSFER_TOKENS ; - DUP 5 ; - CAR ; - CAR ; - CAR ; - GET 8 ; - IF_NONE - { PUSH bool False } - { PUSH string "FA1.2 token" ; SWAP ; COMPARE ; EQ } ; - IF { DIG 2 ; DIG 3 ; DIG 4 ; DROP 3 ; NONE operation } - { DUP 5 ; - CAR ; - CAR ; - CAR ; - GET 8 ; - IF_NONE - { PUSH bool False } - { PUSH string "FA2 token" ; SWAP ; COMPARE ; EQ } ; - IF { SELF_ADDRESS ; - DIG 3 ; - CONTRACT %remove_operator - (pair (pair (address %operator) (address %owner)) (nat %token_id)) ; - IF_NONE { PUSH nat 157 ; FAILWITH } {} ; - PUSH mutez 0 ; - DIG 6 ; - CAR ; - CAR ; - CAR ; - CAR ; + CONS ; DIG 3 ; - DIG 6 ; PAIR ; - PAIR ; - TRANSFER_TOKENS ; - SOME } - { DIG 2 ; DIG 3 ; DIG 4 ; DROP 3 ; PUSH nat 108 ; FAILWITH } } ; - IF_NONE { NIL operation } { NIL operation ; SWAP ; CONS } ; - SWAP ; - CONS ; - SWAP ; - CONS } ; - PAIR } } } } - { DROP ; - PUSH mutez 1 ; - AMOUNT ; - COMPARE ; - LT ; - IF {} { PUSH nat 118 ; FAILWITH } ; - SENDER ; - DUP 2 ; - CDR ; - CDR ; - CDR ; - DUP ; - CAR ; - DUP 3 ; - MEM ; - IF { CDR ; - DUP 2 ; - GET ; - IF_NONE { NONE (pair (pair address nat) mutez) } { SOME } } - { DROP ; NONE (pair (pair address nat) mutez) } ; - IF_NONE - { DROP 4 ; PUSH nat 151 ; FAILWITH } - { UNPAIR ; - CDR ; - DUP 4 ; - CDR ; - CDR ; - CAR ; - INT ; - PUSH int 1 ; - SWAP ; - PAIR ; - DUP 2 ; - INT ; - PUSH int 1 ; - SWAP ; - PAIR ; - DUP 2 ; - CAR ; + TRANSFER_TOKENS } } } + { DROP 2 ; PUSH nat 108 ; FAILWITH } } ; + NIL operation ; + SWAP ; + CONS ; + DUP 4 ; + CAR ; + CDR ; + CAR ; + ITER { CDR ; + SWAP ; + DUP 2 ; + CAR ; + GET 5 ; + IF_NONE { PUSH nat 101 ; FAILWITH } {} ; + DUP 3 ; + CAR ; + GET 8 ; + IF_NONE { PUSH nat 108 ; FAILWITH } {} ; + PUSH string "FA2 standard" ; + DUP 2 ; + COMPARE ; + EQ ; + IF { DIG 3 ; + DROP 2 ; + DUP 3 ; + CONTRACT %balance_response_fa12 nat ; + SWAP ; + CONTRACT %getbalance (pair (contract %callback nat) (address %owner)) ; + SWAP ; + IF_NONE + { DROP ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DROP ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; DUP 5 ; DIG 3 ; PAIR ; TRANSFER_TOKENS } } } + { PUSH string "FA1.2 standard" ; + SWAP ; + COMPARE ; + EQ ; + IF { DUP 4 ; + CONTRACT %balance_response_fa2 + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id)))) ; + SWAP ; + CONTRACT %balance_of + (pair (contract %callback + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id))))) + (list %requests (pair (address %owner) (nat %token_id)))) ; + SWAP ; + IF_NONE + { DIG 2 ; DROP 2 ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DIG 2 ; DROP 2 ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; + NIL (pair address nat) ; + DIG 5 ; + CAR ; + CAR ; + DUP 7 ; + PAIR ; + CONS ; + DIG 3 ; + PAIR ; + TRANSFER_TOKENS } } } + { DIG 2 ; DROP 2 ; PUSH nat 108 ; FAILWITH } } ; + CONS } ; + SWAP ; + DROP ; + NIL operation ; + SWAP ; + ITER { CONS } ; + SWAP ; + NIL operation ; + SWAP ; + ITER { CONS } ; + ITER { CONS } ; + NIL operation ; + SWAP ; + ITER { CONS } ; + PAIR } } + { DROP ; + PUSH mutez 1 ; + AMOUNT ; + COMPARE ; + LT ; + IF {} { PUSH nat 118 ; FAILWITH } ; + SENDER ; DUP 2 ; CDR ; - MUL ; - DIG 2 ; CDR ; - DIG 2 ; - CAR ; - MUL ; - PAIR ; - EMPTY_MAP string (pair (pair nat string (option address) nat (option string)) nat) ; - DUP 6 ; CDR ; - CAR ; + DUP ; CAR ; DUP 3 ; - PAIR 3 ; - DUP 7 ; - SWAP ; - EXEC ; - UNPAIR ; - SWAP ; - EMPTY_MAP string (pair (pair nat string (option address) nat (option string)) nat) ; - DIG 3 ; - PAIR ; - PAIR ; - DUP 6 ; - CAR ; - CDR ; - CAR ; - ITER { CDR ; - SWAP ; - UNPAIR ; - UNPAIR ; - DIG 2 ; - DIG 3 ; - DUP 3 ; - PAIR 3 ; - DUP 9 ; - SWAP ; - EXEC ; - UNPAIR ; - DIG 3 ; - SWAP ; - PAIR ; - DUP 10 ; - SWAP ; - EXEC ; - DIG 2 ; - PAIR ; - PAIR } ; - DIG 6 ; - DIG 7 ; - DROP 2 ; - UNPAIR ; - CDR ; - DUP 7 ; - CDR ; - CDR ; - CAR ; - DUP 5 ; - COMPARE ; - GT ; - IF { SWAP ; DIG 2 ; DIG 3 ; DIG 6 ; DROP 5 ; PUSH nat 154 ; FAILWITH } - { DIG 3 ; - DUP 7 ; - CDR ; - CDR ; - CAR ; - SUB ; - ABS ; - DIG 2 ; - DUP 7 ; - DIG 7 ; - CDR ; - DUP ; - CAR ; - DIG 6 ; - UPDATE 1 ; - UPDATE 1 ; - UPDATE 2 ; - DUP ; - CAR ; - DUP ; - CDR ; - DIG 5 ; - UPDATE 1 ; - UPDATE 2 ; - UPDATE 1 ; - DUP ; - CDR ; - DUP ; - CDR ; - DIG 4 ; - UPDATE 1 ; - UPDATE 2 ; - UPDATE 2 ; - PAIR } ; - UNPAIR ; - DUP 4 ; - CONTRACT unit ; - IF_NONE { PUSH nat 102 ; FAILWITH } { DUP 4 ; UNIT ; TRANSFER_TOKENS } ; - SELF_ADDRESS ; - NIL operation ; - DIG 4 ; - ITER { CDR ; - DUP ; - CAR ; - GET 5 ; - IF_NONE - { DROP ; PUSH nat 109 ; FAILWITH } - { DUP 2 ; + MEM ; + IF { CDR ; + DUP 2 ; + GET ; + IF_NONE { NONE (pair (pair address nat) mutez) } { SOME } } + { DROP ; NONE (pair (pair address nat) mutez) } ; + IF_NONE + { DROP 4 ; PUSH nat 151 ; FAILWITH } + { UNPAIR ; + CDR ; + DUP 4 ; + CDR ; + CDR ; + CAR ; + INT ; + PUSH int 1 ; + SWAP ; + PAIR ; + DUP 2 ; + INT ; + PUSH int 1 ; + SWAP ; + PAIR ; + DUP 2 ; + CAR ; + DUP 2 ; + CDR ; + MUL ; + DIG 2 ; + CDR ; + DIG 2 ; + CAR ; + MUL ; + PAIR ; + DUP 5 ; + CDR ; + CAR ; + CAR ; + DUP ; + CDR ; + INT ; + PUSH int 1 ; + SWAP ; + PAIR ; + DUP ; + CDR ; + DUP 4 ; + CDR ; + MUL ; + SWAP ; + CAR ; + DUP 4 ; + CAR ; + MUL ; + PAIR ; + PUSH int 0 ; + DUP 2 ; + CAR ; + COMPARE ; + LT ; + IF { PUSH int -1 ; DUP 2 ; CDR ; MUL ; PUSH int -1 ; DIG 2 ; CAR ; MUL ; PAIR } + {} ; + DUP ; + CDR ; + PUSH nat 1 ; + PUSH nat 0 ; + PUSH nat 10 ; + PAIR ; + PAIR ; + LEFT nat ; + LOOP_LEFT + { UNPAIR ; + UNPAIR ; + PUSH nat 0 ; + DUP 3 ; + COMPARE ; + EQ ; + IF { DROP 2 ; RIGHT (pair (pair nat nat) nat) } + { PUSH nat 1 ; + PUSH nat 1 ; + DUP 4 ; + AND ; + COMPARE ; + EQ ; + IF { DUP ; DIG 3 ; MUL } { DIG 2 } ; + PUSH nat 1 ; + DIG 3 ; + LSR ; + DUP 3 ; + DIG 3 ; + MUL ; + PAIR ; + PAIR ; + LEFT nat } } ; + DIG 2 ; + CAR ; + MUL ; + EDIV ; + IF_NONE { PUSH string "DIV by 0" ; FAILWITH } {} ; + CAR ; + ISNAT ; + IF_NONE { PUSH nat 119 ; FAILWITH } {} ; + DUP 2 ; + CDR ; + DUP 2 ; + COMPARE ; + GT ; + IF { DROP 2 ; PUSH nat 153 ; FAILWITH } + { DUP ; + DUP 3 ; + CDR ; + INT ; + SUB ; + ABS ; + DUP 3 ; + DIG 2 ; + UPDATE 2 ; + PUSH nat 0 ; + DUP 2 ; + CDR ; + COMPARE ; + EQ ; + IF { DROP ; DUP 9 } { DUP 10 ; SWAP ; PAIR ; DUP 9 ; SWAP ; EXEC } ; + DUG 2 ; + UPDATE 2 ; + PAIR } ; + UNPAIR ; + SWAP ; + DIG 8 ; + DIG 3 ; + PAIR ; + PAIR ; + DUP 6 ; + CAR ; + CDR ; + CAR ; + ITER { CDR ; + SWAP ; + UNPAIR ; + UNPAIR ; + DUP 4 ; + CDR ; + INT ; + PUSH int 1 ; + SWAP ; + PAIR ; + DUP ; + CDR ; + DUP 3 ; + CDR ; + MUL ; + SWAP ; CAR ; - GET 8 ; - IF_NONE - { DROP 2 ; PUSH nat 108 ; FAILWITH } - { PUSH string "FA1.2 token" ; - DUP 2 ; + DUP 3 ; + CAR ; + MUL ; + PAIR ; + PUSH int 0 ; + DUP 2 ; + CAR ; + COMPARE ; + LT ; + IF { PUSH int -1 ; DUP 2 ; CDR ; MUL ; PUSH int -1 ; DIG 2 ; CAR ; MUL ; PAIR } + {} ; + DUP ; + CDR ; + PUSH nat 1 ; + PUSH nat 0 ; + PUSH nat 10 ; + PAIR ; + PAIR ; + LEFT nat ; + LOOP_LEFT + { UNPAIR ; + UNPAIR ; + PUSH nat 0 ; + DUP 3 ; COMPARE ; EQ ; - IF { DROP ; - CONTRACT %transfer (pair (address %from) (address %to) (nat %value)) ; - IF_NONE { PUSH nat 101 ; FAILWITH } {} ; - PUSH mutez 0 ; - DIG 2 ; - CDR ; - DUP 9 ; - DUP 6 ; - PAIR 3 ; - TRANSFER_TOKENS } - { PUSH string "FA2 token" ; - SWAP ; + IF { DROP 2 ; RIGHT (pair (pair nat nat) nat) } + { PUSH nat 1 ; + PUSH nat 1 ; + DUP 4 ; + AND ; COMPARE ; EQ ; - IF { CONTRACT %transfer - (list (pair (address %from_) (list %tx (pair (address %to_) (nat %token_id) (nat %amount))))) ; - IF_NONE { PUSH nat 101 ; FAILWITH } {} ; - PUSH mutez 0 ; - NIL (pair address (list (pair address nat nat))) ; - NIL (pair address nat nat) ; - DUP 5 ; - CDR ; - DIG 5 ; - CAR ; - CAR ; - DUP 12 ; - PAIR 3 ; - CONS ; - DUP 6 ; - PAIR ; - CONS ; - TRANSFER_TOKENS } - { DROP 2 ; PUSH nat 108 ; FAILWITH } } } } ; - CONS } ; - SWAP ; - DROP ; - DUP 3 ; - DUP 4 ; - CDR ; - DUP ; - CDR ; - DIG 5 ; - CDR ; - CDR ; - CDR ; - DUP ; - CAR ; - DUP 9 ; - MEM ; - IF { DUP ; - CDR ; - DIG 8 ; - NONE (pair (pair address nat) mutez) ; - SWAP ; - UPDATE ; - UPDATE 2 } - { DIG 7 ; DROP } ; - UPDATE 2 ; - UPDATE 2 ; - UPDATE 2 ; - PUSH mutez 0 ; - DIG 4 ; - COMPARE ; - GT ; - IF { SWAP ; DIG 2 ; CONS } { DIG 2 ; DROP ; SWAP } ; - PAIR } } } ; + IF { DUP ; DIG 3 ; MUL } { DIG 2 } ; + PUSH nat 1 ; + DIG 3 ; + LSR ; + DUP 3 ; + DIG 3 ; + MUL ; + PAIR ; + PAIR ; + LEFT nat } } ; + DIG 2 ; + CAR ; + MUL ; + EDIV ; + IF_NONE { PUSH string "DIV by 0" ; FAILWITH } {} ; + CAR ; + ISNAT ; + IF_NONE { PUSH nat 119 ; FAILWITH } {} ; + DUP 5 ; + CDR ; + DUP 2 ; + COMPARE ; + GT ; + IF { DIG 3 ; DIG 4 ; DROP 3 ; PUSH nat 153 ; FAILWITH } + { DUP ; + DUP 6 ; + CDR ; + INT ; + SUB ; + ABS ; + DUP 6 ; + DIG 2 ; + UPDATE 2 ; + PUSH nat 0 ; + DUP 2 ; + CDR ; + COMPARE ; + EQ ; + IF { DROP ; DIG 3 } { DIG 4 ; SWAP ; PAIR ; DUP 11 ; SWAP ; EXEC } ; + DIG 4 ; + DIG 2 ; + UPDATE 2 ; + PAIR } ; + UNPAIR ; + DIG 3 ; + SWAP ; + PAIR ; + DUP 9 ; + SWAP ; + EXEC ; + DIG 2 ; + PAIR ; + PAIR } ; + DIG 6 ; + DROP ; + UNPAIR ; + CDR ; + DUP 7 ; + CDR ; + CDR ; + CAR ; + DUP 5 ; + COMPARE ; + GT ; + IF { SWAP ; DIG 2 ; DIG 3 ; DIG 6 ; DROP 5 ; PUSH nat 154 ; FAILWITH } + { DIG 3 ; + DUP 7 ; + CDR ; + CDR ; + CAR ; + SUB ; + ABS ; + DIG 2 ; + DUP 7 ; + DIG 7 ; + CDR ; + DUP ; + CAR ; + DIG 6 ; + UPDATE 1 ; + UPDATE 1 ; + UPDATE 2 ; + DUP ; + CAR ; + DUP ; + CDR ; + DIG 5 ; + UPDATE 1 ; + UPDATE 2 ; + UPDATE 1 ; + DUP ; + CDR ; + DUP ; + CDR ; + DIG 4 ; + UPDATE 1 ; + UPDATE 2 ; + UPDATE 2 ; + PAIR } ; + UNPAIR ; + DUP 4 ; + CONTRACT unit ; + IF_NONE { PUSH nat 102 ; FAILWITH } { DUP 4 ; UNIT ; TRANSFER_TOKENS } ; + SELF_ADDRESS ; + NIL operation ; + DIG 4 ; + ITER { CDR ; + DUP ; + CAR ; + GET 5 ; + IF_NONE + { DROP ; PUSH nat 109 ; FAILWITH } + { DUP 2 ; + CAR ; + GET 8 ; + IF_NONE + { DROP 2 ; PUSH nat 108 ; FAILWITH } + { PUSH string "FA1.2 token" ; + DUP 2 ; + COMPARE ; + EQ ; + IF { DROP ; + CONTRACT %transfer (pair (address %from) (address %to) (nat %value)) ; + IF_NONE { PUSH nat 101 ; FAILWITH } {} ; + PUSH mutez 0 ; + DIG 2 ; + CDR ; + DUP 9 ; + DUP 6 ; + PAIR 3 ; + TRANSFER_TOKENS } + { PUSH string "FA2 token" ; + SWAP ; + COMPARE ; + EQ ; + IF { CONTRACT %transfer + (list (pair (address %from_) (list %tx (pair (address %to_) (nat %token_id) (nat %amount))))) ; + IF_NONE { PUSH nat 101 ; FAILWITH } {} ; + PUSH mutez 0 ; + NIL (pair address (list (pair address nat nat))) ; + NIL (pair address nat nat) ; + DUP 5 ; + CDR ; + DIG 5 ; + CAR ; + CAR ; + DUP 12 ; + PAIR 3 ; + CONS ; + DUP 6 ; + PAIR ; + CONS ; + TRANSFER_TOKENS } + { DROP 2 ; PUSH nat 108 ; FAILWITH } } } } ; + CONS } ; + SWAP ; + DROP ; + DUP 3 ; + CDR ; + CDR ; + CDR ; + SELF_ADDRESS ; + DUP 5 ; + CDR ; + CAR ; + CAR ; + CAR ; + DUP ; + GET 5 ; + IF_NONE { PUSH nat 101 ; FAILWITH } {} ; + DUP 2 ; + GET 8 ; + IF_NONE { PUSH nat 108 ; FAILWITH } {} ; + PUSH string "FA2 standard" ; + DUP 2 ; + COMPARE ; + EQ ; + IF { DIG 2 ; + DROP 2 ; + DUP 2 ; + CONTRACT %balance_response_fa12 nat ; + SWAP ; + CONTRACT %getbalance (pair (contract %callback nat) (address %owner)) ; + SWAP ; + IF_NONE + { DROP ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DROP ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; DUP 4 ; DIG 3 ; PAIR ; TRANSFER_TOKENS } } } + { PUSH string "FA1.2 standard" ; + SWAP ; + COMPARE ; + EQ ; + IF { DUP 3 ; + CONTRACT %balance_response_fa2 + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id)))) ; + SWAP ; + CONTRACT %balance_of + (pair (contract %callback + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id))))) + (list %requests (pair (address %owner) (nat %token_id)))) ; + SWAP ; + IF_NONE + { DROP 2 ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DROP 2 ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; + NIL (pair address nat) ; + DIG 4 ; + CAR ; + DUP 6 ; + PAIR ; + CONS ; + DIG 3 ; + PAIR ; + TRANSFER_TOKENS } } } + { DROP 2 ; PUSH nat 108 ; FAILWITH } } ; + NIL operation ; + SWAP ; + CONS ; + DUP 6 ; + CAR ; + CDR ; + CAR ; + ITER { CDR ; + SWAP ; + DUP 2 ; + CAR ; + GET 5 ; + IF_NONE { PUSH nat 101 ; FAILWITH } {} ; + DUP 3 ; + CAR ; + GET 8 ; + IF_NONE { PUSH nat 108 ; FAILWITH } {} ; + PUSH string "FA2 standard" ; + DUP 2 ; + COMPARE ; + EQ ; + IF { DIG 3 ; + DROP 2 ; + DUP 3 ; + CONTRACT %balance_response_fa12 nat ; + SWAP ; + CONTRACT %getbalance (pair (contract %callback nat) (address %owner)) ; + SWAP ; + IF_NONE + { DROP ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DROP ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; DUP 5 ; DIG 3 ; PAIR ; TRANSFER_TOKENS } } } + { PUSH string "FA1.2 standard" ; + SWAP ; + COMPARE ; + EQ ; + IF { DUP 4 ; + CONTRACT %balance_response_fa2 + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id)))) ; + SWAP ; + CONTRACT %balance_of + (pair (contract %callback + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id))))) + (list %requests (pair (address %owner) (nat %token_id)))) ; + SWAP ; + IF_NONE + { DIG 2 ; DROP 2 ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DIG 2 ; DROP 2 ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; + NIL (pair address nat) ; + DIG 5 ; + CAR ; + CAR ; + DUP 7 ; + PAIR ; + CONS ; + DIG 3 ; + PAIR ; + TRANSFER_TOKENS } } } + { DIG 2 ; DROP 2 ; PUSH nat 108 ; FAILWITH } } ; + CONS } ; + SWAP ; + DROP ; + NIL operation ; + SWAP ; + ITER { CONS } ; + PUSH mutez 0 ; + DIG 6 ; + COMPARE ; + GT ; + IF { DIG 2 ; DIG 3 ; CONS } { DIG 3 ; DROP ; DIG 2 } ; + NIL operation ; + SWAP ; + ITER { CONS } ; + ITER { CONS } ; + NIL operation ; + SWAP ; + ITER { CONS } ; + DUP 3 ; + DIG 3 ; + CDR ; + DUP ; + CDR ; + DUP 5 ; + CAR ; + DUP 7 ; + MEM ; + IF { DUP 5 ; + DIG 5 ; + CDR ; + DIG 6 ; + NONE (pair (pair address nat) mutez) ; + SWAP ; + UPDATE ; + UPDATE 2 } + { DIG 5 ; DROP ; DIG 4 } ; + UPDATE 2 ; + UPDATE 2 ; + UPDATE 2 ; + SWAP ; + PAIR } } } } ; view "get_native_token_of_vault" unit (pair (nat %token_id) @@ -1114,23 +1750,5 @@ (option %address address) (nat %decimals) (option %standard string)) - { CDR ; CDR ; CAR ; CAR ; CAR } ; - view "get_vault_balances" - unit - (pair (pair (pair %token - (nat %token_id) - (string %name) - (option %address address) - (nat %decimals) - (option %standard string)) - (nat %amount)) - (map string - (pair (pair %token - (nat %token_id) - (string %name) - (option %address address) - (nat %decimals) - (option %standard string)) - (nat %amount)))) - { CDR ; DUP ; CAR ; CDR ; CAR ; SWAP ; CDR ; CAR ; CAR ; PAIR } } + { CDR ; CDR ; CAR ; CAR ; CAR } } diff --git a/batcher/michelson/usdtz-vault-ghostnet.tz b/batcher/michelson/usdtz-vault-ghostnet.tz index 67557279..488c5eaf 100644 --- a/batcher/michelson/usdtz-vault-ghostnet.tz +++ b/batcher/michelson/usdtz-vault-ghostnet.tz @@ -1,24 +1,28 @@ { parameter (or (or (or (or (nat %addLiquidity) (mutez %addReward)) - (or (address %change_admin_address) (address %change_batcher_address))) - (or (or (address %change_marketmaker_address) (address %change_tokenmanager_address)) - (or (unit %claim) - (pair %injectLiquidity - (pair (nat %amount) - (pair %from_token - (nat %token_id) - (string %name) - (option %address address) - (nat %decimals) - (option %standard string))) - (or %side (unit %buy) (unit %sell)) - (pair %to_token - (nat %token_id) - (string %name) - (option %address address) - (nat %decimals) - (option %standard string)))))) - (unit %removeLiquidity)) ; + (or (nat %balance_response_fa12) + (pair %balance_response_fa2 + (nat %balance) + (pair %request (address %owner) (nat %token_id))))) + (or (or (address %change_admin_address) (address %change_batcher_address)) + (or (address %change_marketmaker_address) (address %change_tokenmanager_address)))) + (or (or (unit %claim) + (pair %injectLiquidity + (pair (nat %amount) + (pair %from_token + (nat %token_id) + (string %name) + (option %address address) + (nat %decimals) + (option %standard string))) + (or %side (unit %buy) (unit %sell)) + (pair %to_token + (nat %token_id) + (string %name) + (option %address address) + (nat %decimals) + (option %standard string)))) + (unit %removeLiquidity))) ; storage (pair (pair (pair (address %administrator) (address %batcher)) (map %foreign_tokens @@ -47,6 +51,11 @@ address (pair (pair (address %holder) (nat %shares)) (mutez %unclaimed))))) ; code { LAMBDA + (pair (option address) nat) + address + { UNPAIR ; IF_NONE { FAILWITH } { SWAP ; DROP } } ; + EMPTY_MAP string (pair (pair nat string (option address) nat (option string)) nat) ; + LAMBDA (pair (pair (pair nat string (option address) nat (option string)) nat) (map string (pair (pair nat string (option address) nat (option string)) nat))) (map string (pair (pair nat string (option address) nat (option string)) nat)) @@ -82,111 +91,7 @@ SOME ; DIG 2 ; UPDATE } } ; - LAMBDA - (pair (lambda - (pair (pair (pair nat string (option address) nat (option string)) nat) - (map string (pair (pair nat string (option address) nat (option string)) nat))) - (map string (pair (pair nat string (option address) nat (option string)) nat))) - (pair (pair int int) - (pair (pair nat string (option address) nat (option string)) nat) - (map string (pair (pair nat string (option address) nat (option string)) nat)))) - (pair (pair (pair nat string (option address) nat (option string)) nat) - (map string (pair (pair nat string (option address) nat (option string)) nat))) - { UNPAIR ; - SWAP ; - UNPAIR 3 ; - DUP 2 ; - CDR ; - INT ; - PUSH int 1 ; - SWAP ; - PAIR ; - DUP ; - CDR ; - DUP 3 ; - CDR ; - MUL ; - SWAP ; - CAR ; - DIG 2 ; - CAR ; - MUL ; - PAIR ; - PUSH int 0 ; - DUP 2 ; - CAR ; - COMPARE ; - LT ; - IF { PUSH int -1 ; DUP 2 ; CDR ; MUL ; PUSH int -1 ; DIG 2 ; CAR ; MUL ; PAIR } - {} ; - DUP ; - CDR ; - PUSH nat 1 ; - PUSH nat 0 ; - PUSH nat 10 ; - PAIR ; - PAIR ; - LEFT nat ; - LOOP_LEFT - { UNPAIR ; - UNPAIR ; - PUSH nat 0 ; - DUP 3 ; - COMPARE ; - EQ ; - IF { DROP 2 ; RIGHT (pair (pair nat nat) nat) } - { PUSH nat 1 ; - PUSH nat 1 ; - DUP 4 ; - AND ; - COMPARE ; - EQ ; - IF { DUP ; DIG 3 ; MUL } { DIG 2 } ; - PUSH nat 1 ; - DIG 3 ; - LSR ; - DUP 3 ; - DIG 3 ; - MUL ; - PAIR ; - PAIR ; - LEFT nat } } ; - DIG 2 ; - CAR ; - MUL ; - EDIV ; - IF_NONE { PUSH string "DIV by 0" ; FAILWITH } {} ; - CAR ; - ISNAT ; - IF_NONE { PUSH nat 119 ; FAILWITH } {} ; - DUP 2 ; - CDR ; - DUP 2 ; - COMPARE ; - GT ; - IF { DROP 4 ; PUSH nat 153 ; FAILWITH } - { DUP ; - DUP 3 ; - CDR ; - INT ; - SUB ; - ABS ; - DUP 3 ; - DIG 2 ; - UPDATE 2 ; - PUSH nat 0 ; - DUP 2 ; - CDR ; - COMPARE ; - EQ ; - IF { DIG 4 ; DROP 2 ; DIG 2 } - { DIG 3 ; SWAP ; PAIR ; DIG 3 ; SWAP ; EXEC } ; - DUG 2 ; - UPDATE 2 ; - PAIR } } ; - DUP 2 ; - APPLY ; - DIG 2 ; + DIG 3 ; UNPAIR ; IF_LEFT { DIG 2 ; @@ -194,7 +99,9 @@ DROP 2 ; IF_LEFT { IF_LEFT - { IF_LEFT + { DIG 2 ; + DROP ; + IF_LEFT { PUSH mutez 1 ; AMOUNT ; COMPARE ; @@ -255,13 +162,138 @@ CONS ; TRANSFER_TOKENS } { DROP 2 ; PUSH nat 108 ; FAILWITH } } } } ; - DUP 4 ; + SELF_ADDRESS ; + DUP 5 ; CDR ; CAR ; CAR ; + CAR ; DUP ; + GET 5 ; + IF_NONE { PUSH nat 101 ; FAILWITH } {} ; + DUP 2 ; + GET 8 ; + IF_NONE { PUSH nat 108 ; FAILWITH } {} ; + PUSH string "FA2 standard" ; + DUP 2 ; + COMPARE ; + EQ ; + IF { DIG 2 ; + DROP 2 ; + DUP 2 ; + CONTRACT %balance_response_fa12 nat ; + SWAP ; + CONTRACT %getbalance (pair (contract %callback nat) (address %owner)) ; + SWAP ; + IF_NONE + { DROP ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DROP ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; DUP 4 ; DIG 3 ; PAIR ; TRANSFER_TOKENS } } } + { PUSH string "FA1.2 standard" ; + SWAP ; + COMPARE ; + EQ ; + IF { DUP 3 ; + CONTRACT %balance_response_fa2 + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id)))) ; + SWAP ; + CONTRACT %balance_of + (pair (contract %callback + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id))))) + (list %requests (pair (address %owner) (nat %token_id)))) ; + SWAP ; + IF_NONE + { DROP 2 ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DROP 2 ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; + NIL (pair address nat) ; + DIG 4 ; + CAR ; + DUP 6 ; + PAIR ; + CONS ; + DIG 3 ; + PAIR ; + TRANSFER_TOKENS } } } + { DROP 2 ; PUSH nat 108 ; FAILWITH } } ; + NIL operation ; + SWAP ; + CONS ; + DUP 6 ; CAR ; - DUP 4 ; + CDR ; + CAR ; + ITER { CDR ; + SWAP ; + DUP 2 ; + CAR ; + GET 5 ; + IF_NONE { PUSH nat 101 ; FAILWITH } {} ; + DUP 3 ; + CAR ; + GET 8 ; + IF_NONE { PUSH nat 108 ; FAILWITH } {} ; + PUSH string "FA2 standard" ; + DUP 2 ; + COMPARE ; + EQ ; + IF { DIG 3 ; + DROP 2 ; + DUP 3 ; + CONTRACT %balance_response_fa12 nat ; + SWAP ; + CONTRACT %getbalance (pair (contract %callback nat) (address %owner)) ; + SWAP ; + IF_NONE + { DROP ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DROP ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; DUP 5 ; DIG 3 ; PAIR ; TRANSFER_TOKENS } } } + { PUSH string "FA1.2 standard" ; + SWAP ; + COMPARE ; + EQ ; + IF { DUP 4 ; + CONTRACT %balance_response_fa2 + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id)))) ; + SWAP ; + CONTRACT %balance_of + (pair (contract %callback + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id))))) + (list %requests (pair (address %owner) (nat %token_id)))) ; + SWAP ; + IF_NONE + { DIG 2 ; DROP 2 ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DIG 2 ; DROP 2 ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; + NIL (pair address nat) ; + DIG 5 ; + CAR ; + CAR ; + DUP 7 ; + PAIR ; + CONS ; + DIG 3 ; + PAIR ; + TRANSFER_TOKENS } } } + { DIG 2 ; DROP 2 ; PUSH nat 108 ; FAILWITH } } ; + CONS } ; + SWAP ; + DROP ; + DUP 5 ; + CDR ; + CAR ; + CAR ; + DUP ; + CAR ; + DUP 5 ; CAR ; DUP 2 ; GET 8 ; @@ -298,37 +330,37 @@ AND ; AND ; NOT ; - IF { DIG 2 ; DIG 3 ; DIG 4 ; DROP 4 ; PUSH nat 115 ; FAILWITH } - { DUP 3 ; + IF { DIG 3 ; DIG 4 ; DIG 5 ; DROP 4 ; PUSH nat 115 ; FAILWITH } + { DUP 4 ; CDR ; - DUP 6 ; + DUP 7 ; CDR ; CDR ; CAR ; ADD ; DUP 2 ; - DUP 5 ; + DUP 6 ; CDR ; DIG 3 ; CDR ; ADD ; UPDATE 2 ; - DUP 6 ; + DUP 7 ; CDR ; CDR ; CDR ; DUP ; CAR ; - DUP 7 ; + DUP 8 ; MEM ; IF { CDR ; - DUP 6 ; + DUP 7 ; GET ; IF_NONE { NONE (pair (pair address nat) mutez) } { SOME } } { DROP ; NONE (pair (pair address nat) mutez) } ; IF_NONE - { PUSH mutez 0 ; DIG 4 ; CDR ; DUP 6 ; PAIR ; PAIR } - { DIG 4 ; + { PUSH mutez 0 ; DIG 5 ; CDR ; DUP 7 ; PAIR ; PAIR } + { DIG 5 ; CDR ; DUP 2 ; CAR ; @@ -340,8 +372,8 @@ DIG 2 ; UPDATE 2 ; UPDATE 1 } ; - DUP 6 ; DUP 7 ; + DUP 8 ; CDR ; DUP ; CDR ; @@ -353,19 +385,19 @@ CDR ; DUP ; CDR ; - DIG 7 ; + DIG 8 ; CDR ; CDR ; CDR ; DUP ; CAR ; - DUP 9 ; + DUP 10 ; MEM ; - IF { DUP ; CDR ; DIG 5 ; SOME ; DIG 8 ; UPDATE ; UPDATE 2 } + IF { DUP ; CDR ; DIG 5 ; SOME ; DIG 9 ; UPDATE ; UPDATE 2 } { DUP ; DUP 2 ; CAR ; - DUP 10 ; + DUP 11 ; PUSH bool True ; SWAP ; UPDATE ; @@ -373,7 +405,7 @@ SWAP ; CDR ; DIG 5 ; - DIG 8 ; + DIG 9 ; SWAP ; SOME ; SWAP ; @@ -390,7 +422,7 @@ UPDATE 1 ; UPDATE 1 ; UPDATE 2 } ; - NIL operation ; + SWAP ; DIG 2 ; CONS } { DUP 2 ; @@ -551,6 +583,171 @@ UPDATE 2 ; UPDATE 2 ; NIL operation } } + { IF_LEFT + { SENDER ; + DUP 3 ; + CDR ; + CAR ; + CAR ; + CAR ; + GET 5 ; + IF_NONE { PUSH nat 101 ; FAILWITH } {} ; + PUSH nat 0 ; + DUP 5 ; + CDR ; + CAR ; + CAR ; + CAR ; + CAR ; + COMPARE ; + EQ ; + DUP 3 ; + DIG 2 ; + COMPARE ; + EQ ; + AND ; + IF { DUP 3 ; + DUP 4 ; + CDR ; + DUP ; + CAR ; + DIG 5 ; + CDR ; + CAR ; + CAR ; + DUP 6 ; + UPDATE 2 ; + UPDATE 1 ; + UPDATE 1 ; + UPDATE 2 } + { DIG 2 } ; + DUP ; + CAR ; + CDR ; + CAR ; + DUP ; + ITER { CDR ; + PUSH nat 101 ; + DUP 2 ; + CAR ; + GET 5 ; + PAIR ; + DUP 7 ; + SWAP ; + EXEC ; + PUSH nat 0 ; + DUP 3 ; + CAR ; + CAR ; + COMPARE ; + EQ ; + DUP 6 ; + DIG 2 ; + COMPARE ; + EQ ; + AND ; + IF { DUP 5 ; UPDATE 2 ; SWAP ; DUP 2 ; SOME ; DIG 2 ; CAR ; GET 3 ; UPDATE } + { DROP } } ; + DIG 2 ; + DIG 3 ; + DIG 4 ; + DROP 3 ; + DUP 2 ; + DIG 2 ; + CAR ; + DUP ; + CDR ; + DIG 3 ; + UPDATE 1 ; + UPDATE 2 ; + UPDATE 1 } + { SENDER ; + DUP 2 ; + CAR ; + DIG 2 ; + CDR ; + CDR ; + DUP 4 ; + CDR ; + CAR ; + CAR ; + CAR ; + GET 5 ; + IF_NONE { PUSH nat 101 ; FAILWITH } {} ; + DUP 2 ; + DUP 6 ; + CDR ; + CAR ; + CAR ; + CAR ; + CAR ; + COMPARE ; + EQ ; + DUP 5 ; + DIG 2 ; + COMPARE ; + EQ ; + AND ; + IF { DUP 4 ; + DUP 5 ; + CDR ; + DUP ; + CAR ; + DIG 6 ; + CDR ; + CAR ; + CAR ; + DUP 6 ; + UPDATE 2 ; + UPDATE 1 ; + UPDATE 1 ; + UPDATE 2 } + { DIG 3 } ; + DUP ; + CAR ; + CDR ; + CAR ; + DUP ; + ITER { CDR ; + PUSH nat 101 ; + DUP 2 ; + CAR ; + GET 5 ; + PAIR ; + DUP 8 ; + SWAP ; + EXEC ; + DUP 5 ; + DUP 3 ; + CAR ; + CAR ; + COMPARE ; + EQ ; + DUP 8 ; + DIG 2 ; + COMPARE ; + EQ ; + AND ; + IF { DUP 5 ; UPDATE 2 ; SWAP ; DUP 2 ; SOME ; DIG 2 ; CAR ; GET 3 ; UPDATE } + { DROP } } ; + DIG 2 ; + DIG 3 ; + DIG 4 ; + DIG 5 ; + DROP 4 ; + DUP 2 ; + DIG 2 ; + CAR ; + DUP ; + CDR ; + DIG 3 ; + UPDATE 1 ; + UPDATE 2 ; + UPDATE 1 } ; + NIL operation } } + { DIG 2 ; + DROP ; + IF_LEFT { IF_LEFT { DUP 2 ; CAR ; @@ -595,10 +792,7 @@ DIG 3 ; UPDATE 2 ; UPDATE 1 ; - UPDATE 1 } ; - NIL operation } ; - PAIR } - { IF_LEFT + UPDATE 1 } } { IF_LEFT { DUP 2 ; CAR ; @@ -643,470 +837,912 @@ DIG 3 ; UPDATE 2 ; UPDATE 1 ; - UPDATE 2 } ; - NIL operation ; - PAIR } - { IF_LEFT - { DROP ; - PUSH mutez 1 ; - AMOUNT ; - COMPARE ; - LT ; - IF {} { PUSH nat 118 ; FAILWITH } ; - SENDER ; - DUP 2 ; - CDR ; - CDR ; + UPDATE 2 } } ; + NIL operation } ; + PAIR } + { DIG 4 ; + DROP ; + IF_LEFT + { DIG 2 ; + DIG 3 ; + DROP 2 ; + IF_LEFT + { DROP ; + PUSH mutez 1 ; + AMOUNT ; + COMPARE ; + LT ; + IF {} { PUSH nat 118 ; FAILWITH } ; + SENDER ; + DUP 2 ; + CDR ; + CDR ; + CDR ; + DUP ; + CAR ; + DUP 3 ; + MEM ; + IF { CDR ; + SWAP ; + GET ; + IF_NONE { NONE (pair (pair address nat) mutez) } { SOME } } + { DROP 2 ; NONE (pair (pair address nat) mutez) } ; + IF_NONE + { DROP ; PUSH nat 155 ; FAILWITH } + { DUP ; CDR ; - DUP ; - CAR ; - DUP 3 ; - MEM ; - IF { CDR ; - SWAP ; - GET ; - IF_NONE { NONE (pair (pair address nat) mutez) } { SOME } } - { DROP 2 ; NONE (pair (pair address nat) mutez) } ; - IF_NONE - { DROP ; PUSH nat 155 ; FAILWITH } - { DUP ; - CDR ; - PUSH mutez 0 ; - DUP 2 ; - COMPARE ; - EQ ; - IF { DROP 3 ; PUSH nat 155 ; FAILWITH } - { SWAP ; - PUSH mutez 0 ; - UPDATE 2 ; - DUP ; - CAR ; - CAR ; - CONTRACT unit ; - IF_NONE - { SWAP ; DROP ; PUSH nat 102 ; FAILWITH } - { DIG 2 ; UNIT ; TRANSFER_TOKENS } ; - DUP 3 ; - DUP 4 ; - CDR ; - DUP ; - CDR ; - DIG 5 ; - CDR ; - CDR ; - CDR ; - DUP 6 ; - CAR ; - CAR ; - DUP 2 ; - CAR ; - DUP 2 ; - MEM ; - IF { DUP 2 ; DIG 2 ; CDR ; DIG 7 ; SOME ; DIG 3 ; UPDATE ; UPDATE 2 } - { DUP 2 ; - DUP 3 ; - CAR ; - DUP 3 ; - PUSH bool True ; - SWAP ; - UPDATE ; - UPDATE 1 ; - DIG 2 ; - CDR ; - DIG 7 ; - DIG 3 ; - SWAP ; - SOME ; - SWAP ; - UPDATE ; - UPDATE 2 } ; - UPDATE 2 ; - UPDATE 2 ; - UPDATE 2 ; - NIL operation ; - DIG 2 ; - CONS ; - PAIR } } } - { DUP 2 ; - CAR ; - CDR ; - CDR ; - SENDER ; + PUSH mutez 0 ; + DUP 2 ; COMPARE ; EQ ; - IF {} { PUSH nat 168 ; FAILWITH } ; - PUSH mutez 1 ; - AMOUNT ; - COMPARE ; - LT ; - IF {} { PUSH nat 118 ; FAILWITH } ; - UNIT ; - LEFT unit ; - LEFT unit ; - IF_LEFT - { IF_LEFT { DROP ; PUSH nat 1 } { DROP ; PUSH nat 0 } } - { DROP ; PUSH nat 2 } ; - DUP 2 ; - CDR ; - CAR ; - IF_LEFT { DROP ; PUSH nat 0 } { DROP ; PUSH nat 1 } ; - NOW ; - DUP 4 ; - CDR ; - CDR ; - DUP 5 ; - CAR ; - CAR ; - DIG 5 ; + IF { DROP 3 ; PUSH nat 155 ; FAILWITH } + { SWAP ; + PUSH mutez 0 ; + UPDATE 2 ; + DUP ; + CAR ; + CAR ; + CONTRACT unit ; + IF_NONE + { SWAP ; DROP ; PUSH nat 102 ; FAILWITH } + { DIG 2 ; UNIT ; TRANSFER_TOKENS } ; + DUP 3 ; + DUP 4 ; + CDR ; + DUP ; + CDR ; + DIG 5 ; + CDR ; + CDR ; + CDR ; + DUP 6 ; + CAR ; + CAR ; + DUP 2 ; + CAR ; + DUP 2 ; + MEM ; + IF { DUP 2 ; DIG 2 ; CDR ; DIG 7 ; SOME ; DIG 3 ; UPDATE ; UPDATE 2 } + { DUP 2 ; + DUP 3 ; + CAR ; + DUP 3 ; + PUSH bool True ; + SWAP ; + UPDATE ; + UPDATE 1 ; + DIG 2 ; + CDR ; + DIG 7 ; + DIG 3 ; + SWAP ; + SOME ; + SWAP ; + UPDATE ; + UPDATE 2 } ; + UPDATE 2 ; + UPDATE 2 ; + UPDATE 2 ; + NIL operation ; + DIG 2 ; + CONS ; + PAIR } } } + { DUP 2 ; + CAR ; + CDR ; + CDR ; + SENDER ; + COMPARE ; + EQ ; + IF {} { PUSH nat 168 ; FAILWITH } ; + PUSH mutez 1 ; + AMOUNT ; + COMPARE ; + LT ; + IF {} { PUSH nat 118 ; FAILWITH } ; + UNIT ; + LEFT unit ; + LEFT unit ; + IF_LEFT + { IF_LEFT { DROP ; PUSH nat 1 } { DROP ; PUSH nat 0 } } + { DROP ; PUSH nat 2 } ; + DUP 2 ; + CDR ; + CAR ; + IF_LEFT { DROP ; PUSH nat 0 } { DROP ; PUSH nat 1 } ; + NOW ; + DUP 4 ; + CDR ; + CDR ; + DUP 5 ; + CAR ; + CAR ; + DIG 5 ; + CAR ; + CDR ; + PAIR ; + PAIR ; + PAIR 4 ; + DUP 2 ; + CAR ; + CAR ; + CDR ; + DUP 2 ; + CAR ; + CAR ; + CAR ; + GET 5 ; + IF_NONE + { DROP 2 ; PUSH nat 109 ; FAILWITH } + { DUP 3 ; CAR ; - CDR ; - PAIR ; - PAIR ; - PAIR 4 ; - DUP 2 ; CAR ; CAR ; - CDR ; - DUP 2 ; + GET 8 ; + IF_NONE + { PUSH bool False } + { PUSH string "FA1.2 token" ; SWAP ; COMPARE ; EQ } ; + IF { DUP ; + CONTRACT %approve (pair (address %spender) (nat %value)) ; + IF_NONE { PUSH nat 157 ; FAILWITH } {} ; + PUSH mutez 0 ; + DUP 5 ; + CAR ; + CAR ; + CDR ; + DUP 5 ; + PAIR ; + TRANSFER_TOKENS } + { DUP 3 ; + CAR ; + CAR ; + CAR ; + GET 8 ; + IF_NONE + { PUSH bool False } + { PUSH string "FA2 token" ; SWAP ; COMPARE ; EQ } ; + IF { SELF_ADDRESS ; + DUP 2 ; + CONTRACT %add_operator + (pair (pair (address %operator) (address %owner)) (nat %token_id)) ; + IF_NONE { PUSH nat 157 ; FAILWITH } {} ; + PUSH mutez 0 ; + DUP 6 ; + CAR ; + CAR ; + CAR ; + CAR ; + DIG 3 ; + DUP 6 ; + PAIR ; + PAIR ; + TRANSFER_TOKENS } + { PUSH nat 108 ; FAILWITH } } ; + DUP 3 ; + CONTRACT %deposit + (pair (pair %swap + (pair %from + (pair %token + (nat %token_id) + (string %name) + (option %address address) + (nat %decimals) + (option %standard string)) + (nat %amount)) + (pair %to + (nat %token_id) + (string %name) + (option %address address) + (nat %decimals) + (option %standard string))) + (timestamp %created_at) + (nat %side) + (nat %tolerance)) ; + IF_NONE { PUSH nat 157 ; FAILWITH } {} ; + PUSH mutez 0 ; + DUP 6 ; + TRANSFER_TOKENS ; + DUP 5 ; CAR ; CAR ; CAR ; - GET 5 ; + GET 8 ; IF_NONE - { DROP 2 ; PUSH nat 109 ; FAILWITH } - { DUP 3 ; - CAR ; - CAR ; - CAR ; - GET 8 ; - IF_NONE - { PUSH bool False } - { PUSH string "FA1.2 token" ; SWAP ; COMPARE ; EQ } ; - IF { DUP ; - CONTRACT %approve (pair (address %spender) (nat %value)) ; - IF_NONE { PUSH nat 157 ; FAILWITH } {} ; - PUSH mutez 0 ; - DUP 5 ; - CAR ; - CAR ; - CDR ; - DUP 5 ; - PAIR ; - TRANSFER_TOKENS } - { DUP 3 ; - CAR ; - CAR ; - CAR ; - GET 8 ; - IF_NONE - { PUSH bool False } - { PUSH string "FA2 token" ; SWAP ; COMPARE ; EQ } ; - IF { SELF_ADDRESS ; - DUP 2 ; - CONTRACT %add_operator - (pair (pair (address %operator) (address %owner)) (nat %token_id)) ; - IF_NONE { PUSH nat 157 ; FAILWITH } {} ; - PUSH mutez 0 ; - DUP 6 ; - CAR ; - CAR ; - CAR ; + { PUSH bool False } + { PUSH string "FA1.2 token" ; SWAP ; COMPARE ; EQ } ; + IF { DIG 2 ; DIG 3 ; DIG 4 ; DROP 3 ; NONE operation } + { DUP 5 ; + CAR ; + CAR ; + CAR ; + GET 8 ; + IF_NONE + { PUSH bool False } + { PUSH string "FA2 token" ; SWAP ; COMPARE ; EQ } ; + IF { SELF_ADDRESS ; + DIG 3 ; + CONTRACT %remove_operator + (pair (pair (address %operator) (address %owner)) (nat %token_id)) ; + IF_NONE { PUSH nat 157 ; FAILWITH } {} ; + PUSH mutez 0 ; + DIG 6 ; + CAR ; + CAR ; + CAR ; + CAR ; + DIG 3 ; + DIG 6 ; + PAIR ; + PAIR ; + TRANSFER_TOKENS ; + SOME } + { DIG 2 ; DIG 3 ; DIG 4 ; DROP 3 ; PUSH nat 108 ; FAILWITH } } ; + IF_NONE { NIL operation } { NIL operation ; SWAP ; CONS } ; + SWAP ; + CONS ; + SWAP ; + CONS } ; + SELF_ADDRESS ; + DUP 3 ; + CDR ; + CAR ; + CAR ; + CAR ; + DUP ; + GET 5 ; + IF_NONE { PUSH nat 101 ; FAILWITH } {} ; + DUP 2 ; + GET 8 ; + IF_NONE { PUSH nat 108 ; FAILWITH } {} ; + PUSH string "FA2 standard" ; + DUP 2 ; + COMPARE ; + EQ ; + IF { DIG 2 ; + DROP 2 ; + DUP 2 ; + CONTRACT %balance_response_fa12 nat ; + SWAP ; + CONTRACT %getbalance (pair (contract %callback nat) (address %owner)) ; + SWAP ; + IF_NONE + { DROP ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DROP ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; DUP 4 ; DIG 3 ; PAIR ; TRANSFER_TOKENS } } } + { PUSH string "FA1.2 standard" ; + SWAP ; + COMPARE ; + EQ ; + IF { DUP 3 ; + CONTRACT %balance_response_fa2 + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id)))) ; + SWAP ; + CONTRACT %balance_of + (pair (contract %callback + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id))))) + (list %requests (pair (address %owner) (nat %token_id)))) ; + SWAP ; + IF_NONE + { DROP 2 ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DROP 2 ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; + NIL (pair address nat) ; + DIG 4 ; CAR ; - DIG 3 ; DUP 6 ; PAIR ; - PAIR ; - TRANSFER_TOKENS } - { PUSH nat 108 ; FAILWITH } } ; - DUP 3 ; - CONTRACT %deposit - (pair (pair %swap - (pair %from - (pair %token - (nat %token_id) - (string %name) - (option %address address) - (nat %decimals) - (option %standard string)) - (nat %amount)) - (pair %to - (nat %token_id) - (string %name) - (option %address address) - (nat %decimals) - (option %standard string))) - (timestamp %created_at) - (nat %side) - (nat %tolerance)) ; - IF_NONE { PUSH nat 157 ; FAILWITH } {} ; - PUSH mutez 0 ; - DUP 6 ; - TRANSFER_TOKENS ; - DUP 5 ; - CAR ; - CAR ; - CAR ; - GET 8 ; - IF_NONE - { PUSH bool False } - { PUSH string "FA1.2 token" ; SWAP ; COMPARE ; EQ } ; - IF { DIG 2 ; DIG 3 ; DIG 4 ; DROP 3 ; NONE operation } - { DUP 5 ; - CAR ; - CAR ; - CAR ; - GET 8 ; - IF_NONE - { PUSH bool False } - { PUSH string "FA2 token" ; SWAP ; COMPARE ; EQ } ; - IF { SELF_ADDRESS ; - DIG 3 ; - CONTRACT %remove_operator - (pair (pair (address %operator) (address %owner)) (nat %token_id)) ; - IF_NONE { PUSH nat 157 ; FAILWITH } {} ; - PUSH mutez 0 ; - DIG 6 ; - CAR ; - CAR ; - CAR ; - CAR ; + CONS ; DIG 3 ; - DIG 6 ; PAIR ; - PAIR ; - TRANSFER_TOKENS ; - SOME } - { DIG 2 ; DIG 3 ; DIG 4 ; DROP 3 ; PUSH nat 108 ; FAILWITH } } ; - IF_NONE { NIL operation } { NIL operation ; SWAP ; CONS } ; - SWAP ; - CONS ; - SWAP ; - CONS } ; - PAIR } } } } - { DROP ; - PUSH mutez 1 ; - AMOUNT ; - COMPARE ; - LT ; - IF {} { PUSH nat 118 ; FAILWITH } ; - SENDER ; - DUP 2 ; - CDR ; - CDR ; - CDR ; - DUP ; - CAR ; - DUP 3 ; - MEM ; - IF { CDR ; - DUP 2 ; - GET ; - IF_NONE { NONE (pair (pair address nat) mutez) } { SOME } } - { DROP ; NONE (pair (pair address nat) mutez) } ; - IF_NONE - { DROP 4 ; PUSH nat 151 ; FAILWITH } - { UNPAIR ; - CDR ; - DUP 4 ; - CDR ; - CDR ; - CAR ; - INT ; - PUSH int 1 ; - SWAP ; - PAIR ; - DUP 2 ; - INT ; - PUSH int 1 ; - SWAP ; - PAIR ; - DUP 2 ; - CAR ; + TRANSFER_TOKENS } } } + { DROP 2 ; PUSH nat 108 ; FAILWITH } } ; + NIL operation ; + SWAP ; + CONS ; + DUP 4 ; + CAR ; + CDR ; + CAR ; + ITER { CDR ; + SWAP ; + DUP 2 ; + CAR ; + GET 5 ; + IF_NONE { PUSH nat 101 ; FAILWITH } {} ; + DUP 3 ; + CAR ; + GET 8 ; + IF_NONE { PUSH nat 108 ; FAILWITH } {} ; + PUSH string "FA2 standard" ; + DUP 2 ; + COMPARE ; + EQ ; + IF { DIG 3 ; + DROP 2 ; + DUP 3 ; + CONTRACT %balance_response_fa12 nat ; + SWAP ; + CONTRACT %getbalance (pair (contract %callback nat) (address %owner)) ; + SWAP ; + IF_NONE + { DROP ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DROP ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; DUP 5 ; DIG 3 ; PAIR ; TRANSFER_TOKENS } } } + { PUSH string "FA1.2 standard" ; + SWAP ; + COMPARE ; + EQ ; + IF { DUP 4 ; + CONTRACT %balance_response_fa2 + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id)))) ; + SWAP ; + CONTRACT %balance_of + (pair (contract %callback + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id))))) + (list %requests (pair (address %owner) (nat %token_id)))) ; + SWAP ; + IF_NONE + { DIG 2 ; DROP 2 ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DIG 2 ; DROP 2 ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; + NIL (pair address nat) ; + DIG 5 ; + CAR ; + CAR ; + DUP 7 ; + PAIR ; + CONS ; + DIG 3 ; + PAIR ; + TRANSFER_TOKENS } } } + { DIG 2 ; DROP 2 ; PUSH nat 108 ; FAILWITH } } ; + CONS } ; + SWAP ; + DROP ; + NIL operation ; + SWAP ; + ITER { CONS } ; + SWAP ; + NIL operation ; + SWAP ; + ITER { CONS } ; + ITER { CONS } ; + NIL operation ; + SWAP ; + ITER { CONS } ; + PAIR } } + { DROP ; + PUSH mutez 1 ; + AMOUNT ; + COMPARE ; + LT ; + IF {} { PUSH nat 118 ; FAILWITH } ; + SENDER ; DUP 2 ; CDR ; - MUL ; - DIG 2 ; CDR ; - DIG 2 ; - CAR ; - MUL ; - PAIR ; - EMPTY_MAP string (pair (pair nat string (option address) nat (option string)) nat) ; - DUP 6 ; CDR ; - CAR ; + DUP ; CAR ; DUP 3 ; - PAIR 3 ; - DUP 7 ; - SWAP ; - EXEC ; - UNPAIR ; - SWAP ; - EMPTY_MAP string (pair (pair nat string (option address) nat (option string)) nat) ; - DIG 3 ; - PAIR ; - PAIR ; - DUP 6 ; - CAR ; - CDR ; - CAR ; - ITER { CDR ; - SWAP ; - UNPAIR ; - UNPAIR ; - DIG 2 ; - DIG 3 ; - DUP 3 ; - PAIR 3 ; - DUP 9 ; - SWAP ; - EXEC ; - UNPAIR ; - DIG 3 ; - SWAP ; - PAIR ; - DUP 10 ; - SWAP ; - EXEC ; - DIG 2 ; - PAIR ; - PAIR } ; - DIG 6 ; - DIG 7 ; - DROP 2 ; - UNPAIR ; - CDR ; - DUP 7 ; - CDR ; - CDR ; - CAR ; - DUP 5 ; - COMPARE ; - GT ; - IF { SWAP ; DIG 2 ; DIG 3 ; DIG 6 ; DROP 5 ; PUSH nat 154 ; FAILWITH } - { DIG 3 ; - DUP 7 ; - CDR ; - CDR ; - CAR ; - SUB ; - ABS ; - DIG 2 ; - DUP 7 ; - DIG 7 ; - CDR ; - DUP ; - CAR ; - DIG 6 ; - UPDATE 1 ; - UPDATE 1 ; - UPDATE 2 ; - DUP ; - CAR ; - DUP ; - CDR ; - DIG 5 ; - UPDATE 1 ; - UPDATE 2 ; - UPDATE 1 ; - DUP ; - CDR ; - DUP ; - CDR ; - DIG 4 ; - UPDATE 1 ; - UPDATE 2 ; - UPDATE 2 ; - PAIR } ; - UNPAIR ; - DUP 4 ; - CONTRACT unit ; - IF_NONE { PUSH nat 102 ; FAILWITH } { DUP 4 ; UNIT ; TRANSFER_TOKENS } ; - SELF_ADDRESS ; - NIL operation ; - DIG 4 ; - ITER { CDR ; - DUP ; - CAR ; - GET 5 ; - IF_NONE - { DROP ; PUSH nat 109 ; FAILWITH } - { DUP 2 ; + MEM ; + IF { CDR ; + DUP 2 ; + GET ; + IF_NONE { NONE (pair (pair address nat) mutez) } { SOME } } + { DROP ; NONE (pair (pair address nat) mutez) } ; + IF_NONE + { DROP 4 ; PUSH nat 151 ; FAILWITH } + { UNPAIR ; + CDR ; + DUP 4 ; + CDR ; + CDR ; + CAR ; + INT ; + PUSH int 1 ; + SWAP ; + PAIR ; + DUP 2 ; + INT ; + PUSH int 1 ; + SWAP ; + PAIR ; + DUP 2 ; + CAR ; + DUP 2 ; + CDR ; + MUL ; + DIG 2 ; + CDR ; + DIG 2 ; + CAR ; + MUL ; + PAIR ; + DUP 5 ; + CDR ; + CAR ; + CAR ; + DUP ; + CDR ; + INT ; + PUSH int 1 ; + SWAP ; + PAIR ; + DUP ; + CDR ; + DUP 4 ; + CDR ; + MUL ; + SWAP ; + CAR ; + DUP 4 ; + CAR ; + MUL ; + PAIR ; + PUSH int 0 ; + DUP 2 ; + CAR ; + COMPARE ; + LT ; + IF { PUSH int -1 ; DUP 2 ; CDR ; MUL ; PUSH int -1 ; DIG 2 ; CAR ; MUL ; PAIR } + {} ; + DUP ; + CDR ; + PUSH nat 1 ; + PUSH nat 0 ; + PUSH nat 10 ; + PAIR ; + PAIR ; + LEFT nat ; + LOOP_LEFT + { UNPAIR ; + UNPAIR ; + PUSH nat 0 ; + DUP 3 ; + COMPARE ; + EQ ; + IF { DROP 2 ; RIGHT (pair (pair nat nat) nat) } + { PUSH nat 1 ; + PUSH nat 1 ; + DUP 4 ; + AND ; + COMPARE ; + EQ ; + IF { DUP ; DIG 3 ; MUL } { DIG 2 } ; + PUSH nat 1 ; + DIG 3 ; + LSR ; + DUP 3 ; + DIG 3 ; + MUL ; + PAIR ; + PAIR ; + LEFT nat } } ; + DIG 2 ; + CAR ; + MUL ; + EDIV ; + IF_NONE { PUSH string "DIV by 0" ; FAILWITH } {} ; + CAR ; + ISNAT ; + IF_NONE { PUSH nat 119 ; FAILWITH } {} ; + DUP 2 ; + CDR ; + DUP 2 ; + COMPARE ; + GT ; + IF { DROP 2 ; PUSH nat 153 ; FAILWITH } + { DUP ; + DUP 3 ; + CDR ; + INT ; + SUB ; + ABS ; + DUP 3 ; + DIG 2 ; + UPDATE 2 ; + PUSH nat 0 ; + DUP 2 ; + CDR ; + COMPARE ; + EQ ; + IF { DROP ; DUP 9 } { DUP 10 ; SWAP ; PAIR ; DUP 9 ; SWAP ; EXEC } ; + DUG 2 ; + UPDATE 2 ; + PAIR } ; + UNPAIR ; + SWAP ; + DIG 8 ; + DIG 3 ; + PAIR ; + PAIR ; + DUP 6 ; + CAR ; + CDR ; + CAR ; + ITER { CDR ; + SWAP ; + UNPAIR ; + UNPAIR ; + DUP 4 ; + CDR ; + INT ; + PUSH int 1 ; + SWAP ; + PAIR ; + DUP ; + CDR ; + DUP 3 ; + CDR ; + MUL ; + SWAP ; CAR ; - GET 8 ; - IF_NONE - { DROP 2 ; PUSH nat 108 ; FAILWITH } - { PUSH string "FA1.2 token" ; - DUP 2 ; + DUP 3 ; + CAR ; + MUL ; + PAIR ; + PUSH int 0 ; + DUP 2 ; + CAR ; + COMPARE ; + LT ; + IF { PUSH int -1 ; DUP 2 ; CDR ; MUL ; PUSH int -1 ; DIG 2 ; CAR ; MUL ; PAIR } + {} ; + DUP ; + CDR ; + PUSH nat 1 ; + PUSH nat 0 ; + PUSH nat 10 ; + PAIR ; + PAIR ; + LEFT nat ; + LOOP_LEFT + { UNPAIR ; + UNPAIR ; + PUSH nat 0 ; + DUP 3 ; COMPARE ; EQ ; - IF { DROP ; - CONTRACT %transfer (pair (address %from) (address %to) (nat %value)) ; - IF_NONE { PUSH nat 101 ; FAILWITH } {} ; - PUSH mutez 0 ; - DIG 2 ; - CDR ; - DUP 9 ; - DUP 6 ; - PAIR 3 ; - TRANSFER_TOKENS } - { PUSH string "FA2 token" ; - SWAP ; + IF { DROP 2 ; RIGHT (pair (pair nat nat) nat) } + { PUSH nat 1 ; + PUSH nat 1 ; + DUP 4 ; + AND ; COMPARE ; EQ ; - IF { CONTRACT %transfer - (list (pair (address %from_) (list %tx (pair (address %to_) (nat %token_id) (nat %amount))))) ; - IF_NONE { PUSH nat 101 ; FAILWITH } {} ; - PUSH mutez 0 ; - NIL (pair address (list (pair address nat nat))) ; - NIL (pair address nat nat) ; - DUP 5 ; - CDR ; - DIG 5 ; - CAR ; - CAR ; - DUP 12 ; - PAIR 3 ; - CONS ; - DUP 6 ; - PAIR ; - CONS ; - TRANSFER_TOKENS } - { DROP 2 ; PUSH nat 108 ; FAILWITH } } } } ; - CONS } ; - SWAP ; - DROP ; - DUP 3 ; - DUP 4 ; - CDR ; - DUP ; - CDR ; - DIG 5 ; - CDR ; - CDR ; - CDR ; - DUP ; - CAR ; - DUP 9 ; - MEM ; - IF { DUP ; - CDR ; - DIG 8 ; - NONE (pair (pair address nat) mutez) ; - SWAP ; - UPDATE ; - UPDATE 2 } - { DIG 7 ; DROP } ; - UPDATE 2 ; - UPDATE 2 ; - UPDATE 2 ; - PUSH mutez 0 ; - DIG 4 ; - COMPARE ; - GT ; - IF { SWAP ; DIG 2 ; CONS } { DIG 2 ; DROP ; SWAP } ; - PAIR } } } ; + IF { DUP ; DIG 3 ; MUL } { DIG 2 } ; + PUSH nat 1 ; + DIG 3 ; + LSR ; + DUP 3 ; + DIG 3 ; + MUL ; + PAIR ; + PAIR ; + LEFT nat } } ; + DIG 2 ; + CAR ; + MUL ; + EDIV ; + IF_NONE { PUSH string "DIV by 0" ; FAILWITH } {} ; + CAR ; + ISNAT ; + IF_NONE { PUSH nat 119 ; FAILWITH } {} ; + DUP 5 ; + CDR ; + DUP 2 ; + COMPARE ; + GT ; + IF { DIG 3 ; DIG 4 ; DROP 3 ; PUSH nat 153 ; FAILWITH } + { DUP ; + DUP 6 ; + CDR ; + INT ; + SUB ; + ABS ; + DUP 6 ; + DIG 2 ; + UPDATE 2 ; + PUSH nat 0 ; + DUP 2 ; + CDR ; + COMPARE ; + EQ ; + IF { DROP ; DIG 3 } { DIG 4 ; SWAP ; PAIR ; DUP 11 ; SWAP ; EXEC } ; + DIG 4 ; + DIG 2 ; + UPDATE 2 ; + PAIR } ; + UNPAIR ; + DIG 3 ; + SWAP ; + PAIR ; + DUP 9 ; + SWAP ; + EXEC ; + DIG 2 ; + PAIR ; + PAIR } ; + DIG 6 ; + DROP ; + UNPAIR ; + CDR ; + DUP 7 ; + CDR ; + CDR ; + CAR ; + DUP 5 ; + COMPARE ; + GT ; + IF { SWAP ; DIG 2 ; DIG 3 ; DIG 6 ; DROP 5 ; PUSH nat 154 ; FAILWITH } + { DIG 3 ; + DUP 7 ; + CDR ; + CDR ; + CAR ; + SUB ; + ABS ; + DIG 2 ; + DUP 7 ; + DIG 7 ; + CDR ; + DUP ; + CAR ; + DIG 6 ; + UPDATE 1 ; + UPDATE 1 ; + UPDATE 2 ; + DUP ; + CAR ; + DUP ; + CDR ; + DIG 5 ; + UPDATE 1 ; + UPDATE 2 ; + UPDATE 1 ; + DUP ; + CDR ; + DUP ; + CDR ; + DIG 4 ; + UPDATE 1 ; + UPDATE 2 ; + UPDATE 2 ; + PAIR } ; + UNPAIR ; + DUP 4 ; + CONTRACT unit ; + IF_NONE { PUSH nat 102 ; FAILWITH } { DUP 4 ; UNIT ; TRANSFER_TOKENS } ; + SELF_ADDRESS ; + NIL operation ; + DIG 4 ; + ITER { CDR ; + DUP ; + CAR ; + GET 5 ; + IF_NONE + { DROP ; PUSH nat 109 ; FAILWITH } + { DUP 2 ; + CAR ; + GET 8 ; + IF_NONE + { DROP 2 ; PUSH nat 108 ; FAILWITH } + { PUSH string "FA1.2 token" ; + DUP 2 ; + COMPARE ; + EQ ; + IF { DROP ; + CONTRACT %transfer (pair (address %from) (address %to) (nat %value)) ; + IF_NONE { PUSH nat 101 ; FAILWITH } {} ; + PUSH mutez 0 ; + DIG 2 ; + CDR ; + DUP 9 ; + DUP 6 ; + PAIR 3 ; + TRANSFER_TOKENS } + { PUSH string "FA2 token" ; + SWAP ; + COMPARE ; + EQ ; + IF { CONTRACT %transfer + (list (pair (address %from_) (list %tx (pair (address %to_) (nat %token_id) (nat %amount))))) ; + IF_NONE { PUSH nat 101 ; FAILWITH } {} ; + PUSH mutez 0 ; + NIL (pair address (list (pair address nat nat))) ; + NIL (pair address nat nat) ; + DUP 5 ; + CDR ; + DIG 5 ; + CAR ; + CAR ; + DUP 12 ; + PAIR 3 ; + CONS ; + DUP 6 ; + PAIR ; + CONS ; + TRANSFER_TOKENS } + { DROP 2 ; PUSH nat 108 ; FAILWITH } } } } ; + CONS } ; + SWAP ; + DROP ; + DUP 3 ; + CDR ; + CDR ; + CDR ; + SELF_ADDRESS ; + DUP 5 ; + CDR ; + CAR ; + CAR ; + CAR ; + DUP ; + GET 5 ; + IF_NONE { PUSH nat 101 ; FAILWITH } {} ; + DUP 2 ; + GET 8 ; + IF_NONE { PUSH nat 108 ; FAILWITH } {} ; + PUSH string "FA2 standard" ; + DUP 2 ; + COMPARE ; + EQ ; + IF { DIG 2 ; + DROP 2 ; + DUP 2 ; + CONTRACT %balance_response_fa12 nat ; + SWAP ; + CONTRACT %getbalance (pair (contract %callback nat) (address %owner)) ; + SWAP ; + IF_NONE + { DROP ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DROP ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; DUP 4 ; DIG 3 ; PAIR ; TRANSFER_TOKENS } } } + { PUSH string "FA1.2 standard" ; + SWAP ; + COMPARE ; + EQ ; + IF { DUP 3 ; + CONTRACT %balance_response_fa2 + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id)))) ; + SWAP ; + CONTRACT %balance_of + (pair (contract %callback + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id))))) + (list %requests (pair (address %owner) (nat %token_id)))) ; + SWAP ; + IF_NONE + { DROP 2 ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DROP 2 ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; + NIL (pair address nat) ; + DIG 4 ; + CAR ; + DUP 6 ; + PAIR ; + CONS ; + DIG 3 ; + PAIR ; + TRANSFER_TOKENS } } } + { DROP 2 ; PUSH nat 108 ; FAILWITH } } ; + NIL operation ; + SWAP ; + CONS ; + DUP 6 ; + CAR ; + CDR ; + CAR ; + ITER { CDR ; + SWAP ; + DUP 2 ; + CAR ; + GET 5 ; + IF_NONE { PUSH nat 101 ; FAILWITH } {} ; + DUP 3 ; + CAR ; + GET 8 ; + IF_NONE { PUSH nat 108 ; FAILWITH } {} ; + PUSH string "FA2 standard" ; + DUP 2 ; + COMPARE ; + EQ ; + IF { DIG 3 ; + DROP 2 ; + DUP 3 ; + CONTRACT %balance_response_fa12 nat ; + SWAP ; + CONTRACT %getbalance (pair (contract %callback nat) (address %owner)) ; + SWAP ; + IF_NONE + { DROP ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DROP ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; DUP 5 ; DIG 3 ; PAIR ; TRANSFER_TOKENS } } } + { PUSH string "FA1.2 standard" ; + SWAP ; + COMPARE ; + EQ ; + IF { DUP 4 ; + CONTRACT %balance_response_fa2 + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id)))) ; + SWAP ; + CONTRACT %balance_of + (pair (contract %callback + (list (pair (nat %balance) (pair %request (address %owner) (nat %token_id))))) + (list %requests (pair (address %owner) (nat %token_id)))) ; + SWAP ; + IF_NONE + { DIG 2 ; DROP 2 ; PUSH nat 169 ; FAILWITH } + { SWAP ; + IF_NONE + { DIG 2 ; DROP 2 ; PUSH nat 170 ; FAILWITH } + { PUSH mutez 0 ; + NIL (pair address nat) ; + DIG 5 ; + CAR ; + CAR ; + DUP 7 ; + PAIR ; + CONS ; + DIG 3 ; + PAIR ; + TRANSFER_TOKENS } } } + { DIG 2 ; DROP 2 ; PUSH nat 108 ; FAILWITH } } ; + CONS } ; + SWAP ; + DROP ; + NIL operation ; + SWAP ; + ITER { CONS } ; + PUSH mutez 0 ; + DIG 6 ; + COMPARE ; + GT ; + IF { DIG 2 ; DIG 3 ; CONS } { DIG 3 ; DROP ; DIG 2 } ; + NIL operation ; + SWAP ; + ITER { CONS } ; + ITER { CONS } ; + NIL operation ; + SWAP ; + ITER { CONS } ; + DUP 3 ; + DIG 3 ; + CDR ; + DUP ; + CDR ; + DUP 5 ; + CAR ; + DUP 7 ; + MEM ; + IF { DUP 5 ; + DIG 5 ; + CDR ; + DIG 6 ; + NONE (pair (pair address nat) mutez) ; + SWAP ; + UPDATE ; + UPDATE 2 } + { DIG 5 ; DROP ; DIG 4 } ; + UPDATE 2 ; + UPDATE 2 ; + UPDATE 2 ; + SWAP ; + PAIR } } } } ; view "get_native_token_of_vault" unit (pair (nat %token_id) @@ -1114,23 +1750,5 @@ (option %address address) (nat %decimals) (option %standard string)) - { CDR ; CDR ; CAR ; CAR ; CAR } ; - view "get_vault_balances" - unit - (pair (pair (pair %token - (nat %token_id) - (string %name) - (option %address address) - (nat %decimals) - (option %standard string)) - (nat %amount)) - (map string - (pair (pair %token - (nat %token_id) - (string %name) - (option %address address) - (nat %decimals) - (option %standard string)) - (nat %amount)))) - { CDR ; DUP ; CAR ; CDR ; CAR ; SWAP ; CDR ; CAR ; CAR ; PAIR } } + { CDR ; CDR ; CAR ; CAR ; CAR } } diff --git a/batcher/types.mligo b/batcher/types.mligo index c2acb3c2..3b259321 100644 --- a/batcher/types.mligo +++ b/batcher/types.mligo @@ -618,3 +618,24 @@ type liquidity_injection_request = { to_token:token; amount:nat; } + +type balance_of_request = { + owner: address; + token_id: nat; +} + +type balance_of_response = { + request: balance_of_request; + balance: nat; +} + +type balance_of_param = { + requests: balance_of_request list; + callback: (balance_of_response list) contract; +} + + + + + + diff --git a/batcher/utils.mligo b/batcher/utils.mligo index fa041207..6829988f 100644 --- a/batcher/utils.mligo +++ b/batcher/utils.mligo @@ -317,10 +317,10 @@ let scale_on_receive_for_token_precision_difference let assert_some_or_fail_with (type a) (an_opt: a option) - (error: nat) = + (error: nat) : a = match an_opt with | None -> failwith error - | Some _ -> () + | Some v -> v let assert_or_fail_with (predicate: bool) @@ -1054,4 +1054,53 @@ let send_add_reward | None -> failwith entrypoint_does_not_exist in Tezos.transaction amount amount rew_req_ent - + +[@inline] + let getfa2tokenbalance + (owner: address) + (callback: address) + (token_id: nat) + (token_addr: address) : operation = + let balance_req = { + owner= owner; + token_id = token_id; + } in + let cb_opt : balance_of_response list contract option = Tezos.get_entrypoint_opt "%balance_response_fa2" callback in + let bo_opt : balance_of_param contract option = Tezos.get_entrypoint_opt "%balance_of" token_addr in + match cb_opt,bo_opt with + | None, _ -> failwith unable_to_get_response_entrypoint_from_vault + | _, None -> failwith unable_to_get_balance_of_entrypoint_from_token + | Some cb, Some bo -> let bp = { + requests = [ balance_req ]; + callback = cb; + } in + Tezos.transaction bp 0mutez bo + +[@inline] + let getfa12tokenbalance + (owner: address) + (callback: address) + (token_addr: address) : operation = + let cb_opt: nat contract option = Tezos.get_entrypoint_opt "%balance_response_fa12" callback in + let bo_opt = Tezos.get_entrypoint_opt "%getbalance" token_addr in + match cb_opt,bo_opt with + | None, _ -> failwith unable_to_get_response_entrypoint_from_vault + | _, None -> failwith unable_to_get_balance_of_entrypoint_from_token + | Some cb, Some bo -> let br = { + owner = owner; + callback = cb; + } in + Tezos.transaction br 0mutez bo + + [@inline] + let gettokenbalance + (owner: address) + (callback: address) + (token_id: nat) + (token_addr_opt: address option) + (token_standard_opt: string option) : operation = + let token_addr = assert_some_or_fail_with token_addr_opt invalid_token_address in + let token_standard = assert_some_or_fail_with token_standard_opt token_standard_not_found in + if token_standard = "FA2 standard" then getfa12tokenbalance owner callback token_addr else + if token_standard = "FA1.2 standard" then getfa2tokenbalance owner callback token_id token_addr else + failwith token_standard_not_found diff --git a/batcher/vault.mligo b/batcher/vault.mligo index 989e3e75..05d79c27 100644 --- a/batcher/vault.mligo +++ b/batcher/vault.mligo @@ -22,14 +22,34 @@ type result = operation list * storage [@inline] let no_op (s : storage) : result = (([] : operation list), s) + +[@inline] +let assert_balances + (storage:storage) : operation list = + let vault_address = Tezos.get_self_address () in + let nta = storage.native_token in + let nt = nta.token in + let ft = storage.foreign_tokens in + let ntop = gettokenbalance vault_address vault_address nt.token_id nt.address nt.standard in + let trigger_balance_update (ops,(_name,ta): (operation list * (string * token_amount))) : operation list = + (gettokenbalance vault_address vault_address ta.token.token_id ta.token.address ta.token.standard) :: ops + in + Map.fold trigger_balance_update ft [ ntop ] + + + + [@inline] let deposit (deposit_address : address) - (deposited_token : token_amount) : operation list = + (deposited_token : token_amount) + (storage:storage): operation list = let treasury_vault = get_vault () in let deposit_op = Treasury_Utils.handle_transfer deposit_address treasury_vault deposited_token in - [ deposit_op] + let bal_ops = assert_balances storage in + deposit_op :: bal_ops +[@inline] let find_liquidity_amount (rate:exchange_rate) (total_liquidity:nat) @@ -39,6 +59,7 @@ let find_liquidity_amount let resolved_equiv_vol = get_rounded_number_lower_bound equiv_vol in if total_liquidity > resolved_equiv_vol then resolved_equiv_vol else total_liquidity +[@inline] let create_liq_order (bn:nat) (non:nat) @@ -65,6 +86,7 @@ let create_liq_order redeemed = false; } +[@inline] let add_or_update_liquidity (holder: address) (token_amount: token_amount) @@ -89,6 +111,7 @@ let add_or_update_liquidity native_token = native_token; } +[@inline] let collect_from_vault (perc_share: Rational.t) (ta: token_amount) @@ -103,6 +126,7 @@ let collect_from_vault let tam = if ta_red.amount = 0n then tam else TokenAmountMap.increase ta_red tam in (ta_rem, tam) +[@inline] let collect_tokens_for_redemption (perc_share: Rational.t) (shares: nat) @@ -120,6 +144,7 @@ let collect_tokens_for_redemption let rem_shares = abs (storage.total_shares - shares) in ({ storage with native_token = native; foreign_tokens = foreign_tokens; total_shares = rem_shares;} ,tokens) +[@inline] let remove_liquidity_from_market_maker (holder: address) (storage: storage): ( operation list * storage) = @@ -134,10 +159,13 @@ let remove_liquidity_from_market_maker let treasury_vault = get_vault () in let tok_ops = Treasury_Utils.transfer_holdings treasury_vault holder tam in let vault_holdings = VaultHoldings.remove holder storage.vault_holdings in - let ops: operation list =if unclaimed_tez > 0mutez then tez_op :: tok_ops else tok_ops in + let bal_ops = assert_balances storage in + let trans_ops: operation list =if unclaimed_tez > 0mutez then tez_op :: tok_ops else tok_ops in + let ops = concatlo trans_ops bal_ops in let storage = { storage with vault_holdings = vault_holdings; } in (ops, storage) +[@inline] let claim_from_holding (holding: vault_holding) (storage: storage) : (operation list * storage) = @@ -164,10 +192,9 @@ let add_liquidity let () = reject_if_tez_supplied () in let holder = Tezos.get_sender () in let token_amount = { storage.native_token with amount = amount; } in - let ops = deposit holder token_amount in + let ops = deposit holder token_amount storage in let storage = add_or_update_liquidity holder token_amount storage in ops,storage - (* Add Liquidity into a market vault *) [@inline] @@ -232,7 +259,9 @@ let inject_liquidity let () = is_known_sender storage.marketmaker sender_not_marketmaker in let () = reject_if_tez_supplied () in let o = construct_order lir.side lir.from_token lir.to_token lir.amount in - let ops = execute_deposit o storage.batcher in + let dep_ops = execute_deposit o storage.batcher in + let bal_ops = assert_balances storage in + let ops = concatlo dep_ops bal_ops in ops, storage [@inline] @@ -274,22 +303,70 @@ let change_tokenmanager_address let storage = { storage with tokenmanager = new_tokenmanager_address; } in no_op storage +[@inline] +let update_native_token_balance + (token_address: address) + (amount:nat) + (token_id: nat) + (storage:storage): storage = + let nta = assert_some_or_fail_with storage.native_token.token.address invalid_token_address in + if nta = token_address && storage.native_token.token.token_id = token_id then + let nt = { storage.native_token with amount=amount;} in + { storage with native_token = nt;} + else + storage + +[@inline] +let update_foreign_token_balances + (token_address: address) + (amount:nat) + (token_id: nat) + (storage:storage): storage = + let fts = storage.foreign_tokens in + let update_bals (fts, (_name,ta): token_amount_map * (string * token_amount)) : token_amount_map = + let ta_addr = assert_some_or_fail_with ta.token.address invalid_token_address in + if ta_addr = token_address && ta.token.token_id = token_id then + let ta = {ta with amount = amount;} in + Map.update ta.token.name (Some ta) fts + else + fts + in + let fts = Map.fold update_bals fts fts in + { storage with foreign_tokens = fts; } + +[@inline] +let process_balance_response_fa12 + (amount: nat) + (storage:storage): result = + let token_contract = Tezos.get_sender () in + let storage = update_native_token_balance token_contract amount 0n storage in + let storage = update_foreign_token_balances token_contract amount 0n storage in + no_op storage + +[@inline] +let process_balance_response_fa2 + (r: balance_of_response) + (storage:storage): result = + let token_contract = Tezos.get_sender () in + let amount = r.balance in + let token_id = r.request.token_id in + let storage = update_native_token_balance token_contract amount token_id storage in + let storage = update_foreign_token_balances token_contract amount token_id storage in + no_op storage end [@view] let get_native_token_of_vault ((),storage: unit * Vault.storage) : token = storage.native_token.token -(* TODO - Need to verify on-chain data for token balances prior to returning balances *) -[@view] -let get_vault_balances ((),storage: unit * Vault.storage) : (token_amount * token_amount_map) = (storage.native_token, storage.foreign_tokens) - type entrypoint = | AddLiquidity of nat | RemoveLiquidity | Claim | AddReward of tez | InjectLiquidity of liquidity_injection_request + | Balance_response_fa2 of balance_of_response + | Balance_response_fa12 of nat | Change_admin_address of address | Change_batcher_address of address | Change_marketmaker_address of address @@ -306,6 +383,9 @@ let main | AddReward r -> Vault.add_reward r storage (* MarketMaker endpoints *) | InjectLiquidity lir -> Vault.inject_liquidity lir storage + (* Balance endpoints *) + | Balance_response_fa2 r -> Vault.process_balance_response_fa2 r storage + | Balance_response_fa12 r -> Vault.process_balance_response_fa12 r storage (* Admin endpoints *) | Change_admin_address new_admin_address -> Vault.change_admin_address new_admin_address storage | Change_batcher_address new_batcher_address -> Vault.change_batcher_address new_batcher_address storage