diff --git a/src/contract/operations.rs b/src/contract/operations.rs index 0d0eb58a..bcf65738 100644 --- a/src/contract/operations.rs +++ b/src/contract/operations.rs @@ -24,7 +24,7 @@ use std::cmp::Ordering; use std::collections::{btree_map, btree_set, BTreeMap}; use std::iter; -use amplify::confinement::{Confined, SmallBlob, TinyOrdMap, TinyOrdSet}; +use amplify::confinement::{Confined, SmallBlob, SmallOrdSet, TinyOrdMap, TinyOrdSet}; use amplify::Wrapper; use commit_verify::{ CommitEncode, CommitEngine, CommitId, Conceal, MerkleHash, MerkleLeaves, StrictHash, @@ -105,7 +105,7 @@ impl<'a> IntoIterator for &'a Redeemed { derive(Serialize, Deserialize), serde(crate = "serde_crate", transparent) )] -pub struct Inputs(TinyOrdSet); +pub struct Inputs(SmallOrdSet); impl<'a> IntoIterator for &'a Inputs { type Item = Input; diff --git a/src/stl.rs b/src/stl.rs index 236d029e..ae92c191 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -34,7 +34,7 @@ use crate::{ /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB: &str = - "urn:ubideco:stl:2nWgjeSMhVE2mKgC7WyE5Dn8a6tZJDMoNugDWdc4vcZZ#spring-moral-almanac"; + "urn:ubideco:stl:HqdNNAehK3yaQ1AC5pQmEuNNS1zgyo2Jw31fdUNKb9MU#annual-virus-garlic"; fn _rgb_core_stl() -> Result { LibBuilder::new(libname!(LIB_NAME_RGB), tiny_bset! { diff --git a/src/vm/macroasm.rs b/src/vm/macroasm.rs index ccc85a78..18c98d68 100644 --- a/src/vm/macroasm.rs +++ b/src/vm/macroasm.rs @@ -23,6 +23,8 @@ #[macro_export] macro_rules! rgbasm { ($( $tt:tt )+) => {{ #[allow(unused_imports)] { + use amplify::num::{u4, u5}; + use $crate::{AssignmentType, GlobalStateType}; use $crate::vm::{RgbIsa, ContractOp, TimechainOp}; use $crate::vm::aluasm_isa; use $crate::isa_instr; @@ -34,8 +36,28 @@ macro_rules! rgbasm { 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())) }}; - (ldg $t:literal, $no:literal,s16[$s_idx:literal]) => {{ RgbIsa::Contract(ContractOp::LdG($t.into(), $no, RegS::from($s_idx))) }}; - (lds $t:literal, $no:literal,s16[$s_idx:literal]) => {{ RgbIsa::Contract(ContractOp::LdS($t.into(), $no, RegS::from($s_idx))) }}; - (ldp $t:literal, $no:literal,s16[$s_idx:literal]) => {{ RgbIsa::Contract(ContractOp::LdP($t.into(), $no, RegS::from($s_idx))) }}; + (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]) => {{ + 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]) => {{ + 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]) => {{ + RgbIsa::Contract(ContractOp::LdS( + AssignmentType::from($t as u16), + Reg16::from(u4::with($a_idx)), + RegS::from($s_idx), + )) + }}; ($op:ident $($tt:tt)+) => {{ compile_error!(concat!("unknown RGB assembly opcode `", stringify!($op), "`")) }}; } diff --git a/src/vm/op_contract.rs b/src/vm/op_contract.rs index dfc9fc03..fb6be596 100644 --- a/src/vm/op_contract.rs +++ b/src/vm/op_contract.rs @@ -27,7 +27,7 @@ use std::ops::RangeInclusive; use aluvm::isa::{Bytecode, BytecodeError, ExecStep, InstructionSet}; use aluvm::library::{CodeEofError, LibSite, Read, Write}; -use aluvm::reg::{CoreRegs, Reg, Reg32, RegA, RegS}; +use aluvm::reg::{CoreRegs, Reg, Reg16, Reg32, RegA, RegS}; use amplify::num::{u3, u4}; use amplify::Wrapper; use commit_verify::CommitVerify; @@ -61,55 +61,55 @@ pub enum ContractOp { #[display("cnc {0},a16{1}")] CnC(AssignmentType, Reg32), - /// Loads input (previous) state with type id from the first argument and - /// index from the second argument into a register provided in the third - /// argument. + /// Loads input (previous) structured state with type id from the first + /// argument and index from the second argument `a16` register into a + /// register provided in the third argument. /// /// If the state is absent or is not a structured state sets `st0` to /// `false` and terminates the program. /// /// If the state at the index is concealed, sets destination to `None`. - #[display("ldp {0},{1},{2}")] - LdP(AssignmentType, u16, RegS), + #[display("ldp {0},a16{1},{2}")] + LdP(AssignmentType, Reg16, RegS), /// Loads owned structured state with type id from the first argument and - /// index from the second argument into a register provided in the third - /// argument. + /// index from the second argument `a16` register into a register provided + /// in the third argument. /// /// If the state is absent or is not a structured state sets `st0` to /// `false` and terminates the program. /// /// If the state at the index is concealed, sets destination to `None`. - #[display("lds {0},{1},{2}")] - LdS(AssignmentType, u16, RegS), + #[display("lds {0},a16{1},{2}")] + LdS(AssignmentType, Reg16, RegS), /// Loads owned fungible state with type id from the first argument and - /// index from the second argument into `a64` register provided in the third - /// argument. + /// index from the second argument `a16` register into `a64` register + /// provided in the third argument. /// /// If the state is absent or is not a fungible state sets `st0` to /// `false` and terminates the program. /// /// If the state at the index is concealed, sets destination to `None`. - #[display("ldf {0},{1},a64{2}")] - LdF(AssignmentType, u16, Reg32), + #[display("ldf {0},a16{1},a64{2}")] + LdF(AssignmentType, Reg16, Reg16), /// Loads global state from the current operation with type id from the - /// first argument and index from the second argument into a register - /// provided in the third argument. + /// first argument and index from the second argument `a8` register into a + /// register provided in the third argument. /// /// If the state is absent sets `st0` to `false` and terminates the program. - #[display("ldg {0},{1},{2}")] - LdG(GlobalStateType, u8, RegS), + #[display("ldg {0},a8{1},{2}")] + LdG(GlobalStateType, Reg16, RegS), /// Loads part of the contract global state with type id from the first - /// argument at the depth from the second argument into a register - /// provided in the third argument. + /// argument at the depth from the second argument `a32` register into a + /// register provided in the third argument. /// /// If the state is absent or concealed sets destination to `None`. /// Does not modify content of `st0` register. - #[display("ldc {0},{1},{2}")] - LdC(GlobalStateType, u16, RegS), + #[display("ldc {0},a32{1},{2}")] + LdC(GlobalStateType, Reg16, RegS), /// Loads operation metadata into a register provided in the third argument. /// @@ -157,31 +157,45 @@ impl InstructionSet for ContractOp { fn isa_ids() -> BTreeSet<&'static str> { none!() } - fn src_regs(&self) -> BTreeSet { bset![] } + fn src_regs(&self) -> BTreeSet { + match self { + ContractOp::LdP(_, reg, _) | + ContractOp::LdF(_, reg, _) | + ContractOp::LdS(_, reg, _) => bset![Reg::A(RegA::A16, (*reg).into())], + ContractOp::LdG(_, reg, _) => bset![Reg::A(RegA::A8, (*reg).into())], + ContractOp::LdC(_, reg, _) => bset![Reg::A(RegA::A32, (*reg).into())], + + ContractOp::CnP(_, _) | + ContractOp::CnS(_, _) | + ContractOp::CnG(_, _) | + ContractOp::CnC(_, _) => bset![], + ContractOp::LdM(_) => bset![], + ContractOp::PcVs(_) | ContractOp::PcCs(_, _) => bset![], + ContractOp::Fail(_) => bset![], + } + } fn dst_regs(&self) -> BTreeSet { match self { - ContractOp::CnP(_, reg) | - ContractOp::CnS(_, reg) | - ContractOp::CnG(_, reg) | - ContractOp::CnC(_, reg) => { + ContractOp::CnG(_, reg) => { + bset![Reg::A(RegA::A8, *reg)] + } + ContractOp::CnP(_, reg) | ContractOp::CnS(_, reg) | ContractOp::CnC(_, reg) => { bset![Reg::A(RegA::A16, *reg)] } ContractOp::LdF(_, _, reg) => { - bset![Reg::A(RegA::A64, *reg)] + bset![Reg::A(RegA::A64, (*reg).into())] } - ContractOp::LdP(_, _, reg) | - ContractOp::LdS(_, _, reg) | ContractOp::LdG(_, _, reg) | + ContractOp::LdS(_, _, reg) | + ContractOp::LdP(_, _, reg) | ContractOp::LdC(_, _, reg) | ContractOp::LdM(reg) => { bset![Reg::S(*reg)] } - ContractOp::PcVs(_) | ContractOp::PcCs(_, _) => { bset![] } - ContractOp::Fail(_) => bset![], } } @@ -246,55 +260,76 @@ impl InstructionSet for ContractOp { ); } ContractOp::CnG(state_type, reg) => { - regs.set_n(RegA::A16, *reg, context.global.get(state_type).map(|a| a.len_u16())); + regs.set_n(RegA::A8, *reg, context.global.get(state_type).map(|a| a.len_u16())); } ContractOp::CnC(_state_type, _reg) => { // TODO: implement global contract state fail!() } - ContractOp::LdP(state_type, index, reg) => { + ContractOp::LdP(state_type, reg_32, reg) => { + let Some(reg_32) = *regs.get_n(RegA::A16, *reg_32) else { + fail!() + }; + let index: u16 = reg_32.into(); + let Some(Ok(state)) = context .prev_state .get(state_type) - .map(|a| a.as_structured_state_at(*index)) + .map(|a| a.as_structured_state_at(index)) else { fail!() }; let state = state.map(|s| s.value.as_inner()); regs.set_s(*reg, state); } - ContractOp::LdS(state_type, index, reg) => { + ContractOp::LdS(state_type, reg_32, reg) => { + let Some(reg_32) = *regs.get_n(RegA::A16, *reg_32) else { + fail!() + }; + let index: u16 = reg_32.into(); + let Some(Ok(state)) = context .owned_state .get(*state_type) - .map(|a| a.into_structured_state_at(*index)) + .map(|a| a.into_structured_state_at(index)) else { fail!() }; let state = state.map(|s| s.value.into_inner()); regs.set_s(*reg, state); } - ContractOp::LdF(state_type, index, reg) => { + ContractOp::LdF(state_type, reg_32, reg) => { + let Some(reg_32) = *regs.get_n(RegA::A16, *reg_32) else { + fail!() + }; + let index: u16 = reg_32.into(); + let Some(Ok(state)) = context .owned_state .get(*state_type) - .map(|a| a.into_fungible_state_at(*index)) + .map(|a| a.into_fungible_state_at(index)) else { fail!() }; regs.set_n(RegA::A64, *reg, state.map(|s| s.value.as_u64())); } - ContractOp::LdG(state_type, index, reg) => { + ContractOp::LdG(state_type, reg_32, reg_s) => { + let Some(reg_32) = *regs.get_n(RegA::A8, *reg_32) else { + fail!() + }; + let index: u8 = reg_32.into(); + let Some(state) = context .global .get(state_type) - .and_then(|a| a.get(*index as usize)) + .and_then(|a| a.get(index as usize)) else { fail!() }; - regs.set_s(*reg, Some(state.value.as_inner())); + regs.set_s(*reg_s, Some(state.value.as_inner())); } - ContractOp::LdC(_state_type, _index, _reg) => { + + ContractOp::LdC(_state_type, _reg_32, _reg_s) => { // TODO: implement global contract state fail!() } @@ -360,11 +395,11 @@ impl Bytecode for ContractOp { ContractOp::CnG(_, _) | ContractOp::CnC(_, _) => 4, - ContractOp::LdP(_, _, _) | ContractOp::LdS(_, _, _) | + ContractOp::LdP(_, _, _) | ContractOp::LdF(_, _, _) | - ContractOp::LdC(_, _, _) => 6, - ContractOp::LdG(_, _, _) => 5, + ContractOp::LdC(_, _, _) | + ContractOp::LdG(_, _, _) => 4, ContractOp::LdM(_) => 2, ContractOp::PcVs(_) => 3, @@ -383,10 +418,10 @@ impl Bytecode for ContractOp { ContractOp::CnG(_, _) => INSTR_CNG, ContractOp::CnC(_, _) => INSTR_CNC, - ContractOp::LdP(_, _, _) => INSTR_LDP, + ContractOp::LdG(_, _, _) => INSTR_LDG, ContractOp::LdS(_, _, _) => INSTR_LDS, + ContractOp::LdP(_, _, _) => INSTR_LDP, ContractOp::LdF(_, _, _) => INSTR_LDF, - ContractOp::LdG(_, _, _) => INSTR_LDG, ContractOp::LdC(_, _, _) => INSTR_LDC, ContractOp::LdM(_) => INSTR_LDM, @@ -420,35 +455,30 @@ impl Bytecode for ContractOp { writer.write_u5(reg)?; writer.write_u3(u3::ZERO)?; } - ContractOp::LdP(state_type, index, reg) => { + ContractOp::LdP(state_type, reg_a, reg_s) => { writer.write_u16(*state_type)?; - writer.write_u16(*index)?; - writer.write_u4(reg)?; - writer.write_u4(u4::ZERO)?; + writer.write_u4(reg_a)?; + writer.write_u4(reg_s)?; } - ContractOp::LdS(state_type, index, reg) => { + ContractOp::LdS(state_type, reg_a, reg_s) => { writer.write_u16(*state_type)?; - writer.write_u16(*index)?; - writer.write_u4(reg)?; - writer.write_u4(u4::ZERO)?; + writer.write_u4(reg_a)?; + writer.write_u4(reg_s)?; } - ContractOp::LdF(state_type, index, reg) => { + ContractOp::LdF(state_type, reg_a, reg_dst) => { writer.write_u16(*state_type)?; - writer.write_u16(*index)?; - writer.write_u5(reg)?; - writer.write_u3(u3::ZERO)?; + writer.write_u4(reg_a)?; + writer.write_u4(reg_dst)?; } - ContractOp::LdG(state_type, index, reg) => { + ContractOp::LdG(state_type, reg_a, reg_s) => { writer.write_u16(*state_type)?; - writer.write_u8(*index)?; - writer.write_u4(reg)?; - writer.write_u4(u4::ZERO)?; + writer.write_u4(reg_a)?; + writer.write_u4(reg_s)?; } - ContractOp::LdC(state_type, index, reg) => { + ContractOp::LdC(state_type, reg_a, reg_s) => { writer.write_u16(*state_type)?; - writer.write_u16(*index)?; - writer.write_u4(reg)?; - writer.write_u4(u4::ZERO)?; + writer.write_u4(reg_a)?; + writer.write_u4(reg_s)?; } ContractOp::LdM(reg) => { writer.write_u4(reg)?; @@ -474,70 +504,50 @@ impl Bytecode for ContractOp { Ok(match reader.read_u8()? { INSTR_CNP => { let i = Self::CnP(reader.read_u16()?.into(), reader.read_u5()?.into()); - reader.read_u4()?; // Discard garbage bits + reader.read_u3()?; // Discard garbage bits i } INSTR_CNS => { let i = Self::CnS(reader.read_u16()?.into(), reader.read_u5()?.into()); - reader.read_u4()?; // Discard garbage bits + reader.read_u3()?; // Discard garbage bits i } INSTR_CNG => { let i = Self::CnG(reader.read_u16()?.into(), reader.read_u5()?.into()); - reader.read_u4()?; // Discard garbage bits + reader.read_u3()?; // Discard garbage bits i } INSTR_CNC => { let i = Self::CnC(reader.read_u16()?.into(), reader.read_u5()?.into()); - reader.read_u4()?; // Discard garbage bits + reader.read_u3()?; // Discard garbage bits i } - INSTR_LDP => { - let i = Self::LdP( - reader.read_u16()?.into(), - reader.read_u16()?, - reader.read_u4()?.into(), - ); - reader.read_u4()?; // Discard garbage bits - i - } - INSTR_LDS => { - let i = Self::LdS( - reader.read_u16()?.into(), - reader.read_u16()?, - reader.read_u4()?.into(), - ); - reader.read_u4()?; // Discard garbage bits - i - } - INSTR_LDF => { - let i = Self::LdF( - reader.read_u16()?.into(), - reader.read_u16()?, - reader.read_u5()?.into(), - ); - reader.read_u4()?; // Discard garbage bits - i - } - INSTR_LDG => { - let i = Self::LdG( - reader.read_u16()?.into(), - reader.read_u8()?, - reader.read_u4()?.into(), - ); - reader.read_u4()?; // Discard garbage bits - i - } - INSTR_LDC => { - let i = Self::LdC( - reader.read_u16()?.into(), - reader.read_u16()?, - reader.read_u4()?.into(), - ); - reader.read_u4()?; // Discard garbage bits - i - } + INSTR_LDP => Self::LdP( + reader.read_u16()?.into(), + reader.read_u4()?.into(), + reader.read_u4()?.into(), + ), + INSTR_LDF => Self::LdF( + reader.read_u16()?.into(), + reader.read_u4()?.into(), + reader.read_u4()?.into(), + ), + INSTR_LDG => Self::LdG( + reader.read_u16()?.into(), + reader.read_u4()?.into(), + reader.read_u4()?.into(), + ), + INSTR_LDS => Self::LdS( + reader.read_u16()?.into(), + reader.read_u4()?.into(), + reader.read_u4()?.into(), + ), + INSTR_LDC => Self::LdC( + reader.read_u16()?.into(), + reader.read_u4()?.into(), + reader.read_u4()?.into(), + ), INSTR_LDM => { let i = Self::LdM(reader.read_u4()?.into()); reader.read_u4()?; // Discard garbage bits diff --git a/stl/AnchoredBundle.vesper b/stl/AnchoredBundle.vesper index 3ab74073..d97a267c 100644 --- a/stl/AnchoredBundle.vesper +++ b/stl/AnchoredBundle.vesper @@ -117,7 +117,7 @@ AnchoredBundle rec RevealedData rec value bytes len=0..MAX16 aka=DataState salt is U128 - inputs set len=0..MAX8 aka=Inputs + inputs set len=0..MAX16 aka=Inputs Input rec prevOut rec -- Opout op bytes len=32 aka=OpId diff --git a/stl/RGB@0.1.0.sta b/stl/RGB@0.1.0.sta index 55964b4c..79efbae9 100644 --- a/stl/RGB@0.1.0.sta +++ b/stl/RGB@0.1.0.sta @@ -1,5 +1,5 @@ -----BEGIN STRICT TYPE LIB----- -Id: 2nWgjeSMhVE2mKgC7WyE5Dn8a6tZJDMoNugDWdc4vcZZ#spring-moral-almanac +Id: HqdNNAehK3yaQ1AC5pQmEuNNS1zgyo2Jw31fdUNKb9MU#annual-virus-garlic Name: RGB Dependencies: c8Tnib31q1p7szyPukEGDoQzJQ5qJwPCn5uZCHUXzB9#cupid-metro-warning, @@ -65,8 +65,8 @@ L%7X0(MZ+m5XM3^r;0|aDsVQc^f0tR$paB^jI0to-Z_Ce;SSLEx{oG{4aHr^2iyi LDUBh#^}_A@_MaKYL@=60F^Mce9hV@kEAv~dJM2k-Wy*xwxV$=>!YxCL);a%FS^2 >-+OLFT7d0mQB -U&A7nhZflGzYjutGK7Ikb(*|O7Ze(m_0hXpPne(?RlQ8`&+waoz6~|Y?oZ~PA2bO -M&(|4LuH3&g-b7gc?VP^#a00#g7Kp+4jL349yXKqquc4c8~Wn@8gbYWv?LTqVnWK +U&A7nhZflGzYjutGK7Ikb(*|O7Ze(m_0rx{b<9+Yu`qRj%G%AgD9u}q)cm@#lClo +8c{Gvp6EC@k!b7gc?VP^#a00#g7Kp+4jL349yXKqquc4c8~Wn@8gbYWv?LTqVnWK (5fY*ctqbaDg)01RVqZf0p@Wo~q7VQc^f0t9nqVQc~0idq_i6cBYN^7xEELu$lFU 37Sf$J;ty5yrmOX|)6eb97;JWdZy&McrS|4GaIQ6{LE)1tQ>Eiz^#2Wm1QOk9#fa jy(YpV{dL|X=G(?bZKF1Q*>c;WdH^O1aoC!YypqE!sthuPUKDEU2%WC`V+X+(UG) @@ -202,7 +202,7 @@ n=-%xGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%GNp5g;bWLG!1pxpG0`+VY Vk7oBr%DNv+($;q`HHK!gIHa)*%m(-e#9sm3L)b@L&d6G@+l`%qd385?K@+fP1(- 9sgE>i7rMzqbpe&g=6W7=VqesjRYGc!>wZFzp>JB4@xD;^wu&SY_r(DK00000009 6000000000I_Zg6#Ua|Hna2?5oOUkD7Ff~JZGMgrhZ&rP2gYrktY!x$bpv=qCl=H -dVV000000093000000000S1Wn^h#RC#b^0|5hJZh8L*O=WapWMOn+1pxpE002M$0 +dVV000000096000000000S1Wn^h#RC#b^0|5hJZh8L*O=WapWMOn+1pxpE002M$0 000000030{{R300000BPh(?sa&l#EV`Xy&0t0PnZU6uR18re=0006EPjEwTZEb0E ZDnqB1_%RYW_AJEn^6;37FKqUhx?i3R+Mr!fY&(;2BFL(m@EZk_srD>Z*Ww3aAg7 Z;tWa*pdtf40sy7f4K>mzt7V=@2m@wjb^+R(Q4?4eR(6nw` @6CZd7@2WdSr&53UoI8eY9A{1GERg--GiI0S# x1is&)M%fmnGH3{GWprU=VRT^u;b~{_$H8YPU!!A-5yM58(94FP(7*JmC%?~bN>d -RB2WM<=Vqt7^0owP`H}~XwW|nkt{7-&IWbpPi(wX$0pXUqF<#0Z84+d#&aCLNZ0q -XH?aMFzGWq$hFvg0C@`6md)2`tzAi?CmdhpVB9ybED-b7^O8ZDnqBa{>8NbFsAF+ +RB2WM<=Vqt7^0owP`H}~XwW|nkt{7-&IWbpPi(wX$0pXUqF<#0Z84+d#&aCLNZ0j +Z*TSChz_$|Xx}eRkFNAr%^eLl(1e@}~9=0-ijXfD2)Bb7^O8ZDnqBa{>8NbFsAF+ NAOa9=u3y1Xa&C=4DE;gi12nFEThgaqbCrVQgh?V`*h`0o{dW0B>Pr5ftu@@z<*O 39}j`u&O7io3b$Is?RA$O%POaVQzD2bZKvHLUnFrY-I)l2x)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(ETixq|tDc|qkEqWzEgosCv-N}OwI3 -27^9uv@M+=8wZFzp>JB4@xD;^wu&SY_r(G5e-m~8oEl#z@T$dQ;Shc2UKksAbu +m0|FIl~hsu%M}yz;kwbCmqWQ?a(0yP=wbe0q{)>8+xQm0YXqYdo~D%m7H6OD0<^0n _2##VWXRdjy=DB@qgYOj2WM<=Vqt7^015%s?vf5kh_h+&YE#h%O8d1V_{UOl9{V; uR#^q%GEG0000000000{{R diff --git a/stl/RGB@0.1.0.stl b/stl/RGB@0.1.0.stl index 741fb19c..d7c778e8 100644 Binary files a/stl/RGB@0.1.0.stl and b/stl/RGB@0.1.0.stl differ diff --git a/stl/RGB@0.1.0.sty b/stl/RGB@0.1.0.sty index f33e60b3..058065b6 100644 --- a/stl/RGB@0.1.0.sty +++ b/stl/RGB@0.1.0.sty @@ -1,5 +1,5 @@ {- - Id: urn:ubideco:stl:2nWgjeSMhVE2mKgC7WyE5Dn8a6tZJDMoNugDWdc4vcZZ#spring-moral-almanac + Id: urn:ubideco:stl:HqdNNAehK3yaQ1AC5pQmEuNNS1zgyo2Jw31fdUNKb9MU#annual-virus-garlic Name: RGB Version: 0.1.0 Description: Consensus layer for RGB smart contracts @@ -255,8 +255,8 @@ data Input : prevOut Opout, reserved ReservedBytes2 @mnemonic(canada-chicken-analyze) data InputMap : {Bitcoin.Vout -> ^ 1.. OpId} -@mnemonic(puzzle-guru-oregano) -data Inputs : {Input ^ ..0xff} +@mnemonic(liquid-meaning-convert) +data Inputs : {Input} @mnemonic(light-nelson-brain) data MediaType : any#255 diff --git a/stl/Transition.vesper b/stl/Transition.vesper index 46ad51e3..af8391d2 100644 --- a/stl/Transition.vesper +++ b/stl/Transition.vesper @@ -41,7 +41,7 @@ Transition rec RevealedData rec value bytes len=0..MAX16 aka=DataState salt is U128 - inputs set len=0..MAX8 aka=Inputs + inputs set len=0..MAX16 aka=Inputs Input rec prevOut rec -- Opout op bytes len=32 aka=OpId