#!/usr/bin/fift -s "TonUtil.fif" include "Asm.fif" include "multisig.fif" include cell // PARAMS 0 =: wc 16 =: keys_num // CREATE KEYS { file>B dup Blen 32 <> abort"Private key must be exactly 32 bytes long" dup priv>pub swap } : load-keypair' // ( fname -- pubkey privkey ) { dup file-exists? { load-keypair' } { dup newkeypair swap rot over swap B>file rot drop } cond } : load-generate-keypair' { load-generate-keypair' swap 256 B>u@ } : nkp "p01.pk" nkp =: pub01 =: priv01 "p02.pk" nkp =: pub02 =: priv02 "p03.pk" nkp =: pub03 =: priv03 "p04.pk" nkp =: pub04 =: priv04 "p05.pk" nkp =: pub05 =: priv05 "p06.pk" nkp =: pub06 =: priv06 "p07.pk" nkp =: pub07 =: priv07 "p08.pk" nkp =: pub08 =: priv08 "p09.pk" nkp =: pub09 =: priv09 "p0a.pk" nkp =: pub0a =: priv0a "p0b.pk" nkp =: pub0b =: priv0b "p0c.pk" nkp =: pub0c =: priv0c "p0d.pk" nkp =: pub0d =: priv0d "p0e.pk" nkp =: pub0e =: priv0e "p0f.pk" nkp =: pub0f =: priv0f "p10.pk" nkp =: pub10 =: priv10 // CREATE ORDER -1 constant bounce constant example_message_body 3 constant message_mode ref, contract_storage ref, b> dup =: state_init dup hashu wc swap 2constant multisig_addr multisig_addr 256 u>B swap 32 u>B min_signature_num 8 u>B keys_num 8 u>B B+ B+ B+ =: contract_description contract_description "multisig.ctr" B>file multisig_addr swap drop 6277101735386680763835789423207666416102355444464034512896 / =: uniq_token 2 boc+>B "multisig-init.boc" B>file 1 constant op_num 1 constant seq_no 0xFFFFFFFF constant unix_time_bound 10 =: min_signatures_num example_message_root 0 dictnew 7 udict! drop constant order_dict =: data_for_signing pub02 priv02 pub03 priv03 pub04 priv04 pub05 priv05 pub06 priv06 pub07 priv07 pub08 priv08 pub09 priv09 pub0a priv0a data_for_signing ref, } 9 times b> =: signatures_stairs message_builder signatures_stairs ref, order_dict dict, b> =: mbody signatures_stairs hashu 1 >> =: proof_token // here it is not arbitrary, since cover all message main_order_data_slice proof_token 255 u, b> hashu priv01 ed25519_sign_uint constant header_signature ref, b> 2 boc+>B "10signatures.boc" B>file ."new multisig wallet address = " multisig_addr .addr cr ."Non-bounceable address (for init): " multisig_addr 7 .Addr cr ."Bounceable address (for later access): " multisig_addr 6 .Addr cr ."(Saved multisig contract creating query to file multisig-init.boc)" cr ."(Saved order with 10 signatures to file 10signatures.boc)" cr