1
0
mirror of https://github.com/danog/toncontest.git synced 2024-11-30 04:29:14 +01:00
This commit is contained in:
Daniil Gentili 2019-10-08 19:45:25 +02:00
parent 0be80c0b45
commit 7b9d2c8120
Signed by: danog
GPG Key ID: 8C1BE3B34B230CA7
8 changed files with 198 additions and 119 deletions

View File

@ -44,7 +44,9 @@ b>
<b now timeout + 32 u, seqno 32 u, send-mode 8 u, swap ref, b>
dup ."signing message: " <s csr. cr
dup hash wallet_pk ed25519_sign_uint
dup hashu
dup ."Hash: " x. cr cr
wallet_pk ed25519_sign_uint
// signature$_ R:bits256 s:bits256 = Signature;
256 B>u@+ swap 256 B>u@ swap

View File

@ -7,8 +7,9 @@
$# 1 < ' usage if
$1 +".pk" load-generate-keypair drop
$1 +".pubkey" B>file
dup $1 +".pubkey" B>file
."Wrote private key to " $1 +".pk" type cr
."Wrote public key to " $1 +".pubkey" type cr
."Wrote public key to " $1 +".pubkey" type cr cr
."Public key: " Bx. cr cr

115
wallet/inspect-lib.fif Normal file
View File

@ -0,0 +1,115 @@
"TonUtil.fif" include
// Inspects contents of cell provided on top of the stack
// Assuming the same external structure created by create.fif (simple external message)
//
// addr_none$00 = MsgAddressExt;
// addr_extern$01 len:(## 9) external_address:(bits len)
// = MsgAddressExt;
// anycast_info$_ depth:(#<= 30) { depth >= 1 }
// rewrite_pfx:(bits depth) = Anycast;
// addr_std$10 anycast:(Maybe Anycast)
// workchain_id:int8 address:bits256 = MsgAddressInt;
// addr_var$11 anycast:(Maybe Anycast) addr_len:(## 9)
// workchain_id:int32 address:(bits addr_len) = MsgAddressInt;
//
// ext_in_msg_info$10 src:MsgAddressExt dest:MsgAddressInt
// import_fee:Grams = CommonMsgInfo;
//
//
// message$_ {X:Type} info:CommonMsgInfo
// init:(Maybe (Either StateInit ^StateInit))
// body:(Either X ^X) = Message X;
//
// <b b{1000100} s, wallet_addr addr, 0 Gram, b{00} s,
// swap <s s, b>
// (external message)
//
{ hole dup 1 ' @ does create 1 ' ! does create } : variable-set
{ hole hole 2dup 2 { @ swap @ swap } does create 2 { rot swap ! ! } does create } : 2variable-set
2variable-set wallet_addr wallet_addr!
variable-set message-hash message-hash!
<s dup csr. cr
// External message
7 u@+ swap 68 <> { ."There seems to be an invalid header" cr } if // 1000100 => 68
8 i@+
256 u@+ -rot
2dup wallet_addr!
."Wallet address: " .addr cr
Gram@+ nip // Ignore grams
1 u@+ swap
abort"This seems to be an init message"
// multiSigWrapper$0 signatures:(HashmapE 4 Signature) message:(WrappedMessage X) = MultiSigWrapper X;
1 u@+ swap
dup ."Message version: " . cr
abort"Unsupported message version!"
dict@+ swap
dup null? abort"Empty signature list!"
."Signed by the following keys: "
4 { drop . ."- " -1 } dictforeach cr drop
."Hash: " dup shash dup Bx. cr
message-hash!
// modeMessage$_ mode:uint8 body:^(Message X) = ModeMessage X;
// wrappedMessage$_ expires_at:uint32 seqno:uint32 body:(ModeMessage X) = WrappedMessage X;
32 u@+ swap
dup ."Expires: " .
dup now < { ."(already EXPIRED!)" drop } { ."(in " now - . ."seconds)" } cond cr
32 u@+ swap
."Seqno: " . cr
8 u@+ swap
."Mode: " . cr
// Now on to the actual message we're agreeing to sign
//
// int_msg_info$0 ihr_disabled:Bool bounce:Bool bounced:Bool
// src:MsgAddressInt dest:MsgAddressInt
// value:CurrencyCollection ihr_fee:Grams fwd_fee:Grams
// created_lt:uint64 created_at:uint32 = CommonMsgInfo;
// ext_in_msg_info$10 src:MsgAddressExt dest:MsgAddressInt
// import_fee:Grams = CommonMsgInfo;
// ext_out_msg_info$11 src:MsgAddressInt dest:MsgAddressExt
// created_lt:uint64 created_at:uint32 = CommonMsgInfo;
."=>" cr ref@ <s
1 u@+ swap
{ // Extcr ernal message
."Inside: external message" cr
}
{ // Internal message
."Inside: internal message" cr
1 u@+ swap
."Instant hypercube routing disabled? " . cr
1 u@+ swap
."Bounce flag set? " . cr
1 u@+ swap
// ."Bounced flag set? " . cr
drop
2 u@+ nip // Drop src address constructor + flags
3 u@+ swap
4 <> abort"Unsupported address!" // Make things simple for now
8 i@+
256 u@+ -rot
."Destination address: " .addr cr
Gram@+ swap
."Grams: " .GR cr
} cond
drop

View File

@ -1,119 +1,11 @@
"TonUtil.fif" include
{ dup ."Inspecting order from file " type ."..." cr
file>B B>boc
} : inspect-load-boc
{
."usage: " @' $0 type ." <input>" cr
."Inspects contents of multisig <input>.boc file." cr 1 halt
} : usage
"inspect-this" (def?) not {
$# 1 < ' usage if
$1 =: inspect-this
} if
$1 +".boc"
dup ."Inspecting order from file " type ."..." cr
file>B B>boc
// Assuming the same external structure created by create.fif (simple external message)
//
// addr_none$00 = MsgAddressExt;
// addr_extern$01 len:(## 9) external_address:(bits len)
// = MsgAddressExt;
// anycast_info$_ depth:(#<= 30) { depth >= 1 }
// rewrite_pfx:(bits depth) = Anycast;
// addr_std$10 anycast:(Maybe Anycast)
// workchain_id:int8 address:bits256 = MsgAddressInt;
// addr_var$11 anycast:(Maybe Anycast) addr_len:(## 9)
// workchain_id:int32 address:(bits addr_len) = MsgAddressInt;
//
// ext_in_msg_info$10 src:MsgAddressExt dest:MsgAddressInt
// import_fee:Grams = CommonMsgInfo;
//
//
// message$_ {X:Type} info:CommonMsgInfo
// init:(Maybe (Either StateInit ^StateInit))
// body:(Either X ^X) = Message X;
//
// <b b{1000100} s, wallet_addr addr, 0 Gram, b{00} s,
// swap <s s, b>
// (external message)
//
inspect-this +".boc" inspect-load-boc
<s dup csr. cr
// External message
7 u@+ swap 68 <> { ."There seems to be an invalid header" cr } if // 1000100 => 68
8 i@+
256 u@+ -rot
2dup 2constant wallet_addr
."Wallet address: " .addr cr
Gram@+ nip // Ignore grams
1 u@+ swap
abort"This seems to be an init message"
// multiSigWrapper$0 signatures:(HashmapE 4 Signature) message:(WrappedMessage X) = MultiSigWrapper X;
1 u@+ swap
dup ."Message version: " . cr
abort"Unsupported message version!"
dict@+ swap
dup null? abort"Empty signature list!"
."Signed by the following keys: "
4 { drop . ."- " -1 } dictforeach cr drop
// modeMessage$_ mode:uint8 body:^(Message X) = ModeMessage X;
// wrappedMessage$_ expires_at:uint32 seqno:uint32 body:(ModeMessage X) = WrappedMessage X;
32 u@+ swap
dup ."Expires: " .
dup now < { ."(already EXPIRED!)" drop } { ."(in " now - . ."seconds)" } cond cr
32 u@+ swap
."Seqno: " . cr
8 u@+ swap
."Mode: " . cr
// Now on to the actual message we're agreeing to sign
//
// int_msg_info$0 ihr_disabled:Bool bounce:Bool bounced:Bool
// src:MsgAddressInt dest:MsgAddressInt
// value:CurrencyCollection ihr_fee:Grams fwd_fee:Grams
// created_lt:uint64 created_at:uint32 = CommonMsgInfo;
// ext_in_msg_info$10 src:MsgAddressExt dest:MsgAddressInt
// import_fee:Grams = CommonMsgInfo;
// ext_out_msg_info$11 src:MsgAddressInt dest:MsgAddressExt
// created_lt:uint64 created_at:uint32 = CommonMsgInfo;
cr ref@ <s
1 u@+ swap
{ // External message
."Inside: external message" cr
}
{ // Internal message
."Inside: internal message" cr
1 u@+ swap
."Instant hypercube routing disabled? " . cr
1 u@+ swap
."Bounce flag set? " . cr
1 u@+ swap
."Bounced flag set? " . cr
2 u@+ nip // Drop src address constructor + flags
3 u@+ swap
4 <> abort"Unsupported address!" // Make things simple for now
8 i@+
256 u@+ -rot
."Destination address: " .addr cr
Gram@+ swap
."Grams: " .GR cr
} cond
drop
"inspect-lib.fif" include

View File

@ -0,0 +1,64 @@
#!/usr/bin/env -S fift -s
"TonUtil.fif" include
' constant : const
{ dup ."Loading order from file " type ."..." cr
file>B B>boc
} : load-boc
{
."usage: " @' $0 type ." <input1> <input2> [<input3> ...] <output>" cr
."Merges multisig <inputx>.boc files and writes result to <output>.boc" cr 1 halt
} : usage
$# 3 < ' usage if
$# 1 - const input-len
1 { dup $() +".boc" swap 1+ } input-len times drop
input-len tuple const input-files
$# $() +".boc" const output-file
."Inspecting and merging " input-len . ."files..." cr
input-files explode 1- swap
load-boc
dup "inspect-lib.fif" include cr
message-hash const previous-hash
<s
// External message
7 u@+ nip
8 i@+ nip
256 u@+ nip
Gram@+ nip
2 u@+ nip
// multiSigWrapper$0 signatures:(HashmapE 4 Signature) message:(WrappedMessage X) = MultiSigWrapper X;
dict@+
s>c const wrapped-message // Store message in const
swap // put length on top, signatures right underneath
{ swap // Get filename, signatures right underneath
load-boc
dup "inspect-lib.fif" include cr
message-hash previous-hash B= not abort"Hash mismatch!"
<s
// External message
7 u@+ nip
8 i@+ nip
256 u@+ nip
Gram@+ nip
2 u@+ nip
// multiSigWrapper$0 signatures:(HashmapE 4 Signature) message:(WrappedMessage X) = MultiSigWrapper X;
dict@
4 { drop s, -1 } dictmerge
} swap times
// Signatures are the only element on the stack
."Fianl message signed by the following keys: "
dup 4 { drop . ."- " -1 } dictforeach cr drop
<b 68 7 u, wallet_addr addr, 0 Gram, 0 2 u, swap dict, wrapped-message <s s, b>
2 boc+>B dup Bx. cr
output-file tuck B>file
."Saved new multisigned message to file " type cr

View File

@ -15,12 +15,10 @@ $2 =: output-file
$3 =: key
$4 parse-int =: key-id
input-file constant inspect-this
"inspect.fif" include cr
input-file +".boc" load-boc constant order
key +".pk" load-keypair nip constant wallet_pk
order "inspect-lib.fif" include cr
order <s
// External message

4
wallet/test.fif Normal file
View File

@ -0,0 +1,4 @@
0 variable x
1 variable y
.s

View File

@ -261,3 +261,6 @@ int seqno() method_id {
}
return getPartialsById(id);
}
(cell) getPartialsByHash(int hash) method_id {
return get_data().begin_parse().skip_bits(36).skip_keys().preload_dict().udict_get_ref(256, hash);
}