Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fail spending allocations received with an opret+tapret transfer #275

Open
zoedberg opened this issue Sep 25, 2024 · 16 comments · May be fixed by RGB-WG/rgb-tests#18
Open

fail spending allocations received with an opret+tapret transfer #275

zoedberg opened this issue Sep 25, 2024 · 16 comments · May be fixed by RGB-WG/rgb-tests#18
Assignees
Labels
bug Something isn't working
Milestone

Comments

@zoedberg
Copy link
Contributor

Trying to spend the allocations received with a transfer that spent opret and tapret at the same time, the transfer fails with this error:

called `Result::unwrap()` on an `Err` value: Composition(Stock("the invoice requirements can't be fulfilled using available assets or smart contract state."))

This can be seen using this branch and running the tapret_wlt_receiving_opret test.

@dr-orlovsky
Copy link
Member

How is this different from #271? Do you use correct branches where we have the fix for that merged, like #272?

@zoedberg
Copy link
Contributor Author

How is this different from #271?

In #271 the receiver was failing to validate the consignment with the following error:

thread 'tapret_wlt_receiving_opret' panicked at tests/utils/helpers.rs:779:85:
called `Result::unwrap()` on an `Err` value: (Status { failures: [AnchorMethodMismatch(BundleId(Array<32>(0c124eb23b38594cf7017a953e3dc9ba8ae7e4180ffe026438451863e26700b5)))], warnings: [], info: [] }, Consignment { version: V2, transfer: true, terminals: Confined({BundleId(Array<32>(0c124eb23b38594cf7017a953e3dc9ba8ae7e4180ffe026438451863e26700b5)): Bitcoin(SecretSeal(Array<32>(58efdc8741884179b76b0bec8d36671a413d45790fb38a82dfd1bb282ce1b05c)))}), genesis: Genesis { ffv: Ffv(0), schema_id: SchemaId(Array<32>(44362131347ef60bfc63618bbfd50d0442b585cac299d2c3164f507797e73bc9)), flags: ReservedBytes([0]), timestamp: 1726048621, issuer: Identity(RString<AsciiPrintable[1..4096]>("ssi:anonymous")), testnet: true, alt_layers1: AltLayer1Set(Confined({})), asset_tags: AssetTags(Confined({AssignmentType(4000): AssetTag(Array<32>(8312d591f5922a4240e9e86d3bcd9b92e01b6884a97f7f3036786346db743ff9))})), metadata: Metadata(Confined({})), globals: GlobalState(Confined({GlobalStateType(2000): GlobalValues(Confined([DataState(Confined([7, 78, 73, 65, 84, 67, 75, 82, 14, 78, 73, 65, 32, 97, 115, 115, 101, 116, 32, 110, 97, 109, 101, 0, 2]))])), GlobalStateType(2001): GlobalValues(Confined([DataState(Confined([9, 0, 78, 73, 65, 32, 116, 101, 114, 109, 115, 0]))])), GlobalStateType(2010): GlobalValues(Confined([DataState(Confined([88, 2, 0, 0, 0, 0, 0, 0]))]))})), assignments: Assignments(Confined({AssignmentType(4000): Fungible(Confined([Revealed { seal: Bitcoin(BlindSeal { method: TapretFirst, txid: Array<32>(ce368db4231b22da5c58fc61dc4eed28e98fe7210aaf664c3b18e4e93724fbd3), vout: Vout(0), blinding: 7086771682268330019 }), state: RevealedValue { value: Bits64(600), blinding: BlindingFactor(Array<32>(7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e)), tag: AssetTag(Array<32>(8312d591f5922a4240e9e86d3bcd9b92e01b6884a97f7f3036786346db743ff9)) }, lock: ReservedBytes([0, 0]) }]))})), valencies: Valencies(Confined({})), validator: ReservedBytes([0]) }, extensions: Confined({}), bundles: Confined({BundledWitness { pub_witness: Bitcoin(Tx(Tx { version: TxVer(2), inputs: Confined([TxIn { prev_output: Outpoint { txid: Array<32>(762b095737cbaa63b1eaca53a4911af14de746c369ceb9e4138000da12f99dd3), vout: Vout(0) }, sig_script: SigScript(ScriptBytes(Confined([]))), sequence: SeqNo(0), witness: Witness(Confined([])) }]), outputs: Confined([TxOut { value: Sats(2000), script_pubkey: ScriptPubkey(ScriptBytes(Confined([81, 32, 24, 186, 202, 35, 122, 35, 132, 40, 170, 96, 176, 218, 167, 169, 184, 149, 92, 55, 39, 60, 56, 79, 133, 214, 133, 93, 209, 239, 83, 226, 192, 148]))) }, TxOut { value: Sats(99997600), script_pubkey: ScriptPubkey(ScriptBytes(Confined([0, 20, 176, 238, 141, 161, 136, 160, 91, 171, 234, 7, 74, 159, 82, 78, 205, 117, 69, 210, 124, 224]))) }, TxOut { value: Sats(0), script_pubkey: ScriptPubkey(ScriptBytes(Confined([106, 32, 180, 253, 70, 74, 109, 225, 9, 19, 213, 217, 51, 86, 250, 154, 162, 150, 212, 179, 223, 132, 230, 229, 17, 212, 209, 36, 152, 102, 221, 32, 203, 99]))) }]), lock_time: LockTime(0) })), anchored_bundles: Opret(Anchor { mpc_proof: MerkleProof { pos: 2, cofactor: 0, path: Confined([MerkleHash(Array<32>(7e947d712ca8dc3182e1d599abe4f2cddb9ae6c409246f2fb494380dded1ab81)), MerkleHash(Array<32>(cad224b07d4e1495981fc4bc8285929d7fa277f859e57834e172b78226528a02)), MerkleHash(Array<32>(64df83fb41274b8a910fa1e4b441a407994ec04a9303bf2efdb4ffa396b887fa))]) }, dbc_proof: OpretProof(()), method: OpretFirst }, TransitionBundle { close_method: OpretFirst, input_map: InputMap(Confined({Vout(0): OpId(Array<32>(2704affdf4a5d80137cbe3d69a795aae34f6ad32c758cc456995dbdaed1b797a))})), known_transitions: Confined({OpId(Array<32>(2704affdf4a5d80137cbe3d69a795aae34f6ad32c758cc456995dbdaed1b797a)): Transition { ffv: Ffv(0), contract_id: ContractId(Array<32>(029ace24302f76ba58ba29a53c6828688f8011cc028e48a2f5b0d5a84bbd9021)), nonce: 18446744073709551615, transition_type: TransitionType(10000), metadata: Metadata(Confined({})), globals: GlobalState(Confined({})), inputs: Inputs(Confined({Input { prev_out: Opout { op: OpId(Array<32>(c9550e968962f46d83b1989463e9754c28754aa7224a16fc81783f753d0c4afe)), ty: AssignmentType(4000), no: 1 }, reserved: ReservedBytes([0, 0]) }})), assignments: Assignments(Confined({AssignmentType(4000): Fungible(Confined([Revealed { seal: Bitcoin(BlindSeal { method: OpretFirst, txid: WitnessTx, vout: Vout(0), blinding: 6739292066164915363 }), state: RevealedValue { value: Bits64(100), blinding: BlindingFactor(Array<32>(487cbcaa58b04d6044f2174c361a3fd719a9afcb4acdd5c66be1ef2995c4832a)), tag: AssetTag(Array<32>(8312d591f5922a4240e9e86d3bcd9b92e01b6884a97f7f3036786346db743ff9)) }, lock: ReservedBytes([0, 0]) }, Revealed { seal: Bitcoin(BlindSeal { method: OpretFirst, txid: WitnessTx, vout: Vout(1), blinding: 1212309130784330909 }), state: RevealedValue { value: Bits64(300), blinding: BlindingFactor(Array<32>(92edcb69e05681b53800c358bbae3a695948105d1193099ca606e9d3a5d886ce)), tag: AssetTag(Array<32>(8312d591f5922a4240e9e86d3bcd9b92e01b6884a97f7f3036786346db743ff9)) }, lock: ReservedBytes([0, 0]) }]))})), valencies: Valencies(Confined({})), validator: ReservedBytes([0]), witness: ReservedBytes([0, 0]) }}) }) }, BundledWitness { pub_witness: Bitcoin(Tx(Tx { version: TxVer(2), inputs: Confined([TxIn { prev_output: Outpoint { txid: Array<32>(ce368db4231b22da5c58fc61dc4eed28e98fe7210aaf664c3b18e4e93724fbd3), vout: Vout(0) }, sig_script: SigScript(ScriptBytes(Confined([]))), sequence: SeqNo(0), witness: Witness(Confined([])) }]), outputs: Confined([TxOut { value: Sats(99999600), script_pubkey: ScriptPubkey(ScriptBytes(Confined([81, 32, 18, 117, 88, 227, 34, 205, 33, 79, 85, 81, 139, 63, 196, 26, 13, 28, 24, 199, 116, 119, 203, 8, 86, 173, 245, 234, 106, 244, 205, 95, 84, 49]))) }]), lock_time: LockTime(0) })), anchored_bundles: Tapret(Anchor { mpc_proof: MerkleProof { pos: 2, cofactor: 0, path: Confined([MerkleHash(Array<32>(bda2d3379b28997f7b6333a01dfd066a7f590d5237e8cb28decc4c24712f2e48)), MerkleHash(Array<32>(6a31bc2964faea44e138cbfa1c49d7162d2b4ac722fa23898acfae63cf14b0df)), MerkleHash(Array<32>(f2d9c91ff0ff6992555f7bac806e173b514a0a381990c76edea5ceab6d7cbec6))]) }, dbc_proof: TapretProof { path_proof: TapretPathProof { partner_node: None, nonce: 0 }, internal_pk: InternalPk(XOnlyPk(XOnlyPublicKey(624ca832714cb3205e16b495eb0fe7ddf3d8a706a006f285925dc38f85ce8e4d68ab31a07ecf0063eb8a74fde8a4ce85bb73ad8d1b8dde7a4c838675532aedc5))) }, method: TapretFirst }, TransitionBundle { close_method: TapretFirst, input_map: InputMap(Confined({Vout(0): OpId(Array<32>(c9550e968962f46d83b1989463e9754c28754aa7224a16fc81783f753d0c4afe))})), known_transitions: Confined({OpId(Array<32>(c9550e968962f46d83b1989463e9754c28754aa7224a16fc81783f753d0c4afe)): Transition { ffv: Ffv(0), contract_id: ContractId(Array<32>(029ace24302f76ba58ba29a53c6828688f8011cc028e48a2f5b0d5a84bbd9021)), nonce: 18446744073709551615, transition_type: TransitionType(10000), metadata: Metadata(Confined({})), globals: GlobalState(Confined({})), inputs: Inputs(Confined({Input { prev_out: Opout { op: OpId(Array<32>(029ace24302f76ba58ba29a53c6828688f8011cc028e48a2f5b0d5a84bbd9021)), ty: AssignmentType(4000), no: 0 }, reserved: ReservedBytes([0, 0]) }})), assignments: Assignments(Confined({AssignmentType(4000): Fungible(Confined([Revealed { seal: Bitcoin(BlindSeal { method: TapretFirst, txid: WitnessTx, vout: Vout(0), blinding: 17753112243036074428 }), state: RevealedValue { value: Bits64(200), blinding: BlindingFactor(Array<32>(a313f66a4577af69018ba3d98cb6043cc63b9b3cd1663f572c68040e1317b5c7)), tag: AssetTag(Array<32>(8312d591f5922a4240e9e86d3bcd9b92e01b6884a97f7f3036786346db743ff9)) }, lock: ReservedBytes([0, 0]) }, Revealed { seal: Bitcoin(BlindSeal { method: OpretFirst, txid: Txid(Array<32>(762b095737cbaa63b1eaca53a4911af14de746c369ceb9e4138000da12f99dd3)), vout: Vout(0), blinding: 9127550318203553620 }), state: RevealedValue { value: Bits64(400), blinding: BlindingFactor(Array<32>(db6a88143906cf157cf2daa4f1c87a4072f1c0285c60df6311e8d8fd3b9d09f8)), tag: AssetTag(Array<32>(8312d591f5922a4240e9e86d3bcd9b92e01b6884a97f7f3036786346db743ff9)) }, lock: ReservedBytes([0, 0]) }]))})), valencies: Valencies(Confined({})), validator: ReservedBytes([0]), witness: ReservedBytes([0, 0]) }}) }) }, BundledWitness { pub_witness: Bitcoin(Tx(Tx { version: TxVer(2), inputs: Confined([TxIn { prev_output: Outpoint { txid: Array<32>(b0530142857f9b5e95dbf1f37df7e8eff9c9d3a3e8280e45460919015d8de05e), vout: Vout(0) }, sig_script: SigScript(ScriptBytes(Confined([]))), sequence: SeqNo(0), witness: Witness(Confined([])) }, TxIn { prev_output: Outpoint { txid: Array<32>(c711ad85eace329444adefe40b0a70d65572551b28f4895b3407db1d88c8aa89), vout: Vout(0) }, sig_script: SigScript(ScriptBytes(Confined([]))), sequence: SeqNo(0), witness: Witness(Confined([])) }]), outputs: Confined([TxOut { value: Sats(100001200), script_pubkey: ScriptPubkey(ScriptBytes(Confined([81, 32, 200, 60, 17, 94, 82, 248, 254, 9, 49, 175, 105, 178, 23, 4, 214, 244, 246, 179, 202, 80, 9, 215, 180, 188, 65, 206, 173, 165, 206, 111, 32, 116]))) }, TxOut { value: Sats(0), script_pubkey: ScriptPubkey(ScriptBytes(Confined([106, 32, 86, 19, 29, 113, 24, 54, 52, 93, 159, 254, 82, 9, 50, 92, 234, 97, 54, 242, 36, 146, 38, 146, 50, 249, 49, 138, 223, 150, 52, 34, 236, 16]))) }]), lock_time: LockTime(0) })), anchored_bundles: Tapret(Anchor { mpc_proof: MerkleProof { pos: 2, cofactor: 0, path: Confined([MerkleHash(Array<32>(1ea59bbc92b7af86441146890634f131225aa19388e2a5540956b85e00181ba3)), MerkleHash(Array<32>(299794a6859725c95852d75f9b7aa697820a603decdf5a21a5c9e716b026e494)), MerkleHash(Array<32>(8eddd19665bde101981eddce92e7a799d7a85952d91c0c7ad68cc953ff1125e3))]) }, dbc_proof: TapretProof { path_proof: TapretPathProof { partner_node: None, nonce: 0 }, internal_pk: InternalPk(XOnlyPk(XOnlyPublicKey(c619b168f08508833901ddf29b7b080257872faf1840a42f5a9391b16fe5d9592a793b65ecc80b096fcd9790a6ba30133285f2b5a71dcde31fa0be53b5520acc))) }, method: TapretFirst }, TransitionBundle { close_method: OpretFirst, input_map: InputMap(Confined({Vout(0): OpId(Array<32>(b983005560509060bdee2eb9fe72721ed50691034414a8545e27d05b33dbeedb))})), known_transitions: Confined({OpId(Array<32>(b983005560509060bdee2eb9fe72721ed50691034414a8545e27d05b33dbeedb)): Transition { ffv: Ffv(0), contract_id: ContractId(Array<32>(029ace24302f76ba58ba29a53c6828688f8011cc028e48a2f5b0d5a84bbd9021)), nonce: 18446744073709551615, transition_type: TransitionType(10000), metadata: Metadata(Confined({})), globals: GlobalState(Confined({})), inputs: Inputs(Confined({Input { prev_out: Opout { op: OpId(Array<32>(2704affdf4a5d80137cbe3d69a795aae34f6ad32c758cc456995dbdaed1b797a)), ty: AssignmentType(4000), no: 0 }, reserved: ReservedBytes([0, 0]) }})), assignments: Assignments(Confined({AssignmentType(4000): Fungible(Confined([ConfidentialSeal { seal: Bitcoin(SecretSeal(Array<32>(58efdc8741884179b76b0bec8d36671a413d45790fb38a82dfd1bb282ce1b05c))), state: RevealedValue { value: Bits64(100), blinding: BlindingFactor(Array<32>(487cbcaa58b04d6044f2174c361a3fd719a9afcb4acdd5c66be1ef2995c4832a)), tag: AssetTag(Array<32>(8312d591f5922a4240e9e86d3bcd9b92e01b6884a97f7f3036786346db743ff9)) }, lock: ReservedBytes([0, 0]) }]))})), valencies: Valencies(Confined({})), validator: ReservedBytes([0]), witness: ReservedBytes([0, 0]) }}) }) }}), schema: Schema { ffv: Ffv(0), flags: ReservedBytes([0]), name: TypeName("NonInflatableAsset"), timestamp: 1713343888, developer: Identity(RString<AsciiPrintable[1..4096]>("ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w")), meta_types: Confined({}), global_types: Confined({GlobalStateType(2000): GlobalStateSchema { reserved: ReservedBytes([0]), sem_id: SemId(Array<32>(d7fcbee31ef0a85d5f973bda1b0b8c9e7efbcbc5572577382cacd3bdb4218a01)), max_items: u24(1) }, GlobalStateType(2001): GlobalStateSchema { reserved: ReservedBytes([0]), sem_id: SemId(Array<32>(5b8bc7543832054a1d22be94226be7538b133a26881cba4613027878e05c6cf7)), max_items: u24(1) }, GlobalStateType(2010): GlobalStateSchema { reserved: ReservedBytes([0]), sem_id: SemId(Array<32>(888c5865633af13b95b7cd1a8d8af2dac1dc140b977251d9d4daf3c7511c8e84)), max_items: u24(1) }}), owned_types: Confined({AssignmentType(4000): Fungible(Unsigned64Bit)}), valency_types: Confined({}), genesis: GenesisSchema { metadata: Confined({}), globals: Confined({GlobalStateType(2000): Once, GlobalStateType(2001): Once, GlobalStateType(2010): Once}), assignments: Confined({AssignmentType(4000): OnceOrMore}), valencies: Confined({}), validator: Some(LibSite { lib: LibId(Array<32>(abf099d28bed50df5e065715327f3a9b329f777cb0b9fefff634c193a03cb626)), pos: 9 }) }, extensions: Confined({}), transitions: Confined({TransitionType(10000): TransitionSchema { metadata: Confined({}), globals: Confined({}), inputs: Confined({AssignmentType(4000): OnceOrMore}), assignments: Confined({AssignmentType(4000): OnceOrMore}), valencies: Confined({}), validator: Some(LibSite { lib: LibId(Array<32>(abf099d28bed50df5e065715327f3a9b329f777cb0b9fefff634c193a03cb626)), pos: 0 }) }}), reserved: ReservedBytes([0, 0, 0, 0, 0, 0, 0, 0]) }, ifaces: Confined({Iface { version: V1, name: TypeName("RGB20Fixed"), inherits: Confined([IfaceId(Array<32>(564f5ce3f37216fd09ead8290c5d39084df5da809685f10d36e89a1986c4bb5f)), IfaceId(Array<32>(d7737a3d1c134faf3e1466250705f6726a9eb20275d63d27424335592089163e)), IfaceId(Array<32>(9da16b01f80629fbbf03e7372fe6c2ff8b352d625057822ffbadaee01dda6fc6)), IfaceId(Array<32>(c372e4f4cb7780ab7f9f9c93629546834203a4ad29f6c1d0fa16fa9b642bddad))]), timestamp: 1711405444, metadata: Confined({}), global_state: Confined({FieldName("issuedSupply"): GlobalIface { sem_id: Some(SemId(Array<32>(888c5865633af13b95b7cd1a8d8af2dac1dc140b977251d9d4daf3c7511c8e84))), required: true, multiple: false }, FieldName("spec"): GlobalIface { sem_id: Some(SemId(Array<32>(d7fcbee31ef0a85d5f973bda1b0b8c9e7efbcbc5572577382cacd3bdb4218a01))), required: true, multiple: false }, FieldName("terms"): GlobalIface { sem_id: Some(SemId(Array<32>(5b8bc7543832054a1d22be94226be7538b133a26881cba4613027878e05c6cf7))), required: true, multiple: false }}), assignments: Confined({FieldName("assetOwner"): AssignIface { owned_state: Amount, public: false, required: true, multiple: true }}), valencies: Confined({}), genesis: GenesisIface { modifier: Abstract, metadata: Confined({}), globals: Confined({FieldName("issuedSupply"): Once, FieldName("spec"): Once, FieldName("terms"): Once}), assignments: Confined({FieldName("assetOwner"): OnceOrMore}), valencies: Confined({}), errors: Confined({VariantName("issuedMismatch")}) }, transitions: Confined({FieldName("transfer"): TransitionIface { modifier: Abstract, optional: false, metadata: Confined({}), globals: Confined({}), inputs: Confined({FieldName("assetOwner"): OnceOrMore}), assignments: Confined({FieldName("assetOwner"): OnceOrMore}), valencies: Confined({}), errors: Confined({VariantName("nonEqualAmounts")}), default_assignment: Some(FieldName("assetOwner")) }}), extensions: Confined({}), default_operation: Some(FieldName("transfer")), errors: Confined({VariantName("issuedMismatch"): Confined("supply specified as a global parameter doesn't match the issued supply allocated to the asset owners"), VariantName("nonEqualAmounts"): Confined("the sum of spent assets doesn't equal to the sum of assets in outputs")}), developer: Identity(RString<AsciiPrintable[1..4096]>("ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w")) }: IfaceImpl { version: V1, schema_id: SchemaId(Array<32>(44362131347ef60bfc63618bbfd50d0442b585cac299d2c3164f507797e73bc9)), iface_id: IfaceId(Array<32>(fe25273bd68ed7186a51deb5266e52e7ec0cde781bcb919513295065300c6039)), timestamp: 1713343888, metadata: Confined({}), global_state: Confined({NamedField { id: GlobalStateType(2000), name: FieldName("spec"), reserved: ReservedBytes([0, 0, 0, 0]) }, NamedField { id: GlobalStateType(2001), name: FieldName("terms"), reserved: ReservedBytes([0, 0, 0, 0]) }, NamedField { id: GlobalStateType(2010), name: FieldName("issuedSupply"), reserved: ReservedBytes([0, 0, 0, 0]) }}), assignments: Confined({NamedField { id: AssignmentType(4000), name: FieldName("assetOwner"), reserved: ReservedBytes([0, 0, 0, 0]) }}), valencies: Confined({}), transitions: Confined({NamedField { id: TransitionType(10000), name: FieldName("transfer"), reserved: ReservedBytes([0, 0, 0, 0]) }}), extensions: Confined({}), errors: Confined({NamedVariant { id: 0, name: VariantName("nonEqualAmounts"), reserved: ReservedBytes([0, 0, 0, 0]) }, NamedVariant { id: 1, name: VariantName("issuedMismatch"), reserved: ReservedBytes([0, 0, 0, 0]) }}), developer: Identity(RString<AsciiPrintable[1..4096]>("ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w")) }}), supplements: Confined({}), types: TypeSystem(Confined({SemId(Array<32>(0af65fd62581de85cbd14e23e2db9a92bbef8b7974ffe1b50c4c74db8f86e751)): List(SemId(Array<32>(5f5e26e5c5053c1b4544515bc6a0653da02a0791fb31116d71a4fad916e15355)), Sizing { min: 0, max: 7 }), SemId(Array<32>(18cb946f1293cf180e9d78dcc65bc59b472ffffeadfbf58db198cc8328f64b01)): Tuple(UnnamedFields(Confined([SemId(Array<32>(560d96f7a47924b2c3df040e6463398fd65fd591652c294342bfa5f939155154))]))), SemId(Array<32>(1cabbfc3d826c0bfd1e9770a889efacc8b6716ad014a3eec10b6591530229042)): Primitive(Primitive(64)), SemId(Array<32>(1cb0758e14c2008c0f008ce6d2d41e9e1937e1cd0f9914c59a7e29e1ce7ba0bb)): Tuple(UnnamedFields(Confined([SemId(Array<32>(ccc272928f793803d91f5dad8d51cc986b4332380f9224f7c7c1514d768ebb90))]))), SemId(Array<32>(2a5baaac5089ff098d150b482cfed8bcd01a91c0d7b45d32216ed576ab71ebdd)): Array(SemId(Array<32>(1cabbfc3d826c0bfd1e9770a889efacc8b6716ad014a3eec10b6591530229042)), 32), SemId(Array<32>(2fd8f27a172712903e6a3e96f0f85c0480b4211a17acd13059fc51d4a4bbde2c)): Union(UnionVariants(Confined({Variant { name: VariantName("none"), tag: 0 }: SemId(Array<32>(d83fbee02f0de5b46cf80fe11ef7fdf061c78d975d31ade9eea2bc4099339e6c)), Variant { name: VariantName("some"), tag: 1 }: SemId(Array<32>(b070d38ff6d20c5ae5d80715ca31541d5a52bbdecbd3529d38e6ddb672200997))}))), SemId(Array<32>(3cd1a29dccad9b917b26305f89a8a4fb2118302a4e73c5ac0a780de6ab005e73)): Enum(EnumVariants(Confined({Variant { name: VariantName("excl"), tag: 33 }, Variant { name: VariantName("hash"), tag: 35 }, Variant { name: VariantName("dollar"), tag: 36 }, Variant { name: VariantName("amp"), tag: 38 }, Variant { name: VariantName("plus"), tag: 43 }, Variant { name: VariantName("dash"), tag: 45 }, Variant { name: VariantName("dot"), tag: 46 }, Variant { name: VariantName("zero"), tag: 48 }, Variant { name: VariantName("one"), tag: 49 }, Variant { name: VariantName("two"), tag: 50 }, Variant { name: VariantName("three"), tag: 51 }, Variant { name: VariantName("four"), tag: 52 }, Variant { name: VariantName("five"), tag: 53 }, Variant { name: VariantName("six"), tag: 54 }, Variant { name: VariantName("seven"), tag: 55 }, Variant { name: VariantName("eight"), tag: 56 }, Variant { name: VariantName("nine"), tag: 57 }, Variant { name: VariantName("caret"), tag: 94 }, Variant { name: VariantName("lodash"), tag: 95 }, Variant { name: VariantName("a"), tag: 97 }, Variant { name: VariantName("b"), tag: 98 }, Variant { name: VariantName("c"), tag: 99 }, Variant { name: VariantName("d"), tag: 100 }, Variant { name: VariantName("e"), tag: 101 }, Variant { name: VariantName("f"), tag: 102 }, Variant { name: VariantName("g"), tag: 103 }, Variant { name: VariantName("h"), tag: 104 }, Variant { name: VariantName("i"), tag: 105 }, Variant { name: VariantName("j"), tag: 106 }, Variant { name: VariantName("k"), tag: 107 }, Variant { name: VariantName("l"), tag: 108 }, Variant { name: VariantName("m"), tag: 109 }, Variant { name: VariantName("n"), tag: 110 }, Variant { name: VariantName("o"), tag: 111 }, Variant { name: VariantName("p"), tag: 112 }, Variant { name: VariantName("q"), tag: 113 }, Variant { name: VariantName("r"), tag: 114 }, Variant { name: VariantName("s"), tag: 115 }, Variant { name: VariantName("t"), tag: 116 }, Variant { name: VariantName("u"), tag: 117 }, Variant { name: VariantName("v"), tag: 118 }, Variant { name: VariantName("w"), tag: 119 }, Variant { name: VariantName("x"), tag: 120 }, Variant { name: VariantName("y"), tag: 121 }, Variant { name: VariantName("z"), tag: 122 }}))), SemId(Array<32>(3f2b72b7c4af1a630cb6d3ff088baf351093ee465b9e7d472a610082e449d7e4)): Tuple(UnnamedFields(Confined([SemId(Array<32>(63aa2314e8b147c8b284dfb39a9e10d19caad5faea848e3cb9849d9167d6344a))]))), SemId(Array<32>(43aa7fc5f6f5644fe5a2ae5e1aa99042cdeb879442e34c723ff5827fb133de8a)): Struct(NamedFields(Confined([Field { name: FieldName("type"), ty: SemId(Array<32>(b10ddefe8020add8a0ca08292150abb13c514d76de5168c1c97105a27e676660)) }, Field { name: FieldName("digest"), ty: SemId(Array<32>(2a5baaac5089ff098d150b482cfed8bcd01a91c0d7b45d32216ed576ab71ebdd)) }]))), SemId(Array<32>(45b780258601c526b23b5b4861460a9050e13f35fbbe8305a8001157e4013888)): Union(UnionVariants(Confined({Variant { name: VariantName("none"), tag: 0 }: SemId(Array<32>(d83fbee02f0de5b46cf80fe11ef7fdf061c78d975d31ade9eea2bc4099339e6c)), Variant { name: VariantName("some"), tag: 1 }: SemId(Array<32>(caff8faeb38a00a04e3621538f8e61d75a85a465cb0a0e48c3593e7eaa6c5fc7))}))), SemId(Array<32>(48be23172ae884459ae78334a0063f09fa0e317bea8b233ce782a38875e796b8)): Enum(EnumVariants(Confined({Variant { name: VariantName("space"), tag: 32 }, Variant { name: VariantName("excl"), tag: 33 }, Variant { name: VariantName("quotes"), tag: 34 }, Variant { name: VariantName("hash"), tag: 35 }, Variant { name: VariantName("dollar"), tag: 36 }, Variant { name: VariantName("percent"), tag: 37 }, Variant { name: VariantName("ampersand"), tag: 38 }, Variant { name: VariantName("apostrophe"), tag: 39 }, Variant { name: VariantName("bracketL"), tag: 40 }, Variant { name: VariantName("bracketR"), tag: 41 }, Variant { name: VariantName("asterisk"), tag: 42 }, Variant { name: VariantName("plus"), tag: 43 }, Variant { name: VariantName("comma"), tag: 44 }, Variant { name: VariantName("minus"), tag: 45 }, Variant { name: VariantName("dot"), tag: 46 }, Variant { name: VariantName("slash"), tag: 47 }, Variant { name: VariantName("zero"), tag: 48 }, Variant { name: VariantName("one"), tag: 49 }, Variant { name: VariantName("two"), tag: 50 }, Variant { name: VariantName("three"), tag: 51 }, Variant { name: VariantName("four"), tag: 52 }, Variant { name: VariantName("five"), tag: 53 }, Variant { name: VariantName("six"), tag: 54 }, Variant { name: VariantName("seven"), tag: 55 }, Variant { name: VariantName("eight"), tag: 56 }, Variant { name: VariantName("nine"), tag: 57 }, Variant { name: VariantName("colon"), tag: 58 }, Variant { name: VariantName("semiColon"), tag: 59 }, Variant { name: VariantName("less"), tag: 60 }, Variant { name: VariantName("equal"), tag: 61 }, Variant { name: VariantName("greater"), tag: 62 }, Variant { name: VariantName("question"), tag: 63 }, Variant { name: VariantName("at"), tag: 64 }, Variant { name: VariantName("_A"), tag: 65 }, Variant { name: VariantName("_B"), tag: 66 }, Variant { name: VariantName("_C"), tag: 67 }, Variant { name: VariantName("_D"), tag: 68 }, Variant { name: VariantName("_E"), tag: 69 }, Variant { name: VariantName("_F"), tag: 70 }, Variant { name: VariantName("_G"), tag: 71 }, Variant { name: VariantName("_H"), tag: 72 }, Variant { name: VariantName("_I"), tag: 73 }, Variant { name: VariantName("_J"), tag: 74 }, Variant { name: VariantName("_K"), tag: 75 }, Variant { name: VariantName("_L"), tag: 76 }, Variant { name: VariantName("_M"), tag: 77 }, Variant { name: VariantName("_N"), tag: 78 }, Variant { name: VariantName("_O"), tag: 79 }, Variant { name: VariantName("_P"), tag: 80 }, Variant { name: VariantName("_Q"), tag: 81 }, Variant { name: VariantName("_R"), tag: 82 }, Variant { name: VariantName("_S"), tag: 83 }, Variant { name: VariantName("_T"), tag: 84 }, Variant { name: VariantName("_U"), tag: 85 }, Variant { name: VariantName("_V"), tag: 86 }, Variant { name: VariantName("_W"), tag: 87 }, Variant { name: VariantName("_X"), tag: 88 }, Variant { name: VariantName("_Y"), tag: 89 }, Variant { name: VariantName("_Z"), tag: 90 }, Variant { name: VariantName("sqBracketL"), tag: 91 }, Variant { name: VariantName("backSlash"), tag: 92 }, Variant { name: VariantName("sqBracketR"), tag: 93 }, Variant { name: VariantName("caret"), tag: 94 }, Variant { name: VariantName("lodash"), tag: 95 }, Variant { name: VariantName("backtick"), tag: 96 }, Variant { name: VariantName("a"), tag: 97 }, Variant { name: VariantName("b"), tag: 98 }, Variant { name: VariantName("c"), tag: 99 }, Variant { name: VariantName("d"), tag: 100 }, Variant { name: VariantName("e"), tag: 101 }, Variant { name: VariantName("f"), tag: 102 }, Variant { name: VariantName("g"), tag: 103 }, Variant { name: VariantName("h"), tag: 104 }, Variant { name: VariantName("i"), tag: 105 }, Variant { name: VariantName("j"), tag: 106 }, Variant { name: VariantName("k"), tag: 107 }, Variant { name: VariantName("l"), tag: 108 }, Variant { name: VariantName("m"), tag: 109 }, Variant { name: VariantName("n"), tag: 110 }, Variant { name: VariantName("o"), tag: 111 }, Variant { name: VariantName("p"), tag: 112 }, Variant { name: VariantName("q"), tag: 113 }, Variant { name: VariantName("r"), tag: 114 }, Variant { name: VariantName("s"), tag: 115 }, Variant { name: VariantName("t"), tag: 116 }, Variant { name: VariantName("u"), tag: 117 }, Variant { name: VariantName("v"), tag: 118 }, Variant { name: VariantName("w"), tag: 119 }, Variant { name: VariantName("x"), tag: 120 }, Variant { name: VariantName("y"), tag: 121 }, Variant { name: VariantName("z"), tag: 122 }, Variant { name: VariantName("cBracketL"), tag: 123 }, Variant { name: VariantName("pipe"), tag: 124 }, Variant { name: VariantName("cBracketR"), tag: 125 }, Variant { name: VariantName("tilde"), tag: 126 }}))), SemId(Array<32>(560d96f7a47924b2c3df040e6463398fd65fd591652c294342bfa5f939155154)): List(SemId(Array<32>(fba958721a3d335406b368c36f5a82790960cce239febcafe189ba9839d5da78)), Sizing { min: 0, max: 65535 }), SemId(Array<32>(5b772c8eb15fd74700c79241f60f8fda37e736b3fd462ab017ce4d454efa81aa)): Tuple(UnnamedFields(Confined([SemId(Array<32>(5e5ec8924f73cd72c4225c96ab47796658ef1b729ca306e260bca42b25891d0f))]))), SemId(Array<32>(5b8bc7543832054a1d22be94226be7538b133a26881cba4613027878e05c6cf7)): Struct(NamedFields(Confined([Field { name: FieldName("text"), ty: SemId(Array<32>(18cb946f1293cf180e9d78dcc65bc59b472ffffeadfbf58db198cc8328f64b01)) }, Field { name: FieldName("media"), ty: SemId(Array<32>(e087a83496338799afc48a9211683a427d2bd33e2ea7ebb8a8b880ea4ab4eb81)) }]))), SemId(Array<32>(5ca149585de534ee91b3e3a030b7efd4cdb79abea9152f101f3759b4c7210e1f)): Primitive(Primitive(8)), SemId(Array<32>(5d03c4178da98e7e3f3af343e3997d74201d11f42732cfbea2b04b8e3ff15f22)): Enum(EnumVariants(Confined({Variant { name: VariantName("indivisible"), tag: 0 }, Variant { name: VariantName("deci"), tag: 1 }, Variant { name: VariantName("centi"), tag: 2 }, Variant { name: VariantName("milli"), tag: 3 }, Variant { name: VariantName("deciMilli"), tag: 4 }, Variant { name: VariantName("centiMilli"), tag: 5 }, Variant { name: VariantName("micro"), tag: 6 }, Variant { name: VariantName("deciMicro"), tag: 7 }, Variant { name: VariantName("centiMicro"), tag: 8 }, Variant { name: VariantName("nano"), tag: 9 }, Variant { name: VariantName("deciNano"), tag: 10 }, Variant { name: VariantName("centiNano"), tag: 11 }, Variant { name: VariantName("pico"), tag: 12 }, Variant { name: VariantName("deciPico"), tag: 13 }, Variant { name: VariantName("centiPico"), tag: 14 }, Variant { name: VariantName("femto"), tag: 15 }, Variant { name: VariantName("deciFemto"), tag: 16 }, Variant { name: VariantName("centiFemto"), tag: 17 }, Variant { name: VariantName("atto"), tag: 18 }}))), SemId(Array<32>(5e5ec8924f73cd72c4225c96ab47796658ef1b729ca306e260bca42b25891d0f)): Tuple(UnnamedFields(Confined([SemId(Array<32>(822380f475f0edb4b5dc517991de7390ada2dbb3752c4c066851aa01630296c2)), SemId(Array<32>(0af65fd62581de85cbd14e23e2db9a92bbef8b7974ffe1b50c4c74db8f86e751))]))), SemId(Array<32>(5f5e26e5c5053c1b4544515bc6a0653da02a0791fb31116d71a4fad916e15355)): Enum(EnumVariants(Confined({Variant { name: VariantName("zero"), tag: 48 }, Variant { name: VariantName("one"), tag: 49 }, Variant { name: VariantName("two"), tag: 50 }, Variant { name: VariantName("three"), tag: 51 }, Variant { name: VariantName("four"), tag: 52 }, Variant { name: VariantName("five"), tag: 53 }, Variant { name: VariantName("six"), tag: 54 }, Variant { name: VariantName("seven"), tag: 55 }, Variant { name: VariantName("eight"), tag: 56 }, Variant { name: VariantName("nine"), tag: 57 }, Variant { name: VariantName("_A"), tag: 65 }, Variant { name: VariantName("_B"), tag: 66 }, Variant { name: VariantName("_C"), tag: 67 }, Variant { name: VariantName("_D"), tag: 68 }, Variant { name: VariantName("_E"), tag: 69 }, Variant { name: VariantName("_F"), tag: 70 }, Variant { name: VariantName("_G"), tag: 71 }, Variant { name: VariantName("_H"), tag: 72 }, Variant { name: VariantName("_I"), tag: 73 }, Variant { name: VariantName("_J"), tag: 74 }, Variant { name: VariantName("_K"), tag: 75 }, Variant { name: VariantName("_L"), tag: 76 }, Variant { name: VariantName("_M"), tag: 77 }, Variant { name: VariantName("_N"), tag: 78 }, Variant { name: VariantName("_O"), tag: 79 }, Variant { name: VariantName("_P"), tag: 80 }, Variant { name: VariantName("_Q"), tag: 81 }, Variant { name: VariantName("_R"), tag: 82 }, Variant { name: VariantName("_S"), tag: 83 }, Variant { name: VariantName("_T"), tag: 84 }, Variant { name: VariantName("_U"), tag: 85 }, Variant { name: VariantName("_V"), tag: 86 }, Variant { name: VariantName("_W"), tag: 87 }, Variant { name: VariantName("_X"), tag: 88 }, Variant { name: VariantName("_Y"), tag: 89 }, Variant { name: VariantName("_Z"), tag: 90 }, Variant { name: VariantName("a"), tag: 97 }, Variant { name: VariantName("b"), tag: 98 }, Variant { name: VariantName("c"), tag: 99 }, Variant { name: VariantName("d"), tag: 100 }, Variant { name: VariantName("e"), tag: 101 }, Variant { name: VariantName("f"), tag: 102 }, Variant { name: VariantName("g"), tag: 103 }, Variant { name: VariantName("h"), tag: 104 }, Variant { name: VariantName("i"), tag: 105 }, Variant { name: VariantName("j"), tag: 106 }, Variant { name: VariantName("k"), tag: 107 }, Variant { name: VariantName("l"), tag: 108 }, Variant { name: VariantName("m"), tag: 109 }, Variant { name: VariantName("n"), tag: 110 }, Variant { name: VariantName("o"), tag: 111 }, Variant { name: VariantName("p"), tag: 112 }, Variant { name: VariantName("q"), tag: 113 }, Variant { name: VariantName("r"), tag: 114 }, Variant { name: VariantName("s"), tag: 115 }, Variant { name: VariantName("t"), tag: 116 }, Variant { name: VariantName("u"), tag: 117 }, Variant { name: VariantName("v"), tag: 118 }, Variant { name: VariantName("w"), tag: 119 }, Variant { name: VariantName("x"), tag: 120 }, Variant { name: VariantName("y"), tag: 121 }, Variant { name: VariantName("z"), tag: 122 }}))), SemId(Array<32>(63aa2314e8b147c8b284dfb39a9e10d19caad5faea848e3cb9849d9167d6344a)): List(SemId(Array<32>(fba958721a3d335406b368c36f5a82790960cce239febcafe189ba9839d5da78)), Sizing { min: 1, max: 255 }), SemId(Array<32>(805ec5bc5312c84190445da16aa1c08a09e300e8323acfae6a23420a29ad003d)): Tuple(UnnamedFields(Confined([SemId(Array<32>(c43a7d9eb9b3027973c98f5dd6e1ac04f5cbd34240c0bebc0a0fb808140094d4))]))), SemId(Array<32>(822380f475f0edb4b5dc517991de7390ada2dbb3752c4c066851aa01630296c2)): Enum(EnumVariants(Confined({Variant { name: VariantName("_A"), tag: 65 }, Variant { name: VariantName("_B"), tag: 66 }, Variant { name: VariantName("_C"), tag: 67 }, Variant { name: VariantName("_D"), tag: 68 }, Variant { name: VariantName("_E"), tag: 69 }, Variant { name: VariantName("_F"), tag: 70 }, Variant { name: VariantName("_G"), tag: 71 }, Variant { name: VariantName("_H"), tag: 72 }, Variant { name: VariantName("_I"), tag: 73 }, Variant { name: VariantName("_J"), tag: 74 }, Variant { name: VariantName("_K"), tag: 75 }, Variant { name: VariantName("_L"), tag: 76 }, Variant { name: VariantName("_M"), tag: 77 }, Variant { name: VariantName("_N"), tag: 78 }, Variant { name: VariantName("_O"), tag: 79 }, Variant { name: VariantName("_P"), tag: 80 }, Variant { name: VariantName("_Q"), tag: 81 }, Variant { name: VariantName("_R"), tag: 82 }, Variant { name: VariantName("_S"), tag: 83 }, Variant { name: VariantName("_T"), tag: 84 }, Variant { name: VariantName("_U"), tag: 85 }, Variant { name: VariantName("_V"), tag: 86 }, Variant { name: VariantName("_W"), tag: 87 }, Variant { name: VariantName("_X"), tag: 88 }, Variant { name: VariantName("_Y"), tag: 89 }, Variant { name: VariantName("_Z"), tag: 90 }, Variant { name: VariantName("a"), tag: 97 }, Variant { name: VariantName("b"), tag: 98 }, Variant { name: VariantName("c"), tag: 99 }, Variant { name: VariantName("d"), tag: 100 }, Variant { name: VariantName("e"), tag: 101 }, Variant { name: VariantName("f"), tag: 102 }, Variant { name: VariantName("g"), tag: 103 }, Variant { name: VariantName("h"), tag: 104 }, Variant { name: VariantName("i"), tag: 105 }, Variant { name: VariantName("j"), tag: 106 }, Variant { name: VariantName("k"), tag: 107 }, Variant { name: VariantName("l"), tag: 108 }, Variant { name: VariantName("m"), tag: 109 }, Variant { name: VariantName("n"), tag: 110 }, Variant { name: VariantName("o"), tag: 111 }, Variant { name: VariantName("p"), tag: 112 }, Variant { name: VariantName("q"), tag: 113 }, Variant { name: VariantName("r"), tag: 114 }, Variant { name: VariantName("s"), tag: 115 }, Variant { name: VariantName("t"), tag: 116 }, Variant { name: VariantName("u"), tag: 117 }, Variant { name: VariantName("v"), tag: 118 }, Variant { name: VariantName("w"), tag: 119 }, Variant { name: VariantName("x"), tag: 120 }, Variant { name: VariantName("y"), tag: 121 }, Variant { name: VariantName("z"), tag: 122 }}))), SemId(Array<32>(888c5865633af13b95b7cd1a8d8af2dac1dc140b977251d9d4daf3c7511c8e84)): Tuple(UnnamedFields(Confined([SemId(Array<32>(5ca149585de534ee91b3e3a030b7efd4cdb79abea9152f101f3759b4c7210e1f))]))), SemId(Array<32>(b070d38ff6d20c5ae5d80715ca31541d5a52bbdecbd3529d38e6ddb672200997)): Tuple(UnnamedFields(Confined([SemId(Array<32>(1cb0758e14c2008c0f008ce6d2d41e9e1937e1cd0f9914c59a7e29e1ce7ba0bb))]))), SemId(Array<32>(b10ddefe8020add8a0ca08292150abb13c514d76de5168c1c97105a27e676660)): Struct(NamedFields(Confined([Field { name: FieldName("type"), ty: SemId(Array<32>(1cb0758e14c2008c0f008ce6d2d41e9e1937e1cd0f9914c59a7e29e1ce7ba0bb)) }, Field { name: FieldName("subtype"), ty: SemId(Array<32>(2fd8f27a172712903e6a3e96f0f85c0480b4211a17acd13059fc51d4a4bbde2c)) }, Field { name: FieldName("charset"), ty: SemId(Array<32>(2fd8f27a172712903e6a3e96f0f85c0480b4211a17acd13059fc51d4a4bbde2c)) }]))), SemId(Array<32>(bf8fcbe9c5395731a6b4cd61fb00dfe7a5d629365339c55aeae087a3b90aaa46)): List(SemId(Array<32>(3cd1a29dccad9b917b26305f89a8a4fb2118302a4e73c5ac0a780de6ab005e73)), Sizing { min: 0, max: 63 }), SemId(Array<32>(c43a7d9eb9b3027973c98f5dd6e1ac04f5cbd34240c0bebc0a0fb808140094d4)): Tuple(UnnamedFields(Confined([SemId(Array<32>(48be23172ae884459ae78334a0063f09fa0e317bea8b233ce782a38875e796b8)), SemId(Array<32>(f5ad172144ccd2dd62ece74ff0fb14641d936a80c1a0c93ebf97727184897cbc))]))), SemId(Array<32>(caff8faeb38a00a04e3621538f8e61d75a85a465cb0a0e48c3593e7eaa6c5fc7)): Tuple(UnnamedFields(Confined([SemId(Array<32>(3f2b72b7c4af1a630cb6d3ff088baf351093ee465b9e7d472a610082e449d7e4))]))), SemId(Array<32>(ccc272928f793803d91f5dad8d51cc986b4332380f9224f7c7c1514d768ebb90)): Tuple(UnnamedFields(Confined([SemId(Array<32>(f9170804ddae0479f8d5af74ab3bd202e6ea4172d9a9b93707151adb7fc40ca1)), SemId(Array<32>(bf8fcbe9c5395731a6b4cd61fb00dfe7a5d629365339c55aeae087a3b90aaa46))]))), SemId(Array<32>(d7fcbee31ef0a85d5f973bda1b0b8c9e7efbcbc5572577382cacd3bdb4218a01)): Struct(NamedFields(Confined([Field { name: FieldName("ticker"), ty: SemId(Array<32>(5b772c8eb15fd74700c79241f60f8fda37e736b3fd462ab017ce4d454efa81aa)) }, Field { name: FieldName("name"), ty: SemId(Array<32>(805ec5bc5312c84190445da16aa1c08a09e300e8323acfae6a23420a29ad003d)) }, Field { name: FieldName("details"), ty: SemId(Array<32>(45b780258601c526b23b5b4861460a9050e13f35fbbe8305a8001157e4013888)) }, Field { name: FieldName("precision"), ty: SemId(Array<32>(5d03c4178da98e7e3f3af343e3997d74201d11f42732cfbea2b04b8e3ff15f22)) }]))), SemId(Array<32>(d83fbee02f0de5b46cf80fe11ef7fdf061c78d975d31ade9eea2bc4099339e6c)): Primitive(Primitive(0)), SemId(Array<32>(dc1e2f52567f725fd730ad84867f0da4c9ba9af0813311dfe4ef3e3c4a612548)): Tuple(UnnamedFields(Confined([SemId(Array<32>(43aa7fc5f6f5644fe5a2ae5e1aa99042cdeb879442e34c723ff5827fb133de8a))]))), SemId(Array<32>(e087a83496338799afc48a9211683a427d2bd33e2ea7ebb8a8b880ea4ab4eb81)): Union(UnionVariants(Confined({Variant { name: VariantName("none"), tag: 0 }: SemId(Array<32>(d83fbee02f0de5b46cf80fe11ef7fdf061c78d975d31ade9eea2bc4099339e6c)), Variant { name: VariantName("some"), tag: 1 }: SemId(Array<32>(dc1e2f52567f725fd730ad84867f0da4c9ba9af0813311dfe4ef3e3c4a612548))}))), SemId(Array<32>(f5ad172144ccd2dd62ece74ff0fb14641d936a80c1a0c93ebf97727184897cbc)): List(SemId(Array<32>(48be23172ae884459ae78334a0063f09fa0e317bea8b233ce782a38875e796b8)), Sizing { min: 0, max: 39 }), SemId(Array<32>(f9170804ddae0479f8d5af74ab3bd202e6ea4172d9a9b93707151adb7fc40ca1)): Enum(EnumVariants(Confined({Variant { name: VariantName("a"), tag: 97 }, Variant { name: VariantName("b"), tag: 98 }, Variant { name: VariantName("c"), tag: 99 }, Variant { name: VariantName("d"), tag: 100 }, Variant { name: VariantName("e"), tag: 101 }, Variant { name: VariantName("f"), tag: 102 }, Variant { name: VariantName("g"), tag: 103 }, Variant { name: VariantName("h"), tag: 104 }, Variant { name: VariantName("i"), tag: 105 }, Variant { name: VariantName("j"), tag: 106 }, Variant { name: VariantName("k"), tag: 107 }, Variant { name: VariantName("l"), tag: 108 }, Variant { name: VariantName("m"), tag: 109 }, Variant { name: VariantName("n"), tag: 110 }, Variant { name: VariantName("o"), tag: 111 }, Variant { name: VariantName("p"), tag: 112 }, Variant { name: VariantName("q"), tag: 113 }, Variant { name: VariantName("r"), tag: 114 }, Variant { name: VariantName("s"), tag: 115 }, Variant { name: VariantName("t"), tag: 116 }, Variant { name: VariantName("u"), tag: 117 }, Variant { name: VariantName("v"), tag: 118 }, Variant { name: VariantName("w"), tag: 119 }, Variant { name: VariantName("x"), tag: 120 }, Variant { name: VariantName("y"), tag: 121 }, Variant { name: VariantName("z"), tag: 122 }}))), SemId(Array<32>(fba958721a3d335406b368c36f5a82790960cce239febcafe189ba9839d5da78)): UnicodeChar})), scripts: Confined({Lib { isae: IsaSeg(Confined({IsaName("ALU"), IsaName("BPDIGEST"), IsaName("RGB")})), code: Confined([11, 0, 0, 0, 208, 160, 15, 1, 7, 11, 0, 1, 0, 11, 8, 0, 0, 11, 1, 2, 0, 200, 218, 7, 1, 57, 48, 0, 209, 160, 15, 1, 7]), data: Confined([0, 1, 0, 0]), libs: LibSeg(Confined({})) }}), attachments: Confined({}), signatures: Confined({}) })

while here the receiver is able to validate the consignment but then fails to spend the received assets.

Do you use correct branches where we have the fix for that merged, like #272?

Yes, the branch I asked you to check (https://github.com/zoedberg/rgb-tests/tree/tapret_wlt_receiving_opret_fix_271) is using #272

@dr-orlovsky
Copy link
Member

So do I understand it right that this is not a regression from the successful test as you reported in #272 (review)

I've run the test in RGB-WG/rgb-tests#6 100 times and can confirm the test passed every time

You just added further testing to cover whether the asset can be spent after acceptance?

@zoedberg
Copy link
Contributor Author

When I reviewed the PR I assumed that the test was good enough to confirm that spending both a tapret and opret allocation was fixed but, by debugging the non-deterministic behavior, I understood that the test was incomplete. So I've added a 4th and 5th transfer and tried again the fix in #272, discovering that this fix was insufficient, since the consignment validation passes but then the recipient is unable to spend the received assets. I haven't debugged this further, so the issue could be on the consignment creation and/or validation, I'll leave this to you.

@dr-orlovsky dr-orlovsky self-assigned this Sep 25, 2024
@dr-orlovsky dr-orlovsky added the bug Something isn't working label Sep 25, 2024
@dr-orlovsky dr-orlovsky added this to the v0.11.0 milestone Sep 25, 2024
@dr-orlovsky
Copy link
Member

Now I can't replicate the issue:

~/rgb-tests$ git status
On branch tapret_wlt_receiving_opret_fix_271
Your branch is up to date with 'zoe/tapret_wlt_receiving_opret_fix_271'.

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	tests/mainnet/
	tests/tmp-1/
	tests/tmp-2/
	tests/tmp/

nothing added to commit but untracked files present (use "git add" to track)
~/rgb-tests$ cargo test tapret_wlt_receiving_opret
    Finished `test` profile [unoptimized + debuginfo] target(s) in 1.01s
     Running tests/issuance.rs (target/debug/deps/issuance-bf3fa6e80da04970)

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 12 filtered out; finished in 0.00s

     Running tests/stress.rs (target/debug/deps/stress-b9c7bd69d94f471f)

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 6 filtered out; finished in 0.00s

     Running tests/transfers.rs (target/debug/deps/transfers-a3f9fd11dcb41e21)

running 1 test
test tapret_wlt_receiving_opret ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 76 filtered out; finished in 47.08s

     Running tests/validation.rs (target/debug/deps/validation-4e98b42504ea2da1)

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 6 filtered out; finished in 0.00s

@dr-orlovsky
Copy link
Member

Ok, I can replicate it using a different branch zoedberg:tapret_wlt_receiving_opret - and not the one you provided above in the issue description

This can be seen using this branch and running the tapret_wlt_receiving_opret test.

@zoedberg
Copy link
Contributor Author

zoedberg commented Oct 7, 2024

Now I can't replicate the issue:

~/rgb-tests$ git status
On branch tapret_wlt_receiving_opret_fix_271
Your branch is up to date with 'zoe/tapret_wlt_receiving_opret_fix_271'.

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	tests/mainnet/
	tests/tmp-1/
	tests/tmp-2/
	tests/tmp/

nothing added to commit but untracked files present (use "git add" to track)
~/rgb-tests$ cargo test tapret_wlt_receiving_opret
    Finished `test` profile [unoptimized + debuginfo] target(s) in 1.01s
     Running tests/issuance.rs (target/debug/deps/issuance-bf3fa6e80da04970)

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 12 filtered out; finished in 0.00s

     Running tests/stress.rs (target/debug/deps/stress-b9c7bd69d94f471f)

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 6 filtered out; finished in 0.00s

     Running tests/transfers.rs (target/debug/deps/transfers-a3f9fd11dcb41e21)

running 1 test
test tapret_wlt_receiving_opret ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 76 filtered out; finished in 47.08s

     Running tests/validation.rs (target/debug/deps/validation-4e98b42504ea2da1)

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 6 filtered out; finished in 0.00s

That branch has been used on RGB-WG/rgb-tests#16 to show the bug is deterministic (it asserts 0 bundles/transitions and it removes the 4th and 5th transfers)

Use branch tapret_wlt_receiving_opret (from PR RGB-WG/rgb-tests#6) and checkout rgb-std to the master branch

@dr-orlovsky
Copy link
Member

Ok, as I thought: this is not a bug, but a lack of UX, as I described in #246 (comment)

The opret wallet has funds on a UTXO with an assignment, which spending requires creation of tapret commit. But WPKH wallet can't do a tapret output! Thus, it can't use that funds.

Use of tapret funds received to an opret wallet (i.e. non-P2TR wallet) would require manual human work - from the wallet support or something.

@dr-orlovsky
Copy link
Member

dr-orlovsky commented Oct 8, 2024

Correcting myself: I do not know where I was looking at, but now I see that the wlt_2 output of 300 is opretFirst (probably I need to sleep more). So yes, you are right, this looks like a bug unrelated to #246 (comment)

One other thing I've noticed is that the transfer of the 3rd transaction is listed as "tentative" by the wlt_2 when it tries to create a 4th transaction spending the output of the 3rd. Maybe that is a reason why the wallet can't spent

Anyway, to do a proper debugging I need fixes which I did in the develop branches of other PRs - since otherwise for instance the wallet state is not persisted and I can't see whether the wallet sees its outputs. Is it possible to re-base this test using develop branches? I have did that, but there are multiple compilation issues happening; I assume you already fixed them in some other PRs here, but I do not know which.

Here is the setup I need:

$ git submodule
 bb36a490d68ccf7d574b5926bfc7f8b9509776f2 amplify-derive (v4.0.1)
+1a5ecbf8d9eb8616cf0c091ceee6ff2fcc941780 amplify-nonasync (v0.1.2-2-g1a5ecbf)
 be035c1ed260313217bd799bd47cbc9bdfdf27ec amplify-num (v0.5.3-1-gbe035c1)
 3d8b4cb5a20c6ec5ec41fae4d88f3f0004917072 ascii-armor (v0.7.2)
 923f728cefd2682462387e7f16b2967e22860237 bp-core (v0.9.0-465-g923f728)
 5e35c13052e42757868963510730c96724347a17 bp-electrum-client (0.19.0-12-g5e35c13)
+4cdad88d83e660a06aae5457cd2c7eeed369baa5 bp-esplora-client (v0.11.0-beta.8-3-g4cdad88)
 6dd564c90452ad8b358a6f9f3262114227a88d58 bp-std (v0.11.0-beta.8)
+f850c3b3f98e1ade4b720c3c0c6e4799bb3ccb7f bp-wallet (v0.11.0-beta.8-24-gf850c3b)
 cc3780aa01873067ef2370f870ddd3f4a52fd82b client_side_validation (v0.11.0-beta.8)
+07c55b3aff4ba3d0763807ffb92e8e8af72c2ea6 rgb (v0.11.0-beta.8-26-g07c55b3)
+e2a451fa793fe5403b4114b5ed5e9e47c69674cd rgb-core (v0.9.0-829-ge2a451fa)
+673e970f5655ac5f7bd577a410ef4ad02bf3f62e rgb-interfaces (v0.11.0-beta.8-2-g673e970)
 954cfd867e963f1f4c39eea3067fd2183d26f896 rgb-schemata (v0.11.0-beta.8)
+94b5ebc6b998b4aa2321513c08b4ff2aebfd2a56 rgb-std (v0.11.0-beta.8-27-g94b5ebc)
 55d53be7badaecb3b258007c72d0afb533e66172 rust-aluvm (v0.11.0-beta.8)
 d01b9f52c23e839c6620f68d1bf9099152178f6d rust-amplify (v4.7.0)
 983854a1b9be7c2cd7d98b00ab4df3e633be393a rust-baid64 (v0.2.2)
 b11845c2d811d87c69a597b6602914141ca31227 strict-encoding (v02.7.0)
 f72bb5b91132ebd403051df5ae42820b2f6c43c1 strict-types (v2.7.0)
 6e1c889e9b951ac709d7db0e57d02dc427446527 vesper (v0.1.0)

The last commit in https://github.com/RGB-WG/rgb-tests/tree/tapret_wlt_receiving_opret contains all these changes

@zoedberg
Copy link
Contributor Author

zoedberg commented Oct 8, 2024

Is it possible to re-base this test using develop branches? I have did that, but there are multiple compilation issues happening; I assume you already fixed them in some other PRs here, but I do not know which.

I haven't already fixed them. I usually make changes to the tests when I have PRs to review and in the last weeks there were none. I'll make the fixes and let you know when I push

The last commit in https://github.com/RGB-WG/rgb-tests/tree/tapret_wlt_receiving_opret contains all these changes

Ok, please note that we should not merge that branch, I'll rebase zoedberg/tapret_wlt_receiving_opret after the next RGB release and before that I'll do a separate PR to update the tests to the latest release. So to avoid confusion I'll push what you asked me on zoedberg/tapret_wlt_receiving_opret_develop

@zoedberg
Copy link
Contributor Author

zoedberg commented Oct 8, 2024

@dr-orlovsky
Copy link
Member

Thank you. What do you think about

One other thing I've noticed is that the transfer of the 3rd transaction is listed as "tentative" by the wlt_2 when it tries to create a 4th transaction spending the output of the 3rd. Maybe that is a reason why the wallet can't spent

Which status transaction 3 must have by the time we do transaction 4?

@dr-orlovsky
Copy link
Member

From what I see, the wallet sees the output of 300, but as tentative (after the test is aborted due to panic):

~/rgb-tests$ rgb --no-network-prefix -d test-data/integration/66590ecb -w bp_wallet_name state 'rgb:$cQeXJuD-FsOVk5R-gFUSxNb-djuqQfC-7j5c3S2-ORprwME'
Loading descriptor from wallet bp_wallet_name ... success

Global:
  spec := (ticker=("NIATCKR"), name=("NIA asset name"), details=~, precision=2)
  terms := (text=("NIA terms"), media=~)
  issuedSupply := (600)

Owned:
  State      	Seal                                                                          	Witness
  assetOwner:
          300	bc:opret1st:90559f416604e9a045e6c5e6364afe5dfcefa97649041e2c9293191feb3c561e:1	bc:90559f416604e9a045e6c5e6364afe5dfcefa97649041e2c9293191feb3c561e (tentative) 

@dr-orlovsky
Copy link
Member

Ok, I was confused by the fact that there are actually two outputs having 300 of asset and coming from different transactions (one is change from the second transfer, one is created in the third transfer). So I changed the third payment from 300 to 290 and, with that, was able to understand and properly debug what's going on.

While wlt_1 for the third transfer does properly construct two bundles (one tapret, spending 200 of asset, and one opret, spending 90 of asset), it fails to include both of them into the consignment of the third transfer it sends to wlt_2 (the consignment includes just one bundle instead of four - while all four bundles are present in the stash) - and thus, wlt_2 doesn't know about some assets it owns, thus failing to pay back (the fourth transfer).

Thus, the bug is in the consign method. Now I am trying to find in the method code what's going on.

@dr-orlovsky
Copy link
Member

dr-orlovsky commented Oct 11, 2024

Huh, finally was able to find the source of the bug. It was unrelated to taprets/oprets, and was just caused by the fact that if a secret seal has more than one terminal, it gets removed from the terminal index due to just a coding mistake. You can easily see what was going on in f77e76f

I've added fix to #273

@dr-orlovsky
Copy link
Member

dr-orlovsky commented Oct 11, 2024

There Is another bug revealed by the tests after the fixed one - I am working on fixing it too

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
Status: In review
Development

Successfully merging a pull request may close this issue.

2 participants