x
685
1163
{ parameter (or (or (or (address %change_admin) (nat %change_threshold)) (or (key %add_owner) (key %remove_owner))) (or (or (pair %create (pair %params_c (string %eh_token_addr) (bytes %contract_metadata) (pair %token_ma (bytes %na) (bytes %de) (bytes %sy))) (bytes %signatures)) (pair %wrap (pair %params_w (string %eth_id) (string %eth_token_addr) (address %user_addr) (nat %amount)) (bytes %signatures))) (pair %unwrap (address %tz_addr) (pair (nat %tz_at) (string %eth_addr))))) ; storage (pair (address %admin) (nat %threshold) (pair %owners (big_map %values key (pair (nat %index) (unit %value))) (big_map %keys nat key) (nat %size)) (big_map %nonces address nat) (big_map %ids bytes timestamp) (big_map %eth_to_tez string address) (big_map %tez_to_eth address string) (big_map %processed_id string timestamp)) ; code { LAMBDA (pair (pair (big_map key (pair nat unit)) (big_map nat key) nat) nat bytes bytes) bool { UNPAIR 4 ; PUSH unit Unit ; DUP 3 ; PUSH nat 65 ; MUL ; DUP 6 ; SIZE ; COMPARE ; EQ ; NOT ; IF { PUSH string "NOT_ENOUGH_SIGNATURES" ; FAILWITH } {} ; EMPTY_MAP key bool ; PUSH nat 0 ; PUSH nat 0 ; DUP 6 ; DUP 2 ; COMPARE ; LT ; LOOP { DUP 8 ; PUSH nat 65 ; PUSH nat 65 ; DUP 4 ; MUL ; SLICE ; DUP ; IF_NONE { PUSH bool False ; NOT ; IF { PUSH string "SIGNATURE_SLICING_FAILED" ; FAILWITH } {} } { DUP ; UNPACK signature ; DUP ; IF_NONE { PUSH bool False ; NOT ; IF { PUSH string "NOT_ENOUGH_SIGNATURES" ; FAILWITH } {} } { PUSH bool False ; DUP 10 ; DUP ; GET 4 ; PUSH nat 1 ; DUP 2 ; DUP 2 ; COMPARE ; LE ; LOOP { DUP 3 ; GET 3 ; DUP 2 ; GET ; IF_NONE { PUSH string "NOT_FOUND" ; FAILWITH } {} ; DUP 4 ; GET 1 ; DUP 2 ; GET ; IF_NONE { PUSH string "NOT_FOUND" ; FAILWITH } {} ; CDR ; DUP 6 ; NOT ; IF { DUP 13 ; DUP 3 ; MEM ; NOT ; IF { DUP 17 ; DUP 8 ; DUP 4 ; CHECK_SIGNATURE ; IF { DIG 12 ; PUSH bool True ; SOME ; DUP 4 ; UPDATE ; DUG 12 } {} } {} } {} ; PUSH nat 1 ; DUP 13 ; ADD ; DIP 1 { DIG 11 ; DROP 1 } ; DUG 11 ; PUSH bool True ; DIP 1 { DIG 5 ; DROP 1 } ; DUG 5 ; DROP 2 ; PUSH nat 1 ; DUP 2 ; ADD ; SWAP ; DROP 1 ; DUP 2 ; DUP 2 ; COMPARE ; LE } ; DROP 5 } ; DROP 2 } ; PUSH nat 1 ; DUP 3 ; ADD ; DIP 1 { SWAP ; DROP 1 } ; SWAP ; DROP 1 ; DUP 6 ; DUP 2 ; COMPARE ; LT } ; DUP 6 ; DUP 3 ; COMPARE ; GE ; IF { PUSH bool True } { PUSH bool False } ; DIP 1 { DIG 3 ; DROP 1 } ; DUG 3 ; DROP 3 ; DUG 4 ; DROP 4 } ; NIL operation ; DIG 2 ; UNPAIR ; DIP 1 { UNPAIR 8 } ; IF_LEFT { IF_LEFT { IF_LEFT { DUP 2 ; SENDER ; COMPARE ; EQ ; NOT ; IF { PUSH string "INVALID_CALLER" ; FAILWITH } {} ; PUSH mutez 0 ; AMOUNT ; COMPARE ; EQ ; NOT ; IF { PUSH string "NO_TRANSFER" ; FAILWITH } {} ; DUP ; DIP 1 { SWAP ; DROP 1 } ; SWAP ; DROP 1 ; PAIR 8 ; SWAP ; PAIR } { DUP 2 ; SENDER ; COMPARE ; EQ ; NOT ; IF { PUSH string "INVALID_CALLER" ; FAILWITH } {} ; PUSH mutez 0 ; AMOUNT ; COMPARE ; EQ ; NOT ; IF { PUSH string "NO_TRANSFER" ; FAILWITH } {} ; PUSH nat 0 ; DUP 2 ; COMPARE ; GT ; NOT ; IF { PUSH string "THRESHOLD_MUST_BE_GREATER_THAN_ZERO" ; FAILWITH } {} ; DUP ; DIP 1 { DIG 2 ; DROP 1 } ; DUG 2 ; DROP 1 ; PAIR 8 ; SWAP ; PAIR } } { IF_LEFT { DUP 2 ; SENDER ; COMPARE ; EQ ; NOT ; IF { PUSH string "INVALID_CALLER" ; FAILWITH } {} ; PUSH mutez 0 ; AMOUNT ; COMPARE ; EQ ; NOT ; IF { PUSH string "NO_TRANSFER" ; FAILWITH } {} ; DUP 4 ; GET 1 ; DUP 2 ; MEM ; IF { PUSH string "OWNER_ALREADY_EXISTS" ; FAILWITH } {} ; DUP 4 ; PUSH nat 1 ; DUP 2 ; GET 4 ; ADD ; DUP 2 ; GET 1 ; DUP 4 ; GET ; IF_NONE { DUP 2 ; DUP 2 ; UPDATE 4 ; DIP 1 { SWAP ; DROP 1 } ; SWAP ; DUP 2 ; DUP 3 ; GET 3 ; DUP 5 ; SOME ; DUP 5 ; GET 4 ; UPDATE ; UPDATE 3 ; DIP 1 { SWAP ; DROP 1 } ; SWAP } { DUP ; GET 1 ; DIP 1 { SWAP ; DROP 1 } ; SWAP ; DROP 1 } ; DUP 2 ; DUP 3 ; GET 1 ; PUSH unit Unit ; DUP 4 ; PAIR ; SOME ; DUP 6 ; UPDATE ; UPDATE 1 ; DIP 1 { SWAP ; DROP 1 } ; SWAP ; DUP 2 ; DIP 1 { DIG 5 ; DROP 1 } ; DUG 5 ; DROP 3 ; PAIR 8 ; SWAP ; PAIR } { DUP 2 ; SENDER ; COMPARE ; EQ ; NOT ; IF { PUSH string "INVALID_CALLER" ; FAILWITH } {} ; PUSH mutez 0 ; AMOUNT ; COMPARE ; EQ ; NOT ; IF { PUSH string "NO_TRANSFER" ; FAILWITH } {} ; DUP 4 ; GET 1 ; DUP 2 ; MEM ; NOT ; IF { PUSH string "OWNER_NOT_FOUND" ; FAILWITH } {} ; DUP 4 ; DUP ; GET 1 ; DUP 3 ; GET ; IF_NONE {} { DUP ; GET 1 ; DUP 3 ; GET 3 ; DUP 4 ; GET 4 ; GET ; IF_NONE { PUSH string "NOT_FOUND" ; FAILWITH } {} ; DUP 4 ; GET 1 ; DUP 2 ; GET ; IF_NONE { PUSH string "NOT_FOUND" ; FAILWITH } {} ; DUP 5 ; DUP 6 ; GET 3 ; DUP 4 ; SOME ; DUP 6 ; UPDATE ; UPDATE 3 ; DIP 1 { DIG 4 ; DROP 1 } ; DUG 4 ; DUP 5 ; DUP 6 ; GET 1 ; DUP 3 ; GET 2 ; DUP 6 ; PAIR ; SOME ; DUP 5 ; UPDATE ; UPDATE 1 ; DIP 1 { DIG 4 ; DROP 1 } ; DUG 4 ; DUP 5 ; DUP 6 ; GET 3 ; NONE key ; DUP 8 ; GET 4 ; UPDATE ; UPDATE 3 ; DIP 1 { DIG 4 ; DROP 1 } ; DUG 4 ; DUP 5 ; PUSH nat 1 ; DUP 7 ; GET 4 ; SUB ; ISNAT ; IF_NONE { PUSH string "OPTION_IS_NONE" ; FAILWITH } {} ; UPDATE 4 ; DIP 1 { DIG 4 ; DROP 1 } ; DUG 4 ; DUP 5 ; DUP 6 ; GET 1 ; NONE (pair nat unit) ; DUP 9 ; UPDATE ; UPDATE 1 ; DIP 1 { DIG 4 ; DROP 1 } ; DUG 4 ; DUP 5 ; DIP 1 { DIG 8 ; DROP 1 } ; DUG 8 ; DROP 4 } ; DROP 2 ; PAIR 8 ; SWAP ; PAIR } } } { IF_LEFT { IF_LEFT { UNPAIR ; SWAP ; PUSH mutez 0 ; AMOUNT ; COMPARE ; EQ ; NOT ; IF { PUSH string "NO_TRANSFER" ; FAILWITH } {} ; DUP 8 ; DUP 3 ; GET 1 ; MEM ; IF { PUSH string "TOKEN_ALREADY_EXISTS" ; FAILWITH } {} ; DUP 2 ; GET 4 ; DUP 3 ; GET 3 ; PAIR ; DUP 3 ; GET 1 ; PAIR ; PACK ; KECCAK ; DUP 13 ; DUP 3 ; DUP 3 ; PAIR ; DUP 7 ; PAIR ; DUP 8 ; PAIR ; EXEC ; NOT ; IF { PUSH string "NOT_ENOUGH_SIGNATURES" ; FAILWITH } {} ; PUSH nat 31556952 ; EMPTY_BIG_MAP address (pair nat (option nat) (map bytes (pair (option nat) timestamp))) ; PAIR ; EMPTY_SET address ; PAIR ; PUSH mutez 0 ; NONE key_hash ; CREATE_CONTRACT { storage (pair (set %consumer address) (big_map %permits address (pair (nat %counter) (option %user_expiry nat) (map %user_permits bytes (pair (option %expiry nat) (timestamp %created_at))))) (nat %default_expiry)) ; parameter (or (or (or (pair %set_expiry (option %iv nat) (option %ip bytes)) (pair %setExpiry (address %u) (pair (nat %sec) (option %data bytes)))) (or (pair %permit (key %signer) (pair (signature %sig) (bytes %permit_key))) (pair %consume (address %user) (pair (bytes %permit_key) (string %err))))) (pair %check (key %signer) (pair (signature %sig) (bytes %data)))) ; code { LAMBDA (pair nat (big_map address (pair (nat %counter) (option %user_expiry nat) (map %user_permits bytes (pair (option %expiry nat) (timestamp %created_at))))) address) nat { UNPAIR 3 ; PUSH unit Unit ; DUP 3 ; DUP 5 ; GET ; IF_NONE { DUP 2 } { DUP ; GET 3 ; IF_NONE { DUP 3 } {} ; SWAP ; DROP 1 } ; SWAP ; DROP 1 ; DUG 3 ; DROP 3 } ; LAMBDA (pair nat (big_map address (pair (nat %counter) (option %user_expiry nat) (map %user_permits bytes (pair (option %expiry nat) (timestamp %created_at))))) address bytes) nat { UNPAIR 4 ; PUSH unit Unit ; DUP 3 ; DUP 5 ; GET ; IF_NONE { DUP 2 } { DUP ; GET 3 ; IF_NONE { DUP 3 } {} ; DUP 2 ; GET 4 ; DUP 8 ; GET ; IF_NONE { DUP } { DUP ; GET 1 ; IF_NONE { DUP 5 } {} ; SWAP ; DROP 1 } ; SWAP ; DROP 1 ; SWAP ; DROP 1 } ; SWAP ; DROP 1 ; DUG 4 ; DROP 4 } ; LAMBDA (pair (pair (option %expiry nat) (timestamp %created_at)) nat) bool { UNPAIR ; PUSH unit Unit ; NOW ; PUSH int 1 ; PUSH nat 1 ; DUP 5 ; GET 1 ; IF_NONE { DUP 6 } {} ; INT ; DIG 2 ; MUL ; EDIV ; IF_NONE { PUSH string "DIV_BY_ZERO" ; FAILWITH } {} ; CAR ; DUP 4 ; GET 2 ; ADD ; COMPARE ; LT ; SWAP ; DROP 1 ; DUG 2 ; DROP 2 } ; DIG 3 ; UNPAIR ; DIP 1 { UNPAIR 3 } ; IF_LEFT { IF_LEFT { IF_LEFT { UNPAIR ; SWAP ; PUSH mutez 0 ; AMOUNT ; COMPARE ; EQ ; NOT ; IF { PUSH string "NO_TRANSFER" ; FAILWITH } {} ; DUP 4 ; SENDER ; GET ; IF_NONE { SENDER ; PUSH string "USER_PERMIT_NOT_FOUND" ; PAIR ; FAILWITH } {} ; DUP 3 ; IF_NONE { PUSH bool True } { DUP 7 ; DUP 2 ; COMPARE ; LT ; SWAP ; DROP 1 } ; NOT ; IF { PUSH string "EXPIRY_TOO_BIG" ; FAILWITH } {} ; DUP 2 ; IF_NONE { DUP 5 ; DUP 6 ; SENDER ; GET ; IF_NONE { PUSH string "permits" ; PUSH string "ASSET_NOT_FOUND" ; PAIR ; FAILWITH } {} ; UNPAIR ; SWAP ; CDR ; DUP 6 ; PAIR ; SWAP ; PAIR ; SOME ; SENDER ; UPDATE ; DIP 1 { DIG 4 ; DROP 1 } ; DUG 4 } { DUP 4 ; IF_NONE { PUSH bool True } { PUSH nat 0 ; DUP 2 ; COMPARE ; GT ; SWAP ; DROP 1 } ; IF { DUP 2 ; GET 4 ; DUP 2 ; GET ; IF_NONE { DUP ; SENDER ; PAIR ; PUSH string "PERMIT_NOT_FOUND" ; PAIR ; FAILWITH } {} ; DUP 7 ; DUP 8 ; SENDER ; GET ; IF_NONE { PUSH string "permits" ; PUSH string "ASSET_NOT_FOUND" ; PAIR ; FAILWITH } {} ; UNPAIR ; SWAP ; UNPAIR ; SWAP ; DROP 1 ; DUP 10 ; SENDER ; GET ; IF_NONE { PUSH string "permits" ; PUSH string "ASSET_NOT_FOUND" ; PAIR ; FAILWITH } {} ; CDR ; CDR ; DUP 5 ; CDR ; DUP 10 ; PAIR ; SOME ; DUP 7 ; UPDATE ; SWAP ; PAIR ; SWAP ; PAIR ; SOME ; SENDER ; UPDATE ; DIP 1 { DIG 6 ; DROP 1 } ; DUG 6 ; DROP 1 } { DUP 6 ; DUP 7 ; SENDER ; GET ; IF_NONE { PUSH string "permits" ; PUSH string "ASSET_NOT_FOUND" ; PAIR ; FAILWITH } {} ; UNPAIR ; SWAP ; UNPAIR ; SWAP ; DROP 1 ; DUP 9 ; SENDER ; GET ; IF_NONE { PUSH string "permits" ; PUSH string "ASSET_NOT_FOUND" ; PAIR ; FAILWITH } {} ; CDR ; CDR ; NONE (pair (option nat) timestamp) ; DUP 6 ; UPDATE ; SWAP ; PAIR ; SWAP ; PAIR ; SOME ; SENDER ; UPDATE ; DIP 1 { DIG 5 ; DROP 1 } ; DUG 5 } ; DROP 1 } ; DROP 3 ; PAIR 3 ; NIL operation ; PAIR } { UNPAIR ; SWAP ; UNPAIR ; SWAP ; DUP 3 ; SENDER ; COMPARE ; EQ ; NOT ; IF { PUSH string "INVALID_CALLER" ; FAILWITH } {} ; PUSH mutez 0 ; AMOUNT ; COMPARE ; EQ ; NOT ; IF { PUSH string "NO_TRANSFER" ; FAILWITH } {} ; DUP 5 ; DUP 4 ; GET ; IF_NONE { DUP 3 ; PUSH string "USER_PERMIT_NOT_FOUND" ; PAIR ; FAILWITH } {} ; DUP 2 ; IF_NONE { DUP 6 ; DUP 7 ; SENDER ; GET ; IF_NONE { PUSH string "permits" ; PUSH string "ASSET_NOT_FOUND" ; PAIR ; FAILWITH } {} ; UNPAIR ; SWAP ; CDR ; DUP 6 ; SOME ; PAIR ; SWAP ; PAIR ; SOME ; SENDER ; UPDATE ; DIP 1 { DIG 5 ; DROP 1 } ; DUG 5 } { PUSH nat 0 ; DUP 5 ; COMPARE ; EQ ; IF { PUSH bool True } { DUP 2 ; GET 4 ; DUP 2 ; GET ; IF_NONE { PUSH bool False } { DUP 5 ; INT ; DUP 2 ; GET 2 ; NOW ; SUB ; COMPARE ; GE ; SWAP ; DROP 1 } ; IF { PUSH bool True } { PUSH bool False } } ; IF { DUP 7 ; DUP 8 ; DUP 7 ; GET ; IF_NONE { PUSH string "permits" ; PUSH string "ASSET_NOT_FOUND" ; PAIR ; FAILWITH } {} ; UNPAIR ; SWAP ; UNPAIR ; SWAP ; DROP 1 ; DUP 10 ; DUP 9 ; GET ; IF_NONE { PUSH string "permits" ; PUSH string "ASSET_NOT_FOUND" ; PAIR ; FAILWITH } {} ; CDR ; CDR ; NONE (pair (option nat) timestamp) ; DUP 6 ; UPDATE ; SWAP ; PAIR ; SWAP ; PAIR ; SOME ; DUP 7 ; UPDATE ; DIP 1 { DIG 6 ; DROP 1 } ; DUG 6 } { DUP 2 ; GET 4 ; DUP 2 ; GET ; IF_NONE { DUP ; SENDER ; PAIR ; PUSH string "PERMIT_NOT_FOUND" ; PAIR ; FAILWITH } {} ; DUP 8 ; DUP 9 ; DUP 8 ; GET ; IF_NONE { PUSH string "permits" ; PUSH string "ASSET_NOT_FOUND" ; PAIR ; FAILWITH } {} ; UNPAIR ; SWAP ; UNPAIR ; SWAP ; DROP 1 ; DUP 11 ; DUP 10 ; GET ; IF_NONE { PUSH string "permits" ; PUSH string "ASSET_NOT_FOUND" ; PAIR ; FAILWITH } {} ; CDR ; CDR ; DUP 5 ; CDR ; DUP 10 ; SOME ; PAIR ; SOME ; DUP 7 ; UPDATE ; SWAP ; PAIR ; SWAP ; PAIR ; SOME ; DUP 8 ; UPDATE ; DIP 1 { DIG 7 ; DROP 1 } ; DUG 7 ; DROP 1 } ; DROP 1 } ; DROP 4 ; PAIR 3 ; NIL operation ; PAIR } } { IF_LEFT { UNPAIR ; SWAP ; UNPAIR ; SWAP ; PUSH mutez 0 ; AMOUNT ; COMPARE ; EQ ; NOT ; IF { PUSH string "NO_TRANSFER" ; FAILWITH } {} ; DUP 3 ; HASH_KEY ; IMPLICIT_ACCOUNT ; ADDRESS ; DUP 6 ; DUP 2 ; GET ; IF_NONE { EMPTY_MAP bytes (pair (option %expiry nat) (timestamp %created_at)) ; PUSH nat 0 ; PAIR } { DUP ; GET 4 ; DUP 2 ; GET 1 ; PAIR ; SWAP ; DROP 1 } ; DUP ; GET 1 ; DUP 2 ; GET 2 ; DUP 5 ; DUP 3 ; PAIR ; CHAIN_ID ; SELF_ADDRESS ; PAIR ; PAIR ; PACK ; DUP 14 ; DUP 6 ; DUP 12 ; PAIR ; DUP 13 ; PAIR ; EXEC ; DUP 2 ; DUP 9 ; DUP 11 ; CHECK_SIGNATURE ; NOT ; IF { DUP 2 ; PUSH string "MISSIGNED" ; PAIR ; FAILWITH } {} ; DUP 3 ; DUP 8 ; MEM ; IF { DUP 7 ; PUSH string "DUP_PERMIT" ; PAIR ; FAILWITH } {} ; PUSH nat 20000 ; DUP 4 ; SIZE ; COMPARE ; LT ; NOT ; IF { PUSH string "MAX_PERMITS_REACHED" ; FAILWITH } {} ; DUP 11 ; DUP 7 ; MEM ; IF { DUP 11 ; DUP 7 ; GET ; IF_NONE { PUSH string "permits" ; PUSH string "ASSET_NOT_FOUND" ; PAIR ; FAILWITH } {} ; DUP 12 ; DUP 13 ; DUP 9 ; GET ; IF_NONE { PUSH string "permits" ; PUSH string "ASSET_NOT_FOUND" ; PAIR ; FAILWITH } {} ; CDR ; PUSH nat 1 ; DUP 4 ; GET 1 ; ADD ; SWAP ; UNPAIR ; SWAP ; DROP 1 ; DUP 7 ; NOW ; DUP 7 ; SOME ; PAIR ; SOME ; DUP 13 ; UPDATE ; SWAP ; PAIR ; SWAP ; PAIR ; SOME ; DUP 9 ; UPDATE ; DIP 1 { DIG 11 ; DROP 1 } ; DUG 11 ; DROP 1 } { DUP 11 ; DUP 4 ; NOW ; DUP 4 ; SOME ; PAIR ; SOME ; DUP 10 ; UPDATE ; NONE nat ; PAIR ; PUSH nat 1 ; PUSH nat 0 ; ADD ; PAIR ; SOME ; DUP 8 ; UPDATE ; DIP 1 { DIG 10 ; DROP 1 } ; DUG 10 } ; DUP 11 ; DUP 7 ; GET ; IF_NONE { PUSH string "permits" ; PUSH string "ASSET_NOT_FOUND" ; PAIR ; FAILWITH } {} ; CDR ; CDR ; ITER { UNPAIR ; DUP 15 ; DUP 4 ; DUP 4 ; PAIR ; EXEC ; IF { DUP 13 ; DUP 14 ; DUP 10 ; GET ; IF_NONE { PUSH string "permits" ; PUSH string "ASSET_NOT_FOUND" ; PAIR ; FAILWITH } {} ; UNPAIR ; SWAP ; UNPAIR ; SWAP ; DROP 1 ; DUP 16 ; DUP 12 ; GET ; IF_NONE { PUSH string "permits" ; PUSH string "ASSET_NOT_FOUND" ; PAIR ; FAILWITH } {} ; CDR ; CDR ; NONE (pair (option nat) timestamp) ; DUP 6 ; UPDATE ; SWAP ; PAIR ; SWAP ; PAIR ; SOME ; DUP 10 ; UPDATE ; DIP 1 { DIG 12 ; DROP 1 } ; DUG 12 } {} ; DROP 2 } ; DROP 9 ; PAIR 3 ; NIL operation ; PAIR } { UNPAIR ; SWAP ; UNPAIR ; SWAP ; DUP 4 ; SENDER ; MEM ; NOT ; IF { PUSH string "INVALID_CALLER" ; FAILWITH } {} ; PUSH mutez 0 ; AMOUNT ; COMPARE ; EQ ; NOT ; IF { PUSH string "NO_TRANSFER" ; FAILWITH } {} ; DUP 8 ; DUP 3 ; DUP 5 ; PAIR ; DUP 7 ; PAIR ; DUP 8 ; PAIR ; EXEC ; DUP 6 ; DUP 5 ; GET ; IF_NONE { DUP 2 ; FAILWITH } {} ; DUP ; GET 4 ; DUP 5 ; GET ; IF_NONE { DUP 3 ; FAILWITH } {} ; DUP 10 ; DUP 4 ; DUP 3 ; PAIR ; EXEC ; IF { PUSH int 1 ; PUSH nat 1 ; DUP 3 ; GET 1 ; IF_NONE { DUP 5 } {} ; INT ; DIG 2 ; MUL ; EDIV ; IF_NONE { PUSH string "DIV_BY_ZERO" ; FAILWITH } {} ; CAR ; DUP 2 ; GET 2 ; ADD ; PUSH string "PERMIT_EXPIRED" ; PAIR ; FAILWITH } {} ; DUP 8 ; DUP 9 ; DUP 8 ; GET ; IF_NONE { PUSH string "permits" ; PUSH string "ASSET_NOT_FOUND" ; PAIR ; FAILWITH } {} ; UNPAIR ; SWAP ; UNPAIR ; SWAP ; DROP 1 ; DUP 11 ; DUP 10 ; GET ; IF_NONE { PUSH string "permits" ; PUSH string "ASSET_NOT_FOUND" ; PAIR ; FAILWITH } {} ; CDR ; CDR ; NONE (pair (option nat) timestamp) ; DUP 10 ; UPDATE ; SWAP ; PAIR ; SWAP ; PAIR ; SOME ; DUP 8 ; UPDATE ; DIP 1 { DIG 7 ; DROP 1 } ; DUG 7 ; DROP 6 ; PAIR 3 ; NIL operation ; PAIR } } } { UNPAIR ; SWAP ; UNPAIR ; SWAP ; DUP 4 ; SENDER ; MEM ; NOT ; IF { PUSH string "INVALID_CALLER" ; FAILWITH } {} ; PUSH mutez 0 ; AMOUNT ; COMPARE ; EQ ; NOT ; IF { PUSH string "NO_TRANSFER" ; FAILWITH } {} ; DUP 3 ; HASH_KEY ; IMPLICIT_ACCOUNT ; ADDRESS ; DUP 6 ; DUP 2 ; GET ; IF_NONE { PUSH nat 0 } { DUP ; GET 1 ; SWAP ; DROP 1 } ; DUP 3 ; DUP 2 ; PAIR ; CHAIN_ID ; SELF_ADDRESS ; PAIR ; PAIR ; PACK ; DUP ; DUP 6 ; DUP 8 ; CHECK_SIGNATURE ; NOT ; IF { DUP ; PUSH string "MISSIGNED" ; PAIR ; FAILWITH } {} ; DUP 8 ; DUP 4 ; MEM ; IF { DUP 8 ; DUP 9 ; DUP 5 ; GET ; IF_NONE { PUSH string "permits" ; PUSH string "ASSET_NOT_FOUND" ; PAIR ; FAILWITH } {} ; CDR ; PUSH nat 1 ; DUP 5 ; ADD ; PAIR ; SOME ; DUP 5 ; UPDATE ; DIP 1 { DIG 7 ; DROP 1 } ; DUG 7 } { DUP 8 ; EMPTY_MAP bytes (pair (option %expiry nat) (timestamp %created_at)) ; NONE nat ; PAIR ; PUSH nat 1 ; DUP 5 ; ADD ; PAIR ; SOME ; DUP 5 ; UPDATE ; DIP 1 { DIG 7 ; DROP 1 } ; DUG 7 } ; DROP 6 ; PAIR 3 ; NIL operation ; PAIR } ; DIP 1 { DROP 3 } } } ; PAIR ; EMPTY_BIG_MAP string bytes ; DUP 5 ; GET 3 ; SOME ; PUSH string "here" ; UPDATE ; PUSH bytes 0x74657a6f732d73746f726167653a68657265 ; SOME ; PUSH string "" ; UPDATE ; DUP 2 ; GET 2 ; PAIR ; SELF_ADDRESS ; PAIR ; EMPTY_BIG_MAP nat (pair nat (map string bytes)) ; EMPTY_MAP string bytes ; PUSH bytes 0x66616c73650a ; SOME ; PUSH string "shouldPreferSymbol" ; UPDATE ; PUSH bytes 0x66616c73650a ; SOME ; PUSH string "isBooleanAmount" ; UPDATE ; PUSH bytes 0x74727565 ; SOME ; PUSH string "isTransferable" ; UPDATE ; DUP 7 ; GET 4 ; GET 3 ; SOME ; PUSH string "decimals" ; UPDATE ; DUP 7 ; GET 4 ; GET 4 ; SOME ; PUSH string "symbol" ; UPDATE ; DUP 7 ; GET 4 ; GET 1 ; SOME ; PUSH string "name" ; UPDATE ; PUSH nat 0 ; PAIR ; SOME ; PUSH nat 0 ; UPDATE ; PAIR ; EMPTY_BIG_MAP (pair address nat address) unit ; PAIR ; EMPTY_BIG_MAP address nat ; PAIR ; PUSH mutez 0 ; NONE key_hash ; CREATE_CONTRACT { storage (pair (big_map %ledger address nat) (big_map %operator (pair address nat address) unit) (big_map %token_metadata nat (pair (nat %token_id) (map %token_info string bytes))) (address %bridge_addr) (address %permits_addr) (big_map %metadata string bytes)) ; parameter (or (or (or (pair %balance_of (list %requests (pair (address %owner) (nat %token_id))) (contract %callback (list (pair (pair %request (address %owner) (nat %token_id)) (nat %balance))))) (list %update_operators (or (pair %add_operator (address %owner) (pair (address %operator) (nat %token_id))) (pair %remove_operator (address %owner) (pair (address %operator) (nat %token_id)))))) (or (list %do_transfer (pair (address %from_) (list %txs (pair (address %to_) (pair (nat %token_id) (nat %amount)))))) (list %transfer_gasless (pair (list %transfer_params (pair (address %from_) (list %txs (pair (address %to_) (pair (nat %token_id) (nat %amount)))))) (key %user_pk) (signature %user_sig))))) (or (or (list %transfer (pair (address %from_) (list %txs (pair (address %to_) (pair (nat %token_id) (nat %amount)))))) (pair %mint (address %tow) (nat %nbt))) (or (pair %burn (address %tow) (nat %nbt)) (pair %permit_transfer (list %txs (pair (address %from_) (list %txs (pair (address %to_) (pair (nat %token_id) (nat %amount)))))) (option %permit (pair key signature)))))) ; code { LAMBDA (list (pair (address %from_) (list %txs (pair (address %to_) (pair (nat %token_id) (nat %amount)))))) (option address) { PUSH unit Unit ; DUP 2 ; IF_CONS { DUP ; GET 1 ; DUP 3 ; ITER { DUP ; GET 1 ; DUP 3 ; COMPARE ; EQ ; NOT ; IF { PUSH string "FA2_NOT_OPERATOR" ; FAILWITH } {} ; DROP 1 } ; DUP ; SOME ; DIP 1 { DIG 3 ; DROP 1 } ; DUG 3 ; DROP 3 } { NONE address ; SWAP ; DROP 1 } ; SWAP ; DROP 1 } ; LAMBDA (pair (big_map (pair address nat address) unit) (list (pair (address %from_) (list %txs (pair (address %to_) (pair (nat %token_id) (nat %amount))))))) bool { UNPAIR ; PUSH unit Unit ; PUSH bool True ; DUP 4 ; ITER { DUP ; GET 1 ; DUP 2 ; GET 2 ; DUP ; ITER { DUP 5 ; IF { DUP 3 ; SENDER ; COMPARE ; NEQ ; IF { DUP 7 ; DUP 4 ; DUP 3 ; GET 2 ; GET 1 ; PAIR ; SENDER ; PAIR ; MEM } { PUSH bool True } ; IF { PUSH bool True } { PUSH bool False } } { PUSH bool False } ; DIP 1 { DIG 4 ; DROP 1 } ; DUG 4 ; DROP 1 } ; DROP 3 } ; DUP ; DIP 1 { SWAP ; DROP 1 } ; SWAP ; DROP 1 ; DUG 2 ; DROP 2 } ; LAMBDA (pair address (list (pair (address %from_) (list %txs (pair (address %to_) (pair (nat %token_id) (nat %amount))))))) bool { UNPAIR ; PUSH unit Unit ; PUSH bool True ; DUP 4 ; ITER { DUP 2 ; IF { DUP ; GET 1 ; DUP 5 ; COMPARE ; EQ ; IF { PUSH bool True } { PUSH bool False } } { PUSH bool False } ; DIP 1 { SWAP ; DROP 1 } ; SWAP ; DROP 1 } ; DUP ; DIP 1 { SWAP ; DROP 1 } ; SWAP ; DROP 1 ; DUG 2 ; DROP 2 } ; LAMBDA (pair (big_map address nat) (pair (address %owner) (nat %token_id))) nat { UNPAIR ; PUSH unit Unit ; PUSH nat 0 ; DUP 4 ; GET 2 ; COMPARE ; EQ ; NOT ; IF { PUSH string "FA2_TOKEN_UNDEFINED" ; FAILWITH } {} ; DUP 2 ; DUP 4 ; GET 1 ; GET ; IF_NONE { PUSH nat 0 } {} ; SWAP ; DROP 1 ; DUG 2 ; DROP 2 } ; NIL operation ; DIG 5 ; UNPAIR ; DIP 1 { UNPAIR 6 } ; IF_LEFT { IF_LEFT { IF_LEFT { UNPAIR ; NIL operation ; NIL operation ; DUP 11 ; ITER { CONS } ; DUP 4 ; AMOUNT ; DUP 5 ; MAP { DUP 15 ; DUP 2 ; DUP 10 ; PAIR ; EXEC ; DUP 2 ; PAIR ; SWAP ; DROP 1 } ; TRANSFER_TOKENS ; CONS ; ITER { CONS } ; DIP 1 { DIG 8 ; DROP 1 } ; DUG 8 ; DROP 2 ; PAIR 6 ; SWAP ; PAIR } { PUSH mutez 0 ; AMOUNT ; COMPARE ; EQ ; NOT ; IF { PUSH string "NO_TRANSFER" ; FAILWITH } {} ; DUP ; ITER { DUP ; IF_LEFT { SENDER ; DUP 2 ; GET 1 ; GET 0 ; COMPARE ; EQ ; NOT ; IF { PUSH string "FA2_NOT_BRIDGE" ; FAILWITH } {} ; DUP 5 ; PUSH unit Unit ; SOME ; DUP 3 ; GET 1 ; GET 0 ; DUP 4 ; GET 2 ; GET 2 ; PAIR ; DUP 4 ; GET 2 ; GET 1 ; PAIR ; UPDATE ; DIP 1 { DIG 4 ; DROP 1 } ; DUG 4 ; DROP 1 } { SENDER ; DUP 2 ; GET 1 ; GET 0 ; COMPARE ; EQ ; NOT ; IF { PUSH string "FA2_NOT_BRIDGE" ; FAILWITH } {} ; DUP 5 ; NONE unit ; DUP 3 ; GET 1 ; GET 0 ; DUP 4 ; GET 2 ; GET 2 ; PAIR ; DUP 4 ; GET 2 ; GET 1 ; PAIR ; UPDATE ; DIP 1 { DIG 4 ; DROP 1 } ; DUG 4 ; DROP 1 } ; DROP 1 } ; DROP 1 ; PAIR 6 ; SWAP ; PAIR } } { IF_LEFT { SELF_ADDRESS ; SENDER ; COMPARE ; EQ ; NOT ; IF { PUSH string "INVALID_CALLER" ; FAILWITH } {} ; PUSH mutez 0 ; AMOUNT ; COMPARE ; EQ ; NOT ; IF { PUSH string "NO_TRANSFER" ; FAILWITH } {} ; DUP ; ITER { DUP ; GET 1 ; DUP 2 ; GET 2 ; DUP ; ITER { PUSH nat 0 ; DUP 2 ; GET 2 ; GET 1 ; COMPARE ; EQ ; NOT ; IF { PUSH string "FA2_TOKEN_UNDEFINED" ; FAILWITH } {} ; DUP 6 ; DUP 4 ; GET ; IF_NONE { NONE nat } { DUP ; SOME ; SWAP ; DROP 1 } ; IF_NONE { PUSH nat 0 } {} ; DUP 2 ; GET 2 ; GET 2 ; INT ; DUP 2 ; INT ; SUB ; ISNAT ; IF_NONE { PUSH string "FA2_INSUFFICIENT_BALANCE" ; FAILWITH } {} ; PUSH nat 0 ; DUP 2 ; COMPARE ; EQ ; IF { DUP 8 ; NONE nat ; DUP 7 ; UPDATE ; DIP 1 { DIG 7 ; DROP 1 } ; DUG 7 } { DUP 8 ; DUP 2 ; SOME ; DUP 7 ; UPDATE ; DIP 1 { DIG 7 ; DROP 1 } ; DUG 7 } ; DUP 8 ; DUP 4 ; GET 1 ; GET 0 ; MEM ; IF { DUP 8 ; DUP 4 ; GET 1 ; GET 0 ; GET ; IF_NONE { PUSH string "ledger" ; PUSH string "ASSET_NOT_FOUND" ; PAIR ; FAILWITH } {} ; DUP 9 ; DUP 5 ; GET 2 ; GET 2 ; DUP 3 ; ADD ; SOME ; DUP 6 ; GET 1 ; GET 0 ; UPDATE ; DIP 1 { DIG 8 ; DROP 1 } ; DUG 8 ; DROP 1 } { DUP 8 ; DUP 4 ; GET 2 ; GET 2 ; PUSH nat 0 ; ADD ; SOME ; DUP 5 ; GET 1 ; GET 0 ; UPDATE ; DIP 1 { DIG 7 ; DROP 1 } ; DUG 7 } ; DROP 3 } ; DROP 3 } ; DROP 1 ; PAIR 6 ; SWAP ; PAIR } { PUSH mutez 0 ; AMOUNT ; COMPARE ; EQ ; NOT ; IF { PUSH string "NO_TRANSFER" ; FAILWITH } {} ; DUP ; ITER { DUP ; GET 1 ; DUP 2 ; GET 3 ; DUP 3 ; GET 4 ; DUP 2 ; HASH_KEY ; IMPLICIT_ACCOUNT ; ADDRESS ; DUP 15 ; DUP 5 ; DUP 3 ; PAIR ; EXEC ; NOT ; IF { PUSH string "SIGNER_NOT_FROM" ; FAILWITH } {} ; NIL operation ; NIL operation ; DUP 15 ; ITER { CONS } ; DUP 13 ; CONTRACT %check (pair key signature bytes) ; IF_NONE { PUSH string "check" ; PUSH string "ENTRY_NOT_FOUND" ; PAIR ; FAILWITH } {} ; PUSH mutez 0 ; DUP 8 ; PACK ; BLAKE2B ; DUP 7 ; PAIR ; DUP 8 ; PAIR ; TRANSFER_TOKENS ; CONS ; ITER { CONS } ; DIP 1 { DIG 12 ; DROP 1 } ; DUG 12 ; NIL operation ; NIL operation ; DUP 15 ; ITER { CONS } ; SELF_ADDRESS ; CONTRACT %do_transfer (list (pair address (list (pair address (pair nat nat))))) ; IF_NONE { PUSH string "do_transfer" ; PUSH string "ENTRY_NOT_FOUND" ; PAIR ; FAILWITH } {} ; PUSH mutez 0 ; DUP 8 ; TRANSFER_TOKENS ; CONS ; ITER { CONS } ; DIP 1 { DIG 12 ; DROP 1 } ; DUG 12 ; DROP 5 } ; DROP 1 ; PAIR 6 ; SWAP ; PAIR } } } { IF_LEFT { IF_LEFT { PUSH mutez 0 ; AMOUNT ; COMPARE ; EQ ; NOT ; IF { PUSH string "NO_TRANSFER" ; FAILWITH } {} ; DUP 11 ; DUP 2 ; DUP 5 ; PAIR ; EXEC ; NOT ; IF { DUP 12 ; DUP 2 ; EXEC ; IF_NONE {} { NIL operation ; NIL operation ; DUP 11 ; ITER { CONS } ; DUP 9 ; CONTRACT %consume (pair address bytes string) ; IF_NONE { PUSH string "consume" ; PUSH string "ENTRY_NOT_FOUND" ; PAIR ; FAILWITH } {} ; PUSH mutez 0 ; PUSH string "FA2_NOT_OPERATOR" ; DUP 7 ; PACK ; BLAKE2B ; PAIR ; DUP 6 ; PAIR ; TRANSFER_TOKENS ; CONS ; ITER { CONS } ; DIP 1 { DIG 8 ; DROP 1 } ; DUG 8 ; DROP 1 } } {} ; NIL operation ; NIL operation ; DUP 10 ; ITER { CONS } ; SELF_ADDRESS ; CONTRACT %do_transfer (list (pair address (list (pair address (pair nat nat))))) ; IF_NONE { PUSH string "do_transfer" ; PUSH string "ENTRY_NOT_FOUND" ; PAIR ; FAILWITH } {} ; PUSH mutez 0 ; DUP 5 ; TRANSFER_TOKENS ; CONS ; ITER { CONS } ; DIP 1 { DIG 7 ; DROP 1 } ; DUG 7 ; DROP 1 ; PAIR 6 ; SWAP ; PAIR } { UNPAIR ; SWAP ; DUP 6 ; SENDER ; COMPARE ; EQ ; NOT ; IF { PUSH string "INVALID_CALLER" ; FAILWITH } {} ; PUSH mutez 0 ; AMOUNT ; COMPARE ; EQ ; NOT ; IF { PUSH string "NO_TRANSFER" ; FAILWITH } {} ; DUP 3 ; DUP 3 ; MEM ; IF { DUP 3 ; DUP 3 ; GET ; IF_NONE { PUSH string "ledger" ; PUSH string "ASSET_NOT_FOUND" ; PAIR ; FAILWITH } {} ; DUP 4 ; DUP 3 ; DUP 3 ; ADD ; SOME ; DUP 5 ; UPDATE ; DIP 1 { DIG 3 ; DROP 1 } ; DUG 3 ; DROP 1 } { DUP 3 ; DUP 2 ; PUSH nat 0 ; ADD ; SOME ; DUP 4 ; UPDATE ; DIP 1 { DIG 2 ; DROP 1 } ; DUG 2 } ; DROP 2 ; PAIR 6 ; SWAP ; PAIR } } { IF_LEFT { UNPAIR ; SWAP ; DUP 6 ; SENDER ; COMPARE ; EQ ; NOT ; IF { PUSH string "INVALID_CALLER" ; FAILWITH } {} ; PUSH mutez 0 ; AMOUNT ; COMPARE ; EQ ; NOT ; IF { PUSH string "NO_TRANSFER" ; FAILWITH } {} ; DUP 3 ; DUP 3 ; GET ; IF_NONE { NONE nat } { DUP ; SOME ; SWAP ; DROP 1 } ; IF_NONE { PUSH string "FA2_INSUFFICIENT_BALANCE" ; FAILWITH } {} ; DUP 2 ; DUP 2 ; COMPARE ; GE ; NOT ; IF { PUSH string "FA2_INSUFFICIENT_BALANCE" ; FAILWITH } {} ; DUP 2 ; DUP 2 ; COMPARE ; GT ; IF { DUP 4 ; DUP 4 ; GET ; IF_NONE { PUSH string "ledger" ; PUSH string "ASSET_NOT_FOUND" ; PAIR ; FAILWITH } {} ; DUP 5 ; PUSH int 0 ; DUP 5 ; INT ; DUP 4 ; SUB ; COMPARE ; GE ; IF { DUP 4 ; INT ; DUP 3 ; SUB ; ABS } { PUSH string "NAT_NEG_ASSIGN" ; FAILWITH } ; SOME ; DUP 6 ; UPDATE ; DIP 1 { DIG 4 ; DROP 1 } ; DUG 4 ; DROP 1 } { DUP 4 ; NONE nat ; DUP 5 ; UPDATE ; DIP 1 { DIG 3 ; DROP 1 } ; DUG 3 } ; DROP 3 ; PAIR 6 ; SWAP ; PAIR } { UNPAIR ; SWAP ; PUSH mutez 0 ; AMOUNT ; COMPARE ; EQ ; NOT ; IF { PUSH string "NO_TRANSFER" ; FAILWITH } {} ; DUP ; IF_NONE { DUP 12 ; DUP 3 ; DUP 6 ; PAIR ; EXEC ; NOT ; IF { DUP 13 ; DUP 3 ; EXEC ; IF_NONE {} { NIL operation ; NIL operation ; DUP 12 ; ITER { CONS } ; DUP 10 ; CONTRACT %consume (pair address bytes string) ; IF_NONE { PUSH string "consume" ; PUSH string "ENTRY_NOT_FOUND" ; PAIR ; FAILWITH } {} ; PUSH mutez 0 ; PUSH string "FA2_NOT_OPERATOR" ; DUP 8 ; PACK ; BLAKE2B ; PAIR ; DUP 6 ; PAIR ; TRANSFER_TOKENS ; CONS ; ITER { CONS } ; DIP 1 { DIG 9 ; DROP 1 } ; DUG 9 ; DROP 1 } } {} ; NIL operation ; NIL operation ; DUP 11 ; ITER { CONS } ; SELF_ADDRESS ; CONTRACT %do_transfer (list (pair address (list (pair address (pair nat nat))))) ; IF_NONE { PUSH string "do_transfer" ; PUSH string "ENTRY_NOT_FOUND" ; PAIR ; FAILWITH } {} ; PUSH mutez 0 ; DUP 6 ; TRANSFER_TOKENS ; CONS ; ITER { CONS } ; DIP 1 { DIG 8 ; DROP 1 } ; DUG 8 } { DUP ; GET 1 ; DUP 2 ; GET 2 ; DUP 2 ; HASH_KEY ; IMPLICIT_ACCOUNT ; ADDRESS ; DUP 15 ; DUP 7 ; DUP 3 ; PAIR ; EXEC ; NOT ; IF { PUSH string "SIGNER_NOT_FROM" ; FAILWITH } {} ; NIL operation ; NIL operation ; DUP 15 ; ITER { CONS } ; DUP 13 ; CONTRACT %check (pair key signature bytes) ; IF_NONE { PUSH string "check" ; PUSH string "ENTRY_NOT_FOUND" ; PAIR ; FAILWITH } {} ; PUSH mutez 0 ; DUP 10 ; PACK ; BLAKE2B ; DUP 7 ; PAIR ; DUP 8 ; PAIR ; TRANSFER_TOKENS ; CONS ; ITER { CONS } ; DIP 1 { DIG 12 ; DROP 1 } ; DUG 12 ; NIL operation ; NIL operation ; DUP 15 ; ITER { CONS } ; SELF_ADDRESS ; CONTRACT %do_transfer (list (pair address (list (pair address (pair nat nat))))) ; IF_NONE { PUSH string "do_transfer" ; PUSH string "ENTRY_NOT_FOUND" ; PAIR ; FAILWITH } {} ; PUSH mutez 0 ; DUP 10 ; TRANSFER_TOKENS ; CONS ; ITER { CONS } ; DIP 1 { DIG 12 ; DROP 1 } ; DUG 12 ; DROP 4 } ; DROP 2 ; PAIR 6 ; SWAP ; PAIR } } } ; DIP 1 { DROP 4 } } } ; PAIR ; NIL operation ; DUP 2 ; GET 1 ; CONS ; DUP 3 ; GET 1 ; CONS ; DIP 1 { DIG 13 ; DROP 1 } ; DUG 13 ; DUP 11 ; DUP 6 ; GET 1 ; MEM ; IF { PUSH string "eth_to_tez" ; PUSH string "KEY_EXISTS" ; PAIR ; FAILWITH } { DUP 11 ; DUP 2 ; GET 2 ; SOME ; DUP 7 ; GET 1 ; UPDATE ; DIP 1 { DIG 10 ; DROP 1 } ; DUG 10 } ; DUP 12 ; DUP 2 ; GET 2 ; MEM ; IF { PUSH string "tez_to_eth" ; PUSH string "KEY_EXISTS" ; PAIR ; FAILWITH } { DUP 12 ; DUP 6 ; GET 1 ; SOME ; DUP 3 ; GET 2 ; UPDATE ; DIP 1 { DIG 11 ; DROP 1 } ; DUG 11 } ; NIL operation ; NIL operation ; DUP 16 ; ITER { CONS } ; DUP 7 ; GET 4 ; GET 3 ; DUP 8 ; GET 4 ; GET 4 ; PAIR ; DUP 8 ; GET 4 ; GET 1 ; PAIR ; DUP 8 ; GET 3 ; PAIR ; DUP 4 ; GET 2 ; PAIR ; DUP 8 ; GET 1 ; PAIR ; EMIT %Create (pair (string %eth_token_address) (address %tez_token_address) (bytes %contract_metadata) (bytes %token_na) (bytes %token_sy) (bytes %token_de)) ; CONS ; ITER { CONS } ; DIP 1 { DIG 13 ; DROP 1 } ; DUG 13 ; DROP 5 ; PAIR 8 ; SWAP ; PAIR } { UNPAIR ; SWAP ; PUSH mutez 0 ; AMOUNT ; COMPARE ; EQ ; NOT ; IF { PUSH string "NO_TRANSFER" ; FAILWITH } {} ; DUP 10 ; DUP 3 ; GET 1 ; MEM ; IF { PUSH string "ALREADY_PROCESSED_ID" ; FAILWITH } {} ; DUP 8 ; DUP 3 ; GET 3 ; MEM ; NOT ; IF { PUSH string "TOKEN_NOT_EXISTS" ; FAILWITH } {} ; DUP 2 ; GET 6 ; DUP 3 ; GET 5 ; PAIR ; DUP 3 ; GET 3 ; PAIR ; DUP 3 ; GET 1 ; PAIR ; PACK ; KECCAK ; DUP 13 ; DUP 3 ; DUP 3 ; PAIR ; DUP 7 ; PAIR ; DUP 8 ; PAIR ; EXEC ; NOT ; IF { PUSH string "NOT_ENOUGH_SIGNATURES" ; FAILWITH } {} ; DUP 11 ; DUP 4 ; GET 1 ; MEM ; IF { PUSH string "processed_id" ; PUSH string "KEY_EXISTS" ; PAIR ; FAILWITH } { DUP 11 ; NOW ; SOME ; DUP 5 ; GET 1 ; UPDATE ; DIP 1 { DIG 10 ; DROP 1 } ; DUG 10 } ; DUP 9 ; DUP 4 ; GET 3 ; GET ; IF_NONE { PUSH string "eth_to_tez" ; PUSH string "ASSET_NOT_FOUND" ; PAIR ; FAILWITH } {} ; NIL operation ; NIL operation ; DUP 15 ; ITER { CONS } ; DUP 3 ; CONTRACT %mint (pair address nat) ; IF_NONE { PUSH string "mint" ; PUSH string "ENTRY_NOT_FOUND" ; PAIR ; FAILWITH } {} ; PUSH mutez 0 ; DUP 8 ; GET 6 ; DUP 9 ; GET 5 ; PAIR ; TRANSFER_TOKENS ; CONS ; ITER { CONS } ; DIP 1 { DIG 12 ; DROP 1 } ; DUG 12 ; NIL operation ; NIL operation ; DUP 15 ; ITER { CONS } ; DUP 6 ; GET 6 ; DUP 4 ; PAIR ; DUP 7 ; GET 3 ; PAIR ; DUP 7 ; GET 5 ; PAIR ; DUP 7 ; GET 1 ; PAIR ; EMIT %Wrap (pair (string %id) (address %user) (string %ethereum_token) (address %token_address) (nat %token_amount)) ; CONS ; ITER { CONS } ; DIP 1 { DIG 12 ; DROP 1 } ; DUG 12 ; DROP 4 ; PAIR 8 ; SWAP ; PAIR } } { UNPAIR ; SWAP ; UNPAIR ; SWAP ; PUSH mutez 0 ; AMOUNT ; COMPARE ; EQ ; NOT ; IF { PUSH string "NO_TRANSFER" ; FAILWITH } {} ; DUP 10 ; DUP 4 ; MEM ; NOT ; IF { PUSH string "TOKEN_NOT_SUPPORTED" ; FAILWITH } {} ; DUP 7 ; SENDER ; MEM ; IF { DUP 7 ; SENDER ; GET ; IF_NONE { PUSH string "nonces" ; PUSH string "ASSET_NOT_FOUND" ; PAIR ; FAILWITH } {} ; DUP 8 ; PUSH nat 1 ; DUP 3 ; ADD ; SOME ; SENDER ; UPDATE ; DIP 1 { DIG 7 ; DROP 1 } ; DUG 7 ; DROP 1 } { DUP 7 ; PUSH nat 1 ; PUSH nat 0 ; ADD ; SOME ; SENDER ; UPDATE ; DIP 1 { DIG 6 ; DROP 1 } ; DUG 6 } ; DUP 7 ; DUP 4 ; GET ; IF_NONE { PUSH string "nonces" ; PUSH string "ASSET_NOT_FOUND" ; PAIR ; FAILWITH } {} ; SENDER ; PAIR ; PACK ; KECCAK ; DUP 9 ; DUP 2 ; MEM ; IF { DUP 9 ; NOW ; SOME ; DUP 3 ; UPDATE ; DIP 1 { DIG 8 ; DROP 1 } ; DUG 8 } { DUP 9 ; NOW ; SOME ; DUP 3 ; UPDATE ; DIP 1 { DIG 8 ; DROP 1 } ; DUG 8 } ; NIL operation ; NIL operation ; DUP 15 ; ITER { CONS } ; DUP 6 ; CONTRACT %burn (pair address nat) ; IF_NONE { PUSH string "burn" ; PUSH string "ENTRY_NOT_FOUND" ; PAIR ; FAILWITH } {} ; PUSH mutez 0 ; DUP 7 ; SENDER ; PAIR ; TRANSFER_TOKENS ; CONS ; ITER { CONS } ; DIP 1 { DIG 12 ; DROP 1 } ; DUG 12 ; NIL operation ; NIL operation ; DUP 15 ; ITER { CONS } ; DUP 4 ; DUP 14 ; DUP 8 ; GET ; IF_NONE { PUSH string "tez_to_eth" ; PUSH string "ASSET_NOT_FOUND" ; PAIR ; FAILWITH } {} ; PAIR ; DUP 6 ; PAIR ; DUP 7 ; PAIR ; SENDER ; PAIR ; DUP 4 ; PAIR ; EMIT %Unwrap (pair (bytes %id) (address %user) (address %token_address) (nat %token_amount) (string %eth_token_address) (string %eth_address)) ; CONS ; ITER { CONS } ; DIP 1 { DIG 12 ; DROP 1 } ; DUG 12 ; DROP 4 ; PAIR 8 ; SWAP ; PAIR } } ; DIP 1 { DROP 1 } } ; view "created" string bool { UNPAIR ; DIP 1 { CDR ; CDR ; CDR ; CDR ; CDR ; UNPAIR ; SWAP ; DROP 1 } ; UNIT ; DUP 3 ; DUP 3 ; MEM ; SWAP ; DROP 1 ; DIP 1 { DROP 2 } } ; view "get_processed_id" string (pair (bool %processed) (timestamp %processed_time)) { UNPAIR ; DIP 1 { CDR ; CDR ; CDR ; CDR ; CDR ; CDR ; CDR } ; UNIT ; DUP 3 ; DUP 3 ; MEM ; IF { DUP 3 ; DUP 3 ; GET ; IF_NONE { PUSH string "processed_id" ; PUSH string "ASSET_NOT_FOUND" ; PAIR ; FAILWITH } {} ; PUSH bool True ; PAIR ; SWAP ; DROP 1 } { PUSH timestamp 0 ; PUSH bool False ; PAIR ; SWAP ; DROP 1 } ; DIP 1 { DROP 2 } } ; view "get_ids_desc" (pair address nat nat) (list (pair bytes timestamp)) { UNPAIR ; DIP 1 { CDR ; CDR ; CDR ; CDR ; UNPAIR ; SWAP ; DROP 1 } ; UNPAIR 3 ; UNIT ; PUSH nat 0 ; DUP 5 ; COMPARE ; GT ; NOT ; IF { PUSH string "COUNT_MUST_BE_GREATER_THAN_ZERO" ; FAILWITH } {} ; DUP 4 ; PUSH nat 1 ; DUP 5 ; ADD ; COMPARE ; GE ; NOT ; IF { PUSH string "NOT_ENOUGH_NONCES_AVAILABLE" ; FAILWITH } {} ; NIL (pair bytes timestamp) ; PUSH nat 0 ; DUP 6 ; DUP 2 ; COMPARE ; LT ; LOOP { DUP ; INT ; DUP 6 ; INT ; SUB ; DUP ; DUP 6 ; PAIR ; PACK ; KECCAK ; DUP 9 ; DUP 2 ; MEM ; IF { DUP 9 ; DUP 2 ; GET ; IF_NONE { PUSH string "ids" ; PUSH string "ASSET_NOT_FOUND" ; PAIR ; FAILWITH } {} ; DUP 2 ; PAIR ; DIG 4 ; DUP 2 ; CONS ; DUG 4 ; DROP 1 } {} ; PUSH nat 1 ; DUP 4 ; ADD ; DIP 1 { DIG 2 ; DROP 1 } ; DUG 2 ; DROP 2 ; DUP 6 ; DUP 2 ; COMPARE ; LT } ; DUP 2 ; DIP 1 { DIG 2 ; DROP 1 } ; DUG 2 ; DROP 2 ; DIP 1 { DROP 4 } } ; view "get_id" bytes timestamp { UNPAIR ; DIP 1 { CDR ; CDR ; CDR ; CDR ; UNPAIR ; SWAP ; DROP 1 } ; UNIT ; DUP 3 ; DUP 3 ; MEM ; NOT ; IF { PUSH string "ID_NOT_FOUND" ; FAILWITH } {} ; DUP 3 ; DUP 3 ; GET ; IF_NONE { PUSH string "ids" ; PUSH string "ASSET_NOT_FOUND" ; PAIR ; FAILWITH } {} ; SWAP ; DROP 1 ; DIP 1 { DROP 2 } } ; view "get_nonce" address nat { UNPAIR ; DIP 1 { CDR ; CDR ; CDR ; UNPAIR ; SWAP ; DROP 1 } ; UNIT ; DUP 3 ; DUP 3 ; MEM ; NOT ; IF { PUSH string "NOT_ENOUGH_NONCES_AVAILABLE" ; FAILWITH } {} ; DUP 3 ; DUP 3 ; GET ; IF_NONE { PUSH string "nonces" ; PUSH string "ASSET_NOT_FOUND" ; PAIR ; FAILWITH } {} ; SWAP ; DROP 1 ; DIP 1 { DROP 2 } } ; view "get_owners" unit (list key) { CDR ; CDR ; CDR ; UNPAIR ; SWAP ; DROP 1 ; UNIT ; NIL key ; DUP 3 ; DUP ; GET 4 ; PUSH nat 1 ; DUP 2 ; DUP 2 ; COMPARE ; LE ; LOOP { DUP 3 ; GET 3 ; DUP 2 ; GET ; IF_NONE { PUSH string "NOT_FOUND" ; FAILWITH } {} ; DUP 4 ; GET 1 ; DUP 2 ; GET ; IF_NONE { PUSH string "NOT_FOUND" ; FAILWITH } {} ; CDR ; DIG 5 ; DUP 3 ; CONS ; DUG 5 ; DROP 2 ; PUSH nat 1 ; DUP 2 ; ADD ; SWAP ; DROP 1 ; DUP 2 ; DUP 2 ; COMPARE ; LE } ; DROP 3 ; DUP ; DIP 1 { SWAP ; DROP 1 } ; SWAP ; DROP 1 ; DIP 1 { DROP 1 } } }