From 49beacb85e1f021b38ca30cc48028e3c55e7f64d Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Mon, 15 Apr 2024 15:52:32 +0200 Subject: [PATCH 01/33] vm: change PcCs to PcAs --- src/vm/op_contract.rs | 45 ++++++++++++++++--------------------------- src/vm/opcodes.rs | 2 +- 2 files changed, 18 insertions(+), 29 deletions(-) diff --git a/src/vm/op_contract.rs b/src/vm/op_contract.rs index 6f50167d..9df5a5ed 100644 --- a/src/vm/op_contract.rs +++ b/src/vm/op_contract.rs @@ -125,27 +125,24 @@ pub enum ContractOp { /// this state does not exist, or either inputs or outputs does not have /// any data for the state, the verification fails. /// - /// If verification succeeds, doesn't changes `st0` value; otherwise sets it + /// If verification succeeds, doesn't change `st0` value; otherwise sets it /// to `false` and stops execution. #[display("pcvs {0}")] PcVs(AssignmentType), /// Verifies equivalence of a sum of pedersen commitments for the list of - /// outputs with a given owned state type against a value taken from a - /// global state. + /// assignment outputs to a value from `a64[0]` register. /// /// The first argument specifies owned state type for the sum operation. If /// this state does not exist, or either inputs or outputs does not have /// any data for the state, the verification fails. /// - /// The second argument specifies global state type. If the state does not - /// exist, there is more than one value, or it is not a u64 value, the - /// verification fails. + /// If `a64[0]` register does not contain value, the verification fails. /// /// If verification succeeds, doesn't change `st0` value; otherwise sets it /// to `false` and stops execution. - #[display("pccs {0},{1}")] - PcCs(/** owned state type */ AssignmentType, /** global state type */ GlobalStateType), + #[display("pcas {0}")] + PcAs(/** owned state type */ AssignmentType), /// All other future unsupported operations, which must set `st0` to /// `false` and stop the execution. @@ -171,7 +168,8 @@ impl InstructionSet for ContractOp { ContractOp::CnG(_, _) | ContractOp::CnC(_, _) | ContractOp::LdM(_, _) => bset![], - ContractOp::PcVs(_) | ContractOp::PcCs(_, _) => bset![], + ContractOp::PcVs(_) => bset![], + ContractOp::PcAs(_) => bset![Reg::A(RegA::A64, Reg32::Reg0)], ContractOp::Fail(_) => bset![], } } @@ -194,7 +192,7 @@ impl InstructionSet for ContractOp { ContractOp::LdM(_, reg) => { bset![Reg::S(*reg)] } - ContractOp::PcVs(_) | ContractOp::PcCs(_, _) => { + ContractOp::PcVs(_) | ContractOp::PcAs(_) => { bset![] } ContractOp::Fail(_) => bset![], @@ -213,7 +211,8 @@ impl InstructionSet for ContractOp { ContractOp::LdG(_, _, _) | ContractOp::LdC(_, _, _) => 8, ContractOp::LdM(_, _) => 6, - ContractOp::PcVs(_) | ContractOp::PcCs(_, _) => 1024, + ContractOp::PcVs(_) => 512, + ContractOp::PcAs(_) => 1024, ContractOp::Fail(_) => u64::MAX, } } @@ -370,19 +369,11 @@ impl InstructionSet for ContractOp { } } - ContractOp::PcCs(owned_state, global_state) => { - let Some(sum) = context.global.get(global_state) else { + ContractOp::PcAs(owned_state) => { + let Some(sum) = *regs.get_n(RegA::A64, Reg32::Reg0) else { fail!() }; - if sum.len() != 1 { - fail!() - } - if sum[0].value.as_inner().len() != 8 { - fail!() - } - let mut bytes = [0u8; 8]; - bytes.copy_from_slice(sum[0].value.as_inner()); - let sum = u64::from_le_bytes(bytes); + let sum = u64::from(sum); let Some(tag) = context.asset_tags.get(owned_state) else { fail!() @@ -423,8 +414,7 @@ impl Bytecode for ContractOp { ContractOp::LdG(_, _, _) | ContractOp::LdM(_, _) => 4, - ContractOp::PcVs(_) => 3, - ContractOp::PcCs(_, _) => 5, + ContractOp::PcVs(_) | ContractOp::PcAs(_) => 3, ContractOp::Fail(_) => 1, } @@ -447,7 +437,7 @@ impl Bytecode for ContractOp { ContractOp::LdM(_, _) => INSTR_LDM, ContractOp::PcVs(_) => INSTR_PCVS, - ContractOp::PcCs(_, _) => INSTR_PCCS, + ContractOp::PcAs(_) => INSTR_PCAS, ContractOp::Fail(other) => *other, } @@ -508,9 +498,8 @@ impl Bytecode for ContractOp { } ContractOp::PcVs(state_type) => writer.write_u16(*state_type)?, - ContractOp::PcCs(owned_type, global_type) => { + ContractOp::PcAs(owned_type) => { writer.write_u16(*owned_type)?; - writer.write_u16(*global_type)?; } ContractOp::Fail(_) => {} @@ -577,7 +566,7 @@ impl Bytecode for ContractOp { } INSTR_PCVS => Self::PcVs(reader.read_u16()?.into()), - INSTR_PCCS => Self::PcCs(reader.read_u16()?.into(), reader.read_u16()?.into()), + INSTR_PCAS => Self::PcAs(reader.read_u16()?.into()), x => Self::Fail(x), }) diff --git a/src/vm/opcodes.rs b/src/vm/opcodes.rs index 46e7bdd8..a5bb9ca2 100644 --- a/src/vm/opcodes.rs +++ b/src/vm/opcodes.rs @@ -44,7 +44,7 @@ pub const INSTR_LDM: u8 = 0b11_001_010; // Reserved 0b11_001_111 pub const INSTR_PCVS: u8 = 0b11_010_000; -pub const INSTR_PCCS: u8 = 0b11_010_001; +pub const INSTR_PCAS: u8 = 0b11_010_001; // Reserved 0b11_010_010 // Reserved 0b11_010_011 pub const INSTR_CONTRACT_FROM: u8 = 0b11_000_000; From 6d2567dbd19f256dbe6b91c8cb98eb4d9aadddb9 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Mon, 15 Apr 2024 15:58:56 +0200 Subject: [PATCH 02/33] vm: add PcIs operation for a sum of pedersen commitments from inputs --- src/vm/op_contract.rs | 75 ++++++++++++++++++++++++++++++++----------- src/vm/opcodes.rs | 2 +- 2 files changed, 57 insertions(+), 20 deletions(-) diff --git a/src/vm/op_contract.rs b/src/vm/op_contract.rs index 9df5a5ed..7acf0862 100644 --- a/src/vm/op_contract.rs +++ b/src/vm/op_contract.rs @@ -128,7 +128,7 @@ pub enum ContractOp { /// If verification succeeds, doesn't change `st0` value; otherwise sets it /// to `false` and stops execution. #[display("pcvs {0}")] - PcVs(AssignmentType), + Pcvs(AssignmentType), /// Verifies equivalence of a sum of pedersen commitments for the list of /// assignment outputs to a value from `a64[0]` register. @@ -142,7 +142,21 @@ pub enum ContractOp { /// If verification succeeds, doesn't change `st0` value; otherwise sets it /// to `false` and stops execution. #[display("pcas {0}")] - PcAs(/** owned state type */ AssignmentType), + Pcas(/** owned state type */ AssignmentType), + + /// Verifies equivalence of a sum of pedersen commitments for the list of + /// inputs to a value from `a64[0]` register. + /// + /// The first argument specifies owned state type for the sum operation. If + /// this state does not exist, or either inputs or outputs does not have + /// any data for the state, the verification fails. + /// + /// If `a64[0]` register does not contain value, the verification fails. + /// + /// If verification succeeds, doesn't change `st0` value; otherwise sets it + /// to `false` and stops execution. + #[display("pcis {0}")] + Pcis(/** owned state type */ AssignmentType), /// All other future unsupported operations, which must set `st0` to /// `false` and stop the execution. @@ -168,8 +182,8 @@ impl InstructionSet for ContractOp { ContractOp::CnG(_, _) | ContractOp::CnC(_, _) | ContractOp::LdM(_, _) => bset![], - ContractOp::PcVs(_) => bset![], - ContractOp::PcAs(_) => bset![Reg::A(RegA::A64, Reg32::Reg0)], + ContractOp::Pcvs(_) => bset![], + ContractOp::Pcas(_) | ContractOp::Pcis(_) => bset![Reg::A(RegA::A64, Reg32::Reg0)], ContractOp::Fail(_) => bset![], } } @@ -192,7 +206,7 @@ impl InstructionSet for ContractOp { ContractOp::LdM(_, reg) => { bset![Reg::S(*reg)] } - ContractOp::PcVs(_) | ContractOp::PcAs(_) => { + ContractOp::Pcvs(_) | ContractOp::Pcas(_) | ContractOp::Pcis(_) => { bset![] } ContractOp::Fail(_) => bset![], @@ -211,8 +225,8 @@ impl InstructionSet for ContractOp { ContractOp::LdG(_, _, _) | ContractOp::LdC(_, _, _) => 8, ContractOp::LdM(_, _) => 6, - ContractOp::PcVs(_) => 512, - ContractOp::PcAs(_) => 1024, + ContractOp::Pcvs(_) => 1024, + ContractOp::Pcas(_) | ContractOp::Pcis(_) => 512, ContractOp::Fail(_) => u64::MAX, } } @@ -357,7 +371,7 @@ impl InstructionSet for ContractOp { regs.set_s(*reg, Some(meta.to_inner())); } - ContractOp::PcVs(state_type) => { + ContractOp::Pcvs(state_type) => { let inputs = load_inputs!(state_type); let outputs = load_outputs!(state_type); if !secp256k1_zkp::verify_commitments_sum_to_equal( @@ -369,7 +383,7 @@ impl InstructionSet for ContractOp { } } - ContractOp::PcAs(owned_state) => { + ContractOp::Pcas(owned_state) => { let Some(sum) = *regs.get_n(RegA::A64, Reg32::Reg0) else { fail!() }; @@ -392,6 +406,28 @@ impl InstructionSet for ContractOp { } } + ContractOp::Pcis(owned_state) => { + let Some(sum) = *regs.get_n(RegA::A64, Reg32::Reg0) else { + fail!() + }; + let sum = u64::from(sum); + + let Some(tag) = context.asset_tags.get(owned_state) else { + fail!() + }; + let sum = RevealedValue::with_blinding(sum, BlindingFactor::EMPTY, *tag); + + let inputs = [PedersenCommitment::commit(&sum).into_inner()]; + let outputs = load_inputs!(owned_state); + + if !secp256k1_zkp::verify_commitments_sum_to_equal( + secp256k1_zkp::SECP256K1, + &inputs, + &outputs, + ) { + fail!() + } + } // All other future unsupported operations, which must set `st0` to `false`. _ => fail!(), } @@ -414,7 +450,7 @@ impl Bytecode for ContractOp { ContractOp::LdG(_, _, _) | ContractOp::LdM(_, _) => 4, - ContractOp::PcVs(_) | ContractOp::PcAs(_) => 3, + ContractOp::Pcvs(_) | ContractOp::Pcas(_) | ContractOp::Pcis(_) => 3, ContractOp::Fail(_) => 1, } @@ -436,8 +472,9 @@ impl Bytecode for ContractOp { ContractOp::LdC(_, _, _) => INSTR_LDC, ContractOp::LdM(_, _) => INSTR_LDM, - ContractOp::PcVs(_) => INSTR_PCVS, - ContractOp::PcAs(_) => INSTR_PCAS, + ContractOp::Pcvs(_) => INSTR_PCVS, + ContractOp::Pcas(_) => INSTR_PCAS, + ContractOp::Pcis(_) => INSTR_PCIS, ContractOp::Fail(other) => *other, } @@ -497,10 +534,9 @@ impl Bytecode for ContractOp { writer.write_u4(u4::ZERO)?; } - ContractOp::PcVs(state_type) => writer.write_u16(*state_type)?, - ContractOp::PcAs(owned_type) => { - writer.write_u16(*owned_type)?; - } + ContractOp::Pcvs(state_type) => writer.write_u16(*state_type)?, + ContractOp::Pcas(owned_type) => writer.write_u16(*owned_type)?, + ContractOp::Pcis(owned_type) => writer.write_u16(*owned_type)?, ContractOp::Fail(_) => {} } @@ -565,8 +601,9 @@ impl Bytecode for ContractOp { i } - INSTR_PCVS => Self::PcVs(reader.read_u16()?.into()), - INSTR_PCAS => Self::PcAs(reader.read_u16()?.into()), + INSTR_PCVS => Self::Pcvs(reader.read_u16()?.into()), + INSTR_PCAS => Self::Pcas(reader.read_u16()?.into()), + INSTR_PCIS => Self::Pcis(reader.read_u16()?.into()), x => Self::Fail(x), }) @@ -586,7 +623,7 @@ mod test { #[test] fn encoding() { let code = - [Instr::ExtensionCodes(RgbIsa::Contract(ContractOp::PcVs(AssignmentType::from(4000))))]; + [Instr::ExtensionCodes(RgbIsa::Contract(ContractOp::Pcvs(AssignmentType::from(4000))))]; let alu_lib = Lib::assemble(&code).unwrap(); eprintln!("{alu_lib}"); let alu_id = alu_lib.id(); diff --git a/src/vm/opcodes.rs b/src/vm/opcodes.rs index a5bb9ca2..ae22bbae 100644 --- a/src/vm/opcodes.rs +++ b/src/vm/opcodes.rs @@ -45,7 +45,7 @@ pub const INSTR_LDM: u8 = 0b11_001_010; pub const INSTR_PCVS: u8 = 0b11_010_000; pub const INSTR_PCAS: u8 = 0b11_010_001; -// Reserved 0b11_010_010 +pub const INSTR_PCIS: u8 = 0b11_010_010; // Reserved 0b11_010_011 pub const INSTR_CONTRACT_FROM: u8 = 0b11_000_000; pub const INSTR_CONTRACT_TO: u8 = 0b11_010_011; From 641a26064d42371237977ebe19204a83ad749795 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Mon, 15 Apr 2024 23:02:50 +0200 Subject: [PATCH 03/33] schema: add timestamp --- src/schema/schema.rs | 1 + src/stl.rs | 2 +- stl/RGB@0.1.0.sta | 166 +++++++++++++++++++++---------------------- stl/RGB@0.1.0.stl | Bin 18551 -> 18564 bytes stl/RGB@0.1.0.sty | 5 +- stl/Schema.vesper | 1 + 6 files changed, 89 insertions(+), 86 deletions(-) diff --git a/src/schema/schema.rs b/src/schema/schema.rs index 28884332..f2ea8720 100644 --- a/src/schema/schema.rs +++ b/src/schema/schema.rs @@ -176,6 +176,7 @@ pub struct Schema { pub flags: ReservedBytes<1, 0>, pub name: TypeName, + pub timestamp: i64, pub meta_types: TinyOrdMap, pub global_types: TinyOrdMap, pub owned_types: TinyOrdMap, diff --git a/src/stl.rs b/src/stl.rs index 86d832b0..b0fee8ef 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -35,7 +35,7 @@ use crate::{ /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB: &str = - "urn:ubideco:stl:36LPfKEfPcq357ua9BVuvYd7MvpF3EJEUsUPd3Rydbur#exhibit-berlin-chemist"; + "urn:ubideco:stl:EGAfKx8XqgxQV4spXziQHj1hXNuFckmgtn5df1YgrqGG#alfonso-journal-medusa"; fn _rgb_core_stl() -> Result { LibBuilder::new(libname!(LIB_NAME_RGB), tiny_bset! { diff --git a/stl/RGB@0.1.0.sta b/stl/RGB@0.1.0.sta index f8943b2e..1478352e 100644 --- a/stl/RGB@0.1.0.sta +++ b/stl/RGB@0.1.0.sta @@ -1,5 +1,5 @@ -----BEGIN STRICT TYPE LIB----- -Id: urn:ubideco:stl:36LPfKEfPcq357ua9BVuvYd7MvpF3EJEUsUPd3Rydbur#exhibit-berlin-chemist +Id: urn:ubideco:stl:EGAfKx8XqgxQV4spXziQHj1hXNuFckmgtn5df1YgrqGG#alfonso-journal-medusa Name: RGB Dependency: ACBoDKVqDSuPrZLs2W2bLVj2TnpThzUMcJJrC3GhsQ79#idea-judo-benny Dependency: APYERRUMyWqLadwTv8tEFifHMPGpL3xGFSBxwaKYpmcV#square-mammal-uncle @@ -7,7 +7,7 @@ Dependency: EcCNgrgLaygt3tCZNu2ZVEzMzSAZYEUeTNAVi5E81YWi#aspirin-mango-average Dependency: GCWLX5TjFmMDCJr5cxWtwoSajBWDWbkQVSuTNbrtD1tg#egypt-wedding-cupid Dependency: HX2UBak8vPsTokug1DGMDvTpzns3xUdwZ7QJdyt4qBA9#speed-atlanta-trilogy Dependency: HhQGTxbqQpEbkdHmsBKbPxfgA6VNdDAGeg3gzd9CmF1m#taboo-gregory-solar -Checksum-SHA256: 36878b515c9fe483bc03046f95c1baf17882da63e004dfcdac68eae7caba1c00 +Checksum-SHA256: 12c2938d7ff7eb6359515f97330daa4db976c014ca9514a079d41147b0fe1f95 15!sq28fo&ct3_)YGXT|b>aC*shoymRs3H5hBe!;F2TcrPzzIZa%p39RC#b^bBlj Q3Je7NO;7qcAK}c{PZGxV*AUa!)kyl4Y*|3I0tG>AbyiKvEFN!zncXl9K5w2;FV{ @@ -181,8 +181,8 @@ C0000000000000000{{R300000026Aa}^IL_yb)N?~LW;<=;2Rt!{5uU 9u?fDdBZW6z3S&a&ziLbG4&=Ys$?40000000030|Ns9000004WMOn+00{w2TLZ8P (BXv3rGHFj0R(MAdAZ%oI62v!yKR~2&CeYG0000000030|Ns9000006VRUq1V`u; g0l}HI1f*k?vhZiL-XlN$-gNV!Z000000RR90{{R30018 -8IZgg^CV{}Pm1pxpD002NB01ZQLZgg^CV{}t=VRU5%0tRzqXk~3-0VWHxQRlx=&V -Jw~RKNl4CLNJETt2ZbZ*5YRd~0io%0m_t=@oDfa}Mus-s1pI@w^? +8IZgg^CV{}Pm1pxpD002NB01ZQLZgg^CV{}t=VRU5%0tRzqXk~3-0SFr#%Z;d`@< +KgVbnH?;Ug4W*kR{t3;Z1GYB%>$TatCN>b98TVc>%0m_t=@oDfa}Mus-s1pI@w^? tNjxrm(0{wq=fUjdlq{VRT_rbYXO51pxpE002M$0000000030{{R3000008L}Fu5 a&K>D1OfpDbYXCEWpn@q0Rs3Ghvn`0*IT6CPhzu+Zs4ws2QBQ{vi(LhXZn2X`ZN! =ADBNH?W>M^%H|xc>sh|Dn*!v8^Ea7rh?dzC2n+%RZ*X#DbN~eb0{9e%`Tcq @@ -291,87 +291,87 @@ h2&00<0HWp-s@Y-MCbVRT^z0tI$qY;|P;GM-jZ2Kh}DE2o;HYydTtf}Q!WH{}bI! u)W*#(e~Z1ao0*bN~Pl5K?7!WnpY(WJYyvXK7+=Wd;KUc42IFWdWv)Fp)<~$~wYg jK`HkjV#@&#T1_fGnK3MJXK)_7bXZ|Y-w&}X>Ml$g}C@DyY!@{4YR*LMYs=?Zg_* ktx|21^lzg9sBTBv19V|$0m+Y=slx_K8vXre8<)H){QgX6j~{c$E$eY_=V_ZFuLe -_NXk~3-1`7jbW_AJEn^6;37FKqUhx?i3R+Mr!fY&(;2BFL(m@EZk_srD=W^7?+a{ +_NXk~3-1`GpcW_AJEn^6;37FKqUhx?i3R+Mr!fY&(;2BFL(m@EZk_srD=W^7?+a{ }Sf-5feW*SKg&%h~b$G{NN>LxBDo)YaDXjV8yEYGsr6V0dsu5sjwLjgQcrOsaG1F {QvR+LMR3-^ZN{xOxO`VQpmsh?d8AKZaXsV>_O8;rU6aoQ7jn{9gWsHQTT*!NY-2 -lDms;Mx<1w$-3J3B_ALc8OsGork`WEFmfKh*eS=_32kL`VN`i=Wpe-u0d?d}_}|W -p0vpvv$c&#PW69R$ltr%da5t5w^x+8!q5_DP$9O-6TWVuFo^|2*NvWKMV^#cK{)R -Q%ur9&FflzA%qZFQ|l>ioJpYH;+t0eX2w~A!Q+0eaZ{MVycPK^Kn000000093000 -000000YTY;R&=Y*cx0Wpe-u0oCr34oQf!Y4K`P(FaQVwIle)QgI&pHa%8Z1>xis% -K_g{UD)~8A`MB56fuKVLH|(nUe={6PmCJYdcneig@gbA000000093000000000Va -cWz~5RC#b^a{vkfhyLPaScq)s9KMExvw34D6J>+NwrBxfixd_%u|$Wt0VPFrzQMU -~Cv3(oCX8r!*SiR9zOp;)>$$b(q=dpw@&Et;000000RI300000001S3vY-Mg^c~p -6DWpe-t0Y>fS!w4MxxaL=+DqP^k2!wz9AHH68xp8!<%Jqp^&Hw-a000000RI3000 -00000(DfZe??6a{(Ag)zidWvABmX&uCxQ{9vUAsn@)h(<^=)@3p(i4Fw8icywiMb -7^mGa{vkfWOW`wsTH9-LlJ`2|Ay5Z(?oEikl{+~pis;@Q*TJ#0Rw0P%&6V>N}#h9 -55#ht!=;R2Lj=uo+MI7C_W0!u+yDRo000000RI300000001I?-VQzD2bZKvHa{vk -fG*S<)6P6lYy(#<=BR_>s@(?%#f7ArN-=Rj?7Ns(10d}<;Xp5rzopjE#5h98`u~h -0v`BV8NkLOrpFzp4z*Z=?k000000RI3000000010Gec4cgDaAk4<52{I*HQw0*Hf -%sJ77^l=Ml>CaAJ#>#uY3^=3;^Ib2vcKdWo=@6CZ -UzbiW@dH)+M7`mSQb`xkca!3baG*1bV+0Z -p9m~TI>-W|y2ahx3nF|Vuawki#7NH?S|Q-Q!u2{b4s>#1ZgXjLX>V>+d2nR`G*S< -)6P6lYy(#<=BR_>s@(?%#f7ArN-=Rj?7Ns(12yJC_VPs)+VFC4eO*mP8`7qV21dn -rCyk{{a-lF$FG0V5TNAc?Tc{K-TY;R&=Y;ytH_t7`^M?JbaMfzqIy@8$eYR~OKp92)%PJ48iGR>vvBgJ_74J{JehzCV -RLh7XKrm}Zgg`2paMVhWqNlC78^@LR -Wpe@Dg=PS6VPp{$?vC--s`v@B8YHl)C#jpVFzBk!DMw8Sc42I3WMOn~asuJe-5fe -W*SKg&%h~b$G{NN>LxBDo)YaDXjV8yEYGsr6V0dsu5sjwLjgQcrOsaG1F{QvR+LM -R3-^ZN{xOxY7X>@L7b8`aW(cK(6LD#rwNz2*s{WQVl8bg5o8r0R+^o=IRl4@nkxG -g*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%ORB~Z%b7^#GZ*D?$Ze(m_1_KLYY -;SXAO=WawZ)5`a6o=*Q`PW;d-cMq)i*DeqjR!64+OqvdG-vvJ?D{k=w-6<{ZeNoKcy!1~?PoRaGZX>M?JbWLG!0Tr2NWXrXyKnGOwA#t$mH2bG -7pQ)aE=^FQF!@KkQh!AUTZ+C7~a$#@6CZgT(%0hP$+dLDIRU(}XWLTZugenO -C;Z(5k~zEJnJiX;;E#Q|2(Iq5Tio4{G+8Pm0)7;l&Fu6+?N3W00 -0000096000000000nFa$#@6CZc}4uWo=;w1_*6sbYWy+bYTDq0d?d}_}|Wp0 -vpvv$c&#PW69R$ltr%da5t5w^x+8!q5uE@000000RI300000000(DmZ(?C=a{vkf -)$WoGNrn+a000000RI300000000wDpaCLNZ015$z{^Dg=h-~N_zJ` -Red1EINWrM}GXaQb}6c#qIM2EQnHo-KZ`k;Xmr`<4sJYKN!!u{G5u+^j1lf!PF4> -GEG0000000000{{R30000003t@9}X=iS2Wo~qH015$z{^Dg=h-~N_zJ`Red1EINW -rM}GXaQb}6c#qIM2EQnHo-KZ`k;Xmr`<4sJYKN!!u{G5u+^j1lf!PF4>GEG00000 -00000{{R300000033g#@Wo~0>Wpe-t0Y>fS!w4MxxaL=+DqP^k2!wz9AHH68xp8! -<%Jqp^&Hw-a000000RI3000000010+sY-wa+bZ>G11OfmAZf|a7000011aog~WdH ->M0*ik}3Je7NO;7qcAK}c{PZGxV*AUa!)kyl4Y*|3I0&VZ1CgHqw;r~cW`-Qb7^w`1pxtK`+K#qzWIuZB~swJGfw6|B_HlQ!mM%%KtuNzUUtR-3UqQ| -ZgXjLX>V=-1p)z|2rNlD$O59e#ogQsB77jPl+h5j^*S;EG*S<)6P6l -Yy(#<=BR_>s@(?%#f7ArN-=Rj?7Ns(10tsb!bY*UHX>V=-1p)z|2rNlD$O59e#og -QsB77jPl+h5j^*S;EWOW`wsTH9-LlJ`2|Ay5Z(?oEikl{+~pis;@Q* -TJ#8dQ03Wn@8fb7^O8b3$xsZe&wsVQf@*P;_zx1ON+UWn*k%a$$67c4Yts0RRXAI -VbbqN^4g)WDG0#SSGl-+Q@e<+6H_!d>A}?>eLb#i5700jX62myf}=a&wUzgq*nHzp%O_gxL;Ro0E2(0000000000|Nj60000008B}?2Wn@8fb7^O8b -3$xsZe&wsVQf@*X=DTh01ISgV{Bn^VRUJBWdH>M00;q-z?57PmRE;x*JyQZ??N1% --?X%h&UrM00;s9(nsc -pRQseH2M_=0H1c!=>Px#000000R -R60000000RIYMbaY{3Xl-R~bN~eb00;reGP>7z&ZQf?Gib;@a|Hna2?0j!=EDda{kY~=q$*tC -#t4Le{2#tvcDZqMsmk?c;Wd#8M000eFX>@L7b8|s%V`y)31_BCqX>@L7b8}B}WC6k+?A!p;zT) -eT0-JI=`>_zfHkawo185nP6{Z9SY03$AX>@L7b8|^#0f}o^CC$c=UszhlV5m?Ru@ -{iVU*wrVdeH+Q@FPbX@d{UIbZ%vHb5C+)1OfmDZ*D_qVQFpv1pxsLzqsuE6j(!OVQFqcY-w&}Q)OXnRCrKyas&bZ2V!Y-V{d7 -000jX8_!Nib?fKVRq~1?rvx{!vu8jvR?Ao&ZMl@&oeC+x(MklB)P_)|`Y=H7dO_e -!^G2i>0SdC0NppV!6v|_i_0S0Voadl~A00jX8_!Nib?fKVRq~1?rvx{!vu8jvR?A -o&ZMl@&oeC+x(MklB)P_)|`Y=H7dO_e!^G2i>0SdC0NppV!6v|_i_6IerNVQFqcY --w&}Q)OXnRCsA*1OfmDVrg_^Z)t7-1pxy16o=*Q`PW;d-cMq)i*DeqjR!64+Oqvd -G-vvJ?D{mY#&NEOd)wn+n#11fGQ~$X901P7x>0daZB@{PThHqO25f0@b!lV(1pxy -16o=*Q`PW;d-cMq)i*DeqjR!64+OqvdG-vvJ?D{mY#&NEOd)wn+n#11fGQ~$X901 -P7x>0daZB@{PThHqjSVL%GX>LV$aBOK~X>?O%VQf@*X=DTf00&}ebYpL6ZU6-V0{ -9e%`TcqAkVzY~G;I54aE$rH|{YErr`h4vAGy~N%kn2QsifIWLvZbUw81NwsG -jgonnp^pYSe+vyeE|k+X>oOFWB>&L0{9e%`TcqAkVzY~G;I54aE$rH|{YErr -`h4vAGy~N%kn2QsifIWLvZbUw81NwsGjgonnp^pYSe+vyeGphfXklq?Q)OdvWpq< -zVQd5f00&}ebYpL6ZU6-V0{9e%`TcqAkVzY~G;I54aE$rH|{YErr`h4vAG-w -&?yw$T9tCzEwrAszt-P)%HZ|LbH=L2A=l(W4CP5}mNX>oOFWB>&L0{9e%`Tc -qAkVzY~G;I54aE$rH|{YErr`h4vAG-w&?yw$T9tCzEwrAszt-P)%HZ|LbH=L2A=l -(W4CP6}8jc*fjc*f~Wpi|4ZEyepNC|CabYWC +^aAk7<3ITQGP59r=ivk$P>NY&HCT(P)^FVARS*Zg3m2dUS*m(weL9 +PhQe$_)hyWq5RDZgXjGZgT(%0c3R^La7y@JVOzJ)&GXo9MeQ_qmbcB?4VH0I#X{* +-T?z>0?er0_e!9%6%WL6o5Q7yVM7GXa@w44CHDB`4cq_#000000093000000000Y +ga$#@6CZgT(%0W?w%t`n9TUcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXaRP$8)% +E7`<-;ovk@YSJ+V~kNcmIwC6DJ=V=(On#Ml4;000000093000000000SOWp-t3Z* +XOD0S~H4mo?tm0ybD+0ot2U6Id2jc94hrndMfLayEe1ISdA&%p{mB1!VWk +)e2*8Zgg^CV{}Pm0iOsgNjk^^qPoT1+zTRnAg`3vXv9d*8d@RXy~6c6G7fZdVQzD +2bZKvHRC#b^0W?w%t`n9TUcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXb5d(bYWy+bYT +JYdQCW4e)%xftOSp9TD)g5B;KO;Krzd=y+`rt_<1!4XKZg`VQg~&+V{~n_vCwKmU +M9ZPku*a@b)#*ne?8Y=L^y0a6WSn25D|^b#!w9siJyUlgOLOB};96cGdSG6&iv=7 +PD~jruGj4o;;a=3t@9}X=iS2Wo~qH0iXgu^JRK>3KknnLsqhlVJsk2VEKBm*V?S! +>C(%{wF!1%Y-Mg^X=QT(-GycVZ((E+6z-1k*Q)plvl=9@swb(NvM}hX&nZVu33g# +@X=Gt^Z*l_R(cK(6LD#rwNz2*s{WQVl8bg5o8r0R+^o=IRl4@m>_h5K%L=laq&yA +1JoJ^{7>oKLkF4~iax8KK|47hp+cWHEPWpi@^;nCe3IziXCXi3Z2@%=QxV>qb#7#AWd;KaV{C78Wld#tXm4Z!_!Nib?fKVRq~1?rvx{!vu8jvR?Ao&ZMl@&o +eC+x(F1HXRxo%|^+Itiop&gxXSvq){{YhrGf57_P)SQy*2x)F`b#zT(Z~+yWXJpH +@t3U@-^C5At>@@qQFQ2KNd+8eYXv4en`-l*0Zf|#PRB~Z%b7^#GZ*Fq{3IUbK=6W +7=VqesjRYGc!>wZFzp>JB4@xD;^wu&SY_r(EL(ByDBrY@9gIGgwCwGg91xcsA~D3 +xGh@06&Ij@*|40000000030{{R300000GRB~Z%b7^#GZ*Eg#Xk~3-1_lUiWprU=V +RT^t2?2HFP59r=ivkxis%Ku=2wF+7z(Wqt=tdZk`V^s(Ana000000093000000000JQZg6#Ua{v +kfhyLPaScq)s9KMExvw34D6J>+NwrBxfixd_%u|$Wt0XD%jq57bK6Q|uUfIMEX^1 +}Vv6tLB!)|10-o)0prc>n+a000000RI300000001IJrb7^O8ZDnqBa{vkfhyLPaS +cq)s9KMExvw34D6J>+NwrBxfixd_%u|$Wt0XD%jq57bK6Q|uUfIMEX^1}Vv6tLB! +)|10-o)0prc>n+a000000RI3000000010+sY-Mg^X=QT&2?0j!=EDda{kY~=q$*t +C#t4Le{2#tvcDZqMsmk?8*VRb+m26o+wgPSMp( +f$Hb>aU=OZ$bvG|>z)+>9PT;Au-7)~D;-++hw>a$#@6CZd7@2Wd#8M00ItFd +2nSzZ*6U9bZupBbOZwc2WMq&WpinB00jX7V*7iwvA+3=iX~Fux-(AZKP4aTJi@GU +3P3~m7hZP80Sa_-VQzD2bZKvH00ja8p9m~TI>-W|y2ahx3nF|Vuawki#7NH?S|Q- +Q!u2{b0W?w%t`n9TUcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXaWgkcywiMb7^mG00j +a8p9m~TI>-W|y2ahx3nF|Vuawki#7NH?S|Q-Q!u2{b0c3R^La7y@JVOzJ)&GXo9M +eQ_qmbcB?4VH0I#X{*-WpVSaAjmcb8~5DZgWCxX>MdwWnpYocu;h51OxyJWMyM)V +RB(~X?A4*1pxpE0XZl0-%4v&H)ISe_*f>my4uKhF4_isHhdU7d+OQBHUIzs00000 +0RR6000000009VQb#7;AVr*pq1pxpE0oujs9mwqd!6t9MpF6k$l8zT&IM0)BxIjD +ir5zArRR910000000RR600000000IhgbaHiLbairNWB>&L00;qr9_N=1kiT6@?qi +UXo4Z8}iXVUo?CzP|ak(fG&*D)40000000030{{R30000303So3~VPj}*Wo~o;1p +xpE0p68`B?zIHIzl+9&PlG`zw1fUvcIspB!t-xS(}q~od5s;000000RR60000000 +2x$yaAjmcb8~5DZgWCxX>MdwWnpYocxhw=1ON+UWn*k%a$$67c4Yts0RRXAlfaZ* +5|&qoaMx&cZSO)Ho!_*yjLvyQo1^f$X+6j;0000000000|Nj60000000SIPwZf9v +?Y-Ioi0RRXA|I$b1hgAEd90w2pG9y@ZJ!C|rt0b}t8>GVedrqOk0000000000|Nj +60000000t$0Lb#i5700jX62mxA;a|tC)BU>oS@xONigke(HCtahRyiRHf-T +Wpf1q00{v` +?dHP>9R0ZFSEMRj;Km4qfBYZ5UUs>0bg9bqiCNA70000000030000000000BR$** +qZew{=d2nR~0RR93307}uWK(oubY%qr0000DS7~%^Wpi^uZewU~as~nlcWHEPWpi +^+a%2I*9_-uz)4t;Cj{=)=I{UE@z&4lZ&jV-~loh4~2WiR)cWHEPWpi^$WC4k5SS +8KIkY89@$6%;X7qJ(R#b4x^L3+^xAn+qc8}SNPX>@L7b8}B}WCQ{L2XAgeXklq?0 +0jX74!^kVIAU(3gSs^H6!}zj=~mfCH51$?7#2KZw&97f0SIqqWI@j018)W +bZ%vHb5L({1_B0XWoc(~Wpi|4ZEyepNEBE@Xklq?LTqVnWK(5fY*ct +qbaDg&00&}ebYpL6ZU6-V0{9e%`TcqAkVzY~G;I54aE$rH|{YErr`h4vAG)5 +<=E>N`F8f<{_M@^MEhcVy#omh=bI-rl&{j_4Y)d2=oOFWB>&L0{9e%`Tc +qAkVzY~G;I54aE$rH|{YErr`h4vAG)5<=E>N`F8f<{_M@^MEhcVy#omh=bI-rl&{ +j_4Y)e~4lXklq?LTqVnWK(5fY*ct@WCQ{L2V!Y-V{d7000jX8_!Nib?fKVRq~1?r +vx{!vu8jvR?Ao&ZMl@&oeC+x(u*Pw&hI`xNV4B0;>oUbhHyi-Y#=22)QEgSwgoUbhHyi-Y#=22)QEgSwg?<6X>I@o0Rs3Ghvn`0*IT6CPhzu+Zs4ws2QBQ{vi(LhXZn2X`ZNR8G?42=b +&6>T7_z0LJs9vI3^Q`9-kMwahgh8>BYgn|Y-w?IX=DHe0Rs3Ghvn`0*IT6CPhzu+ +Zs4ws2QBQ{vi(LhXZn2X`ZNR8G?42=b&6>T7_z0LJs9vI3^Q`9-kMwahgh8>BYhB +9Lug@XZc}Ara%FT=WnpXt0sseMX>?<6X>I@o0Rs3Ghvn`0*IT6CPhzu+Zs4ws2QB +Q{vi(LhXZn2X`ZQ=6>%7&o7^|1Fn59cLW!>7R25;!;B%7&o7^|1Fn59cLW +!>7R25;!;B#Kd;Rz-U= +aO9W+B0S0Voadl~A00jX8^=uPjBlbC`N(qzPM@Gr{imSMTSY5T*7C#t%#3&jHqk= +;7%h%D+p%U7S;b1RT)c9`>#Kd;Rz-U=aO9W+B -----END STRICT TYPE LIB----- diff --git a/stl/RGB@0.1.0.stl b/stl/RGB@0.1.0.stl index b6c0dd40aa948ffb18498749226bbcf67e296604..df6cd4cf6e09264353c043e472d3ba59f145e03f 100644 GIT binary patch delta 75 zcmV-R0JQ)2kO72|0kDxGAP5^9%Z;d`@$Ta ^ ..0xff StrictTypes.SemId#cargo-plasma-catalog} , globalTypes {GlobalStateType -> ^ ..0xff GlobalStateSchema} , ownedTypes {AssignmentType -> ^ ..0xff OwnedStateSchema} diff --git a/stl/Schema.vesper b/stl/Schema.vesper index 46aad780..fa7e38ee 100644 --- a/stl/Schema.vesper +++ b/stl/Schema.vesper @@ -35,6 +35,7 @@ Schema rec ffv is U16 aka=Ffv flags bytes len=1 aka=ReservedBytes1 name ascii len=1..100 aka=TypeName charset=AlphaCapsLodash + timestamp is I64 metaTypes map len=0..MAX8 key is U16 aka=MetaType value bytes len=32 aka=SemId From 24283042b45fa33bdc008bc867920f89701e2d1d Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Tue, 16 Apr 2024 12:00:13 +0200 Subject: [PATCH 04/33] schema: add reserved fields --- src/contract/commit.rs | 8 +- src/schema/schema.rs | 6 +- src/stl.rs | 2 +- stl/RGB@0.1.0.sta | 679 +++++++++++++++++++++-------------------- stl/RGB@0.1.0.stl | Bin 18564 -> 18688 bytes stl/RGB@0.1.0.sty | 12 +- stl/Schema.vesper | 3 +- stl/Transition.vesper | 2 +- 8 files changed, 361 insertions(+), 351 deletions(-) diff --git a/src/contract/commit.rs b/src/contract/commit.rs index be65ba86..b79e700b 100644 --- a/src/contract/commit.rs +++ b/src/contract/commit.rs @@ -278,7 +278,7 @@ pub struct OpCommitment { pub redeemed: StrictHash, pub valencies: StrictHash, pub witness: MerkleHash, - pub script: StrictHash, + pub validator: StrictHash, } impl Genesis { @@ -302,7 +302,7 @@ impl Genesis { redeemed: Redeemed::default().commit_id(), valencies: self.valencies.commit_id(), witness: MerkleHash::void(0, u256::ZERO), - script: self.validator.commit_id(), + validator: self.validator.commit_id(), } } @@ -321,7 +321,7 @@ impl Transition { redeemed: Redeemed::default().commit_id(), valencies: self.valencies.commit_id(), witness: MerkleHash::void(0, u256::ZERO), - script: self.validator.commit_id(), + validator: self.validator.commit_id(), } } } @@ -338,7 +338,7 @@ impl Extension { redeemed: self.redeemed.commit_id(), valencies: self.valencies.commit_id(), witness: MerkleHash::void(0, u256::ZERO), - script: self.validator.commit_id(), + validator: self.validator.commit_id(), } } } diff --git a/src/schema/schema.rs b/src/schema/schema.rs index f2ea8720..7d8502d6 100644 --- a/src/schema/schema.rs +++ b/src/schema/schema.rs @@ -177,6 +177,8 @@ pub struct Schema { pub name: TypeName, pub timestamp: i64, + pub developer: Identity, + pub meta_types: TinyOrdMap, pub global_types: TinyOrdMap, pub owned_types: TinyOrdMap, @@ -185,7 +187,7 @@ pub struct Schema { pub extensions: TinyOrdMap, pub transitions: TinyOrdMap, - pub developer: Identity, + pub reserved: ReservedBytes<8, 0>, } impl CommitEncode for Schema { @@ -205,6 +207,8 @@ impl CommitEncode for Schema { e.commit_to_map(&self.transitions); e.commit_to_serialized(&self.developer); + + e.commit_to_serialized(&self.reserved); } } diff --git a/src/stl.rs b/src/stl.rs index b0fee8ef..51bba350 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -35,7 +35,7 @@ use crate::{ /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB: &str = - "urn:ubideco:stl:EGAfKx8XqgxQV4spXziQHj1hXNuFckmgtn5df1YgrqGG#alfonso-journal-medusa"; + "urn:ubideco:stl:7kcfYU9L6bj6FdcZeBWgxLj5gPd6prrmbh7UwQdBEAq2#roof-plume-final"; fn _rgb_core_stl() -> Result { LibBuilder::new(libname!(LIB_NAME_RGB), tiny_bset! { diff --git a/stl/RGB@0.1.0.sta b/stl/RGB@0.1.0.sta index 1478352e..b186f5c7 100644 --- a/stl/RGB@0.1.0.sta +++ b/stl/RGB@0.1.0.sta @@ -1,5 +1,5 @@ -----BEGIN STRICT TYPE LIB----- -Id: urn:ubideco:stl:EGAfKx8XqgxQV4spXziQHj1hXNuFckmgtn5df1YgrqGG#alfonso-journal-medusa +Id: urn:ubideco:stl:7kcfYU9L6bj6FdcZeBWgxLj5gPd6prrmbh7UwQdBEAq2#roof-plume-final Name: RGB Dependency: ACBoDKVqDSuPrZLs2W2bLVj2TnpThzUMcJJrC3GhsQ79#idea-judo-benny Dependency: APYERRUMyWqLadwTv8tEFifHMPGpL3xGFSBxwaKYpmcV#square-mammal-uncle @@ -7,7 +7,7 @@ Dependency: EcCNgrgLaygt3tCZNu2ZVEzMzSAZYEUeTNAVi5E81YWi#aspirin-mango-average Dependency: GCWLX5TjFmMDCJr5cxWtwoSajBWDWbkQVSuTNbrtD1tg#egypt-wedding-cupid Dependency: HX2UBak8vPsTokug1DGMDvTpzns3xUdwZ7QJdyt4qBA9#speed-atlanta-trilogy Dependency: HhQGTxbqQpEbkdHmsBKbPxfgA6VNdDAGeg3gzd9CmF1m#taboo-gregory-solar -Checksum-SHA256: 12c2938d7ff7eb6359515f97330daa4db976c014ca9514a079d41147b0fe1f95 +Checksum-SHA256: b9ab11613ba6af2c4f2b028e4c90de337629d23885f11a70da8e092ae17a1831 15!sq28fo&ct3_)YGXT|b>aC*shoymRs3H5hBe!;F2TcrPzzIZa%p39RC#b^bBlj Q3Je7NO;7qcAK}c{PZGxV*AUa!)kyl4Y*|3I0tG>AbyiKvEFN!zncXl9K5w2;FV{ @@ -32,346 +32,349 @@ RL9-tl4elKTgFI*|CjhfZ7VH>n$b={WmS6zNkSNp5sya&BR4P;0g`38@&rwvr8Q$XKK#ha*N>X+Ls92fzOv*E( ~7PRR#MWnpGkWpezYrz*aY{>_4@v6zr!BEn8~s;V{eB++vPW1tu=h*<|%Pi|~^P- -_fBZ*6U9bXH|@X=Zr@063mQh9?yTI7S;;e;>sZfv!yd427@;7veO2zMB=|GYU;*a +_fBZ*6U9bXH|@X=Zr^063mQh9?yTI7S;;e;>sZfv!yd427@;7veO2zMB=|GYU;*a %*g5NMUnmZLh7x^`{^P$fKg#%8c8X#<$(NgM!uni2C|Kr}onZ3R84)X=8LqVRLAc _h5K%L=laq&yA1JoJ^{7>oKLkF4~iax8KK|47hp@Qe|^xa&~28LV0v$b1}=fEj#9 -D^K)f#Cf|Xn@L3mU0Z2&n-dr?jcD1Ll0RawDWpib6c4cHjd30rSG6Pd|WCH+5z9S -bZ=!8X@=Yuq$20sb<4l#S`iz7Vef}@Ca=a#q*L33kiX;5-$ZggQ{Y-M4FBGG%U@M -Z$v=XJ?|;InIPy66cFfOYp#JM2r7_DuvrZ*Oe5gMQ~gu96el>ojDN{iR+YxT1qeJ -QTRI%yh?{hxxA$L2PhnVMAeXb4+h!VRL8;Q*?4^V{}w`aAk7>0BZ!J6rQG)02XJT -?*g=|B=zREie$*y(7k2+*P~cYjRjL>ZAoO3yNhl{q*SHJy4v_9A0QVQ%LPcLpJTZ -&avs0fDaYCfRC#b^PGN0jQUD1-Y;;Uvd1Z1j0|5qXX>oOFWC098Y;;Uvd1Z1jQ)P -4o0RRaB$ZLXo3tD}~kpv`i_>4e9YQ#rfba;u!+d5tm#=h -2RwFCuobYXO50sJ&Y-CxfQ3;(PYqmb +;*F>vukd;=m`ygb@x#_>`RmOO$0)3Z)~}Pe&;~0k`vnNG-Q(frCuPoqJv316u7g@ +bjO{C`L7Q_Y;b5{Lt$`pOmAdib7%`wbaH89bX0k8Wpe@mYXqYdo~D%m7H6OD0<^0 +n_2##VWXRdjy=DB@qgYOj1yf~hNo10{i*81wRHezf+V~|OAQu_S1xTi!W4SPL9>3 +Tr$Jz)~d2nS;VQpnn00}{CbWCA+WpXhC0S0Voadl~A0SrNGbWCA+WpXi7Wpo7r00 +{xeYl3?VT7AZm1SE3hA}5c~&&3*7XrN0!sxd$tJbohp00000000300000000008L +349ubW~wy1pxpD002NB00}{Jb7gc?VP|s%0RRdChyLPaScq)s9KMExvw34D6J>+N +wrBxfixd_%u|$Wt0m+Y=slx_K8vXre8<)H){QgX6j~{c$E$eY_=V_ZFuK)l50000 +00RI300000003tzib7^O8Qe}2!VQgh&L3DIsV`xHbX>MdwWnpYocu;h51OxyKV{d +L|X=G(?bZKF100sjDb7f&{0o#gN8iEuMbtv-qj6g$b#7A9pc!|f`I$jaRzSe2A1O +;<+VRU5y{4_<~U(XE-|Ev|Hdb$N7;9H9;8!%;3hl7uME$faw1Z;0(YXafX-5feW* +SKg&%h~b$G{NN>LxBDo)YaDXjV8yEYGuo~Ej#9D^K)f#Cf|Xn@L3mU0Z2&n-dr?j +cD1Ll0RaIKV{dL|X=G(?bZKF1Q*>c;WdH^P1aoC!YypqE!sthuPUKDEU2%WC`V+X ++(UG)mk--2W1{>juaWw^VbYXO50sJ&Y-CxfQ3;(PYq_>4e9YQ#rfba;u!+d5tm#=h2RwFCuobYXO50ccY+APn47#!YtOwl1n> +FWNfUk-rA3DGt2Q_Id+K%mi$2V`~E8(cK(6LD#rwNz2*s{WQVl8bg5o8r0R+^o=I +Rl4@nkxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%B2y$h1WnpY(WB>*O1ao +C!YypqE!sthuPUKDEU2%WC`V+X+(UG)mk--2W1{>juaWw^VbYXO50ccY+APn47#! +YtOwl1n>FWNfUk-rA3DGt2Q_Id+K%mi$2V`~E8(cK(6LD#rwNz2*s{WQVl8bg5o8 +r0R+^o=IRl4@nkxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%fL349yXKqqu +c4c8~Wn@8gbYWv?LTqVnWK(5fY*ct@WCR2N3}bI@W@%()Zggp3YybuW1aoC!YysP +fS{i~B5OpZ>_>4e9YQ#rfba;u!+d5tm#=h2RwFCuobYXO50sJ&Y-CxfQ3;(PYqWZob97;J +WdZy&McrS|4GaIQ6{LE)1tQ>Eiz^#2Wm1QOk9#fajy(iyZ)0l$;nCe3IziXCXi3Z +2@%=QxWZob97;JWdUeYG$0JzQ^rkp;_>4e9YQ#rfba;u! ++d5tm#=h2RwFCuobYXO50dNgv5VC@SZy&ck?Q(lLJ=>r +BY$70^roXTE)+&>InpFZ)0l$;nCe3IziXCXi3Z2@%=Qx +LxBDo)YaDXjV8yEYGuo~Ej#9D^K)f#Cf|Xn@L3mU0Z2&n-dr?jcD1Ll0RaIKV{dL +|X=G(?bZKF1Q*>c;WdH^P1aoC!YypA{4XEgn0epQk*PX+nL>xOm%p +K>soMo}bYXO50dNgv5VC@SZy&ckEiz^#2Wm1Q -Ok9#fajy(iyZ)0l$;nCe3IziXCXi3Z2@%=QxEiz^#2Wm1QOk9#fajy(iyZ)0l$;nCe3IziXCXi3Z2@%=QxYyC6yAAHY;R+00^!l!96CYQ -xM)es+421}!Q~o5fc_fP)zKtpQ8M_q -JyiO1VIUJ=H=)@ii_1#@&^bY%f(Q#2q9+*8I)cH*`!s%9_RI@yuG2CFF!ywLV~14 -_&UY;R+00^!l!96CYQxM)es+421}!Q~o5fc_fP)zYyC6?Q(lLJ=>rBY$70^roXTE)+& ->InpFZ)0l$;nCe3IziXCXi3Z2@%=QxxYW^+v~7{W03rq(;firJ1#@&^bY%f>4P_9rf`M-zw>{+&W0 -M0{2&GbCtpecGzFNi4r|Jm=Y;R+00^!l!96CYQxM)es+421}!Q~o5fc_fP)zKtpQ8M_qJyiO1VIUJ=H=)@ii_1#@&^bY%h -mXk);5Qh;gshq!{{oTC#gIzF4hFN<*P1RquLWiVd^Y;R+00^!l!96CYQxM)es+42 -1}!Q~o5fc_fP)zxYW^+v~7{W03rq(;firJ1 -#@&^bY%hmXk);5Qh;gshq!{{oTC#gIzF4hFN<*P1RquLWiVd^Y;R+00^!l!96CYQ -xM)es+421}!Q~o5fc_fP)z_>4e9YQ#rfba;u!+d5tm#=h2RwFCuobYXO50d -Ngv5VC@SZy&ckWZob97;JWdU#vWe~E0fo~tTJ>?Q(lLJ=>rBY$70^roXTE)+&>InpFZ)0 -l$;nCe3IziXCXi3Z2@%=QxWZob97;JWdZ+aW59S)fNA-MxPs%HqZ -2GTKAXWWi*W4(A64;XFkb|0Z)0l$;nCe3IziXCXi3Z2@%=QxF91B-Lz;+I~gZl(*Z)0l$;nCe3IziXCXi3Z2@%=QxxYW^+v~7{W03rq(;firJ1#@&^bY%fbXnF^b -IJ{KZXKtpQ8M_qJyiO1VIUJ=H=)@ -ii_1#@&^bY%f;M8@xYW^+v~7{ -W03rq(;firJ1#@&^bY%f;M8@F91B-Lz;+I~gZl(*Z)0l$;nCe -3IziXCXi3Z2@%=QxYyC6KtpQ8M_qJyiO1VIUJ=H=)@ii_1#@&^bY%f;M8@YyC6c;WkPIeZe&wsVQf@*P;_zx1ONKtpQ8M_qJyiO1VIUJ=H=)@ii_1#@&^bY%f9vZekPz%WEGnBZKS8 -(M7E9_@AwVcyGtCevi|7U8=DY;R+00^!l!96CYQxM)es+421}!Q~o5fc_fP)zLxBDo)YaDXjV8yEYGuo~Ej#9D^K)f#Cf|Xn@L3mU0Z2&n-dr?jcD1Ll0 -RaLKV{dL|X=G(?bZKF1Q)OXn00sjDb7f&{0o#gN8iEuMbtv-qj6g$b#7A9pc!|f` -I$jaRzSe2A1O;<+VRU5yF0!Tm7r-z?Fqq(6n;Tke)*kJ44PoBPfF{#q^A_Q|1Z;0 -(YXafX-5feW*SKg&%h~b$G{NN>LxBDo)YaDXjV8yEYGuo~Ej#9D^K)f#Cf|Xn@L3 -mU0Z2&n-dr?jcD1Ll0RaODa%Fa9VQgh&00sjDb7f&{0gt=F=tr7PLxBDo)YaDXjV8yEYGuo~Ej#9D^K)f# -Cf|Xn@L3mU0Z2&n-dr?jcD1Ll0RbFAb8~5DZdPw;WK(oubY((pX>MdwWnpYocxhw -=1ONKtpQ8M_qJyiO1VIUJ= -H=)@ii_1#@&^bY%f9vZekPz%WEGnBZKS8(M7E9_@AwVcyGtCevi|7U8=DY;R+00^ -!l!96CYQxM)es+421}!Q~o5fc_fP)zLxBDo)YaDXjV8yEYGuo~Ej# -9D^K)f#Cf|Xn@L3mU0Z2&n-dr?jcD1Ll0RaLKV{dL|X=G(?bZKF1Q)OXn00sjDb7 -f&{0o#gN8iEuMbtv-qj6g$b#7A9pc!|f`I$jaRzSe2A1O;<+VRU5yF0!Tm7r-z?F -qq(6n;Tke)*kJ44PoBPfF{#q^A_Q|1Z;0(YXafX-5feW*SKg&%h~b$G{NN>LxBDo -)YaDXjV8yEYGuo~Ej#9D^K)f#Cf|Xn@L3mU0Z2&n-dr?jcD1Ll0RaODa%Fa9VQgh -&00sjDb7f&{0fGz-uWS7@0e2{LxBDo)YaDXjV8yEYGuo~Ej#9D^K)f#Cf|Xn@L3mU0Z2&n-dr?jcD1Ll0Rav{b -8~5DZf#|5bX0k8Wd#8M00I#~b8~5DZf#|5bXRF~Ze??G1OfmCVPbP-ZgcMdwWnpYocu;h51pxpG0f+wLWmt%8=p4R=gtK{LClh6Z#kObxUW*hKHnB -v9xdF0Lf@J8($U%oA&W7KSpR=}qB?`O6y&~KLo@9%z@lF5$00000009300000000 -0<4b8~5DZf#|5baO&%X>MdwWnpYocxhw>0RRdChyLPaScq)s9KMExvw34D6J>+Nw -rBxfixd_%u|$Wt0j4$3CzF0`&~C2RzkRf-_drf2g0~9de8(o6190$lE&u=k00000 -0RI300000000=>JbYWv?Nn`~900#g7Kp+4PLSb`dLvL+uX>@I6Zgd6*1!invXLAD -K(cK(6LD#rwNz2*s{WQVl8bg5o8r0R+^o=IRl4@m>_h5K%L=laq&yA1JoJ^{7>oK -LkF4~iax8KK|47hp-b7N>_ZDC1d0hChH+XJhss8OG%_CC-Q>(otsF+cqN0Qy}ddQ -=3E5D9c?ZDn(GVQp{#07wUPWpi|HWpo0{EFN!zncXl9K5w2;FV{y1jDTJCC^p$-m -HEbO0#qkqh9c2>uJC38-{*D7fZ(%hZo23R4S;p`Q9JBQllDytVQh3vVR>b8b1?$p -(cK(6LD#rwNz2*s{WQVl8bg5o8r0R+^o=IRl4@mbudT)PryvH%qoUf%jN6#Tx81s -fg4O?s`uaep_R|IiX>)URWpV=H(cK(6LD#rwNz2*s{WQVl8bg5o8r0R+^o=IRl4@ -mbudT)PryvH%qoUf%jN6#Tx81sfg4O?s`uaep_R|IlVRLh3bW~wya{}Sf-5feW*S -Kg&%h~b$G{NN>LxBDo)YaDXjV8yEYGrM&t;O}HAO^^zqT0%g+nC0;-MWK<)&Ge4` -aq}l(*_PgY-w&}X>MmmVPkY}as>eZ2LJ#-AOH_TZ*F5{VQgh&L3DIsV`v2d00#g7 -Kp+4OLvL!QU9%?YlaQ5p(zVQyz-P;zf?W&u -dO8g3W+hC3E~ekEQtXWN29?!QU9%?YlaQ5p|JZ*FvQVPkYiX>)XMa(M;^2y -fI}^IL_yb)N?~LW;<=;2Rt!{5uU -^s5+a+mJz|^@_ktF~C0000000960|Nj60000SQb#7;AVr*q|00{xMT9OwrXYMoH1 -9u?fDdBZW6z3S&a&ziLbG4&=Ys$?40000000030|Ns9000004WMOn+00{w2TLZ8P -(BXv3rGHFj0R(MAdAZ%oI62v!yKR~2&CeYG0000000030|Ns9000006VRUq1V`u; -g0l}HI1f*k?vhZiL-XlN$-gNV!Z000000RR90{{R30018 -8IZgg^CV{}Pm1pxpD002NB01ZQLZgg^CV{}t=VRU5%0tRzqXk~3-0SFr#%Z;d`@< -KgVbnH?;Ug4W*kR{t3;Z1GYB%>$TatCN>b98TVc>%0m_t=@oDfa}Mus-s1pI@w^? -tNjxrm(0{wq=fUjdlq{VRT_rbYXO51pxpE002M$0000000030{{R3000008L}Fu5 -a&K>D1OfpDbYXCEWpn@q0Rs3Ghvn`0*IT6CPhzu+Zs4ws2QBQ{vi(LhXZn2X`ZN! -=ADBNH?W>M^%H|xc>sh|Dn*!v8^Ea7rh?dzC2n+%RZ*X#DbN~eb0{9e%`Tcq -AkVzY~G;I54aE$rH|{YErr`h4vAG)GR)T+rxDK6vW;JU&?LxLM72H?wDC1Zo}=N} -D)4mkC99bY*UHX>V=@3Ik?lb^+R(Q4?4eR(6nw`loI -F_owDud_=c42H~ZewX>a{=9jW&m$tWDykZj`7#3_zANbB(SO{shhGe=&H{tM@LxB -Do)YaDXjV8yEYGuo~Ej#9D^K)f#Cf|Xn@L3mU0Z2&n-dr?jcD1Ll0Raz1cywiMb7 -^mGQ)6glZD9rm2yJC_VPs)+VE_pMb>vO>-_DBy8`Vb0jGrW9$=2qSMXvL3HGEG000000000 -0{{R30000002XbX(Wo2!100{v`?dHP>9R0ZFSEMRj;Km4qfBYZ5UUs>0bg9bqiCN -A70000000030000000000BVRLh7XKrm}Zgg`13IT`y;$>KfZ0H=mhJ>?uVa{vheM(yUq2ps*m=2xUDT;RqCgn#@WzFu~@adfH5 -^@&-|0000000000{{R300000033g#@X=Gt^Z*l+x0ssVVZ*FA(00035b8l^B00jX -8i+@H63|42*wg~2q@3^L -q|9zft}OB~jx>)hO74Mli#Wo~n6Z*Ek1aAgGn00065MrL*e0RR934MuftXK7+=Wm -9xvbY%nq2nJ$lbaOT|00jX600<05b#7;AVr*qpd2nR|0S$F-b7^O8Wn?xqLTPje2 -S;UYWpinB1`PvdW_AJEn^6;37FKqUhx?i3R+Mr!fY&(;2BFL(m@EZk_srD@b7N>_ -ZDC1d0hChH+XJhss8OG%_CC-Q>(otsF+cqN0Qy}ddQ=3E5CvvzVP|s!;nCe3IziX -CXi3Z2@%=Qx~Wpi|4ZEyepNC$Lfb98QHbOOpO9&dx0-7pM3Z=O*v*GCA9fL-<|Hr -ZsA`NnJlR3~AEBGG%U@MZ$v=XJ?|;InIPy66cFfOYp#JM2r7_Du?5Y;;Uvd1Z2QF -##l3QrKmH@SMtOBR5nML?B>%qbz^!%<&Wu0B;HjDvSwXb8}^MRAFax0VyR82Em!l -d>cVuZ*8Se%j3y;5n>eohpw0DA7$}d%m{5|bYWy+bYTJYdQCW4e)%xftOSp9TD)g -5B;KO;Krzd=y+`rt_<1!4XKZg`VQg~&+V{~n_vCwKmUM9ZPku*a@b)#*ne?8Y=L^ -y0a6WSn3t@9}X=iS2Wo~qH0V?uELDn7ECaAJ#>#uY3^=3;^Ib33g#@X=Gt^Z*l_R(cK(6LD#rw -Nz2*s{WQVl8bg5o8r0R+^o=IRl4@m>_h5K%L=laq&yA1JoJ^{7>oKLkF4~iax8KK -|47hp?M`dnhb7^x^V`ybVZDn*}WMOn+00{wgKfZ0H=mhJ>?uVa{vheM(yUq2ps*m=2xUDT;RqCgn#@WzFu~@adf -H5^@&-|0000000000{{R300000033g#@X=Gt^Z*l+x0ssVVZ*FA(00035b8l^B00 -jX8i+@H63|42*wg~2q@3 -^Lq|9zft}OB~jx>)hO72}f*iVqt7ga%2Vq4R>jDZe??GL2hGcZ*l+x0ssVVZ*FA( -00035b8l^B00jX7SQ3>DAd9q3vF!EgI>niq&gF@?Xwk09NOmoW?4BAt18HP<0006 -DM{I9mVQf=$VRU5$0RRdC)$WoGNrc;Wm98lWo=;w0|;_ub7gXNWn=>3(cK(6LD#rwNz2*s{WQVl8bg5o8r0R+^ -o=IRl4@m>_h5K%L=laq&yA1JoJ^{7>oKLkF4~iax8KK|47hp)b7gHwWCDnm$9O-6 -TWVuFo^|2*NvWKMV^#cK{)RQ%ur9&FflzA%qZFQ|l>ioJpYH;+t0eX2w~A!Q+0ea -Z{MVycPK^j{VR%V&Wo>f+00Iw3Y;R&=Y*Tb$bY)a|aAgGn0006EM{I9mVQf}mY;| -RG1pxpE0sm-Yz<5%CY59k^g5#W{6D&GDo53%OaP0&iRqEBWo~q7ba@2<00;ugEFN!zncXl9K5w2;FV{y1jDTJCC^p$-mHEbO0#qkRz -9SbZ=!8X@=Yuq$20sb<4l#S`iz7Vef}@Ca=a#qt00000000005C8xG00005Np5g; -bOr(kaB^jKPjz$wlMuXsu{2tXFT+?;?hj39&>gq>HOrf1lB-q;n)I5N2y$g}WpZ| -9WCG#Q-5feW*SKg&%h~b$G{NN>LxBDo)YaDXjV8yEYGuo~Ej#9D^K)f#Cf|Xn@L3 -mU0Z2&n-dr?jcD1Ll0Rad}Zg6#UO<`~a0RRdD^=uPjBlbC`N(qzPM@Gr{imSMTSY -5T*7C#t%#3&jHA>%$n#j0HLDJN5-IKgM_J7b(p+0MPGk2Gl)y2(Rz0hP$+dLDIRU -(}XWLTZugenOC;Z(5k~zEJnJiX;;E#Q^{S000000RR600000000v2JaCLNZ1pxpF -0o9FP2n?Horiuqf0^m>2O`jNRziT$b7#=ya6uYYC;s5{u000000RR600000000~W -HWNBekd2nR|0Rv%fdH)DaWprUwd2nR~0RR932~A~mVOC*mb!7zs00;m8KmY&$000 -000RR600000000>QGbYWy+bYTSn015$h4P{pQ?3(@m6s4{*=wy-PiS_k>Wl|t&*Fr0fZ0000000000{{R300 -00003r}NXb#iiLZewM01_A?ZX>I@j0t0PfcmMzb3{P-FZ*6U9bZupBbOs6oW@dH) -+M7`mSQb`xkca!3LxB -Do)YaDXjV8yEYGrM&t;O}HAO^^zqT0%g+nC0;-MWK<)&Ge4`aq}l(*_4;Y;R&=Y; -ywP(cK(6LD#rwNz2*s{WQVl8bg5o8r0R+^o=IRl4@l*oM?JbaMjX(cK(6LD#rwNz2*s{WQVl8bg5o8r0R+^o=IR -l4@l*oClv)aMjKgwAH@`bu1x<7g|G -$};xvA~n-$_S2y$g)Wo2z;WCG#Q-5feW*SKg&%h~b$G{NN>LxBDo)YaDXjV8yEYG -rM&t;O}HAO^^zqT0%g+nC0;-MWK<)&Ge4`aq}l(*_B4VQgh?V`*h`0^!l!96CYQx -M)es+421}!Q~o5fc_fP)zLxBDo)YaDXjV8yEYGpW{Lxv| -61vo|LxBDo)YaDXjV8yEYGrM&t;O}HAO^^zqT0%g+nC0;-MWK<)&Ge4`aq}l(*^`ja7 -knZ0RRU806-uB1y68qb#w*;0&j2umB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`ZqB -og<<0(5x+hyLPaScq)s9KMExvw34D6J>+NwrBxfixd_%u|$Wt0&Z^r00JIQb#!ob -bU|}-X=iS2Wo~p*Wp-s@Y-MCYbaY{3Xa)oYZ*XsQbODnPynwMZT8l5kSW@l}O=!> -^xB4~9n`Dx!RtcK)nwJD~WnpXq(PtOELlW@z354$cZcQEw0|O`dPRP3jk}Sl@F(; -O)1#@&^bY%f(Q#2q9+*8I)cH*`!s%9_RI@yuG2CFF!ywLV~14_&XcWHEPWpi@@1# -{rZP|m9K(8HSpU8Cxu(AzX*g3wtWgq9@B6{cBc98Yz0aCLM+b8~5DZf#|5bW&w@W -npY(WJF^xB4~9n`Dx!RtcK)nwJD~ -WnpXq(PtOELlW@z354$cZcQEw0|O`dPRP3jk}Sl@F(;O)1#@&^bY%hmXk);5Qh;g -shq!{{oTC#gIzF4hFN<*P1RquLWiVd{cWHEPWpi@@1#{rZP|m9K(8HSpU8Cxu(Az -X*g3wtWgq9@B6{cBc9Zz+1aCLM+b8~5DZf#|5bW&w@WnpY(WL9Bpb!7$w1#fU~b# -wuf5WIk~G+K)5%bR49t5yk`^qQ9hb7f&{0nuj{y+ac4_6daU{ -%%bk3j+fu`A*2Y1(Gbp$uTFEss(d&VRU5yZA8ZOFKPukLlqCE=E5w*=z8TWl=ueJ -45i$M_H~V*2X|?7Ze??G0R?m5$xzO!^w7hb16`x)q0rkjWP;FH9)y-8%N3?sW*JX -)bZ~WaL349yXKrm}Zgf^}X=GD$VRU5%1O;z!Z*_D5lMuXsu{2tXFT+?;?hj39&>g +xj-FXm+)yumJ%A5Mys{W@%()Zggp3Y*S@nYybuW1aoC!YysPfS{i~B5OpZ>_>4e9 +YQ#rfba;u!+d5tm#=h2RwFCuobYXO50sm-Yz<5%CY59k^g5#W{6D&GDo53%OaP0& +iRq*O1aoC!YypA{4XEgn0epQk*PX+nL>xOm%pK>soMo}bYXO50sm-Yz<5%CY59k^g5#W{6D&GDo +53%OaP0&iRq_>4 +e9YQ#rfba;u!+d5tm#=h2RwFCuobYXO50ZM3k2aq_tRM}}F91B-Lz;+I~gZl(*Z)0l$;nCe3IziXCXi3Z2@%=Qx_>4e9YQ#rfba;u!+d5tm#=h2RwFCu +obYXO50ZM3k2aq_tRM}}WZob97;JWdTZPdIyj=yj0m~TwLF91B-Lz;+I~ +gZl(*Z)0l$;nCe3IziXCXi3Z2@%=QxWZob97;JWdUtO#`G_01v*0 +&52ohAEX3$~xYW^+v~7{W03rq(;firJ1#@&^bY%f9vZ +ekPz%WEGnBZKS8(M7E9_@AwVcyGtCevi|7U8=DY;R+00^!l!96CYQxM)es+421}! +Q~o5fc_fP)zKtpQ8M_qJyiO1VIUJ=H +=)@ii_1#@&^bY%f9vZekPz%WEGnBZKS8(M7E9_@AwVcyGtCevi|7U8=DY;R+00^! +l!96CYQxM)es+421}!Q~o5fc_fP)zxYW^+v +~7{W03rq(;firJ1#@&^bY%f9vZekPz%WEGnBZKS8(M7E9_@AwVcyGtCevi|7U8=D +Y;R+00^!l!96CYQxM)es+421}!Q~o5fc_fP)zc;WkPIeZe&wsVQf@*X=DTh01R +VqZf0p@Wo~q7VQc^f0|awrVQc~0idq_i6cBYN^7xEELu$lFU37Sf$J;ty5yrmOX| +)6eb97;JWdSa-rT!PdFhnqz;9Q#YyC6KtpQ8M_qJyiO1VIUJ=H=)@ii_1#@&^bY%f9vZekPz%WEGnBZKS +8(M7E9_@AwVcyGtCevi|7U8=DY;R+00^!l!96CYQxM)es+421}!Q~o5fc_fP)zYyC6+NwrBxfixd_%u|$Wt0k +TqpWa!AqL5CyGhToB&v$lUF3cJOWQ(rxP5=M^000000RI300000002o1Yb +7^O8ZDnqBb3$xsZe&wsVQf@*X=DWf015$z{^Dg=h-~N_zJ`Red1EINWrM}GXaQb} +6c#qIM2EQnrZvzflYVT_Zm!qAeYC3gKu#utw+iBX$0nNtaPW050000000000{{R3 +0000002tjmoVPj}XWCZ~L2LJ#-AOH?RVRL0eZ*6U9bZupBbOr|nW^7?+a{}Sf-5f +eW*SKg&%h~b$G{NN>LxBDo)YaDXjV8yEYGsr6V0dsu5sjwLjgQcrOsaG1F{QvR+L +MR3-^ZN{xOxb4V`yb~Wpi|4ZEyepNC$Lfb98QHbOOpO9&dx0-7pM3Z=O*v*GCA9fL-<|HrZsA`NnJl +R3~AEBGG%U@MZ$v=XJ?|;InIPy66cFfOYp#JM2r7_Du?5Y;;Uvd1Z2QF#_Sy-5fe +W*SKg&%h~b$G{NN>LxBDo)YaDXjV8yEYGrM&t;O}HAO^^zqT0%g+nC0;-MWK<)&G +e4`aq}l(*_1LxBDo)YaDXjV8yEYGrM&t; +O}HAO^^zqT0%g+nC0;-MWK<)&Ge4`aq}l(*_A)b8}^MRAFax0^!l!96CYQxM)es+ +421}!Q~o5fc_fP)zMd`Zf8beV{~tF1pxpD002NB01rcNZewL(Y-MCYbaY{3XaxZP2LJ#-AOH< +RZ*F5{VQgh&L}7Gc1pxpD002NB01-oPZewL(Y-MCdb#7;AVr*pw0t#bqZEb0EZDn +qB0Z6?XZWsH8I~II?C0;dW+k!*yDqgzlqQwf$39g<|8VYh@Zf9jsa&K>D0Z6?XZW +sH8I~II?C0;dW+k!*yDqgzlqQwf$39g<|8V^HnZgg^CV{}Mqb98TVc?Jgvb7N>_Z +DC1d0hChH+XJhss8OG%_CC-Q>(otsF+cqN0Qy}ddQ=3E5DH^&Zgg^CV{}Pm0iOsg +Njk^^qPoT1+zTRnAg`3vXv9d*8d@RXy~6c6G6rXCZ(?C=015%s?vf5kh_h+&YE#h +%O8d1V_{UOl9{V;uR#^q%ogpUiFf^bO?_SB2<_!D=EC +E1e~SVCXk);5Qh;gshq!{{oTC#gIzF4hFN<*P1RquLWiVd=0000000030|Ns9000 +00000000000300000000006a%pF1baMa+0U1O@LD!K=VPp{Exud~W3{+09UeV9nC +23Q@)VWoWB>(^b000000RR90{{R30010MwZf9v?Y-Mu*2?4fRk{2;&?las2cOc^_ +;dM$B=NQ;>bLvEMwWED&%FO@(0000000960|Nj60000DJVRT^t2?0%81F#Cv;e^Y +je@tcp1Z_fjx!ub+IoX}NZJFuK&m8~&0000000960|Nj60000JIbaY{3XaETT!I` +xLq+^w`@NrX}btA9p`Iz{V8wtlsJ_0{(EY{l10000000000|NsC0000003PW#hba +G*1bV+0d0RRU806-uB4MT5kbaG*1bW?O;bY%tt26JO*Wo=;rib@n+Jfe?bPZJCJ1 +>7h*lCriN#fXu49!xM#KO&x|2WV+?bZ>Hb0jys4*qO&E_XL};KJs**U#z0;ePP0; +u&7bCWsY-=b_qmbbYW9;VRU5$0RRX906+i$000000096000000000O?Vq;KpZ*OJ +<0s#heVQ_L~bN~eb0{9e%`TcqAkVzY~G;I54aE$rH|{YErr`h4vAG!M2Pm_H +irtB!lh<{Yi-S-!KI0_27BH<@sVme~^s3<3pjaB^jI00jX8_!Nib?fKVRq~1?rvx +{!vu8jvR?Ao&ZMl@&oeC+x(M^4XN(CAD)cag{2 +}O8xWo~n6Z*B$(17>D+0ot2U6Id2jc94hrndMfLayEe1ISdA&%p{mB1!VWk)e2*8 +Zgg^CV{}Pm0iOsgNjk^^qPoT1+zTRnAg`3vXv9d*8d@RXy~6c6G7V*TbY*UHX>V> ++d2nR`WOW`wsTH9-LlJ`2|Ay5Z(?oEikl{+~pis;@Q*TJ#2yJC_VPs)+VFC4eO*m +P8`7qV21dnrCyk{{a-lF$FG0V5TNAc?Tc{K-TY;R&=Y;ytH_t7`^Pr5ftu@@z<*O39}j`u&O7io3b$Is?RA$O$l~kY-wa ++bZ>G3;nCe3IziXCXi3Z2@%=QxV>*V +`ybf+2?0j!=EDda{kY~=q$*tC#t4Le{2#tvcDZqMsmk?u=2wF+7z(Wqt=tdZk`V^s(Ana0000000930 +00000000SgVQgh?V`*h`00{v`?dHP>9R0ZFSEMRj;Km4qfBYZ5UUs>0bg9bqiCNA +700000000300000000009c42I3WMOn~asUJZ00eGtZe;)f009JZZ*64&1pxw!e?| +%n1pG};`Z*ur%-By7#`f0`)7RBV`ju>1K(+#H@1Z8)ymjIKNK5;L!8FkfGTe+FK; +UUh9M-4n+}vReMR;^&ZgXjGZd7@2Wd#8M00IL>W_ASu0006FMs;pyX<}?;Q*>c;W +ds2T24ZP+b2c;p1pxp62n_h5K%L=laq&yA1JoJ^{7>oKLkF4~iax8KK|47 +hp;bZKp6b97;CZ~y>E2Xtj~bZ%vI0?I5NZ-bfLFbqC#o>4E?M+l67UG^w8*<_XZ# +%uyqCt-#n(R;4&W&+>mb;*F>vukd;=m`ygb@x#_>`RmOO$uRbbWCA+WpZ;d0VG#a +*kyq5oXTn=H&hZtAYgo>EPw9I@e~jMZwd)2j0s_Lb7gc?VP|szDJ2dD!I{l`8$n- +hZKY7lmuVif;}u9xW_W$|0g2yJC_VPs)+VFC4eO*mP8`7qV21dnrCyk{{a-lF +$FG0V5TNAc?Tc{K-TY;R&=Y;ytH_t7`^Wpe@Dg=PS6VPp{$?vC--s`v@B8YHl)C#jpVFzBk!DMw8PX>)URWpV)zs!5kM +-q`{+Y(Ov;5#p6bG#!i|)LxBDo)YaDXjV8yEYGsr6V0dsu5sjwLjgQcrOsaG1F{QvR+LMR3-^ZN{xOx +poWo~72X>(I!Xk~3-1_cOhWprU=VRT^t2?2HFP59r=ivkxis%Ku=2wF+7z(Wqt=tdZk`V^s(Ana +000000093000000000YNb8~5DZf#|5baMa-0f+wLWmt%8=p4R=gtK{LClh6Z#kOb +xUW*hKHnBv9xdAr8G@<&SffJ|QFn~N>u=2wF+7z(Wqt=tdZk`V^s(Ana00000009 +3000000000SgVQgh?V`*h`00{v`?dHP>9R0ZFSEMRj;Km4qfBYZ5UUs>0bg9bqiC +NA700000000300000000009c42I3WMOn~asUJZ00eGtZe;)f009JZZ*64&1pxw!e +?|%n1pG};`Z*ur%-By7#`f0`)7RBV`ju>1K(+#H@1Z8)ymjIKNK5;L!8FkfGTe+F +K;UUh9M-4n+}vRaM{I9mVQf!wWCj8acWHEPWpi^uZewU~asUJZ00eGtZe;)f009J +ZZ*64&1pxtA5|s@gi?mI#?Dgt8#hIGU<%zgx(XPr!b}fnQo*Fy@X=Hc+00Ij~Y;R +&=Y*Tb$bY%qr015%s?vf5kh_h+&YE#h%O8d1V_{UOl9{V;uR#^q%LxBDo)YaDXjV8yE +YGsr6V0dsu5sjwLjgQcrOsaG1F{QvR+LMR3-^ZN{xOxS1Wo=1h0*IE!ct3_)YGXT +|b>aC*shoymRs3H5hBe!;F2TcrP-_IE6rQG)02XJT?*g=|B=zREie$*y(7k2+*P~ +cYjRc;WmI`^Wd#8M00In0Y;R&=Y*t}xb!Bq}0R +RXA|7c^tcv66A`G>fI5%bR49t5yk`^qQ9la%FR6a&~280^! +l!96CYQxM)es+421}!Q~o5fc_fP)zWj015*2Y!hN5_Bp3Y36tDMM#=e#tGI($UA5U3K +Nx<*C>jbO<32;hs$B9ZCsU(1!DsC|W1LOd&b_IRG-(&Q$wPGkmB{9L9(7`0)Rt93 +YLV-HLXe?vTA1;^Q1`ZqBog<<0RR9100000|Nj600000021#ykb#!wD0RRaB)s0^ +W44ZlVPs)+VFdvI3ITQGP59r=ivkR6Lh9EroO>_;0000000030000000000B +Ph(?sa&l#EV`Xy&0t0PnZU6uR18re=0006EPjEwTZEb0EZDnqB1_}daW_AJEn^6; +37FKqUhx?i3R+Mr!fY&(;2BFL(m@EZk_srD>Z*Ww3aAg5&i~3jizPVxq`~S>~88Y +p!Qc_36^>m#&EZ}FG74t9%ZDn*}WMOn+0^!l!96CYQxM)es+421}!Q~o5fc_fP)z +LxBDo)YaDXjV8yEYGpW{Lxv|61vo|LxBDo)YaDXjV8yEYGpW +{Lxv|61vo|0-0^!l!96CYQxM)es+421}!Q~o5fc_fP)zsZfv!yd427@;7veO2zMB=|GYNKKY-wa+bZ>G3;nCe3IziXCXi3Z2@%=QxV1_J_bZ~>Lb=6W7=VqesjRYGc!>wZFzp>JB4@xD;^wu&SY +_r(Hqc>#z1;$>KfZ0H=mhJ>?uVg q>HOrf1lB-q;n)I5N1aoC!Yyr_{7rjFg@b(FW?*48~9t#5lC;3juy9JUg#K|!ymZ -}AFbYXO50WPwo{ujV7L@=1(T$>wOY}Ov_b`4?P%YY`+Wb+o`y9ak^bZ%vHa{&c&; -K@+Vs`Svqn*&{=>Y>ovG-QI%SssLzB+C`1S!NJVcWz~5Q*>c;Wm98lWo=;u1ON+U -Wn*k%a$$67c4Ytn009VQb#7;AVr*pq1pxv1^sESGu0eNZ)cp(*eFU-DRQ(QTUJ^T -E1nY56>E%WO3UhRFbz^jOa%E%y1pxwxmdAKMhFfZ5JDzpn`AMmqhGSLyUjBwP+ps -Rd!+}t11fvw5rj-B|XP@r^w5ufb=C_Ju$l1`nW&GEpSWb-t3So3~VPj}*Wo~o;1p -xsQXM0|*v-OPCsP-SFga&u*FLvL+uX>@I6Z -gd3!00#g7Kp_AKQe|XiWo>0-1pxpG0Y>fS!w4MxxaL=+DqP^k2!wz9AHH68xp8!< -%Jqp^&HwZFzp>JB4@xD;^wu&SY_r(AJ00000009300000 -0000hBWp-s@Y-MCYbaY{3Xa)lUX=DL}aSf9!PV~dK2uo>;u!nFdemP_$e?^hl+Jk -M;eY!XaZDnL>VN`i=WdTAkVTFju)TMl$g}C@DyY!@{4YR*LMYs=?Zg_* -ktx|21^lzg9sBTBv19V|$0m+Y=slx_K8vXre8<)H){QgX6j~{c$E$eY_=V_ZFuLe -_NXk~3-1`GpcW_AJEn^6;37FKqUhx?i3R+Mr!fY&(;2BFL(m@EZk_srD=W^7?+a{ -}Sf-5feW*SKg&%h~b$G{NN>LxBDo)YaDXjV8yEYGsr6V0dsu5sjwLjgQcrOsaG1F -{QvR+LMR3-^ZN{xOxO`VQpmsh?d8AKZaXsV>_O8;rU6aoQ7jn{9gWsHQTT*!NY-2 -lDms;Mx<1w$-3J3B_ALc8OsGork`WEFmfKh*eS=_33O>~Wpi|4ZEyepNC|CabYWC -^aAk7<3ITQGP59r=ivk$P>NY&HCT(P)^FVARS*Zg3m2dUS*m(weL9 -PhQe$_)hyWq5RDZgXjGZgT(%0c3R^La7y@JVOzJ)&GXo9MeQ_qmbcB?4VH0I#X{* --T?z>0?er0_e!9%6%WL6o5Q7yVM7GXa@w44CHDB`4cq_#000000093000000000Y -ga$#@6CZgT(%0W?w%t`n9TUcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXaRP$8)% -E7`<-;ovk@YSJ+V~kNcmIwC6DJ=V=(On#Ml4;000000093000000000SOWp-t3Z* -XOD0S~H4mo?tm0ybD+0ot2U6Id2jc94hrndMfLayEe1ISdA&%p{mB1!VWk -)e2*8Zgg^CV{}Pm0iOsgNjk^^qPoT1+zTRnAg`3vXv9d*8d@RXy~6c6G7fZdVQzD -2bZKvHRC#b^0W?w%t`n9TUcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXb5d(bYWy+bYT -JYdQCW4e)%xftOSp9TD)g5B;KO;Krzd=y+`rt_<1!4XKZg`VQg~&+V{~n_vCwKmU -M9ZPku*a@b)#*ne?8Y=L^y0a6WSn25D|^b#!w9siJyUlgOLOB};96cGdSG6&iv=7 -PD~jruGj4o;;a=3t@9}X=iS2Wo~qH0iXgu^JRK>3KknnLsqhlVJsk2VEKBm*V?S! ->C(%{wF!1%Y-Mg^X=QT(-GycVZ((E+6z-1k*Q)plvl=9@swb(NvM}hX&nZVu33g# -@X=Gt^Z*l_R(cK(6LD#rwNz2*s{WQVl8bg5o8r0R+^o=IRl4@m>_h5K%L=laq&yA -1JoJ^{7>oKLkF4~iax8KK|47hp+cWHEPWpi@^;nCe3IziXCXi3Z2@%=QxV>qb#7#AWd;KaV{C78Wld#tXm4Z!_!Nib?fKVRq~1?rvx{!vu8jvR?Ao&ZMl@&o -eC+x(F1HXRxo%|^+Itiop&gxXSvq){{YhrGf57_P)SQy*2x)F`b#zT(Z~+yWXJpH -@t3U@-^C5At>@@qQFQ2KNd+8eYXv4en`-l*0Zf|#PRB~Z%b7^#GZ*Fq{3IUbK=6W -7=VqesjRYGc!>wZFzp>JB4@xD;^wu&SY_r(EL(ByDBrY@9gIGgwCwGg91xcsA~D3 -xGh@06&Ij@*|40000000030{{R300000GRB~Z%b7^#GZ*Eg#Xk~3-1_lUiWprU=V -RT^t2?2HFP59r=ivkxis%Ku=2wF+7z(Wqt=tdZk`V^s(Ana000000093000000000JQZg6#Ua{v -kfhyLPaScq)s9KMExvw34D6J>+NwrBxfixd_%u|$Wt0XD%jq57bK6Q|uUfIMEX^1 -}Vv6tLB!)|10-o)0prc>n+a000000RI300000001IJrb7^O8ZDnqBa{vkfhyLPaS -cq)s9KMExvw34D6J>+NwrBxfixd_%u|$Wt0XD%jq57bK6Q|uUfIMEX^1}Vv6tLB! -)|10-o)0prc>n+a000000RI3000000010+sY-Mg^X=QT&2?0j!=EDda{kY~=q$*t -C#t4Le{2#tvcDZqMsmk?8*VRb+m26o+wgPSMp( -f$Hb>aU=OZ$bvG|>z)+>9PT;Au-7)~D;-++hw>a$#@6CZd7@2Wd#8M00ItFd -2nSzZ*6U9bZupBbOZwc2WMq&WpinB00jX7V*7iwvA+3=iX~Fux-(AZKP4aTJi@GU -3P3~m7hZP80Sa_-VQzD2bZKvH00ja8p9m~TI>-W|y2ahx3nF|Vuawki#7NH?S|Q- -Q!u2{b0W?w%t`n9TUcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXaWgkcywiMb7^mG00j -a8p9m~TI>-W|y2ahx3nF|Vuawki#7NH?S|Q-Q!u2{b0c3R^La7y@JVOzJ)&GXo9M -eQ_qmbcB?4VH0I#X{*-WpVSaAjmcb8~5DZgWCxX>MdwWnpYocu;h51OxyJWMyM)V -RB(~X?A4*1pxpE0XZl0-%4v&H)ISe_*f>my4uKhF4_isHhdU7d+OQBHUIzs00000 -0RR6000000009VQb#7;AVr*pq1pxpE0oujs9mwqd!6t9MpF6k$l8zT&IM0)BxIjD -ir5zArRR910000000RR600000000IhgbaHiLbairNWB>&L00;qr9_N=1kiT6@?qi -UXo4Z8}iXVUo?CzP|ak(fG&*D)40000000030{{R30000303So3~VPj}*Wo~o;1p -xpE0p68`B?zIHIzl+9&PlG`zw1fUvcIspB!t-xS(}q~od5s;000000RR60000000 -2x$yaAjmcb8~5DZgWCxX>MdwWnpYocxhw=1ON+UWn*k%a$$67c4Yts0RRXAlfaZ* -5|&qoaMx&cZSO)Ho!_*yjLvyQo1^f$X+6j;0000000000|Nj60000000SIPwZf9v -?Y-Ioi0RRXA|I$b1hgAEd90w2pG9y@ZJ!C|rt0b}t8>GVedrqOk0000000000|Nj -60000000t$0Lb#i5700jX62mxA;a|tC)BU>oS@xONigke(HCtahRyiRHf-T -Wpf1q00{v` -?dHP>9R0ZFSEMRj;Km4qfBYZ5UUs>0bg9bqiCNA70000000030000000000BR$** -qZew{=d2nR~0RR93307}uWK(oubY%qr0000DS7~%^Wpi^uZewU~as~nlcWHEPWpi -^+a%2I*9_-uz)4t;Cj{=)=I{UE@z&4lZ&jV-~loh4~2WiR)cWHEPWpi^$WC4k5SS -8KIkY89@$6%;X7qJ(R#b4x^L3+^xAn+qc8}SNPX>@L7b8}B}WCQ{L2XAgeXklq?0 -0jX74!^kVIAU(3gSs^H6!}zj=~mfCH51$?7#2KZw&97f0SIqqWI@j018)W -bZ%vHb5L({1_B0XWoc(~Wpi|4ZEyepNEBE@Xklq?LTqVnWK(5fY*ct -qbaDg&00&}ebYpL6ZU6-V0{9e%`TcqAkVzY~G;I54aE$rH|{YErr`h4vAG)5 -<=E>N`F8f<{_M@^MEhcVy#omh=bI-rl&{j_4Y)d2=oOFWB>&L0{9e%`Tc -qAkVzY~G;I54aE$rH|{YErr`h4vAG)5<=E>N`F8f<{_M@^MEhcVy#omh=bI-rl&{ -j_4Y)e~4lXklq?LTqVnWK(5fY*ct@WCQ{L2V!Y-V{d7000jX8_!Nib?fKVRq~1?r -vx{!vu8jvR?Ao&ZMl@&oeC+x(u*Pw&hI`xNV4B0;>oUbhHyi-Y#=22)QEgSwgoUbhHyi-Y#=22)QEgSwg?<6X>I@o0Rs3Ghvn`0*IT6CPhzu+Zs4ws2QBQ{vi(LhXZn2X`ZNR8G?42=b -&6>T7_z0LJs9vI3^Q`9-kMwahgh8>BYgn|Y-w?IX=DHe0Rs3Ghvn`0*IT6CPhzu+ -Zs4ws2QBQ{vi(LhXZn2X`ZNR8G?42=b&6>T7_z0LJs9vI3^Q`9-kMwahgh8>BYhB -9Lug@XZc}Ara%FT=WnpXt0sseMX>?<6X>I@o0Rs3Ghvn`0*IT6CPhzu+Zs4ws2QB -Q{vi(LhXZn2X`ZQ=6>%7&o7^|1Fn59cLW!>7R25;!;B%7&o7^|1Fn59cLW -!>7R25;!;B#Kd;Rz-U= -aO9W+B0S0Voadl~A00jX8^=uPjBlbC`N(qzPM@Gr{imSMTSY5T*7C#t%#3&jHqk= -;7%h%D+p%U7S;b1RT)c9`>#Kd;Rz-U=aO9W+B +}AFbYXO50ccY+APn47#!YtOwl1n>FWNfUk-rA3DGt2Q_Id+K%m;UAbZ%vHa{&c&; +K@+Vs`Svqn*&{=>Y>ovG-QI%SssLzB+C`1S!Nthb#!obbU|}-X=iS2Wo~p*Wp-s@ +Y-MCbVRT^z1O;z!Z*_D5lMuXsu{2tXFT+?;?hj39&>gq>HOrf1lB-q;n)I5N1aoC +!Yyr_{7rjFg@b(FW?*48~9t#5lC;3juy9JUg#K|!ymZ}AFbYXO50sm-Yz<5%CY59 +k^g5#W{6D&GDo53%OaP0&iRqY>ovG- +QI%SssLzB+C`1S!Nwib#!obbU|}-X=iS2Wo~p*Wp-s@Y-MCtVQh6}1_T9faBp>V0 +h18CfUz`Mi!Z}iQtl5;XwV(E`Zdd&WRj~^37YhpmjrWVVQc}>XBWLg67cp3gzo-s +O&$va11I@T$h!rSEX2t%Czh%Ob97;JWdUtO#`G_01v*0&52ohAEX3$~@L7b8`U&bKuEP&Z_j#!c;Wd;NVZ*XsQbODnPynwMZT8l5kSW@l}O=!>^xB +4~9n`Dx!RtcK)nwJD~WnpXq(PtOELlW@z354$cZcQEw0|O`dPRP3jk}Sl@F(;O)1 +#@&^bY%f9vZekPz%WEGnBZKS8(M7E9_@AwVcyGtCevi|7U8=GcWHEPWpi@@1#{rZ +P|m9K(8HSpU8Cxu(AzX*g3wtWgq9@B6{cBc5Knh*Wn@!yVRU6vV`ybM0r~W-2xhK9cV^W63=w?&L0*IE!ct3_)YGXT|b>aC*shoymRs3H5hBe!;F2 +TcrP-_IE6rQG)02XJT?*g=|B=zREie$*y(7k2+*P~cYjROi{baY{3Xl-R~bN~eb0 +YWfgg^0-1s}v?c$Nk9{EX~mW5dRI6fB-~%h??EZc@j`%WMy)5Wo|=nZEb0EZDnqB +1pxpD002NC00>fLWMyS-Wn={b015#{?dHP>9R0ZFSEMRj;Km4qfBYZ5UUs>0bg9b +qiCNA8mB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`ZqBog<<0000000000{{R30000 +004pL=yWnpY(WI=RvVPj|p0|IGe0fcc4lPpg3!?y@aX^XIja4CK{WF&t@k=WXUZP +9(YI0D+0ot2U6Id2jc94hrndMfLayEe1ISdA&%p{mB1!VWk)dgm3VP|s!; +nCe3IziXCXi3Z2@%=Qx3Tr$Jz;WX>Db5bYX39002k{WMy_`Y;S +O7asdyjNtZR=*#b6fKrj{&;*~};9gH8=MXs-W5e*Cg;5Z3wWprUwd2nTO015$h_O8;rU6aoQ7jn{ +9gWsHQTT*!NY-2YXqYdo~D%m7H6OD0<^0n_2##VWXRdjy=DB@qgYOj0000000000 +{{R30000003ukO^Vqt7ld2nTO015%s?vf5kh_h+&YE#h%O8d1V_{UOl9{V;uR#^q +%KfZ0H=mhJ>?uV9R0ZFSEMRj;Km4qfBYZ5UUs>0bg9bqiCNA70000000030 +0000000007XJu|>b7^w{7)aIA#9XnshcC})U)TI#r3b0kyqD7}ejM+$yUGm(3T1e +7Wo~n6Z*Fq{3ISww9zv-Vp*%wog4O?q)g04AaHEjnO6;Ie%sNwVNZtVhXadZr-S< +kMvlS1-a+|}YjA26r&2rkDZzcBlPY!h`6Z9%SYt5l1;p3@00000000300000000008a%FR6a&~280^!l!96CYQ +xM)es+421}!Q~o5fc_fP)zD+0ot2U6Id2jc94 +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 + -----END STRICT TYPE LIB----- diff --git a/stl/RGB@0.1.0.stl b/stl/RGB@0.1.0.stl index df6cd4cf6e09264353c043e472d3ba59f145e03f..0ae504f2b6c7d13cbc485661db44762893f6cc33 100644 GIT binary patch delta 181 zcmZpf$k;H6al>*JCRT>Y0fq{bPqIwW|JNkudB0+x-Jcl(zaB|%*PLYg>-r_JyLGoF zeP`YB^P(JIP-<~%QCVt=Q)NkNvBl$TawG43nTZz_W`vWCD|4 KIV-a{JjV=PjwuoV diff --git a/stl/RGB@0.1.0.sty b/stl/RGB@0.1.0.sty index ac15388b..7c88d9cc 100644 --- a/stl/RGB@0.1.0.sty +++ b/stl/RGB@0.1.0.sty @@ -1,5 +1,5 @@ {- - Id: urn:ubideco:stl:EGAfKx8XqgxQV4spXziQHj1hXNuFckmgtn5df1YgrqGG#alfonso-journal-medusa + Id: urn:ubideco:stl:7kcfYU9L6bj6FdcZeBWgxLj5gPd6prrmbh7UwQdBEAq2#roof-plume-final Name: RGB Version: 0.1.0 Description: Consensus layer for RGB smart contracts @@ -29,6 +29,7 @@ import CommitVerify#GCWLX5TjFmMDCJr5cxWtwoSajBWDWbkQVSuTNbrtD1tg#egypt-wedding-c use StrictHash#cheese-final-locate use ReservedBytes1#joker-lemon-mental use ReservedBytes2#pocket-habitat-soviet + use ReservedBytes8#helena-button-combat import Bitcoin#HX2UBak8vPsTokug1DGMDvTpzns3xUdwZ7QJdyt4qBA9#speed-atlanta-trilogy use Vout#chrome-robin-gallop @@ -338,7 +339,7 @@ data Metadata : {MetaType -> ^ ..0xff MetaValue} @mnemonic(unicorn-empire-mama) data Occurrences : min U16, max U16 -@mnemonic(herbert-amadeus-college) +@mnemonic(road-norway-oregano) data OpCommitment : ffv Ffv , opType TypeCommitment , metadata CommitVerify.StrictHash#cheese-final-locate @@ -348,7 +349,7 @@ data OpCommitment : ffv Ffv , redeemed CommitVerify.StrictHash#cheese-final-locate , valencies CommitVerify.StrictHash#cheese-final-locate , witness CommitVerify.MerkleHash#culture-metro-modular - , script CommitVerify.StrictHash#cheese-final-locate + , validator CommitVerify.StrictHash#cheese-final-locate @mnemonic(slow-samuel-ceramic) data OpId : [Byte ^ 32] @@ -407,11 +408,12 @@ data RevealedFungible : value FungibleState , blinding BlindingFactor , tag AssetTag -@mnemonic(crimson-rabbit-karma) +@mnemonic(nerve-minimum-shampoo) data Schema : ffv Ffv , flags CommitVerify.ReservedBytes1#joker-lemon-mental , name StrictTypes.TypeName#gray-bonanza-kilo , timestamp I64 + , developer Identity , metaTypes {MetaType -> ^ ..0xff StrictTypes.SemId#cargo-plasma-catalog} , globalTypes {GlobalStateType -> ^ ..0xff GlobalStateSchema} , ownedTypes {AssignmentType -> ^ ..0xff OwnedStateSchema} @@ -419,7 +421,7 @@ data Schema : ffv Ffv , genesis GenesisSchema , extensions {ExtensionType -> ^ ..0xff ExtensionSchema} , transitions {TransitionType -> ^ ..0xff TransitionSchema} - , developer Identity + , reserved CommitVerify.ReservedBytes8#helena-button-combat @mnemonic(garcia-smoke-ozone) data SchemaId : [Byte ^ 32] diff --git a/stl/Schema.vesper b/stl/Schema.vesper index fa7e38ee..025e9e6d 100644 --- a/stl/Schema.vesper +++ b/stl/Schema.vesper @@ -30,12 +30,14 @@ SchemaId commitment hasher=SHA256 tagged=urn:lnp-bp:rgb:schema#2024-02-03 TransitionType mapKey TransitionSchema mapValue Identity serialized + ReservedBytes8 serialized Schema rec ffv is U16 aka=Ffv flags bytes len=1 aka=ReservedBytes1 name ascii len=1..100 aka=TypeName charset=AlphaCapsLodash timestamp is I64 + developer ascii len=0..4096 aka=Identity charset=AsciiPrintable metaTypes map len=0..MAX8 key is U16 aka=MetaType value bytes len=32 aka=SemId @@ -119,5 +121,4 @@ Schema rec some rec LibSite option wrapped tag=1 lib bytes len=32 aka=LibId pos is U16 - developer ascii len=0..4096 aka=Identity charset=AsciiPrintable diff --git a/stl/Transition.vesper b/stl/Transition.vesper index b6fe81ad..ba0d3d57 100644 --- a/stl/Transition.vesper +++ b/stl/Transition.vesper @@ -34,7 +34,7 @@ OpCommitment rec redeemed bytes len=32 aka=StrictHash valencies bytes len=32 aka=StrictHash witness bytes len=32 aka=MerkleHash - script bytes len=32 aka=StrictHash + validator bytes len=32 aka=StrictHash Transition rec ffv is U16 aka=Ffv From 1242c7e8a852f8e0e821f46e5e1e887c56bc8ded Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Wed, 17 Apr 2024 10:55:41 +0200 Subject: [PATCH 05/33] schema: default to escape urn prefix in displaying SchemaId --- src/schema/schema.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/schema/schema.rs b/src/schema/schema.rs index 7d8502d6..8955c2d3 100644 --- a/src/schema/schema.rs +++ b/src/schema/schema.rs @@ -143,7 +143,7 @@ impl ToBaid58<32> for SchemaId { impl FromBaid58<32> for SchemaId {} impl Display for SchemaId { fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - if !f.alternate() { + if f.alternate() { f.write_str("urn:lnp-bp:sc:")?; } if f.sign_minus() { From 19181e605e9b32d4843cacbb052b55b1afc84b72 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Fri, 19 Apr 2024 09:51:58 +0200 Subject: [PATCH 06/33] vm: update to AluVM with no byte_count method --- Cargo.lock | 2 +- Cargo.toml | 2 +- src/vm/isa.rs | 8 -------- src/vm/op_contract.rs | 21 --------------------- src/vm/op_timechain.rs | 2 -- 5 files changed, 2 insertions(+), 33 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bca12d28..13e937be 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5,7 +5,7 @@ version = 3 [[package]] name = "aluvm" version = "0.11.0-beta.5" -source = "git+https://github.com/AluVM/rust-aluvm?branch=v0.11#d18ea84836a8a96f3dfe61c99b94f2eab1417819" +source = "git+https://github.com/AluVM/rust-aluvm?branch=feat/rm-bytecount#a02daa56f94b4d80cf009d66c2378cd7809f19d7" dependencies = [ "amplify", "ascii-armor", diff --git a/Cargo.toml b/Cargo.toml index 785e9f2a..e383f462 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -69,4 +69,4 @@ bp-consensus = { git = "https://github.com/BP-WG/bp-core", branch = "v0.11" } bp-dbc = { git = "https://github.com/BP-WG/bp-core", branch = "v0.11" } bp-seals = { git = "https://github.com/BP-WG/bp-core", branch = "v0.11" } bp-core = { git = "https://github.com/BP-WG/bp-core", branch = "v0.11" } -aluvm = { git = "https://github.com/AluVM/rust-aluvm", branch = "v0.11" } +aluvm = { git = "https://github.com/AluVM/rust-aluvm", branch = "feat/rm-bytecount" } diff --git a/src/vm/isa.rs b/src/vm/isa.rs index df1f50aa..9f088f3c 100644 --- a/src/vm/isa.rs +++ b/src/vm/isa.rs @@ -87,14 +87,6 @@ impl InstructionSet for RgbIsa { } impl Bytecode for RgbIsa { - fn byte_count(&self) -> u16 { - match self { - RgbIsa::Contract(op) => op.byte_count(), - RgbIsa::Timechain(op) => op.byte_count(), - RgbIsa::Fail(_) => 0, - } - } - fn instr_range() -> RangeInclusive { INSTR_RGBISA_FROM..=INSTR_RGBISA_TO } fn instr_byte(&self) -> u8 { diff --git a/src/vm/op_contract.rs b/src/vm/op_contract.rs index 17bc5bfb..18cd7bd0 100644 --- a/src/vm/op_contract.rs +++ b/src/vm/op_contract.rs @@ -403,27 +403,6 @@ impl InstructionSet for ContractOp { } impl Bytecode for ContractOp { - fn byte_count(&self) -> u16 { - match self { - ContractOp::CnP(_, _) | - ContractOp::CnS(_, _) | - ContractOp::CnG(_, _) | - ContractOp::CnC(_, _) => 4, - - ContractOp::LdS(_, _, _) | - ContractOp::LdP(_, _, _) | - ContractOp::LdF(_, _, _) | - ContractOp::LdC(_, _, _) | - ContractOp::LdG(_, _, _) | - ContractOp::LdM(_, _) => 4, - - ContractOp::PcVs(_) => 3, - ContractOp::PcCs(_, _) => 5, - - ContractOp::Fail(_) => 1, - } - } - fn instr_range() -> RangeInclusive { INSTR_CONTRACT_FROM..=INSTR_CONTRACT_TO } fn instr_byte(&self) -> u8 { diff --git a/src/vm/op_timechain.rs b/src/vm/op_timechain.rs index 8d917acb..92378bb6 100644 --- a/src/vm/op_timechain.rs +++ b/src/vm/op_timechain.rs @@ -60,8 +60,6 @@ impl InstructionSet for TimechainOp { } impl Bytecode for TimechainOp { - fn byte_count(&self) -> u16 { 1 } - fn instr_range() -> RangeInclusive { INSTR_TIMECHAIN_FROM..=INSTR_TIMECHAIN_TO } fn instr_byte(&self) -> u8 { From 3c2c651ee7004a3decb49a5be5ff7631ede4ba6d Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Fri, 19 Apr 2024 20:07:34 +0200 Subject: [PATCH 07/33] vm: update macro assembly with new Pedersen opcodes --- src/vm/macroasm.rs | 5 +++-- src/vm/op_contract.rs | 16 ++++++++-------- src/vm/opcodes.rs | 2 +- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/vm/macroasm.rs b/src/vm/macroasm.rs index 18c98d68..468811a2 100644 --- a/src/vm/macroasm.rs +++ b/src/vm/macroasm.rs @@ -34,8 +34,9 @@ macro_rules! rgbasm { #[macro_export] macro_rules! isa_instr { - (pcvs $no:literal) => {{ RgbIsa::Contract(ContractOp::PcVs($no.into())) }}; - (pccs $no1:literal, $no2:literal) => {{ RgbIsa::Contract(ContractOp::PcCs($no1.into(), $no2.into())) }}; + (pcvs $no:literal) => {{ RgbIsa::Contract(ContractOp::Pcvs($no.into())) }}; + (pcas $no:literal) => {{ RgbIsa::Contract(ContractOp::Pcas($no.into())) }}; + (pcps $no:literal) => {{ RgbIsa::Contract(ContractOp::Pcps($no.into())) }}; (cng $t:literal,a8[$a_idx:literal]) => {{ RgbIsa::Contract(ContractOp::CnG($t.into(), Reg32::from(u5::with($a_idx)))) }}; (cnc $t:literal,a16[$a_idx:literal]) => {{ RgbIsa::Contract(ContractOp::CnC($t.into(), Reg32::from(u5::with($a_idx)))) }}; (ldg $t:literal,a8[$a_idx:literal],s16[$s_idx:literal]) => {{ diff --git a/src/vm/op_contract.rs b/src/vm/op_contract.rs index 7acf0862..4bae8525 100644 --- a/src/vm/op_contract.rs +++ b/src/vm/op_contract.rs @@ -156,7 +156,7 @@ pub enum ContractOp { /// If verification succeeds, doesn't change `st0` value; otherwise sets it /// to `false` and stops execution. #[display("pcis {0}")] - Pcis(/** owned state type */ AssignmentType), + Pcps(/** owned state type */ AssignmentType), /// All other future unsupported operations, which must set `st0` to /// `false` and stop the execution. @@ -183,7 +183,7 @@ impl InstructionSet for ContractOp { ContractOp::CnC(_, _) | ContractOp::LdM(_, _) => bset![], ContractOp::Pcvs(_) => bset![], - ContractOp::Pcas(_) | ContractOp::Pcis(_) => bset![Reg::A(RegA::A64, Reg32::Reg0)], + ContractOp::Pcas(_) | ContractOp::Pcps(_) => bset![Reg::A(RegA::A64, Reg32::Reg0)], ContractOp::Fail(_) => bset![], } } @@ -206,7 +206,7 @@ impl InstructionSet for ContractOp { ContractOp::LdM(_, reg) => { bset![Reg::S(*reg)] } - ContractOp::Pcvs(_) | ContractOp::Pcas(_) | ContractOp::Pcis(_) => { + ContractOp::Pcvs(_) | ContractOp::Pcas(_) | ContractOp::Pcps(_) => { bset![] } ContractOp::Fail(_) => bset![], @@ -226,7 +226,7 @@ impl InstructionSet for ContractOp { ContractOp::LdC(_, _, _) => 8, ContractOp::LdM(_, _) => 6, ContractOp::Pcvs(_) => 1024, - ContractOp::Pcas(_) | ContractOp::Pcis(_) => 512, + ContractOp::Pcas(_) | ContractOp::Pcps(_) => 512, ContractOp::Fail(_) => u64::MAX, } } @@ -406,7 +406,7 @@ impl InstructionSet for ContractOp { } } - ContractOp::Pcis(owned_state) => { + ContractOp::Pcps(owned_state) => { let Some(sum) = *regs.get_n(RegA::A64, Reg32::Reg0) else { fail!() }; @@ -474,7 +474,7 @@ impl Bytecode for ContractOp { ContractOp::Pcvs(_) => INSTR_PCVS, ContractOp::Pcas(_) => INSTR_PCAS, - ContractOp::Pcis(_) => INSTR_PCIS, + ContractOp::Pcps(_) => INSTR_PCPS, ContractOp::Fail(other) => *other, } @@ -536,7 +536,7 @@ impl Bytecode for ContractOp { ContractOp::Pcvs(state_type) => writer.write_u16(*state_type)?, ContractOp::Pcas(owned_type) => writer.write_u16(*owned_type)?, - ContractOp::Pcis(owned_type) => writer.write_u16(*owned_type)?, + ContractOp::Pcps(owned_type) => writer.write_u16(*owned_type)?, ContractOp::Fail(_) => {} } @@ -603,7 +603,7 @@ impl Bytecode for ContractOp { INSTR_PCVS => Self::Pcvs(reader.read_u16()?.into()), INSTR_PCAS => Self::Pcas(reader.read_u16()?.into()), - INSTR_PCIS => Self::Pcis(reader.read_u16()?.into()), + INSTR_PCPS => Self::Pcps(reader.read_u16()?.into()), x => Self::Fail(x), }) diff --git a/src/vm/opcodes.rs b/src/vm/opcodes.rs index ae22bbae..b1db3ea4 100644 --- a/src/vm/opcodes.rs +++ b/src/vm/opcodes.rs @@ -45,7 +45,7 @@ pub const INSTR_LDM: u8 = 0b11_001_010; pub const INSTR_PCVS: u8 = 0b11_010_000; pub const INSTR_PCAS: u8 = 0b11_010_001; -pub const INSTR_PCIS: u8 = 0b11_010_010; +pub const INSTR_PCPS: u8 = 0b11_010_010; // Reserved 0b11_010_011 pub const INSTR_CONTRACT_FROM: u8 = 0b11_000_000; pub const INSTR_CONTRACT_TO: u8 = 0b11_010_011; From cd05f81d10c550d1fc355f360c8cbb643459b46e Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Fri, 19 Apr 2024 20:02:39 +0200 Subject: [PATCH 08/33] chore: change prelude exports --- src/lib.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index cec0cb2e..2b40b09d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -44,9 +44,10 @@ extern crate commit_verify; extern crate serde_crate as serde; extern crate core; -pub mod contract; +mod contract; pub mod schema; pub mod validation; +#[macro_use] pub mod vm; #[cfg(feature = "stl")] pub mod stl; @@ -57,7 +58,7 @@ pub mod prelude { pub use schema::*; use super::*; - pub use super::{schema, vm}; + pub use super::{schema, stl, validation, vm}; } pub use prelude::*; From 31ab25b11579dc8f9a5adea328d95a8227be37b4 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Sat, 20 Apr 2024 10:12:24 +0200 Subject: [PATCH 09/33] vm: make RGB assembly opcodes use constant state types and not literals --- src/vm/macroasm.rs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/vm/macroasm.rs b/src/vm/macroasm.rs index 468811a2..db08196a 100644 --- a/src/vm/macroasm.rs +++ b/src/vm/macroasm.rs @@ -34,26 +34,26 @@ macro_rules! rgbasm { #[macro_export] macro_rules! isa_instr { - (pcvs $no:literal) => {{ RgbIsa::Contract(ContractOp::Pcvs($no.into())) }}; - (pcas $no:literal) => {{ RgbIsa::Contract(ContractOp::Pcas($no.into())) }}; - (pcps $no:literal) => {{ RgbIsa::Contract(ContractOp::Pcps($no.into())) }}; - (cng $t:literal,a8[$a_idx:literal]) => {{ RgbIsa::Contract(ContractOp::CnG($t.into(), Reg32::from(u5::with($a_idx)))) }}; - (cnc $t:literal,a16[$a_idx:literal]) => {{ RgbIsa::Contract(ContractOp::CnC($t.into(), Reg32::from(u5::with($a_idx)))) }}; - (ldg $t:literal,a8[$a_idx:literal],s16[$s_idx:literal]) => {{ + (pcvs $no:ident) => {{ RgbIsa::Contract(ContractOp::Pcvs($no.into())) }}; + (pcas $no:ident) => {{ RgbIsa::Contract(ContractOp::Pcas($no.into())) }}; + (pcps $no:ident) => {{ RgbIsa::Contract(ContractOp::Pcps($no.into())) }}; + (cng $t:ident,a8[$a_idx:literal]) => {{ RgbIsa::Contract(ContractOp::CnG($t.into(), Reg32::from(u5::with($a_idx)))) }}; + (cnc $t:ident,a16[$a_idx:literal]) => {{ RgbIsa::Contract(ContractOp::CnC($t.into(), Reg32::from(u5::with($a_idx)))) }}; + (ldg $t:ident,a8[$a_idx:literal],s16[$s_idx:literal]) => {{ RgbIsa::Contract(ContractOp::LdG( GlobalStateType::from($t as u16), Reg16::from(u4::with($a_idx)), RegS::from($s_idx), )) }}; - (ldp $t:literal,a16[$a_idx:literal],s16[$s_idx:literal]) => {{ + (ldp $t:ident,a16[$a_idx:literal],s16[$s_idx:literal]) => {{ RgbIsa::Contract(ContractOp::LdP( AssignmentType::from($t as u16), Reg16::from(u4::with($a_idx)), RegS::from($s_idx), )) }}; - (lds $t:literal,a16[$a_idx:literal],s16[$s_idx:literal]) => {{ + (lds $t:ident,a16[$a_idx:literal],s16[$s_idx:literal]) => {{ RgbIsa::Contract(ContractOp::LdS( AssignmentType::from($t as u16), Reg16::from(u4::with($a_idx)), From 2ffacbdef014d677c30d5e8aa2128f50699e83b0 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Sat, 20 Apr 2024 10:14:18 +0200 Subject: [PATCH 10/33] vm: add ldm macro assembly command --- src/vm/macroasm.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/vm/macroasm.rs b/src/vm/macroasm.rs index db08196a..7dde1bed 100644 --- a/src/vm/macroasm.rs +++ b/src/vm/macroasm.rs @@ -24,7 +24,7 @@ macro_rules! rgbasm { ($( $tt:tt )+) => {{ #[allow(unused_imports)] { use amplify::num::{u4, u5}; - use $crate::{AssignmentType, GlobalStateType}; + use $crate::{AssignmentType, GlobalStateType, MetaType}; use $crate::vm::{RgbIsa, ContractOp, TimechainOp}; use $crate::vm::aluasm_isa; use $crate::isa_instr; @@ -39,6 +39,13 @@ macro_rules! isa_instr { (pcps $no:ident) => {{ RgbIsa::Contract(ContractOp::Pcps($no.into())) }}; (cng $t:ident,a8[$a_idx:literal]) => {{ RgbIsa::Contract(ContractOp::CnG($t.into(), Reg32::from(u5::with($a_idx)))) }}; (cnc $t:ident,a16[$a_idx:literal]) => {{ RgbIsa::Contract(ContractOp::CnC($t.into(), Reg32::from(u5::with($a_idx)))) }}; + (ldm $t:ident,a8[$a_idx:literal],s16[$s_idx:literal]) => {{ + RgbIsa::Contract(ContractOp::LdM( + MetaType::from($t as u16), + Reg16::from(u4::with($a_idx)), + RegS::from($s_idx), + )) + }}; (ldg $t:ident,a8[$a_idx:literal],s16[$s_idx:literal]) => {{ RgbIsa::Contract(ContractOp::LdG( GlobalStateType::from($t as u16), From d63d447b45ff7a0a172bd2fded87be6813900882 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Sat, 20 Apr 2024 10:42:33 +0200 Subject: [PATCH 11/33] vm: require marco assembly codes to take constant state types, not ints --- src/vm/macroasm.rs | 43 +++++++++---------------------------------- 1 file changed, 9 insertions(+), 34 deletions(-) diff --git a/src/vm/macroasm.rs b/src/vm/macroasm.rs index 7dde1bed..e7269a2f 100644 --- a/src/vm/macroasm.rs +++ b/src/vm/macroasm.rs @@ -24,7 +24,6 @@ macro_rules! rgbasm { ($( $tt:tt )+) => {{ #[allow(unused_imports)] { use amplify::num::{u4, u5}; - use $crate::{AssignmentType, GlobalStateType, MetaType}; use $crate::vm::{RgbIsa, ContractOp, TimechainOp}; use $crate::vm::aluasm_isa; use $crate::isa_instr; @@ -34,38 +33,14 @@ macro_rules! rgbasm { #[macro_export] macro_rules! isa_instr { - (pcvs $no:ident) => {{ RgbIsa::Contract(ContractOp::Pcvs($no.into())) }}; - (pcas $no:ident) => {{ RgbIsa::Contract(ContractOp::Pcas($no.into())) }}; - (pcps $no:ident) => {{ RgbIsa::Contract(ContractOp::Pcps($no.into())) }}; - (cng $t:ident,a8[$a_idx:literal]) => {{ RgbIsa::Contract(ContractOp::CnG($t.into(), Reg32::from(u5::with($a_idx)))) }}; - (cnc $t:ident,a16[$a_idx:literal]) => {{ RgbIsa::Contract(ContractOp::CnC($t.into(), Reg32::from(u5::with($a_idx)))) }}; - (ldm $t:ident,a8[$a_idx:literal],s16[$s_idx:literal]) => {{ - RgbIsa::Contract(ContractOp::LdM( - MetaType::from($t as u16), - Reg16::from(u4::with($a_idx)), - RegS::from($s_idx), - )) - }}; - (ldg $t:ident,a8[$a_idx:literal],s16[$s_idx:literal]) => {{ - RgbIsa::Contract(ContractOp::LdG( - GlobalStateType::from($t as u16), - Reg16::from(u4::with($a_idx)), - RegS::from($s_idx), - )) - }}; - (ldp $t:ident,a16[$a_idx:literal],s16[$s_idx:literal]) => {{ - RgbIsa::Contract(ContractOp::LdP( - AssignmentType::from($t as u16), - Reg16::from(u4::with($a_idx)), - RegS::from($s_idx), - )) - }}; - (lds $t:ident,a16[$a_idx:literal],s16[$s_idx:literal]) => {{ - RgbIsa::Contract(ContractOp::LdS( - AssignmentType::from($t as u16), - Reg16::from(u4::with($a_idx)), - RegS::from($s_idx), - )) - }}; + (pcvs $no:ident) => {{ RgbIsa::Contract(ContractOp::Pcvs($no)) }}; + (pcas $no:ident) => {{ RgbIsa::Contract(ContractOp::Pcas($no)) }}; + (pcps $no:ident) => {{ RgbIsa::Contract(ContractOp::Pcps($no)) }}; + (cng $t:ident,a8[$a_idx:literal]) => {{ RgbIsa::Contract(ContractOp::CnG($t, Reg32::from(u5::with($a_idx)))) }}; + (cnc $t:ident,a16[$a_idx:literal]) => {{ RgbIsa::Contract(ContractOp::CnC($t, Reg32::from(u5::with($a_idx)))) }}; + (ldm $t:ident,a8[$a_idx:literal],s16[$s_idx:literal]) => {{ RgbIsa::Contract(ContractOp::LdM($t, Reg16::from(u4::with($a_idx)), RegS::from($s_idx))) }}; + (ldg $t:ident,a8[$a_idx:literal],s16[$s_idx:literal]) => {{ RgbIsa::Contract(ContractOp::LdG($t, Reg16::from(u4::with($a_idx)), RegS::from($s_idx))) }}; + (ldp $t:ident,a16[$a_idx:literal],s16[$s_idx:literal]) => {{ RgbIsa::Contract(ContractOp::LdP($t, Reg16::from(u4::with($a_idx)), RegS::from($s_idx))) }}; + (lds $t:ident,a16[$a_idx:literal],s16[$s_idx:literal]) => {{ RgbIsa::Contract(ContractOp::LdS($t, Reg16::from(u4::with($a_idx)), RegS::from($s_idx))) }}; ($op:ident $($tt:tt)+) => {{ compile_error!(concat!("unknown RGB assembly opcode `", stringify!($op), "`")) }}; } From f23a3dd4e5b71e5a958999add8ee7c1fd970fae2 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Sat, 20 Apr 2024 10:47:52 +0200 Subject: [PATCH 12/33] vm: fix ldm macro asm args --- src/vm/macroasm.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vm/macroasm.rs b/src/vm/macroasm.rs index e7269a2f..505dbc93 100644 --- a/src/vm/macroasm.rs +++ b/src/vm/macroasm.rs @@ -38,7 +38,7 @@ macro_rules! isa_instr { (pcps $no:ident) => {{ RgbIsa::Contract(ContractOp::Pcps($no)) }}; (cng $t:ident,a8[$a_idx:literal]) => {{ RgbIsa::Contract(ContractOp::CnG($t, Reg32::from(u5::with($a_idx)))) }}; (cnc $t:ident,a16[$a_idx:literal]) => {{ RgbIsa::Contract(ContractOp::CnC($t, Reg32::from(u5::with($a_idx)))) }}; - (ldm $t:ident,a8[$a_idx:literal],s16[$s_idx:literal]) => {{ RgbIsa::Contract(ContractOp::LdM($t, Reg16::from(u4::with($a_idx)), RegS::from($s_idx))) }}; + (ldm $t:ident,s16[$s_idx:literal]) => {{ RgbIsa::Contract(ContractOp::LdM($t, RegS::from($s_idx))) }}; (ldg $t:ident,a8[$a_idx:literal],s16[$s_idx:literal]) => {{ RgbIsa::Contract(ContractOp::LdG($t, Reg16::from(u4::with($a_idx)), RegS::from($s_idx))) }}; (ldp $t:ident,a16[$a_idx:literal],s16[$s_idx:literal]) => {{ RgbIsa::Contract(ContractOp::LdP($t, Reg16::from(u4::with($a_idx)), RegS::from($s_idx))) }}; (lds $t:ident,a16[$a_idx:literal],s16[$s_idx:literal]) => {{ RgbIsa::Contract(ContractOp::LdS($t, Reg16::from(u4::with($a_idx)), RegS::from($s_idx))) }}; From 9b34f1bd14c7b82b050c6932966b8956d569ce02 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Tue, 23 Apr 2024 00:19:48 +0200 Subject: [PATCH 13/33] fix serde serialization of id types --- src/contract/attachment.rs | 9 +++------ src/contract/commit.rs | 16 +++++++--------- src/lib.rs | 38 ++++++++++++++++++++++++++++++++++++++ src/schema/schema.rs | 9 +++------ 4 files changed, 51 insertions(+), 21 deletions(-) diff --git a/src/contract/attachment.rs b/src/contract/attachment.rs index 0f0db2c7..a8bc2d22 100644 --- a/src/contract/attachment.rs +++ b/src/contract/attachment.rs @@ -29,7 +29,7 @@ use commit_verify::{CommitId, CommitmentId, Conceal, DigestExt, Sha256}; use strict_encoding::StrictEncode; use super::{ConfidentialState, ExposedState}; -use crate::{ConcealedState, MediaType, RevealedState, StateType, LIB_NAME_RGB}; +use crate::{impl_serde_baid58, ConcealedState, MediaType, RevealedState, StateType, LIB_NAME_RGB}; /// Unique data attachment identifier #[derive(Wrapper, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, Display, From)] @@ -37,11 +37,6 @@ use crate::{ConcealedState, MediaType, RevealedState, StateType, LIB_NAME_RGB}; #[display(Self::to_baid58_string)] #[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] #[strict_type(lib = LIB_NAME_RGB)] -#[cfg_attr( - feature = "serde", - derive(Serialize, Deserialize), - serde(crate = "serde_crate", transparent) -)] pub struct AttachId( #[from] #[from([u8; 32])] @@ -64,6 +59,8 @@ impl AttachId { pub fn to_mnemonic(&self) -> String { self.to_baid58().mnemonic() } } +impl_serde_baid58!(AttachId); + #[derive(Clone, PartialOrd, Ord, PartialEq, Eq, Hash, Debug)] #[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] #[strict_type(lib = LIB_NAME_RGB)] diff --git a/src/contract/commit.rs b/src/contract/commit.rs index f046f06c..7c6bc1c4 100644 --- a/src/contract/commit.rs +++ b/src/contract/commit.rs @@ -37,10 +37,11 @@ use commit_verify::{ use strict_encoding::StrictDumb; use crate::{ - Assign, AssignmentType, Assignments, BundleId, ConcealedAttach, ConcealedData, ConcealedState, - ConfidentialState, DataState, ExposedSeal, ExposedState, Extension, ExtensionType, Ffv, - Genesis, GlobalState, GlobalStateType, Operation, PedersenCommitment, Redeemed, SchemaId, - SecretSeal, Transition, TransitionBundle, TransitionType, TypedAssigns, XChain, LIB_NAME_RGB, + impl_serde_baid58, Assign, AssignmentType, Assignments, BundleId, ConcealedAttach, + ConcealedData, ConcealedState, ConfidentialState, DataState, ExposedSeal, ExposedState, + Extension, ExtensionType, Ffv, Genesis, GlobalState, GlobalStateType, Operation, + PedersenCommitment, Redeemed, SchemaId, SecretSeal, Transition, TransitionBundle, + TransitionType, TypedAssigns, XChain, LIB_NAME_RGB, }; /// Unique contract identifier equivalent to the contract genesis commitment @@ -48,11 +49,6 @@ use crate::{ #[wrapper(Deref, BorrowSlice, Hex, Index, RangeOps)] #[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] #[strict_type(lib = LIB_NAME_RGB)] -#[cfg_attr( - feature = "serde", - derive(Serialize, Deserialize), - serde(crate = "serde_crate", transparent) -)] pub struct ContractId( #[from] #[from([u8; 32])] @@ -103,6 +99,8 @@ impl From for mpc::ProtocolId { fn from(id: ContractId) -> Self { mpc::ProtocolId::from_inner(id.into_inner()) } } +impl_serde_baid58!(ContractId); + /// Unique operation (genesis, extensions & state transition) identifier /// equivalent to the commitment hash #[derive(Wrapper, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, Display, From)] diff --git a/src/lib.rs b/src/lib.rs index 2b40b09d..97f1917e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -98,5 +98,43 @@ mod _ffv { } } +#[macro_export] +macro_rules! impl_serde_baid58 { + ($ty:ty) => { + #[cfg(feature = "serde")] + mod _serde { + use amplify::ByteArray; + use serde_crate::de::Error; + use serde_crate::{Deserialize, Deserializer, Serialize, Serializer}; + + use super::*; + + impl Serialize for $ty { + fn serialize(&self, serializer: S) -> Result + where S: Serializer { + if serializer.is_human_readable() { + self.to_string().serialize(serializer) + } else { + self.to_byte_array().serialize(serializer) + } + } + } + + impl<'de> Deserialize<'de> for $ty { + fn deserialize(deserializer: D) -> Result + where D: Deserializer<'de> { + if deserializer.is_human_readable() { + let s = String::deserialize(deserializer)?; + Self::from_str(&s).map_err(D::Error::custom) + } else { + let bytes = <[u8; 32]>::deserialize(deserializer)?; + Ok(Self::from_byte_array(bytes)) + } + } + } + } + }; +} + // TODO: Validate strict type data // TODO: Add parsed global and structured state to the ContractState diff --git a/src/schema/schema.rs b/src/schema/schema.rs index a3e36e9c..a8920d73 100644 --- a/src/schema/schema.rs +++ b/src/schema/schema.rs @@ -40,7 +40,7 @@ use strict_types::SemId; use super::{ AssignmentType, ExtensionSchema, GenesisSchema, OwnedStateSchema, TransitionSchema, ValencyType, }; -use crate::{Ffv, GlobalStateSchema, Identity, Occurrences, LIB_NAME_RGB}; +use crate::{impl_serde_baid58, Ffv, GlobalStateSchema, Identity, Occurrences, LIB_NAME_RGB}; #[derive(Wrapper, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, From, Display)] #[wrapper(FromStr, LowerHex, UpperHex)] @@ -115,11 +115,6 @@ impl TransitionType { #[wrapper(Deref, BorrowSlice, Hex, Index, RangeOps)] #[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] #[strict_type(lib = LIB_NAME_RGB)] -#[cfg_attr( - feature = "serde", - derive(Serialize, Deserialize), - serde(crate = "serde_crate", transparent) -)] pub struct SchemaId( #[from] #[from([u8; 32])] @@ -163,6 +158,8 @@ impl SchemaId { pub fn to_mnemonic(&self) -> String { self.to_baid58().mnemonic() } } +impl_serde_baid58!(SchemaId); + #[derive(Clone, Eq, Debug)] #[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] #[strict_type(lib = LIB_NAME_RGB)] From 3d6b34b1c5e239780dae74fe18730fd8e3315ce1 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Tue, 23 Apr 2024 11:44:12 +0200 Subject: [PATCH 14/33] chore: bump ascii-armor version --- Cargo.lock | 49 +++++++++++++++++++++++++++++++------------------ Cargo.toml | 2 +- 2 files changed, 32 insertions(+), 19 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 13e937be..f71eb494 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8,7 +8,7 @@ version = "0.11.0-beta.5" source = "git+https://github.com/AluVM/rust-aluvm?branch=feat/rm-bytecount#a02daa56f94b4d80cf009d66c2378cd7809f19d7" dependencies = [ "amplify", - "ascii-armor", + "ascii-armor 0.2.0", "baid58", "blake3", "getrandom", @@ -132,6 +132,19 @@ dependencies = [ "strict_encoding", ] +[[package]] +name = "ascii-armor" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44ce552de9efa4fdee1a7920f3587e17689bf4a4ba149a7892f91820673c1e29" +dependencies = [ + "amplify", + "baid58", + "base85", + "sha2", + "strict_encoding", +] + [[package]] name = "autocfg" version = "1.2.0" @@ -202,7 +215,7 @@ dependencies = [ [[package]] name = "bp-consensus" version = "0.11.0-beta.5" -source = "git+https://github.com/BP-WG/bp-core?branch=v0.11#27a4b711613f88276b5b7da0c2a3b27164b431e8" +source = "git+https://github.com/BP-WG/bp-core?branch=v0.11#ff275566b6546c39d6a37579861b918104fd859d" dependencies = [ "amplify", "chrono", @@ -216,7 +229,7 @@ dependencies = [ [[package]] name = "bp-core" version = "0.11.0-beta.5" -source = "git+https://github.com/BP-WG/bp-core?branch=v0.11#27a4b711613f88276b5b7da0c2a3b27164b431e8" +source = "git+https://github.com/BP-WG/bp-core?branch=v0.11#ff275566b6546c39d6a37579861b918104fd859d" dependencies = [ "amplify", "bp-consensus", @@ -234,7 +247,7 @@ dependencies = [ [[package]] name = "bp-dbc" version = "0.11.0-beta.5" -source = "git+https://github.com/BP-WG/bp-core?branch=v0.11#27a4b711613f88276b5b7da0c2a3b27164b431e8" +source = "git+https://github.com/BP-WG/bp-core?branch=v0.11#ff275566b6546c39d6a37579861b918104fd859d" dependencies = [ "amplify", "base85", @@ -248,7 +261,7 @@ dependencies = [ [[package]] name = "bp-seals" version = "0.11.0-beta.5" -source = "git+https://github.com/BP-WG/bp-core?branch=v0.11#27a4b711613f88276b5b7da0c2a3b27164b431e8" +source = "git+https://github.com/BP-WG/bp-core?branch=v0.11#ff275566b6546c39d6a37579861b918104fd859d" dependencies = [ "amplify", "baid58", @@ -269,9 +282,9 @@ checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "cc" -version = "1.0.94" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17f6e324229dc011159fcc089755d1e2e216a90d43a7dea6853ca740b84f35e7" +checksum = "d32a725bc159af97c3e629873bb9f88fb8cf8a4867175f76dc987815ea07c83b" [[package]] name = "cfg-if" @@ -296,7 +309,7 @@ dependencies = [ [[package]] name = "commit_encoding_derive" version = "0.11.0-beta.5" -source = "git+https://github.com/LNP-BP/client_side_validation?branch=v0.11#d32e1af11a599643b235706efd51d0097347f082" +source = "git+https://github.com/LNP-BP/client_side_validation?branch=v0.11#f51e1e0d010b1531acc939d2443af552e8755bb7" dependencies = [ "amplify", "amplify_syn", @@ -308,7 +321,7 @@ dependencies = [ [[package]] name = "commit_verify" version = "0.11.0-beta.5" -source = "git+https://github.com/LNP-BP/client_side_validation?branch=v0.11#d32e1af11a599643b235706efd51d0097347f082" +source = "git+https://github.com/LNP-BP/client_side_validation?branch=v0.11#f51e1e0d010b1531acc939d2443af552e8755bb7" dependencies = [ "amplify", "commit_encoding_derive", @@ -587,7 +600,7 @@ version = "0.11.0-beta.5" dependencies = [ "aluvm", "amplify", - "ascii-armor", + "ascii-armor 0.3.0", "baid58", "bp-core", "chrono", @@ -765,7 +778,7 @@ dependencies = [ [[package]] name = "single_use_seals" version = "0.11.0-beta.5" -source = "git+https://github.com/LNP-BP/client_side_validation?branch=v0.11#d32e1af11a599643b235706efd51d0097347f082" +source = "git+https://github.com/LNP-BP/client_side_validation?branch=v0.11#f51e1e0d010b1531acc939d2443af552e8755bb7" dependencies = [ "amplify_derive", ] @@ -802,7 +815,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "152bd04284e9093f23a911d0d89b7dd950a461af1ed5e243f6215fbcd45e9445" dependencies = [ "amplify", - "ascii-armor", + "ascii-armor 0.2.0", "baid58", "half", "indexmap", @@ -849,18 +862,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.58" +version = "1.0.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" +checksum = "f0126ad08bff79f29fc3ae6a55cc72352056dfff61e3ff8bb7129476d44b23aa" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.58" +version = "1.0.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" +checksum = "d1cd413b5d558b4c5bf3680e324a6fa5014e7b7c067a51e69dbdf47eb7148b66" dependencies = [ "proc-macro2", "quote", @@ -890,9 +903,9 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.9" +version = "0.22.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e40bb779c5187258fd7aad0eb68cb8706a0a81fa712fbea808ab43c4b8374c4" +checksum = "d3328d4f68a705b2a4498da1d580585d39a6510f98318a2cec3018a7ec61ddef" dependencies = [ "indexmap", "serde", diff --git a/Cargo.toml b/Cargo.toml index e383f462..bb746cc5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,7 +23,7 @@ required-features = ["stl"] [dependencies] amplify = { version = "~4.6.0", features = ["rand"] } -ascii-armor = "0.2.0" +ascii-armor = "0.3.0" strict_encoding = "~2.7.0-beta.3" strict_types = { version = "~2.7.0-beta.3", features = ["armor"] } aluvm = { version = "~0.11.0-beta.5", features = ["std", "ascii-armor"] } From ba712f734ed030f51c557d7eff2bd7ef9cdde7d3 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Thu, 25 Apr 2024 13:27:43 +0200 Subject: [PATCH 15/33] schema: fix commitment to timestamp --- src/contract/operations.rs | 2 +- src/schema/schema.rs | 5 +++-- stl/Schema.vesper | 3 ++- stl/Transition.vesper | 2 +- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/contract/operations.rs b/src/contract/operations.rs index e997156d..76ea76d3 100644 --- a/src/contract/operations.rs +++ b/src/contract/operations.rs @@ -294,6 +294,7 @@ pub struct Genesis { pub schema_id: SchemaId, pub flags: ReservedBytes<1, 0>, pub timestamp: i64, + pub issuer: Identity, pub testnet: bool, pub alt_layers1: AltLayer1Set, pub asset_tags: AssetTags, @@ -301,7 +302,6 @@ pub struct Genesis { pub globals: GlobalState, pub assignments: Assignments, pub valencies: Valencies, - pub issuer: Identity, pub validator: ReservedBytes<1, 0>, } diff --git a/src/schema/schema.rs b/src/schema/schema.rs index a8920d73..eca4e07b 100644 --- a/src/schema/schema.rs +++ b/src/schema/schema.rs @@ -195,6 +195,9 @@ impl CommitEncode for Schema { e.commit_to_serialized(&self.flags); e.commit_to_serialized(&self.name); + e.commit_to_serialized(&self.timestamp); + e.commit_to_serialized(&self.developer); + e.commit_to_map(&self.meta_types); e.commit_to_map(&self.global_types); e.commit_to_map(&self.owned_types); @@ -203,8 +206,6 @@ impl CommitEncode for Schema { e.commit_to_map(&self.extensions); e.commit_to_map(&self.transitions); - e.commit_to_serialized(&self.developer); - e.commit_to_serialized(&self.reserved); } } diff --git a/stl/Schema.vesper b/stl/Schema.vesper index 025e9e6d..578e9cd5 100644 --- a/stl/Schema.vesper +++ b/stl/Schema.vesper @@ -11,6 +11,8 @@ SchemaId commitment hasher=SHA256 tagged=urn:lnp-bp:rgb:schema#2024-02-03 Ffv serialized ReservedBytes1 serialized TypeName serialized + I64 serialized + Identity serialized SemId map len=0..MAX8 MetaType mapKey SemId mapValue @@ -29,7 +31,6 @@ SchemaId commitment hasher=SHA256 tagged=urn:lnp-bp:rgb:schema#2024-02-03 TransitionSchema map len=0..MAX8 TransitionType mapKey TransitionSchema mapValue - Identity serialized ReservedBytes8 serialized Schema rec diff --git a/stl/Transition.vesper b/stl/Transition.vesper index 6d1f202b..e1f2c2bf 100644 --- a/stl/Transition.vesper +++ b/stl/Transition.vesper @@ -17,9 +17,9 @@ OpCommitment rec flags bytes len=1 aka=ReservedBytes1 schemaId bytes len=32 aka=SchemaId timestamp is I64 + issuer bytes len=32 aka=StrictHash testnet enum Bool false=0 true=1 altLayers1 bytes len=32 aka=StrictHash - issuer bytes len=32 aka=StrictHash assetTags bytes len=32 aka=StrictHash transition tuple tag=1 _ bytes len=32 aka=ContractId From afc19b96340336ef82266b0372a1365de72b104d Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Thu, 25 Apr 2024 13:27:55 +0200 Subject: [PATCH 16/33] chore: updgrade ids from Baid58 to Baid64 --- Cargo.lock | 75 ++-- Cargo.toml | 21 +- src/contract/attachment.rs | 49 +-- src/contract/commit.rs | 38 +- src/contract/operations.rs | 35 +- src/contract/seal.rs | 2 +- src/lib.rs | 2 +- src/schema/schema.rs | 65 ++-- src/stl.rs | 2 +- src/vm/op_contract.rs | 2 +- stl/RGB@0.1.0.sta | 740 ++++++++++++++++++------------------- stl/RGB@0.1.0.stl | Bin 18551 -> 18803 bytes stl/RGB@0.1.0.sty | 413 ++++++++++----------- stl/Schema.vesper | 4 +- 14 files changed, 691 insertions(+), 757 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f71eb494..3545c67f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5,11 +5,11 @@ version = 3 [[package]] name = "aluvm" version = "0.11.0-beta.5" -source = "git+https://github.com/AluVM/rust-aluvm?branch=feat/rm-bytecount#a02daa56f94b4d80cf009d66c2378cd7809f19d7" +source = "git+https://github.com/AluVM/rust-aluvm?branch=develop#d8efe3007a5680a99cf86159b8dcc81cf1ed7278" dependencies = [ "amplify", - "ascii-armor 0.2.0", - "baid58", + "ascii-armor", + "baid64", "blake3", "getrandom", "half", @@ -121,25 +121,11 @@ dependencies = [ [[package]] name = "ascii-armor" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "743d90b41a39d6e3920eef64a70f6411097cbb47141606a45b2a96533ec7111c" -dependencies = [ - "amplify", - "baid58", - "base85", - "sha2", - "strict_encoding", -] - -[[package]] -name = "ascii-armor" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44ce552de9efa4fdee1a7920f3587e17689bf4a4ba149a7892f91820673c1e29" +version = "0.4.0" +source = "git+https://github.com/UBIDECO/ascii-armor#38dc9767f36db3957ac3dade280a04d9a72b6be4" dependencies = [ "amplify", - "baid58", + "baid64", "base85", "sha2", "strict_encoding", @@ -152,22 +138,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" [[package]] -name = "baid58" -version = "0.4.4" +name = "baid64" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc0585242d87ed976e05db6ae86a0f771f140104a4b6c91b4c3e43b9b2357486" +checksum = "7b8b80494235048845f856b267a4a1d97df59fd14ed7ca92652f834ce93becc6" dependencies = [ - "base58", - "blake3", + "amplify", + "base64", "mnemonic", "sha2", ] [[package]] -name = "base58" -version = "0.2.0" +name = "base64" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6107fe1be6682a68940da878d9e9f5e90ca5745b3dec9fd1bb393c8777d4f581" +checksum = "9475866fec1451be56a3c2400fd081ff546538961565ccb5b7142cbd22bc7a51" [[package]] name = "base85" @@ -215,7 +201,7 @@ dependencies = [ [[package]] name = "bp-consensus" version = "0.11.0-beta.5" -source = "git+https://github.com/BP-WG/bp-core?branch=v0.11#ff275566b6546c39d6a37579861b918104fd859d" +source = "git+https://github.com/BP-WG/bp-core?branch=develop#970147b7cfa3dd3013ceec5bc6eacaea7c0d7bb9" dependencies = [ "amplify", "chrono", @@ -229,7 +215,7 @@ dependencies = [ [[package]] name = "bp-core" version = "0.11.0-beta.5" -source = "git+https://github.com/BP-WG/bp-core?branch=v0.11#ff275566b6546c39d6a37579861b918104fd859d" +source = "git+https://github.com/BP-WG/bp-core?branch=develop#970147b7cfa3dd3013ceec5bc6eacaea7c0d7bb9" dependencies = [ "amplify", "bp-consensus", @@ -247,7 +233,7 @@ dependencies = [ [[package]] name = "bp-dbc" version = "0.11.0-beta.5" -source = "git+https://github.com/BP-WG/bp-core?branch=v0.11#ff275566b6546c39d6a37579861b918104fd859d" +source = "git+https://github.com/BP-WG/bp-core?branch=develop#970147b7cfa3dd3013ceec5bc6eacaea7c0d7bb9" dependencies = [ "amplify", "base85", @@ -261,10 +247,10 @@ dependencies = [ [[package]] name = "bp-seals" version = "0.11.0-beta.5" -source = "git+https://github.com/BP-WG/bp-core?branch=v0.11#ff275566b6546c39d6a37579861b918104fd859d" +source = "git+https://github.com/BP-WG/bp-core?branch=develop#970147b7cfa3dd3013ceec5bc6eacaea7c0d7bb9" dependencies = [ "amplify", - "baid58", + "baid64", "bp-consensus", "bp-dbc", "commit_verify", @@ -309,7 +295,7 @@ dependencies = [ [[package]] name = "commit_encoding_derive" version = "0.11.0-beta.5" -source = "git+https://github.com/LNP-BP/client_side_validation?branch=v0.11#f51e1e0d010b1531acc939d2443af552e8755bb7" +source = "git+https://github.com/LNP-BP/client_side_validation?branch=develop#5e50b251aa5a5c4d83c47dad609a15ef3d50800f" dependencies = [ "amplify", "amplify_syn", @@ -321,7 +307,7 @@ dependencies = [ [[package]] name = "commit_verify" version = "0.11.0-beta.5" -source = "git+https://github.com/LNP-BP/client_side_validation?branch=v0.11#f51e1e0d010b1531acc939d2443af552e8755bb7" +source = "git+https://github.com/LNP-BP/client_side_validation?branch=develop#5e50b251aa5a5c4d83c47dad609a15ef3d50800f" dependencies = [ "amplify", "commit_encoding_derive", @@ -600,8 +586,8 @@ version = "0.11.0-beta.5" dependencies = [ "aluvm", "amplify", - "ascii-armor 0.3.0", - "baid58", + "ascii-armor", + "baid64", "bp-core", "chrono", "commit_verify", @@ -778,7 +764,7 @@ dependencies = [ [[package]] name = "single_use_seals" version = "0.11.0-beta.5" -source = "git+https://github.com/LNP-BP/client_side_validation?branch=v0.11#f51e1e0d010b1531acc939d2443af552e8755bb7" +source = "git+https://github.com/LNP-BP/client_side_validation?branch=develop#5e50b251aa5a5c4d83c47dad609a15ef3d50800f" dependencies = [ "amplify_derive", ] @@ -786,8 +772,7 @@ dependencies = [ [[package]] name = "strict_encoding" version = "2.7.0-beta.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c463f8ea993e323740d78544473e791adb91ac659f5bf2c1a59db64a34f99fc" +source = "git+https://github.com/strict-types/strict-encoding?branch=develop#7c46c97c10655612a1c71b984faa62ffc543b226" dependencies = [ "amplify", "half", @@ -798,8 +783,7 @@ dependencies = [ [[package]] name = "strict_encoding_derive" version = "2.7.0-beta.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "475fa6f1fdde6e0555422b5111ad34bde30a1459af3599f920c3af9829772c0e" +source = "git+https://github.com/strict-types/strict-encoding?branch=develop#7c46c97c10655612a1c71b984faa62ffc543b226" dependencies = [ "amplify_syn", "heck", @@ -811,12 +795,11 @@ dependencies = [ [[package]] name = "strict_types" version = "2.7.0-beta.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "152bd04284e9093f23a911d0d89b7dd950a461af1ed5e243f6215fbcd45e9445" +source = "git+https://github.com/strict-types/strict-types?branch=develop#a2e860f36f24b477712551a6db349edcf08efb3e" dependencies = [ "amplify", - "ascii-armor 0.2.0", - "baid58", + "ascii-armor", + "baid64", "half", "indexmap", "serde", diff --git a/Cargo.toml b/Cargo.toml index bb746cc5..fd6d9357 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,7 +23,8 @@ required-features = ["stl"] [dependencies] amplify = { version = "~4.6.0", features = ["rand"] } -ascii-armor = "0.3.0" +ascii-armor = "~0.4.0" +baid64 = "~0.1.0" strict_encoding = "~2.7.0-beta.3" strict_types = { version = "~2.7.0-beta.3", features = ["armor"] } aluvm = { version = "~0.11.0-beta.5", features = ["std", "ascii-armor"] } @@ -31,7 +32,6 @@ commit_verify = { version = "~0.11.0-beta.5", features = ["rand", "derive"] } single_use_seals = "~0.11.0-beta.5" bp-core = { version = "~0.11.0-beta.5" } secp256k1-zkp = { version = "0.10.1", features = ["rand", "rand-std", "global-context"] } # TODO: Update version before the release -baid58 = "~0.4.4" mime = "~0.3.17" serde_crate = { package = "serde", version = "1", features = ["derive"], optional = true } chrono = "0.4.31" @@ -63,10 +63,13 @@ wasm-bindgen-test = "0.3" features = ["all"] [patch.crates-io] -commit_verify = { git = "https://github.com/LNP-BP/client_side_validation", branch = "v0.11" } -single_use_seals = { git = "https://github.com/LNP-BP/client_side_validation", branch = "v0.11" } -bp-consensus = { git = "https://github.com/BP-WG/bp-core", branch = "v0.11" } -bp-dbc = { git = "https://github.com/BP-WG/bp-core", branch = "v0.11" } -bp-seals = { git = "https://github.com/BP-WG/bp-core", branch = "v0.11" } -bp-core = { git = "https://github.com/BP-WG/bp-core", branch = "v0.11" } -aluvm = { git = "https://github.com/AluVM/rust-aluvm", branch = "feat/rm-bytecount" } +ascii-armor = { git = "https://github.com/UBIDECO/ascii-armor" } +strict_encoding = { git = "https://github.com/strict-types/strict-encoding", branch = "develop" } +strict_types = { git = "https://github.com/strict-types/strict-types", branch = "develop" } +commit_verify = { git = "https://github.com/LNP-BP/client_side_validation", branch = "develop" } +single_use_seals = { git = "https://github.com/LNP-BP/client_side_validation", branch = "develop" } +bp-consensus = { git = "https://github.com/BP-WG/bp-core", branch = "develop" } +bp-dbc = { git = "https://github.com/BP-WG/bp-core", branch = "develop" } +bp-seals = { git = "https://github.com/BP-WG/bp-core", branch = "develop" } +bp-core = { git = "https://github.com/BP-WG/bp-core", branch = "develop" } +aluvm = { git = "https://github.com/AluVM/rust-aluvm", branch = "develop" } diff --git a/src/contract/attachment.rs b/src/contract/attachment.rs index a8bc2d22..d791ae34 100644 --- a/src/contract/attachment.rs +++ b/src/contract/attachment.rs @@ -20,21 +20,22 @@ // See the License for the specific language governing permissions and // limitations under the License. +use std::fmt; +use std::fmt::{Display, Formatter}; use std::str::FromStr; use amplify::{ByteArray, Bytes32}; -use baid58::{Baid58ParseError, Chunking, FromBaid58, ToBaid58, CHUNKING_32}; +use baid64::{Baid64ParseError, DisplayBaid64, FromBaid64Str}; use bp::secp256k1::rand::{random, Rng, RngCore}; use commit_verify::{CommitId, CommitmentId, Conceal, DigestExt, Sha256}; use strict_encoding::StrictEncode; use super::{ConfidentialState, ExposedState}; -use crate::{impl_serde_baid58, ConcealedState, MediaType, RevealedState, StateType, LIB_NAME_RGB}; +use crate::{impl_serde_baid64, ConcealedState, MediaType, RevealedState, StateType, LIB_NAME_RGB}; /// Unique data attachment identifier -#[derive(Wrapper, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, Display, From)] +#[derive(Wrapper, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, From)] #[wrapper(Deref, BorrowSlice, Hex, Index, RangeOps)] -#[display(Self::to_baid58_string)] #[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] #[strict_type(lib = LIB_NAME_RGB)] pub struct AttachId( @@ -43,23 +44,24 @@ pub struct AttachId( Bytes32, ); -impl ToBaid58<32> for AttachId { - const HRI: &'static str = "stashfs"; - const CHUNKING: Option = CHUNKING_32; - fn to_baid58_payload(&self) -> [u8; 32] { self.to_byte_array() } - fn to_baid58_string(&self) -> String { self.to_string() } +impl DisplayBaid64 for AttachId { + const HRI: &'static str = "rgb:fs"; + const CHUNKING: bool = true; + const PREFIX: bool = true; + const EMBED_CHECKSUM: bool = false; + const MNEMONIC: bool = true; + fn to_baid64_payload(&self) -> [u8; 32] { self.to_byte_array() } } -impl FromBaid58<32> for AttachId {} +impl FromBaid64Str for AttachId {} impl FromStr for AttachId { - type Err = Baid58ParseError; - fn from_str(s: &str) -> Result { Self::from_baid58_chunked_str(s, ':', '#') } + type Err = Baid64ParseError; + fn from_str(s: &str) -> Result { Self::from_baid64_str(s) } } -impl AttachId { - pub fn to_baid58_string(&self) -> String { format!("{::<#.2}", self.to_baid58()) } - pub fn to_mnemonic(&self) -> String { self.to_baid58().mnemonic() } +impl Display for AttachId { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { self.fmt_baid64(f) } } -impl_serde_baid58!(AttachId); +impl_serde_baid64!(AttachId); #[derive(Clone, PartialOrd, Ord, PartialEq, Eq, Hash, Debug)] #[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] @@ -156,25 +158,26 @@ mod test { #[test] fn attach_id_display() { const ID: &str = - "stashfs:8JEvTX-J6sD5U4n-1p7GEERY-MPN9ijjs-9ZM4ysJ3-qhgyqM#juice-empty-joker"; + "rgb:fs:bGxsbGxs-bGxsbGx-sbGxsbG-xsbGxsb-GxsbGxs-bGxsbGw#invite-potato-oval"; let id = AttachId::from_byte_array([0x6c; 32]); assert_eq!(ID, id.to_string()); - assert_eq!(ID, id.to_baid58_string()); - assert_eq!("juice-empty-joker", id.to_mnemonic()); + assert_eq!(ID, id.to_baid64_string()); + assert_eq!("invite-potato-oval", id.to_baid64_mnemonic()); } #[test] fn attach_id_from_str() { let id = AttachId::from_byte_array([0x6c; 32]); assert_eq!( - Ok(id), + id, AttachId::from_str( - "stashfs:8JEvTX-J6sD5U4n-1p7GEERY-MPN9ijjs-9ZM4ysJ3-qhgyqM#juice-empty-joker" + "rgb:fs:bGxsbGxs-bGxsbGx-sbGxsbG-xsbGxsb-GxsbGxs-bGxsbGw#invite-potato-oval" ) + .unwrap() ); assert_eq!( - Ok(id), - AttachId::from_str("stashfs:8JEvTX-J6sD5U4n-1p7GEERY-MPN9ijjs-9ZM4ysJ3-qhgyqM") + id, + AttachId::from_str("rgb:fs:bGxsbGxs-bGxsbGx-sbGxsbG-xsbGxsb-GxsbGxs-bGxsbGw").unwrap() ); } } diff --git a/src/contract/commit.rs b/src/contract/commit.rs index 7c6bc1c4..3a907ee4 100644 --- a/src/contract/commit.rs +++ b/src/contract/commit.rs @@ -29,7 +29,7 @@ use amplify::confinement::{Confined, MediumOrdMap, U16 as U16MAX}; use amplify::hex::{FromHex, ToHex}; use amplify::num::u256; use amplify::{hex, ByteArray, Bytes32, FromSliceError, Wrapper}; -use baid58::{Baid58ParseError, Chunking, FromBaid58, ToBaid58, CHUNKING_32CHECKSUM}; +use baid64::{Baid64ParseError, DisplayBaid64, FromBaid64Str}; use commit_verify::{ mpc, CommitEncode, CommitEngine, CommitId, CommitmentId, Conceal, DigestExt, MerkleHash, MerkleLeaves, ReservedBytes, Sha256, StrictHash, @@ -37,7 +37,7 @@ use commit_verify::{ use strict_encoding::StrictDumb; use crate::{ - impl_serde_baid58, Assign, AssignmentType, Assignments, BundleId, ConcealedAttach, + impl_serde_baid64, Assign, AssignmentType, Assignments, BundleId, ConcealedAttach, ConcealedData, ConcealedState, ConfidentialState, DataState, ExposedSeal, ExposedState, Extension, ExtensionType, Ffv, Genesis, GlobalState, GlobalStateType, Operation, PedersenCommitment, Redeemed, SchemaId, SecretSeal, Transition, TransitionBundle, @@ -68,27 +68,21 @@ impl ContractId { } } -impl ToBaid58<32> for ContractId { +impl DisplayBaid64 for ContractId { const HRI: &'static str = "rgb"; - const CHUNKING: Option = CHUNKING_32CHECKSUM; - fn to_baid58_payload(&self) -> [u8; 32] { self.to_byte_array() } - fn to_baid58_string(&self) -> String { self.to_string() } -} -impl FromBaid58<32> for ContractId {} -impl Display for ContractId { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - if f.alternate() { - write!(f, "{::^}", self.to_baid58()) - } else { - write!(f, "{::^.3}", self.to_baid58()) - } - } + const CHUNKING: bool = true; + const PREFIX: bool = true; + const EMBED_CHECKSUM: bool = false; + const MNEMONIC: bool = false; + fn to_baid64_payload(&self) -> [u8; 32] { self.to_byte_array() } } +impl FromBaid64Str for ContractId {} impl FromStr for ContractId { - type Err = Baid58ParseError; - fn from_str(s: &str) -> Result { - Self::from_baid58_maybe_chunked_str(s, ':', '#') - } + type Err = Baid64ParseError; + fn from_str(s: &str) -> Result { Self::from_baid64_str(s) } +} +impl Display for ContractId { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { self.fmt_baid64(f) } } impl From for ContractId { @@ -99,7 +93,7 @@ impl From for mpc::ProtocolId { fn from(id: ContractId) -> Self { mpc::ProtocolId::from_inner(id.into_inner()) } } -impl_serde_baid58!(ContractId); +impl_serde_baid64!(ContractId); /// Unique operation (genesis, extensions & state transition) identifier /// equivalent to the commitment hash @@ -241,9 +235,9 @@ pub struct BaseCommitment { pub flags: ReservedBytes<1, 0>, pub schema_id: SchemaId, pub timestamp: i64, + pub issuer: StrictHash, pub testnet: bool, pub alt_layers1: StrictHash, - pub issuer: StrictHash, pub asset_tags: StrictHash, } diff --git a/src/contract/operations.rs b/src/contract/operations.rs index 76ea76d3..d06ed93c 100644 --- a/src/contract/operations.rs +++ b/src/contract/operations.rs @@ -271,10 +271,10 @@ pub trait Operation { derive(Serialize, Deserialize), serde(crate = "serde_crate", transparent) )] -pub struct Identity(RString); +pub struct Identity(RString); impl Default for Identity { - fn default() -> Self { Self::from("") } + fn default() -> Self { Self::from("anonym") } } impl From<&'static str> for Identity { @@ -675,49 +675,46 @@ mod test { use std::str::FromStr; use amplify::ByteArray; - use baid58::ToBaid58; + use baid64::DisplayBaid64; use super::*; #[test] fn contract_id_display() { - const ID: &str = "rgb:pkXwpsb-aemTWhtSg-VDGF25hEi-jtTAnPjzh-B63ZwSehE-WvfhF9"; + const ID: &str = "rgb:bGxsbGxs-bGxsbGx-sbGxsbG-xsbGxsb-GxsbGxs-bGxsbGw"; let id = ContractId::from_byte_array([0x6c; 32]); - assert_eq!(ID.len(), 58); - assert_eq!(ID.replace('-', ""), format!("{id:#}")); + assert_eq!(ID.len(), 52); assert_eq!(ID, id.to_string()); - assert_eq!(ID, id.to_baid58_string()); + assert_eq!(ID, id.to_baid64_string()); } #[test] fn contract_id_from_str() { let id = ContractId::from_byte_array([0x6c; 32]); assert_eq!( - Ok(id), - ContractId::from_str("rgb:pkXwpsb-aemTWhtSg-VDGF25hEi-jtTAnPjzh-B63ZwSehE-WvfhF9") + id, + ContractId::from_str("rgb:bGxsbGxs-bGxsbGx-sbGxsbG-xsbGxsb-GxsbGxs-bGxsbGw").unwrap() ); assert_eq!( - Ok(id), - ContractId::from_str("pkXwpsb-aemTWhtSg-VDGF25hEi-jtTAnPjzh-B63ZwSehE-WvfhF9") + id, + ContractId::from_str("bGxsbGxs-bGxsbGx-sbGxsbG-xsbGxsb-GxsbGxs-bGxsbGw").unwrap() ); assert_eq!( - Ok(id), - ContractId::from_str("rgb:pkXwpsbaemTWhtSgVDGF25hEijtTAnPjzhB63ZwSehEWvfhF9") + id, + ContractId::from_str("rgb:bGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGw").unwrap() ); assert_eq!( - Ok(id), - ContractId::from_str("pkXwpsbaemTWhtSgVDGF25hEijtTAnPjzhB63ZwSehEWvfhF9") + id, + ContractId::from_str("bGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGw").unwrap() ); // Wrong separator placement assert!( - ContractId::from_str("rgb:pkXwpsb-aemTWhtSg-VDGF25hEi-jtTAnPjzh-B63ZwSeh-EWvfhF9") - .is_err() + ContractId::from_str("rgb:bGxsbGx-sbGxsbGx-sbGxsbG-xsbGxsb-GxsbGxs-bGxsbGw").is_ok() ); // Wrong separator number assert!( - ContractId::from_str("rgb:pkXwpsb-aemTWhtSg-VDGF25hEi-jtTAnPjzh-B63ZwSehEWvfhF9") - .is_err() + ContractId::from_str("rgb:bGxs-bGxs-bGxsbGx-sbGxsbG-xsbGxsb-GxsbGxs-bGxsbGw").is_ok() ); } } diff --git a/src/contract/seal.rs b/src/contract/seal.rs index 2160f86c..d2e510e3 100644 --- a/src/contract/seal.rs +++ b/src/contract/seal.rs @@ -314,7 +314,7 @@ mod test { let secret = reveal.to_secret_seal(); assert_eq!( secret.to_string(), - "bc:utxob:28Hk9S1-nBLPw4u9j-Zwaftwz8s-k5Y6G7bug-qvoeGn5BF-GPEJoY3" + "bc:utxob:lD72u61i-sxCEKth-vqjH0mI-kcEwa1Q-fbnPLon-tDtXveO-keHh0" ); assert_eq!(reveal.to_secret_seal(), reveal.conceal()) } diff --git a/src/lib.rs b/src/lib.rs index 97f1917e..7b2c4c67 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -99,7 +99,7 @@ mod _ffv { } #[macro_export] -macro_rules! impl_serde_baid58 { +macro_rules! impl_serde_baid64 { ($ty:ty) => { #[cfg(feature = "serde")] mod _serde { diff --git a/src/schema/schema.rs b/src/schema/schema.rs index eca4e07b..414d4113 100644 --- a/src/schema/schema.rs +++ b/src/schema/schema.rs @@ -28,7 +28,7 @@ use aluvm::library::LibId; use amplify::confinement::{TinyOrdMap, TinyOrdSet}; use amplify::{ByteArray, Bytes32}; use armor::StrictArmor; -use baid58::{Baid58ParseError, Chunking, FromBaid58, ToBaid58, CHUNKING_32}; +use baid64::{Baid64ParseError, DisplayBaid64, FromBaid64Str}; use commit_verify::{ CommitEncode, CommitEngine, CommitId, CommitmentId, DigestExt, ReservedBytes, Sha256, }; @@ -40,7 +40,7 @@ use strict_types::SemId; use super::{ AssignmentType, ExtensionSchema, GenesisSchema, OwnedStateSchema, TransitionSchema, ValencyType, }; -use crate::{impl_serde_baid58, Ffv, GlobalStateSchema, Identity, Occurrences, LIB_NAME_RGB}; +use crate::{impl_serde_baid64, Ffv, GlobalStateSchema, Identity, Occurrences, LIB_NAME_RGB}; #[derive(Wrapper, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, From, Display)] #[wrapper(FromStr, LowerHex, UpperHex)] @@ -129,36 +129,24 @@ impl CommitmentId for SchemaId { const TAG: &'static str = "urn:lnp-bp:rgb:schema#2024-02-03"; } -impl ToBaid58<32> for SchemaId { - const HRI: &'static str = "sc"; - const CHUNKING: Option = CHUNKING_32; - fn to_baid58_payload(&self) -> [u8; 32] { self.to_byte_array() } - fn to_baid58_string(&self) -> String { self.to_string() } -} -impl FromBaid58<32> for SchemaId {} -impl Display for SchemaId { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - if f.alternate() { - f.write_str("urn:lnp-bp:sc:")?; - } - if f.sign_minus() { - write!(f, "{:.2}", self.to_baid58()) - } else { - write!(f, "{:#.2}", self.to_baid58()) - } - } +impl DisplayBaid64 for SchemaId { + const HRI: &'static str = "rgb:sch"; + const CHUNKING: bool = false; + const PREFIX: bool = true; + const EMBED_CHECKSUM: bool = false; + const MNEMONIC: bool = true; + fn to_baid64_payload(&self) -> [u8; 32] { self.to_byte_array() } } +impl FromBaid64Str for SchemaId {} impl FromStr for SchemaId { - type Err = Baid58ParseError; - fn from_str(s: &str) -> Result { - Self::from_baid58_maybe_chunked_str(s.trim_start_matches("urn:lnp-bp:"), ':', '#') - } + type Err = Baid64ParseError; + fn from_str(s: &str) -> Result { Self::from_baid64_str(s) } } -impl SchemaId { - pub fn to_mnemonic(&self) -> String { self.to_baid58().mnemonic() } +impl Display for SchemaId { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { self.fmt_baid64(f) } } -impl_serde_baid58!(SchemaId); +impl_serde_baid64!(SchemaId); #[derive(Clone, Eq, Debug)] #[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] @@ -277,23 +265,28 @@ mod test { #[test] fn display() { let dumb = SchemaId::strict_dumb(); - assert_eq!(dumb.to_string(), "111111-11111111-11111111-11111111-11#comedy-vega-mary"); - assert_eq!(&format!("{dumb:-}"), "111111-11111111-11111111-11111111-11"); + assert_eq!( + dumb.to_string(), + "rgb:sch:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#distant-history-exotic" + ); + assert_eq!( + &format!("{dumb:-}"), + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#distant-history-exotic" + ); let less_dumb = SchemaId::from_byte_array(*b"EV4350-'4vwj'4;v-w94w'e'vFVVDhpq"); assert_eq!( less_dumb.to_string(), - "5ffNUk-MTVSnWqu-PLT6xKb7-VmAxUbw8-CUNqCkUW-sZfkwz#distant-thermos-arctic" + "rgb:sch:RVY0MzUwLSc0dndqJzQ7di13OTR3J2UndkZWVkRocHE#lemon-diamond-cartoon" ); - assert_eq!(&format!("{less_dumb:-}"), "5ffNUk-MTVSnWqu-PLT6xKb7-VmAxUbw8-CUNqCkUW-sZfkwz"); assert_eq!( - &format!("{less_dumb:#}"), - "urn:lnp-bp:sc:5ffNUk-MTVSnWqu-PLT6xKb7-VmAxUbw8-CUNqCkUW-sZfkwz#\ - distant-thermos-arctic" + &format!("{less_dumb:-}"), + "RVY0MzUwLSc0dndqJzQ7di13OTR3J2UndkZWVkRocHE#lemon-diamond-cartoon" ); assert_eq!( - &format!("{less_dumb:-#}"), - "urn:lnp-bp:sc:5ffNUk-MTVSnWqu-PLT6xKb7-VmAxUbw8-CUNqCkUW-sZfkwz" + &format!("{less_dumb:#}"), + "rgb:sch:RVY0MzUwLSc0dndqJzQ7di13OTR3J2UndkZWVkRocHE" ); + assert_eq!(&format!("{less_dumb:-#}"), "RVY0MzUwLSc0dndqJzQ7di13OTR3J2UndkZWVkRocHE"); } } diff --git a/src/stl.rs b/src/stl.rs index 899920e6..17db50d9 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -35,7 +35,7 @@ use crate::{ /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB: &str = - "urn:ubideco:stl:FdtTxVxBBVXJaayVZoM1dhSHqszVHMenivcPd2v4PP1H#scoop-laptop-almanac"; + "stl:sqbS4Bea-l@IK7Dt-86Fkfgg-NOhi22w-S@kz5bC-l$99W@Y#bless-donald-poker"; fn _rgb_core_stl() -> Result { LibBuilder::new(libname!(LIB_NAME_RGB), tiny_bset! { diff --git a/src/vm/op_contract.rs b/src/vm/op_contract.rs index daadf0b4..246804b8 100644 --- a/src/vm/op_contract.rs +++ b/src/vm/op_contract.rs @@ -604,7 +604,7 @@ mod test { assert_eq!( alu_id.to_string(), - "urn:ubideco:alu:EmVozGDJcSo417yx7R3CFfhBRDnY66w7sQ412VGFL6Zz#plaster-ferrari-dollar" + "alu:zI4PtPCR-Eut023@-Hqblf3X-N2J4GZb-TR2ZEsI-vQfhKOU#ruby-sherman-tonight" ); assert_eq!(alu_lib.code.as_ref().to_hex(), "d0a00f"); assert_eq!( diff --git a/stl/RGB@0.1.0.sta b/stl/RGB@0.1.0.sta index cb74ace3..55b8366b 100644 --- a/stl/RGB@0.1.0.sta +++ b/stl/RGB@0.1.0.sta @@ -1,17 +1,18 @@ -----BEGIN STRICT TYPE LIB----- -Id: urn:ubideco:stl:8xdZqaucNaw56CTYkNaoYtvppr178eKc5wS4fk2hRJtu#helena-joker-forum +Id: stl:sqbS4Bea-l@IK7Dt-86Fkfgg-NOhi22w-S@kz5bC-l$99W@Y#bless-donald-poker Name: RGB -Dependency: 8UmJsi3csjCEFCEVXvjLeAgvmqxY52iY5EMfTvbyzWx2#energy-baboon-piano -Dependency: ACBoDKVqDSuPrZLs2W2bLVj2TnpThzUMcJJrC3GhsQ79#idea-judo-benny -Dependency: APYERRUMyWqLadwTv8tEFifHMPGpL3xGFSBxwaKYpmcV#square-mammal-uncle -Dependency: EcCNgrgLaygt3tCZNu2ZVEzMzSAZYEUeTNAVi5E81YWi#aspirin-mango-average -Dependency: GCWLX5TjFmMDCJr5cxWtwoSajBWDWbkQVSuTNbrtD1tg#egypt-wedding-cupid -Dependency: HX2UBak8vPsTokug1DGMDvTpzns3xUdwZ7QJdyt4qBA9#speed-atlanta-trilogy -Checksum-SHA256: d9b319c5901def77d1fc9cd25e6bcaaf4e2bd6a2b0e30a1f76f35497df836425 +Dependencies: + StrictTypes#century-comrade-chess, + AluVM#congo-archive-folio, + BPCore#garbo-radius-peru, + Std#ralph-blue-lucky, + CommitVerify#tennis-peace-olympic, + Bitcoin#signal-color-cipher +Checksum-SHA256: 9696dba7e32748ec863d1554c9b6369d5366cf7c961f8c9ee86ea52a0133a2c2 -15!sq25%mg`G>t*&Lor=XWH@ulIpd#VR%e3()@~+=qs(Ia|S|CLvM0rh?d8AKZaX -sV>_O8;rU6aoQ7jn{9gWsHQTT*!NY-23sZD*X=8L$d2nTOi+@H63r6F_xjAC6(~TLj#*ewiHU&X!byiJp9+vrsy<5&Clo)5)@&l +6UwYFh+Ofu5^ik9drt)+7YLQq3*a%IXa9&dx0-7pM3Z=O*v*GCA9fL-<|HrZsA`N nJlR3`&dbY$Vt-5feW*SKg&%h~b$G{NN>LxBDo)YaDXjV8yEYGn*VZ*6U9bXH|@X =Zu#Y!hN5_Bp3Y36tDMM#=e#tGI($UA5U3KNx<*C>ja}LTPkkZ)t7@1wm|eR!sr` ZSSEb;k|42*wg~2q@3^Lq|9zft}OB~jx>)hO72TW;VQ)zT%r!Z9lE%{u?@QI^ @@ -36,388 +37,347 @@ _fBZ*6U9bXH|@X=Zr^063mQh9?yTI7S;;e;>sZfv!yd427@;7veO2zMB=|GYU;*a %*g5NMUnmZLh7x^`{^P$fKg#%8c8X#<$(NgM!uni2C|Kr}onZ3R84)X=8LqVRLAc _h5K%L=laq&yA1JoJ^{7>oKLkF4~iax8KK|47hp@Qe|^xa&~28LV0v$b1}=fEj#9 D^K)f#Cf|Xn@L3mU0Z2&n-dr?jcD1Ll0RawDWpib6c4cHjd30rSGX8=VN#A(BKKz -&v`r;e6DUv<<*U}cmb -;*F>vukd;=m`ygb@x#_>`RmOO$0)3Z)~}Pe&;~0k`vnNG-Q(frCuPoqJv316u7g@ -bjO{C`L7Q_Y;b5{Lt$`pOmAdib7%`wbaH89bX0k8Wpe@mYXqYdo~D%m7H6OD0<^0 -n_2##VWXRdjy=DB@qgYOj1yf~hNo10{i*81wRHezf+V~|OAQu_S1xTi!W4SPL9>3 -Tr$Jz)~d2nS;VQpnn00}{CbWCA+WpXhC0S0Voadl~A0SrNGbWCA+WpXi7Wpo7r00 -{xeYl3?VT7AZm1SE3hA}5c~&&3*7XrN0!sxd$tJbohp00000000300000000008L -349ubW~wy1pxpD002NB00}{Jb7gc?VP|s%0RRdChyLPaScq)s9KMExvw34D6J>+N -wrBxfixd_%u|$Wt0m+Y=slx_K8vXre8<)H){QgX6j~{c$E$eY_=V_ZFuK)l50000 -00RI300000003tzib7^O8Qe}2!VQgh&L3DIsV`xHbX>MdwWnpYocu;h51OxyKV{d -L|X=G(?bZKF100sjDb7f&{0o#gN8iEuMbtv-qj6g$b#7A9pc!|f`I$jaRzSe2A1O -;<+VRU5y{4_<~U(XE-|Ev|Hdb$N7;9H9;8!%;3hl7uME$faw1Z;0(YXafX-5feW* +;*F>vukd;=m`ygb@x#_>`RmOO$0)3Z)}yry~#}iVEJ)s5j^%uEnQ9{n2s|9Fa^ps ++HG#`XS5DMY;b5{PIYZeZ)9O}Xt{%a=RmHK6WZ%EWRm@*ULd%lgGoFTxUTU76^nC$%1sKzB<;EQA|)S-x8 +8IWKN#S$#@T&w`gPtRC#b^PGN0jYXqYdo~D%m7H6OD0<^0n_2##VWXRdjy=DB@qg +YOj1yf~hNn}z02|;XhOksItaxnt|25f0@b!lV)3_)ykOksItaxqh7bOiwb2?5A!f +_n>Eea4XlBy!~v3=AX`3Ri0000000000{{R +3000000B0+O=X=iRyWp-s@Y-MCYbaY{3XhLjhZe&wsVQf@*P;_zx1ONKtpQ8M_qJyiO1VIUJ=H=)@ii_1#@&^b +Y%hjG)3KC&kYOztQDksx&yAAHY;R+00^!l!96CYQxM)es ++421}!Q~o5fc_fP)zLxBDo)YaDXjV8yEYGuo~Ej#9D^K)f#Cf|Xn@ +L3mU0Z2&n-dr?jcD1Ll0RaLKV{dL|X=G(?bZKF1Q)OXn00sjDb7f&{0o#gN8iEuM +btv-qj6g$b#7A9pc!|f`I$jaRzSe2A1O;<+VRU5yXj3#G4BS)3O?Kk8E~;iP+B(^ +hzXq!*4!qFzdIL(#1Z;0(YXafX-5feW*SKg&%h~b$G{NN>LxBDo)YaDXjV8yEYGu +o~Ej#9D^K)f#Cf|Xn@L3mU0Z2&n-dr?jcD1Ll0RaODa%Fa9VQgh&00sjDb7f&{0g +t=F=tr7PLxBDo)YaDX +jV8yEYGuo~Ej#9D^K)f#Cf|Xn@L3mU0Z2&n-dr?jcD1Ll0RbUFb8~5DZc=4-WnpY +(WI=RvVPj}QY-w&}Q)OXnRCsA*1OxyKV{dL|X=G(?bZKF100sjDb7f&{0o#gN8iE +uMbtv-qj6g$b#7A9pc!|f`I$jaRzSe2A1O;<+VRU5y{4_<~U(XE-|Ev|Hdb$N7;9 +H9;8!%;3hl7uME$faw1Z;0(YXafX-5feW*SKg&%h~b$G{NN>LxBDo)YaDXjV8yEY +Guo~Ej#9D^K)f#Cf|Xn@L3mU0Z2&n-dr?jcD1Ll0RaIKV{dL|X=G(?bZKF1Q*>c; +WdH^P1aoC!YypA{4XEgn0epQk*PX+nL>xOm%pK>soMo}bYXO50sJ& +Y-CxfQ3;(PYq_>4e9YQ#rfba;u!+d5tm# +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 -K>soMo}bYXO50dNgv5VC@SZy&ckEiz^#2Wm1Q -Ok9#fajy(iyZ)0l$;nCe3IziXCXi3Z2@%=QxEiz^#2Wm1QOk9#fajy(iyZ)0l$;nCe3IziXCXi3Z2@%=QxYyC6yAAHY;R+00^!l!96CYQ -xM)es+421}!Q~o5fc_fP)zKtpQ8M_q -JyiO1VIUJ=H=)@ii_1#@&^bY%f(Q#2q9+*8I)cH*`!s%9_RI@yuG2CFF!ywLV~14 -_&UY;R+00^!l!96CYQxM)es+421}!Q~o5fc_fP)zYyC6?Q(lLJ=>rBY$70^roXTE)+& ->InpFZ)0l$;nCe3IziXCXi3Z2@%=QxxYW^+v~7{W03rq(;firJ1#@&^bY%f>4P_9rf`M-zw>{+&W0 -M0{2&GbCtpecGzFNi4r|Jm=Y;R+00^!l!96CYQxM)es+421}!Q~o5fc_fP)zKtpQ8M_qJyiO1VIUJ=H=)@ii_1#@&^bY%h -mXk);5Qh;gshq!{{oTC#gIzF4hFN<*P1RquLWiVd^Y;R+00^!l!96CYQxM)es+42 -1}!Q~o5fc_fP)zxYW^+v~7{W03rq(;firJ1 -#@&^bY%hmXk);5Qh;gshq!{{oTC#gIzF4hFN<*P1RquLWiVd^Y;R+00^!l!96CYQ -xM)es+421}!Q~o5fc_fP)z_>4e9YQ#rfba;u!+d5tm#=h2RwFCuobYXO50d -Ngv5VC@SZy&ckWZob97;JWdU#vWe~E0fo~tTJ>?Q(lLJ=>rBY$70^roXTE)+&>InpFZ)0 -l$;nCe3IziXCXi3Z2@%=QxWZob97;JWdZ+aW59S)fNA-MxPs%HqZ -2GTKAXWWi*W4(A64;XFkb|0Z)0l$;nCe3IziXCXi3Z2@%=QxF91B-Lz;+I~gZl(*Z)0l$;nCe3IziXCXi3Z2@%=QxxYW^+v~7{W03rq(;firJ1#@&^bY%fbXnF^b -IJ{KZXKtpQ8M_qJyiO1VIUJ=H=)@ -ii_1#@&^bY%f;M8@xYW^+v~7{ -W03rq(;firJ1#@&^bY%f;M8@F91B-Lz;+I~gZl(*Z)0l$;nCe -3IziXCXi3Z2@%=QxYyC6KtpQ8M_qJyiO1VIUJ=H=)@ii_1#@&^bY%f;M8@YyC6c;WkPIeZe&wsVQf@*P;_zx1ONKtpQ8M_qJyiO1VIUJ=H=)@ii_1#@&^bY%f9vZekPz%WEGnBZKS8 -(M7E9_@AwVcyGtCevi|7U8=DY;R+00^!l!96CYQxM)es+421}!Q~o5fc_fP)zfILxBDo)YaDXjV8yEYGuo~Ej#9D^K)f#Cf +|Xn@L3mU0Z2&n-dr?jcD1Ll0RaODa%Fa9VQgh&00sjDb7f&{0fGz-uWS7@0e2{fILxBDo)YaDXjV8yEYGuo~Ej#9 +D^K)f#Cf|Xn@L3mU0Z2&n-dr?jcD1Ll0RbUFb8~5DZc=4-WnpY(WL9Bpb!9?qX>M +dwWnpYocu;h51OxyKV{dL|X=G(?bZKF100sjDb7f&{0o#gN8iEuMbtv-qj6g$b#7 +A9pc!|f`I$jaRzSe2A1O;<+VRU5yN@#iqkT|?l*=bx{^0c**fmF&H)l(b`S3$sb4 +!MK-1Z;0(YXafX-5feW*SKg&%h~b$G{NN>LxBDo)YaDXjV8yEYGuo~Ej#9D^K)f# +Cf|Xn@L3mU0Z2&n-dr?jcD1Ll0RaIKV{dL|X=G(?bZKF1Q*>c;WdH^P1aoC!Yypq +E!sthuPUKDEU2%WC`V+X+(UG)mk--2W1{>juaWw^VbYXO50ZM3k2aq_tRM}}_>4e9YQ#rfba;u!+d5tm#=h2RwFCuobYXO5 +0c}La^e<`!Iztr?rsl#d#OQkEER^^L)C{HEhxT=ipag7hV`~E8(cK(6LD#rwNz2* +s{WQVl8bg5o8r0R+^o=IRl4@nkxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ +%B2y$h1WnpY(WB>*O1aoC!YypqE!sthuPUKDEU2%WC`V+X+(UG)mk--2W1{>juaW +w^VbYXO50c}La^e<`!Iztr?rsl#d#OQkEER^^L)C{HEhxT=ipag7hV`~E8(cK(6L +D#rwNz2*s{WQVl8bg5o8r0R+^o=IRl4@nkxGg*8X!CPrawgw_sqk4BX8}k^^xj-F +Xm+)yumJ%eL349yXKqquc4c8~Wn@-iY;|QqY-w&}Q)OXnRCsA*1OxyKV{dL|X=G( +?bZKF100sjDb7f&{0o#gN8iEuMbtv-qj6g$b#7A9pc!|f`I$jaRzSe2A1O;<+VRU +5yN@#iqkT|?l*=bx{^0c**fmF&H)l(b`S3$sb4!MK-1Z;0(YXafX-5feW*SKg&%h ~b$G{NN>LxBDo)YaDXjV8yEYGuo~Ej#9D^K)f#Cf|Xn@L3mU0Z2&n-dr?jcD1Ll0 -RaLKV{dL|X=G(?bZKF1Q)OXn00sjDb7f&{0o#gN8iEuMbtv-qj6g$b#7A9pc!|f` -I$jaRzSe2A1O;<+VRU5yF0!Tm7r-z?Fqq(6n;Tke)*kJ44PoBPfF{#q^A_Q|1Z;0 -(YXafX-5feW*SKg&%h~b$G{NN>LxBDo)YaDXjV8yEYGuo~Ej#9D^K)f#Cf|Xn@L3 -mU0Z2&n-dr?jcD1Ll0RaODa%Fa9VQgh&00sjDb7f&{0gt=F=tr7PLxBDo)YaDXjV8yEYGuo~Ej#9D^K)f# -Cf|Xn@L3mU0Z2&n-dr?jcD1Ll0RbFAb8~5DZdPw;WK(oubY((pX>MdwWnpYocxhw -=1ONKtpQ8M_qJyiO1VIUJ= -H=)@ii_1#@&^bY%f9vZekPz%WEGnBZKS8(M7E9_@AwVcyGtCevi|7U8=DY;R+00^ -!l!96CYQxM)es+421}!Q~o5fc_fP)zLxBDo)YaDXjV8yEYGuo~Ej# -9D^K)f#Cf|Xn@L3mU0Z2&n-dr?jcD1Ll0RaLKV{dL|X=G(?bZKF1Q)OXn00sjDb7 -f&{0o#gN8iEuMbtv-qj6g$b#7A9pc!|f`I$jaRzSe2A1O;<+VRU5yF0!Tm7r-z?F -qq(6n;Tke)*kJ44PoBPfF{#q^A_Q|1Z;0(YXafX-5feW*SKg&%h~b$G{NN>LxBDo -)YaDXjV8yEYGuo~Ej#9D^K)f#Cf|Xn@L3mU0Z2&n-dr?jcD1Ll0RaODa%Fa9VQgh -&00sjDb7f&{0fGz-uWS7@0e2{LxBDo)YaDXjV8yEYGuo~Ej#9D^K)f#Cf|Xn@L3mU0Z2&n-dr?jcD1Ll0Rav{b -8~5DZf#|5bX0k8Wd#8M00I#~b8~5DZf#|5bXRF~Ze??G1OfmCVPbP-ZgcMdwWnpYocu;h51pxpG0f+wLWmt%8=p4R=gtK{LClh6Z#kObxUW*hKHnB -v9xdF0Lf@J8($U%oA&W7KSpR=}qB?`O6y&~KLo@9%z@lF5$00000009300000000 -0<4b8~5DZf#|5baO&%X>MdwWnpYocxhw>0RRdChyLPaScq)s9KMExvw34D6J>+Nw -rBxfixd_%u|$Wt0j4$3CzF0`&~C2RzkRf-_drf2g0~9de8(o6190$lE&u=k00000 -0RI300000000=>JbYWv?Nn`~900#g7Kp+4PLSb`dLvL+uX>@I6Zgd6*1!invXLAD -K(cK(6LD#rwNz2*s{WQVl8bg5o8r0R+^o=IRl4@m>_h5K%L=laq&yA1JoJ^{7>oK -LkF4~iax8KK|47hp-b7N>_ZDC1d0hChH+XJhss8OG%_CC-Q>(otsF+cqN0Qy}ddQ -=3E5D9c?ZDn(GVQp{#07wUPWpi|HWpo0{EFN!zncXl9K5w2;FV{y1jDTJCC^p$-m -HEbO0#qkqh9c2>uJC38-{*D7fZ(%hZo23R4S;p`Q9JBQllDytVQh3vVR>b8b1?$p -(cK(6LD#rwNz2*s{WQVl8bg5o8r0R+^o=IRl4@mbudT)PryvH%qoUf%jN6#Tx81s -fg4O?s`uaep_R|IiX>)URWpV=H(cK(6LD#rwNz2*s{WQVl8bg5o8r0R+^o=IRl4@ -mbudT)PryvH%qoUf%jN6#Tx81sfg4O?s`uaep_R|IlVRLh3bW~wya{}Sf-5feW*S -Kg&%h~b$G{NN>LxBDo)YaDXjV8yEYGrM&t;O}HAO^^zqT0%g+nC0;-MWK<)&Ge4` -aq}l(*_PgY-w&}X>MmmVPkY}as>eZ2LJ#-AOH_TZ*F5{VQgh&L3DIsV`v2d00#g7 -Kp+4OLvL!QU9%?YlaQ5p(zVQyz-P;zf?W&u -dO8g3W+hC3E~ekEQtXWN29?!QU9%?YlaQ5p|JZ*FvQVPkYiX>)XMa(M;^2y -}^IL_yb)N?~LW;<=;2Rt!{5uU -^s5+a+mJz|^@_ktF~C0000000960|Nj60000SQb#7;AVr*q|00{xMT9OwrXYMoH1 -9u?fDdBZW6z3S&a&ziLbG4&=Ys$?40000000030|Ns9000004WMOn+00{w2TLZ8P -(BXv3rGHFj0R(MAdAZ%oI62v!yKR~2&CeYG0000000030|Ns9000006VRUq1V`u; -g0l}HI1f*k?vhZiL-XlN$-gNV!Z000000RR90{{R30018 -8IZgg^CV{}Pm1pxpD002NB01ZQLZgg^CV{}t=VRU5%0tRzqXk~3-0VWHxQRlx=&V -Jw~RKNl4CLNJETt2ZbZ*5YRd~0io$ghD1OfpDbYXCEWpn@q0RnFxmidRhTh1hu7-!n@1Cr{swqbZoGSd8tmgp<3rE?F -qADBNH?W>M^%H|xc>sh|Dn*!v8^Ea7rh?dzC2n+%RZ*X#DbN~eb0&gCc`G>t*&Lo -r=XWH@ulIpd#VR%e3()@~+=qs(Ib4O0kT+rxDK6vW;JU&?LxLM72H?wDC1Zo}=N} -D)4mkC99bY*UHX>V=@3Ik?lb^+R(Q4?4eR(6nw`loI -F_owDud_=c42H~ZewX>a{=9jW&m$tWDykZj`7#3_zANbB(SO{shhGe=&H{tM@LxB -Do)YaDXjV8yEYGuo~Ej#9D^K)f#Cf|Xn@L3mU0Z2&n-dr?jcD1Ll0Raz1cywiMb7 -^mGQ)6glZD9rm2yJC_VPs)+VE_pMb>vO>-_DBy8`Vb0jGrW9$=2qSMXvL3HGEG000000000 -0{{R30000002XbX(Wo2!100{v`?dHP>9R0ZFSEMRj;Km4qfBYZ5UUs>0bg9bqiCN -A70000000030000000000BVRLh7XKrm}Zgg`13IT`y;$>KfZ0H=mhJ>?uVa{vheM(yUq2ps*m=2xUDT;RqCgn#@WzFu~@adfH5 -^@&-|0000000000{{R300000033g#@X=Gt^Z*l+x0ssVVZ*FA(00035b8l^B00jX -8i+@H63|42*wg~2q@3^L -q|9zft}OB~jx>)hO74Mli#Wo~n6Z*Ek1aAgGn00065MrL*e0RR934MuftXK7+=Wm -9xvbY%nq2nJ$lbaOT|00jX600<05b#7;AVr*qpd2nR|0S$F-b7^O8Wn?xqLTPje2 -S;UYWpinB1`PvdW_AJEn^6;37FKqUhx?i3R+Mr!fY&(;2BFL(m@EZk_srD@b7N>_ -ZDC1d0hChH+XJhss8OG%_CC-Q>(otsF+cqN0Qy}ddQ=3E5CvvzVP|s!;nCe3IziX -CXi3Z2@%=Qx~Wpi|4ZEyepNC$Lfb98QHbOOpO9&dx0-7pM3Z=O*v*GCA9fL-<|Hr -ZsA`NnJlR3~AEBGG%U@MZ$v=XJ?|;InIPy66cFfOYp#JM2r7_Du?5Y;;Uvd1Z2QF -##l3QrKmH@SMtOBR5nML?B>%qbz^!%<&Wu0B;HjDvSwXb8}^MRAFax0VyR82Em!l -d>cVuZ*8Se%j3y;5n>eohpw0DA7$}d%m{5|bYWy+bYTJYdQCW4e)%xftOSp9TD)g -5B;KO;Krzd=y+`rt_<1!4XKZg`VQg~&-XoD~rmTY45rxNKIl#GTd$5`Bk}o71wcZ -w0Vevn_3t@9}X=iS2Wo~qH0V?uELDn7ECaAJ#>#uY3^=3;^Ib33g#@X=Gt^Z*l_R(cK(6LD#rw -Nz2*s{WQVl8bg5o8r0R+^o=IRl4@m>_h5K%L=laq&yA1JoJ^{7>oKLkF4~iax8KK -|47hp?M`dnhb7^x^V`ybVZDn*}WMOn+00{wgKfZ0H=mhJ>?uVa{vheM(yUq2ps*m=2xUDT;RqCgn#@WzFu~@adf -H5^@&-|0000000000{{R300000033g#@X=Gt^Z*l+x0ssVVZ*FA(00035b8l^B00 -jX8i+@H63|42*wg~2q@3 -^Lq|9zft}OB~jx>)hO72}f*iVqt7ga%2Vq4R>jDZe??GL2hGcZ*l+x0ssVVZ*FA( -00035b8l^B00jX7SQ3>DAd9q3vF!EgI>niq&gF@?Xwk09NOmoW?4BAt18HP<0006 -DM{I9mVQf=$VRU5$0RRdC)$WoGNrWQHGZU6uP000000RI300000001-!QZ( -?C=Q*>c;Wm98lWo=;w0|;_ub7gXNWn=>3(cK(6LD#rwNz2*s{WQVl8bg5o8r0R+^ -o=IRl4@m>_h5K%L=laq&yA1JoJ^{7>oKLkF4~iax8KK|47hp)b7gHwWCDnm$9O-6 -TWVuFo^|2*NvWKMV^#cK{)RQ%ur9&FflzA%qZFQ|l>ioJpYH;+t0eX2w~A!Q+0ea -Z{MVycPK^j{VR%V&Wo>f+00Iw3Y;R&=Y*Tb$bY)a|aAgGn0006EM{I9mVQf}mY;| -RG1pxpE0WzLeQ3m-<6)UHjqig^*m4co5us7ukl*0UQzs7w8g#iEn000000RR6000 -00000>EBWo~q7ba@2<00;ugEFN!zncXl9K5w2;FV{y1jDTJCC^p$-mHEbO0#qkRz -9SbZ=!8X@=Yuq$20sb<4l#S`iz7Vef}@Ca=a#qt00000000005C8xG00005Np5g; -bOr(kaB^jKPjz$wlMuXsu{2tXFT+?;?hj39&>gq>HOrf1lB-q;n)I5N2y$g}WpZ| -9WCG#Q-5feW*SKg&%h~b$G{NN>LxBDo)YaDXjV8yEYGuo~Ej#9D^K)f#Cf|Xn@L3 -mU0Z2&n-dr?jcD1Ll0Rad}Zg6#UO<`~a0RRdD^=uPjBlbC`N(qzPM@Gr{imSMTSY -5T*7C#t%#3&jHA>%$n#j0HLDJN5-IKgM_J7b(p+0MPGk2Gl)y2(Rz0hP$+dLDIRU -(}XWLTZugenOC;Z(5k~zEJnJiX;;E#Q^{S000000RR600000000v2JaCLNZ1pxpF -0o9FP2n?Horiuqf0^m>2O`jNRziT$b7#=ya6uYYC;s5{u000000RR600000000~W -HWNBekd2nR|0Rv%fdH)DaWprUwd2nR~0RR932~A~mVOC*mb!7zs00;m8KmY&$000 -000RR600000000>QGbYWy+bYTSn015$h4P{pQ?3(@m6s4{*=wy-PiS_k>Wl|t&*Fr0fZ0000000000{{R300 -00003r}NXb#iiLZewM01_A?ZX>I@j0t0PfcmMzb3{P-FZ*6U9bZupBbOs6oW@dH) -+M7`mSQb`xkca!3LxB -Do)YaDXjV8yEYGrM&t;O}HAO^^zqT0%g+nC0;-MWK<)&Ge4`aq}l(*_4;Y;R&=Y; -ywP(cK(6LD#rwNz2*s{WQVl8bg5o8r0R+^o=IRl4@l*oM?JbaMjX(cK(6LD#rwNz2*s{WQVl8bg5o8r0R+^o=IR -l4@l*oClv)aMjKgwAH@`bu1x<7g|G -$};xvA~n-$_S2y$g)Wo2z;WCG#Q-5feW*SKg&%h~b$G{NN>LxBDo)YaDXjV8yEYG -rM&t;O}HAO^^zqT0%g+nC0;-MWK<)&Ge4`aq}l(*_B4VQgh?V`*h`0^!l!96CYQx -M)es+421}!Q~o5fc_fP)zLxBDo)YaDXjV8yEYGpW{Lxv| -61vo|LxBDo)YaDXjV8yEYGrM&t;O}HAO^^zqT0%g+nC0;-MWK<)&Ge4`aq}l(*^`ja7 -knZ0RRU806-uB1y68qb#w*;0&j2umB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`ZqB -og<<0(5x+hyLPaScq)s9KMExvw34D6J>+NwrBxfixd_%u|$Wt0&Z^r00JIQb#!ob -bU|}-X=iS2Wo~p*Wp-s@Y-MCYbaY{3Xa)oYZ*XsQbODnPynwMZT8l5kSW@l}O=!> -^xB4~9n`Dx!RtcK)nwJD~WnpXq(PtOELlW@z354$cZcQEw0|O`dPRP3jk}Sl@F(; -O)1#@&^bY%f(Q#2q9+*8I)cH*`!s%9_RI@yuG2CFF!ywLV~14_&XcWHEPWpi@@1# -{rZP|m9K(8HSpU8Cxu(AzX*g3wtWgq9@B6{cBc98Yz0aCLM+b8~5DZf#|5bW&w@W -npY(WJF^xB4~9n`Dx!RtcK)nwJD~ -WnpXq(PtOELlW@z354$cZcQEw0|O`dPRP3jk}Sl@F(;O)1#@&^bY%hmXk);5Qh;g -shq!{{oTC#gIzF4hFN<*P1RquLWiVd{cWHEPWpi@@1#{rZP|m9K(8HSpU8Cxu(Az -X*g3wtWgq9@B6{cBc9Zz+1aCLM+b8~5DZf#|5bW&w@WnpY(WL9Bpb!7$w1#fU~b# -wuf5WIk~G+K)5%bR49t5yk`^qQ9hb7f&{0nuj{y+ac4_6daU{ -%%bk3j+fu`A*2Y1(Gbp$uTFEss(d&VRU5yZA8ZOFKPukLlqCE=E5w*=z8TWl=ueJ -45i$M_H~V*2X|?7Ze??G0R?m5$xzO!^w7hb16`x)q0rkjWP;FH9)y-8%N3?sW*JX -)bZ~WaL349yXKrm}Zgf^}X=GD$VRU5%1O;z!Z*_D5lMuXsu{2tXFT+?;?hj39&>g -q>HOrf1lB-q;n)I5N1aoC!Yyr_{7rjFg@b(FW?*48~9t#5lC;3juy9JUg#K|!ymZ -}AFbYXO50WPwo{ujV7L@=1(T$>wOY}Ov_b`4?P%YY`+Wb+o`y9ak^bZ%vHa{&c&; -K@+Vs`Svqn*&{=>Y>ovG-QI%SssLzB+C`1S!NJVcWz~5Q*>c;Wm98lWo=;u1ON+U -Wn*k%a$$67c4Ytn009VQb#7;AVr*pq1pxv1^sESGu0eNZ)cp(*eFU-DRQ(QTUJ^T -E1nY56>E%WO3UhRFbz^jOa%E%y1pxwxmdAKMhFfZ5JDzpn`AMmqhGSLyUjBwP+ps -Rd!+}t11fvw5rj-B|XP@r^w5ufb=C_Ju$l1`nW&GEpSWb-t3So3~VPj}*Wo~o;1p -xsQXM0|*v-OPCsP-SFga&u*FLvL+uX>@I6Z -gd3!00#g7Kp_AKQe|XiWo>0-1pxpG0Y>fS!w4MxxaL=+DqP^k2!wz9AHH68xp8!< -%Jqp^&HwZFzp>JB4@xD;^wu&SY_r(AJ00000009300000 -0000hBWp-s@Y-MCYbaY{3Xa)lUX=DL}aSf9!PV~dK2uo>;u!nFdemP_$e?^hl+Jk -M;eY!XaZDnL>VN`i=WdTAkVTFju)TMl$g}C@DyY!@{4YR*LMYs=?Zg_* -ktx|21^lzg9sBTBv19V|$0m+Y=slx_K8vXre8<)H){QgX6j~{c$E$eY_=V_ZFuLe -_NXk~3-1`7jbW_AJEn^6;37FKqUhx?i3R+Mr!fY&(;2BFL(m@EZk_srD=W^7?+a{ -}Sf-5feW*SKg&%h~b$G{NN>LxBDo)YaDXjV8yEYGsr6V0dsu5sjwLjgQcrOsaG1F -{QvR+LMR3-^ZN{xOxO`VQpmsh?d8AKZaXsV>_O8;rU6aoQ7jn{9gWsHQTT*!NY-2 -lDms;Mx<1w$-3J3B_ALc8OsGork`WEFmfKh*eS=_32kL`VN`i=Wpe-u0d?d}_}|W -p0vpvv$c&#PW69R$ltr%da5t5w^x+8!q5_DP$9O-6TWVuFo^|2*NvWKMV^#cK{)R -Q%ur9&FflzA%qZFQ|l>ioJpYH;+t0eX2w~A!Q+0eaZ{MVycPK^Kn000000093000 -000000YTY;R&=Y*cx0Wpe-u0oCr34oQf!Y4K`P(FaQVwIle)QgI&pHa%8Z1>xis% -K_g{UD)~8A`MB56fuKVLH|(nUe={6PmCJYdcneig@gbA000000093000000000Va -cWz~5RC#b^a{vkfhyLPaScq)s9KMExvw34D6J>+NwrBxfixd_%u|$Wt0VPFrzQMU -~Cv3(oCX8r!*SiR9zOp;)>$$b(q=dpw@&Et;000000RI300000001S3vY-Mg^c~p -6DWpe-t0Y>fS!w4MxxaL=+DqP^k2!wz9AHH68xp8!<%Jqp^&Hw-a000000RI3000 -00000(DfZe??6a{(Ag)zidWvABmX&uCxQ{9vUAsn@)h(<^=)@3p(i4Fw8icywiMb -7^mGa{vkfWOW`wsTH9-LlJ`2|Ay5Z(?oEikl{+~pis;@Q*TJ#0Rw0P%&6V>N}#h9 -55#ht!=;R2Lj=uo+MI7C_W0!u+yDRo000000RI300000001I?-VQzD2bZKvHa{vk -fG*S<)6P6lYy(#<=BR_>s@(?%#f7ArN-=Rj?7Ns(10d}<;Xp5rzopjE#5h98`u~h -0v`BV8NkLOrpFzp4z*Z=?k000000RI3000000010Gec4cgDaAk4<52{I*HQw0*Hf -%sJ77^l=Ml>CaAJ#>#uY3^=3;^Ib2vcKdWo=@6CZ -UzbiW@dH)+M7`mSQb`xkca!3baG*1bV+0Z -p9m~TI>-W|y2ahx3nF|Vuawki#7NH?S|Q-Q!u2{b4s>#1ZgXjLX>V>+d2nR`G*S< -)6P6lYy(#<=BR_>s@(?%#f7ArN-=Rj?7Ns(12yJC_VPs)+VFC4eO*mP8`7qV21dn -rCyk{{a-lF$FG0V5TNAc?Tc{K-TY;R&=Y;ytLBav&Stb*7Pg~wnyz`1FAu$k|YFC --ha-WFA1@jtuM?JbaMfzqIy@8$eYR~OKp92)%PJ48iGR>vvBgJ_74J{JehzCV -RLh7XKrm}Zgg`2paMVhWqNlC78^@LR -Wpe@Dg=PS6VPp{$?vC--s`v@B8YHl)C#jpVFzBk!DMw8Sc42I3WMOn~asuJe-5fe -W*SKg&%h~b$G{NN>LxBDo)YaDXjV8yEYGsr6V0dsu5sjwLjgQcrOsaG1F{QvR+LM -R3-^ZN{xOxY7X>@L7b8`aW(cK(6LD#rwNz2*s{WQVl8bg5o8r0R+^o=IRl4@nkxG -g*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%ORB~Z%b7^#GZ*D?$Ze(m_1_KLYY -;SXAO=WawZ)5^*9+vrsy<5&Clo)5)@&l6UwYFh+Ofu5^ik9drt)+7=w-6<{ZeNoKcy!1~?PoRaGZX>M?JbWLG!0Tr2NWXrXyKnGOwA#t$mH2bG -7pQ)aE=^FQF!@KkQh!AUTZ+C7~a$#@6CZgT(%0hP$+dLDIRU(}XWLTZugenO -C;Z(5k~zEJnJiX;;E#R1~ZF2iBMU_%6N@&$6!Z@6CZc}4uWo=;w1_*6sbYWy+bYTDq0d?d}_}|Wp0 -vpvv$c&#PW69R$ltr%da5t5w^x+8!q5uE@000000RI300000000(DmZ(?C=a{vkf -)$WoGNrn+a000000RI300000000wDpaCLNZ015$z{^Dg=h-~N_zJ` -Red1EINWrM}GXaQb}6c#qIM2EQnHo-KZ`k;Xmr`<4sJYKN!!u{G5u+^j1lf!PF4> -GEG0000000000{{R30000003t@9}X=iS2Wo~qH015$z{^Dg=h-~N_zJ`Red1EINW -rM}GXaQb}6c#qIM2EQnHo-KZ`k;Xmr`<4sJYKN!!u{G5u+^j1lf!PF4>GEG00000 -00000{{R300000033g#@Wo~0>Wpe-t0Y>fS!w4MxxaL=+DqP^k2!wz9AHH68xp8! -<%Jqp^&Hw-a000000RI3000000010+sY-wa+bZ>G11OfmAZf|a7000011aog~WdH ->M0*ik}3Je7NO;7qcAK}c{PZGxV*AUa!)kyl4Y*|3I0&VZ1CgHqw;r~cW`-Qb7^w`1pxtK`+K#qzWIuZB~swJGfw6|B_HlQ!mM%%KtuNzUUtR-3UqQ| -ZgXjLX>V=-1p)z|2rNlD$O59e#ogQsB77jPl+h5j^*S;EG*S<)6P6l -Yy(#<=BR_>s@(?%#f7ArN-=Rj?7Ns(10tsb!bY*UHX>V=-1p)z|2rNlD$O59e#og -QsB77jPl+h5j^*S;EWOW`wsTH9-LlJ`2|Ay5Z(?oEikl{+~pis;@Q* -TJ#8dQ03Wn@8fb7^O8b3$xsZe&wsVQf@*P;_zx1ON+UWn*k%a$$67c4Yts0RRXAI -VbbqN^4g)WDG0#SSGl-+Q@e<+6H_!d>A}?>eLb#i5700jX62myf}=a&wUzgq*nHzp%O_gxL;Ro0E2(0000000000|Nj60000008B}?2Wn@8fb7^O8b -3$xsZe&wsVQf@*X=DTh01ISgV{Bn^VRUJBWdH>M00;q-z?57PmRE;x*JyQZ??N1% --?X%h&UrM00;s9(nsc -pRQseH2M_=0H1c!=>Px#000000R -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 +ZgXjGZUzbiW@dH)+M7`mSQb`xkca!3baG* +1bV+0Zp9m~TI>-W|y2ahx3nF|Vuawki#7NH?S|Q-Q!u2{b4P|(AWo~n6Z*Ek1aAg +5xbsj>g6`?#s5rWnKhSeO?L~x^!;Y#eFP|P}0Z%EzBpbEf7FA*KKfDWJb8~5DZf#|5baMeJ@GsGgqasH +#GZO>h>bu9a%E&?Wo>0-0pHK5k@bh=O+>c=6_h5K%L=laq&yA1JoJ^{7>o +KLkF4~iax8KK|47hp+cWHEPWpi@^;nCe3IziXCXi3Z2@%=Qxx +is%Ku=2wF+7z(Wqt=tdZk`V^s(Ana00000009300000000 +0MaWn^V#ZF2w#0Y>fS!w4MxxaL=+DqP^k2!wz9AHH68xp8!<%Jqp^&Hw-a000000 +RI300000001IJrb7^O8ZDnqBa{vkfhyLPaScq)s9KMExvw34D6J>+NwrBxfixd_% +u|$Wt0XD%jq57bK6Q|uUfIMEX^1}Vv6tLB!)|10-o)0prc>n+a000000RI300000 +0010+sY-Mg^X=QT&2?0j!=EDda{kY~=q$*tC#t4Le{2#tvcDZqMsmk?aU=OZ$bvG|>z)+>9PT;Au-7) +~D;-++htxcywiMb7^mGRC#b^1pxp60s}^7b_D?d00Iq0b#7;AVr*qobYXO51OW&J +Vrg`9HZ%YQ0RR993`TWsXK7+=WmI`^Wdi{Xb#8NMXKrO=HZ($MbO;AWWo~72X>$e +*17>D+0ot2U6Id2jc94hrndMfLayEe1ISdA&%p{mB1!VWk)d+KAXk~3-Nn`<(Qq$ +W5tE;F{pQrXd&=l*`O?@#x{Qdy?T_k!`1dtE~W^7?+a{}Sf-5feW*SKg&%h~b$G{ +NN>LxBDo)YaDXjV8yEYGsr6V0dsu5sjwLjgQcrOsaG1F{QvR+LMR3-^ZN{xOxe6X +>Db5bYX39002k^X>)URWpV+w=zxYCD0L!x4tB5Hm3vFbl?lapNXe%XU~*fKJ0+Y4 +bY*jNZe?@=$}AplgPGkh3_fq3Q7_j=2#kPT_9!;lWR>~GYywm#VTK~nd#>BpbEf7FA*KKfDWJb8~5DZf#|5baMeJ +@GsGgqasH#GZO>h>buAc42H~ZewX>a{=9jW&m$tWDyk +Zj`7#3_zANbB(SO{shhGe=&H{tM@n+a0000 +00RI300000001IJrb7^O8ZDnqBa{vkfhyLPaScq)s9KMExvw34D6J>+NwrBxfixd +_%u|$Wt0XD%jq57bK6Q|uUfIMEX^1}Vv6tLB!)|10-o)0prc>n+a000000RI3000 +000010+sY-Mg^X=QT&2?0j!=EDda{kY~=q$*tC#t4Le{2#tvcDZqMsmk?aU=OZ$bvG|>z)+>9PT;Au- +7)~D;-++hhvY;R&=Y)^7z1_BLtX>@L7b8|s%V`y)300aU61a5C`WdHyG0R(ezZDj +xj0RdPNl?@<^v`w+>_3ApsnVQb!iMVLduF6PuEs5-&8axAOWOx7o0t-iMZ(?C=Q* +>c;Wd#8M3IWybk`76TvuW{aQ_%-X`?VwZ$5L?~`!+pRSq0(b70Uq%!}cPEJ+)wh? +w~HsM>Kh32^DD>YKF13Ts`WEp!#kA0000000030000000000HM{I9mVQf=$VRU6v +V`ybC`}q*rYXqYdo~D%m7H6OD0<^0n_2##VWXRdjy=DB@qgYOj2y +J0_Npxjxa{vGW4@YcoVqt7kbYXO5RC#b^1pxp60t`oNZ(?C=R$**)Wpf1q00;pxo +>ox?`Aroor<$W|05z3@o%ygg4E?M+l67UG^w8*<_ +XZ#%uyqCrG{{7b@t4MVjY>G@u4Q3HlB(d+LiLJm-R=h;`?dxBvhE000000RImF00 +00000l{IaCLMB0taw%Wp+<>bODnPynwMZT8l5kSW@l}O=!>^xB4~9n`Dx!RtcK)n +wJQ2Wpib6c4cG&;nCe3IziXCXi3Z2@%=QxRw7=FYk8VVufK10Q-T=FR=Q=>S+XYD&lVN`i=Wd#8M00Ie3WprUyVQh6}1pxpE +002M$0000000030{{R3000008O=WapWMOn+1pxpG0d?d}_}|Wp0vpvv$c&#PW69R +$ltr%da5t5w^x+8!q5%{oJdRMsrjHBJ^EIe4enz&iEACnc`NWk%>en!wdoTb1000 +000093000000000Y5V`Fu4a%FB~Wpf4s18r$;00065ZDDu-00In8a6@lxZE19EWo +~o^3Ik?lb^+R(Q4?4eR(6nw`9N|x?>fArE*KsLwol4Pgj!HjQmQ`GTOgji|WprU=VRT^v;nCe3IziXCXi3Z2 +@%=QxsZfv!yd427@;7veO2zMB=|GX`mHaCLNZ0^!l!96CYQxM)es+421}!Q~o5fc +_fP)zsZfv!yd427@;7veO2zMB=|GYesJb7^O8Z +DnqBa{}Sf-5feW*SKg&%h~b$G{NN>LxBDo)YaDXjV8yEYGpW{Lxv|61vo|Wpe +`I(cK(6LD#rwNz2*s{WQVl8bg5o8r0R+^o=IRl4@mbudT)PryvH%qoUf%jN6#Tx8 +1sfg4O?s`uaep_R|IjcWHEPWpi@^;nCe3IziXCXi3Z2@%=QxClv)aMjKgwAH@`bu1x<7g|G$};xvA~n-$_S33g#@X=Gt^Z*l_R(cK(6 +LD#rwNz2*s{WQVl8bg5o8r0R+^o=IRl4@mbudT)PryvH%qoUf%jN6#Tx81sfg4O? +s`uaep_R|IgPjE?O1pxpD002NB00mEQZ*_DA0|IYw0hP$+dLDIRU(}XWLTZugenO +C;Z(5k~zEJnJiX;;E#R7DB0f+wLWmt%8=p4R=gtK{LClh6Z#kObxUW*hKHnBv9xd +Lu)0006WPjz%~b#y^5%bR49t5yk`^qQ9hb7f&{0nuj{y+ac4_6daU{%%bk3j+fu +`A*2Y1(Gbp$uTFEss(d&VRU5yXj3#G4BS)3O?Kk8E~;iP+B(^hzXq!*4!qFzdIL( +#2X|?7Ze??G0R?m5$xzO!^w7hb16`x)q0rkjWP;FH9)y-8%N3?sW*kp-bZ~WaL34 +9yXKrm}Zgf&*c4c8~Wn@HQbYTVr1#fU~b#wuf5WIk~G+K)5%b +R49t5yk`^qQ9hb7f&{0nuj{y+ac4_6daU{%%bk3j+fu`A*2Y1(Gbp$uTFEss(d&V +RU5y|7c^tcv66A`G>fIgq>HOrf1lB-q;n)I5N1aoC!Yyr +_{7rjFg@b(FW?*48~9t#5lC;3juy9JUg#K|!ymZ}AFbYXO50c}La^e<`!Iztr?rs +l#d#OQkEER^^L)C{HEhxT=ipa*wpbZ%vHa{&c&;K@+Vs`Svqn*&{=>Y>ovG-QI%S +ssLzB+C`1S!Nkeb#!obbU|}-X=iS2Wo~pV0h18CfUz`M +i!Z}iQtl5;XwV(E`Zdd&WRj~^37YhpmjrWVVQc}>XBWLg67cp3gzo-sO&$va11I@ +T$h!rSEX2t%Czh%Ob97;JWdSa-rT!PdFhnqz;9Q#@L7b8`U&bKuEP&Z_j#!IJVg&1PPwC}G0t$0Lb#i5700jX8Me3tp+xFv-0Xp&G?S=|} +9rRaeU`~uMrbA>C`}q*rYXqYdo~D%m7H6OD0<^0n_2##VWXRdjy=DB@qgYOj0}5e +ubYWv?ZDnqB00jX7LNH;4h{)8d6ed8&{mBRDiWpZ +<6ZbNTvZE19EWo~o@0RRU806-xC2vTKaWo2z;WCZ~L3IRs#=EDda{kY~=q$*tC#t +4Le{2#tvcDZqMsmk?FcgmDd%EKc;pw+KsVi?D}q +DSkO*B!5Mb*xG|_(S5o&32kL$X<<}(aAg5PFkyv=$keM8CP2si$rmim(Ekws4U>Q +XM0|*v-OPCeb75?B000OKQe}2!VQgh&L}7Gc1_A|kVQh6}0WzLeQ3m-<6)UHjqig +^*m4co5us7ukl*0UQzs7w8g#>e9Y;*ts5D-#jc4c8~Wn@NmZf9v?Y-I)m1$JRKwa1v8ba_B>T#2Nxy?Vr*${WNB_^0fo5uE4%chr +VX>dKSj6?lx}!~!>v+nlk{(+0jO?A+5>c9X93BNnyJGEOB((CXB(HiD*XOTXpbLr +$Svz}Z|7;7BCiHhV`yb_h5K%L=l +aq&yA1JoJ^{7>oKLkF4~iax8KK|47hp(ZeeX@0!8YhU)%QMkO4aJ;_ZeCe;xE!X< +$x_Fs4If6Z`oP*;5t>gcQkwbf~^M){{|8P%hsRk~m~ep32F151Y4WWC?U>ZDn(GV +Qp{#07waBWp-t3Z*XOD0k-IXh8!q$B6|*YuiTY;OURW8#d%1{rxIXtTaY^?oC$4Z +bYWC^aAk7<3ITQGP59r=ivkZ4!V_T!K +NI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HJ_1fvw5rj-B|XP@r^w5ufb=C_Ju$l1`nW&G +EpSWb-q0000000030000000000BXKZg`VQf@+aAk7<3IWybk`76TvuW{aQ_%-X`? +VwZ$5L?~`!+pRSq0(b70UtNPhHsg*CGu`j1)10Rzd$z^j_AbD^H9X)_TFhf`x$P>NY&HCT(P)^FVARS*Zg3m2dUS*m( +weL9PhQe$_)hyWq5RDZgXjGZgT(%0c3R^La7y@JVOzJ)&GXo9MeQ_qmbcB?4VH0I +#X{*-T?z>0?er0_e!9%6%WL6o5Q7yVM7GXa@w44CHDB`4cq_#000000093000000 +000Yga$#@6CZgT(%0W?w%t`n9TUcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXaRP +$8)%E7`<-;ovk@YSJ+V~kNcmIwC6DJ=V=(On#Ml4;000000093000000000PbWpi +b6c4cG&;nCe3IziXCXi3Z2@%=Qx;v +2Uql0Ev@(iYu*+LHGLwE58<2vcKdWo=@6CZUzbiW +@dH)+M7`mSQb`xkca!3baG*1bV+0Zp9m~T +I>-W|y2ahx3nF|Vuawki#7NH?S|Q-Q!u2{b4s>#1ZgXjLX>V>+d2nR`G*S<)6P6l +Yy(#<=BR_>s@(?%#f7ArN-=Rj?7Ns(12yJC_VPs)+VFC4eO*mP8`7qV21dnrCyk{ +{a-lF$FG0V5TNAc?Tc{K-TY;R&=Y;ytLBav&Stb*7Pg~wnyz`1FAu$k|YFC-ha-W +FA1@jtuM?JbaMfzqIy@8$eYR~OKp92)%PJ48iGR>vvBgJ_74J{JehzCVRLh7X +Krm}Zgg`2paMVhWqNlC78^@LRWpe@D +g=PS6VPp{$?vC--s`v@B8YHl)C#jpVFzBk!DMw8Sc42I3WMOn~asuJe-5feW*SKg +&%h~b$G{NN>LxBDo)YaDXjV8yEYGsr6V0dsu5sjwLjgQcrOsaG1F{QvR+LMR3-^Z +N{xOxY7X>@L7b8`aW(cK(6LD#rwNz2*s{WQVl8bg5o8r0R+^o=IRl4@nkxGg*8X! +CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%ORB~Z%b7^#GZ*D?$Ze(m_1_KLYY;SXAO +=WawZ)5^*9+vrsy<5&Clo)5)@&l6UwYFh+Ofu5^ik9drt)+7=w-6<{ZeNoKcy!1~?PoRaGZX>M?JbWLG!0Tr2NWXrXyKnGOwA#t$mH2bG7pQ)a +E=^FQF!@KkQh!AUTZ+C7~a$#@6CZgT(%0hP$+dLDIRU(}XWLTZugenOC;Z(5 +k~zEJnJiX;;E#R1~ZF2iBMU_%6N@&$6!Z@6CZc}4uWo=;w1_*6sbYWy+bYTDq0d?d}_}|Wp0vpvv$ +c&#PW69R$ltr%da5t5w^x+8!q5uE@000000RI300000000(DmZ(?C=a{vkf)$WoG +Nrn+a000000RI300000000wDpaCLNZ015$z{^Dg=h-~N_zJ`Red1E +INWrM}GXaQb}6c#qIM2EQnHo-KZ`k;Xmr`<4sJYKN!!u{G5u+^j1lf!PF4>GEG00 +00000000{{R30000003t@9}X=iS2Wo~qH015$z{^Dg=h-~N_zJ`Red1EINWrM}GX +aQb}6c#qIM2EQnHo-KZ`k;Xmr`<4sJYKN!!u{G5u+^j1lf!PF4>GEG0000000000 +{{R300000033g#@Wo~0>Wpe-t0Y>fS!w4MxxaL=+DqP^k2!wz9AHH68xp8!<%Jqp +^&Hw-a000000RI3000000010+sY-wa+bZ>G11OfmAZf|a7000011aog~WdH>M0%C +AAe<9`Lptgpr6F_xjAC6(~TLj#*ewiHf`^rCgHqw;r~cW`-Qb7^w`1pxswWLZ%C-hmt=@zb^3LQeidHs)aUa5+5cE%_FDK>Qy83UqQ|ZgXjL +X>V=-1p)z|2rNlD$O59e#ogQsB77jPl+h5j^*S;EG*S<)6P6lYy(#< +=BR_>s@(?%#f7ArN-=Rj?7Ns(10tsb!bY*UHX>V=-1p)z|2rNlD$O59e#ogQsB77 +jPl+h5j^*S;EWOW`wsTH9-LlJ`2|Ay5Z(?oEikl{+~pis;@Q*TJ#8d +Q03Wn@8fb7^O8b3$xsZe&wsVQf@*P;_zx1ON+UWn*k%a$$67c4Yts0RRXAIVbbqN +^4g)WDG0#SSGl-+Q@e<+6H_!d>A}?>eLb#i5700jX62myf}=a&wUzgq*nHzp%O_gxL;Ro0E2(0000000000|Nj60000008B}?2Wn@8fb7^O8b3$xsZ +e&wsVQf@*X=DTh01ISgV{Bn^VRUJBWdH>M00;q-z?57PmRE;x*JyQZ??N1%-?X%h +&UrM00;s9(nscpRQse +H2M_=0H1c!=>Px#000000RR6000 +0000RIYMbaY{3Xl-R~bN~eb00;reGP>7z&ZQf?Gib;@a|Hna2?0j!=EDda{kY~=q$*tC#t4Le +{2#tvcDZqMsmk?c;Wd#8M000eFX>@L7b8|s%V`y)31_BCqX>@L7b8}B}WC6k+?A!p;zT)eT0-J +I=`>_zfHkawo185nP6{Z9SY03$AX>@L7b8|^#0f}o^CC$c=UszhlV5m?Ru@{iVU* +wrVdeH+Q@FPbX@d{UIbZ%vHb5C+)1OfmDZ*D_qVQFpv1pxsLzqsuE6j(!OVQFqcY-w&}Q)OXnRCrKyas&bZ2V!Y-V{d7000jX +8ZyuKUhrL_QB$OCu+VTUE>b16EcuX?V{EC+7E3Kt-MklB)P_)|`Y=H7dO_e!^G2i +>0SdC0NppV!6v|_i_0S0Voadl~A00jX8ZyuKUhrL_QB$OCu+VTUE>b16EcuX?V{E +C+7E3Kt-MklB)P_)|`Y=H7dO_e!^G2i>0SdC0NppV!6v|_i_6IerNVQFqcY-w&}Q +)OXnRCsA*1OfmDVrg_^Z)t7-1pxwY9+vrsy<5&Clo)5)@&l6UwYFh+Ofu5^ik9dr +t)+9Y#&NEOd)wn+n#11fGQ~$X901P7x>0daZB@{PThHqO25f0@b!lV(1pxwY9+vr +sy<5&Clo)5)@&l6UwYFh+Ofu5^ik9drt)+9Y#&NEOd)wn+n#11fGQ~$X901P7x>0 +daZB@{PThHqjSVL%GX>LV$aBOK~X>?O%VQf@*X=DTf00&}ebYpL6ZU6-V0&gCc`G +>t*&Lor=XWH@ulIpd#VR%e3()@~+=qs(Ia|6{hkn2QsifIWLvZbUw81NwsGjgonn +p^pYSe+vyeE|k+X>oOFWB>&L0&gCc`G>t*&Lor=XWH@ulIpd#VR%e3()@~+=qs(I +a|6{hkn2QsifIWLvZbUw81NwsGjgonnp^pYSe+vyeGphfXklq?Q)OdvWpqt*&Lor=XWH@ulIpd#VR%e3()@~+=qs(Ib7&dsyw$ +T9tCzEwrAszt-P)%HZ|LbH=L2A=l(W4CP5}mNX>oOFWB>&L0&gCc`G>t*&Lor=XW +H@ulIpd#VR%e3()@~+=qs(Ib7&dsyw$T9tCzEwrAszt-P)%HZ|LbH=L2A=l(W4CP +6}8jc*fjc*f4#VtWEio{@Ta1XQyS-hReN@n~wGGJZ8q~m{S_&J9(nJ z0y~>ifOCFP>c%=v7A97P$pMB6lTWftG5yyh=6SzjpWUAs0>2(fZ`Yh;`|J88vAcD* zCVgk!^7En`Ur=gsYEfBgic@7tYOw`#a7hXa!{pPt3X_{zP4uT8-h0xQDdA^fmY~fy zPu*BQl8y-VN1=a^HFk?2>N>yw|7Se!9=JFA^$uoy>+$jPRX75l8N zO%C)4(7P`*$s)yX-l>xn{Ij=bq;P3sWd{oXd0?o}oS^!9X}+q%b5LA}lLno(NUQ^wk_%9}STHM1xX3ZO}h z3Y$yRSs69hGK-5#Q;Qh4y=Z8Y(I{1_<||u&XKJE<)BGEHvOPy`0DA|nTsrNQ){fAd#e zV(TXWgk8*G^XCidb5WC8xzoV+LPtw6*f;Z z+R99n#hbg$9x*cVPCjp~I(f2%Z#^N$5{gC6lFZ!H;*!MN0tN;T&Xm-$)SUbRBEpw5 zH?<@&q;j&lr8+@(Z_cw6XPT^|r=>tB6>r{Py_2ZKFnOhek%DnbWWe8hjWWs~FK@l$ d{-Is0!y1$xIc>?If8zeN zncm)@ckpmy0C#XnQD$;UNM%84ad*8N7Z1xHU;kg0@(<74@E1Dv?Yh9_>sLK~P0fjP z*v7=_m{S_&yRlA_g^7h>@&zM>$tPK+urddiq%cpO$Qn9Xl+A9kfVqM`YjA3=XUe4A z-Fa?HLYAJ~b?b+!yn?voX;zPA^OJWP6v^$sp?Ulk2gpvp#N5=)i`dd6CI`q*WoOGQ zE-p1hb{qBbbAzVUWM_9i z-OR7t%%VWZ?UNW4HeXU_Wdzz2GC5fDy9U%QM*dZv(@pQ)WHQTfFc1@bG}X;SwnzS& z>$>$dg1kHo4=g5sFw&kJZ>g|(s#Yo^QPx=L$T2Dq3U^RIO`f5f&&0tru})!fuAT-H zgTUtLdd5r&+1d-MnQNu9Vy&oxk;Y+>o^K**JZ;&Ad`OFe>?g1ovp+v+=`HfKs| zS!zyxL241fVBfsPW+zdxI(ez1kwVh%>a831{p{*e4SKN4*zcLWs{A{fLu-n-9Gt(4 N$CVx1{N1sJ9RPi6Ty6jW diff --git a/stl/RGB@0.1.0.sty b/stl/RGB@0.1.0.sty index 62a4e64f..8b370f38 100644 --- a/stl/RGB@0.1.0.sty +++ b/stl/RGB@0.1.0.sty @@ -1,5 +1,5 @@ {- - Id: urn:ubideco:stl:8xdZqaucNaw56CTYkNaoYtvppr178eKc5wS4fk2hRJtu#helena-joker-forum + Id: stl:sqbS4Bea-l@IK7Dt-86Fkfgg-NOhi22w-S@kz5bC-l$99W@Y#bless-donald-poker Name: RGB Version: 0.1.0 Description: Consensus layer for RGB smart contracts @@ -11,213 +11,214 @@ @context typelib RGB -import BPCore#8UmJsi3csjCEFCEVXvjLeAgvmqxY52iY5EMfTvbyzWx2#energy-baboon-piano - use TapretNodePartner#iceberg-poker-active - use ExplicitSealTxid#antenna-darwin-emotion - use TapretProof#forum-paint-tunnel - use TapretPathProof#stage-element-update - use Method#trilogy-tahiti-valid - use TapretRightBranch#basket-prelude-bridge - use BlindSealTxPtr#austria-icon-waiter - use OpretProof#segment-ambient-totem - use SecretSeal#santana-domingo-needle - use BlindSealTxid#kimono-golf-price - use TxPtr#strange-source-father - -import StrictTypes#ACBoDKVqDSuPrZLs2W2bLVj2TnpThzUMcJJrC3GhsQ79#idea-judo-benny - use SemId#cargo-plasma-catalog - use TypeName#gray-bonanza-kilo - -import AluVM#APYERRUMyWqLadwTv8tEFifHMPGpL3xGFSBxwaKYpmcV#square-mammal-uncle - use LibSite#mission-papa-mercy - use LibId#rebel-factor-rodeo - -import Std#EcCNgrgLaygt3tCZNu2ZVEzMzSAZYEUeTNAVi5E81YWi#aspirin-mango-average - use AsciiPrintable#prize-solar-driver - use Bool#laser-madam-maxwell - use AlphaCapsLodash#winter-vampire-energy - -import CommitVerify#GCWLX5TjFmMDCJr5cxWtwoSajBWDWbkQVSuTNbrtD1tg#egypt-wedding-cupid - use MerkleHash#culture-metro-modular - use StrictHash#cheese-final-locate - use ReservedBytes1#joker-lemon-mental - use ReservedBytes2#pocket-habitat-soviet - use ReservedBytes8#helena-button-combat - -import Bitcoin#HX2UBak8vPsTokug1DGMDvTpzns3xUdwZ7QJdyt4qBA9#speed-atlanta-trilogy - use Vout#chrome-robin-gallop - use ScriptBytes#maestro-source-jackson - use TapNodeHash#crash-culture-jamaica - use LeafScript#brenda-round-micro - use Txid#cowboy-diego-betty - use InternalPk#meter-nerve-chicken - use LeafVer#tunnel-lagoon-cowboy - use XOnlyPk#evident-finance-promo - - -@mnemonic(banana-mouse-plaster) +import StrictTypes#century-comrade-chess + use TypeName#edgar-carol-mystery + use SemId#logic-absorb-hilton + +import AluVM#congo-archive-folio + use LibSite#ultra-grace-message + use LibId#germany-culture-olivia + +import BPCore#garbo-radius-peru + use TapretNodePartner#roger-member-educate + use ExplicitSealTxid#nova-roger-campus + use TapretProof#marco-border-sample + use TapretPathProof#kiwi-mirror-paris + use Method#bali-boris-plasma + use TapretRightBranch#miracle-patriot-touch + use BlindSealTxPtr#fortune-iron-salmon + use OpretProof#good-village-flex + use SecretSeal#dollar-iris-wizard + use BlindSealTxid#media-judge-anita + use TxPtr#italian-july-eddie + +import Std#ralph-blue-lucky + use AsciiPrintable#ultra-sunset-format + use Bool#oxygen-complex-duet + use AlphaNumLodash#percent-bingo-caesar + use AlphaCapsLodash#duet-hammer-labor + +import CommitVerify#tennis-peace-olympic + use MerkleHash#horse-popcorn-bundle + use StrictHash#pizza-sherman-sound + use ReservedBytes1#origin-roger-relax + use ReservedBytes2#florida-libra-circus + use ReservedBytes8#rudolf-tape-adrian + +import Bitcoin#signal-color-cipher + use Vout#brush-gloria-heroic + use ScriptBytes#equator-cockpit-gong + use TapNodeHash#paprika-amanda-hunter + use LeafScript#bison-doctor-oscar + use Txid#shallow-light-reverse + use InternalPk#habitat-paprika-oliver + use LeafVer#benefit-carbon-africa + use XOnlyPk#clever-swim-carpet + + +@mnemonic(edison-survive-nitro) data AltLayer1 : liquid#1 -@mnemonic(salmon-taxi-ohio) +@mnemonic(almond-office-pulse) data AltLayer1Set : {AltLayer1 ^ ..0xff} -@mnemonic(buzzer-pattern-craft) +@mnemonic(slang-amber-club) data AssetTag : [Byte ^ 32] -@mnemonic(silicon-brush-horizon) +@mnemonic(crash-singer-corner) data AssetTags : {AssignmentType -> ^ ..0xff AssetTag} -@mnemonic(robin-blitz-andrea) +@mnemonic(airport-ladder-joseph) data AssignRevealedAttachBlindSealTxPtr : confidential (seal XChainSecretSeal , state ConcealedAttach - , lock CommitVerify.ReservedBytes2#pocket-habitat-soviet) + , lock CommitVerify.ReservedBytes2) | confidentialState (seal XChainBlindSealTxPtr , state ConcealedAttach - , lock CommitVerify.ReservedBytes2#pocket-habitat-soviet) + , lock CommitVerify.ReservedBytes2) | confidentialSeal (seal XChainSecretSeal , state RevealedAttach - , lock CommitVerify.ReservedBytes2#pocket-habitat-soviet) + , lock CommitVerify.ReservedBytes2) | revealed (seal XChainBlindSealTxPtr , state RevealedAttach - , lock CommitVerify.ReservedBytes2#pocket-habitat-soviet) + , lock CommitVerify.ReservedBytes2) -@mnemonic(forever-jumbo-shine) +@mnemonic(member-camera-parking) data AssignRevealedAttachBlindSealTxid : confidential (seal XChainSecretSeal , state ConcealedAttach - , lock CommitVerify.ReservedBytes2#pocket-habitat-soviet) + , lock CommitVerify.ReservedBytes2) | confidentialState (seal XChainBlindSealTxid , state ConcealedAttach - , lock CommitVerify.ReservedBytes2#pocket-habitat-soviet) + , lock CommitVerify.ReservedBytes2) | confidentialSeal (seal XChainSecretSeal , state RevealedAttach - , lock CommitVerify.ReservedBytes2#pocket-habitat-soviet) + , lock CommitVerify.ReservedBytes2) | revealed (seal XChainBlindSealTxid , state RevealedAttach - , lock CommitVerify.ReservedBytes2#pocket-habitat-soviet) + , lock CommitVerify.ReservedBytes2) -@mnemonic(diploma-general-scorpio) +@mnemonic(genius-editor-formula) data AssignRevealedDataBlindSealTxPtr : confidential (seal XChainSecretSeal , state ConcealedData - , lock CommitVerify.ReservedBytes2#pocket-habitat-soviet) + , lock CommitVerify.ReservedBytes2) | confidentialState (seal XChainBlindSealTxPtr , state ConcealedData - , lock CommitVerify.ReservedBytes2#pocket-habitat-soviet) + , lock CommitVerify.ReservedBytes2) | confidentialSeal (seal XChainSecretSeal , state RevealedData - , lock CommitVerify.ReservedBytes2#pocket-habitat-soviet) + , lock CommitVerify.ReservedBytes2) | revealed (seal XChainBlindSealTxPtr , state RevealedData - , lock CommitVerify.ReservedBytes2#pocket-habitat-soviet) + , lock CommitVerify.ReservedBytes2) -@mnemonic(equal-folio-ground) +@mnemonic(soda-edison-music) data AssignRevealedDataBlindSealTxid : confidential (seal XChainSecretSeal , state ConcealedData - , lock CommitVerify.ReservedBytes2#pocket-habitat-soviet) + , lock CommitVerify.ReservedBytes2) | confidentialState (seal XChainBlindSealTxid , state ConcealedData - , lock CommitVerify.ReservedBytes2#pocket-habitat-soviet) + , lock CommitVerify.ReservedBytes2) | confidentialSeal (seal XChainSecretSeal , state RevealedData - , lock CommitVerify.ReservedBytes2#pocket-habitat-soviet) + , lock CommitVerify.ReservedBytes2) | revealed (seal XChainBlindSealTxid , state RevealedData - , lock CommitVerify.ReservedBytes2#pocket-habitat-soviet) + , lock CommitVerify.ReservedBytes2) -@mnemonic(block-honey-solid) +@mnemonic(rachel-unique-logic) data AssignRevealedValueBlindSealTxPtr : confidential (seal XChainSecretSeal , state ConcealedFungible - , lock CommitVerify.ReservedBytes2#pocket-habitat-soviet) + , lock CommitVerify.ReservedBytes2) | confidentialState (seal XChainBlindSealTxPtr , state ConcealedFungible - , lock CommitVerify.ReservedBytes2#pocket-habitat-soviet) + , lock CommitVerify.ReservedBytes2) | confidentialSeal (seal XChainSecretSeal , state RevealedFungible - , lock CommitVerify.ReservedBytes2#pocket-habitat-soviet) + , lock CommitVerify.ReservedBytes2) | revealed (seal XChainBlindSealTxPtr , state RevealedFungible - , lock CommitVerify.ReservedBytes2#pocket-habitat-soviet) + , lock CommitVerify.ReservedBytes2) -@mnemonic(grille-horse-amber) +@mnemonic(cadet-book-pablo) data AssignRevealedValueBlindSealTxid : confidential (seal XChainSecretSeal , state ConcealedFungible - , lock CommitVerify.ReservedBytes2#pocket-habitat-soviet) + , lock CommitVerify.ReservedBytes2) | confidentialState (seal XChainBlindSealTxid , state ConcealedFungible - , lock CommitVerify.ReservedBytes2#pocket-habitat-soviet) + , lock CommitVerify.ReservedBytes2) | confidentialSeal (seal XChainSecretSeal , state RevealedFungible - , lock CommitVerify.ReservedBytes2#pocket-habitat-soviet) + , lock CommitVerify.ReservedBytes2) | revealed (seal XChainBlindSealTxid , state RevealedFungible - , lock CommitVerify.ReservedBytes2#pocket-habitat-soviet) + , lock CommitVerify.ReservedBytes2) -@mnemonic(partner-linda-stuart) +@mnemonic(cycle-panther-cave) data AssignVoidStateBlindSealTxPtr : confidential (seal XChainSecretSeal , state VoidState - , lock CommitVerify.ReservedBytes2#pocket-habitat-soviet) + , lock CommitVerify.ReservedBytes2) | confidentialState (seal XChainBlindSealTxPtr , state VoidState - , lock CommitVerify.ReservedBytes2#pocket-habitat-soviet) + , lock CommitVerify.ReservedBytes2) | confidentialSeal (seal XChainSecretSeal , state VoidState - , lock CommitVerify.ReservedBytes2#pocket-habitat-soviet) + , lock CommitVerify.ReservedBytes2) | revealed (seal XChainBlindSealTxPtr , state VoidState - , lock CommitVerify.ReservedBytes2#pocket-habitat-soviet) + , lock CommitVerify.ReservedBytes2) -@mnemonic(company-export-amber) +@mnemonic(dynasty-iron-athena) data AssignVoidStateBlindSealTxid : confidential (seal XChainSecretSeal , state VoidState - , lock CommitVerify.ReservedBytes2#pocket-habitat-soviet) + , lock CommitVerify.ReservedBytes2) | confidentialState (seal XChainBlindSealTxid , state VoidState - , lock CommitVerify.ReservedBytes2#pocket-habitat-soviet) + , lock CommitVerify.ReservedBytes2) | confidentialSeal (seal XChainSecretSeal , state VoidState - , lock CommitVerify.ReservedBytes2#pocket-habitat-soviet) + , lock CommitVerify.ReservedBytes2) | revealed (seal XChainBlindSealTxid , state VoidState - , lock CommitVerify.ReservedBytes2#pocket-habitat-soviet) + , lock CommitVerify.ReservedBytes2) -@mnemonic(hunter-hello-retro) +@mnemonic(secret-penguin-limit) data AssignmentType : U16 -@mnemonic(explain-nato-passage) +@mnemonic(office-street-numeric) data AssignmentWitness : absent () | present XChainTxid -@mnemonic(granite-history-canvas) +@mnemonic(target-valid-tiger) data AssignmentsBlindSealTxPtr : {AssignmentType -> ^ ..0xff TypedAssignsBlindSealTxPtr} -@mnemonic(center-nevada-promise) +@mnemonic(baker-size-sonar) data AssignmentsBlindSealTxid : {AssignmentType -> ^ ..0xff TypedAssignsBlindSealTxid} -@mnemonic(delta-member-agenda) +@mnemonic(factor-hair-everest) data AttachId : [Byte ^ 32] -@mnemonic(nominal-decade-fiona) -data BaseCommitment : flags CommitVerify.ReservedBytes1#joker-lemon-mental +@mnemonic(amadeus-sunday-casino) +data BaseCommitment : flags CommitVerify.ReservedBytes1 , schemaId SchemaId , timestamp I64 - , testnet Std.Bool#laser-madam-maxwell - , altLayers1 CommitVerify.StrictHash#cheese-final-locate - , issuer CommitVerify.StrictHash#cheese-final-locate - , assetTags CommitVerify.StrictHash#cheese-final-locate + , issuer CommitVerify.StrictHash + , testnet Std.Bool + , altLayers1 CommitVerify.StrictHash + , assetTags CommitVerify.StrictHash -@mnemonic(agenda-ivory-blast) +@mnemonic(animal-plume-minus) data BlindingFactor : [Byte ^ 32] -@mnemonic(pizza-natural-cyclone) +@mnemonic(meter-arizona-albino) data ConcealedAttach : [Byte ^ 32] -@mnemonic(mirage-invite-newton) +@mnemonic(ivan-tripod-young) data ConcealedData : [Byte ^ 32] -@mnemonic(small-melody-empty) +@mnemonic(arizona-basic-moment) data ConcealedFungible : commitment PedersenCommitment, rangeProof PedersenCommitment -@mnemonic(oliver-viking-bison) +@mnemonic(candid-silicon-america) data ContractHistory : schemaId SchemaId , contractId ContractId , global {GlobalStateType -> ^ ..0xff {GlobalOrd -> ^ ..0xffffffff DataState}} @@ -226,20 +227,20 @@ data ContractHistory : schemaId SchemaId , data {OutputAssignmentRevealedData ^ ..0xffffffff} , attach {OutputAssignmentRevealedAttach ^ ..0xffffffff} -@mnemonic(alarm-danube-vampire) +@mnemonic(uniform-welcome-papa) data ContractId : [Byte ^ 32] -@mnemonic(forward-marina-needle) +@mnemonic(harris-toast-music) data ContractState : schema Schema, history ContractHistory -@mnemonic(diana-archive-liquid) +@mnemonic(short-noise-postal) data DataState : [Byte] -@mnemonic(fidel-swim-chicago) -data DbcProof : tapret#1 BPCore.TapretProof#forum-paint-tunnel - | opret BPCore.OpretProof#segment-ambient-totem +@mnemonic(needle-change-forest) +data DbcProof : tapret#1 BPCore.TapretProof + | opret BPCore.OpretProof -@mnemonic(mayor-archive-navy) +@mnemonic(marco-taboo-trade) data Extension : ffv Ffv , contractId ContractId , extensionType ExtensionType @@ -248,185 +249,185 @@ data Extension : ffv Ffv , assignments AssignmentsBlindSealTxid , redeemed Redeemed , valencies Valencies - , validator CommitVerify.ReservedBytes1#joker-lemon-mental - , witness CommitVerify.ReservedBytes2#pocket-habitat-soviet + , validator CommitVerify.ReservedBytes1 + , witness CommitVerify.ReservedBytes2 -@mnemonic(joshua-company-orchid) +@mnemonic(delta-elastic-germany) data ExtensionSchema : metadata {MetaType ^ ..0xff} , globals {GlobalStateType -> ^ ..0xff Occurrences} , redeems {ValencyType ^ ..0xff} , assignments {AssignmentType -> ^ ..0xff Occurrences} , valencies {ValencyType ^ ..0xff} - , validator AluVM.LibSite#mission-papa-mercy? + , validator AluVM.LibSite? -@mnemonic(mission-salsa-parole) +@mnemonic(apropos-scoop-viva) data ExtensionType : U16 -@mnemonic(silence-motel-toronto) +@mnemonic(pigment-career-hippie) data Ffv : U16 -@mnemonic(natasha-profit-winter) +@mnemonic(guide-poker-coconut) data FungibleState : bits64#8 U64 -@mnemonic(profit-bazooka-present) +@mnemonic(matrix-optimal-sinatra) data FungibleType : unsigned64Bit#8 -@mnemonic(example-twist-crimson) +@mnemonic(fashion-delta-polka) data Genesis : ffv Ffv , schemaId SchemaId - , flags CommitVerify.ReservedBytes1#joker-lemon-mental + , flags CommitVerify.ReservedBytes1 , timestamp I64 - , testnet Std.Bool#laser-madam-maxwell + , issuer Identity + , testnet Std.Bool , altLayers1 AltLayer1Set , assetTags AssetTags , metadata Metadata , globals GlobalState , assignments AssignmentsBlindSealTxid , valencies Valencies - , issuer Identity - , validator CommitVerify.ReservedBytes1#joker-lemon-mental + , validator CommitVerify.ReservedBytes1 -@mnemonic(formal-door-pixel) +@mnemonic(concept-gloria-shock) data GenesisSchema : metadata {MetaType ^ ..0xff} , globals {GlobalStateType -> ^ ..0xff Occurrences} , assignments {AssignmentType -> ^ ..0xff Occurrences} , valencies {ValencyType ^ ..0xff} - , validator AluVM.LibSite#mission-papa-mercy? + , validator AluVM.LibSite? -@mnemonic(north-llama-empire) +@mnemonic(miguel-lava-extend) data GlobalOrd : witnessAnchor WitnessAnchor?, idx U16 -@mnemonic(ranger-middle-roman) +@mnemonic(initial-malta-sierra) data GlobalState : {GlobalStateType -> ^ ..0xff GlobalValues} -@mnemonic(warning-magnet-blonde) -data GlobalStateSchema : reserved CommitVerify.ReservedBytes1#joker-lemon-mental - , semId StrictTypes.SemId#cargo-plasma-catalog +@mnemonic(connect-ricardo-lava) +data GlobalStateSchema : reserved CommitVerify.ReservedBytes1 + , semId StrictTypes.SemId , maxItems U16 -@mnemonic(seminar-major-tape) +@mnemonic(yoga-quick-jasmine) data GlobalStateType : U16 -@mnemonic(burger-arrow-slogan) +@mnemonic(charter-fractal-maze) data GlobalValues : [DataState ^ 1..] -@mnemonic(stock-teacher-falcon) -data Identity : [Std.AsciiPrintable#prize-solar-driver ^ ..0x1000] +@mnemonic(smart-pioneer-nominal) +data Identity : Std.AsciiPrintable, [Std.AsciiPrintable ^ ..0xfff] -@mnemonic(press-egypt-helena) -data Input : prevOut Opout, reserved CommitVerify.ReservedBytes2#pocket-habitat-soviet +@mnemonic(kevin-morgan-shrink) +data Input : prevOut Opout, reserved CommitVerify.ReservedBytes2 -@mnemonic(canada-chicken-analyze) +@mnemonic(tobacco-open-join) data InputMap : {Bitcoin.Vout -> ^ 1.. OpId} -@mnemonic(liquid-meaning-convert) +@mnemonic(sector-charlie-diagram) data Inputs : {Input} -@mnemonic(light-nelson-brain) +@mnemonic(isabel-heaven-north) data MediaType : any#255 -@mnemonic(index-shadow-pattern) +@mnemonic(quebec-mission-quota) data MetaType : U16 -@mnemonic(voodoo-budget-weekend) +@mnemonic(split-package-recycle) data MetaValue : [Byte] -@mnemonic(carmen-critic-metal) +@mnemonic(retro-mozart-formal) data Metadata : {MetaType -> ^ ..0xff MetaValue} -@mnemonic(unicorn-empire-mama) +@mnemonic(source-olga-mirage) data Occurrences : min U16, max U16 -@mnemonic(road-norway-oregano) +@mnemonic(film-sting-tourist) data OpCommitment : ffv Ffv , opType TypeCommitment - , metadata CommitVerify.StrictHash#cheese-final-locate - , globals CommitVerify.MerkleHash#culture-metro-modular - , inputs CommitVerify.MerkleHash#culture-metro-modular - , assignments CommitVerify.MerkleHash#culture-metro-modular - , redeemed CommitVerify.StrictHash#cheese-final-locate - , valencies CommitVerify.StrictHash#cheese-final-locate - , witness CommitVerify.MerkleHash#culture-metro-modular - , validator CommitVerify.StrictHash#cheese-final-locate - -@mnemonic(slow-samuel-ceramic) + , metadata CommitVerify.StrictHash + , globals CommitVerify.MerkleHash + , inputs CommitVerify.MerkleHash + , assignments CommitVerify.MerkleHash + , redeemed CommitVerify.StrictHash + , valencies CommitVerify.StrictHash + , witness CommitVerify.MerkleHash + , validator CommitVerify.StrictHash + +@mnemonic(picnic-single-gloria) data OpId : [Byte ^ 32] -@mnemonic(shallow-match-tokyo) +@mnemonic(child-morning-compare) data Opout : op OpId , ty AssignmentType , no U16 -@mnemonic(think-record-medusa) +@mnemonic(beast-cotton-control) data OutputAssignmentRevealedAttach : opout Opout , seal XChainExplicitSealTxid , state RevealedAttach , witness AssignmentWitness -@mnemonic(nectar-nectar-capsule) +@mnemonic(ramirez-laptop-sierra) data OutputAssignmentRevealedData : opout Opout , seal XChainExplicitSealTxid , state RevealedData , witness AssignmentWitness -@mnemonic(control-boris-motif) +@mnemonic(second-pulse-network) data OutputAssignmentRevealedValue : opout Opout , seal XChainExplicitSealTxid , state RevealedFungible , witness AssignmentWitness -@mnemonic(avatar-beatles-protein) +@mnemonic(fame-norway-tribal) data OutputAssignmentVoidState : opout Opout , seal XChainExplicitSealTxid , state VoidState , witness AssignmentWitness -@mnemonic(phone-lola-empty) +@mnemonic(neutral-mixer-visual) data OwnedStateSchema : declarative () | fungible FungibleType - | structured StrictTypes.SemId#cargo-plasma-catalog + | structured StrictTypes.SemId | attachment MediaType -@mnemonic(nepal-delta-earth) +@mnemonic(pupil-scale-jerome) data PedersenCommitment : [Byte ^ 33] -@mnemonic(scoop-press-scuba) +@mnemonic(anita-vega-pirate) data Redeemed : {ValencyType -> ^ ..0xff OpId} -@mnemonic(cigar-network-event) +@mnemonic(hammer-prism-twin) data RevealedAttach : id AttachId , mediaType MediaType , salt U64 -@mnemonic(ivory-bogart-stock) +@mnemonic(sleep-source-figure) data RevealedData : value DataState, salt U128 -@mnemonic(canal-pagoda-ralph) +@mnemonic(source-contact-member) data RevealedFungible : value FungibleState , blinding BlindingFactor , tag AssetTag -@mnemonic(nerve-minimum-shampoo) +@mnemonic(corona-igloo-sierra) data Schema : ffv Ffv - , flags CommitVerify.ReservedBytes1#joker-lemon-mental - , name StrictTypes.TypeName#gray-bonanza-kilo + , flags CommitVerify.ReservedBytes1 + , name StrictTypes.TypeName , timestamp I64 , developer Identity - , metaTypes {MetaType -> ^ ..0xff StrictTypes.SemId#cargo-plasma-catalog} + , metaTypes {MetaType -> ^ ..0xff StrictTypes.SemId} , globalTypes {GlobalStateType -> ^ ..0xff GlobalStateSchema} , ownedTypes {AssignmentType -> ^ ..0xff OwnedStateSchema} , valencyTypes {ValencyType ^ ..0xff} , genesis GenesisSchema , extensions {ExtensionType -> ^ ..0xff ExtensionSchema} , transitions {TransitionType -> ^ ..0xff TransitionSchema} - , reserved CommitVerify.ReservedBytes8#helena-button-combat + , reserved CommitVerify.ReservedBytes8 -@mnemonic(garcia-smoke-ozone) +@mnemonic(ramirez-patron-simon) data SchemaId : [Byte ^ 32] -@mnemonic(canary-first-under) +@mnemonic(rainbow-program-george) data Transition : ffv Ffv , contractId ContractId , transitionType TransitionType @@ -435,79 +436,79 @@ data Transition : ffv Ffv , inputs Inputs , assignments AssignmentsBlindSealTxPtr , valencies Valencies - , validator CommitVerify.ReservedBytes1#joker-lemon-mental - , witness CommitVerify.ReservedBytes2#pocket-habitat-soviet + , validator CommitVerify.ReservedBytes1 + , witness CommitVerify.ReservedBytes2 -@mnemonic(nancy-current-menu) -data TransitionBundle : closeMethod BPCore.Method#trilogy-tahiti-valid +@mnemonic(antonio-adios-analyze) +data TransitionBundle : closeMethod BPCore.Method , inputMap InputMap , knownTransitions {OpId -> ^ 1.. Transition} -@mnemonic(window-basil-little) +@mnemonic(pirate-lithium-side) data TransitionSchema : metadata {MetaType ^ ..0xff} , globals {GlobalStateType -> ^ ..0xff Occurrences} , inputs {AssignmentType -> ^ ..0xff Occurrences} , assignments {AssignmentType -> ^ ..0xff Occurrences} , valencies {ValencyType ^ ..0xff} - , validator AluVM.LibSite#mission-papa-mercy? + , validator AluVM.LibSite? -@mnemonic(puma-joshua-evita) +@mnemonic(picture-reflex-brigade) data TransitionType : U16 -@mnemonic(medusa-amigo-reunion) +@mnemonic(biscuit-pandora-bagel) data TypeCommitment : genesis BaseCommitment | transition (ContractId, TransitionType) | extension (ContractId, ExtensionType) -@mnemonic(orchid-season-bishop) +@mnemonic(giant-trinity-lagoon) data TypedAssignsBlindSealTxPtr : declarative [AssignVoidStateBlindSealTxPtr] | fungible [AssignRevealedValueBlindSealTxPtr] | structured [AssignRevealedDataBlindSealTxPtr] | attachment#255 [AssignRevealedAttachBlindSealTxPtr] -@mnemonic(rondo-roman-expand) +@mnemonic(penguin-raja-machine) data TypedAssignsBlindSealTxid : declarative [AssignVoidStateBlindSealTxid] | fungible [AssignRevealedValueBlindSealTxid] | structured [AssignRevealedDataBlindSealTxid] | attachment#255 [AssignRevealedAttachBlindSealTxid] -@mnemonic(andy-mango-brother) +@mnemonic(shock-jester-orion) data Valencies : {ValencyType ^ ..0xff} -@mnemonic(palma-exit-pupil) +@mnemonic(aloha-dublin-brush) data ValencyType : U16 -@mnemonic(nectar-ceramic-driver) +@mnemonic(email-snow-safari) data VoidState : () -@mnemonic(henry-prepare-company) +@mnemonic(earth-havana-abraham) data WitnessAnchor : witnessOrd WitnessOrd, witnessId XChainTxid -@mnemonic(jacket-fiction-sound) +@mnemonic(tennis-ballad-saturn) data WitnessOrd : onChain WitnessPos | offChain () -@mnemonic(robert-average-artist) +@mnemonic(snow-local-tonight) data WitnessPos : height U32, timestamp I64 -@mnemonic(prime-loyal-escort) -data XChainBlindSealTxPtr : bitcoin BPCore.BlindSealTxPtr#austria-icon-waiter - | liquid BPCore.BlindSealTxPtr#austria-icon-waiter +@mnemonic(senator-limbo-raymond) +data XChainBlindSealTxPtr : bitcoin BPCore.BlindSealTxPtr + | liquid BPCore.BlindSealTxPtr -@mnemonic(biology-domain-domain) -data XChainBlindSealTxid : bitcoin BPCore.BlindSealTxid#kimono-golf-price - | liquid BPCore.BlindSealTxid#kimono-golf-price +@mnemonic(dynamic-life-brown) +data XChainBlindSealTxid : bitcoin BPCore.BlindSealTxid + | liquid BPCore.BlindSealTxid -@mnemonic(ozone-quick-hippie) -data XChainExplicitSealTxid : bitcoin BPCore.ExplicitSealTxid#antenna-darwin-emotion - | liquid BPCore.ExplicitSealTxid#antenna-darwin-emotion +@mnemonic(acid-nepal-melon) +data XChainExplicitSealTxid : bitcoin BPCore.ExplicitSealTxid + | liquid BPCore.ExplicitSealTxid -@mnemonic(palace-random-taxi) -data XChainSecretSeal : bitcoin BPCore.SecretSeal#santana-domingo-needle - | liquid BPCore.SecretSeal#santana-domingo-needle +@mnemonic(alex-griffin-left) +data XChainSecretSeal : bitcoin BPCore.SecretSeal + | liquid BPCore.SecretSeal -@mnemonic(cubic-museum-lemon) -data XChainTxid : bitcoin Bitcoin.Txid#cowboy-diego-betty - | liquid Bitcoin.Txid#cowboy-diego-betty +@mnemonic(liquid-river-absorb) +data XChainTxid : bitcoin Bitcoin.Txid + | liquid Bitcoin.Txid diff --git a/stl/Schema.vesper b/stl/Schema.vesper index 578e9cd5..ad76aa75 100644 --- a/stl/Schema.vesper +++ b/stl/Schema.vesper @@ -36,9 +36,9 @@ SchemaId commitment hasher=SHA256 tagged=urn:lnp-bp:rgb:schema#2024-02-03 Schema rec ffv is U16 aka=Ffv flags bytes len=1 aka=ReservedBytes1 - name ascii len=1..100 aka=TypeName charset=AlphaCapsLodash + name ascii aka=TypeName first=AlphaCapsLodash rest=AlphaNumLodash len=1..100 timestamp is I64 - developer ascii len=0..4096 aka=Identity charset=AsciiPrintable + developer ascii aka=Identity first=AsciiPrintable rest=AsciiPrintable len=1..4096 metaTypes map len=0..MAX8 key is U16 aka=MetaType value bytes len=32 aka=SemId From 26a349112f479072f9cc8dee06ffdde0b78e1f5b Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Thu, 25 Apr 2024 14:53:59 +0200 Subject: [PATCH 17/33] chore: rename library to rgbcore --- Cargo.toml | 2 +- src/bin/rgbcore-stl.rs | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index fd6d9357..65e7df50 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,7 +14,7 @@ rust-version = "1.75.0" exclude = [".github"] [lib] -name = "rgb" +name = "rgbcore" crate-type = ["cdylib", "rlib"] # We need this for WASM [[bin]] diff --git a/src/bin/rgbcore-stl.rs b/src/bin/rgbcore-stl.rs index b6d0f06f..44d61e36 100644 --- a/src/bin/rgbcore-stl.rs +++ b/src/bin/rgbcore-stl.rs @@ -27,8 +27,8 @@ use aluvm::stl::aluvm_stl; use bp::stl::bp_core_stl; use commit_verify::stl::commit_verify_stl; use commit_verify::CommitmentLayout; -use rgb::stl::bp_tx_stl; -use rgb::{Schema, Transition, TransitionBundle}; +use rgbcore::stl::bp_tx_stl; +use rgbcore::{Schema, Transition, TransitionBundle}; use strict_types::stl::{std_stl, strict_types_stl}; use strict_types::typelib::parse_args; use strict_types::SystemBuilder; @@ -36,7 +36,7 @@ use strict_types::SystemBuilder; fn main() { let (format, dir) = parse_args(); - let rgb = rgb::stl::rgb_core_stl(); + let rgb = rgbcore::stl::rgb_core_stl(); rgb.serialize( format, From 0d7bbcc45d448b71d6c93beb804a3c7062e6891c Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Thu, 25 Apr 2024 16:06:31 +0200 Subject: [PATCH 18/33] improve Identity API: add support for anonymous identities --- src/contract/operations.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/contract/operations.rs b/src/contract/operations.rs index d06ed93c..07c6e7a3 100644 --- a/src/contract/operations.rs +++ b/src/contract/operations.rs @@ -274,13 +274,18 @@ pub trait Operation { pub struct Identity(RString); impl Default for Identity { - fn default() -> Self { Self::from("anonym") } + fn default() -> Self { Self::from("ssi:anonymous") } } impl From<&'static str> for Identity { fn from(s: &'static str) -> Self { Self(RString::from(s)) } } +impl Identity { + pub fn is_empty(&self) -> bool { self.is_anonymous() } + pub fn is_anonymous(&self) -> bool { self == &default!() } +} + #[derive(Clone, PartialEq, Eq, Debug)] #[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] #[strict_type(lib = LIB_NAME_RGB)] From 3fa35c1428796cb607c8a627765aabb2e8329b62 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Sun, 28 Apr 2024 21:36:54 +0200 Subject: [PATCH 19/33] chore: update ASCII armoring --- Cargo.lock | 30 +- Cargo.toml | 2 - src/schema/schema.rs | 8 - stl/RGB@0.1.0.sta | 664 +++++++++++++++++++------------------------ 4 files changed, 310 insertions(+), 394 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3545c67f..86d9ab09 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5,7 +5,7 @@ version = 3 [[package]] name = "aluvm" version = "0.11.0-beta.5" -source = "git+https://github.com/AluVM/rust-aluvm?branch=develop#d8efe3007a5680a99cf86159b8dcc81cf1ed7278" +source = "git+https://github.com/AluVM/rust-aluvm?branch=develop#25be42a16519383daaa6ba50e65654ff0a1721aa" dependencies = [ "amplify", "ascii-armor", @@ -121,8 +121,9 @@ dependencies = [ [[package]] name = "ascii-armor" -version = "0.4.0" -source = "git+https://github.com/UBIDECO/ascii-armor#38dc9767f36db3957ac3dade280a04d9a72b6be4" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "673486110323d50d9f33d99f0f526726b4721b1b596284351e75d3692225abe8" dependencies = [ "amplify", "baid64", @@ -417,9 +418,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.14.3" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" [[package]] name = "heck" @@ -586,7 +587,6 @@ version = "0.11.0-beta.5" dependencies = [ "aluvm", "amplify", - "ascii-armor", "baid64", "bp-core", "chrono", @@ -689,18 +689,18 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.198" +version = "1.0.199" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9846a40c979031340571da2545a4e5b7c4163bdae79b301d5f86d03979451fcc" +checksum = "0c9f6e76df036c77cd94996771fb40db98187f096dd0b9af39c6c6e452ba966a" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.198" +version = "1.0.199" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e88edab869b01783ba905e7d0153f9fc1a6505a96e4ad3018011eedb838566d9" +checksum = "11bd257a6541e141e42ca6d24ae26f7714887b47e89aa739099104c7e4d3b7fc" dependencies = [ "proc-macro2", "quote", @@ -772,7 +772,7 @@ dependencies = [ [[package]] name = "strict_encoding" version = "2.7.0-beta.3" -source = "git+https://github.com/strict-types/strict-encoding?branch=develop#7c46c97c10655612a1c71b984faa62ffc543b226" +source = "git+https://github.com/strict-types/strict-encoding?branch=develop#901e26ee8b01b3bcff4d7ac76acff2fcc633634b" dependencies = [ "amplify", "half", @@ -783,7 +783,7 @@ dependencies = [ [[package]] name = "strict_encoding_derive" version = "2.7.0-beta.3" -source = "git+https://github.com/strict-types/strict-encoding?branch=develop#7c46c97c10655612a1c71b984faa62ffc543b226" +source = "git+https://github.com/strict-types/strict-encoding?branch=develop#901e26ee8b01b3bcff4d7ac76acff2fcc633634b" dependencies = [ "amplify_syn", "heck", @@ -795,7 +795,7 @@ dependencies = [ [[package]] name = "strict_types" version = "2.7.0-beta.3" -source = "git+https://github.com/strict-types/strict-types?branch=develop#a2e860f36f24b477712551a6db349edcf08efb3e" +source = "git+https://github.com/strict-types/strict-types?branch=develop#4effa0b28804f7798a17f5dc6b4411ce6515f2f5" dependencies = [ "amplify", "ascii-armor", @@ -1113,9 +1113,9 @@ checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" [[package]] name = "winnow" -version = "0.6.6" +version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0c976aaaa0e1f90dbb21e9587cdaf1d9679a1cde8875c0d6bd83ab96a208352" +checksum = "14b9415ee827af173ebb3f15f9083df5a122eb93572ec28741fb153356ea2578" dependencies = [ "memchr", ] diff --git a/Cargo.toml b/Cargo.toml index 65e7df50..5f949b81 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,7 +23,6 @@ required-features = ["stl"] [dependencies] amplify = { version = "~4.6.0", features = ["rand"] } -ascii-armor = "~0.4.0" baid64 = "~0.1.0" strict_encoding = "~2.7.0-beta.3" strict_types = { version = "~2.7.0-beta.3", features = ["armor"] } @@ -63,7 +62,6 @@ wasm-bindgen-test = "0.3" features = ["all"] [patch.crates-io] -ascii-armor = { git = "https://github.com/UBIDECO/ascii-armor" } strict_encoding = { git = "https://github.com/strict-types/strict-encoding", branch = "develop" } strict_types = { git = "https://github.com/strict-types/strict-types", branch = "develop" } commit_verify = { git = "https://github.com/LNP-BP/client_side_validation", branch = "develop" } diff --git a/src/schema/schema.rs b/src/schema/schema.rs index 414d4113..1adbfac1 100644 --- a/src/schema/schema.rs +++ b/src/schema/schema.rs @@ -27,7 +27,6 @@ use std::str::FromStr; use aluvm::library::LibId; use amplify::confinement::{TinyOrdMap, TinyOrdSet}; use amplify::{ByteArray, Bytes32}; -use armor::StrictArmor; use baid64::{Baid64ParseError, DisplayBaid64, FromBaid64Str}; use commit_verify::{ CommitEncode, CommitEngine, CommitId, CommitmentId, DigestExt, ReservedBytes, Sha256, @@ -249,13 +248,6 @@ impl Schema { } } -impl StrictArmor for Schema { - type Id = SchemaId; - const PLATE_TITLE: &'static str = "RGB SCHEMA"; - - fn armor_id(&self) -> Self::Id { self.schema_id() } -} - #[cfg(test)] mod test { use strict_encoding::StrictDumb; diff --git a/stl/RGB@0.1.0.sta b/stl/RGB@0.1.0.sta index 55b8366b..e3e78794 100644 --- a/stl/RGB@0.1.0.sta +++ b/stl/RGB@0.1.0.sta @@ -8,376 +8,302 @@ Dependencies: Std#ralph-blue-lucky, CommitVerify#tennis-peace-olympic, Bitcoin#signal-color-cipher -Checksum-SHA256: 9696dba7e32748ec863d1554c9b6369d5366cf7c961f8c9ee86ea52a0133a2c2 +Check-SHA256: 9696dba7e32748ec863d1554c9b6369d5366cf7c961f8c9ee86ea52a0133a2c2 -15!sq21V+lU)%QMkO4aJ;_ZeCe;xE!X<$x_Fs4If6Z`oP*$Y#2a%p39RC#b^b7F8 -ce<9`Lptgpr6F_xjAC6(~TLj#*ewiHU&X!byiJp9+vrsy<5&Clo)5)@&l -6UwYFh+Ofu5^ik9drt)+7YLQq3*a%IXa9&dx0-7pM3Z=O*v*GCA9fL-<|HrZsA`N -nJlR3`&dbY$Vt-5feW*SKg&%h~b$G{NN>LxBDo)YaDXjV8yEYGn*VZ*6U9bXH|@X -=Zu#Y!hN5_Bp3Y36tDMM#=e#tGI($UA5U3KNx<*C>ja}LTPkkZ)t7@1wm|eR!sr` -ZSSEb;k|42*wg~2q@3^Lq|9zft}OB~jx>)hO72TW;VQ)zT%r!Z9lE%{u?@QI^ -EqCb}2Q7OO^w+`_q*ddTXmHSf)1x#sTNn{2>P(yEWWeWfSdtm>UaGoca9LuK7Ij+X8IutaRAF#(Wpqw&WMxoca&&HGas$;gkn2QsifIWLvZbUw81 -NwsGjgonnp^pYSe+vyeGo->aBOK~X>?O%VQf@*X=D$!ADBNH?W>M^%H|xc>sh|Dn -*!v8^Ea7rh?dzC2n-8UVQ_L~bWn0{Z)Ow3Q&MIpyF?|7J7@IF!hZhz8Wft0d6dj=*oo`t>c$)o5X19O9`rXu -=lIsRdWprq7WH>)!E^$-R$RUwD%Xb~0J!Ic@@+ehVE%-)5lom~G1rbzXaB^jIQfX -&sbV71rZewUhC#Wt^wA&hNfbvI8l{tqo-}{|djZ8YAkJtUQVz<=}LTqVnWK(5fY* -ctqbaF>d&s@;xOg?z(`#e5a?6_IYcQ>oUbhHyi-Y#=22)QEgSwgbZe&wsVQf@*X=JhGI5`vwIKJ?28qdBQV5M* -2;q-lY2q<~K(fZR6A>9R3cu;h52SRCdV{d702mm4DK10Q-T=FR=Q=>S+XYD&bY*ifyRPVjiFd`Y2QhLn&64&owka*miGSR>-o?7a>3`V^RAF#VZ)9aiV -RL9-tl4elKTgFI*|CjhfZ7VH>n$b={WmS6zNkSNp5sya&BR4P;0g`38@&rwvr8Q$XKK#ha*N>X+Ls92fzOv*E( -~7PRR#MWnpGkWpezYrz*aY{>_4@v6zr!BEn8~s;V{eB++vPW1tu=h*<|%Pi|~^P- -_fBZ*6U9bXH|@X=Zr^063mQh9?yTI7S;;e;>sZfv!yd427@;7veO2zMB=|GYU;*a -%*g5NMUnmZLh7x^`{^P$fKg#%8c8X#<$(NgM!uni2C|Kr}onZ3R84)X=8LqVRLAc -_h5K%L=laq&yA1JoJ^{7>oKLkF4~iax8KK|47hp@Qe|^xa&~28LV0v$b1}=fEj#9 -D^K)f#Cf|Xn@L3mU0Z2&n-dr?jcD1Ll0RawDWpib6c4cHjd30rSGX8=VN#A(BKKz -&v`r;e6DUv<<*U}cmb -;*F>vukd;=m`ygb@x#_>`RmOO$0)3Z)}yry~#}iVEJ)s5j^%uEnQ9{n2s|9Fa^ps -+HG#`XS5DMY;b5{PIYZeZ)9O}Xt{%a=RmHK6WZ%EWRm@*ULd%lgGoFTxUTU76^nC$%1sKzB<;EQA|)S-x8 -8IWKN#S$#@T&w`gPtRC#b^PGN0jYXqYdo~D%m7H6OD0<^0n_2##VWXRdjy=DB@qg -YOj1yf~hNn}z02|;XhOksItaxnt|25f0@b!lV)3_)ykOksItaxqh7bOiwb2?5A!f -_n>Eea4XlBy!~v3=AX`3Ri0000000000{{R -3000000B0+O=X=iRyWp-s@Y-MCYbaY{3XhLjhZe&wsVQf@*P;_zx1ONKtpQ8M_qJyiO1VIUJ=H=)@ii_1#@&^b -Y%hjG)3KC&kYOztQDksx&yAAHY;R+00^!l!96CYQxM)es -+421}!Q~o5fc_fP)zLxBDo)YaDXjV8yEYGuo~Ej#9D^K)f#Cf|Xn@ -L3mU0Z2&n-dr?jcD1Ll0RaLKV{dL|X=G(?bZKF1Q)OXn00sjDb7f&{0o#gN8iEuM -btv-qj6g$b#7A9pc!|f`I$jaRzSe2A1O;<+VRU5yXj3#G4BS)3O?Kk8E~;iP+B(^ -hzXq!*4!qFzdIL(#1Z;0(YXafX-5feW*SKg&%h~b$G{NN>LxBDo)YaDXjV8yEYGu -o~Ej#9D^K)f#Cf|Xn@L3mU0Z2&n-dr?jcD1Ll0RaODa%Fa9VQgh&00sjDb7f&{0g -t=F=tr7PLxBDo)YaDX -jV8yEYGuo~Ej#9D^K)f#Cf|Xn@L3mU0Z2&n-dr?jcD1Ll0RbUFb8~5DZc=4-WnpY -(WI=RvVPj}QY-w&}Q)OXnRCsA*1OxyKV{dL|X=G(?bZKF100sjDb7f&{0o#gN8iE -uMbtv-qj6g$b#7A9pc!|f`I$jaRzSe2A1O;<+VRU5y{4_<~U(XE-|Ev|Hdb$N7;9 -H9;8!%;3hl7uME$faw1Z;0(YXafX-5feW*SKg&%h~b$G{NN>LxBDo)YaDXjV8yEY -Guo~Ej#9D^K)f#Cf|Xn@L3mU0Z2&n-dr?jcD1Ll0RaIKV{dL|X=G(?bZKF1Q*>c; -WdH^P1aoC!YypA{4XEgn0epQk*PX+nL>xOm%pK>soMo}bYXO50sJ& -Y-CxfQ3;(PYq_>4e9YQ#rfba;u!+d5tm# -=h2RwFCuobYXO50ccY+APn47#!YtOwl1n>FWNfUk-rA3DGt2Q_Id+K%mi$2V`~E8 -(cK(6LD#rwNz2*s{WQVl8bg5o8r0R+^o=IRl4@nkxGg*8X!CPrawgw_sqk4BX8}k -^^xj-FXm+)yumJ%B2y$h1WnpY(WB>*O1aoC!YypA{4XEgn0epQk*P -X+nL>xOm%pK>soMo}bYXO50ccY+APn47#!YtOwl1n>FWNfUk-rA3DGt2Q_Id+K%m -i$2V`~E8(cK(6LD#rwNz2*s{WQVl8bg5o8r0R+^o=IRl4@nkxGg*8X!CPrawgw_s -qk4BX8}k^^xj-FXm+)yumJ%eL349yXKqquc4c8~Wn@HQbYVhlX>MdwWnpYocu;h5 -1OxyKV{dL|X=G(?bZKF100sjDb7f&{0o#gN8iEuMbtv-qj6g$b#7A9pc!|f`I$ja -RzSe2A1O;<+VRU5ya1CV;vVwtcAGbZ_5@VACR|ut2VXXq-)V^B9&!_4M1Z;0(YXa -fX-5feW*SKg&%h~b$G{NN>LxBDo)YaDXjV8yEYGuo~Ej#9D^K)f#Cf|Xn@L3mU0Z -2&n-dr?jcD1Ll0RaIKV{dL|X=G(?bZKF1Q*>c;WdH^P1aoC!YypqE!sthuPUKDEU -2%WC`V+X+(UG)mk--2W1{>juaWw^VbYXO50dNgv5VC@SZy&ck_>4e9YQ#rfba;u!+d5tm#=h2RwFCuobYXO50sm-Yz<5%CY5 -9k^g5#W{6D&GDo53%OaP0&iRq*O1aoC!YypqE!sthuPUKDEU2%WC`V+X+(UG)mk--2W1{>juaWw^VbYXO50sm- -Yz<5%CY59k^g5#W{6D&GDo53%OaP0&iRqMdwWnpYocxhw=1ONKtpQ8M_qJyiO1VIUJ=H=)@ii_1#@&^bY%f>4P_9rf`M-z -w>{+&W0M0{2&GbCtpecGzFNi4r|Jm=Y;R+00^!l!96CYQxM)es+421}!Q~o5fc_f -P)zLxBDo)YaDXjV8yEYGuo~Ej#9D^K)f#Cf|Xn@L3mU0Z2&n-dr?j -cD1Ll0RaLKV{dL|X=G(?bZKF1Q)OXn00sjDb7f&{0o#gN8iEuMbtv-qj6g$b#7A9 -pc!|f`I$jaRzSe2A1O;<+VRU5y|7c^tcv66A`G>fILxBDo)YaDXjV8yEYGuo~Ej#9D^K)f#Cf -|Xn@L3mU0Z2&n-dr?jcD1Ll0RaODa%Fa9VQgh&00sjDb7f&{0fGz-uWS7@0e2{fILxBDo)YaDXjV8yEYGuo~Ej#9 -D^K)f#Cf|Xn@L3mU0Z2&n-dr?jcD1Ll0RbUFb8~5DZc=4-WnpY(WL9Bpb!9?qX>M -dwWnpYocu;h51OxyKV{dL|X=G(?bZKF100sjDb7f&{0o#gN8iEuMbtv-qj6g$b#7 -A9pc!|f`I$jaRzSe2A1O;<+VRU5yN@#iqkT|?l*=bx{^0c**fmF&H)l(b`S3$sb4 -!MK-1Z;0(YXafX-5feW*SKg&%h~b$G{NN>LxBDo)YaDXjV8yEYGuo~Ej#9D^K)f# -Cf|Xn@L3mU0Z2&n-dr?jcD1Ll0RaIKV{dL|X=G(?bZKF1Q*>c;WdH^P1aoC!Yypq -E!sthuPUKDEU2%WC`V+X+(UG)mk--2W1{>juaWw^VbYXO50ZM3k2aq_tRM}}_>4e9YQ#rfba;u!+d5tm#=h2RwFCuobYXO5 -0c}La^e<`!Iztr?rsl#d#OQkEER^^L)C{HEhxT=ipag7hV`~E8(cK(6LD#rwNz2* -s{WQVl8bg5o8r0R+^o=IRl4@nkxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ -%B2y$h1WnpY(WB>*O1aoC!YypqE!sthuPUKDEU2%WC`V+X+(UG)mk--2W1{>juaW -w^VbYXO50c}La^e<`!Iztr?rsl#d#OQkEER^^L)C{HEhxT=ipag7hV`~E8(cK(6L -D#rwNz2*s{WQVl8bg5o8r0R+^o=IRl4@nkxGg*8X!CPrawgw_sqk4BX8}k^^xj-F -Xm+)yumJ%eL349yXKqquc4c8~Wn@-iY;|QqY-w&}Q)OXnRCsA*1OxyKV{dL|X=G( -?bZKF100sjDb7f&{0o#gN8iEuMbtv-qj6g$b#7A9pc!|f`I$jaRzSe2A1O;<+VRU -5yN@#iqkT|?l*=bx{^0c**fmF&H)l(b`S3$sb4!MK-1Z;0(YXafX-5feW*SKg&%h -~b$G{NN>LxBDo)YaDXjV8yEYGuo~Ej#9D^K)f#Cf|Xn@L3mU0Z2&n-dr?jcD1Ll0 -RaIKV{dL|X=G(?bZKF1Q*>c;WdH^P1aoC!YypA{4XEgn0epQk*PX+ -nL>xOm%pK>soMo}bYXO50ZM3k2aq_tRM}}_>4e9YQ#rfba;u!+d5tm#=h2RwFCuobYXO50c}La^e<`!Iztr?rsl#d#OQkEE -R^^L)C{HEhxT=ipag7hV`~E8(cK(6LD#rwNz2*s{WQVl8bg5o8r0R+^o=IRl4@nk -xGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%B2y$h1WnpY(WB>*O1aoC!YypA -{4XEgn0epQk*PX+nL>xOm%pK>soMo}bYXO50c}La^e<`!Iztr?rsl -#d#OQkEER^^L)C{HEhxT=ipag7hV`~E8(cK(6LD#rwNz2*s{WQVl8bg5o8r0R+^o -=IRl4@nkxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%bL349yXKq$+X=GD$V -RU6eY-w&}Q)OXnRCrKyas&hb3}bI@W@%()Zggp3YybuW1aoC!YysPfS{i~B5OpZ> -_>4e9YQ#rfba;u!+d5tm#=h2RwFCuobYXO50WPwo{ujV7L@=1(T$>wOY}Ov_b`4? -P%YY`+Wb+o`y98`+V`~E8(cK(6LD#rwNz2*s{WQVl8bg5o8r0R+^o=IRl4@nkxGg -*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%95o2#|W@%()Zggp3Y*Tb$bY%br0| -awrVQc}9yTa&4noi_R;$3lnz4{Zl)X|Z&ZIQtMA_g1big7gsb97;JWdSa-rT!PdF -hnqz;9Q#_>4e9YQ#rfba;u!+d5tm#=h2RwFCuob -YXO50WPwo{ujV7L@=1(T$>wOY}Ov_b`4?P%YY`+Wb+o`y98`+V`~E8(cK(6LD#rw -Nz2*s{WQVl8bg5o8r0R+^o=IRl4@nkxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+) -yumJ%95o2#|W@%()Zggp3Y*Tb$bY%br0|awrVQc|{3=OYq{WJl0D5$WZob97;JWdSa-rT!PdFhnqz;9Q#WZob97;JWdSa-rT!PdFhnqz; -9Q#@L7b8`d&00v=Vb7gLH000012XJy_b7gLH00j -X7iECIT&Bl;lSX#$ms8AQN7m&qY~ob0000000000{{R30000007(sJ$X=iS2 -Wo~qHLTqVnWK(5fY*ct@WCZ~L3IT`y;$>KfZ0H=mhJ>?uVE25ED1b!Bn_;nCe3IziXCXi3Z2@%=Qx4 -E?M+l67UG^w8*<_XZ#%uyqCt-#n(R;4&W&+>mb;*F>vukd;=m`ygb@x#_>`RmOO$ -uRbbWCA+WpZ;d0^!l!96CYQxM)es+421}!Q~o5fc_fP)zG60RRU806-uB4?}NmV`X7%Wn@8gbYWv?1pxpD002NB01ZQLZew -L(Y-MCbVRT^y0RRU806-uB5kqfoV`X7%Wn@NmZf9v?Y-I)l3S)0=ZE19EWo~oHb1_uapV`ybbaG*1bV+0Zp9m~TI>-W -|y2ahx3nF|Vuawki#7NH?S|Q-Q!u2{b24`$O^z3qkU`2%>V!Z000000RR90{{R3000d-VbYTDq0Zm&2unN%Ogv+IWOlA -QDZ9;ju-OD&R*`2#>nd!~X9RL6T000000RR90{{R3000v=nbYWv?00{xXnY9F@W0 -kV-aZ{ajBd_ZDnD~<$3CBu40zYmn*4oVg0000000030|Ns900000ALvL<$a$#e1N -n`~900#g7Kp+4OLvL<$a$#e1Q*>c;Wd;HUb7N>_ZD9dqiS7Qcy@o`Ksx-hZyo%1X -yg?u*hB?+UW{Twjef1*;XlZkFZ*qA7o)Y9A-SEGe0Ene*@-X=v)%i9B>i(h2jS%( -?WM`7h2}EIZVN-NrbY%qr00;m8KmY&$000000RR600000000=~4V^DH$Z)OAn0S0 -toaB^jI00jX8ZyuKUhrL_QB$OCu+VTUE>b16EcuX?V{EC+7E3Kt-54IneKN{_;j( -f`H9IfkFzO$PG=uAF%>iaxCSnRl2&38AmXJiCw9urENI6IdKMR;^& -ZgXjGZUzbiW@dH)+M7`mSQb`xkca!3baG* -1bV+0Zp9m~TI>-W|y2ahx3nF|Vuawki#7NH?S|Q-Q!u2{b4P|(AWo~n6Z*Ek1aAg -5xbsj>g6`?#s5rWnKhSeO?L~x^!;Y#eFP|P}0Z%EzBpbEf7FA*KKfDWJb8~5DZf#|5baMeJ@GsGgqasH -#GZO>h>bu9a%E&?Wo>0-0pHK5k@bh=O+>c=6_h5K%L=laq&yA1JoJ^{7>o -KLkF4~iax8KK|47hp+cWHEPWpi@^;nCe3IziXCXi3Z2@%=Qxx -is%Ku=2wF+7z(Wqt=tdZk`V^s(Ana00000009300000000 -0MaWn^V#ZF2w#0Y>fS!w4MxxaL=+DqP^k2!wz9AHH68xp8!<%Jqp^&Hw-a000000 -RI300000001IJrb7^O8ZDnqBa{vkfhyLPaScq)s9KMExvw34D6J>+NwrBxfixd_% -u|$Wt0XD%jq57bK6Q|uUfIMEX^1}Vv6tLB!)|10-o)0prc>n+a000000RI300000 -0010+sY-Mg^X=QT&2?0j!=EDda{kY~=q$*tC#t4Le{2#tvcDZqMsmk?aU=OZ$bvG|>z)+>9PT;Au-7) -~D;-++htxcywiMb7^mGRC#b^1pxp60s}^7b_D?d00Iq0b#7;AVr*qobYXO51OW&J -Vrg`9HZ%YQ0RR993`TWsXK7+=WmI`^Wdi{Xb#8NMXKrO=HZ($MbO;AWWo~72X>$e -*17>D+0ot2U6Id2jc94hrndMfLayEe1ISdA&%p{mB1!VWk)d+KAXk~3-Nn`<(Qq$ -W5tE;F{pQrXd&=l*`O?@#x{Qdy?T_k!`1dtE~W^7?+a{}Sf-5feW*SKg&%h~b$G{ -NN>LxBDo)YaDXjV8yEYGsr6V0dsu5sjwLjgQcrOsaG1F{QvR+LMR3-^ZN{xOxe6X ->Db5bYX39002k^X>)URWpV+w=zxYCD0L!x4tB5Hm3vFbl?lapNXe%XU~*fKJ0+Y4 -bY*jNZe?@=$}AplgPGkh3_fq3Q7_j=2#kPT_9!;lWR>~GYywm#VTK~nd#>BpbEf7FA*KKfDWJb8~5DZf#|5baMeJ -@GsGgqasH#GZO>h>buAc42H~ZewX>a{=9jW&m$tWDyk -Zj`7#3_zANbB(SO{shhGe=&H{tM@n+a0000 -00RI300000001IJrb7^O8ZDnqBa{vkfhyLPaScq)s9KMExvw34D6J>+NwrBxfixd -_%u|$Wt0XD%jq57bK6Q|uUfIMEX^1}Vv6tLB!)|10-o)0prc>n+a000000RI3000 -000010+sY-Mg^X=QT&2?0j!=EDda{kY~=q$*tC#t4Le{2#tvcDZqMsmk?aU=OZ$bvG|>z)+>9PT;Au- -7)~D;-++hhvY;R&=Y)^7z1_BLtX>@L7b8|s%V`y)300aU61a5C`WdHyG0R(ezZDj -xj0RdPNl?@<^v`w+>_3ApsnVQb!iMVLduF6PuEs5-&8axAOWOx7o0t-iMZ(?C=Q* ->c;Wd#8M3IWybk`76TvuW{aQ_%-X`?VwZ$5L?~`!+pRSq0(b70Uq%!}cPEJ+)wh? -w~HsM>Kh32^DD>YKF13Ts`WEp!#kA0000000030000000000HM{I9mVQf=$VRU6v -V`ybC`}q*rYXqYdo~D%m7H6OD0<^0n_2##VWXRdjy=DB@qgYOj2y -J0_Npxjxa{vGW4@YcoVqt7kbYXO5RC#b^1pxp60t`oNZ(?C=R$**)Wpf1q00;pxo ->ox?`Aroor<$W|05z3@o%ygg4E?M+l67UG^w8*<_ -XZ#%uyqCrG{{7b@t4MVjY>G@u4Q3HlB(d+LiLJm-R=h;`?dxBvhE000000RImF00 -00000l{IaCLMB0taw%Wp+<>bODnPynwMZT8l5kSW@l}O=!>^xB4~9n`Dx!RtcK)n -wJQ2Wpib6c4cG&;nCe3IziXCXi3Z2@%=QxRw7=FYk8VVufK10Q-T=FR=Q=>S+XYD&lVN`i=Wd#8M00Ie3WprUyVQh6}1pxpE -002M$0000000030{{R3000008O=WapWMOn+1pxpG0d?d}_}|Wp0vpvv$c&#PW69R -$ltr%da5t5w^x+8!q5%{oJdRMsrjHBJ^EIe4enz&iEACnc`NWk%>en!wdoTb1000 -000093000000000Y5V`Fu4a%FB~Wpf4s18r$;00065ZDDu-00In8a6@lxZE19EWo -~o^3Ik?lb^+R(Q4?4eR(6nw`9N|x?>fArE*KsLwol4Pgj!HjQmQ`GTOgji|WprU=VRT^v;nCe3IziXCXi3Z2 -@%=QxsZfv!yd427@;7veO2zMB=|GX`mHaCLNZ0^!l!96CYQxM)es+421}!Q~o5fc -_fP)zsZfv!yd427@;7veO2zMB=|GYesJb7^O8Z -DnqBa{}Sf-5feW*SKg&%h~b$G{NN>LxBDo)YaDXjV8yEYGpW{Lxv|61vo|Wpe -`I(cK(6LD#rwNz2*s{WQVl8bg5o8r0R+^o=IRl4@mbudT)PryvH%qoUf%jN6#Tx8 -1sfg4O?s`uaep_R|IjcWHEPWpi@^;nCe3IziXCXi3Z2@%=QxClv)aMjKgwAH@`bu1x<7g|G$};xvA~n-$_S33g#@X=Gt^Z*l_R(cK(6 -LD#rwNz2*s{WQVl8bg5o8r0R+^o=IRl4@mbudT)PryvH%qoUf%jN6#Tx81sfg4O? -s`uaep_R|IgPjE?O1pxpD002NB00mEQZ*_DA0|IYw0hP$+dLDIRU(}XWLTZugenO -C;Z(5k~zEJnJiX;;E#R7DB0f+wLWmt%8=p4R=gtK{LClh6Z#kObxUW*hKHnBv9xd -Lu)0006WPjz%~b#y^5%bR49t5yk`^qQ9hb7f&{0nuj{y+ac4_6daU{%%bk3j+fu -`A*2Y1(Gbp$uTFEss(d&VRU5yXj3#G4BS)3O?Kk8E~;iP+B(^hzXq!*4!qFzdIL( -#2X|?7Ze??G0R?m5$xzO!^w7hb16`x)q0rkjWP;FH9)y-8%N3?sW*kp-bZ~WaL34 -9yXKrm}Zgf&*c4c8~Wn@HQbYTVr1#fU~b#wuf5WIk~G+K)5%b -R49t5yk`^qQ9hb7f&{0nuj{y+ac4_6daU{%%bk3j+fu`A*2Y1(Gbp$uTFEss(d&V -RU5y|7c^tcv66A`G>fIgq>HOrf1lB-q;n)I5N1aoC!Yyr -_{7rjFg@b(FW?*48~9t#5lC;3juy9JUg#K|!ymZ}AFbYXO50c}La^e<`!Iztr?rs -l#d#OQkEER^^L)C{HEhxT=ipa*wpbZ%vHa{&c&;K@+Vs`Svqn*&{=>Y>ovG-QI%S -ssLzB+C`1S!Nkeb#!obbU|}-X=iS2Wo~pV0h18CfUz`M -i!Z}iQtl5;XwV(E`Zdd&WRj~^37YhpmjrWVVQc}>XBWLg67cp3gzo-sO&$va11I@ -T$h!rSEX2t%Czh%Ob97;JWdSa-rT!PdFhnqz;9Q#@L7b8`U&bKuEP&Z_j#!IJVg&1PPwC}G0t$0Lb#i5700jX8Me3tp+xFv-0Xp&G?S=|} -9rRaeU`~uMrbA>C`}q*rYXqYdo~D%m7H6OD0<^0n_2##VWXRdjy=DB@qgYOj0}5e -ubYWv?ZDnqB00jX7LNH;4h{)8d6ed8&{mBRDiWpZ -<6ZbNTvZE19EWo~o@0RRU806-xC2vTKaWo2z;WCZ~L3IRs#=EDda{kY~=q$*tC#t -4Le{2#tvcDZqMsmk?FcgmDd%EKc;pw+KsVi?D}q -DSkO*B!5Mb*xG|_(S5o&32kL$X<<}(aAg5PFkyv=$keM8CP2si$rmim(Ekws4U>Q -XM0|*v-OPCeb75?B000OKQe}2!VQgh&L}7Gc1_A|kVQh6}0WzLeQ3m-<6)UHjqig -^*m4co5us7ukl*0UQzs7w8g#>e9Y;*ts5D-#jc4c8~Wn@NmZf9v?Y-I)m1$JRKwa1v8ba_B>T#2Nxy?Vr*${WNB_^0fo5uE4%chr -VX>dKSj6?lx}!~!>v+nlk{(+0jO?A+5>c9X93BNnyJGEOB((CXB(HiD*XOTXpbLr -$Svz}Z|7;7BCiHhV`yb_h5K%L=l -aq&yA1JoJ^{7>oKLkF4~iax8KK|47hp(ZeeX@0!8YhU)%QMkO4aJ;_ZeCe;xE!X< -$x_Fs4If6Z`oP*;5t>gcQkwbf~^M){{|8P%hsRk~m~ep32F151Y4WWC?U>ZDn(GV -Qp{#07waBWp-t3Z*XOD0k-IXh8!q$B6|*YuiTY;OURW8#d%1{rxIXtTaY^?oC$4Z -bYWC^aAk7<3ITQGP59r=ivkZ4!V_T!K -NI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HJ_1fvw5rj-B|XP@r^w5ufb=C_Ju$l1`nW&G -EpSWb-q0000000030000000000BXKZg`VQf@+aAk7<3IWybk`76TvuW{aQ_%-X`? -VwZ$5L?~`!+pRSq0(b70UtNPhHsg*CGu`j1)10Rzd$z^j_AbD^H9X)_TFhf`x$P>NY&HCT(P)^FVARS*Zg3m2dUS*m( -weL9PhQe$_)hyWq5RDZgXjGZgT(%0c3R^La7y@JVOzJ)&GXo9MeQ_qmbcB?4VH0I -#X{*-T?z>0?er0_e!9%6%WL6o5Q7yVM7GXa@w44CHDB`4cq_#000000093000000 -000Yga$#@6CZgT(%0W?w%t`n9TUcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXaRP -$8)%E7`<-;ovk@YSJ+V~kNcmIwC6DJ=V=(On#Ml4;000000093000000000PbWpi -b6c4cG&;nCe3IziXCXi3Z2@%=Qx;v -2Uql0Ev@(iYu*+LHGLwE58<2vcKdWo=@6CZUzbiW -@dH)+M7`mSQb`xkca!3baG*1bV+0Zp9m~T -I>-W|y2ahx3nF|Vuawki#7NH?S|Q-Q!u2{b4s>#1ZgXjLX>V>+d2nR`G*S<)6P6l -Yy(#<=BR_>s@(?%#f7ArN-=Rj?7Ns(12yJC_VPs)+VFC4eO*mP8`7qV21dnrCyk{ -{a-lF$FG0V5TNAc?Tc{K-TY;R&=Y;ytLBav&Stb*7Pg~wnyz`1FAu$k|YFC-ha-W -FA1@jtuM?JbaMfzqIy@8$eYR~OKp92)%PJ48iGR>vvBgJ_74J{JehzCVRLh7X -Krm}Zgg`2paMVhWqNlC78^@LRWpe@D -g=PS6VPp{$?vC--s`v@B8YHl)C#jpVFzBk!DMw8Sc42I3WMOn~asuJe-5feW*SKg -&%h~b$G{NN>LxBDo)YaDXjV8yEYGsr6V0dsu5sjwLjgQcrOsaG1F{QvR+LMR3-^Z -N{xOxY7X>@L7b8`aW(cK(6LD#rwNz2*s{WQVl8bg5o8r0R+^o=IRl4@nkxGg*8X! -CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%ORB~Z%b7^#GZ*D?$Ze(m_1_KLYY;SXAO -=WawZ)5^*9+vrsy<5&Clo)5)@&l6UwYFh+Ofu5^ik9drt)+7=w-6<{ZeNoKcy!1~?PoRaGZX>M?JbWLG!0Tr2NWXrXyKnGOwA#t$mH2bG7pQ)a -E=^FQF!@KkQh!AUTZ+C7~a$#@6CZgT(%0hP$+dLDIRU(}XWLTZugenOC;Z(5 -k~zEJnJiX;;E#R1~ZF2iBMU_%6N@&$6!Z@6CZc}4uWo=;w1_*6sbYWy+bYTDq0d?d}_}|Wp0vpvv$ -c&#PW69R$ltr%da5t5w^x+8!q5uE@000000RI300000000(DmZ(?C=a{vkf)$WoG -Nrn+a000000RI300000000wDpaCLNZ015$z{^Dg=h-~N_zJ`Red1E -INWrM}GXaQb}6c#qIM2EQnHo-KZ`k;Xmr`<4sJYKN!!u{G5u+^j1lf!PF4>GEG00 -00000000{{R30000003t@9}X=iS2Wo~qH015$z{^Dg=h-~N_zJ`Red1EINWrM}GX -aQb}6c#qIM2EQnHo-KZ`k;Xmr`<4sJYKN!!u{G5u+^j1lf!PF4>GEG0000000000 -{{R300000033g#@Wo~0>Wpe-t0Y>fS!w4MxxaL=+DqP^k2!wz9AHH68xp8!<%Jqp -^&Hw-a000000RI3000000010+sY-wa+bZ>G11OfmAZf|a7000011aog~WdH>M0%C -AAe<9`Lptgpr6F_xjAC6(~TLj#*ewiHf`^rCgHqw;r~cW`-Qb7^w`1pxswWLZ%C-hmt=@zb^3LQeidHs)aUa5+5cE%_FDK>Qy83UqQ|ZgXjL -X>V=-1p)z|2rNlD$O59e#ogQsB77jPl+h5j^*S;EG*S<)6P6lYy(#< -=BR_>s@(?%#f7ArN-=Rj?7Ns(10tsb!bY*UHX>V=-1p)z|2rNlD$O59e#ogQsB77 -jPl+h5j^*S;EWOW`wsTH9-LlJ`2|Ay5Z(?oEikl{+~pis;@Q*TJ#8d -Q03Wn@8fb7^O8b3$xsZe&wsVQf@*P;_zx1ON+UWn*k%a$$67c4Yts0RRXAIVbbqN -^4g)WDG0#SSGl-+Q@e<+6H_!d>A}?>eLb#i5700jX62myf}=a&wUzgq*nHzp%O_gxL;Ro0E2(0000000000|Nj60000008B}?2Wn@8fb7^O8b3$xsZ -e&wsVQf@*X=DTh01ISgV{Bn^VRUJBWdH>M00;q-z?57PmRE;x*JyQZ??N1%-?X%h -&UrM00;s9(nscpRQse -H2M_=0H1c!=>Px#000000RR6000 -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 +XhLjhZe&wsVQf@*P;_zx1ONKtpQ8M_qJyiO1VI +UJ=H=)@ii_1#@&^bY%hjG)3KC&kYOztQDksx&yAAHY;R+00^!l!96CYQxM)es ++421}!Q~o5fc_fP)zLxBDo)YaDXjV8yEYGuo~ +Ej#9D^K)f#Cf|Xn@L3mU0Z2&n-dr?jcD1Ll0RaLKV{dL|X=G(?bZKF1Q)OXn00sjDb7f&{0o#gN8iEuM +btv-qj6g$b#7A9pc!|f`I$jaRzSe2A1O;<+VRU5yXj3#G4BS)3O?Kk8E~;iP+B(^hzXq!*4!qFzdIL(# +1Z;0(YXafX-5feW*SKg&%h~b$G{NN>LxBDo)YaDXjV8yEYGuo~Ej#9D^K)f#Cf|Xn@L3mU0Z2&n-dr?j +cD1Ll0RaODa%Fa9VQgh&00sjDb7f&{0gt=F=tr7PLxBDo)YaDX +jV8yEYGuo~Ej#9D^K)f#Cf|Xn@L3mU0Z2&n-dr?jcD1Ll0RbUFb8~5DZc=4-WnpY(WI=RvVPj}QY-w&} +Q)OXnRCsA*1OxyKV{dL|X=G(?bZKF100sjDb7f&{0o#gN8iEuMbtv-qj6g$b#7A9pc!|f`I$jaRzSe2A +1O;<+VRU5y{4_<~U(XE-|Ev|Hdb$N7;9H9;8!%;3hl7uME$faw1Z;0(YXafX-5feW*SKg&%h~b$G{NN> +LxBDo)YaDXjV8yEYGuo~Ej#9D^K)f#Cf|Xn@L3mU0Z2&n-dr?jcD1Ll0RaIKV{dL|X=G(?bZKF1Q*>c; +WdH^P1aoC!YypA{4XEgn0epQk*PX+nL>xOm%pK>soMo}bYXO50sJ&Y-CxfQ3;(PYq_>4e9 +YQ#rfba;u!+d5tm#=h2RwFCuobYXO50ccY+APn47#!YtOwl1n>FWNfUk-rA3DGt2Q_Id+K%mi$2V`~E8 +(cK(6LD#rwNz2*s{WQVl8bg5o8r0R+^o=IRl4@nkxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%B +2y$h1WnpY(WB>*O1aoC!YypA{4XEgn0epQk*PX+nL>xOm%pK>soMo}bYXO50ccY+APn47 +#!YtOwl1n>FWNfUk-rA3DGt2Q_Id+K%mi$2V`~E8(cK(6LD#rwNz2*s{WQVl8bg5o8r0R+^o=IRl4@nk +xGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%eL349yXKqquc4c8~Wn@HQbYVhlX>MdwWnpYocu;h5 +1OxyKV{dL|X=G(?bZKF100sjDb7f&{0o#gN8iEuMbtv-qj6g$b#7A9pc!|f`I$jaRzSe2A1O;<+VRU5y +a1CV;vVwtcAGbZ_5@VACR|ut2VXXq-)V^B9&!_4M1Z;0(YXafX-5feW*SKg&%h~b$G{NN>LxBDo)YaDX +jV8yEYGuo~Ej#9D^K)f#Cf|Xn@L3mU0Z2&n-dr?jcD1Ll0RaIKV{dL|X=G(?bZKF1Q*>c;WdH^P1aoC! +YypqE!sthuPUKDEU2%WC`V+X+(UG)mk--2W1{>juaWw^VbYXO50dNgv5VC@SZy&ck_>4e9YQ#rfba;u! ++d5tm#=h2RwFCuobYXO50sm-Yz<5%CY59k^g5#W{6D&GDo53%OaP0&iRq*O1aoC!YypqE!sthuPUKDEU2%WC`V+X+(UG)mk--2W1{>juaWw^VbYXO50sm-Yz<5%CY59k^g5#W{ +6D&GDo53%OaP0&iRqMdwWnpYocxhw=1ONKtpQ8M_qJyiO1VIUJ=H=)@ii_1#@&^bY%f>4P_9rf`M-z +w>{+&W0M0{2&GbCtpecGzFNi4r|Jm=Y;R+00^!l!96CYQxM)es+421}!Q~o5fc_fP)zLxBDo)YaDXjV8yEYGuo~Ej#9D^K)f#Cf|Xn@L3mU0Z2&n-dr?j +cD1Ll0RaLKV{dL|X=G(?bZKF1Q)OXn00sjDb7f&{0o#gN8iEuMbtv-qj6g$b#7A9pc!|f`I$jaRzSe2A +1O;<+VRU5y|7c^tcv66A`G>fI +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 +Fhnqz;9Q#WZob97;J +WdSa-rT!PdFhnqz;9Q#@L7b8`d&00v=Vb7gLH000012XJy_b7gLH00jX7iECIT&Bl;lSX#$ms8AQN7m&qY~ob0000000000{{R30000007(sJ$X=iS2 +Wo~qHLTqVnWK(5fY*ct@WCZ~L3IT`y;$>KfZ0H=mhJ>?uVE25ED1b!Bn_;nCe3IziXCXi3Z2@%=Qx4E?M+l67UG^w8*<_XZ#%uyqCt-#n(R;4& +W&+>mb;*F>vukd;=m`ygb@x#_>`RmOO$uRbbWCA+WpZ;d0^!l!96CYQxM)es+421}!Q~o5fc_fP)zG6 +0RRU806-uB4?}NmV`X7%Wn@8gbYWv?1pxpD002NB01ZQLZewL(Y-MCbVRT^y0RRU806-uB5kqfoV`X7% +Wn@NmZf9v?Y-I)l3S)0=ZE19EWo~oHb1_uapV`ybbaG*1bV+0Zp9m~TI>-W|y2ahx3nF|Vuawki +#7NH?S|Q-Q!u2{b24`$O^z3qkU`2 +%>V!Z000000RR90{{R3000d-VbYTDq0Zm&2unN%Ogv+IWOlAQDZ9;ju-OD&R*`2#>nd!~X9RL6T00000 +0RR90{{R3000v=nbYWv?00{xXnY9F@W0kV-aZ{ajBd_ZDnD~<$3CBu40zYmn*4oVg0000000030|Ns90 +0000ALvL<$a$#e1Nn`~900#g7Kp+4OLvL<$a$#e1Q*>c;Wd;HUb7N>_ZD9dqiS7Qcy@o`Ksx-hZyo%1X +yg?u*hB?+UW{Twjef1*;XlZkFZ*qA7o)Y9A-SEGe0Ene*@-X=v)%i9B>i(h2jS%(?WM`7h2}EIZVN-Nr +bY%qr00;m8KmY&$000000RR600000000=~4V^DH$Z)OAn0S0toaB^jI00jX8ZyuKUhrL_QB$OCu+VTUE +>b16EcuX?V{EC+7E3Kt-54IneKN{_;j(f`H9IfkFzO$PG=uAF%>iaxCSnRl2&38AmXJiCw9urENI6IdKMR;^& +ZgXjGZUzbiW@dH)+M7`mSQb`xkca!3baG*1bV+0Zp9m~TI>-W| +y2ahx3nF|Vuawki#7NH?S|Q-Q!u2{b4P|(AWo~n6Z*Ek1aAg5xbsj>g6`?#s5rWnKhSeO?L~x^!;Y#eF +P|P}0Z%EzBpbEf7FA*KKfDWJb8~5DZf#|5baMeJ@GsGgqasH +#GZO>h>bu9a%E&?Wo>0-0pHK5k@bh=O+>c=6_h5K%L=laq&yA1JoJ^{7>oKLkF4~iax8KK|47hp+cWHEPWpi@^;nCe3IziXCXi3Z2@%=Qx +xis%Ku=2wF+7z(W +qt=tdZk`V^s(Ana000000093000000000MaWn^V#ZF2w#0Y>fS!w4MxxaL=+DqP^k2!wz9AHH68xp8!< +%Jqp^&Hw-a000000RI300000001IJrb7^O8ZDnqBa{vkfhyLPaScq)s9KMExvw34D6J>+NwrBxfixd_% +u|$Wt0XD%jq57bK6Q|uUfIMEX^1}Vv6tLB!)|10-o)0prc>n+a000000RI3000000010+sY-Mg^X=QT& +2?0j!=EDda{kY~=q$*tC#t4Le{2#tvcDZqMsmk?aU=OZ$bv +G|>z)+>9PT;Au-7)~D;-++htxcywiMb7^mGRC#b^1pxp60s}^7b_D?d00Iq0b#7;AVr*qobYXO51OW&J +Vrg`9HZ%YQ0RR993`TWsXK7+=WmI`^Wdi{Xb#8NMXKrO=HZ($MbO;AWWo~72X>$e*17>D+0ot2U6Id2j +c94hrndMfLayEe1ISdA&%p{mB1!VWk)d+KAXk~3-Nn`<(Qq$W5tE;F{pQrXd&=l*`O?@#x{Qdy?T_k!` +1dtE~W^7?+a{}Sf-5feW*SKg&%h~b$G{NN>LxBDo)YaDXjV8yEYGsr6V0dsu5sjwLjgQcrOsaG1F{QvR ++LMR3-^ZN{xOxe6X>Db5bYX39002k^X>)URWpV+w=zxYCD0L!x4tB5Hm3vFbl?lapNXe%XU~*fKJ0+Y4 +bY*jNZe?@=$}AplgPGkh3_fq3Q7_j=2#kPT_9!;lWR>~GYywm#VTK~nd#>BpbEf7FA*KKfDWJb8~5DZf#|5baMeJ +@GsGgqasH#GZO>h>buAc42H~ZewX>a{=9jW&m$tWDykZj`7#3_zANbB(SO{ +shhGe=&H{tM@n+a000000RI300000001IJr +b7^O8ZDnqBa{vkfhyLPaScq)s9KMExvw34D6J>+NwrBxfixd_%u|$Wt0XD%jq57bK6Q|uUfIMEX^1}Vv +6tLB!)|10-o)0prc>n+a000000RI3000000010+sY-Mg^X=QT&2?0j!=EDda{kY~=q$*tC#t4Le{2#tv +cDZqMsmk?aU=OZ$bvG|>z)+>9PT;Au-7)~D;-++hhvY;R&= +Y)^7z1_BLtX>@L7b8|s%V`y)300aU61a5C`WdHyG0R(ezZDjxj0RdPNl?@<^v`w+>_3ApsnVQb!iMVLd +uF6PuEs5-&8axAOWOx7o0t-iMZ(?C=Q*>c;Wd#8M3IWybk`76TvuW{aQ_%-X`?VwZ$5L?~`!+pRSq0(b +70Uq%!}cPEJ+)wh?w~HsM>Kh32^DD>YKF13Ts`WEp!#kA0000000030000000000HM{I9mVQf=$VRU6v +V`ybC`}q*rYXqYdo~D%m +7H6OD0<^0n_2##VWXRdjy=DB@qgYOj2yJ0_Npxjxa{vGW4@YcoVqt7kbYXO5RC#b^1pxp60t`oNZ(?C= +R$**)Wpf1q00;pxo>ox?`Aroor<$W|05z3@o%ygg4E?M+l67UG^w8*<_XZ#%uyqCrG{{7b@t4MVjY>G@u4Q3HlB( +d+LiLJm-R=h;`?dxBvhE000000RImF0000000l{IaCLMB0taw%Wp+<>bODnPynwMZT8l5kSW@l}O=!>^ +xB4~9n`Dx!RtcK)nwJQ2Wpib6c4cG&;nCe3IziXCXi3Z2@%=QxRw +7=FYk8VVufK10Q-T=FR=Q=>S+XYD&lVN`i=Wd#8M00Ie3WprUyVQh6}1pxpE +002M$0000000030{{R3000008O=WapWMOn+1pxpG0d?d}_}|Wp0vpvv$c&#PW69R$ltr%da5t5w^x+8! +q5%{oJdRMsrjHBJ^EIe4enz&iEACnc`NWk%>en!wdoTb1000000093000000000Y5V`Fu4a%FB~Wpf4s +18r$;00065ZDDu-00In8a6@lxZE19EWo~o^3Ik?lb^+R(Q4?4eR(6nw`9N|x?>fArE*KsLwol4Pgj!HjQmQ`GTOgji|WprU=VRT^v;nCe3IziXCXi3Z2 +@%=QxsZfv!yd427@;7veO2zMB=|GX`mH +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 +Z@6CZc}4uWo=;w1_*6sbYWy+bYTDq +0d?d}_}|Wp0vpvv$c&#PW69R$ltr%da5t5w^x+8!q5uE@000000RI300000000(DmZ(?C=a{vkf)$WoG +Nrn+a +000000RI300000000wDpaCLNZ015$z{^Dg=h-~N_zJ`Red1EINWrM}GXaQb}6c#qIM2EQnHo-KZ`k;Xm +r`<4sJYKN!!u{G5u+^j1lf!PF4>GEG0000000000{{R30000003t@9}X=iS2Wo~qH015$z{^Dg=h-~N_ +zJ`Red1EINWrM}GXaQb}6c#qIM2EQnHo-KZ`k;Xmr`<4sJYKN!!u{G5u+^j1lf!PF4>GEG0000000000 +{{R300000033g#@Wo~0>Wpe-t0Y>fS!w4MxxaL=+DqP^k2!wz9AHH68xp8!<%Jqp^&Hw-a000000RI30 +00000010+sY-wa+bZ>G11OfmAZf|a7000011aog~WdH>M0%CAAe<9`Lptgpr6F_xjAC6(~TLj +#*ewiHf`^rCgHqw;r~cW`-Qb7^w`1pxswWLZ%C-hmt=@zb^3LQeidHs)aUa5+5cE%_FDK>Qy83UqQ|ZgXjL +X>V=-1p)z|2rNlD$O59e#ogQsB77jPl+h5j^*S;EG*S<)6P6lYy(#<=BR_>s@(?%#f7ArN +-=Rj?7Ns(10tsb!bY*UHX>V=-1p)z|2rNlD$O59e#ogQsB77jPl+h5j^*S;EWOW`wsTH9- +LlJ`2|Ay5Z(?oEikl{+~pis;@Q*TJ#8dQ03Wn@8fb7^O8b3$xsZe&wsVQf@*P;_zx1ON+UWn*k%a$$67 +c4Yts0RRXAIVbbqN^4g)WDG0#SSGl-+Q@e<+6H_!d>A}?>eL +b#i5700jX62myf}=a&wUzgq*nHzp%O_gxL;Ro0E2(0000000000|Nj60000008B}?2 +Wn@8fb7^O8b3$xsZe&wsVQf@*X=DTh01ISgV{Bn^VRUJBWdH>M00;q-z?57PmRE;x*JyQZ??N1%-?X%h +&UrM00;s9(nscpRQseH2M_=0H1c!=>Px#000000RR60000000RIYMbaY{3Xl-R~bN~eb00;reGP>7z&ZQf?Gib;@a|Hna2?0j!=EDda{kY~=q$*tC#t4Le +{2#tvcDZqMsmk?c;Wd#8M000eF +X>@L7b8|s%V`y)31_BCqX>@L7b8}B}WC6k+?A!p;zT)eT0-JI=`>_zfHkawo185nP6{Z9SY03$AX>@L7 +b8|^#0f}o^CC$c=UszhlV5m?Ru@{iVU*wrVdeH+Q@FPbX@d{UIbZ%vHb5C+)1OfmDZ*D_qVQFpv1pxsL +zqsuE6j(!OVQFqcY-w&}Q)OXnRCrKyas&bZ2V!Y-V{d7000jX8ZyuKUhrL_QB$OCu ++VTUE>b16EcuX?V{EC+7E3Kt-MklB)P_)|`Y=H7dO_e!^G2i>0SdC0NppV!6v|_i_0S0Voadl~A00jX8 +ZyuKUhrL_QB$OCu+VTUE>b16EcuX?V{EC+7E3Kt-MklB)P_)|`Y=H7dO_e!^G2i>0SdC0NppV!6v|_i_ +6IerNVQFqcY-w&}Q)OXnRCsA*1OfmDVrg_^Z)t7-1pxwY9+vrsy<5&Clo)5)@&l6UwYFh+Ofu5^ik9dr +t)+9Y#&NEOd)wn+n#11fGQ~$X901P7x>0daZB@{PThHqO25f0@b!lV(1pxwY9+vrsy<5&Clo)5)@&l6U +wYFh+Ofu5^ik9drt)+9Y#&NEOd)wn+n#11fGQ~$X901P7x>0daZB@{PThHqjSVL%GX>LV$aBOK~X>?O% +VQf@*X=DTf00&}ebYpL6ZU6-V0&gCc`G>t*&Lor=XWH@ulIpd#VR%e3()@~+=qs(Ia|6{hkn2QsifIWL +vZbUw81NwsGjgonnp^pYSe+vyeE|k+X>oOFWB>&L0&gCc`G>t*&Lor=XWH@ulIpd#VR%e3()@~+=qs(I +a|6{hkn2QsifIWLvZbUw81NwsGjgonnp^pYSe+vyeGphfXklq?Q)OdvWpqt*&Lor=XWH@ulIpd#VR%e3()@~+=qs(Ib7&dsyw$T9tCzEwrAszt-P)%HZ|LbH=L2A=l(W4C +P5}mNX>oOFWB>&L0&gCc`G>t*&Lor=XWH@ulIpd#VR%e3()@~+=qs(Ib7&dsyw$T9tCzEwrAszt-P)%H +Z|LbH=L2A=l(W4CP6}8jc*fjc*f Date: Mon, 29 Apr 2024 10:17:58 +0800 Subject: [PATCH 20/33] chore: fix prelude::stl with feature gate --- src/lib.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index 7b2c4c67..fde82255 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -58,7 +58,9 @@ pub mod prelude { pub use schema::*; use super::*; - pub use super::{schema, stl, validation, vm}; + pub use super::{schema, validation, vm}; + #[cfg(feature = "stl")] + pub use super::stl; } pub use prelude::*; From b94bc06352e9cbab095296e4d64c5fd49ee35c24 Mon Sep 17 00:00:00 2001 From: Antonio Yang Date: Mon, 8 Apr 2024 11:37:43 +0800 Subject: [PATCH 21/33] ci: remove actions-rs use nix to check --- .github/workflows/build.yml | 23 +++++----- flake.lock | 85 +++++++++++++++++++++++++++++++++++++ flake.nix | 54 +++++++++++++++++++++++ 3 files changed, 150 insertions(+), 12 deletions(-) create mode 100644 flake.lock create mode 100644 flake.nix diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 961a0def..562096b3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -72,16 +72,15 @@ jobs: strategy: fail-fast: false matrix: - toolchain: [ nightly, beta, stable, 1.75.0 ] + toolchain: [ nightly, beta, stable, msrv ] steps: - - uses: actions/checkout@v2 - - name: Install rust ${{ matrix.toolchain }} - uses: actions-rs/toolchain@v1 - with: - toolchain: ${{ matrix.toolchain }} - override: true - - name: All features - uses: actions-rs/cargo@v1 - with: - command: check - args: --workspace --all-targets --all-features + - name: checkout + uses: actions/checkout@v4 + - name: Install Nix + uses: DeterminateSystems/nix-installer-action@v5 + - name: Nix Cache + uses: DeterminateSystems/magic-nix-cache-action@v2 + - name: Rust Cache + uses: Swatinem/rust-cache@v2 + - name: Check rgb-core + run: nix develop ".#${{ matrix.toolchain }}" -c cargo check --workspace --all-targets --all-features diff --git a/flake.lock b/flake.lock new file mode 100644 index 00000000..6894ac04 --- /dev/null +++ b/flake.lock @@ -0,0 +1,85 @@ +{ + "nodes": { + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1710146030, + "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1712439257, + "narHash": "sha256-aSpiNepFOMk9932HOax0XwNxbA38GOUVOiXfUVPOrck=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "ff0dbd94265ac470dda06a657d5fe49de93b4599", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs", + "rust-overlay": "rust-overlay" + } + }, + "rust-overlay": { + "inputs": { + "flake-utils": [ + "flake-utils" + ], + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1712542394, + "narHash": "sha256-UZebDBECRSrJqw4K+LxZ6qFdYnScu6q1XCwqtsu1cas=", + "owner": "oxalica", + "repo": "rust-overlay", + "rev": "ece8bdb3c3b58def25f204b9a1261dee55d7c9c0", + "type": "github" + }, + "original": { + "owner": "oxalica", + "repo": "rust-overlay", + "type": "github" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 00000000..e4173527 --- /dev/null +++ b/flake.nix @@ -0,0 +1,54 @@ +{ + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + rust-overlay = { + url = "github:oxalica/rust-overlay"; + inputs.nixpkgs.follows = "nixpkgs"; + inputs.flake-utils.follows = "flake-utils"; + }; + + flake-utils.url = "github:numtide/flake-utils"; + }; + + outputs = { self, rust-overlay, nixpkgs, flake-utils }: + flake-utils.lib.eachDefaultSystem (system: + let + overlays = [ (import rust-overlay) ]; + pkgs = import nixpkgs { + inherit system overlays; + }; + + cargoToml = builtins.fromTOML (builtins.readFile ./Cargo.toml); + in + with pkgs; + { + devShells = rec { + default = msrv; + + msrv = mkShell { + buildInputs = [ + rust-bin.stable."${cargoToml.package."rust-version"}".default + ]; + }; + + stable = mkShell { + buildInputs = [ + rust-bin.stable.latest.default + ]; + }; + + beta = mkShell { + buildInputs = [ + rust-bin.beta.latest.default + ]; + }; + + nightly = mkShell { + buildInputs = [ + rust-bin.nightly.latest.default + ]; + }; + }; + } + ); +} From 991f2373095557f4af9906f3f625fc002089f278 Mon Sep 17 00:00:00 2001 From: Antonio Yang Date: Fri, 12 Apr 2024 15:02:11 +0800 Subject: [PATCH 22/33] ci: rename Build Check for ci flow --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 562096b3..d2fdd8af 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,4 +1,4 @@ -name: Build +name: Build Check on: push: @@ -62,7 +62,7 @@ jobs: with: toolchain: stable override: true - - name: Build with all features + - name: Build check with all features uses: actions-rs/cargo@v1 with: command: check From fd06222fd8429df2434ec20a9673b234465e4130 Mon Sep 17 00:00:00 2001 From: Antonio Yang Date: Mon, 22 Apr 2024 13:51:12 +0800 Subject: [PATCH 23/33] ci: remove cache provided by unknown parties --- .github/workflows/build.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d2fdd8af..1e1ddde5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -77,10 +77,6 @@ jobs: - name: checkout uses: actions/checkout@v4 - name: Install Nix - uses: DeterminateSystems/nix-installer-action@v5 - - name: Nix Cache - uses: DeterminateSystems/magic-nix-cache-action@v2 - - name: Rust Cache - uses: Swatinem/rust-cache@v2 + uses: cachix/install-nix-action@v26 - name: Check rgb-core run: nix develop ".#${{ matrix.toolchain }}" -c cargo check --workspace --all-targets --all-features From ac6201a2242c0f5b7b7303a40182442f33ba78a6 Mon Sep 17 00:00:00 2001 From: Antonio Yang Date: Mon, 22 Apr 2024 19:20:53 +0800 Subject: [PATCH 24/33] ci: fix typo check on RGB address --- _typos.toml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/_typos.toml b/_typos.toml index 291fa13f..0f78bf10 100644 --- a/_typos.toml +++ b/_typos.toml @@ -9,6 +9,7 @@ Atack = "Atack" [default] extend-ignore-re = [ # Don't correct RGB address - "[0-9A-Za-z]{7}-[0-9A-Za-z]{9}-[0-9A-Za-z]{9}-[0-9A-Za-z]{9}-[0-9A-Za-z]{9}-[0-9A-Za-z]{7}", - "[0-9A-Za-z]{50}" + "[0-9A-Za-z]{7}-[0-9A-Za-z]{9}-[0-9A-Za-z]{9}-[0-9A-Za-z]{9}-[0-9A-Za-z]{9}-[0-9A-Za-z]{6}", + "rgb:[0-9A-Za-z-]+", + "[0-9A-Za-z]{49}" ] From 6b2fdbcb4fd2f41bf1be9f0893e45d80b7dd1ca2 Mon Sep 17 00:00:00 2001 From: Antonio Yang Date: Mon, 22 Apr 2024 20:44:47 +0800 Subject: [PATCH 25/33] ci: update coverage v3 -> v4 --- .github/workflows/codecov.yml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/codecov.yml b/.github/workflows/codecov.yml index 20773195..ddc16646 100644 --- a/.github/workflows/codecov.yml +++ b/.github/workflows/codecov.yml @@ -43,9 +43,12 @@ jobs: run: if [[ ! -e ~/.cargo/bin/grcov ]]; then cargo install grcov; fi - name: Generate coverage run: grcov . --binary-path target/debug/deps/ -s . -t lcov --branch --ignore-not-existing --ignore '../**' --ignore '/*' -o coverage.lcov - - name: Upload coverage to Codecov - uses: codecov/codecov-action@v3 + - name: Upload coverage + uses: codecov/codecov-action@v4 with: files: ./coverage.lcov flags: rust - fail_ci_if_error: true + # TODO: set true when CODECOV_TOKEN is set + fail_ci_if_error: false + env: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} From 63719fc0927b7d0b0ef6e1bfc8e71c03fc3fdd7a Mon Sep 17 00:00:00 2001 From: Antonio Yang Date: Mon, 22 Apr 2024 22:21:47 +0800 Subject: [PATCH 26/33] ci: add dependency bot --- .github/dependabot.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..d062b443 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,10 @@ +version: 2 +updates: + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" + - package-ecosystem: "cargo" + directory: "/" + schedule: + interval: "weekly" From 8257db1f7202d32ee01499faf0a1c967f8f1eaec Mon Sep 17 00:00:00 2001 From: Antonio Yang Date: Tue, 23 Apr 2024 10:47:07 +0800 Subject: [PATCH 27/33] ci: upgrade checkout v2 -> v4 --- .github/workflows/build.yml | 6 +++--- .github/workflows/lint.yml | 8 ++++---- .github/workflows/test.yml | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1e1ddde5..9250284a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -13,7 +13,7 @@ jobs: default: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Install rust stable uses: actions-rs/toolchain@v1 with: @@ -33,7 +33,7 @@ jobs: - stl - serde steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Install rust stable uses: actions-rs/toolchain@v1 with: @@ -56,7 +56,7 @@ jobs: matrix: os: [ ubuntu-20.04, ubuntu-22.04, macos-12, macos-13, windows-2019, windows-2022 ] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Install rust stable uses: actions-rs/toolchain@v1 with: diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index a3c1ab87..30a20c3b 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -13,7 +13,7 @@ jobs: fmt: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Install rustc nightly uses: actions-rs/toolchain@v1 with: @@ -28,7 +28,7 @@ jobs: clippy: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Install rustc stable uses: actions-rs/toolchain@v1 with: @@ -43,7 +43,7 @@ jobs: doc: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Install rustc nightly uses: actions-rs/toolchain@v1 with: @@ -58,5 +58,5 @@ jobs: typos: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: crate-ci/typos@master diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index a409ae44..290821fb 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -13,7 +13,7 @@ jobs: testing: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Install latest stable uses: actions-rs/toolchain@v1 with: @@ -27,7 +27,7 @@ jobs: wasm-testing: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Install rust nightly uses: actions-rs/toolchain@v1 with: From 2e9182c5d06c0a98665f89f8bea48a731c5f98ab Mon Sep 17 00:00:00 2001 From: Antonio Yang Date: Tue, 23 Apr 2024 10:50:49 +0800 Subject: [PATCH 28/33] ci: update lint ci with nix --- .github/workflows/lint.yml | 45 ++++++++++---------------------------- 1 file changed, 12 insertions(+), 33 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 30a20c3b..3082fbe5 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -14,47 +14,26 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - name: Install rustc nightly - uses: actions-rs/toolchain@v1 - with: - toolchain: nightly - override: true - components: rustfmt - - uses: actions-rs/cargo@v1 - name: Formatting - with: - command: fmt - args: --all -- --check + - name: Install Nix + uses: cachix/install-nix-action@v26 + - name: Formatting + run: nix develop .#nightly -c cargo fmt --all -- --check clippy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - name: Install rustc stable - uses: actions-rs/toolchain@v1 - with: - toolchain: stable - override: true - components: clippy - - uses: actions-rs/cargo@v1 - name: Clippy - with: - command: clippy - args: --workspace --all-features --all-targets -- -D warnings + - name: Install Nix + uses: cachix/install-nix-action@v26 + - name: Clippy + run: nix develop .#stable -c cargo clippy --workspace --all-features --all-targets -- -D warnings doc: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - name: Install rustc nightly - uses: actions-rs/toolchain@v1 - with: - toolchain: stable - override: true - components: rust-docs - - uses: actions-rs/cargo@v1 - name: Doc - with: - command: doc - args: --workspace --all-features + - name: Install Nix + uses: cachix/install-nix-action@v26 + - name: Doc + run: nix develop .#stable -c cargo doc --workspace --all-features typos: runs-on: ubuntu-latest steps: From 13f71f0d441a86ca6fde59e0b1133a3ed8bdac0b Mon Sep 17 00:00:00 2001 From: Antonio Yang Date: Tue, 23 Apr 2024 11:11:17 +0800 Subject: [PATCH 29/33] ci: update test ci with nix --- .github/workflows/test.yml | 25 ++++++------------------- flake.nix | 13 +++++++++++++ 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 290821fb..f4a2886e 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -14,28 +14,15 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - name: Install latest stable - uses: actions-rs/toolchain@v1 - with: - toolchain: stable - override: true + - name: Install Nix + uses: cachix/install-nix-action@v26 - name: Build & test - uses: actions-rs/cargo@v1 - with: - command: test - args: --workspace --all-features --no-fail-fast + run: nix develop .#stable -c cargo test --workspace --all-features --no-fail-fast wasm-testing: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - name: Install rust nightly - uses: actions-rs/toolchain@v1 - with: - toolchain: stable - override: true - - uses: Swatinem/rust-cache@v2 - - uses: jetli/wasm-pack-action@v0.3.0 - - name: Add wasm32 target - run: rustup target add wasm32-unknown-unknown + - name: Install Nix + uses: cachix/install-nix-action@v26 - name: Test in headless Chrome - run: wasm-pack test --headless --chrome + run: nix develop .#wasm -c wasm-pack test --headless --chrome diff --git a/flake.nix b/flake.nix index e4173527..4b2159f1 100644 --- a/flake.nix +++ b/flake.nix @@ -19,6 +19,11 @@ }; cargoToml = builtins.fromTOML (builtins.readFile ./Cargo.toml); + + nightlyWithWasm = pkgs.rust-bin.nightly.latest.default.override { + extensions = [ ]; + targets = [ "wasm32-unknown-unknown" ]; + }; in with pkgs; { @@ -48,6 +53,14 @@ rust-bin.nightly.latest.default ]; }; + + wasm = mkShell { + buildInputs = [ + nightlyWithWasm + chromedriver + wasm-pack + ]; + }; }; } ); From 91f5e215ded035e4507d7cf75cae154ed02c61fd Mon Sep 17 00:00:00 2001 From: Antonio Yang Date: Tue, 23 Apr 2024 11:18:12 +0800 Subject: [PATCH 30/33] ci: update feature check with nix --- .github/workflows/build.yml | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9250284a..0410a0e9 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -14,12 +14,13 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 + # NOTE: Dont use nix here everything should be based on the ubuntu-latest - name: Install rust stable uses: actions-rs/toolchain@v1 with: toolchain: stable override: true - - name: Default build + - name: Latest Ubuntu build check uses: actions-rs/cargo@v1 with: command: check @@ -34,21 +35,12 @@ jobs: - serde steps: - uses: actions/checkout@v4 - - name: Install rust stable - uses: actions-rs/toolchain@v1 - with: - toolchain: stable - override: true - - name: Feature ${{ matrix.feature }} - uses: actions-rs/cargo@v1 - with: - command: check - args: --no-default-features --features=${{ matrix.feature }} - - name: Defaults + ${{ matrix.feature }} - uses: actions-rs/cargo@v1 - with: - command: check - args: --features=${{ matrix.feature }} + - name: Install Nix + uses: cachix/install-nix-action@v26 + - name: Check feature ${{ matrix.feature }} only + run: nix develop .#stable -c cargo check --no-default-features --features=${{ matrix.feature }} + - name: Check feature ${{ matrix.feature }} with defaults + run: nix develop .#stable -c cargo check --features=${{ matrix.feature }} platforms: runs-on: ${{ matrix.os }} strategy: @@ -57,6 +49,7 @@ jobs: os: [ ubuntu-20.04, ubuntu-22.04, macos-12, macos-13, windows-2019, windows-2022 ] steps: - uses: actions/checkout@v4 + # NOTE: Dont use nix in platform checks everything should based on the host system - name: Install rust stable uses: actions-rs/toolchain@v1 with: From 1b245254f97edb770e79c33a44290e42fe4c83e7 Mon Sep 17 00:00:00 2001 From: Antonio Yang Date: Tue, 23 Apr 2024 16:16:53 +0800 Subject: [PATCH 31/33] ci: update codecov with nix --- .github/workflows/codecov.yml | 31 ++++++------------------------- .gitignore | 1 + flake.nix | 14 ++++++++++++++ 3 files changed, 21 insertions(+), 25 deletions(-) diff --git a/.github/workflows/codecov.yml b/.github/workflows/codecov.yml index ddc16646..f9dd5382 100644 --- a/.github/workflows/codecov.yml +++ b/.github/workflows/codecov.yml @@ -14,35 +14,16 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - - name: Set up toolchain - uses: actions-rs/toolchain@v1 - with: - profile: minimal - toolchain: stable - override: true - components: rustfmt, llvm-tools-preview + - name: Install Nix + uses: cachix/install-nix-action@v26 - name: Build - uses: actions-rs/cargo@v1 - with: - command: build - args: --release - env: - CARGO_INCREMENTAL: "0" - RUSTFLAGS: "-Cinstrument-coverage" - RUSTDOCFLAGS: "-Cinstrument-coverage" + run: nix develop .#codecov -c cargo build --release - name: Test - uses: actions-rs/cargo@v1 - with: - command: test - args: --all-features --no-fail-fast - env: - CARGO_INCREMENTAL: "0" - RUSTFLAGS: "-Cinstrument-coverage" - RUSTDOCFLAGS: "-Cinstrument-coverage" + run: nix develop .#codecov -c cargo test --all-features --no-fail-fast - name: Install grcov - run: if [[ ! -e ~/.cargo/bin/grcov ]]; then cargo install grcov; fi + run: nix develop .#codecov -c cargo install grcov - name: Generate coverage - run: grcov . --binary-path target/debug/deps/ -s . -t lcov --branch --ignore-not-existing --ignore '../**' --ignore '/*' -o coverage.lcov + run: nix develop .#codecov -c grcov . --binary-path target/debug/deps/ -s . -t lcov --branch --ignore-not-existing --ignore '../**' --ignore '/*' -o coverage.lcov - name: Upload coverage uses: codecov/codecov-action@v4 with: diff --git a/.gitignore b/.gitignore index e8ab911e..abf32c92 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,4 @@ *.swp /dep_test +default*.profraw diff --git a/flake.nix b/flake.nix index 4b2159f1..9b5dd319 100644 --- a/flake.nix +++ b/flake.nix @@ -24,6 +24,11 @@ extensions = [ ]; targets = [ "wasm32-unknown-unknown" ]; }; + + stableWithLlvm = pkgs.rust-bin.nightly.latest.default.override { + extensions = [ "rustfmt" "llvm-tools-preview" ]; + targets = [ ]; + }; in with pkgs; { @@ -61,6 +66,15 @@ wasm-pack ]; }; + + codecov = mkShell { + buildInputs = [ + stableWithLlvm + ]; + CARGO_INCREMENTAL = "0"; + RUSTFLAGS = "-Cinstrument-coverage"; + RUSTDOCFLAGS = "-Cinstrument-coverage"; + }; }; } ); From fcef23536b177670b176005e920dad9fac919dae Mon Sep 17 00:00:00 2001 From: Antonio Yang Date: Mon, 29 Apr 2024 09:29:11 +0800 Subject: [PATCH 32/33] ci: enable ci on develop and release branches --- .github/workflows/build.yml | 10 ++++++++-- .github/workflows/codecov.yml | 10 ++++++++-- .github/workflows/lint.yml | 10 ++++++++-- .github/workflows/test.yml | 10 ++++++++-- 4 files changed, 32 insertions(+), 8 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0410a0e9..d44df0fc 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -2,9 +2,15 @@ name: Build Check on: push: - branches: [ master ] + branches: + - master + - develop + - 'v[0-9]+.[0-9]+' pull_request: - branches: [ master ] + branches: + - master + - develop + - 'v[0-9]+.[0-9]+' env: CARGO_TERM_COLOR: always diff --git a/.github/workflows/codecov.yml b/.github/workflows/codecov.yml index f9dd5382..8ec9a6b5 100644 --- a/.github/workflows/codecov.yml +++ b/.github/workflows/codecov.yml @@ -2,9 +2,15 @@ name: Codecov on: push: - branches: [ master ] + branches: + - master + - develop + - 'v[0-9]+.[0-9]+' pull_request: - branches: [ master ] + branches: + - master + - develop + - 'v[0-9]+.[0-9]+' env: CARGO_TERM_COLOR: always diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 3082fbe5..b9ea9fce 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -2,9 +2,15 @@ name: Lints on: push: - branches: [ master ] + branches: + - master + - develop + - 'v[0-9]+.[0-9]+' pull_request: - branches: [ master ] + branches: + - master + - develop + - 'v[0-9]+.[0-9]+' env: CARGO_TERM_COLOR: always diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f4a2886e..7e50c4e9 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -2,9 +2,15 @@ name: Tests on: push: - branches: [ master ] + branches: + - master + - develop + - 'v[0-9]+.[0-9]+' pull_request: - branches: [ master ] + branches: + - master + - develop + - 'v[0-9]+.[0-9]+' env: CARGO_TERM_COLOR: always From e5ed87acdcb0712d7dd9344dabc9d3cf11a961c5 Mon Sep 17 00:00:00 2001 From: Antonio Yang Date: Tue, 30 Apr 2024 15:15:59 +0800 Subject: [PATCH 33/33] chore: fix linter --- src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index fde82255..524b1080 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -57,10 +57,10 @@ pub mod prelude { pub use contract::*; pub use schema::*; - use super::*; - pub use super::{schema, validation, vm}; #[cfg(feature = "stl")] pub use super::stl; + use super::*; + pub use super::{schema, validation, vm}; } pub use prelude::*;