#!/usr/bin/env fift -s "TonUtil.fif" include "Asm.fif" include { ."usage: " @' $0 type ." []" cr ."Creates a new advanced wallet in specified workchain, with private key saved to or loaded from .pk" cr ."('new-wallet.pk' by default)" cr 1 halt } : usage $# 1- -2 and ' usage if $1 parse-workchain-id =: wc // set workchain id from command line argument def? $2 { @' $2 } { "new-wallet" } cond constant file-base ."Creating new advanced wallet in workchain " wc . cr // Create new advanced wallet; code adapted from `wallet-code.fif` <{ SETCP0 DUP IFNOTRET // return if recv_internal DUP 85143 INT EQUAL IFJMP:<{ // "seqno" get-method DROP c4 PUSHCTR CTOS 32 PLDU // cnt }> INC 32 THROWIF // fail unless recv_external 9 PUSHPOW2 LDSLICEX DUP 32 LDU 32 LDU // signature in_msg msg_seqno valid_until cs SWAP NOW LEQ 35 THROWIF // signature in_msg msg_seqno cs c4 PUSH CTOS 32 LDU 256 LDU ENDS // signature in_msg msg_seqno cs stored_seqno public_key s3 s1 XCPU // signature in_msg public_key cs stored_seqno msg_seqno stored_seqno EQUAL 33 THROWIFNOT // signature in_msg public_key cs stored_seqno s0 s3 XCHG HASHSU // signature stored_seqno public_key cs hash s0 s4 s2 XC2PU CHKSIGNU 34 THROWIFNOT // cs stored_seqno public_key ACCEPT s0 s2 XCHG // public_key stored_seqno cs WHILE:<{ DUP SREFS // public_key stored_seqno cs _40 }>DO<{ // public_key stored_seqno cs // 3 INT 35 LSHIFT# 3 INT RAWRESERVE // reserve all but 103 Grams from the balance 8 LDU LDREF s0 s2 XCHG // public_key stored_seqno cs _45 mode SENDRAWMSG // public_key stored_seqno cs }> ENDS INC // public_key seqno' NEWC 32 STU 256 STU ENDC c4 POP }>c // >libref // code // data null // no libraries // create StateInit dup ."StateInit: " dup ."signing message: " dup ."External message for initialization is " B dup Bx. cr file-base +"-query.boc" tuck B>file ."(Saved wallet creating query to file " type .")" cr