RGB-WG / rgb-std

RGB standard libs for WASM & low-level integrations (no FS/networking)
https://rgb.tech
Apache License 2.0
66 stars 31 forks source link

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

Open zoedberg opened 1 week ago

zoedberg commented 1 week ago

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 commented 1 week ago

How is this different from https://github.com/RGB-WG/rgb-std/issues/271? Do you use correct branches where we have the fix for that merged, like https://github.com/RGB-WG/rgb-std/pull/272?

zoedberg commented 1 week ago

How is this different from #271?

In https://github.com/RGB-WG/rgb-std/issues/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 https://github.com/RGB-WG/rgb-std/pull/272

dr-orlovsky commented 1 week ago

So do I understand it right that this is not a regression from the successful test as you reported in https://github.com/RGB-WG/rgb-std/pull/272#pullrequestreview-2315410410

I've run the test in https://github.com/RGB-WG/rgb-tests/pull/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 commented 1 week ago

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 https://github.com/RGB-WG/rgb-std/pull/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 commented 23 hours ago

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 commented 23 hours ago

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 commented 23 hours ago

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 https://github.com/RGB-WG/rgb-tests/pull/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 https://github.com/RGB-WG/rgb-tests/pull/6) and checkout rgb-std to the master branch

dr-orlovsky commented 22 hours ago

Ok, as I thought: this is not a bug, but a lack of UX, as I described in https://github.com/RGB-WG/rgb-std/issues/246#issuecomment-2284812331

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 commented 12 hours ago

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 https://github.com/RGB-WG/rgb-std/issues/246#issuecomment-2284812331

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 commented 6 hours ago

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 commented 6 hours ago

Fixed and pushed on https://github.com/zoedberg/rgb-tests/tree/tapret_wlt_receiving_opret_develop