diff --git a/acbu_minting/test_snapshots/test_mint_from_fiat_rejects_duplicate_tx_id.1.json b/acbu_minting/test_snapshots/test_mint_from_fiat_rejects_duplicate_tx_id.1.json index 31c8795c..9df7a81c 100644 --- a/acbu_minting/test_snapshots/test_mint_from_fiat_rejects_duplicate_tx_id.1.json +++ b/acbu_minting/test_snapshots/test_mint_from_fiat_rejects_duplicate_tx_id.1.json @@ -1,20 +1,20 @@ { "generators": { - "address": 7, + "address": 10, "nonce": 0 }, "auth": [ [ [ - "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJXFF", + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", { "function": { "contract_fn": { - "contract_address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", "function_name": "set_admin", "args": [ { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } ] } @@ -25,11 +25,11 @@ ], [ [ - "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF", { "function": { "contract_fn": { - "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "contract_address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", "function_name": "set_admin", "args": [ { @@ -49,49 +49,58 @@ { "function": { "contract_fn": { - "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "set_operator", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", "function_name": "mint_from_fiat", "args": [ { - "string": "NGN" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "vec": [ + { + "vec": [ + { + "string": "NGN" + } + ] + } + ] }, { "i128": { "hi": 0, - "lo": 100000000 + "lo": 500000000 } }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" - }, - { - "string": "FTX-001" + "string": "fiat_tx_duplicate" } ] } }, - "sub_invocations": [ - { - "function": { - "contract_fn": { - "contract_address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", - "function_name": "mint", - "args": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" - }, - { - "i128": { - "hi": 0, - "lo": 97000000 - } - } - ] - } - }, - "sub_invocations": [] - } - ] + "sub_invocations": [] } ] ], @@ -110,7 +119,7 @@ [ { "account": { - "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJXFF" + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" } }, [ @@ -118,7 +127,7 @@ "last_modified_ledger_seq": 0, "data": { "account": { - "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJXFF", + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", "balance": 0, "seq_num": 0, "num_sub_entries": 0, @@ -138,7 +147,7 @@ [ { "account": { - "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF" } }, [ @@ -146,7 +155,7 @@ "last_modified_ledger_seq": 0, "data": { "account": { - "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF", "balance": 0, "seq_num": 0, "num_sub_entries": 0, @@ -166,7 +175,7 @@ [ { "contract_data": { - "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJXFF", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", "key": { "ledger_key_nonce": { "nonce": 801925984706572462 @@ -181,7 +190,7 @@ "data": { "contract_data": { "ext": "v0", - "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJXFF", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", "key": { "ledger_key_nonce": { "nonce": 801925984706572462 @@ -199,7 +208,7 @@ [ { "contract_data": { - "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF", "key": { "ledger_key_nonce": { "nonce": 5541220902715666415 @@ -214,7 +223,7 @@ "data": { "contract_data": { "ext": "v0", - "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF", "key": { "ledger_key_nonce": { "nonce": 5541220902715666415 @@ -265,17 +274,40 @@ [ { "contract_data": { - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", - "key": { - "vec": [ - { - "symbol": "FTX_USED" - }, - { - "string": "FTX-001" + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": null + } } - ] + } }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", "durability": "persistent" } }, @@ -285,20 +317,16 @@ "data": { "contract_data": { "ext": "v0", - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", - "key": { - "vec": [ - { - "symbol": "FTX_USED" - }, - { - "string": "FTX-001" - } - ] - }, + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", "durability": "persistent", "val": { - "bool": true + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": null + } } } }, @@ -310,7 +338,7 @@ [ { "contract_data": { - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", "key": "ledger_key_contract_instance", "durability": "persistent" } @@ -321,7 +349,7 @@ "data": { "contract_data": { "ext": "v0", - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", "key": "ledger_key_contract_instance", "durability": "persistent", "val": { @@ -335,7 +363,7 @@ "symbol": "ACBU_TKN" }, "val": { - "address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN" + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" } }, { @@ -353,10 +381,38 @@ "val": { "i128": { "hi": 0, - "lo": 300 + "lo": 50 + } + } + }, + { + "key": { + "symbol": "FEE_SGL" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100 } } }, + { + "key": { + "symbol": "FTX_IDS" + }, + "val": { + "map": [ + { + "key": { + "string": "fiat_tx_duplicate" + }, + "val": { + "bool": true + } + } + ] + } + }, { "key": { "symbol": "MAX_MINT" @@ -368,6 +424,17 @@ } } }, + { + "key": { + "symbol": "MAX_SUP" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000000000000 + } + } + }, { "key": { "symbol": "MIN_MINT" @@ -379,6 +446,14 @@ } } }, + { + "key": { + "symbol": "OPERATOR" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + }, { "key": { "symbol": "ORACLE" @@ -403,12 +478,51 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" } }, + { + "key": { + "symbol": "SUPPLY" + }, + "val": { + "i128": { + "hi": 0, + "lo": 497500000 + } + } + }, + { + "key": { + "symbol": "TRSY" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + }, { "key": { "symbol": "USDC_TKN" }, "val": { - "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + "address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN" + } + }, + { + "key": { + "symbol": "VAULT" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Version" + } + ] + }, + "val": { + "u32": 1 } } ] @@ -424,18 +538,13 @@ [ { "contract_data": { - "contract": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", "key": { - "vec": [ - { - "symbol": "Balance" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" - } - ] + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } }, - "durability": "persistent" + "durability": "temporary" } }, [ @@ -444,60 +553,25 @@ "data": { "contract_data": { "ext": "v0", - "contract": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", "key": { - "vec": [ - { - "symbol": "Balance" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" - } - ] + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } }, - "durability": "persistent", - "val": { - "map": [ - { - "key": { - "symbol": "amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 97000000 - } - } - }, - { - "key": { - "symbol": "authorized" - }, - "val": { - "bool": true - } - }, - { - "key": { - "symbol": "clawback" - }, - "val": { - "bool": false - } - } - ] - } + "durability": "temporary", + "val": "void" } }, "ext": "v0" }, - 518400 + 6311999 ] ], [ { "contract_data": { - "contract": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", "key": "ledger_key_contract_instance", "durability": "persistent" } @@ -508,7 +582,7 @@ "data": { "contract_data": { "ext": "v0", - "contract": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN", + "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", "key": "ledger_key_contract_instance", "durability": "persistent", "val": { @@ -534,7 +608,7 @@ "symbol": "name" }, "val": { - "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJXFF" + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF" } }, { @@ -588,7 +662,7 @@ "symbol": "issuer" }, "val": { - "bytes": "0000000000000000000000000000000000000000000000000000000000000004" + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" } } ] @@ -610,7 +684,16 @@ { "contract_data": { "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", - "key": "ledger_key_contract_instance", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, "durability": "persistent" } }, @@ -621,14 +704,151 @@ "contract_data": { "ext": "v0", "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", - "key": "ledger_key_contract_instance", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, "durability": "persistent", "val": { - "contract_instance": { - "executable": "stellar_asset", - "storage": [ - { - "key": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 497500000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 2500000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { "symbol": "METADATA" }, "val": { @@ -669,7 +889,7 @@ ] }, "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, { @@ -733,15 +953,336 @@ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "code": "" } - }, - "ext": "v0" - }, - 4095 - ] - ] - ] - }, - "events": [ + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000005" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000006" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000004" + }, + { + "symbol": "initialize" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + }, + { + "address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "i128": { + "hi": 0, + "lo": 50 + } + }, + { + "i128": { + "hi": 0, + "lo": 100 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "initialize" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, { "event": { "ext": "v0", @@ -754,14 +1295,14 @@ "symbol": "fn_call" }, { - "bytes": "8011bbf4cdf04e5bc6ac886935b99aa4b2c0cabde133f9d7fb3e656799f0a896" + "bytes": "0000000000000000000000000000000000000000000000000000000000000004" }, { - "symbol": "init_asset" + "symbol": "set_operator" } ], "data": { - "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000004" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" } } } @@ -771,7 +1312,7 @@ { "event": { "ext": "v0", - "contract_id": "8011bbf4cdf04e5bc6ac886935b99aa4b2c0cabde133f9d7fb3e656799f0a896", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", "type_": "diagnostic", "body": { "v0": { @@ -780,7 +1321,7 @@ "symbol": "fn_return" }, { - "symbol": "init_asset" + "symbol": "set_operator" } ], "data": "void" @@ -801,14 +1342,41 @@ "symbol": "fn_call" }, { - "bytes": "8011bbf4cdf04e5bc6ac886935b99aa4b2c0cabde133f9d7fb3e656799f0a896" + "bytes": "0000000000000000000000000000000000000000000000000000000000000004" }, { - "symbol": "set_admin" + "symbol": "mint_from_fiat" } ], "data": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "vec": [ + { + "vec": [ + { + "string": "NGN" + } + ] + } + ] + }, + { + "i128": { + "hi": 0, + "lo": 500000000 + } + }, + { + "string": "fiat_tx_duplicate" + } + ] } } } @@ -818,24 +1386,22 @@ { "event": { "ext": "v0", - "contract_id": "8011bbf4cdf04e5bc6ac886935b99aa4b2c0cabde133f9d7fb3e656799f0a896", - "type_": "contract", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", + "type_": "diagnostic", "body": { "v0": { "topics": [ { - "symbol": "set_admin" + "symbol": "fn_call" }, { - "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJXFF" + "bytes": "0000000000000000000000000000000000000000000000000000000000000002" }, { - "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJXFF" + "symbol": "get_acbu_usd_rate_with_timestamp" } ], - "data": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - } + "data": "void" } } }, @@ -844,7 +1410,7 @@ { "event": { "ext": "v0", - "contract_id": "8011bbf4cdf04e5bc6ac886935b99aa4b2c0cabde133f9d7fb3e656799f0a896", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000002", "type_": "diagnostic", "body": { "v0": { @@ -853,10 +1419,22 @@ "symbol": "fn_return" }, { - "symbol": "set_admin" + "symbol": "get_acbu_usd_rate_with_timestamp" } ], - "data": "void" + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 0 + } + ] + } } } }, @@ -865,7 +1443,7 @@ { "event": { "ext": "v0", - "contract_id": null, + "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", "type_": "diagnostic", "body": { "v0": { @@ -874,14 +1452,22 @@ "symbol": "fn_call" }, { - "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + "bytes": "0000000000000000000000000000000000000000000000000000000000000002" }, { - "symbol": "init_asset" + "symbol": "get_rate_with_timestamp" } ], "data": { - "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000005" + "vec": [ + { + "vec": [ + { + "string": "NGN" + } + ] + } + ] } } } @@ -891,7 +1477,7 @@ { "event": { "ext": "v0", - "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000002", "type_": "diagnostic", "body": { "v0": { @@ -900,10 +1486,22 @@ "symbol": "fn_return" }, { - "symbol": "init_asset" + "symbol": "get_rate_with_timestamp" } ], - "data": "void" + "data": { + "vec": [ + { + "i128": { + "hi": 0, + "lo": 10000000 + } + }, + { + "u64": 0 + } + ] + } } } }, @@ -912,7 +1510,7 @@ { "event": { "ext": "v0", - "contract_id": null, + "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", "type_": "diagnostic", "body": { "v0": { @@ -921,40 +1519,17 @@ "symbol": "fn_call" }, { - "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + "bytes": "0000000000000000000000000000000000000000000000000000000000000003" }, { - "symbol": "set_admin" + "symbol": "is_reserve_sufficient" } ], "data": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", - "type_": "contract", - "body": { - "v0": { - "topics": [ - { - "symbol": "set_admin" - }, - { - "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" - }, - { - "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + "i128": { + "hi": 0, + "lo": 497500000 } - ], - "data": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" } } } @@ -964,7 +1539,7 @@ { "event": { "ext": "v0", - "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", "type_": "diagnostic", "body": { "v0": { @@ -973,10 +1548,12 @@ "symbol": "fn_return" }, { - "symbol": "set_admin" + "symbol": "is_reserve_sufficient" } ], - "data": "void" + "data": { + "bool": true + } } } }, @@ -985,7 +1562,7 @@ { "event": { "ext": "v0", - "contract_id": null, + "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", "type_": "diagnostic", "body": { "v0": { @@ -994,33 +1571,21 @@ "symbol": "fn_call" }, { - "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" }, { - "symbol": "initialize" + "symbol": "mint" } ], "data": { "vec": [ { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" - }, - { - "address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN" - }, - { - "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" }, { "i128": { "hi": 0, - "lo": 300 + "lo": 497500000 } } ] @@ -1033,19 +1598,30 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", "body": { "v0": { "topics": [ { - "symbol": "fn_return" + "symbol": "mint" }, { - "symbol": "initialize" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" } ], - "data": "void" + "data": { + "i128": { + "hi": 0, + "lo": 497500000 + } + } } } }, @@ -1054,40 +1630,19 @@ { "event": { "ext": "v0", - "contract_id": null, + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", "type_": "diagnostic", "body": { "v0": { "topics": [ { - "symbol": "fn_call" - }, - { - "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + "symbol": "fn_return" }, { - "symbol": "mint_from_fiat" + "symbol": "mint" } ], - "data": { - "vec": [ - { - "string": "NGN" - }, - { - "i128": { - "hi": 0, - "lo": 100000000 - } - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" - }, - { - "string": "FTX-001" - } - ] - } + "data": "void" } } }, @@ -1096,7 +1651,7 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", "type_": "diagnostic", "body": { "v0": { @@ -1105,7 +1660,7 @@ "symbol": "fn_call" }, { - "bytes": "8011bbf4cdf04e5bc6ac886935b99aa4b2c0cabde133f9d7fb3e656799f0a896" + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" }, { "symbol": "mint" @@ -1114,12 +1669,12 @@ "data": { "vec": [ { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" }, { "i128": { "hi": 0, - "lo": 97000000 + "lo": 2500000 } } ] @@ -1132,7 +1687,7 @@ { "event": { "ext": "v0", - "contract_id": "8011bbf4cdf04e5bc6ac886935b99aa4b2c0cabde133f9d7fb3e656799f0a896", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", "type_": "contract", "body": { "v0": { @@ -1141,19 +1696,19 @@ "symbol": "mint" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" }, { - "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJXFF" + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" } ], "data": { "i128": { "hi": 0, - "lo": 97000000 + "lo": 2500000 } } } @@ -1164,7 +1719,7 @@ { "event": { "ext": "v0", - "contract_id": "8011bbf4cdf04e5bc6ac886935b99aa4b2c0cabde133f9d7fb3e656799f0a896", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", "type_": "diagnostic", "body": { "v0": { @@ -1185,7 +1740,7 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", "type_": "contract", "body": { "v0": { @@ -1194,7 +1749,7 @@ "symbol": "mint" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" } ], "data": { @@ -1206,7 +1761,7 @@ "val": { "i128": { "hi": 0, - "lo": 97000000 + "lo": 497500000 } } }, @@ -1217,7 +1772,7 @@ "val": { "i128": { "hi": 0, - "lo": 3000000 + "lo": 2500000 } } }, @@ -1245,7 +1800,7 @@ "symbol": "transaction_id" }, "val": { - "string": "FTX-001" + "string": "fiat_tx_duplicate" } }, { @@ -1255,7 +1810,7 @@ "val": { "i128": { "hi": 0, - "lo": 100000000 + "lo": 500000000 } } }, @@ -1264,7 +1819,7 @@ "symbol": "user" }, "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" } } ] @@ -1277,7 +1832,7 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", "type_": "diagnostic", "body": { "v0": { @@ -1292,7 +1847,7 @@ "data": { "i128": { "hi": 0, - "lo": 97000000 + "lo": 497500000 } } } @@ -1312,7 +1867,7 @@ "symbol": "fn_call" }, { - "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + "bytes": "0000000000000000000000000000000000000000000000000000000000000004" }, { "symbol": "mint_from_fiat" @@ -1321,19 +1876,30 @@ "data": { "vec": [ { - "string": "NGN" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "vec": [ + { + "vec": [ + { + "string": "NGN" + } + ] + } + ] }, { "i128": { "hi": 0, - "lo": 100000000 + "lo": 500000000 } }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" - }, - { - "string": "FTX-001" + "string": "fiat_tx_duplicate" } ] } @@ -1345,34 +1911,27 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", "type_": "diagnostic", "body": { "v0": { "topics": [ { - "symbol": "log" + "symbol": "error" + }, + { + "error": { + "contract": 5008 + } } ], "data": { "vec": [ { - "string": "caught panic 'Transaction ID already processed' from contract function 'Symbol(obj#289)'" - }, - { - "string": "NGN" - }, - { - "i128": { - "hi": 0, - "lo": 100000000 - } - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + "string": "failing with contract error" }, { - "string": "FTX-001" + "u32": 5008 } ] } @@ -1384,7 +1943,32 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 5008 + } + } + ], + "data": { + "string": "escalating error to panic" + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", "type_": "diagnostic", "body": { "v0": { @@ -1394,7 +1978,7 @@ }, { "error": { - "wasm_vm": "invalid_action" + "contract": 5008 } } ], @@ -1419,7 +2003,7 @@ }, { "error": { - "wasm_vm": "invalid_action" + "contract": 5008 } } ], @@ -1434,19 +2018,30 @@ { "vec": [ { - "string": "NGN" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "vec": [ + { + "vec": [ + { + "string": "NGN" + } + ] + } + ] }, { "i128": { "hi": 0, - "lo": 100000000 + "lo": 500000000 } }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" - }, - { - "string": "FTX-001" + "string": "fiat_tx_duplicate" } ] } @@ -1470,7 +2065,7 @@ }, { "error": { - "wasm_vm": "invalid_action" + "contract": 5008 } } ], diff --git a/acbu_minting/test_snapshots/test_mint_from_fiat_rejects_empty_tx_id.1.json b/acbu_minting/test_snapshots/test_mint_from_fiat_rejects_empty_tx_id.1.json index 22d2a73b..cba03af0 100644 --- a/acbu_minting/test_snapshots/test_mint_from_fiat_rejects_empty_tx_id.1.json +++ b/acbu_minting/test_snapshots/test_mint_from_fiat_rejects_empty_tx_id.1.json @@ -1,9 +1,47 @@ { "generators": { - "address": 7, + "address": 9, "nonce": 0 }, "auth": [ + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", + { + "function": { + "contract_fn": { + "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF", + { + "function": { + "contract_fn": { + "contract_address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], [], [] ], @@ -17,10 +55,132 @@ "min_temp_entry_ttl": 16, "max_entry_ttl": 6312000, "ledger_entries": [ + [ + { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", + "balance": 0, + "seq_num": 0, + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + null + ] + ], + [ + { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF", + "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": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], [ { "contract_data": { - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", "key": "ledger_key_contract_instance", "durability": "persistent" } @@ -31,7 +191,71 @@ "data": { "contract_data": { "ext": "v0", - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": null + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": null + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", "key": "ledger_key_contract_instance", "durability": "persistent", "val": { @@ -45,7 +269,7 @@ "symbol": "ACBU_TKN" }, "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" } }, { @@ -63,7 +287,18 @@ "val": { "i128": { "hi": 0, - "lo": 300 + "lo": 50 + } + } + }, + { + "key": { + "symbol": "FEE_SGL" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100 } } }, @@ -78,6 +313,17 @@ } } }, + { + "key": { + "symbol": "MAX_SUP" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000000000000000 + } + } + }, { "key": { "symbol": "MIN_MINT" @@ -113,48 +359,551 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" } }, + { + "key": { + "symbol": "SUPPLY" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "TRSY" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + }, { "key": { "symbol": "USDC_TKN" }, "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + "address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN" + } + }, + { + "key": { + "symbol": "VAULT" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Version" + } + ] + }, + "val": { + "u32": 1 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", + "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 120960 + ] + ], + [ + { + "contract_data": { + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000005" + } + } + ] + } + ] } } ] } } } - }, - "ext": "v0" - }, - 4095 - ] - ], - [ - { - "contract_code": { - "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "ext": "v0" + }, + 120960 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000005" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } } - }, - [ - { - "last_modified_ledger_seq": 0, + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], "data": { - "contract_code": { - "ext": "v0", - "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - "code": "" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" } - }, - "ext": "v0" - }, - 4095 - ] - ] - ] - }, - "events": [ + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000006" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, { "event": { "ext": "v0", @@ -167,7 +916,7 @@ "symbol": "fn_call" }, { - "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + "bytes": "0000000000000000000000000000000000000000000000000000000000000004" }, { "symbol": "initialize" @@ -185,15 +934,27 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + "address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "i128": { + "hi": 0, + "lo": 50 + } }, { "i128": { "hi": 0, - "lo": 300 + "lo": 100 } } ] @@ -206,7 +967,7 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", "type_": "diagnostic", "body": { "v0": { @@ -236,7 +997,7 @@ "symbol": "fn_call" }, { - "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + "bytes": "0000000000000000000000000000000000000000000000000000000000000004" }, { "symbol": "mint_from_fiat" @@ -245,7 +1006,21 @@ "data": { "vec": [ { - "string": "NGN" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "vec": [ + { + "vec": [ + { + "string": "NGN" + } + ] + } + ] }, { "i128": { @@ -253,9 +1028,6 @@ "lo": 100000000 } }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" - }, { "string": "" } @@ -269,34 +1041,27 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", "type_": "diagnostic", "body": { "v0": { "topics": [ { - "symbol": "log" + "symbol": "error" + }, + { + "error": { + "contract": 5014 + } } ], "data": { "vec": [ { - "string": "caught panic 'Invalid fintech_tx_id' from contract function 'Symbol(obj#27)'" - }, - { - "string": "NGN" - }, - { - "i128": { - "hi": 0, - "lo": 100000000 - } + "string": "failing with contract error" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" - }, - { - "string": "" + "u32": 5014 } ] } @@ -308,7 +1073,7 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", "type_": "diagnostic", "body": { "v0": { @@ -318,7 +1083,32 @@ }, { "error": { - "wasm_vm": "invalid_action" + "contract": 5014 + } + } + ], + "data": { + "string": "escalating error to panic" + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 5014 } } ], @@ -343,7 +1133,7 @@ }, { "error": { - "wasm_vm": "invalid_action" + "contract": 5014 } } ], @@ -358,7 +1148,21 @@ { "vec": [ { - "string": "NGN" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "vec": [ + { + "vec": [ + { + "string": "NGN" + } + ] + } + ] }, { "i128": { @@ -366,9 +1170,6 @@ "lo": 100000000 } }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" - }, { "string": "" } @@ -394,7 +1195,7 @@ }, { "error": { - "wasm_vm": "invalid_action" + "contract": 5014 } } ], diff --git a/acbu_minting/tests/test.rs b/acbu_minting/tests/test.rs index 2fcf9fa7..db6ea3d1 100644 --- a/acbu_minting/tests/test.rs +++ b/acbu_minting/tests/test.rs @@ -1,7 +1,7 @@ #![cfg(test)] use acbu_minting::{MintingContract, MintingContractClient}; -use shared::{CurrencyCode, MintEvent, DECIMALS}; +use shared::{calculate_fee, CurrencyCode, MintEvent, DECIMALS}; use soroban_sdk::{ bytesn, contract, contractimpl, symbol_short, testutils::{Address as _, Events}, @@ -91,6 +91,7 @@ mod failing_reserve_mock { } } +#[allow(clippy::too_many_arguments)] fn init_mint_client( _env: &Env, client: &MintingContractClient, @@ -222,6 +223,10 @@ fn test_initialize_twice() { ); } +// ===================================================================== +// mint_from_usdc +// ===================================================================== + #[test] fn test_mint_from_usdc() { let env = Env::default(); @@ -253,38 +258,793 @@ fn test_mint_from_usdc() { fee_single, ); - let mint_amount = 50 * DECIMALS; - let acbu_minted = client.mint_from_usdc(&user, &mint_amount, &user); + let mint_amount = 50 * DECIMALS; + let acbu_minted = client.mint_from_usdc(&user, &mint_amount, &user); + + let expected_fee = 15_000_000; + let expected_acbu = 485_000_000; + + assert_eq!(acbu_minted, expected_acbu, "acbu_minted should equal expected_acbu"); + assert_eq!(acbu_client.balance(&user), expected_acbu, "acbu_client.balance(&user) should equal expected_acbu"); + assert_eq!(usdc_client.balance(&user), 50 * DECIMALS, "usdc_client.balance(&user) should equal 50 * DECIMALS"); + assert_eq!(client.get_total_supply(), expected_acbu, "client.get_total_supply() should equal expected_acbu"); + + let events = env.events().all(); + let mut found = false; + for event in events.iter() { + if event.0 != client.address { + continue; + } + let topics = event.1; + if !topics.is_empty() + && Symbol::from_val(&env, &topics.get(0).unwrap()) == symbol_short!("mint") + { + let event_data: MintEvent = event.2.into_val(&env); + assert_eq!(event_data.usdc_amount, mint_amount, "event_data.usdc_amount should equal mint_amount"); + assert_eq!(event_data.acbu_amount, expected_acbu, "event_data.acbu_amount should equal expected_acbu"); + assert_eq!(event_data.fee, expected_fee, "event_data.fee should equal expected_fee"); + found = true; + break; + } + } + assert!(found, "expected mint event"); +} + +#[test] +fn test_mint_from_usdc_with_fee_calculation() { + let env = Env::default(); + env.mock_all_auths(); + + let (admin, oracle, reserve_tracker, acbu_token_id, usdc_token_id, client) = setup_test(&env); + let user = Address::generate(&env); + let fee_rate = 300; // 3% + + let usdc_token_client = soroban_sdk::token::StellarAssetClient::new(&env, &usdc_token_id); + let usdc_amount = 100 * DECIMALS; + usdc_token_client.mint(&user, &usdc_amount); + + let acbu_client = soroban_sdk::token::Client::new(&env, &acbu_token_id); + + init_mint_client( + &env, + &client, + &admin, + &oracle, + &reserve_tracker, + &acbu_token_id, + &usdc_token_id, + &admin, + &admin, + fee_rate, + 100, + ); + + let acbu_amt = 100 * DECIMALS; + let proof = SorobanString::from_str(&env, "basket_proof_001"); + let proof_id = soroban_sdk::String::from_str(&env, "proof_1"); + let net = client.mint_from_basket(&user, &user, &acbu_amt, &proof_id); + assert!(net > 0); + assert_eq!(client.get_total_supply(), acbu_amt, "client.get_total_supply() should equal acbu_amt"); +} + +#[test] +#[should_panic(expected = "#5004")] +fn test_mint_insufficient_reserves() { + let env = Env::default(); + env.mock_all_auths(); + + let admin = Address::generate(&env); + let oracle = env.register_contract(None, oracle_mock::MockOracle); + let reserve_tracker = + env.register_contract(None, failing_reserve_mock::MockFailingReserveTracker); + + let contract_id = env.register_contract(None, MintingContract); + let acbu_token = env + .register_stellar_asset_contract_v2(contract_id.clone()) + .address(); + let usdc_token = env + .register_stellar_asset_contract_v2(admin.clone()) + .address(); + + let client = MintingContractClient::new(&env, &contract_id); + + init_mint_client( + &env, + &client, + &admin, + &oracle, + &reserve_tracker, + &acbu_token, + &usdc_token, + &admin, + &admin, + 0, + 100, + ); + + let user = Address::generate(&env); + let usdc_sac = soroban_sdk::token::StellarAssetClient::new(&env, &usdc_token); + usdc_sac.mint(&user, &DECIMALS); + + client.mint_from_usdc(&user, &DECIMALS, &user); +} + +// ===================================================================== +// mint_from_fiat +// ===================================================================== +// +// mint_from_fiat is the fintech-partner path: an `operator` address (not the +// depositing user) authorizes the mint, no on-chain token is pulled (the +// fiat leg is settled off-chain by the fintech partner), and duplicate +// `fintech_tx_id`s must be rejected. Fee is charged at `fee_rate` (the +// basket/USDC tier), not `fee_single`. + +#[test] +fn test_mint_from_fiat() { + let env = Env::default(); + env.mock_all_auths(); + + let (admin, oracle, reserve_tracker, acbu_token_id, usdc_token_id, client) = setup_test(&env); + let operator = Address::generate(&env); + let recipient = Address::generate(&env); + let vault = Address::generate(&env); + let treasury = Address::generate(&env); + + let fee_rate = 50; // mint_from_fiat charges fee_rate, not fee_single + let fee_single = 100; + + init_mint_client( + &env, + &client, + &admin, + &oracle, + &reserve_tracker, + &acbu_token_id, + &usdc_token_id, + &vault, + &treasury, + fee_rate, + fee_single, + ); + + client.set_operator(&operator); + + let fiat_amount = 50 * DECIMALS; + // Mock oracle rate is 1:1 (DECIMALS), so usd_gross == fiat_amount. + let expected_fee = calculate_fee(fiat_amount, fee_rate); + let acbu_client = soroban_sdk::token::Client::new(&env, &acbu_token_id); + let tx_id = SorobanString::from_str(&env, "fiat_tx_001"); + + let acbu_minted = client.mint_from_fiat( + &operator, + &recipient, + &CurrencyCode::new(&env, "NGN"), + &fiat_amount, + &tx_id, + ); + + assert!(acbu_minted > 0); + assert_eq!(acbu_client.balance(&recipient), acbu_minted); + // Fee is minted in ACBU to the treasury; no on-chain S-token/vault + // transfer occurs for this path since settlement happens off-chain. + assert_eq!(acbu_client.balance(&treasury), expected_fee); + assert_eq!(client.get_total_supply(), acbu_minted); +} + +#[test] +fn test_mint_from_fiat_emits_mint_event() { + let env = Env::default(); + env.mock_all_auths(); + + let (admin, oracle, reserve_tracker, acbu_token_id, usdc_token_id, client) = setup_test(&env); + let operator = Address::generate(&env); + let recipient = Address::generate(&env); + let vault = Address::generate(&env); + let treasury = Address::generate(&env); + + init_mint_client( + &env, + &client, + &admin, + &oracle, + &reserve_tracker, + &acbu_token_id, + &usdc_token_id, + &vault, + &treasury, + 50, + 100, + ); + client.set_operator(&operator); + + let fiat_amount = 20 * DECIMALS; + let tx_id = SorobanString::from_str(&env, "fiat_tx_event_01"); + let acbu_minted = client.mint_from_fiat( + &operator, + &recipient, + &CurrencyCode::new(&env, "NGN"), + &fiat_amount, + &tx_id, + ); + + let events = env.events().all(); + let mut found = false; + for event in events.iter() { + if event.0 != client.address { + continue; + } + let topics = event.1; + if !topics.is_empty() + && Symbol::from_val(&env, &topics.get(0).unwrap()) == symbol_short!("mint") + { + let event_data: MintEvent = event.2.into_val(&env); + assert_eq!(event_data.transaction_id, tx_id); + assert_eq!(event_data.acbu_amount, acbu_minted); + found = true; + break; + } + } + assert!(found, "expected mint event for mint_from_fiat"); +} + +#[test] +#[should_panic(expected = "#5007")] +fn test_mint_from_fiat_wrong_operator() { + let env = Env::default(); + env.mock_all_auths(); + + let (admin, oracle, reserve_tracker, acbu_token_id, usdc_token_id, client) = setup_test(&env); + let operator = Address::generate(&env); + let attacker = Address::generate(&env); + let recipient = Address::generate(&env); + let vault = Address::generate(&env); + let treasury = Address::generate(&env); + + init_mint_client( + &env, + &client, + &admin, + &oracle, + &reserve_tracker, + &acbu_token_id, + &usdc_token_id, + &vault, + &treasury, + 50, + 100, + ); + client.set_operator(&operator); + + let tx_id = SorobanString::from_str(&env, "fiat_tx_attacker"); + client.mint_from_fiat( + &attacker, + &recipient, + &CurrencyCode::new(&env, "NGN"), + &(10 * DECIMALS), + &tx_id, + ); +} + +#[test] +#[should_panic(expected = "#5012")] +fn test_pause_prevents_mint_from_fiat() { + let env = Env::default(); + env.mock_all_auths(); + + let (admin, oracle, reserve_tracker, acbu_token_id, usdc_token_id, client) = setup_test(&env); + let recipient = Address::generate(&env); + let vault = Address::generate(&env); + let treasury = Address::generate(&env); + + init_mint_client( + &env, + &client, + &admin, + &oracle, + &reserve_tracker, + &acbu_token_id, + &usdc_token_id, + &vault, + &treasury, + 50, + 100, + ); + + client.pause(); + assert!(client.is_paused()); + + let tx_id = SorobanString::from_str(&env, "fiat_tx_paused"); + // admin is the default operator (falls back to admin when unset) + client.mint_from_fiat( + &admin, + &recipient, + &CurrencyCode::new(&env, "NGN"), + &(10 * DECIMALS), + &tx_id, + ); +} + +#[test] +#[should_panic(expected = "#5008")] +fn test_mint_from_fiat_rejects_duplicate_tx_id() { + let env = Env::default(); + env.mock_all_auths(); + + let (admin, oracle, reserve_tracker, acbu_token_id, usdc_token_id, client) = setup_test(&env); + let operator = Address::generate(&env); + let recipient = Address::generate(&env); + let vault = Address::generate(&env); + let treasury = Address::generate(&env); + + init_mint_client( + &env, + &client, + &admin, + &oracle, + &reserve_tracker, + &acbu_token_id, + &usdc_token_id, + &vault, + &treasury, + 50, + 100, + ); + client.set_operator(&operator); + + let fiat_amount = 50 * DECIMALS; + let tx_id = SorobanString::from_str(&env, "fiat_tx_duplicate"); + + client.mint_from_fiat( + &operator, + &recipient, + &CurrencyCode::new(&env, "NGN"), + &fiat_amount, + &tx_id, + ); + + // Same fintech_tx_id must be rejected on replay. + client.mint_from_fiat( + &operator, + &recipient, + &CurrencyCode::new(&env, "NGN"), + &fiat_amount, + &tx_id, + ); +} + +#[test] +fn test_mint_from_fiat_different_tx_ids_both_succeed() { + let env = Env::default(); + env.mock_all_auths(); + + let (admin, oracle, reserve_tracker, acbu_token_id, usdc_token_id, client) = setup_test(&env); + let operator = Address::generate(&env); + let recipient = Address::generate(&env); + let vault = Address::generate(&env); + let treasury = Address::generate(&env); + + init_mint_client( + &env, + &client, + &admin, + &oracle, + &reserve_tracker, + &acbu_token_id, + &usdc_token_id, + &vault, + &treasury, + 50, + 100, + ); + client.set_operator(&operator); + + let fiat_amount = 10 * DECIMALS; + let tx_id_1 = SorobanString::from_str(&env, "fiat_tx_multi_001"); + let tx_id_2 = SorobanString::from_str(&env, "fiat_tx_multi_002"); + + let minted_1 = client.mint_from_fiat( + &operator, + &recipient, + &CurrencyCode::new(&env, "NGN"), + &fiat_amount, + &tx_id_1, + ); + let minted_2 = client.mint_from_fiat( + &operator, + &recipient, + &CurrencyCode::new(&env, "NGN"), + &fiat_amount, + &tx_id_2, + ); + + assert!(minted_1 > 0); + assert!(minted_2 > 0); + assert_eq!(client.get_total_supply(), minted_1 + minted_2); +} + +#[test] +#[should_panic(expected = "#5003")] +fn test_mint_from_fiat_below_min_amount() { + let env = Env::default(); + env.mock_all_auths(); + + let (admin, oracle, reserve_tracker, acbu_token_id, usdc_token_id, client) = setup_test(&env); + let recipient = Address::generate(&env); + let vault = Address::generate(&env); + let treasury = Address::generate(&env); + + init_mint_client( + &env, + &client, + &admin, + &oracle, + &reserve_tracker, + &acbu_token_id, + &usdc_token_id, + &vault, + &treasury, + 50, + 100, + ); + + let tx_id = SorobanString::from_str(&env, "fiat_tx_tiny_amount"); + // 1 stroop; well below MIN_MINT_AMOUNT once converted at the (1:1) mock rate. + client.mint_from_fiat( + &admin, + &recipient, + &CurrencyCode::new(&env, "NGN"), + &1, + &tx_id, + ); +} + +#[test] +#[should_panic(expected = "#5003")] +fn test_mint_from_fiat_exceeds_max_amount() { + let env = Env::default(); + env.mock_all_auths(); + + let (admin, oracle, reserve_tracker, acbu_token_id, usdc_token_id, client) = setup_test(&env); + let recipient = Address::generate(&env); + let vault = Address::generate(&env); + let treasury = Address::generate(&env); + + init_mint_client( + &env, + &client, + &admin, + &oracle, + &reserve_tracker, + &acbu_token_id, + &usdc_token_id, + &vault, + &treasury, + 50, + 100, + ); + + let tx_id = SorobanString::from_str(&env, "fiat_tx_huge_amount"); + // MAX_MINT_AMOUNT is 1_000_000_000_000; well above that at the 1:1 mock rate. + let huge_fiat_amount = 2_000_000_000_000; + client.mint_from_fiat( + &admin, + &recipient, + &CurrencyCode::new(&env, "NGN"), + &huge_fiat_amount, + &tx_id, + ); +} + +#[test] +#[should_panic(expected = "#5014")] +fn test_mint_from_fiat_rejects_empty_tx_id() { + let env = Env::default(); + env.mock_all_auths(); + + let (admin, oracle, reserve_tracker, acbu_token_id, usdc_token_id, client) = setup_test(&env); + let recipient = Address::generate(&env); + let vault = Address::generate(&env); + let treasury = Address::generate(&env); + + init_mint_client( + &env, + &client, + &admin, + &oracle, + &reserve_tracker, + &acbu_token_id, + &usdc_token_id, + &vault, + &treasury, + 50, + 100, + ); + + let tx_id = SorobanString::from_str(&env, ""); + client.mint_from_fiat( + &admin, + &recipient, + &CurrencyCode::new(&env, "NGN"), + &(10 * DECIMALS), + &tx_id, + ); +} + +#[test] +#[should_panic(expected = "#5015")] +fn test_mint_from_fiat_rejects_too_short_tx_id() { + let env = Env::default(); + env.mock_all_auths(); + + let (admin, oracle, reserve_tracker, acbu_token_id, usdc_token_id, client) = setup_test(&env); + let recipient = Address::generate(&env); + let vault = Address::generate(&env); + let treasury = Address::generate(&env); + + init_mint_client( + &env, + &client, + &admin, + &oracle, + &reserve_tracker, + &acbu_token_id, + &usdc_token_id, + &vault, + &treasury, + 50, + 100, + ); + + // Minimum length is 8; this is 5 chars. + let tx_id = SorobanString::from_str(&env, "short"); + client.mint_from_fiat( + &admin, + &recipient, + &CurrencyCode::new(&env, "NGN"), + &(10 * DECIMALS), + &tx_id, + ); +} + +#[test] +#[should_panic(expected = "#5016")] +fn test_mint_from_fiat_rejects_too_long_tx_id() { + let env = Env::default(); + env.mock_all_auths(); + + let (admin, oracle, reserve_tracker, acbu_token_id, usdc_token_id, client) = setup_test(&env); + let recipient = Address::generate(&env); + let vault = Address::generate(&env); + let treasury = Address::generate(&env); + + init_mint_client( + &env, + &client, + &admin, + &oracle, + &reserve_tracker, + &acbu_token_id, + &usdc_token_id, + &vault, + &treasury, + 50, + 100, + ); + + // Maximum length is 64; this is 65 chars. + let long_id = + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; // 65 'a's + let tx_id = SorobanString::from_str(&env, long_id); + client.mint_from_fiat( + &admin, + &recipient, + &CurrencyCode::new(&env, "NGN"), + &(10 * DECIMALS), + &tx_id, + ); +} + +#[test] +#[should_panic(expected = "#5017")] +fn test_mint_from_fiat_rejects_invalid_char_in_tx_id() { + let env = Env::default(); + env.mock_all_auths(); + + let (admin, oracle, reserve_tracker, acbu_token_id, usdc_token_id, client) = setup_test(&env); + let recipient = Address::generate(&env); + let vault = Address::generate(&env); + let treasury = Address::generate(&env); + + init_mint_client( + &env, + &client, + &admin, + &oracle, + &reserve_tracker, + &acbu_token_id, + &usdc_token_id, + &vault, + &treasury, + 50, + 100, + ); + + // Contains a space, which is outside the allowed [A-Za-z0-9-_] charset. + let tx_id = SorobanString::from_str(&env, "bad tx id!!"); + client.mint_from_fiat( + &admin, + &recipient, + &CurrencyCode::new(&env, "NGN"), + &(10 * DECIMALS), + &tx_id, + ); +} + +// --- Version / upgrade tests --- + +#[test] +fn test_version_set_on_initialize() { + let env = Env::default(); + env.mock_all_auths(); + let (admin, oracle, reserve_tracker, acbu_token, usdc_token, client) = setup_test(&env); + init_mint_client( + &env, &client, &admin, &oracle, &reserve_tracker, &acbu_token, &usdc_token, &admin, + &admin, 300, 100, + ); + assert_eq!(client.get_version(), 1); +} + +#[test] +#[should_panic(expected = "Invalid version upgrade")] +fn test_upgrade_rejects_same_version() { + let env = Env::default(); + env.mock_all_auths(); + let (admin, oracle, reserve_tracker, acbu_token, usdc_token, client) = setup_test(&env); + init_mint_client( + &env, &client, &admin, &oracle, &reserve_tracker, &acbu_token, &usdc_token, &admin, + &admin, 300, 100, + ); + let dummy_hash: BytesN<32> = bytesn!( + &env, + 0x0000000000000000000000000000000000000000000000000000000000000000 + ); + client.upgrade(&dummy_hash, &1u32); +} + +#[test] +#[should_panic(expected = "Invalid version upgrade")] +fn test_upgrade_rejects_lower_version() { + let env = Env::default(); + env.mock_all_auths(); + let (admin, oracle, reserve_tracker, acbu_token, usdc_token, client) = setup_test(&env); + init_mint_client( + &env, &client, &admin, &oracle, &reserve_tracker, &acbu_token, &usdc_token, &admin, + &admin, 300, 100, + ); + let dummy_hash: BytesN<32> = bytesn!( + &env, + 0x0000000000000000000000000000000000000000000000000000000000000000 + ); + client.upgrade(&dummy_hash, &0u32); +} + +#[test] +fn test_storage_state_intact_across_upgrade_boundary() { + let env = Env::default(); + env.mock_all_auths(); + let (admin, oracle, reserve_tracker, acbu_token, usdc_token, client) = setup_test(&env); + init_mint_client( + &env, &client, &admin, &oracle, &reserve_tracker, &acbu_token, &usdc_token, &admin, + &admin, 300, 100, + ); + // All configured values must be intact regardless of whether an upgrade is attempted. + assert_eq!(client.get_version(), 1); + assert_eq!(client.get_fee_rate(), 300); + assert_eq!(client.get_fee_single(), 100); + assert_eq!(client.get_total_supply(), 0); + assert!(!client.is_paused()); +} + +// --- Dependency address updaters --- + +#[test] +fn test_update_oracle_by_admin() { + let env = Env::default(); + env.mock_all_auths(); + let (admin, oracle, reserve_tracker, acbu_token, usdc_token, client) = setup_test(&env); + let vault = Address::generate(&env); + let treasury = Address::generate(&env); + init_mint_client( + &env, &client, &admin, &oracle, &reserve_tracker, &acbu_token, &usdc_token, &vault, + &treasury, 100, 200, + ); + + let new_oracle = Address::generate(&env); + client.update_oracle(&new_oracle); +} + +#[test] +fn test_update_reserve_tracker_by_admin() { + let env = Env::default(); + env.mock_all_auths(); + let (admin, oracle, reserve_tracker, acbu_token, usdc_token, client) = setup_test(&env); + let vault = Address::generate(&env); + let treasury = Address::generate(&env); + init_mint_client( + &env, &client, &admin, &oracle, &reserve_tracker, &acbu_token, &usdc_token, &vault, + &treasury, 100, 200, + ); + + let new_rt = Address::generate(&env); + client.update_reserve_tracker(&new_rt); +} + +#[test] +fn test_update_acbu_token_by_admin_minting() { + let env = Env::default(); + env.mock_all_auths(); + let (admin, oracle, reserve_tracker, acbu_token, usdc_token, client) = setup_test(&env); + let vault = Address::generate(&env); + let treasury = Address::generate(&env); + init_mint_client( + &env, &client, &admin, &oracle, &reserve_tracker, &acbu_token, &usdc_token, &vault, + &treasury, 100, 200, + ); + + let new_token = Address::generate(&env); + client.update_acbu_token(&new_token); +} + +#[test] +fn test_update_vault_by_admin_minting() { + let env = Env::default(); + env.mock_all_auths(); + let (admin, oracle, reserve_tracker, acbu_token, usdc_token, client) = setup_test(&env); + let vault = Address::generate(&env); + let treasury = Address::generate(&env); + init_mint_client( + &env, &client, &admin, &oracle, &reserve_tracker, &acbu_token, &usdc_token, &vault, + &treasury, 100, 200, + ); + + let new_vault = Address::generate(&env); + client.update_vault(&new_vault); +} - let expected_fee = 15_000_000; - let expected_acbu = 485_000_000; +#[test] +fn test_update_treasury_by_admin() { + let env = Env::default(); + env.mock_all_auths(); + let (admin, oracle, reserve_tracker, acbu_token, usdc_token, client) = setup_test(&env); + let vault = Address::generate(&env); + let treasury = Address::generate(&env); + init_mint_client( + &env, &client, &admin, &oracle, &reserve_tracker, &acbu_token, &usdc_token, &vault, + &treasury, 100, 200, + ); - assert_eq!(acbu_minted, expected_acbu, "acbu_minted should equal expected_acbu"); - assert_eq!(acbu_client.balance(&user), expected_acbu, "acbu_client.balance(&user) should equal expected_acbu"); - assert_eq!(usdc_client.balance(&user), 50 * DECIMALS, "usdc_client.balance(&user) should equal 50 * DECIMALS"); - assert_eq!(client.get_total_supply(), expected_acbu, "client.get_total_supply() should equal expected_acbu"); + let new_treasury = Address::generate(&env); + client.update_treasury(&new_treasury); +} - let events = env.events().all(); - let mut found = false; - for event in events.iter() { - if event.0 != client.address { - continue; - } - let topics = event.1; - if !topics.is_empty() - && Symbol::from_val(&env, &topics.get(0).unwrap()) == symbol_short!("mint") - { - let event_data: MintEvent = event.2.into_val(&env); - assert_eq!(event_data.usdc_amount, mint_amount, "event_data.usdc_amount should equal mint_amount"); - assert_eq!(event_data.acbu_amount, expected_acbu, "event_data.acbu_amount should equal expected_acbu"); - assert_eq!(event_data.fee, expected_fee, "event_data.fee should equal expected_fee"); - found = true; - break; - } - } - assert!(found, "expected mint event"); +#[test] +fn test_update_usdc_token_by_admin() { + let env = Env::default(); + env.mock_all_auths(); + let (admin, oracle, reserve_tracker, acbu_token, usdc_token, client) = setup_test(&env); + let vault = Address::generate(&env); + let treasury = Address::generate(&env); + init_mint_client( + &env, &client, &admin, &oracle, &reserve_tracker, &acbu_token, &usdc_token, &vault, + &treasury, 100, 200, + ); + + let new_usdc = Address::generate(&env); + client.update_usdc_token(&new_usdc); } +// --- mint_from_basket --- + #[test] fn test_mint_from_basket() { let env = Env::default(); @@ -316,33 +1076,28 @@ fn test_mint_from_basket() { ); let acbu_amt = 100 * DECIMALS; - let proof = SorobanString::from_str(&env, "basket_proof_001"); - let proof_id = soroban_sdk::String::from_str(&env, "proof_1"); + let proof_id = SorobanString::from_str(&env, "proof_1"); let net = client.mint_from_basket(&user, &user, &acbu_amt, &proof_id); assert!(net > 0); - assert_eq!(client.get_total_supply(), acbu_amt, "client.get_total_supply() should equal acbu_amt"); + assert_eq!(client.get_total_supply(), acbu_amt); } #[test] -#[should_panic(expected = "#5004")] -fn test_mint_insufficient_reserves() { +#[should_panic(expected = "#5012")] +fn test_pause_prevents_mint_from_basket() { let env = Env::default(); env.mock_all_auths(); - let admin = Address::generate(&env); - let oracle = env.register_contract(None, oracle_mock::MockOracle); - let reserve_tracker = - env.register_contract(None, failing_reserve_mock::MockFailingReserveTracker); + let (admin, oracle, reserve_tracker, acbu_token_id, usdc_token_id, client) = setup_test(&env); + let user = Address::generate(&env); - let contract_id = env.register_contract(None, MintingContract); - let acbu_token = env - .register_stellar_asset_contract_v2(contract_id.clone()) - .address(); - let usdc_token = env + let stoken_id = env .register_stellar_asset_contract_v2(admin.clone()) .address(); + let stoken_sac = soroban_sdk::token::StellarAssetClient::new(&env, &stoken_id); + stoken_sac.mint(&user, &(1_000 * DECIMALS)); - let client = MintingContractClient::new(&env, &contract_id); + oracle_mock::MockOracleClient::new(&env, &oracle).seed_stoken(&stoken_id); init_mint_client( &env, @@ -350,21 +1105,25 @@ fn test_mint_insufficient_reserves() { &admin, &oracle, &reserve_tracker, - &acbu_token, - &usdc_token, + &acbu_token_id, + &usdc_token_id, &admin, &admin, - 0, + 50, 100, ); - let user = Address::generate(&env); - let usdc_sac = soroban_sdk::token::StellarAssetClient::new(&env, &usdc_token); - usdc_sac.mint(&user, &DECIMALS); + client.pause(); + assert!(client.is_paused()); - client.mint_from_usdc(&user, &DECIMALS, &user); + let acbu_amt = 100 * DECIMALS; + let proof_id = SorobanString::from_str(&env, "proof_1"); + + client.mint_from_basket(&user, &user, &acbu_amt, &proof_id); } +// --- mint_from_demo_fiat --- + #[test] fn test_mint_from_demo_fiat() { let env = Env::default(); @@ -398,7 +1157,6 @@ fn test_mint_from_demo_fiat() { let fiat_amount = 50 * DECIMALS; let acbu_client = soroban_sdk::token::Client::new(&env, &acbu_token_id); let proof = SorobanString::from_str(&env, "demo_proof_001"); - let tx_id = soroban_sdk::String::from_str(&env, "tx_1"); let acbu = client.mint_from_demo_fiat( &admin, &recipient, @@ -443,7 +1201,7 @@ fn test_mint_from_demo_fiat_wrong_operator() { 100, ); - let tx_id = soroban_sdk::String::from_str(&env, "tx_bad"); + let proof = SorobanString::from_str(&env, "demo_proof_attacker"); client.mint_from_demo_fiat( &attacker, &recipient, @@ -488,7 +1246,6 @@ fn test_set_operator_and_mint_demo_fiat() { assert_eq!(client.get_operator(), operator, "client.get_operator() should equal operator"); let proof = SorobanString::from_str(&env, "demo_proof_operator"); - let tx_id = soroban_sdk::String::from_str(&env, "tx_ok"); let acbu = client.mint_from_demo_fiat( &operator, &recipient, @@ -499,37 +1256,6 @@ fn test_set_operator_and_mint_demo_fiat() { assert!(acbu > 0); } -#[test] -#[should_panic(expected = "#5003")] -fn test_mint_from_usdc_exceeds_max() { - let env = Env::default(); - env.mock_all_auths(); - - let (admin, oracle, reserve_tracker, acbu_token_id, usdc_token_id, client) = setup_test(&env); - let user = Address::generate(&env); - let usdc_sac = soroban_sdk::token::StellarAssetClient::new(&env, &usdc_token_id); - - // Max mint amount is 1_000_000_000_000, so 2_000_000_000_000 is huge - let huge_amount = 2_000_000_000_000; - usdc_sac.mint(&user, &huge_amount); - - init_mint_client( - &env, - &client, - &admin, - &oracle, - &reserve_tracker, - &acbu_token_id, - &usdc_token_id, - &admin, - &admin, - 300, - 100, - ); - - client.mint_from_usdc(&user, &huge_amount, &user); -} - #[test] #[should_panic(expected = "#5003")] fn test_mint_from_demo_fiat_exceeds_max() { @@ -567,7 +1293,6 @@ fn test_mint_from_demo_fiat_exceeds_max() { let huge_fiat_amount = 2_000_000_000_000; // huge_fiat_amount converted to USD gross will exceed max (given 1:1 rate in MockOracle) let proof = SorobanString::from_str(&env, "demo_proof_huge"); - let tx_id = soroban_sdk::String::from_str(&env, "tx_huge"); client.mint_from_demo_fiat( &operator, &recipient, @@ -577,10 +1302,10 @@ fn test_mint_from_demo_fiat_exceeds_max() { ); } -// --- Upgrade path tests (issue #242) --- +// --- Set Fee Rate Tests --- #[test] -fn test_version_set_on_initialize() { +fn test_set_fee_rate_updates_fee() { let env = Env::default(); env.mock_all_auths(); let (admin, oracle, reserve_tracker, acbu_token, usdc_token, client) = setup_test(&env); @@ -615,7 +1340,8 @@ fn test_upgrade_rejects_lower_version() { } #[test] -fn test_storage_state_intact_across_upgrade_boundary() { +#[should_panic(expected = "#5002")] +fn test_set_fee_rate_exceeds_basis_points() { let env = Env::default(); env.mock_all_auths(); let (admin, oracle, reserve_tracker, acbu_token, usdc_token, client) = setup_test(&env); @@ -676,102 +1402,145 @@ fn test_upgrade_accepts_single_step() { } #[test] -fn test_update_oracle_by_admin() { +fn test_set_fee_rate_zero_allowed() { let env = Env::default(); env.mock_all_auths(); - let (admin, oracle, reserve_tracker, acbu_token, usdc_token, client) = setup_test(&env); - let vault = Address::generate(&env); - let treasury = Address::generate(&env); - init_mint_client(&env, &client, &admin, &oracle, &reserve_tracker, &acbu_token, &usdc_token, &vault, &treasury, 100, 200); - let new_oracle = Address::generate(&env); - client.update_oracle(&new_oracle); -} + let (admin, oracle, reserve_tracker, acbu_token_id, usdc_token_id, client) = setup_test(&env); + let fee_rate = 300; + let fee_single = 100; -#[test] -fn test_update_reserve_tracker_by_admin() { - let env = Env::default(); - env.mock_all_auths(); - let (admin, oracle, reserve_tracker, acbu_token, usdc_token, client) = setup_test(&env); - let vault = Address::generate(&env); - let treasury = Address::generate(&env); - init_mint_client(&env, &client, &admin, &oracle, &reserve_tracker, &acbu_token, &usdc_token, &vault, &treasury, 100, 200); + init_mint_client( + &env, + &client, + &admin, + &oracle, + &reserve_tracker, + &acbu_token_id, + &usdc_token_id, + &admin, + &admin, + fee_rate, + fee_single, + ); - let new_rt = Address::generate(&env); - client.update_reserve_tracker(&new_rt); + client.set_fee_rate(&0); + assert_eq!(client.get_fee_rate(), 0); } #[test] -fn test_update_acbu_token_by_admin_minting() { +fn test_set_fee_rate_max_allowed() { let env = Env::default(); env.mock_all_auths(); - let (admin, oracle, reserve_tracker, acbu_token, usdc_token, client) = setup_test(&env); - let vault = Address::generate(&env); - let treasury = Address::generate(&env); - init_mint_client(&env, &client, &admin, &oracle, &reserve_tracker, &acbu_token, &usdc_token, &vault, &treasury, 100, 200); - let new_token = Address::generate(&env); - client.update_acbu_token(&new_token); -} + let (admin, oracle, reserve_tracker, acbu_token_id, usdc_token_id, client) = setup_test(&env); + let fee_rate = 300; + let fee_single = 100; -#[test] -fn test_update_vault_by_admin_minting() { - let env = Env::default(); - env.mock_all_auths(); - let (admin, oracle, reserve_tracker, acbu_token, usdc_token, client) = setup_test(&env); - let vault = Address::generate(&env); - let treasury = Address::generate(&env); - init_mint_client(&env, &client, &admin, &oracle, &reserve_tracker, &acbu_token, &usdc_token, &vault, &treasury, 100, 200); + init_mint_client( + &env, + &client, + &admin, + &oracle, + &reserve_tracker, + &acbu_token_id, + &usdc_token_id, + &admin, + &admin, + fee_rate, + fee_single, + ); - let new_vault = Address::generate(&env); - client.update_vault(&new_vault); + let max_fee_rate = 10_000; + client.set_fee_rate(&max_fee_rate); + assert_eq!(client.get_fee_rate(), max_fee_rate); } #[test] -fn test_update_treasury_by_admin() { +fn test_set_fee_rate_affects_mint_calculation() { let env = Env::default(); env.mock_all_auths(); - let (admin, oracle, reserve_tracker, acbu_token, usdc_token, client) = setup_test(&env); - let vault = Address::generate(&env); - let treasury = Address::generate(&env); - init_mint_client(&env, &client, &admin, &oracle, &reserve_tracker, &acbu_token, &usdc_token, &vault, &treasury, 100, 200); - let new_treasury = Address::generate(&env); - client.update_treasury(&new_treasury); -} + let (admin, oracle, reserve_tracker, acbu_token_id, usdc_token_id, client) = setup_test(&env); + let user = Address::generate(&env); -#[test] -fn test_update_usdc_token_by_admin() { - let env = Env::default(); - env.mock_all_auths(); - let (admin, oracle, reserve_tracker, acbu_token, usdc_token, client) = setup_test(&env); - let vault = Address::generate(&env); - let treasury = Address::generate(&env); - init_mint_client(&env, &client, &admin, &oracle, &reserve_tracker, &acbu_token, &usdc_token, &vault, &treasury, 100, 200); + let usdc_token_client = soroban_sdk::token::StellarAssetClient::new(&env, &usdc_token_id); + let usdc_amount = 100 * DECIMALS; + usdc_token_client.mint(&user, &usdc_amount); - let new_usdc = Address::generate(&env); - client.update_usdc_token(&new_usdc); + init_mint_client( + &env, + &client, + &admin, + &oracle, + &reserve_tracker, + &acbu_token_id, + &usdc_token_id, + &admin, + &admin, + 300, // 3% fee + 100, + ); + + let mint_amount = 50 * DECIMALS; + let acbu_minted_first = client.mint_from_usdc(&user, &mint_amount, &user); + + client.set_fee_rate(&500); + + let user2 = Address::generate(&env); + usdc_token_client.mint(&user2, &usdc_amount); + let acbu_minted_second = client.mint_from_usdc(&user2, &mint_amount, &user2); + + assert!(acbu_minted_second < acbu_minted_first); } +// mint_from_fiat also uses fee_rate, so raising it should reduce the net mint too. #[test] -fn test_update_oracle_requires_admin_minting() { +fn test_set_fee_rate_affects_mint_from_fiat_calculation() { let env = Env::default(); env.mock_all_auths(); - let (admin, oracle, reserve_tracker, acbu_token, usdc_token, client) = setup_test(&env); + + let (admin, oracle, reserve_tracker, acbu_token_id, usdc_token_id, client) = setup_test(&env); + let recipient = Address::generate(&env); let vault = Address::generate(&env); let treasury = Address::generate(&env); - init_mint_client(&env, &client, &admin, &oracle, &reserve_tracker, &acbu_token, &usdc_token, &vault, &treasury, 100, 200); - // Without mock_all_auths, a non-admin call should fail - let env2 = Env::default(); - let (admin2, oracle2, rt2, acbu2, usdc2, client2) = setup_test(&env2); - let vault2 = Address::generate(&env2); - let treasury2 = Address::generate(&env2); - env2.mock_all_auths(); - init_mint_client(&env2, &client2, &admin2, &oracle2, &rt2, &acbu2, &usdc2, &vault2, &treasury2, 100, 200); - let new_oracle = Address::generate(&env2); - // With mock_all_auths this succeeds; the auth check is enforced by Soroban's auth framework - client2.update_oracle(&new_oracle); + init_mint_client( + &env, + &client, + &admin, + &oracle, + &reserve_tracker, + &acbu_token_id, + &usdc_token_id, + &vault, + &treasury, + 300, // 3% fee_rate + 100, + ); + + let fiat_amount = 50 * DECIMALS; + let tx_id_1 = SorobanString::from_str(&env, "fiat_tx_fee_before"); + let minted_before = client.mint_from_fiat( + &admin, + &recipient, + &CurrencyCode::new(&env, "NGN"), + &fiat_amount, + &tx_id_1, + ); + + client.set_fee_rate(&500); // raise to 5% + + let tx_id_2 = SorobanString::from_str(&env, "fiat_tx_fee_after"); + let minted_after = client.mint_from_fiat( + &admin, + &recipient, + &CurrencyCode::new(&env, "NGN"), + &fiat_amount, + &tx_id_2, + ); + + assert!(minted_after < minted_before); } // --- Fee-rate range validation (#317) --- diff --git a/acbu_minting/tests/test_mint_from_fiat.rs b/acbu_minting/tests/test_mint_from_fiat.rs index 6991cbb2..40eb45b7 100644 --- a/acbu_minting/tests/test_mint_from_fiat.rs +++ b/acbu_minting/tests/test_mint_from_fiat.rs @@ -193,7 +193,6 @@ fn test_mint_from_fiat_success() { } #[test] -#[should_panic(expected = "Unauthorized operator")] #[should_panic(expected = "#5007")] fn test_mint_from_fiat_unauthorized_caller() { let env = Env::default(); @@ -242,7 +241,6 @@ fn test_mint_from_fiat_unauthorized_caller() { } #[test] -#[should_panic(expected = "Unauthorized operator")] #[should_panic(expected = "#5007")] fn test_mint_from_fiat_recipient_self_mint() { let env = Env::default(); @@ -337,7 +335,6 @@ fn test_mint_from_fiat_empty_tx_id() { } #[test] -#[should_panic(expected = "Fiat transaction already processed")] #[should_panic(expected = "#5008")] fn test_mint_from_fiat_duplicate_tx_id() { let env = Env::default(); @@ -536,7 +533,6 @@ fn test_mint_from_fiat_admin_not_default_operator() { } #[test] -#[should_panic(expected = "Unauthorized operator")] #[should_panic(expected = "#5007")] fn test_mint_from_fiat_admin_when_operator_set() { let env = Env::default(); diff --git a/scripts/fetch_token_wasm.sh b/scripts/fetch_token_wasm.sh index bc996d2c..417e51ff 100755 --- a/scripts/fetch_token_wasm.sh +++ b/scripts/fetch_token_wasm.sh @@ -6,7 +6,7 @@ PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" DEST="$PROJECT_ROOT/soroban_token_contract.wasm" # SHA-256 of the expected artifact — must match contractimport! sha256 fields. -EXPECTED_HASH="eb1a53948744e12a6b00ec891b301ebc78a06deb984d3726c9cbc315392aedec" +EXPECTED_HASH="8759e8ea16c858a6d3b743dd0be8b580e363d0097538fb77b375965619288d95" # Stellar / soroban-examples release that ships this exact token contract. # The soroban-examples repo does not publish pre-built WASM binaries; @@ -45,7 +45,7 @@ trap "rm -rf $TEMP_DIR" EXIT git clone --depth 1 --branch "$SOROBAN_EXAMPLES_TAG" "$SOROBAN_EXAMPLES_REPO" "$TEMP_DIR/soroban-examples" 2>&1 | grep -v "^Cloning" || true # Build the token contract -cd "$TEMP_DIR/soroban-examples/contracts/tokens/stellar_asset" +cd "$TEMP_DIR/soroban-examples/token" if cargo build --release --target wasm32-unknown-unknown >/dev/null 2>&1; then : else @@ -54,7 +54,7 @@ else fi # Copy the built WASM to the destination -BUILT_WASM="$TEMP_DIR/soroban-examples/target/wasm32-unknown-unknown/release/soroban_token_contract.wasm" +BUILT_WASM="$TEMP_DIR/soroban-examples/token/target/wasm32-unknown-unknown/release/soroban_token_contract.wasm" if [[ ! -f "$BUILT_WASM" ]]; then echo -e "${RED}[FAIL]${NC} Built WASM file not found at expected location." exit 1