diff --git a/app/onchain/contracts/aid_escrow/test_snapshots/claim_with_proof_accepts_tool_format_proofs.1.json b/app/onchain/contracts/aid_escrow/test_snapshots/claim_with_proof_accepts_tool_format_proofs.1.json new file mode 100644 index 00000000..dc41a331 --- /dev/null +++ b/app/onchain/contracts/aid_escrow/test_snapshots/claim_with_proof_accepts_tool_format_proofs.1.json @@ -0,0 +1,1975 @@ +{ + "generators": { + "address": 2, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [], + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": "1000000000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "fund", + "args": [ + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": "1000000000" + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "i128": "1000000000" + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "create_package", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "u64": "0" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": "10000000" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + { + "u64": "86400" + }, + { + "map": [ + { + "key": { + "symbol": "merkle_root" + }, + "val": { + "string": "6e8a1e99583601eac4e0aa76aa9a3733c86de13844d59f6a3480995695a0bf6f" + } + } + ] + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "claim_with_proof", + "args": [ + { + "u64": "0" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "vec": [ + { + "string": "0ecb188156fe839e84b079ba797da21e155fef714cee6b0da7bfad7be630ea72" + }, + { + "string": "d8f338ba99f1755387461749eabca43fd379b61dab5909112f41b3bde74d0ca6" + } + ] + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "create_package", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "u64": "1" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": "10000000" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + { + "u64": "86400" + }, + { + "map": [ + { + "key": { + "symbol": "merkle_root" + }, + "val": { + "string": "6e8a1e99583601eac4e0aa76aa9a3733c86de13844d59f6a3480995695a0bf6f" + } + } + ] + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "claim_with_proof", + "args": [ + { + "u64": "1" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "vec": [ + { + "string": "7867f90fa8c7d022a790a4b61ee2cccf197fbc2e41f0a59ce0908045f620f1e2" + }, + { + "string": "d8f338ba99f1755387461749eabca43fd379b61dab5909112f41b3bde74d0ca6" + } + ] + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "create_package", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "u64": "2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": "10000000" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + { + "u64": "86400" + }, + { + "map": [ + { + "key": { + "symbol": "merkle_root" + }, + "val": { + "string": "6e8a1e99583601eac4e0aa76aa9a3733c86de13844d59f6a3480995695a0bf6f" + } + } + ] + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "claim_with_proof", + "args": [ + { + "u64": "2" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "vec": [ + { + "string": "493d112fc6c42a3b6095658f17748b82409071a27ac13b2c13655af8e68176f3" + } + ] + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 23, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "balance": "0", + "seq_num": "0", + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + null + ] + ], + [ + { + "contract_data": { + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "symbol": "dlgexp" + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "symbol": "dlgexp" + }, + "durability": "persistent", + "val": { + "map": [] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "symbol": "dlgts" + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "symbol": "dlgts" + }, + "durability": "persistent", + "val": { + "map": [] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "pidx" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "pidx" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "u64": "0" + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "pidx" + }, + { + "u64": "1" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "pidx" + }, + { + "u64": "1" + } + ] + }, + "durability": "persistent", + "val": { + "u64": "1" + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "pidx" + }, + { + "u64": "2" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "pidx" + }, + { + "u64": "2" + } + ] + }, + "durability": "persistent", + "val": { + "u64": "2" + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "pkg" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "pkg" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "10000000" + } + }, + { + "key": { + "symbol": "claim_starts_at" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "expires_at" + }, + "val": { + "u64": "86400" + } + }, + { + "key": { + "symbol": "id" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "metadata" + }, + "val": { + "map": [ + { + "key": { + "symbol": "merkle_root" + }, + "val": { + "string": "6e8a1e99583601eac4e0aa76aa9a3733c86de13844d59f6a3480995695a0bf6f" + } + } + ] + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "pkg" + }, + { + "u64": "1" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "pkg" + }, + { + "u64": "1" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "10000000" + } + }, + { + "key": { + "symbol": "claim_starts_at" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "expires_at" + }, + "val": { + "u64": "86400" + } + }, + { + "key": { + "symbol": "id" + }, + "val": { + "u64": "1" + } + }, + { + "key": { + "symbol": "metadata" + }, + "val": { + "map": [ + { + "key": { + "symbol": "merkle_root" + }, + "val": { + "string": "6e8a1e99583601eac4e0aa76aa9a3733c86de13844d59f6a3480995695a0bf6f" + } + } + ] + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "pkg" + }, + { + "u64": "2" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "pkg" + }, + { + "u64": "2" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "10000000" + } + }, + { + "key": { + "symbol": "claim_starts_at" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "expires_at" + }, + "val": { + "u64": "86400" + } + }, + { + "key": { + "symbol": "id" + }, + "val": { + "u64": "2" + } + }, + { + "key": { + "symbol": "metadata" + }, + "val": { + "map": [ + { + "key": { + "symbol": "merkle_root" + }, + "val": { + "string": "6e8a1e99583601eac4e0aa76aa9a3733c86de13844d59f6a3480995695a0bf6f" + } + } + ] + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "symbol": "claimed" + }, + "val": { + "map": [ + { + "key": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "val": { + "i128": "30000000" + } + } + ] + } + }, + { + "key": { + "symbol": "cmt" + }, + "val": { + "map": [ + { + "key": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "val": { + "i128": "0" + } + } + ] + } + }, + { + "key": { + "symbol": "config" + }, + "val": { + "map": [ + { + "key": { + "symbol": "allowed_tokens" + }, + "val": { + "vec": [] + } + }, + { + "key": { + "symbol": "max_expires_in" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "min_amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "min_decimals" + }, + "val": { + "u32": 0 + } + } + ] + } + }, + { + "key": { + "symbol": "locked" + }, + "val": { + "map": [ + { + "key": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "val": { + "i128": "0" + } + } + ] + } + }, + { + "key": { + "symbol": "pkg_cnt" + }, + "val": { + "u64": "3" + } + }, + { + "key": { + "symbol": "pkg_idx" + }, + "val": { + "u64": "3" + } + }, + { + "key": { + "symbol": "rcnt" + }, + "val": { + "map": [ + { + "key": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + "val": { + "u64": "1" + } + }, + { + "key": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + "val": { + "u64": "1" + } + }, + { + "key": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + "val": { + "u64": "1" + } + } + ] + } + }, + { + "key": { + "symbol": "version" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "vec": [ + { + "symbol": "rpidx" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "u64": "0" + } + ] + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "vec": [ + { + "symbol": "rpidx" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "u64": "0" + } + ] + }, + "val": { + "u64": "1" + } + }, + { + "key": { + "vec": [ + { + "symbol": "rpidx" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "u64": "0" + } + ] + }, + "val": { + "u64": "2" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "2032731177588607455" + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "2032731177588607455" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": "8370022561469687789" + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": "8370022561469687789" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": "5806905060045992000" + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": "5806905060045992000" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": "1033654523790656264" + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": "1033654523790656264" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": "4270020994084947596" + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": "4270020994084947596" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": "4837995959683129791" + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": "4837995959683129791" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": "6277191135259896685" + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": "6277191135259896685" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "970000000" + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "10000000" + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "10000000" + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "10000000" + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000002" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 120960 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/app/onchain/contracts/aid_escrow/test_snapshots/mismatched_root_is_rejected.1.json b/app/onchain/contracts/aid_escrow/test_snapshots/mismatched_root_is_rejected.1.json new file mode 100644 index 00000000..209aaa4e --- /dev/null +++ b/app/onchain/contracts/aid_escrow/test_snapshots/mismatched_root_is_rejected.1.json @@ -0,0 +1,938 @@ +{ + "generators": { + "address": 2, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [], + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": "1000000000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "fund", + "args": [ + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": "1000000000" + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "i128": "1000000000" + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "create_package", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "u64": "0" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": "10000000" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + { + "u64": "86400" + }, + { + "map": [ + { + "key": { + "symbol": "merkle_root" + }, + "val": { + "string": "ee5cef19e8c92c367871bff78e4fb4ed5e25c0f7a7aa8b8b0a646739546b5ba5" + } + } + ] + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 23, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "balance": "0", + "seq_num": "0", + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + null + ] + ], + [ + { + "contract_data": { + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "pidx" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "pidx" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "u64": "0" + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "pkg" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "pkg" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "10000000" + } + }, + { + "key": { + "symbol": "claim_starts_at" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "expires_at" + }, + "val": { + "u64": "86400" + } + }, + { + "key": { + "symbol": "id" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "metadata" + }, + "val": { + "map": [ + { + "key": { + "symbol": "merkle_root" + }, + "val": { + "string": "ee5cef19e8c92c367871bff78e4fb4ed5e25c0f7a7aa8b8b0a646739546b5ba5" + } + } + ] + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "symbol": "cmt" + }, + "val": { + "map": [ + { + "key": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "val": { + "i128": "10000000" + } + } + ] + } + }, + { + "key": { + "symbol": "config" + }, + "val": { + "map": [ + { + "key": { + "symbol": "allowed_tokens" + }, + "val": { + "vec": [] + } + }, + { + "key": { + "symbol": "max_expires_in" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "min_amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "min_decimals" + }, + "val": { + "u32": 0 + } + } + ] + } + }, + { + "key": { + "symbol": "locked" + }, + "val": { + "map": [ + { + "key": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "val": { + "i128": "10000000" + } + } + ] + } + }, + { + "key": { + "symbol": "pkg_cnt" + }, + "val": { + "u64": "1" + } + }, + { + "key": { + "symbol": "pkg_idx" + }, + "val": { + "u64": "1" + } + }, + { + "key": { + "symbol": "rcnt" + }, + "val": { + "map": [ + { + "key": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + "val": { + "u64": "1" + } + } + ] + } + }, + { + "key": { + "symbol": "version" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "vec": [ + { + "symbol": "rpidx" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "u64": "0" + } + ] + }, + "val": { + "u64": "0" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": "1033654523790656264" + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": "1033654523790656264" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": "4837995959683129791" + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": "4837995959683129791" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1000000000" + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000002" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 120960 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/app/onchain/contracts/aid_escrow/test_snapshots/tampered_proof_is_rejected.1.json b/app/onchain/contracts/aid_escrow/test_snapshots/tampered_proof_is_rejected.1.json new file mode 100644 index 00000000..244e9ef3 --- /dev/null +++ b/app/onchain/contracts/aid_escrow/test_snapshots/tampered_proof_is_rejected.1.json @@ -0,0 +1,938 @@ +{ + "generators": { + "address": 2, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [], + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": "1000000000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "fund", + "args": [ + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": "1000000000" + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "i128": "1000000000" + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "create_package", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "u64": "0" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": "10000000" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + { + "u64": "86400" + }, + { + "map": [ + { + "key": { + "symbol": "merkle_root" + }, + "val": { + "string": "6e8a1e99583601eac4e0aa76aa9a3733c86de13844d59f6a3480995695a0bf6f" + } + } + ] + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 23, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "balance": "0", + "seq_num": "0", + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + null + ] + ], + [ + { + "contract_data": { + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "pidx" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "pidx" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "u64": "0" + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "pkg" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "pkg" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "10000000" + } + }, + { + "key": { + "symbol": "claim_starts_at" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "expires_at" + }, + "val": { + "u64": "86400" + } + }, + { + "key": { + "symbol": "id" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "metadata" + }, + "val": { + "map": [ + { + "key": { + "symbol": "merkle_root" + }, + "val": { + "string": "6e8a1e99583601eac4e0aa76aa9a3733c86de13844d59f6a3480995695a0bf6f" + } + } + ] + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "symbol": "cmt" + }, + "val": { + "map": [ + { + "key": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "val": { + "i128": "10000000" + } + } + ] + } + }, + { + "key": { + "symbol": "config" + }, + "val": { + "map": [ + { + "key": { + "symbol": "allowed_tokens" + }, + "val": { + "vec": [] + } + }, + { + "key": { + "symbol": "max_expires_in" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "min_amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "min_decimals" + }, + "val": { + "u32": 0 + } + } + ] + } + }, + { + "key": { + "symbol": "locked" + }, + "val": { + "map": [ + { + "key": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "val": { + "i128": "10000000" + } + } + ] + } + }, + { + "key": { + "symbol": "pkg_cnt" + }, + "val": { + "u64": "1" + } + }, + { + "key": { + "symbol": "pkg_idx" + }, + "val": { + "u64": "1" + } + }, + { + "key": { + "symbol": "rcnt" + }, + "val": { + "map": [ + { + "key": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + "val": { + "u64": "1" + } + } + ] + } + }, + { + "key": { + "symbol": "version" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "vec": [ + { + "symbol": "rpidx" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "u64": "0" + } + ] + }, + "val": { + "u64": "0" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": "1033654523790656264" + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": "1033654523790656264" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": "4837995959683129791" + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": "4837995959683129791" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1000000000" + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000002" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 120960 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/app/onchain/contracts/aid_escrow/test_snapshots/wrong_recipient_proof_is_rejected.1.json b/app/onchain/contracts/aid_escrow/test_snapshots/wrong_recipient_proof_is_rejected.1.json new file mode 100644 index 00000000..da8e6474 --- /dev/null +++ b/app/onchain/contracts/aid_escrow/test_snapshots/wrong_recipient_proof_is_rejected.1.json @@ -0,0 +1,939 @@ +{ + "generators": { + "address": 2, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [], + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": "1000000000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "fund", + "args": [ + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": "1000000000" + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "i128": "1000000000" + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "create_package", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "u64": "0" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": "10000000" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + { + "u64": "86400" + }, + { + "map": [ + { + "key": { + "symbol": "merkle_root" + }, + "val": { + "string": "6e8a1e99583601eac4e0aa76aa9a3733c86de13844d59f6a3480995695a0bf6f" + } + } + ] + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [] + ], + "ledger": { + "protocol_version": 23, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "balance": "0", + "seq_num": "0", + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + null + ] + ], + [ + { + "contract_data": { + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "pidx" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "pidx" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "u64": "0" + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "pkg" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "pkg" + }, + { + "u64": "0" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "10000000" + } + }, + { + "key": { + "symbol": "claim_starts_at" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "expires_at" + }, + "val": { + "u64": "86400" + } + }, + { + "key": { + "symbol": "id" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "metadata" + }, + "val": { + "map": [ + { + "key": { + "symbol": "merkle_root" + }, + "val": { + "string": "6e8a1e99583601eac4e0aa76aa9a3733c86de13844d59f6a3480995695a0bf6f" + } + } + ] + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "symbol": "cmt" + }, + "val": { + "map": [ + { + "key": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "val": { + "i128": "10000000" + } + } + ] + } + }, + { + "key": { + "symbol": "config" + }, + "val": { + "map": [ + { + "key": { + "symbol": "allowed_tokens" + }, + "val": { + "vec": [] + } + }, + { + "key": { + "symbol": "max_expires_in" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "min_amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "min_decimals" + }, + "val": { + "u32": 0 + } + } + ] + } + }, + { + "key": { + "symbol": "locked" + }, + "val": { + "map": [ + { + "key": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + }, + "val": { + "i128": "10000000" + } + } + ] + } + }, + { + "key": { + "symbol": "pkg_cnt" + }, + "val": { + "u64": "1" + } + }, + { + "key": { + "symbol": "pkg_idx" + }, + "val": { + "u64": "1" + } + }, + { + "key": { + "symbol": "rcnt" + }, + "val": { + "map": [ + { + "key": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + "val": { + "u64": "1" + } + } + ] + } + }, + { + "key": { + "symbol": "version" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "vec": [ + { + "symbol": "rpidx" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "u64": "0" + } + ] + }, + "val": { + "u64": "0" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": "1033654523790656264" + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": "1033654523790656264" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": "4837995959683129791" + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": "4837995959683129791" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1000000000" + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000002" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 120960 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/app/onchain/contracts/aid_escrow/tests/merkle_allowlist_tool.rs b/app/onchain/contracts/aid_escrow/tests/merkle_allowlist_tool.rs new file mode 100644 index 00000000..f57532c1 --- /dev/null +++ b/app/onchain/contracts/aid_escrow/tests/merkle_allowlist_tool.rs @@ -0,0 +1,326 @@ +#![cfg(test)] + +//! Compatibility tests between `tools/merkle-allowlist` output and the +//! contract's `claim_with_proof` verifier (issue #425). +//! +//! The JS tool and these tests implement the *same* canonical encoding the +//! contract verifies: leaf = sha256(
), pair = sha256(left || +//! right) with left <= right (byte-wise), hex without a 0x prefix. The root +//! and proof fixtures below were generated by running `node index.js` inside +//! `tools/merkle-allowlist`; if either side drifts, these tests fail. + +use aid_escrow::{AidEscrow, AidEscrowClient, Error}; +use soroban_sdk::{ + token::{StellarAssetClient, TokenClient}, + Address, Bytes, Env, Map, String, Symbol, Vec, +}; + +const UNIT: i128 = 10_000_000; + +/// Canonical allowlist — must match `tools/merkle-allowlist/sample_allowlist.json`. +/// +/// These are deterministic test-env contract addresses from the SDK's +/// `Address::generate` sequence, deliberately chosen from generator slots that +/// the harness below never consumes: `env.register(AidEscrow, ())` takes slot 0 +/// (the escrow contract itself) and `register_stellar_asset_contract_v2` takes +/// slot 1 (the SAC issuer), so slots 2-4 are the first addresses the harness +/// itself will never use. Contract (C...) recipients can hold the test SAC +/// asset without a trustline, unlike G... accounts, so the harness must not +/// mint or transfer to G-addresses (SAC `TrustlineMissingError`). +const ALLOWLIST: [&str; 3] = [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", +]; + +/// Admin for the test harness — generator slot 5, deliberately outside the +/// allowlist and never consumed by the harness setup. +const ADMIN: &str = "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4"; + +/// A stranger used in negative tests — generator slot 6, also not in the +/// allowlist. +const STRANGER: &str = "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"; + +/// Root emitted by `node tools/merkle-allowlist/index.js` for ALLOWLIST. +const EXPECTED_TOOL_ROOT: &str = "6e8a1e99583601eac4e0aa76aa9a3733c86de13844d59f6a3480995695a0bf6f"; + +/// Proof for ALLOWLIST[0] emitted by the same tool run. +const EXPECTED_TOOL_PROOF_0: [&str; 2] = [ + "0ecb188156fe839e84b079ba797da21e155fef714cee6b0da7bfad7be630ea72", + "d8f338ba99f1755387461749eabca43fd379b61dab5909112f41b3bde74d0ca6", +]; + +// --- Canonical encoding (mirrors the contract's verifier) --- + +fn leaf(env: &Env, address: &Address) -> [u8; 32] { + let addr = address.to_string(); + let mut data = Bytes::new(env); + for b in addr.to_bytes().iter() { + data.push_back(b); + } + env.crypto().sha256(&data).to_array() +} + +fn hash_pair(env: &Env, left: &[u8; 32], right: &[u8; 32]) -> [u8; 32] { + let (a, b) = if left <= right { + (left, right) + } else { + (right, left) + }; + let mut data = Bytes::new(env); + for byte in a.iter().chain(b.iter()) { + data.push_back(*byte); + } + env.crypto().sha256(&data).to_array() +} + +fn build_root(env: &Env, leaves: &[[u8; 32]]) -> [u8; 32] { + let mut level: std::vec::Vec<[u8; 32]> = leaves.to_vec(); + while level.len() > 1 { + let mut next: std::vec::Vec<[u8; 32]> = std::vec::Vec::new(); + let mut i = 0; + while i < level.len() { + if i + 1 < level.len() { + next.push(hash_pair(env, &level[i], &level[i + 1])); + } else { + next.push(level[i]); // odd leaf promoted unchanged + } + i += 2; + } + level = next; + } + level[0] +} + +fn build_proof(env: &Env, leaves: &[[u8; 32]], index: usize) -> std::vec::Vec<[u8; 32]> { + let mut level: std::vec::Vec<[u8; 32]> = leaves.to_vec(); + let mut idx = index; + let mut proof: std::vec::Vec<[u8; 32]> = std::vec::Vec::new(); + while level.len() > 1 { + let mut next: std::vec::Vec<[u8; 32]> = std::vec::Vec::new(); + let mut i = 0; + while i < level.len() { + if i + 1 < level.len() { + next.push(hash_pair(env, &level[i], &level[i + 1])); + if i == idx { + proof.push(level[i + 1]); + } else if i + 1 == idx { + proof.push(level[i]); + } + } else { + next.push(level[i]); + } + i += 2; + } + idx /= 2; + level = next; + } + proof +} + +fn to_hex(bytes: &[u8]) -> std::string::String { + let mut out = std::string::String::with_capacity(bytes.len() * 2); + for b in bytes { + out.push_str(&format!("{:02x}", b)); + } + out +} + +fn strkey(a: &Address) -> std::string::String { + let sb = a.to_string().to_bytes(); + let mut out = std::string::String::new(); + for b in sb.iter() { + out.push(b as char); + } + out +} + +fn allowlist_addresses(env: &Env) -> std::vec::Vec
{ + ALLOWLIST + .iter() + .map(|s| Address::from_str(env, s)) + .collect() +} + +fn allowlist_leaves(env: &Env) -> std::vec::Vec<[u8; 32]> { + allowlist_addresses(env) + .iter() + .map(|a| leaf(env, a)) + .collect() +} + +fn proof_to_soroban_vec(env: &Env, proof: &[[u8; 32]]) -> Vec { + let mut out: Vec = Vec::new(env); + for h in proof { + out.push_back(String::from_str(env, &to_hex(h))); + } + out +} + +// --- Harness --- + +struct Harness { + env: Env, + client: AidEscrowClient<'static>, + admin: Address, + token: Address, + token_client: TokenClient<'static>, +} + +impl Harness { + fn new() -> Self { + let env = Env::default(); + env.mock_all_auths(); + let admin = Address::from_str(&env, ADMIN); + let client = AidEscrowClient::new(&env, &env.register(AidEscrow, ())); + client.init(&admin); + + let token_contract = env.register_stellar_asset_contract_v2(admin.clone()); + let token = token_contract.address(); + let sac = StellarAssetClient::new(&env, &token); + sac.mint(&admin, &(100 * UNIT)); + client.fund(&token, &admin, &(100 * UNIT)); + let token_client = TokenClient::new(&env, &token); + + Harness { + env, + client, + admin, + token, + token_client, + } + } + + fn create_merkle_package(&self, id: u64, claimant: &Address, root_hex: &str) -> u64 { + let mut metadata = Map::new(&self.env); + metadata.set( + Symbol::new(&self.env, "merkle_root"), + String::from_str(&self.env, root_hex), + ); + self.client.create_package( + &self.admin, + &id, + claimant, + &UNIT, + &self.token, + &86_400, + &metadata, + ) + } +} + +// --- Tests --- + +/// The Rust re-computation of the canonical root/proofs matches the JS tool's +/// committed output — this is the tool <-> contract sync pin. +#[test] +fn rust_encoding_matches_tool_output() { + let env = Env::default(); + let leaves = allowlist_leaves(&env); + + assert_eq!(to_hex(&build_root(&env, &leaves)), EXPECTED_TOOL_ROOT); + let proof0 = build_proof(&env, &leaves, 0); + let proof0_hex: std::vec::Vec = proof0.iter().map(|h| to_hex(h)).collect(); + assert_eq!(proof0_hex, EXPECTED_TOOL_PROOF_0); +} + +/// Every allowlist entry can claim a merkle-protected package on-chain with +/// the tool-format proof (multi-leaf tree, real claim_with_proof calls). +#[test] +fn claim_with_proof_accepts_tool_format_proofs() { + let h = Harness::new(); + let addrs = allowlist_addresses(&h.env); + let leaves = allowlist_leaves(&h.env); + let root_hex = to_hex(&build_root(&h.env, &leaves)); + + for (i, addr) in addrs.iter().enumerate() { + let id = h.create_merkle_package(i as u64, addr, &root_hex); + let proof = proof_to_soroban_vec(&h.env, &build_proof(&h.env, &leaves, i)); + + let res = h.client.try_claim_with_proof(&id, addr, &proof); + assert_eq!(res, Ok(Ok(())), "entry {} should claim successfully", i); + let bal = h.token_client.balance(addr); + assert_eq!( + bal, + UNIT, + "entry {} balance: addr={}, admin={}, contract={}, UNIT={}", + i, + strkey(addr), + strkey(&h.admin), + h.token_client.balance(&h.admin), + bal + ); + } +} + +/// An address that is not in the allowlist cannot claim a merkle-protected +/// package, even with a proof for an allowlisted address, and a direct +/// (proof-less) claim on a merkle package is rejected. +#[test] +fn wrong_recipient_proof_is_rejected() { + let h = Harness::new(); + let addrs = allowlist_addresses(&h.env); + let leaves = allowlist_leaves(&h.env); + let root_hex = to_hex(&build_root(&h.env, &leaves)); + + let id = h.create_merkle_package(0, &addrs[0], &root_hex); + + // A stranger (not in the allowlist) presents entry 0's proof. + let stranger = Address::from_str(&h.env, STRANGER); + let wrong_proof = proof_to_soroban_vec(&h.env, &build_proof(&h.env, &leaves, 0)); + let res = h.client.try_claim_with_proof(&id, &stranger, &wrong_proof); + assert_eq!(res, Err(Ok(Error::InvalidProof))); + + // Direct claim is also rejected for merkle-protected packages. + let direct = h.client.try_claim(&id, &addrs[0]); + assert_eq!(direct, Err(Ok(Error::InvalidProof))); +} + +/// Tampering with any sibling in the proof fails verification. +#[test] +fn tampered_proof_is_rejected() { + let h = Harness::new(); + let addrs = allowlist_addresses(&h.env); + let leaves = allowlist_leaves(&h.env); + let root_hex = to_hex(&build_root(&h.env, &leaves)); + + let id = h.create_merkle_package(0, &addrs[0], &root_hex); + + let mut tampered = build_proof(&h.env, &leaves, 0); + let first_hex = to_hex(&tampered[0]); + let flipped = format!( + "{}{}", + &first_hex[..first_hex.len() - 1], + if first_hex.ends_with('0') { '1' } else { '0' } + ); + let mut raw = [0u8; 32]; + for (k, byte) in raw.iter_mut().enumerate() { + *byte = u8::from_str_radix(&flipped[k * 2..k * 2 + 2], 16).unwrap(); + } + tampered[0] = raw; + + let proof = proof_to_soroban_vec(&h.env, &tampered); + let res = h.client.try_claim_with_proof(&id, &addrs[0], &proof); + assert_eq!(res, Err(Ok(Error::InvalidProof))); +} + +/// A root built from a different tree (same leaves, different order) is +/// rejected even with a proof valid against the real root. +#[test] +fn mismatched_root_is_rejected() { + let h = Harness::new(); + let addrs = allowlist_addresses(&h.env); + let leaves = allowlist_leaves(&h.env); + let real_root = to_hex(&build_root(&h.env, &leaves)); + + // Different tree: same leaves in reverse order. + let reversed: std::vec::Vec<[u8; 32]> = leaves.iter().rev().copied().collect(); + let alt_root = to_hex(&build_root(&h.env, &reversed)); + + assert_ne!(real_root, alt_root); + + let id = h.create_merkle_package(0, &addrs[0], &alt_root); + let proof = proof_to_soroban_vec(&h.env, &build_proof(&h.env, &leaves, 0)); + let res = h.client.try_claim_with_proof(&id, &addrs[0], &proof); + assert_eq!(res, Err(Ok(Error::InvalidProof))); +} diff --git a/tools/merkle-allowlist/README.md b/tools/merkle-allowlist/README.md index b50e65ee..93ac97bf 100644 --- a/tools/merkle-allowlist/README.md +++ b/tools/merkle-allowlist/README.md @@ -1,27 +1,76 @@ -Merkle Allowlist Test Tool +# Merkle Allowlist Tool -Usage +Builds Merkle allowlist roots and proofs for the Soroban `aid_escrow` +contract's `claim_with_proof` verifier. **Zero dependencies** — Node's +`crypto` module only (no ethers, no merkletreejs, no keccak256). -1. Install dependencies: +## Canonical encoding (must match the contract exactly) -```bash -cd tools/merkle-allowlist -npm ci -``` +The contract verifies claims in `verify_merkle_proof_for_claimant` +(`app/onchain/contracts/aid_escrow/src/lib.rs`): + +| Piece | Encoding | +|---|---| +| Leaf | `sha256()` — the exact bytes `Address::to_string()` produces on-chain. The claim amount is **not** part of the leaf; the contract's verifier binds only the claimant address. | +| Pair combine | `sha256(left \|\| right)` with `left <= right` (byte-wise lexicographic comparison of the two 32-byte hashes). | +| Root | The Merkle root built from the leaves with that leaf and pairing rule, promoted unchanged for odd leaves. | +| Proof | Bottom-up list of sibling hashes, one per tree level, hex-encoded as **64 lowercase hex chars with no `0x` prefix**. | +| Metadata | `merkle_root` (64-hex root) and optional `merkle_root_expires_at` (unix seconds) set on a package's `metadata` map. | -2. Run locally (no on-chain calls): +Both the tool (JS) and the contract (Rust) implement this exact encoding. The +contract test suite pins the agreement: `tests/merkle_allowlist_tool.rs` +recomputes the root for `sample_allowlist.json` and asserts the contract's +`claim_with_proof` accepts the tool-format proofs on-chain (including a +hardcoded `EXPECTED_ROOT` generated by running this tool). + +## Usage ```bash +cd tools/merkle-allowlist + +# No npm install needed. node index.js ``` -3. To verify on-chain, set env vars: +Output is newline-delimited JSON. The first line is the root: -```bash -export TESTNET_RPC_URL="https://..." -export MERKLE_CONTRACT_ADDRESS="0x..." -export MERKLE_CONTRACT_ABI_PATH="/path/to/abi.json" -node index.js ``` +ROOT: <64 lowercase hex chars> +``` + +Then one JSON object per scenario (`valid`, `invalid_proof_path`, +`wrong_recipient`, `wrong_leaf`, `mismatched_root`), each with a stable +`result` object: `success: true` or `error: { code, message }`. A final +`proofs` object lists the per-address proof for every allowlist entry. + +| Scenario | Expected `result` | +|---|---| +| `valid` | `success: true` | +| `invalid_proof_path` | `error.code: "INVALID_PROOF"` | +| `wrong_recipient` | `error.code: "WRONG_RECIPIENT"` | +| `wrong_leaf` | `error.code: "WRONG_LEAF"` | +| `mismatched_root` | `error.code: "MISMATCHED_ROOT"` | + +## Publishing a root for a package + +1. Replace `sample_allowlist.json` with the real allowlist (each entry: + `{ "address": "" }`). +2. Run `node index.js` and take the `ROOT:` value. +3. Create the package with metadata `merkle_root = ` (and optionally + `merkle_root_expires_at = `). +4. Distribute each recipient's `proof` array (from the `proofs` output); they + call `claim_with_proof(id, address, proof)`. + +> Amounts are not bound by the contract's verifier. Binding per-recipient +> amounts into the leaf is a separate, open issue (the previous EVM-style +> `keccak256(abi.encodePacked(address, amount))` leaf is incompatible with the +> contract and has been removed). + +## Previous EVM implementation -Stable error outputs: the tool emits JSON lines with a `result` object containing either `success: true` or `error: { code, message }`. Use these codes to map backend errors. +The old tool used `ethers` + `merkletreejs` + `keccak256` and produced +`keccak256(abi.encodePacked(address, amount))` leaves for an Ethereum-style +verifier that `aid_escrow` does not run. Every proof it generated failed +on-chain with `Error::InvalidProof` while printing "valid" locally — a +false-positive smoke signal. Those dependencies are removed; do not reintroduce +them without also changing the contract's verifier. diff --git a/tools/merkle-allowlist/index.js b/tools/merkle-allowlist/index.js index 5dacf57a..da1e3922 100644 --- a/tools/merkle-allowlist/index.js +++ b/tools/merkle-allowlist/index.js @@ -1,44 +1,95 @@ +#!/usr/bin/env node +/** + * merkle-allowlist — builds Merkle allowlist roots and proofs for the + * Soroban `aid_escrow` contract's `claim_with_proof` verifier. + * + * The contract (app/onchain/contracts/aid_escrow/src/lib.rs) verifies proofs + * with: + * + * leaf = sha256() + * pair = sha256(sorted(left, right)) // sorted = byte-wise ascending + * root = the Merkle root built with that leaf and pairing rule + * + * Proofs are hex-encoded (64 lowercase hex chars, no 0x prefix), bottom-up, + * one sibling per tree level. The `merkle_root` and `merkle_root_expires_at` + * metadata values published on a package are read from the allowlist emitted + * here. + * + * This tool deliberately has ZERO dependencies: Node's `crypto` module only. + * No ethers, no merkletreejs, no keccak256 — the previous EVM-flavored + * implementation produced proofs no Soroban verifier could accept. + */ + +'use strict'; + +const crypto = require('crypto'); const fs = require('fs'); const path = require('path'); -const { ethers } = require('ethers'); -const { MerkleTree } = require('merkletreejs'); -const keccak256 = require('keccak256'); - -const RPC_URL = process.env.TESTNET_RPC_URL; -const CONTRACT_ADDRESS = process.env.MERKLE_CONTRACT_ADDRESS; -const CONTRACT_ABI_PATH = process.env.MERKLE_CONTRACT_ABI_PATH; // optional -const VERIFY_METHOD = process.env.MERKLE_VERIFY_METHOD || 'verify'; -const RETRIES = parseInt(process.env.MERKLE_RETRIES || '3', 10); -const RETRY_DELAY_MS = parseInt(process.env.MERKLE_RETRY_DELAY_MS || '2000', 10); -const OP_TIMEOUT_MS = parseInt(process.env.MERKLE_OP_TIMEOUT_MS || '60000', 10); - -function sleep(ms) { return new Promise((r) => setTimeout(r, ms)); } - -async function withRetry(fn, desc) { - let lastErr; - for (let i = 0; i < RETRIES; i++) { - try { - const res = await Promise.race([ - fn(), - new Promise((_, rej) => setTimeout(() => rej(new Error('timeout')), OP_TIMEOUT_MS)), - ]); - return res; - } catch (err) { - lastErr = err; - console.error(`Attempt ${i + 1}/${RETRIES} failed for ${desc}: ${err.message}`); - if (i < RETRIES - 1) await sleep(RETRY_DELAY_MS); + +const sha256 = (buf) => crypto.createHash('sha256').update(buf).digest(); + +/** + * Contract-compatible leaf: sha256 of the exact bytes `Address::to_string()` + * produces on-chain. The amount is intentionally NOT part of the leaf — the + * contract's verifier only binds the claimant address (see + * `hash_address` in src/lib.rs). + */ +function makeLeaf(addressString) { + return sha256(Buffer.from(addressString, 'utf8')); +} + +/** Contract-compatible pair combine: sort the two 32-byte hashes byte-wise + * ascending, then hash left || right with sha256. */ +function hashPair(left, right) { + const [a, b] = Buffer.compare(left, right) <= 0 ? [left, right] : [right, left]; + return sha256(Buffer.concat([a, b])); +} + +/** Returns the tree root (Buffer) for the given allowlist leaves. */ +function buildRoot(leaves) { + let level = leaves.slice(); + while (level.length > 1) { + const next = []; + for (let i = 0; i < level.length; i += 2) { + if (i + 1 < level.length) next.push(hashPair(level[i], level[i + 1])); + else next.push(level[i]); // odd leaf promoted unchanged } + level = next; } - throw lastErr; + return level[0]; } -function makeLeaf(entry) { - // Standard leaf encoding: keccak256(abi.encodePacked(address, amount)) - return ethers.utils.keccak256( - ethers.utils.defaultAbiCoder.encode(['address', 'uint256'], [entry.address.toLowerCase(), ethers.BigNumber.from(entry.amount).toString()]) - ); +/** Returns the proof (array of Buffers, bottom-up) for the leaf at `index`. */ +function buildProof(leaves, index) { + let level = leaves.slice(); + let idx = index; + const proof = []; + while (level.length > 1) { + const next = []; + for (let i = 0; i < level.length; i += 2) { + if (i + 1 < level.length) { + next.push(hashPair(level[i], level[i + 1])); + if (i === idx) proof.push(level[i + 1]); + else if (i + 1 === idx) proof.push(level[i]); + } else { + next.push(level[i]); + } + } + idx = Math.floor(idx / 2); + level = next; + } + return proof; +} + +/** Replicates the contract's `verify_merkle_proof_for_claimant` walk. */ +function verify(leaf, proof, root) { + let current = leaf; + for (const sibling of proof) current = hashPair(current, sibling); + return current.equals(root); } +const toHex = (buf) => buf.toString('hex'); + function formatResult({ success, code, message, details }) { const out = { success: !!success }; if (success) out.code = 'OK'; @@ -46,82 +97,135 @@ function formatResult({ success, code, message, details }) { return out; } -async function maybeCallOnchain(proof, leaf, root) { - if (!RPC_URL || !CONTRACT_ADDRESS || !CONTRACT_ABI_PATH) return { skipped: true }; - const provider = new ethers.providers.JsonRpcProvider(RPC_URL); - const abiRaw = fs.readFileSync(path.resolve(CONTRACT_ABI_PATH), 'utf8'); - let abi; - try { abi = JSON.parse(abiRaw); } catch (e) { throw new Error('Invalid ABI JSON'); } - const contract = new ethers.Contract(CONTRACT_ADDRESS, abi, provider); - if (typeof contract[VERIFY_METHOD] !== 'function') throw new Error('Verify method not found on contract ABI'); - try { - const res = await withRetry(() => contract[VERIFY_METHOD](proof, leaf, root), 'contract.verify'); - return { skipped: false, onchainResult: res }; - } catch (err) { - return { skipped: false, onchainError: err.message }; - } -} +function main() { + const samplePath = path.resolve(__dirname, 'sample_allowlist.json'); + const sample = JSON.parse(fs.readFileSync(samplePath, 'utf8')); -async function run() { - const sample = JSON.parse(fs.readFileSync(path.resolve(__dirname, 'sample_allowlist.json'))); - const leaves = sample.map((e) => Buffer.from(ethers.utils.arrayify(makeLeaf(e)))); - const tree = new MerkleTree(leaves, keccak256, { sortPairs: true }); - const root = tree.getHexRoot(); - console.log('ROOT:', root); - - // Pick a valid entry - const entry = sample[0]; - const leafHex = makeLeaf(entry); - const leafBuf = Buffer.from(ethers.utils.arrayify(leafHex)); - const proof = tree.getHexProof(leafBuf); - - // 1) Valid proof - const valid = tree.verify(proof, leafBuf, root); - console.log(JSON.stringify({ scenario: 'valid', result: formatResult({ success: valid, message: valid ? 'Proof valid' : 'Proof invalid' }), proof, leaf: leafHex, root })); - - // Optionally call on-chain verify - if (CONTRACT_ADDRESS && CONTRACT_ABI_PATH) { - const onchain = await maybeCallOnchain(proof, leafHex, root); - console.log(JSON.stringify({ scenario: 'valid_onchain', onchain })); + if (!Array.isArray(sample) || sample.length === 0) { + throw new Error('sample_allowlist.json must be a non-empty array of { address } entries'); } - // 2) Invalid proof path (tamper one proof element) - const badProofPath = proof.slice(); + const leaves = sample.map((entry) => { + if (typeof entry.address !== 'string' || !/^[A-Z2-7]{56}$/.test(entry.address)) { + throw new Error(`Invalid Stellar address in allowlist: ${entry.address}`); + } + return makeLeaf(entry.address); + }); + + const root = buildRoot(leaves); + const rootHex = toHex(root); + console.log(`ROOT: ${rootHex}`); + + // 1) Valid proof for the first entry. + const validIndex = 0; + const validLeaf = leaves[validIndex]; + const proof = buildProof(leaves, validIndex); + const valid = verify(validLeaf, proof, root); + console.log( + JSON.stringify({ + scenario: 'valid', + result: formatResult({ + success: valid, + message: valid ? 'Proof valid' : 'Proof invalid', + }), + proof: proof.map(toHex), + leaf: toHex(validLeaf), + root: rootHex, + }) + ); + + // 2) Invalid proof path (tamper one proof element). + const badProofPath = proof.map((b) => Buffer.from(b)); if (badProofPath.length > 0) { - const first = badProofPath[0]; - // flip last hex nibble deterministically - const tampered = first.slice(0, -1) + (first.slice(-1) === '0' ? '1' : '0'); - badProofPath[0] = tampered; + const hex = badProofPath[0].toString('hex'); + const tampered = hex.slice(0, -1) + (hex.slice(-1) === '0' ? '1' : '0'); + badProofPath[0] = Buffer.from(tampered, 'hex'); } - const invalidPathValid = tree.verify(badProofPath, leafBuf, root); - console.log(JSON.stringify({ scenario: 'invalid_proof_path', result: formatResult({ success: invalidPathValid, code: invalidPathValid ? 'OK' : 'INVALID_PROOF', message: invalidPathValid ? 'Unexpectedly valid' : 'Proof path invalid' }), proof: badProofPath, leaf: leafHex, root })); - - // 3) Wrong recipient (use a different address in leaf) - const wrongRecipient = { address: '0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', amount: entry.amount }; - const wrongLeaf = makeLeaf(wrongRecipient); - const wrongLeafBuf = Buffer.from(ethers.utils.arrayify(wrongLeaf)); - const wrongRecipientValid = tree.verify(proof, wrongLeafBuf, root); - console.log(JSON.stringify({ scenario: 'wrong_recipient', result: formatResult({ success: wrongRecipientValid, code: wrongRecipientValid ? 'OK' : 'WRONG_RECIPIENT', message: wrongRecipientValid ? 'Unexpectedly valid' : 'Proof does not match recipient' }), proof, leaf: wrongLeaf, root })); - - // 4) Wrong leaf (modify amount) - const wrongAmount = { address: entry.address, amount: (Number(entry.amount) + 99).toString() }; - const wrongLeaf2 = makeLeaf(wrongAmount); - const wrongLeaf2Buf = Buffer.from(ethers.utils.arrayify(wrongLeaf2)); - const wrongLeafValid = tree.verify(proof, wrongLeaf2Buf, root); - console.log(JSON.stringify({ scenario: 'wrong_leaf', result: formatResult({ success: wrongLeafValid, code: wrongLeafValid ? 'OK' : 'WRONG_LEAF', message: wrongLeafValid ? 'Unexpectedly valid' : 'Leaf data mismatch' }), proof, leaf: wrongLeaf2, root })); - - // 5) Mismatched root (use a root from a different tree) - const altSample = sample.slice().reverse(); - const altLeaves = altSample.map((e) => Buffer.from(ethers.utils.arrayify(makeLeaf(e)))); - const altTree = new MerkleTree(altLeaves, keccak256, { sortPairs: true }); - const altRoot = altTree.getHexRoot(); - const mismatchedValid = tree.verify(proof, leafBuf, altRoot); - console.log(JSON.stringify({ scenario: 'mismatched_root', result: formatResult({ success: mismatchedValid, code: mismatchedValid ? 'OK' : 'MISMATCHED_ROOT', message: mismatchedValid ? 'Unexpectedly valid' : 'Root mismatch' }), proof, leaf: leafHex, altRoot })); + const invalidPathValid = verify(validLeaf, badProofPath, root); + console.log( + JSON.stringify({ + scenario: 'invalid_proof_path', + result: formatResult({ + success: invalidPathValid, + code: invalidPathValid ? 'OK' : 'INVALID_PROOF', + message: invalidPathValid ? 'Unexpectedly valid' : 'Proof path invalid', + }), + proof: badProofPath.map(toHex), + leaf: toHex(validLeaf), + root: rootHex, + }) + ); + + // 3) Wrong recipient (a leaf for an address not in the tree). + const stranger = 'GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWHF'; + const wrongLeaf = makeLeaf(stranger); + const wrongRecipientValid = verify(wrongLeaf, proof, root); + console.log( + JSON.stringify({ + scenario: 'wrong_recipient', + result: formatResult({ + success: wrongRecipientValid, + code: wrongRecipientValid ? 'OK' : 'WRONG_RECIPIENT', + message: wrongRecipientValid ? 'Unexpectedly valid' : 'Proof does not match recipient', + }), + proof: proof.map(toHex), + leaf: toHex(wrongLeaf), + root: rootHex, + }) + ); + + // 4) Wrong leaf (an in-tree address hashed with a non-canonical encoding, + // e.g. the old amount-bound keccak-style layout — proves the leaf + // format is enforced, not just the address). + const inTree = sample[0].address; + const wrongEncodingLeaf = sha256(Buffer.from(inTree + ':' + '1', 'utf8')); + const wrongLeafValid = verify(wrongEncodingLeaf, proof, root); + console.log( + JSON.stringify({ + scenario: 'wrong_leaf', + result: formatResult({ + success: wrongLeafValid, + code: wrongLeafValid ? 'OK' : 'WRONG_LEAF', + message: wrongLeafValid ? 'Unexpectedly valid' : 'Leaf data mismatch', + }), + proof: proof.map(toHex), + leaf: toHex(wrongEncodingLeaf), + root: rootHex, + }) + ); + + // 5) Mismatched root (root of a different tree built from the same leaves + // in a different order — with sorted-pair hashing this changes the root). + const altRoot = buildRoot(leaves.slice().reverse()); + const mismatchedValid = verify(validLeaf, proof, altRoot); + console.log( + JSON.stringify({ + scenario: 'mismatched_root', + result: formatResult({ + success: mismatchedValid, + code: mismatchedValid ? 'OK' : 'MISMATCHED_ROOT', + message: mismatchedValid ? 'Unexpectedly valid' : 'Root mismatch', + }), + proof: proof.map(toHex), + leaf: toHex(validLeaf), + altRoot: toHex(altRoot), + }) + ); + + // 6) Full proof dump for every entry (useful for publishing `merkle_root` + // metadata and distributing per-recipient proofs). + const entries = sample.map((entry, i) => ({ + address: entry.address, + proof: buildProof(leaves, i).map(toHex), + })); + console.log(JSON.stringify({ scenario: 'proofs', entries })); console.log('Merkle allowlist checks complete'); } -run().catch((err) => { - console.error('Unhandled error:', err.message); +try { + main(); +} catch (err) { + console.error('Error:', err.message); process.exitCode = 1; -}); +} diff --git a/tools/merkle-allowlist/package.json b/tools/merkle-allowlist/package.json index 360ede30..73811946 100644 --- a/tools/merkle-allowlist/package.json +++ b/tools/merkle-allowlist/package.json @@ -2,12 +2,11 @@ "name": "merkle-allowlist", "version": "0.1.0", "private": true, + "description": "Builds SHA-256 Merkle allowlist roots/proofs for the Soroban aid_escrow contract's claim_with_proof verifier.", "scripts": { "start": "node index.js" }, - "dependencies": { - "ethers": "^5.7.2", - "merkletreejs": "^0.2.31", - "keccak256": "^1.0.6" + "engines": { + "node": ">=16" } } diff --git a/tools/merkle-allowlist/sample_allowlist.json b/tools/merkle-allowlist/sample_allowlist.json index 9a7b0bed..3acd33c3 100644 --- a/tools/merkle-allowlist/sample_allowlist.json +++ b/tools/merkle-allowlist/sample_allowlist.json @@ -1,5 +1,5 @@ [ - { "address": "0x1111111111111111111111111111111111111111", "amount": "1" }, - { "address": "0x2222222222222222222222222222222222222222", "amount": "2" }, - { "address": "0x3333333333333333333333333333333333333333", "amount": "3" } + { "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" }, + { "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" }, + { "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" } ]