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

tapret_wlt_receiving_opret: de-ignore to show bug #6

Merged
merged 1 commit into from
Nov 24, 2024

Conversation

zoedberg
Copy link
Collaborator

To be merged once we have a fix for this. Run cargo test tapret_wlt_receiving_opret to see the issue:

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({}) })

i.e. wlt_2 considers the consignment (created by wlt_1) invalid, the sender is trying to spend opret and tapret allocations together. This issue is similar to RGB-WG/rgb-std#246, but there the sender was failing to make the transfer

@zoedberg
Copy link
Collaborator Author

I'm not sure this is helpful but I've noticed a strange thing: before rebasing this PR the CI was succeeding https://github.com/RGB-WG/rgb-tests/actions/runs/10809438685/job/29984552488

By running the test locally it always failed though, so I'm not sure it was just a strange behavior from the CI or if it means the error is not deterministic

@dr-orlovsky
Copy link
Member

dr-orlovsky commented Sep 17, 2024

I did cargo update + changed some of submodules to develop branches. I have also added some debugging to the helper functions - but nothing which can affect the test. Nevertheless, the test now passes - as can be seen for instance here in CI: https://github.com/RGB-WG/rgb-tests/actions/runs/10905019728/job/30262854607?pr=9#step:5:298

I assume something in dependencies were broken. Let's use this PR to fix the broken dependency

UPD: The test fails on CI but always succeeds locally

@dr-orlovsky
Copy link
Member

dr-orlovsky commented Sep 18, 2024

The test contain an issue: when I save the consignment I see that wlt1 on a third payment doesn't see payment1 as mined, and thus pays from the genesis. Somehow mining is not always happening; that was the reason why tests were passing before - and still sometimes non-deterministically pass

@dr-orlovsky
Copy link
Member

It might be that the issue is this one: RGB-WG/rgb-std#270

@zoedberg
Copy link
Collaborator Author

The test contain an issue: when I save the consignment I see that wlt1 on a third payment doesn't see payment1 as mined, and thus pays from the genesis. Somehow mining is not always happening; that was the reason why tests were passing before - and still sometimes non-deterministically pass

No, this is not the reason of undeterminism of that test. I've added a commit here that proves the test fails even if the mining method makes sure the TX gets included in a block

@dr-orlovsky
Copy link
Member

I've added a commit here that proves the test fails even if the mining method makes sure the TX gets included in a block

No, I am talking not about the test failure, but about success. The test succeeds and not all of txes are mined.

@zoedberg
Copy link
Collaborator Author

The test with the added code (which adds mine_tx) still has a non-deterministic behavior, even when it runs alone. Therefore the non-determininsm is not due to the test but to something else. I think we should determine what is causing this before merging the PR that fixes it (RGB-WG/rgb-std#272). The reason for the non-determinism must be in one of the lines removed/changed by that PR

@dr-orlovsky
Copy link
Member

dr-orlovsky commented Sep 19, 2024

I read your comment after seeing your ACK on the other PR and merging it...

Also I do not know why github auto-closed this PR!

@dr-orlovsky
Copy link
Member

Therefore the non-determininsm is not due to the test but to something else. I think we should determine what is causing this before merging the PR that fixes it (RGB-WG/rgb-std#272). The reason for the non-determinism must be in one of the lines removed/changed by that PR

The non-determinism is about txes being not mined. I do not see how this can be related to the rgb code... RGB std doesn't touch indexers neither sign nor broadcasts transactions

@zoedberg zoedberg reopened this Sep 19, 2024
@dr-orlovsky
Copy link
Member

dr-orlovsky commented Sep 19, 2024

In RGB-WG/rgb-std#272 (review) you say:

I've run the test in #6 100 times and can confirm the test passed every time, so with this PR there is no more a non-deterministic behavior and transfers spending both tapret and opret allocations work again.

Here you say:

The test with the added code (which adds mine_tx) still has a non-deterministic behavior, even when it runs alone.

So which of these statements is the latest one?

The problem I see is the fact that somehow wlt_1 doesn't get the first payment mined - and it seems this happens in a non-deterministic way. It may be like that for dozens of runs in a row - and than it switches back to mining it. This was the case even before PR RGB-WG/rgb-std#272 was opened, so this is unrelated to it. Also, the only business logic changes in that PR are RGB-WG/rgb-std@d28d7e6 and RGB-WG/rgb-std@4c84a0a which are easy to verify and which do not touch anything wallet- or transaction-related. The last commit fc20101b8f947089a2d3a0740d77976b122330f2 is verbose, but it just removes unused code and some cycles, and failed mining was experienced by me before it was added

@zoedberg
Copy link
Collaborator Author

The non-determinism is about txes being not mined. I do not see how this can be related to the rgb code... RGB std doesn't touch indexers neither sign nor broadcasts transactions

The fact that the test passes every time with the fixing PR (RGB-WG/rgb-std#272) included while the exact same test is non-deterministic without the fixing PR to me is a proof that the non-deterministic behavior is not caused by the test but by the PR.
The mine_tx method makes sure that TXs broadcasted by the test are mined.
If you still think the non-determinism of the test outcome comes from a mining issue, please show that there's actually an unmined test-related TX by adding assertions to the code.

So which of these statements is the latest one?

The test with the fix always passes. The same test without the fix sometimes passes and sometimes doesn't.

The problem I see is the fact that somehow wlt_1 doesn't get the first payment mined - and it seems this happens in a non-deterministic way. It may be like that for dozens of runs in a row - and than it switches back to mining it. This was the case even before PR RGB-WG/rgb-std#272 was opened, so this is unrelated to it. Also, the only business logic changes in that PR are RGB-WG/rgb-std@d28d7e6 and RGB-WG/rgb-std@4c84a0a which are easy to verify and which do not touch anything wallet- or transaction-related. The last commit fc20101b8f947089a2d3a0740d77976b122330f2 is verbose, but it just removes unused code and some cycles, and failed mining was experienced by me before it was added

The fact the PR doesn't touch anything wallet- or transaction-related doesn't exclude the possibility that the code changed/removed by the PR was causing the non-determinism. As stated, if you are still convinced the non-determinism is about mining please prove it.

@dr-orlovsky
Copy link
Member

dr-orlovsky commented Sep 19, 2024

The fact that the test passes every time with the fixing PR (RGB-WG/rgb-std#272) included while the exact same test is non-deterministic without the fixing PR to me is a proof that the non-deterministic behavior is not caused by the test but by the PR.

No it doesn't prove it.

Test may remain non-deterministic. Let's say before the fixing PR there were two scenarios how it can run, A and B, and the CI runs them non-deterministically. A always fail, B always succeeds.

The PR fixes A scenario failure. Thus, test always succeeds now, while both non-deterministic scenarios are still there.

The test with the fix always passes. The same test without the fix sometimes passes and sometimes doesn't.

So this doesn't demonstrate that non-determinism is gone: see the explanation above.

If you still think the non-determinism of the test outcome comes from a mining issue, please show that there's actually an unmined test-related TX by adding assertions to the code.

Well, I have seen that wlt_1 spends the same output in payment 3 as it spends in payment 1, so the transaction is missed. I see it from YAML output of the consignment - and the wlt_2 accepts it! This scenario was making the test succeeding for me locally before the fixing PR, which I reported to you in telegram. You wasn't able to reproduce that success, but you haven't tried according to yourself.

After the PR I still see in the YAML just one transaction in the history instead of the three. Thus, the scenario B with no payment 1 happening is still there; it is just the fact that PR fixes scenario A makes test to always succeed.

As stated, if you are still convinced the non-determinism is about mining please prove it.

It is not about being convienced; there is just no other options taking the facts into the account:

  • the undeterminism before the PR
  • the absence of transaction from payment 1 in debug logs (YAMLs of the consignments) in some of the runs - while presence in others
  • the fact that all other tests do succeed thus there is no bug in the RGB code on transaction publication

So the problem for non-determinism is somewhere in this specific test function. There could be no other logical conclusion.

@zoedberg
Copy link
Collaborator Author

I dug deeper, in order to find what was causing the non-deterministic outcome of the test.
The TX was expected to be confirmed, since the code mines until the broadcasted TX is seen as such:

let mut attempts = 10;
loop {
    mine(resume);
    if self.get_tx_height(txid).is_some() {
        break;
    }
    attempts -= 1;
    if attempts == 0 {
        panic!("TX is not getting mined");
    }
}

A deeper inspection confirms that the issue was not with TX mining as you instead thought.

Comparing a successful test run to a failing one what I see is:

  • when it fails, the error always comes from here and always where the match self.resolver.resolve_pub_witness(witness_id) is processing the TX from the 3rd transfer (the last one). The reason it goes into the branch that adds the AnchorMethodMismatch failure is that the anchor has a dbc_proof of type DbcProof::Tapret but close_method is OpretFirst
  • when it succeeds, the TX from the 3rd transfer (the last one) has a dbc_proof of type DbcProof::Tapret and close_method is TapretFirst

This discrepancy clearly doesn't come from the TX not being confirmed.

Therefore, I continued debugging and what I found is that the non-deterministic behavior of the test was due to a different order in the calls to self.terminal_index.insert(*seal, opout)?; (here). More specifically, in both the fail and success cases this gets called twice with the same seal but different opout, with the difference that in the failing case it first gets called with an opout associated to a tapret bundle and then with an opret one, while in the succeeding case it first gets called with an opout associated to an opret bundle and then with a tapret one. So in both cases one opout would get lost, even though in the succeding case the validation code wasn't detecting the error. The specific reason for this non-deterministic behavior is in the way the bundles that get inserted in the Fascia are collected: by defining the input_map as a HashMap (here) its elements will be ordered by their hashes and not by their keys (which instead would happen by using a BTreeMap). To double-check this, you can checkout this commit, update the submodules (to checkout the only required change) and run for i in $(seq 1 100); do echo "run $i"; cargo test --test transfers tapret_wlt_receiving_opret || break; done to see that by just changing that HashMap to a BTreeMap the test always succeeds.

Debugging this in depth allowed me to understand that the succeeding case was not actually succeeding and therefore that the test was not complete enough. So I've added a 4th and 5th transfers to this PR, that now make the test always fail.

On top of this PR, I re-checked the fix in RGB-WG/rgb-std#272 and it seems we still have a bug. Check this branch to see it yourself. Therefore I've just opened a new issue RGB-WG/rgb-std#275 to tackle this.

@dr-orlovsky
Copy link
Member

Comparing a successful test run to a failing one what I see is:
This discrepancy clearly doesn't come from the TX not being confirmed.

I was not talking about that. I am talking about completely different thing.

Please just use the fixed branches which do not ever fail. Than check what you see in the YAML of consignments and you will see the tx is not mined (the last consignment has just one witness!). For a bunch of times (>dozen). Than it appears there (now you will see three witnesses in the last consignment) - for another dozen of times. In both cases the test succeeds. What switches this is not clear.

This shows that the test runs and succeeds, but its execution path is non-deterministic and somehow transaction is missed.

What you checked is that you confirmed that there is a bug with anchors which was fixed - yes, we already know that. But it is unrelated to the problem I am talking about.

@zoedberg
Copy link
Collaborator Author

I haven't seen the behavior you reported and I don't understand how a TX could not get mined. Please prove what you're saying by adding some assertions to the code because it's important to understand if tests are really bugged or if there are other non-deterministic behaviors in RGB (other than the one I've just proved).

@dr-orlovsky
Copy link
Member

dr-orlovsky commented Sep 25, 2024

I haven't seen the behavior you reported and I don't understand how a TX could not get mined.

Yes, I was trying to explain the problem of this non-determinism in tx mining since a week but it seems I have failed all the time.

Please prove what you're saying by adding some assertions to the code because it's important to understand if tests are really bugged or if there are other non-deterministic behaviors in RGB (other than the one I've just proved).

I do not know the codebase structure well enough to understand which assertions have to be added and where - so the only way how I can "prove" this is to propose you to look into the YAML consignments after multiple test runs (the way I did it myself)

@zoedberg
Copy link
Collaborator Author

Yes, I was trying to explain the problem of this non-determinism in tx mining since a week but it seems I have failed all the time.

We always discussed (both here and in private messages) about non-determinism in the context of the test that was sometimes failing and sometimes succeeding. For example here you said:

Somehow mining is not always happening; that was the reason why tests were passing before - and still sometimes non-deterministically pass

So yes, communication failed. Anyway we need to make sure there are no more non-deterministic behaviors, both in the tests and in RGB code.

I do not know the codebase structure well enough to understand which assertions have to be added and where - so the only way how I can "prove" this is to propose you to look into the YAML consignments after multiple test runs (the way I did it myself)

I've looked at consignments several times while I was debugging and I've never seen what you're describing. Anyway, since statements like this needs to be demonstrated with code, I've added some assertions to the test to check the expected number of bundles and terminals in the consignment.

The result was quite unexpected:

So, getting into details, in both tapret_wlt_receiving_opret_deterministic and tapret_wlt_receiving_opret_fix_271 the first 2 consignments pass the following assertions:

  • consignment 1:
assert_eq!(consignment.bundles.len(), 1);
assert_eq!(consignment.terminals.len(), 1);
  • consignment 2:
assert_eq!(consignment.bundles.len(), 2);
assert_eq!(consignment.terminals.len(), 0);

While for the consignment of the third transfer we have that:

  • consignment 3 in tapret_wlt_receiving_opret_deterministic:
assert_eq!(consignment.bundles.len(), 2);
assert_eq!(consignment.terminals.len(), 1);
  • consignment 3 in tapret_wlt_receiving_opret_fix_271:
assert_eq!(consignment.bundles.len(), 0);
assert_eq!(consignment.terminals.len(), 0);

Not sure this is the cause of RGB-WG/rgb-std#275 but this definitely seems like a bug.

Anyway, to me these assertions prove there is no such case of a TX not getting mined and that the only non-deterministic behavior was in input_map being a HashMap. Do you agree with this or think I should add more assertions?

@dr-orlovsky
Copy link
Member

dr-orlovsky commented Sep 27, 2024

The problem I witnessed is the following: there are two scenarios in which test runs. The scenarios are following:

  1. normal scenario, all transaction mined;
  2. scenario where transactions in this specific test are not mined and YAML of consignment spend directly from genesis in the third transaction

Before RGB-WG/rgb-std#272 (1) was failing and (2) was suceeding (you haven't witnessed that, but I had and reported you in telegram private messages before doing PR 272). After PR 272 both scenarios become succeeding, but they both are still there (that is what I meant "the non-determinism was there before and is still there, even though the test succeeds").

The strangest part is that test stays on one of the scenarios for ~10-20 runs in a raw, and then "switches" to another scenario, stays there for another ~20 runs, switches back and so on. So this is undetectable with a CI which does just a single run. You need to run many-many times and than eventually you will witness the switch.

I have broken my head trying to understand how that can be possible and how to hunt this issue down. I have no suggestions which additonal assetions are required - I will look much more into the new code you've done over the weekend, run it on the server for hundred times and will hunt for the assertions fired.

@dr-orlovsky
Copy link
Member

dr-orlovsky commented Sep 27, 2024

consignment 3 in tapret_wlt_receiving_opret_fix_271:

assert_eq!(consignment.bundles.len(), 0);
assert_eq!(consignment.terminals.len(), 0);

Basically this seems to be the bug I am talking about: sometimes the third consignment spends genesis, not seeing the previous transactions!

The fact that it doesn't happen all the time. I see you run the first test for 100 times, but you fail on the first assertion. Try to run it on different days and record how many transactions the consignment has in the third transfer - and you will see the two scenarious I am talking about. The same thing should be true also without RGB-WG/rgb-std#275 - I just assume you need to wait some time before runs (few hrs? I do not know).

I can't imagine what can influence that thing. Maybe stopping docker containers and starting them again...

@zoedberg
Copy link
Collaborator Author

I've opened #16 with the tapret_wlt_receiving_opret_fix_271 branch, where I also added a CI job to run the test 100 times. This way we can run it several times, in different hours and on different days to see if the behavior is deterministic or not. I expect it to have a deterministic behavior but I think this is the only way to prove it.

@dr-orlovsky
Copy link
Member

This way we can run it several times, in different hours and on different days to see if the behavior is deterministic or not.

So assertions on the number of bundles in the last transfer + 100 times + running different times should work, yes

@zoedberg
Copy link
Collaborator Author

zoedberg commented Oct 3, 2024

So assertions on the number of bundles in the last transfer + 100 times + running different times should work, yes

I've ran the tests of #16 several times on the CI on different days/hours and as you can see they always passed. So can we now agree the tests have a deterministic behavior?

@dr-orlovsky
Copy link
Member

The problem with determinism is that it can't be proven through tests: only formally. So for now I agree that we do not have a replicate non-deterministic behavior. But I won't feel safe until I will find out what I was experiencing in the past and why it has gone.

BTW introduction of nix builds should really help with determinism. However I have zero experience with it - nor time to understand how to use it. So maybe we will leave that to the future

@zoedberg
Copy link
Collaborator Author

zoedberg commented Oct 3, 2024

But I won't feel safe until I will find out what I was experiencing in the past and why it has gone.

Is it possible that you were checking the wrong consignments? I mean, it's really hard to believe that without changing the code a non-deterministic behavior became deterministic out of the blue.

BTW introduction of nix builds should really help with determinism. However I have zero experience with it - nor time to understand how to use it. So maybe we will leave that to the future

I'm not sure about this. IMO the system determinism shouldn't affect the deterministic (or non-deterministic) behavior of a test. Also in a real world scenario users usually don't use nix, so IMO it's better to run tests in widely used systems

@dr-orlovsky
Copy link
Member

Is it possible that you were checking the wrong consignments?

I run just one test, and checked all produced consignments, so very low probability

I mean, it's really hard to believe that without changing the code a non-deterministic behavior became deterministic out of the blue.

That what surprises me and I am tend to believe that this is something with how mining works in dockerized environments on different platforms and in different server restarts. Nix fixes this

I'm not sure about this. IMO the system determinism shouldn't affect the deterministic (or non-deterministic) behavior of a test.

From what I know it is actually one of the main reasons for the non-determinisim --- and the reason why Nix and Guix were created first hand

Also in a real world scenario users usually don't use nix, so IMO it's better to run tests in widely used systems

We need both

@zoedberg
Copy link
Collaborator Author

zoedberg commented Oct 3, 2024

I run just one test, and checked all produced consignments, so very low probability

There are 2 wallets and 3 consignments involved, so I don't think the probability is so low. Also, speaking about probabilities, what is more likely? A human error or a software bug that only shows up on your machine? Also, to get a better picture now that we have the asserts, does the test in #16 pass every time on the machine where you've seen the non-deterministic behavior?

That what surprises me and I am tend to believe that this is something with how mining works in dockerized environments on different platforms and in different server restarts. Nix fixes this

Docker creates an environment that basically only shares the kernel with the host system, with all other components built deterministically and in a reproducible way, which is why one of its main uses is to have the same behavior between development, test and production systems. Nix does something similar, with one of its advantages being the ability to roll-back changes to system configuration if something goes wrong, but that's not useful in this context. All in all, I fail to see the difference between Docker and Nix in this context and expect Docker to do a perfect job in isolating differences across systems.

From what I know it is actually one of the main reasons for the non-determinisim --- and the reason why Nix and Guix were created first hand

No, this is not the reason Nix was created. It was created to address challenges in software package management, reproducibility, and system configuration. So its purpose is for system determinism, not for test determinism.

We need both

It makes sense to have both. We have Docker to get a reproducible testing environment, that can be reproduced in CI and locally. We can run tests in different conditions and on different machines, and we already do. It's just that when reporting an issue it makes more sense to have it as reproducible as possible to reduce the debugging effort.
Anyway I don't see this as a priority and I don't think this is the right place where we should discuss nix, since as I'm trying to explain and prove the main point here is that there isn't any non-deterministic behavior in the tests. And to convince myself that I'm wrong I need to see the tests in #16 fail at least once. If you're convinced that running the tests on Nix would highlight the non-deterministic behavior of the tests feel free to add Nix to #16 or open a similar PR to prove it.

@dr-orlovsky
Copy link
Member

dr-orlovsky commented Oct 3, 2024

If you are convinced, than there is no issue, since I have no time or desire for re-convincing you in something you are sure. Since you are convinced and there is nothing to do, we can close this now, right?

@zoedberg
Copy link
Collaborator Author

zoedberg commented Oct 4, 2024

If you are convinced, than there is no issue, since I have no time or desire for re-convincing you in something you are sure

Now that #16 shows the behavior to be deterministic I am convinced, unless you show some new results that tell otherwise. I would be happier if you were now convinced as well, or provided some new data that can let us move forward in the debugging.

Since you are convinced and there is nothing to do, we can close this now, right?

This PR cannot be closed since the 4th transfer of the test is failing and the "fixing" PR (RGB-WG/rgb-std#272) produces a wrong consignment on the 3rd transfer. Therefore this needs to stay open until RGB-WG/rgb-std#275 gets solved and a new release containing the fix will be done.

@dr-orlovsky
Copy link
Member

I think I have found the reason there were less bundles in the consignments: RGB-WG/rgb-std@54f19cd#diff-59abbfa17998502bbb68f7980e463575b31ddeba39bd9f0635ac812575f7013bR1514-R1522

That fragment was removing terminal if there were more than one bundle per witness - which was the case for tapret/opret combined transfer. That's why the consignment was missing the bundles. And yes, transfer with missing bundles were succeeding since it was not invalid; and there are no checks on whether the assets are really moved with the transfer (except attempt to spend them later).

@zoedberg zoedberg merged commit 652630f into RGB-WG:master Nov 24, 2024
3 checks passed
Copy link

codecov bot commented Nov 24, 2024

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 36.42%. Comparing base (e53c33f) to head (652630f).
Report is 4 commits behind head on master.

Additional details and impacted files
@@            Coverage Diff             @@
##           master       #6      +/-   ##
==========================================
+ Coverage   36.37%   36.42%   +0.05%     
==========================================
  Files         281      279       -2     
  Lines       42390    42806     +416     
==========================================
+ Hits        15421    15594     +173     
- Misses      26969    27212     +243     
Flag Coverage Δ
rust 36.42% <ø> (+0.05%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.


🚨 Try these New Features:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants