x
247
parameter (or
(pair %Action
(or %action_input
(or (pair %Transfer (contract %dest unit) (mutez %transfer_amount))
(option %Set_pour (pair (contract %pour_dest unit)
(key %pour_authorizer))))
(or
(pair %Set_keys
(list %key_groups (pair (list %signatories key)
(nat %group_threshold)))
(nat %overall_threshold))
(option %Set_delegate key_hash)))
(list %signatures (list (option signature))))
(option (pair (signature %pour_auth) (mutez %pour_amount))));
storage (pair
(pair (nat %replay_counter)
(pair %key_info
(list %key_groups (pair (list %signatories key) (nat %group_threshold)))
(nat %overall_threshold)))
(pair
(pair %vesting
(pair %vesting_quantities (mutez %vested_balance)
(mutez %vesting_increment))
(pair %vesting_schedule (timestamp %next_payout) (int %payout_interval)))
(option (pair (address %pour_dest) (key %pour_authorizer)))));
code { DUP ;
CAR ;
IF_LEFT
{ DIP { CDR ; DUP ; NIL @operations operation ; SWAP } ;
SWAP ;
CAR ;
DUP ;
CDR %key_info @% ;
DIP { CAR %replay_counter @% ;
DIP { DUP ; CDR %signatures @% } ;
SWAP ;
DIP { DIP { CAR %action_input @% ; DUP } ;
SELF ;
ADDRESS ;
PAIR ;
SWAP ;
PAIR ;
PACK @packed } } ;
SWAP ;
DIP { DUP ;
CAR %key_groups @% ;
DIP { CDR %overall_threshold @% ; INT @overall_counter ; SWAP } } ;
ITER { DIP { IF_CONS
{ DIP { SWAP } ;
DUP ;
CAR @%% ;
DIP { CDR @%% ; INT @group_counter ; SWAP } }
{ { UNIT ; FAILWITH } } } ;
ITER { DIP { IF_CONS {} { { UNIT ; FAILWITH } } } ;
IF_NONE
{ DROP }
{ SWAP ;
DIP { DIP { SWAP ;
DIP { DIP { PUSH int -1 ; ADD @group_counter } } ;
DUP } } ;
CHECK_SIGNATURE @sig_ok ;
{ IF {} { { UNIT ; FAILWITH } } } ;
SWAP } } ;
{ DIP { DIP { PUSH int 0 ;
{ COMPARE ; GE @group_threshold_met } ;
IF { DIP { PUSH int -1 ; ADD @overall_counter } } {} } } } ;
IF_CONS { { UNIT ; FAILWITH } } {} ;
SWAP } ;
IF_CONS { { UNIT ; FAILWITH } } {} ;
DROP ;
PUSH int 0 ;
{ COMPARE ; GE @overall_threshold_met } ;
{ IF {} { { UNIT ; FAILWITH } } } ;
{ DIP { DIP { DUP ;
CAR ;
DUP ;
CAR %replay_counter @% ;
PUSH nat 1 ;
ADD @replay_counter ;
DIP { CDR %key_info @% } ;
PAIR %@ %@ ;
DIP { CDR } ;
PAIR } } } ;
IF_LEFT
{ IF_LEFT
{ DUP ;
DIP { CDR %transfer_amount @% ;
DUP ;
BALANCE @balance ;
{ { COMPARE ; GE } ; IF {} { { UNIT ; FAILWITH } } } ;
SWAP ;
DIP { DIP { DUP ;
CDR ;
DUP ;
CAR ;
CAR %vesting_quantities @% ;
DUP ;
CAR %vested_balance @% ;
DUP } ;
DUP ;
DIP { { { COMPARE ; LE } ; IF {} { { UNIT ; FAILWITH } } } } ;
SWAP ;
SUB_MUTEZ ;
IF_NONE { UNIT ; FAILWITH } { RENAME @vested_balance } ;
DIP { CDR %vesting_increment @% } ;
PAIR @vesting_quantities %@ %@ ;
DIP { DUP ;
CAR ;
CDR %vesting_schedule @% ;
DIP { CDR %pour_info @% } } ;
PAIR @vesting %@ %@ ;
PAIR %@ %@ ;
SWAP ;
CAR ;
PAIR } } ;
DUP ;
CDR %transfer_amount @% ;
DIP { CAR %dest @% } ;
UNIT ;
TRANSFER_TOKENS @transfer_op ;
CONS @operations }
{ SWAP ;
DIP { MAP { UNPAIR ; ADDRESS ; PAIR } ;
SWAP ;
DUP ;
CAR ;
DIP { CDR ; CAR %vesting @% ; PAIR %vesting %pour_info } ;
PAIR @storage } } }
{ IF_LEFT
{ DUP ;
DUP ;
CAR %key_groups @% ;
DIP { CDR %overall_threshold @new_threshold ;
DUP ;
PUSH nat 0 ;
{ { COMPARE ; LT } ; IF {} { { UNIT ; FAILWITH } } } ;
PUSH @counter nat 0 } ;
ITER { DUP ;
CAR %signatories @%% ;
DIP { CDR %group_threshold @%% ;
DUP ;
PUSH nat 0 ;
{ { COMPARE ; LT } ; IF {} { { UNIT ; FAILWITH } } } } ;
SIZE @num_keys ;
{ { COMPARE ; GE } ; IF {} { { UNIT ; FAILWITH } } } ;
PUSH nat 1 ;
ADD @counter } ;
{ { COMPARE ; GE } ; IF {} { { UNIT ; FAILWITH } } } ;
SWAP ;
DIP { DIP { DUP ; CAR ; CAR %replay_counter } ;
SWAP ;
PAIR %@ %key_info ;
DIP { CDR } ;
PAIR @storage } }
{ SET_DELEGATE @set_delegate_op ; CONS } } ;
PAIR }
{ IF_NONE
{ CDR ;
DUP ;
CDR ;
DUP ;
DIP { CDR %pour_info @% } ;
CAR %vesting @% ;
DUP ;
CDR %vesting_schedule @% ;
DUP ;
CAR %next_payout @% ;
DUP ;
NOW ;
{ COMPARE ; GT } ;
{ IF {} { { UNIT ; FAILWITH } } } ;
DIP { CDR %payout_interval @% ; DUP } ;
ADD @new_next_payout ;
PAIR %next_payout %@ @new_vesting_schedule ;
SWAP ;
CAR %vesting_quantities @% ;
DUP ;
CAR %vested_balance @% ;
DIP { CDR %vesting_increment @% ; DUP } ;
ADD @new_balance ;
PAIR %vested_balance %@ ;
PAIR %vesting_quantities %vesting_schedule ;
PAIR %vesting %@ ;
SWAP ;
CAR ;
PAIR @storage ;
NIL operation }
{ DIP { CDR ;
DUP ;
CDR ;
DUP ;
CAR %vesting @% ;
DUP ;
CAR %vesting_quantities @% ;
DUP ;
CAR %vested_balance @% ;
DUP } ;
DUP ;
DIP { CDR %pour_amount @%% ;
DUP ;
DIP { { { COMPARE ; LE } ; IF {} { { UNIT ; FAILWITH } } } } ;
DUP ;
BALANCE @balance ;
{ { COMPARE ; GE } ; IF {} { { UNIT ; FAILWITH } } } ;
SWAP ;
SUB_MUTEZ @new_cur_balance ;
IF_NONE { UNIT ; FAILWITH } {} ;
DIP { CDR %vesting_increment @% } ;
PAIR %vested_balance %@ @vesting_quantities ;
DIP { CDR %vesting_schedule @% } ;
PAIR %@ %@ @vesting ;
DIP { CDR %pour_info @% ; DUP ; IF_NONE { { UNIT ; FAILWITH } } {} } ;
SWAP ;
DIP { PAIR %@ %@ ;
SWAP ;
CAR ;
DUP ;
CAR %replay_counter @% ;
DUP ;
PUSH nat 1 ;
ADD @replay_counter ;
SWAP ;
SELF ;
ADDRESS ;
PAIR ;
DIP { DIP { CDR %key_info @% } ; PAIR %@ %@ ; PAIR @storage } } } ;
DUP ;
DIP { SWAP ;
DUP ;
CAR %pour_dest @% ;
CONTRACT unit ;
IF_NONE { PUSH string "Bad transaction receiver" ; FAILWITH } {} ;
DIP { DUP ;
CDR %pour_authorizer @% ;
DIP { CAR %pour_dest @% ;
SWAP ;
DUP ;
CAR %pour_auth @% ;
DIP { CDR %pour_amount @% ; SWAP ; PAIR ; PAIR ; PACK @packed } } ;
CHECK_SIGNATURE @pour_auth_ok ;
{ IF {} { { UNIT ; FAILWITH } } } ;
NIL operation } } ;
CDR %pour_amount @% ;
UNIT ;
TRANSFER_TOKENS @pour_op ;
CONS } ;
PAIR } }