diff --git a/rgb-aluvm b/rgb-aluvm index 015e8a9..a3df639 160000 --- a/rgb-aluvm +++ b/rgb-aluvm @@ -1 +1 @@ -Subproject commit 015e8a9321f32b873f7e456a99b10ce2efd9a4c8 +Subproject commit a3df63904f8ae04b5a2279c507b1f168f87590c2 diff --git a/rgb-consensus b/rgb-consensus index 456df5d..16133ea 160000 --- a/rgb-consensus +++ b/rgb-consensus @@ -1 +1 @@ -Subproject commit 456df5d64a11dab0d26d8dfae40416e5e0bb1370 +Subproject commit 16133eaf874b3c98eb6d0e15b29a5bd7f102a3d1 diff --git a/rgb-schemas b/rgb-schemas index 8c7c5f5..5934dfa 160000 --- a/rgb-schemas +++ b/rgb-schemas @@ -1 +1 @@ -Subproject commit 8c7c5f5dcceac3c3412b1b173aa5dffa579fa5d4 +Subproject commit 5934dfa671d650269a8901b058dca66e48b235a1 diff --git a/tests/fixtures/consignment_C.json b/tests/fixtures/consignment_C.json index 5fa5414..ce8b989 100644 --- a/tests/fixtures/consignment_C.json +++ b/tests/fixtures/consignment_C.json @@ -4,8 +4,8 @@ "terminals": {}, "genesis": { "ffv": 0, - "schemaId": "rgb:sch:p6H_wtDgei9HHUVLjKW0tNdHHFLhfHxrn9QX_QQUE78#scale-year-shave", - "timestamp": 1768327802, + "schemaId": "rgb:sch:IpjJhFLz3oywYKQxO3KmFgR0Aa415nlTNrNyEFqMZCE#shoe-colombo-mango", + "timestamp": 1777472703, "issuer": "ssi:anonymous", "chainNet": "bitcoinRegtest", "sealClosingStrategy": "firstOpretOrTapret", @@ -33,9 +33,9 @@ "items": [ { "seal": { - "txid": "d20b2a6455a795e26f1a4c6cceb515cb6e36d931643684c6750e2d049b23be97", + "txid": "7040a989aa8fcdbf9f8f2b797acf41faabb432725256d90f83c3c3a704b44740", "vout": 1, - "blinding": 3259561944024799135 + "blinding": 8537134690431088313 }, "state": 666 } @@ -46,9 +46,9 @@ "items": [ { "seal": { - "txid": "d20b2a6455a795e26f1a4c6cceb515cb6e36d931643684c6750e2d049b23be97", + "txid": "7040a989aa8fcdbf9f8f2b797acf41faabb432725256d90f83c3c3a704b44740", "vout": 1, - "blinding": 15900867382779101602 + "blinding": 6212672796954923605 }, "state": 100 } @@ -63,7 +63,7 @@ "version": 2, "inputs": [ { - "prevOutput": "d20b2a6455a795e26f1a4c6cceb515cb6e36d931643684c6750e2d049b23be97:1", + "prevOutput": "7040a989aa8fcdbf9f8f2b797acf41faabb432725256d90f83c3c3a704b44740:1", "sigScript": "", "sequence": 0, "witness": [] @@ -72,15 +72,15 @@ "outputs": [ { "value": 0, - "scriptPubkey": "6a20ab563dc645e8ad481ba20613d85c5863f030439f9bb29a0a64cd5135af8fcf74" + "scriptPubkey": "6a2062078f2793ff31879d47fa68ab6a4b238febc8fa3a0646657e3a3af660864ada" }, { "value": 9000, - "scriptPubkey": "0014f733d879d1cc03ce1b17a7564182abc55630b2c1" + "scriptPubkey": "001451db0bffc71fa08ab5dd07c174af6cd6fdd99a9b" }, { "value": 99990600, - "scriptPubkey": "0014ed3ae26c00ab6066993ba53101819625b7a44d89" + "scriptPubkey": "001408d30ed2faaaebd86056b9c1198f72e7f0b40bcb" } ], "lockTime": 0 @@ -88,33 +88,33 @@ }, "anchor": { "mpcProof": { - "pos": 0, + "pos": 3, "cofactor": 0, "path": [ - "177d85dc11e305cbda48ded422e8cd7a7c77f819080bbda818ca735b5eafe994", - "c36330a2028186d87ebca16ce880a9d1ee1a42684cc51a6218b862849bd0bf22", - "ab41f05ba02d9358ca075600a7f17573e919174fc48a0b626754b59a1035d479" + "2acbb74a602bba5f7e705ca77184b5f9cc38342c6e7d7b72dc02ad4aaba4c2f3", + "4e6425d69459780f8149aa343f41206d1c37589bc963b0173f842479ded6996f", + "8c1ff13d9403301d34d30d23641529b80a9739a8ab2649862099c84c3cbe9472" ] }, "dbcProof": null }, "bundle": { "inputMap": { - "d89f50bee61d284975702392fec938ffed5a740b6eafc82a2be19f28f71335a3/4000/0": "dec071e8fc1ed4fc0906d9f7b325fafa5df16b9dc8d26c4b8e430f1dacfb6fb8", - "d89f50bee61d284975702392fec938ffed5a740b6eafc82a2be19f28f71335a3/4010/0": "343b64f7751411c8fac25b3b07ad0c744d9b8904a15321a41b529e067ad9a1d3" + "5bc2bdc4e2b9d6e78f6e4ed8ea67eb6019bd137d34b05a6783cdfe41e2c38e60/4000/0": "9ab8e7dd49d60cc8f15b231e1e80efa0c1e6add7eb406217683e6c5d7f9085f2", + "5bc2bdc4e2b9d6e78f6e4ed8ea67eb6019bd137d34b05a6783cdfe41e2c38e60/4010/0": "70e4520b53a0f7de3249db1c4339d754f33c7c0c3eb7bd4109d24ff4cb4d816b" }, "knownTransitions": [ { - "opid": "dec071e8fc1ed4fc0906d9f7b325fafa5df16b9dc8d26c4b8e430f1dacfb6fb8", + "opid": "9ab8e7dd49d60cc8f15b231e1e80efa0c1e6add7eb406217683e6c5d7f9085f2", "transition": { "ffv": 0, - "contractId": "rgb:2J9QvuYd-KEl1cCO-S~sk4~_-1adAtur-8gqK_Gf-KPcTNaM", + "contractId": "rgb:W8K9xOK5-1uePbk7-Y6mfrYB-m9E300s-Fpng83_-QeLDjmA", "nonce": 18446744073709551615, "transitionType": 10000, "metadata": {}, "globals": {}, "inputs": [ - "d89f50bee61d284975702392fec938ffed5a740b6eafc82a2be19f28f71335a3/4000/0" + "5bc2bdc4e2b9d6e78f6e4ed8ea67eb6019bd137d34b05a6783cdfe41e2c38e60/4000/0" ], "assignments": { "4000": { @@ -124,7 +124,7 @@ "seal": { "txid": null, "vout": 2, - "blinding": 551529635014891351 + "blinding": 997935127262379982 }, "state": 666 } @@ -135,16 +135,16 @@ } }, { - "opid": "343b64f7751411c8fac25b3b07ad0c744d9b8904a15321a41b529e067ad9a1d3", + "opid": "70e4520b53a0f7de3249db1c4339d754f33c7c0c3eb7bd4109d24ff4cb4d816b", "transition": { "ffv": 0, - "contractId": "rgb:2J9QvuYd-KEl1cCO-S~sk4~_-1adAtur-8gqK_Gf-KPcTNaM", + "contractId": "rgb:W8K9xOK5-1uePbk7-Y6mfrYB-m9E300s-Fpng83_-QeLDjmA", "nonce": 18446744073709551615, "transitionType": 10000, "metadata": {}, "globals": {}, "inputs": [ - "d89f50bee61d284975702392fec938ffed5a740b6eafc82a2be19f28f71335a3/4010/0" + "5bc2bdc4e2b9d6e78f6e4ed8ea67eb6019bd137d34b05a6783cdfe41e2c38e60/4010/0" ], "assignments": { "4010": { @@ -154,7 +154,7 @@ "seal": { "txid": null, "vout": 2, - "blinding": 7487465468667731468 + "blinding": 2816051613231731519 }, "state": 100 } @@ -173,7 +173,7 @@ "version": 2, "inputs": [ { - "prevOutput": "bcd1faef6a10c7b5b652c2ce31b7ab200673f0ea5467f413d641e9236b1154c5:2", + "prevOutput": "507f22167c9a75dfe7d569872822f77edbd98c967ade04764c3dc1622db1b831:2", "sigScript": "", "sequence": 0, "witness": [] @@ -182,11 +182,11 @@ "outputs": [ { "value": 0, - "scriptPubkey": "6a20ff5abad6c3ab6da244a9cff4e5ab94f2003a745a50751c89e3e3349dd1b80ad8" + "scriptPubkey": "6a208e4e8af4220dd41d1cf17b6761f38efbd4f2e3d092a3b0c7754497d6fd999330" }, { "value": 99990200, - "scriptPubkey": "0014b146de068cedaa3aa0186cacc0705b6d9998d8f4" + "scriptPubkey": "0014ac6c0c7f6f57320e8b57c1cbefc284264a72d08b" } ], "lockTime": 0 @@ -194,34 +194,34 @@ }, "anchor": { "mpcProof": { - "pos": 0, + "pos": 3, "cofactor": 0, "path": [ - "a0bc45c6976181e3183bcc0b7a5825d7f9af4b8187fa28f04a35b39ab649c3cd", - "8cce52aea4b69db1683cc90e7f985ceed65ffa242441489d65a33ce96f6b379a", - "e0f9d48870645b3fb3837951820972479e7019260d2705de1de62d58f2ad017e" + "b8c10903a68e10c30833907c003fb9077234d586e5b771f46ae968fb6f64786b", + "5fda0570b16b7b505dc5bfa62144e05a8faa4dc293199dc386d38c6dc148654f", + "9ab84eb72bb3f0a64df60b494125334034770ac895e6c236680b15d3c74d7d1c" ] }, "dbcProof": null }, "bundle": { "inputMap": { - "343b64f7751411c8fac25b3b07ad0c744d9b8904a15321a41b529e067ad9a1d3/4010/0": "211f99cfe7590aa2eac03611958771364f929bcc460c36838770fb650036083d", - "dec071e8fc1ed4fc0906d9f7b325fafa5df16b9dc8d26c4b8e430f1dacfb6fb8/4000/0": "211f99cfe7590aa2eac03611958771364f929bcc460c36838770fb650036083d" + "70e4520b53a0f7de3249db1c4339d754f33c7c0c3eb7bd4109d24ff4cb4d816b/4010/0": "59a8f27a38a3bb64dd86820fcf8d2ba0816a41aa78ea5d9b8aa875e3c42cbe33", + "9ab8e7dd49d60cc8f15b231e1e80efa0c1e6add7eb406217683e6c5d7f9085f2/4000/0": "59a8f27a38a3bb64dd86820fcf8d2ba0816a41aa78ea5d9b8aa875e3c42cbe33" }, "knownTransitions": [ { - "opid": "211f99cfe7590aa2eac03611958771364f929bcc460c36838770fb650036083d", + "opid": "59a8f27a38a3bb64dd86820fcf8d2ba0816a41aa78ea5d9b8aa875e3c42cbe33", "transition": { "ffv": 0, - "contractId": "rgb:2J9QvuYd-KEl1cCO-S~sk4~_-1adAtur-8gqK_Gf-KPcTNaM", + "contractId": "rgb:W8K9xOK5-1uePbk7-Y6mfrYB-m9E300s-Fpng83_-QeLDjmA", "nonce": 18446744073709551615, "transitionType": 10000, "metadata": {}, "globals": {}, "inputs": [ - "343b64f7751411c8fac25b3b07ad0c744d9b8904a15321a41b529e067ad9a1d3/4010/0", - "dec071e8fc1ed4fc0906d9f7b325fafa5df16b9dc8d26c4b8e430f1dacfb6fb8/4000/0" + "70e4520b53a0f7de3249db1c4339d754f33c7c0c3eb7bd4109d24ff4cb4d816b/4010/0", + "9ab8e7dd49d60cc8f15b231e1e80efa0c1e6add7eb406217683e6c5d7f9085f2/4000/0" ], "assignments": { "4000": { @@ -231,7 +231,7 @@ "seal": { "txid": null, "vout": 1, - "blinding": 5745744636059418323 + "blinding": 6386430580914282116 }, "state": 666 } @@ -242,9 +242,9 @@ "items": [ { "seal": { - "txid": "b52305095266d6f683f333e984eaee5cbabdfacb1e5336f2395bb074d89950ac", - "vout": 0, - "blinding": 6838967523623182644 + "txid": "317ac8dc28cbfe5258b5e404b4525cd51b510426204ce806604b1bdc1a65b420", + "vout": 1, + "blinding": 14518343275814138614 }, "state": 100 } @@ -263,7 +263,7 @@ "version": 2, "inputs": [ { - "prevOutput": "b52305095266d6f683f333e984eaee5cbabdfacb1e5336f2395bb074d89950ac:0", + "prevOutput": "317ac8dc28cbfe5258b5e404b4525cd51b510426204ce806604b1bdc1a65b420:1", "sigScript": "", "sequence": 0, "witness": [] @@ -272,15 +272,15 @@ "outputs": [ { "value": 49999800, - "scriptPubkey": "00149b85ebf99e324cbfb4cf394699efb50db7f94c4c" + "scriptPubkey": "0014c8fd907c86d430d7e1ab380df00958ea69439c58" }, { "value": 49999800, - "scriptPubkey": "00145f2fe29a15c90da9abce0e1db0163962e9a60533" + "scriptPubkey": "0014349e18ad3a4c01e9b12f7a0024c391454a5e6eb4" }, { "value": 0, - "scriptPubkey": "6a20df21f64aeff7eb22249e4c6d5c408bcb301c7dfa1e3474b035ad1d40d0f0cb15" + "scriptPubkey": "6a2001892e223d3bd1379d3a63bcf43f65c29f4b4f7101502ce22b4df4a891ec335d" } ], "lockTime": 0 @@ -288,26 +288,26 @@ }, "anchor": { "mpcProof": { - "pos": 0, + "pos": 3, "cofactor": 0, "path": [ - "414d251ee5673247f80a2c02b80811c3e1f518b78f69e9e854def04c463c6cb7", - "730c09b4a7f82cdd5b349b03aa409ce0443e5e0412fc1b47c85ad60a130badc4", - "f86c453f119f76554666e99826257c94f019efed68c91202edebdc30598f77d7" + "f797bb618080140018d2778afaf59c5235f1a5e522113c2ce57a8bfb4085c3e4", + "f7b99d468ff576eb027f95486f049e945a93808fa373a8ed7dd5f4c9970a007c", + "fcbac35f5d2ba9fef6696d1ecffbf994a81abcbceaaee6426742e617dd2a4284" ] }, "dbcProof": null }, "bundle": { "inputMap": { - "211f99cfe7590aa2eac03611958771364f929bcc460c36838770fb650036083d/4010/0": "9be2d09bfe09cf43900b58f1281ac62fd1506ae92f964dd95c740d6d7440e27f" + "59a8f27a38a3bb64dd86820fcf8d2ba0816a41aa78ea5d9b8aa875e3c42cbe33/4010/0": "50776b79f906a2ae68e7ed2d84204b326961429e5e22ab0d338b0645df184b55" }, "knownTransitions": [ { - "opid": "9be2d09bfe09cf43900b58f1281ac62fd1506ae92f964dd95c740d6d7440e27f", + "opid": "50776b79f906a2ae68e7ed2d84204b326961429e5e22ab0d338b0645df184b55", "transition": { "ffv": 0, - "contractId": "rgb:2J9QvuYd-KEl1cCO-S~sk4~_-1adAtur-8gqK_Gf-KPcTNaM", + "contractId": "rgb:W8K9xOK5-1uePbk7-Y6mfrYB-m9E300s-Fpng83_-QeLDjmA", "nonce": 18446744073709551615, "transitionType": 8000, "metadata": { @@ -319,7 +319,7 @@ ] }, "inputs": [ - "211f99cfe7590aa2eac03611958771364f929bcc460c36838770fb650036083d/4010/0" + "59a8f27a38a3bb64dd86820fcf8d2ba0816a41aa78ea5d9b8aa875e3c42cbe33/4010/0" ], "assignments": { "4000": { @@ -329,7 +329,7 @@ "seal": { "txid": null, "vout": 0, - "blinding": 16799276049115078484 + "blinding": 16726363056347702683 }, "state": 60 } @@ -342,7 +342,7 @@ "seal": { "txid": null, "vout": 1, - "blinding": 13654059782808730808 + "blinding": 18101545057576986474 }, "state": 40 } @@ -361,19 +361,19 @@ "version": 2, "inputs": [ { - "prevOutput": "debb5703d305a8532db2b3fe449137f3899e607482fa0f8b1b9b141e6a9270b6:1", + "prevOutput": "35c0e94677725db5bf2dba08c1832a868d5829a7654cbdd59330c4ce9d08a4e9:1", "sigScript": "", "sequence": 0, "witness": [] }, { - "prevOutput": "9dfe5a7d40113bcc7d3065c9597a421df1abeb8671c7957cdad516066aa553fe:1", + "prevOutput": "5cf8d08176920eb1b9365432fd84f68315aa98824264bd92db4d892429d9024e:1", "sigScript": "", "sequence": 0, "witness": [] }, { - "prevOutput": "debb5703d305a8532db2b3fe449137f3899e607482fa0f8b1b9b141e6a9270b6:0", + "prevOutput": "35c0e94677725db5bf2dba08c1832a868d5829a7654cbdd59330c4ce9d08a4e9:0", "sigScript": "", "sequence": 0, "witness": [] @@ -382,11 +382,11 @@ "outputs": [ { "value": 199989400, - "scriptPubkey": "0014fbd52e48414ca64e371863185f37faf9688f4793" + "scriptPubkey": "00140bf1c0c5c08c11ccfc51920410ad7c722ce6f058" }, { "value": 0, - "scriptPubkey": "6a2003801a4d14ca60ec82ed828dad24a0ad2aaf3fd08ce24afe88a6f23dd3b83a20" + "scriptPubkey": "6a2001bbcf25b7188f77f56e0a9e200e1602df9c023477ced7b0b6ece527259a8170" } ], "lockTime": 0 @@ -394,38 +394,55 @@ }, "anchor": { "mpcProof": { - "pos": 0, + "pos": 3, "cofactor": 0, "path": [ - "2654d00479f293cb87da5ce93132c92a44b64637ba8035d16c0c3df0138e6937", - "711c461665619d9ffbc47fbd36afef92acb1e1aceb9563c8d5537595c8c80dd9", - "782a9e5846909dab4906c273b0e3984f5f6f22a15e5f0ec13d5c406ce320b7b6" + "b3ac81eebe7502f7eddc8cb19864d337465be890600a513a0ff2107d3b301835", + "8ccab3bafe4836e7dfdf6894426172b2bac0d9be813028f8adaee040cb32376c", + "2e147035d3bd650cd542600bc299ee23588a302d4f1f29bee409865910ee3785" ] }, "dbcProof": null }, "bundle": { "inputMap": { - "211f99cfe7590aa2eac03611958771364f929bcc460c36838770fb650036083d/4000/0": "4c7b84de230c89a09fb15d3a4e21bab1a89c211428fca8f357504e82e980a7fd", - "9be2d09bfe09cf43900b58f1281ac62fd1506ae92f964dd95c740d6d7440e27f/4000/0": "4c7b84de230c89a09fb15d3a4e21bab1a89c211428fca8f357504e82e980a7fd", - "9be2d09bfe09cf43900b58f1281ac62fd1506ae92f964dd95c740d6d7440e27f/4010/0": "4c7b84de230c89a09fb15d3a4e21bab1a89c211428fca8f357504e82e980a7fd" + "50776b79f906a2ae68e7ed2d84204b326961429e5e22ab0d338b0645df184b55/4000/0": "8d8800c6ec156c42b207a03b843c49871238b6f2b37a09052af3fcf491203343", + "50776b79f906a2ae68e7ed2d84204b326961429e5e22ab0d338b0645df184b55/4010/0": "8d8800c6ec156c42b207a03b843c49871238b6f2b37a09052af3fcf491203343", + "59a8f27a38a3bb64dd86820fcf8d2ba0816a41aa78ea5d9b8aa875e3c42cbe33/4000/0": "8d8800c6ec156c42b207a03b843c49871238b6f2b37a09052af3fcf491203343" }, "knownTransitions": [ { - "opid": "4c7b84de230c89a09fb15d3a4e21bab1a89c211428fca8f357504e82e980a7fd", + "opid": "8d8800c6ec156c42b207a03b843c49871238b6f2b37a09052af3fcf491203343", "transition": { "ffv": 0, - "contractId": "rgb:2J9QvuYd-KEl1cCO-S~sk4~_-1adAtur-8gqK_Gf-KPcTNaM", + "contractId": "rgb:W8K9xOK5-1uePbk7-Y6mfrYB-m9E300s-Fpng83_-QeLDjmA", "nonce": 18446744073709551615, "transitionType": 8010, - "metadata": {}, + "metadata": { + "1001": "9f02000000000000", + "1002": "2800000000000000" + }, "globals": {}, "inputs": [ - "211f99cfe7590aa2eac03611958771364f929bcc460c36838770fb650036083d/4000/0", - "9be2d09bfe09cf43900b58f1281ac62fd1506ae92f964dd95c740d6d7440e27f/4000/0", - "9be2d09bfe09cf43900b58f1281ac62fd1506ae92f964dd95c740d6d7440e27f/4010/0" + "50776b79f906a2ae68e7ed2d84204b326961429e5e22ab0d338b0645df184b55/4000/0", + "50776b79f906a2ae68e7ed2d84204b326961429e5e22ab0d338b0645df184b55/4010/0", + "59a8f27a38a3bb64dd86820fcf8d2ba0816a41aa78ea5d9b8aa875e3c42cbe33/4000/0" ], - "assignments": {}, + "assignments": { + "4000": { + "type": "fungible", + "items": [ + { + "seal": { + "txid": null, + "vout": 0, + "blinding": 5914338037619459764 + }, + "state": 55 + } + ] + } + }, "signature": null } } @@ -440,6 +457,14 @@ "1000": { "semId": "888c5865633af13b95b7cd1a8d8af2dac1dc140b977251d9d4daf3c7511c8e84", "name": "allowedInflation" + }, + "1001": { + "semId": "888c5865633af13b95b7cd1a8d8af2dac1dc140b977251d9d4daf3c7511c8e84", + "name": "burnedAsset" + }, + "1002": { + "semId": "888c5865633af13b95b7cd1a8d8af2dac1dc140b977251d9d4daf3c7511c8e84", + "name": "burnedInflation" } }, "globalTypes": { @@ -559,15 +584,24 @@ }, "8010": { "transitionSchema": { - "metadata": [], + "metadata": [ + 1001, + 1002 + ], "globals": {}, "inputs": { "4000": "noneOrMore", "4010": "noneOrMore", "4013": "noneOrOnce" }, - "assignments": {}, - "validator": null + "assignments": { + "4000": "noneOrMore", + "4010": "noneOrMore" + }, + "validator": { + "lib": "929b73a8510231c9084c9eb6776f0e1cfb15cd7ad1a6b4b24a8a19387e334443", + "pos": 0 + } }, "name": "burn" }, @@ -1204,6 +1238,175 @@ ], "libs": [] }, + { + "isae": [ + "ALU", + "BPDIGEST", + "RGB" + ], + "code": [ + 11, + 0, + 0, + 0, + 11, + 1, + 1, + 0, + 11, + 3, + 3, + 0, + 193, + 160, + 15, + 1, + 25, + 1, + 33, + 3, + 36, + 0, + 198, + 160, + 15, + 16, + 32, + 8, + 96, + 1, + 36, + 1, + 1, + 2, + 16, + 0, + 11, + 1, + 1, + 0, + 202, + 233, + 3, + 0, + 57, + 48, + 1, + 1, + 32, + 8, + 96, + 1, + 210, + 160, + 15, + 1, + 11, + 0, + 11, + 0, + 26, + 11, + 30, + 32, + 26, + 3, + 31, + 30, + 34, + 26, + 8, + 1, + 11, + 0, + 0, + 0, + 11, + 1, + 1, + 0, + 11, + 3, + 1, + 0, + 193, + 170, + 15, + 1, + 25, + 1, + 33, + 3, + 108, + 0, + 198, + 170, + 15, + 16, + 32, + 8, + 96, + 1, + 36, + 1, + 1, + 2, + 88, + 0, + 11, + 1, + 1, + 0, + 202, + 234, + 3, + 0, + 57, + 48, + 1, + 1, + 32, + 8, + 96, + 1, + 210, + 170, + 15, + 1, + 11, + 0, + 11, + 0, + 26, + 11, + 30, + 32, + 26, + 3, + 31, + 30, + 34, + 26, + 8, + 1, + 7 + ], + "data": [ + 40, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 41 + ], + "libs": [] + }, { "isae": [ "ALU", diff --git a/tests/fixtures/txs_C/35c0e94677725db5bf2dba08c1832a868d5829a7654cbdd59330c4ce9d08a4e9.json b/tests/fixtures/txs_C/35c0e94677725db5bf2dba08c1832a868d5829a7654cbdd59330c4ce9d08a4e9.json new file mode 100644 index 0000000..88b5c7c --- /dev/null +++ b/tests/fixtures/txs_C/35c0e94677725db5bf2dba08c1832a868d5829a7654cbdd59330c4ce9d08a4e9.json @@ -0,0 +1,29 @@ +{ + "version": 2, + "inputs": [ + { + "prevOutput": "317ac8dc28cbfe5258b5e404b4525cd51b510426204ce806604b1bdc1a65b420:1", + "sigScript": "", + "sequence": 0, + "witness": [ + "30440220012f90505dd5eee0469e6fe304a26b42e1e86d14af89fa69b2e7a04f938bee7b022010e9dd7d4872276c1653f44b38a40a4d6d0b52f8b551a1e7abe202a41439479401", + "03d54e6b17b0309ca89210fffa96b27c2e5d2b589f14d2b8aad940a951c41c219d" + ] + } + ], + "outputs": [ + { + "value": 49999800, + "scriptPubkey": "0014c8fd907c86d430d7e1ab380df00958ea69439c58" + }, + { + "value": 49999800, + "scriptPubkey": "0014349e18ad3a4c01e9b12f7a0024c391454a5e6eb4" + }, + { + "value": 0, + "scriptPubkey": "6a2001892e223d3bd1379d3a63bcf43f65c29f4b4f7101502ce22b4df4a891ec335d" + } + ], + "lockTime": 0 +} \ No newline at end of file diff --git a/tests/fixtures/txs_C/507f22167c9a75dfe7d569872822f77edbd98c967ade04764c3dc1622db1b831.json b/tests/fixtures/txs_C/507f22167c9a75dfe7d569872822f77edbd98c967ade04764c3dc1622db1b831.json new file mode 100644 index 0000000..e4faf15 --- /dev/null +++ b/tests/fixtures/txs_C/507f22167c9a75dfe7d569872822f77edbd98c967ade04764c3dc1622db1b831.json @@ -0,0 +1,29 @@ +{ + "version": 2, + "inputs": [ + { + "prevOutput": "7040a989aa8fcdbf9f8f2b797acf41faabb432725256d90f83c3c3a704b44740:1", + "sigScript": "", + "sequence": 0, + "witness": [ + "3044022058459570ce1c80c390cc2679cd05a82ad6b4c2b52db16e055591e6dfc618bfbb02206e057a1a8ca3376bc56185919e8fc61d63bf547e25f0911c0f2359b9cc20f8ab01", + "031e6fc3ba33ce977f18d34fc1d9559f61a9ff3576a0636fe08ca3044dce6edf50" + ] + } + ], + "outputs": [ + { + "value": 0, + "scriptPubkey": "6a2062078f2793ff31879d47fa68ab6a4b238febc8fa3a0646657e3a3af660864ada" + }, + { + "value": 9000, + "scriptPubkey": "001451db0bffc71fa08ab5dd07c174af6cd6fdd99a9b" + }, + { + "value": 99990600, + "scriptPubkey": "001408d30ed2faaaebd86056b9c1198f72e7f0b40bcb" + } + ], + "lockTime": 0 +} \ No newline at end of file diff --git a/tests/fixtures/txs_C/5cf8d08176920eb1b9365432fd84f68315aa98824264bd92db4d892429d9024e.json b/tests/fixtures/txs_C/5cf8d08176920eb1b9365432fd84f68315aa98824264bd92db4d892429d9024e.json new file mode 100644 index 0000000..c8380d9 --- /dev/null +++ b/tests/fixtures/txs_C/5cf8d08176920eb1b9365432fd84f68315aa98824264bd92db4d892429d9024e.json @@ -0,0 +1,25 @@ +{ + "version": 2, + "inputs": [ + { + "prevOutput": "507f22167c9a75dfe7d569872822f77edbd98c967ade04764c3dc1622db1b831:2", + "sigScript": "", + "sequence": 0, + "witness": [ + "304502210088b0693ac892dbc43aaf9695cfe3232611e8fe017ce381215f645c2d26f1ff2f022055fc244749ab2fff7aa654d01f224c338d1fd0d69c3e6b17f84e1c981471396801", + "036992612a9b4d749619594628c30867cab29caa88fc7512a4a2c572a493bec7e1" + ] + } + ], + "outputs": [ + { + "value": 0, + "scriptPubkey": "6a208e4e8af4220dd41d1cf17b6761f38efbd4f2e3d092a3b0c7754497d6fd999330" + }, + { + "value": 99990200, + "scriptPubkey": "0014ac6c0c7f6f57320e8b57c1cbefc284264a72d08b" + } + ], + "lockTime": 0 +} \ No newline at end of file diff --git a/tests/fixtures/txs_C/9dfe5a7d40113bcc7d3065c9597a421df1abeb8671c7957cdad516066aa553fe.json b/tests/fixtures/txs_C/9dfe5a7d40113bcc7d3065c9597a421df1abeb8671c7957cdad516066aa553fe.json deleted file mode 100644 index 153246f..0000000 --- a/tests/fixtures/txs_C/9dfe5a7d40113bcc7d3065c9597a421df1abeb8671c7957cdad516066aa553fe.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "version": 2, - "inputs": [ - { - "prevOutput": "bcd1faef6a10c7b5b652c2ce31b7ab200673f0ea5467f413d641e9236b1154c5:2", - "sigScript": "", - "sequence": 0, - "witness": [ - "304402204f90829a35a9743ec8d82bc56f74f4238bec3b74913c369abde081abd567571502204e60d3954e8e455f6c2a4f0e2c1ae58ef2d36fdbf03d449c644280effeec713e01", - "024ba6ff5b6cef0602bbca45222982453ef189004f97bce15abbf8fc40966cc4ff" - ] - } - ], - "outputs": [ - { - "value": 0, - "scriptPubkey": "6a20ff5abad6c3ab6da244a9cff4e5ab94f2003a745a50751c89e3e3349dd1b80ad8" - }, - { - "value": 99990200, - "scriptPubkey": "0014b146de068cedaa3aa0186cacc0705b6d9998d8f4" - } - ], - "lockTime": 0 -} \ No newline at end of file diff --git a/tests/fixtures/txs_C/bcd1faef6a10c7b5b652c2ce31b7ab200673f0ea5467f413d641e9236b1154c5.json b/tests/fixtures/txs_C/bcd1faef6a10c7b5b652c2ce31b7ab200673f0ea5467f413d641e9236b1154c5.json deleted file mode 100644 index 1a6ae61..0000000 --- a/tests/fixtures/txs_C/bcd1faef6a10c7b5b652c2ce31b7ab200673f0ea5467f413d641e9236b1154c5.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "version": 2, - "inputs": [ - { - "prevOutput": "d20b2a6455a795e26f1a4c6cceb515cb6e36d931643684c6750e2d049b23be97:1", - "sigScript": "", - "sequence": 0, - "witness": [ - "3045022100c4744c4f89d1d8a694afefb15274507d93385e93b60e2c8105c59c59e0c51fc702203f381db1e65f1acfcd3fa5f4622a9c380aa53ab97b0c1e4304b1de611cd28a3201", - "039a4b75943b649d4c3c09a6128b3fbda695ed25eedede0ea764264451a964236e" - ] - } - ], - "outputs": [ - { - "value": 0, - "scriptPubkey": "6a20ab563dc645e8ad481ba20613d85c5863f030439f9bb29a0a64cd5135af8fcf74" - }, - { - "value": 9000, - "scriptPubkey": "0014f733d879d1cc03ce1b17a7564182abc55630b2c1" - }, - { - "value": 99990600, - "scriptPubkey": "0014ed3ae26c00ab6066993ba53101819625b7a44d89" - } - ], - "lockTime": 0 -} \ No newline at end of file diff --git a/tests/fixtures/txs_C/cf94d68503a5b3e0033d187ab9b698aca1eca855bd802f6733f1ac594725f90d.json b/tests/fixtures/txs_C/cf94d68503a5b3e0033d187ab9b698aca1eca855bd802f6733f1ac594725f90d.json new file mode 100644 index 0000000..cf11f0d --- /dev/null +++ b/tests/fixtures/txs_C/cf94d68503a5b3e0033d187ab9b698aca1eca855bd802f6733f1ac594725f90d.json @@ -0,0 +1,43 @@ +{ + "version": 2, + "inputs": [ + { + "prevOutput": "35c0e94677725db5bf2dba08c1832a868d5829a7654cbdd59330c4ce9d08a4e9:1", + "sigScript": "", + "sequence": 0, + "witness": [ + "304402204171bfa599fbaf7660eb1d64a31296d86d24dfba037b0f973bc69ac1b0f52cb902207b88e6f5112540a5cfde31e1268d651bab5f00900f91863cd1fef957e969842001", + "025071cbd6111bf2787df5c771f015d5796d9e5688c01b64dd0ba8e3d15f594970" + ] + }, + { + "prevOutput": "5cf8d08176920eb1b9365432fd84f68315aa98824264bd92db4d892429d9024e:1", + "sigScript": "", + "sequence": 0, + "witness": [ + "30440220136c326375653cbc0836855f364f75aec3e4630738426dc966a620993c9e00f1022057de66f3cbd8926e9c11e2d8575989ae3104a8f2fd7c3be372909fc29305984601", + "034bff9a9dddf089ec9e18a319bc9642628462640fdb47410628ec5dcabb9e1024" + ] + }, + { + "prevOutput": "35c0e94677725db5bf2dba08c1832a868d5829a7654cbdd59330c4ce9d08a4e9:0", + "sigScript": "", + "sequence": 0, + "witness": [ + "3045022100fb8ad4639c4bfeada626e8d7634a81476b9b7cd73cd96bda55f5fb6cbacf90e502205281127dab0f24115aa1a8374145828f276b0786ed7a83839469c4341ef1a50201", + "02fa803f8914c00f65cd25a797e60321234f2075e97e6c726f0bf0d2c3b1a33837" + ] + } + ], + "outputs": [ + { + "value": 199989400, + "scriptPubkey": "00140bf1c0c5c08c11ccfc51920410ad7c722ce6f058" + }, + { + "value": 0, + "scriptPubkey": "6a2001bbcf25b7188f77f56e0a9e200e1602df9c023477ced7b0b6ece527259a8170" + } + ], + "lockTime": 0 +} \ No newline at end of file diff --git a/tests/fixtures/txs_C/d627b8e799fb247992d3381014f676fba1b85ba1972f77b1ce788dfeccb3d753.json b/tests/fixtures/txs_C/d627b8e799fb247992d3381014f676fba1b85ba1972f77b1ce788dfeccb3d753.json deleted file mode 100644 index 4166640..0000000 --- a/tests/fixtures/txs_C/d627b8e799fb247992d3381014f676fba1b85ba1972f77b1ce788dfeccb3d753.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "version": 2, - "inputs": [ - { - "prevOutput": "debb5703d305a8532db2b3fe449137f3899e607482fa0f8b1b9b141e6a9270b6:1", - "sigScript": "", - "sequence": 0, - "witness": [ - "3045022100f8902b9135c9bbeb112d62118de12dfc3dfdeba72b40176e085c6a2f19b88544022066b0fdab53471bee0f263b86df1a0a30d0c942878b44dda0efe7a349404ddc5101", - "02f8739d7f89092102ef2bb3d5490f475fc092a99520fde7490409775462a1e870" - ] - }, - { - "prevOutput": "9dfe5a7d40113bcc7d3065c9597a421df1abeb8671c7957cdad516066aa553fe:1", - "sigScript": "", - "sequence": 0, - "witness": [ - "304402200bad491d39a0e371a6382db241e6f6c969f1e348ff17382fe1b465dba4e9cc2602206de05fe97e57d385e545f3beb50f59f056b0b607c7b177b81f9f40c8ed9adc8601", - "025785d0fe0133c4b8e65e138292fe2b8d531f74ff8e95136be0a61aa6ab89f4bc" - ] - }, - { - "prevOutput": "debb5703d305a8532db2b3fe449137f3899e607482fa0f8b1b9b141e6a9270b6:0", - "sigScript": "", - "sequence": 0, - "witness": [ - "304402201da32549e4617633617a5a87b43e9d7b9decb14ddb871985b4d421673a102952022065d3c69cba677ae0cc16a57256db7013038431d895ecce34d6f85824eea1092d01", - "0346de1b2d2693db8f8ea010b3d9595dde8b67ac7f5662e298c00632dd03e8a696" - ] - } - ], - "outputs": [ - { - "value": 199989400, - "scriptPubkey": "0014fbd52e48414ca64e371863185f37faf9688f4793" - }, - { - "value": 0, - "scriptPubkey": "6a2003801a4d14ca60ec82ed828dad24a0ad2aaf3fd08ce24afe88a6f23dd3b83a20" - } - ], - "lockTime": 0 -} \ No newline at end of file diff --git a/tests/fixtures/txs_C/debb5703d305a8532db2b3fe449137f3899e607482fa0f8b1b9b141e6a9270b6.json b/tests/fixtures/txs_C/debb5703d305a8532db2b3fe449137f3899e607482fa0f8b1b9b141e6a9270b6.json deleted file mode 100644 index b83f523..0000000 --- a/tests/fixtures/txs_C/debb5703d305a8532db2b3fe449137f3899e607482fa0f8b1b9b141e6a9270b6.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "version": 2, - "inputs": [ - { - "prevOutput": "b52305095266d6f683f333e984eaee5cbabdfacb1e5336f2395bb074d89950ac:0", - "sigScript": "", - "sequence": 0, - "witness": [ - "3045022100e662179dd486fe4d7df7febe9cf01a2cbe1c6db746a7f4a1e463b06b95a13f0102201343676400fc315a892a6166770974a69737258ea39f51a9070ec407338088ed01", - "034c80037221648b23e564bfafd81d717d6ef7393d6e50a129e6e7d00c3b9fa4a7" - ] - } - ], - "outputs": [ - { - "value": 49999800, - "scriptPubkey": "00149b85ebf99e324cbfb4cf394699efb50db7f94c4c" - }, - { - "value": 49999800, - "scriptPubkey": "00145f2fe29a15c90da9abce0e1db0163962e9a60533" - }, - { - "value": 0, - "scriptPubkey": "6a20df21f64aeff7eb22249e4c6d5c408bcb301c7dfa1e3474b035ad1d40d0f0cb15" - } - ], - "lockTime": 0 -} \ No newline at end of file diff --git a/tests/issuance.rs b/tests/issuance.rs index 423258a..be9a077 100644 --- a/tests/issuance.rs +++ b/tests/issuance.rs @@ -474,7 +474,7 @@ fn deterministic_contract_id(#[case] asset_schema: AssetSchema) { } AssetSchema::Ifa => ( AssetInfo::default_ifa(vec![999], vec![]), - "rgb:1TyUZt~C-FxgMtiZ-vqFBx3b-_kszB6O-eAidSVh-NGRKTtA", + "rgb:Klp~7R_Q-z3Fv1J5-Vd6NotS-eGBmIqT-_zx2cz3-shptV6w", ), }; diff --git a/tests/transfers.rs b/tests/transfers.rs index 7306473..54bae5d 100644 --- a/tests/transfers.rs +++ b/tests/transfers.rs @@ -1861,20 +1861,66 @@ fn ifa_burn() { let mut wlt_1 = BpTestWallet::with_descriptor(&DescriptorType::Wpkh); let mut wlt_2 = BpTestWallet::with_descriptor(&DescriptorType::Wpkh); - let contract_id = wlt_1.issue_ifa(999, None, vec![]); + let issued_amt = 999; + let infl_utxo = wlt_1.get_utxo(None); + let contract_id = wlt_1.issue_ifa(issued_amt, None, vec![(infl_utxo, 100)]); + let schema_id = wlt_1.schema_id(contract_id); - let amt = 300; + let mut amt_asset = 300; let utxo = wlt_2.get_utxo(None); wlt_1.send_ifa( &mut wlt_2, InvoiceType::Blinded(Some(utxo)), contract_id, - amt, + amt_asset, + ); + let mut amt_infl = 60; + let mut invoice = wlt_2.invoice( + contract_id, + schema_id, + amt_infl, + InvoiceType::Blinded(Some(utxo)), + ); + invoice.assignment_name = Some(fname!("inflationAllowance")); + wlt_1.send_to_invoice(&mut wlt_2, invoice, None, None, None); + + // partial burn assets + wlt_2.check_allocations(contract_id, AssetSchema::Ifa, vec![amt_asset], false); + let utxos = wlt_2.list_unspent_outpoints(); + let burn_amt_asset = 99; + let burn_amt_infl = 12; + wlt_2.burn_ifa( + contract_id, + utxos, + Some(map! {OS_ASSET => burn_amt_asset, OS_INFLATION => burn_amt_infl}), + ); + amt_asset -= burn_amt_asset; + amt_infl -= burn_amt_infl; + + wlt_2.debug_logs(contract_id, AllocationFilter::Wallet); + let utxo = wlt_1.get_utxo(None); + wlt_2.send_ifa( + &mut wlt_1, + InvoiceType::Blinded(Some(utxo)), + contract_id, + amt_asset, ); + let mut invoice = wlt_1.invoice( + contract_id, + schema_id, + amt_infl, + InvoiceType::Blinded(Some(utxo)), + ); + invoice.assignment_name = Some(fname!("inflationAllowance")); + wlt_2.send_to_invoice(&mut wlt_1, invoice, None, None, None); - // burn assets - wlt_2.check_allocations(contract_id, AssetSchema::Ifa, vec![amt], false); - let (consignment, _) = wlt_2.burn_ifa(contract_id, vec![utxo]); + // partial burn of asset allocation, inflation is burned in full + let utxos = wlt_1.list_unspent_outpoints(); + wlt_1.burn_ifa(contract_id, utxos, Some(map! {OS_ASSET => 16})); + wlt_1.debug_logs(contract_id, AllocationFilter::Wallet); + // burn remaining asset allocation + let utxos = wlt_1.list_unspent_outpoints(); + let (consignment, _) = wlt_1.burn_ifa(contract_id, utxos, None); let last_transition = consignment .bundles .iter() @@ -1888,6 +1934,7 @@ fn ifa_burn() { .transition .clone(); assert!(last_transition.transition_type == TS_BURN); + wlt_1.check_allocations(contract_id, AssetSchema::Ifa, vec![], false); wlt_2.check_allocations(contract_id, AssetSchema::Ifa, vec![], false); } diff --git a/tests/utils/mod.rs b/tests/utils/mod.rs index b924932..4d00139 100644 --- a/tests/utils/mod.rs +++ b/tests/utils/mod.rs @@ -56,8 +56,8 @@ pub use std::{ pub use amplify::{ ByteArray, Bytes64, From, Wrapper, bmap, bset, confinement::{ - Collection, Confined, LargeVec, NonEmptyOrdMap, NonEmptyOrdSet, NonEmptyVec, SmallOrdMap, - TinyOrdMap, TinyOrdSet, U16, + Collection, Confined, LargeVec, NonEmptyOrdMap, NonEmptyOrdSet, NonEmptyVec, SmallBlob, + SmallOrdMap, TinyOrdMap, TinyOrdSet, U16, }, hex::FromHex, map, none, @@ -133,12 +133,12 @@ pub use psrgbt_altered::{ pub use rand::{Rng, RngCore, SeedableRng, rngs::StdRng, seq::SliceRandom}; #[cfg(not(feature = "altered"))] pub use rgb::{ - Assign, AssignmentDetails, AssignmentType, BundleId, DescriptorRgb, FungibleState, GenesisSeal, - GlobalDetails, GlobalStateSchema, GraphSeal, Identity, KnownTransition, MetaDetails, MetaType, - MetaValue, Occurrences, OccurrencesMismatch, OpFullType, OpId, Opout, Outpoint, - OwnedStateSchema, RevealedData, RevealedValue, RgbDescr, RgbWallet, StateType, TapretKey, - TransferParams, Transition, TransitionBundle, TransitionType, TypedAssigns, Vin, VoidState, - WalletProvider, WpkhDescr, + Assign, AssignFungible, AssignmentDetails, AssignmentType, BundleId, DescriptorRgb, + FungibleState, GenesisSeal, GlobalDetails, GlobalStateSchema, GraphSeal, Identity, + KnownTransition, MetaDetails, MetaType, MetaValue, Occurrences, OccurrencesMismatch, + OpFullType, OpId, Opout, Outpoint, OwnedStateSchema, RevealedData, RevealedValue, RgbDescr, + RgbWallet, StateType, TapretKey, TransferParams, Transition, TransitionBundle, TransitionType, + TypedAssigns, Vin, VoidState, WalletProvider, WpkhDescr, assignments::AssignVec, bitcoin::{ Address, CompressedPublicKey, Network, Psbt, ScriptBuf, TapLeafHash, TapNodeHash, @@ -225,11 +225,11 @@ pub use rgbstd::{ }; pub use rstest::rstest; pub use schemata::{ - CFA_SCHEMA_ID, CollectibleFungibleAsset, ERRNO_INFLATION_MISMATCH, ERRNO_ISSUED_MISMATCH, - ERRNO_NON_EQUAL_IN_OUT, GS_ISSUED_SUPPLY, IFA_SCHEMA_ID, IfaWrapper, InflatableFungibleAsset, - MS_ALLOWED_INFLATION, NIA_SCHEMA_ID, NonInflatableAsset, OS_ASSET, OS_INFLATION, OS_LINK, - PFA_SCHEMA_ID, PermissionedFungibleAsset, TS_BURN, TS_INFLATION, TS_TRANSFER, UDA_SCHEMA_ID, - UniqueDigitalAsset, + CFA_SCHEMA_ID, CollectibleFungibleAsset, ERRNO_BURN_MISMATCH, ERRNO_BURN_ZERO, + ERRNO_INFLATION_MISMATCH, ERRNO_ISSUED_MISMATCH, ERRNO_NON_EQUAL_IN_OUT, GS_ISSUED_SUPPLY, + IFA_SCHEMA_ID, IfaWrapper, InflatableFungibleAsset, MS_ALLOWED_INFLATION, NIA_SCHEMA_ID, + NonInflatableAsset, OS_ASSET, OS_INFLATION, OS_LINK, PFA_SCHEMA_ID, PermissionedFungibleAsset, + TS_BURN, TS_INFLATION, TS_TRANSFER, UDA_SCHEMA_ID, UniqueDigitalAsset, burn_meta_by_assignment, }; pub use serde::{Deserialize, Serialize}; pub use serde_json::{Value, json}; diff --git a/tests/utils/wallet/bp.rs b/tests/utils/wallet/bp.rs index d8d9980..ddf9235 100644 --- a/tests/utils/wallet/bp.rs +++ b/tests/utils/wallet/bp.rs @@ -349,7 +349,12 @@ impl BpTestWallet { ); } - pub fn burn_ifa(&mut self, contract_id: ContractId, utxos: Vec) -> (Transfer, Tx) { + pub fn burn_ifa( + &mut self, + contract_id: ContractId, + utxos: Vec, + burn_amount_by_type: Option>, + ) -> (Transfer, Tx) { let address = self.get_address(); let (mut psbt, _) = self.construct_psbt(utxos, vec![(address, None)], None); let mut asset_transition_builder = self @@ -361,6 +366,7 @@ impl BpTestWallet { .inputs() .map(|txin| outpoint_bp_to_bitcoin(txin.previous_outpoint)) .collect::>(); + let mut amt_by_type = map! { OS_ASSET => 0, OS_INFLATION => 0 }; for (_, opout_state_map) in self .wallet .stock() @@ -368,10 +374,30 @@ impl BpTestWallet { .unwrap() { for (opout, state) in opout_state_map { + if let AllocatedState::Amount(amt) = state { + *amt_by_type.get_mut(&opout.ty).unwrap() += amt.as_u64(); + } asset_transition_builder = asset_transition_builder.add_input(opout, state).unwrap(); } } + let burn_amt_by_type = burn_amount_by_type.unwrap_or_default(); + let seal = BuilderSeal::Revealed(GraphSeal::new_random_vout(0)); + for (assignment_type, amt) in &amt_by_type { + let burn_amt = burn_amt_by_type.get(assignment_type).unwrap_or(amt); + let change = amt - burn_amt; + if change > 0 { + asset_transition_builder = asset_transition_builder + .add_owned_state_raw(*assignment_type, seal, Amount::from(change).into()) + .unwrap(); + } + asset_transition_builder = asset_transition_builder + .add_metadata_raw( + burn_meta_by_assignment(assignment_type), + Amount::from(*burn_amt), + ) + .unwrap(); + } let transition = asset_transition_builder.complete_transition().unwrap(); let opid = transition.id(); psbt.push_rgb_transition(transition).unwrap(); @@ -387,6 +413,7 @@ impl BpTestWallet { println!("burn txid: {}", txid); self.sync(); let consignment = self.consign_transfer(contract_id, [], [], [opid], Some(txid)); + self.accept_transfer(consignment.clone(), None); (consignment, tx) } diff --git a/tests/validation.rs b/tests/validation.rs index aafbdba..8d69412 100644 --- a/tests/validation.rs +++ b/tests/validation.rs @@ -389,7 +389,11 @@ fn get_consignment(scenario: Scenario) -> (Transfer, Vec) { let (consignment, tx) = if scenario == Scenario::C { // burn all allocations let wlt_1_utxos = wlt_1.list_unspent_outpoints(); - wlt_1.burn_ifa(contract_id_2, wlt_1_utxos) + wlt_1.burn_ifa( + contract_id_2, + wlt_1_utxos, + Some(map! {OS_ASSET => next_amt}), + ) } else { // spend change of previous send wlt_1.send( @@ -402,6 +406,19 @@ fn get_consignment(scenario: Scenario) -> (Transfer, Vec) { ) }; txes.push(tx); + let trusted_typesystem = AssetSchema::from(consignment.schema_id()).types(); + let validation_config = ValidationConfig { + chain_net: ChainNet::BitcoinRegtest, + trusted_typesystem, + ..Default::default() + }; + let resolver = OfflineResolver { + consignment: &consignment, + }; + consignment + .clone() + .validate(&resolver, &validation_config) + .unwrap(); (consignment, txes) } @@ -2445,9 +2462,93 @@ fn validate_consignment_ifa() { .map(|i| i.ty) .collect::>(); assert_eq!(input_assignment_types, set![OS_ASSET, OS_INFLATION]); + let assignment_types = [OS_ASSET, OS_INFLATION]; - // Error: burn transitions can't have assignments - for assignment_type in [OS_ASSET, OS_INFLATION] { + // Error: burn transitions can't inflate + for assignment_type in assignment_types { + let mut consignment = base_consignment.clone(); + let mut bundles = consignment.bundles.release(); + let wbundle = bundles + .iter_mut() + .find(|wb| wb.witness_id() == old_txid) + .unwrap(); + let mut transition = base_transition.clone(); + transition + .assignments + .insert( + assignment_type, + TypedAssigns::Fungible(AssignVec::with(NonEmptyVec::with( + AssignFungible::ConfidentialSeal { + seal: SecretSeal::strict_dumb(), + state: RevealedValue::new(1u64), + }, + ))), + ) + .unwrap(); + let opid = transition.id(); + assert_ne!(opid, old_opid); + replace_transition_in_bundle(wbundle, old_opid, transition); + remove_transition_children(&mut bundles, bset![old_opid], None); + consignment.bundles = LargeVec::from_checked(bundles); + let resolver = OfflineResolver { + consignment: &consignment, + }; + let res = consignment + .clone() + .validate(&resolver, &validation_config) + .unwrap_err(); + dbg!(&res); + assert_eq!( + res, + ValidationError::InvalidConsignment(Failure::ScriptFailure( + opid, + Some(ERRNO_BURN_MISMATCH), + None, + )) + ); + } + + // Error: burn transitions need to report correct burn amount + for assignment_type in assignment_types { + let mut consignment = base_consignment.clone(); + let mut bundles = consignment.bundles.release(); + let wbundle = bundles + .iter_mut() + .find(|wb| wb.witness_id() == old_txid) + .unwrap(); + let mut transition = base_transition.clone(); + let metadata_type = burn_meta_by_assignment(&assignment_type); + let mut burn_meta = u64::from_le_bytes( + <[u8; 8]>::try_from(transition.metadata[&metadata_type].as_slice()).unwrap(), + ); + burn_meta += 1; + *transition.metadata.get_mut(&metadata_type).unwrap() = + SmallBlob::from_iter_checked(burn_meta.to_le_bytes()).into(); + let opid = transition.id(); + assert_ne!(opid, old_opid); + replace_transition_in_bundle(wbundle, old_opid, transition); + remove_transition_children(&mut bundles, bset![old_opid], None); + consignment.bundles = LargeVec::from_checked(bundles); + let resolver = OfflineResolver { + consignment: &consignment, + }; + let res = consignment + .clone() + .validate(&resolver, &validation_config) + .unwrap_err(); + dbg!(&res); + assert_eq!( + res, + ValidationError::InvalidConsignment(Failure::ScriptFailure( + opid, + Some(ERRNO_BURN_MISMATCH), + None, + )) + ); + } + + // Error: burn transitions need to burn a nonzero amount + for assignment_type in assignment_types { let mut consignment = base_consignment.clone(); let mut bundles = consignment.bundles.release(); let wbundle = bundles @@ -2455,10 +2556,33 @@ fn validate_consignment_ifa() { .find(|wb| wb.witness_id() == old_txid) .unwrap(); let mut transition = base_transition.clone(); + let metadata_type = burn_meta_by_assignment(&assignment_type); + let burn_amt = u64::from_le_bytes( + <[u8; 8]>::try_from(transition.metadata[&metadata_type].as_slice()).unwrap(), + ); + let chg_amt: u64 = if let Some(ta) = transition.assignments.get(&assignment_type) { + ta.as_fungible() + .iter() + .map(|a| a.as_revealed_state().as_u64()) + .sum() + } else { + 0 + }; transition .assignments - .insert(assignment_type, TypedAssigns::strict_dumb()) + .insert( + assignment_type, + TypedAssigns::Fungible(AssignVec::with(NonEmptyVec::with( + AssignFungible::ConfidentialSeal { + seal: SecretSeal::strict_dumb(), + state: RevealedValue::new(burn_amt + chg_amt), + }, + ))), + ) .unwrap(); + *transition.metadata.get_mut(&metadata_type).unwrap() = + SmallBlob::from_iter_checked([0; 8]).into(); + assert_ne!(burn_amt, 0); let opid = transition.id(); assert_ne!(opid, old_opid); replace_transition_in_bundle(wbundle, old_opid, transition); @@ -2474,12 +2598,86 @@ fn validate_consignment_ifa() { dbg!(&res); assert_eq!( res, - ValidationError::InvalidConsignment(Failure::SchemaUnknownAssignmentType( + ValidationError::InvalidConsignment(Failure::ScriptFailure( opid, - assignment_type + Some(ERRNO_BURN_ZERO), + None, )) ); } + + // Error: even if an assignment type is not present, its meta type must be there + for assignment_type in assignment_types { + let mut consignment = base_consignment.clone(); + let mut bundles = consignment.bundles.release(); + let wbundle = bundles + .iter_mut() + .find(|wb| wb.witness_id() == old_txid) + .unwrap(); + let mut transition = base_transition.clone(); + transition.inputs = NonEmptyOrdSet::from_iter_checked( + transition + .inputs + .iter() + .filter(|i| i.ty != assignment_type) + .cloned(), + ) + .into(); + let meta_type = burn_meta_by_assignment(&assignment_type); + transition.metadata.remove(&meta_type).unwrap(); + transition.assignments.remove(&assignment_type).unwrap(); + let opid = transition.id(); + assert_ne!(opid, old_opid); + replace_transition_in_bundle(wbundle, old_opid, transition); + remove_transition_children(&mut bundles, bset![old_opid], None); + consignment.bundles = LargeVec::from_checked(bundles); + let resolver = OfflineResolver { + consignment: &consignment, + }; + let res = consignment + .clone() + .validate(&resolver, &validation_config) + .unwrap_err(); + assert_eq!( + res, + ValidationError::InvalidConsignment(Failure::SchemaNoMetadata(opid, meta_type,)) + ); + } + + // Success: when an assignment type is missing, the corresponding metadata needs to be zero + for assignment_type in assignment_types { + let mut consignment = base_consignment.clone(); + let mut bundles = consignment.bundles.release(); + let wbundle = bundles + .iter_mut() + .find(|wb| wb.witness_id() == old_txid) + .unwrap(); + let mut transition = base_transition.clone(); + let metadata_type = burn_meta_by_assignment(&assignment_type); + transition.inputs = NonEmptyOrdSet::from_iter_checked( + transition + .inputs + .iter() + .filter(|i| i.ty != assignment_type) + .cloned(), + ) + .into(); + transition.assignments.remove(&assignment_type).unwrap(); + *transition.metadata.get_mut(&metadata_type).unwrap() = + SmallBlob::from_iter_checked([0; 8]).into(); + let opid = transition.id(); + assert_ne!(opid, old_opid); + replace_transition_in_bundle(wbundle, old_opid, transition); + remove_transition_children(&mut bundles, bset![old_opid], None); + consignment.bundles = LargeVec::from_checked(bundles); + let resolver = OfflineResolver { + consignment: &consignment, + }; + consignment + .clone() + .validate(&resolver, &validation_config) + .unwrap(); + } } #[derive(Clone, Debug, Eq, PartialEq)]