Skip to content

Commit

Permalink
Merge pull request #239 from RGB-WG/txid
Browse files Browse the repository at this point in the history
Avoid possible mismatches between witness txid and tx data at type system level
  • Loading branch information
dr-orlovsky authored Jul 25, 2024
2 parents d114e98 + f584d10 commit afe14d3
Show file tree
Hide file tree
Showing 7 changed files with 84 additions and 78 deletions.
66 changes: 37 additions & 29 deletions src/containers/anchors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ use bp::dbc::opret::OpretProof;
use bp::dbc::tapret::TapretProof;
use bp::dbc::{anchor, Anchor};
use bp::{Tx, Txid};
use commit_verify::{mpc, CommitId, ReservedBytes};
use commit_verify::{mpc, CommitId};
use rgb::{
BundleDisclosure, BundleId, ContractId, DbcProof, DiscloseHash, EAnchor, Operation, Transition,
TransitionBundle, XChain, XWitnessId,
Expand Down Expand Up @@ -67,7 +67,7 @@ pub trait ToWitnessId {
}

impl ToWitnessId for XPubWitness {
fn to_witness_id(&self) -> XWitnessId { self.map_ref(|w| w.txid) }
fn to_witness_id(&self) -> XWitnessId { self.map_ref(|w| w.txid()) }
}

impl MergeReveal for XPubWitness {
Expand All @@ -80,8 +80,8 @@ impl MergeReveal for XPubWitness {
(XChain::Bitcoin(bitcoin), XChain::Liquid(liquid)) |
(XChain::Liquid(liquid), XChain::Bitcoin(bitcoin)) => {
Err(MergeRevealError::ChainMismatch {
bitcoin: bitcoin.txid,
liquid: liquid.txid,
bitcoin: bitcoin.txid(),
liquid: liquid.txid(),
})
}
_ => unreachable!(),
Expand All @@ -91,56 +91,64 @@ impl MergeReveal for XPubWitness {

#[derive(Clone, Eq, Debug)]
#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)]
#[strict_type(lib = LIB_NAME_RGB_STD)]
#[strict_type(lib = LIB_NAME_RGB_STD, tags = custom, dumb = Self::Txid(strict_dumb!()))]
#[cfg_attr(
feature = "serde",
derive(Serialize, Deserialize),
serde(crate = "serde_crate", rename_all = "camelCase")
)]
pub struct PubWitness {
pub txid: Txid,
pub tx: Option<Tx>,
pub spv: ReservedBytes<1>,
pub enum PubWitness {
#[strict_type(tag = 0x00)]
Txid(Txid),
#[strict_type(tag = 0x01)]
Tx(Tx), /* TODO: Consider using `UnsignedTx` here
* TODO: Add SPV as an option here */
}

impl PartialEq for PubWitness {
fn eq(&self, other: &Self) -> bool { self.txid == other.txid }
fn eq(&self, other: &Self) -> bool { self.txid() == other.txid() }
}

impl Ord for PubWitness {
fn cmp(&self, other: &Self) -> Ordering { self.txid.cmp(&other.txid) }
fn cmp(&self, other: &Self) -> Ordering { self.txid().cmp(&other.txid()) }
}

impl PartialOrd for PubWitness {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> { Some(self.cmp(other)) }
}

impl PubWitness {
pub fn new(txid: Txid) -> Self {
PubWitness {
txid,
tx: None,
spv: none!(),
pub fn new(txid: Txid) -> Self { Self::Txid(txid) }

pub fn with(tx: Tx) -> Self { Self::Tx(tx) }

pub fn txid(&self) -> Txid {
match self {
PubWitness::Txid(txid) => *txid,
PubWitness::Tx(tx) => tx.txid(),
}
}

pub fn with(tx: Tx) -> Self {
PubWitness {
txid: tx.txid(),
tx: Some(tx),
spv: none!(),
pub fn tx(&self) -> Option<&Tx> {
match self {
PubWitness::Txid(_) => None,
PubWitness::Tx(tx) => Some(tx),
}
}
}

impl PubWitness {
pub fn merge_reveal(mut self, other: Self) -> Result<Self, MergeRevealError> {
if self.txid != other.txid {
return Err(MergeRevealError::TxidMismatch(self.txid, other.txid));
pub fn merge_reveal(self, other: Self) -> Result<Self, MergeRevealError> {
match (self, other) {
(Self::Txid(txid1), Self::Txid(txid2)) if txid1 == txid2 => Ok(Self::Txid(txid1)),
(Self::Txid(txid), Self::Tx(tx)) | (Self::Txid(txid), Self::Tx(tx))
if txid == tx.txid() =>
{
Ok(Self::Tx(tx))
}
// TODO: tx1 and tx2 may differ on their witness data; take the one having most of the
// witness
(Self::Tx(tx1), Self::Tx(tx2)) if tx1.txid() == tx2.txid() => Ok(Self::Tx(tx1)),
(a, b) => Err(MergeRevealError::TxidMismatch(a.txid(), b.txid())),
}
self.tx = self.tx.or(other.tx);
// TODO: process SPV
Ok(self)
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/containers/partials.rs
Original file line number Diff line number Diff line change
Expand Up @@ -292,7 +292,7 @@ impl StrictSerialize for Fascia {}
impl StrictDeserialize for Fascia {}

impl Fascia {
pub fn witness_id(&self) -> XWitnessId { self.witness.map_ref(|w| w.txid) }
pub fn witness_id(&self) -> XWitnessId { self.witness.map_ref(|w| w.txid()) }

pub fn into_bundles(self) -> impl IntoIterator<Item = (ContractId, TransitionBundle)> {
self.bundles
Expand Down
2 changes: 1 addition & 1 deletion src/resolvers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ impl<'cons, R: ResolveWitness, const TRANSFER: bool> ResolveWitness
) -> Result<XWitnessTx, WitnessResolverError> {
self.consignment
.pub_witness(witness_id)
.and_then(|p| p.map_ref(|pw| pw.tx.clone()).transpose())
.and_then(|p| p.map_ref(|pw| pw.tx().cloned()).transpose())
.ok_or(WitnessResolverError::Unknown(witness_id))
.or_else(|_| self.fallback.resolve_pub_witness(witness_id))
}
Expand Down
2 changes: 1 addition & 1 deletion src/stl/stl.rs
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ pub const LIB_ID_RGB_CONTRACT: &str =

/// Strict types id for the library representing of RGB StdLib data types.
pub const LIB_ID_RGB_STD: &str =
"stl:hYQHisDw-Xlm3v1j-P7A1VJg-luZS$ja-0AZHFIx-QtWo!SY#carrot-salt-sport";
"stl:JWQFfoHI-ASiyaQC-W0$vG!m-vBFkbJ3-fJAdVOr-rzKa5yU#weather-toyota-cadet";

fn _rgb_std_stl() -> Result<TypeLib, CompileError> {
LibBuilder::new(libname!(LIB_NAME_RGB_STD), tiny_bset! {
Expand Down
83 changes: 41 additions & 42 deletions stl/[email protected]
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
-----BEGIN STRICT TYPE LIB-----
Id: stl:hYQHisDw-Xlm3v1j-P7A1VJg-luZS$ja-0AZHFIx-QtWo!SY#carrot-salt-sport
Id: stl:JWQFfoHI-ASiyaQC-W0$vG!m-vBFkbJ3-fJAdVOr-rzKa5yU#weather-toyota-cadet
Name: RGBStd
Dependencies:
StrictTypes#century-comrade-chess,
Expand All @@ -9,7 +9,7 @@ Dependencies:
Std#ralph-blue-lucky,
CommitVerify#tennis-peace-olympic,
Bitcoin#signal-color-cipher
Check-SHA256: ba488fab74852d0e4ca17841f7686393bf7a509a80def594553a7c9b9b7e99bb
Check-SHA256: 9ebce97a4b4651eb2ea53e93f25d76debaebb55a5dc793423d3927a443cd720c

22w{tQ*>kpMe3tp+xFv-0Xp&G?S=|}9rRaeU`~uMrbA>C`}q*r3sZD*X=8L$d2nTOVsJHoA?4$swuZp1
Wc+9AOf`(TIbyKWjTy4WkGaM+1wm|eR!wgnmidRhTh1hu7-!n@1Cr{swqbZoGSd8tmgp<3rE>;CP(yEW
Expand Down Expand Up @@ -274,46 +274,45 @@ U)%QMkO4aJ;_ZeCe;xE!X<$x_Fs4If6Z`oP*$IZhiz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSj|g&Q
b7gXNWn=>3(cK(6LD#rwNz2*s{WQVl8bg5o8r0R+^o=IRl4@n|>JtwI*nu%&Q~z;Vl^%5wS6(#;{6ajG
64wDPk{-(nPj_x*WJzXWV`T&e00Uuec>n+a0S0nuXJ~YD0000224QV)b#8P30009AVQzUuVRT^t000CD
VQzUrbaY{3XaE2J1q5VabYTDm0RlzpqhH(h<B$P5@#5`<3V$8+S7~5Qj4-A{WE1=O5ZP-4qZFQ|l>ioJ
pYH;+t0eX2w~A!Q+0eaZ{MVycPK^psbz)a(bZ%vHa|Qzhba-iG0`+VYVk7oBr%DNv+($;q`HHK!gIHa)
*%m(-e#9sm3ZsHT^UK%K(4i9Ajp1M~R@C@!4#dQE#lUD;OiKi1RswW*00aU61a5C`WdHyG0R(ezZDjxj
0Rr`G6JjIwIj2eqliWu}$@z+_xPw?-wb>Rw7=FYk8VbdGA)3GUIc{=BfUQMVFMRBwY;Hd$-Q55DeryBg
+(ZL&aCQRW(cK(6LD#rwNz2*s{WQVl8bg5o8r0R+^o=IRl4@m>_h5K%L=laq&yA1JoJ^{7>oKLkF4~ia
x8KK|47hp+Q)y>HY;R%(0RRX906+l%000000000G00000000M5b#QQONn`~900#g7Kp+4KQ+04~Y)N!w
Z3G1X2V`YtVRdYD0000126TCFWlnDZ1pxp60ucywd2nS;VQpmq1pxv@>Z4!V_T!KNI`QJ|h6;Zj^jB$M
PK+?7Lu3>C`4HJt76^nC$%1sKzB<;EQA|)S-x88IWKN#S$#@T&w`gP%31(?!Y-CPhZDjxj0RlzpqhH(h
<B$P5@#5`<3V$8+S7~5Qj4-A{WE1=O5ZN2FSOM~2u5HNtDFUVZ)Px`L*HDD*8{ol0Eq4Mp_;M2qc42a9
VQzFzVQpmq1pxv@>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI&hQW&>`ZdvNB=ndTz*X~v;Uq>`
<)y^XImOPdju4LsQ+04~Y)xTs1pxpG0fxZdfE@Zx_8VV!VgW89U{2OOpSL%4#$e>_yXHjFIRQSmNY6I<
5v~@QIWPpZY|_Y4b;6H9FjnZfWO1qYkW~Nx000000093000000000P6b#QQOQ*~kk3I=I(b7gF100eDi
bYTGoXKZg`VQc~gZ+C8GWCI6wVQgh?V|fG$VRLh7XKrm}Zgd3)XJu|>b7^x13UqQ|ZgXjLX>V=^31xV6
Wo~n6Z*B+)Wq4y{aCB*JZV3ugb#QQOWo>0{bOr<oV{dMBWo~pyWB~@4t+(1Z!Y#S=r-tc=NPf>PeW=$`
IKP*ssSB}HE2Rl^X>Db5bYX39002k_V{&C-bZ>G3vZm7D7n+yi3hX<4=vg0v15So5w!tr?&z8cM|9xBL
w&;L{94K`ndk%K5+?9Jv$dw7jc}U5p5@2#$kUJ%u3t?_<Z**aFX>V?G015$E_7Pp|Zd*4POSky84?DA0
%Jd;JpJb=vumIvFO*=CI)c=pRa5$-awG%hvwbbHb-(903OpfIVCMlINkQ($C0000000000{{R3000000
2vlWqZE0>{Yz6@Zb7f&{a{vhfvZm7D7n+yi3hX<4=vg0v15So5w!tr?&z8cM|9xBL?t8o+`-uphG|cdB
R?oL=+M>y2b9zMWEakNXv#+m-0000000000|Nj60000003{+)uZE0>{Y*S@nYy<)T4P$R^V`X7%Wn@)!
cy9m&0RnFxmidRhTh1hu7-!n@1Cr{swqbZoGSd8tmgp<3rE_Q*>%7&o7^|1Fn59cLW!>7R25;!;B<BNQ
sg$$522KGBcWHEPWpi^@Z*_D41pxsQewJ`oh7zt&&MJy2gA<i%%^<0}h^*K^Q%?7uGy#kcRB~Z%b7^#G
Z*ECuVPj<m2?%X(WNBt;WpV+O9PeeuXILaAA3^JIKdZ3ic!M@6PJV67bl-3#Cg!RLZ*X*JZ*F010?I5N
Z-bfLFbqC#o>4E?M+l67UG^w8*<_XZ#%uyqCt-#n(R;4&W&+>mb;*F>vukd;=m`ygb@x#_>`RmOO$cpe
bYWy+bYTDq0!8YhU)%QMkO4aJ;_ZeCe;xE!X<$x_Fs4If6Z`oP*&DQ20rFt3ZOHs70;T-agdg$OP=xIp
;K4#IcLF!~asU7T000000RI300000000(DmZ(?C=a{vkgMe3tp+xFv-0Xp&G?S=|}9rRaeU`~uMrbA>C
`}q*r8?;yf@?frQ$owe+rTo-{AMw{vgzX#P!9p!}0yp?_0<xyk;1`;g;tK3LeCSypf&)&5Ew;fgq|cVZ
m;ZfR<~G4Jq57bK6Q|uUfIMEX^1}Vv6tLB!)|10-o)0prc>n+a000000RI300000000wDpaCLNZ015&{
>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+p<?Hl01LM?X!H~4Y_
vZm7D7n+yi3hX<4=vg0v15So5w!tr?&z8cM|9xBLHo-KZ`k;Xmr`<4sJYKN!!u{G5u+^j1lf!PF4>GEG
0000000000{{R30000003t@9}X=iS2Wo~qH015&{>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI~
v{(W1V6JV*{3!yZ{M3XW@z+p<?Hl01LM?X!H~4Y_vZm7D7n+yi3hX<4=vg0v15So5w!tr?&z8cM|9xBL
Ho-KZ`k;Xmr`<4sJYKN!!u{G5u+^j1lf!PF4>GEG0000000000{{R300000033g#@Wo~0>Wpe-t0!8Yh
U)%QMkO4aJ;_ZeCe;xE!X<$x_Fs4If6Z`oP*&DQ20rFt3ZOHs70;T-agdg$OP=xIp;K4#IcLF!~asU7T
000000RI300000000w1pa&K~T00{y`>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI&hQW&>`ZdvN
B=ndTz*X~v;Uq>`<)y^XImOPdju4Lk0000000030000000000HWMyVyb!>D&b8~5DZf#|5bN~bb00eGt
Ze;)f009JZZ*64&1pxv@>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW
@z+p<?Hl01LM?X!H~4Z4R$**qZew{#W?^Gx1_20iWpQ<Ba%E%!$}AplgPGkh3_fq3Q7_j=2#kPT_9!;l
WR>~GYywm#VTK~nd#><i0^jF#$$;RqYi_#e2@QaC_fb3SOOy6Z1y*HpPHzJO0(LL}0(LP02v%=(bW>$v
Yz6}cZDn+5Z)5^*9+vrsy<5&Clo)5)@&l6UwYFh+Ofu5^ik9drt)+7=w-6<{Ze<qQdlVg^9i4AkI(VA>
NoKcy!1~?PoRaGVc5iib0`+VYVk7oBr%DNv+($;q`HHK!gIHa)*%m(-e#9sm3L)b@L&d6G@+l`%qd385
?K@+fP1(-9sgE>i7rMzqbqHc?X>Md`Zf5`h2m
pYH;+t0eX2w~A!Q+0eaZ{MVycPK^psbz)a(bZ%vHa|8ka1ax?5WB>&L0`+VYVk7oBr%DNv+($;q`HHK!
gIHa)*%m(-e#9sm3ZsHT^UK%K(4i9Ajp1M~R@C@!4#dQE#lUD;OiKi1RsjNZcmM?f0`+VYVk7oBr%DNv
+($;q`HHK!gIHa)*%m(-e#9sm3dMUNn!oosZgNI|twmNZeC(lYZa*g7-2eQ3Yy;-pL<du8XF_amVg&&J
2mk;;0RR910000001yBG000002UB%$aBN9r1pxpD002NB00~odaByr%bY*P>1po(RWoBV@Y;*ts009Pc
d2nS;ZvX`W0006J2y}UHWlmvjWdH>M0!8YhU)%QMkO4aJ;_ZeCe;xE!X<$x_Fs4If6Z`oP*;5t>gcQkw
bf~^M){{|8P%hsRk~m~ep32F151Y4WWD*HxX=Q9=PGN0j00jX8Me3tp+xFv-0Xp&G?S=|}9rRaeU`~uM
rbA>C`}q*r8?;yf@?frQ$owe+rTo-{AMw{vgzX#P!9p!}0yp?_6AN}>a%o|1bWUMyWdH>M0!8YhU)%QM
kO4aJ;_ZeCe;xE!X<$x_Fs4If6Z`oP*$IZhiz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSj|fwBaByr*
VQ>Wj015$yz}|oy`cC#6Uw2{wE+Sw~);*uMH+9Bf<n6oWMAA6{KDS8EHu@2+7MVFP1hs6^$We8|k3le2
=(%KZsrQgo0000000000{{R30000002vc=%aBNd`Vgm{WX>@aCY-RuiZDn*}0S0GmZ(?C=0tIh(Ze?Tx
2X<j>Wo~161PWnub7^O8ZDnqB1qWwkZe??6a|Q}@a$#<BX>@6CZU+fvcywiMb7^mG2nl6)V`Xr3X>V=`
3R87(aBO95Wo~o^1PNnrZggdCbV+0Z2AHk4+Bm{3x%H=p>4!*u&n<nZ*HSpYm!_!;u~jRj33O>~Wpi|4
ZEyepNC#tbWnpx0asslZ(%=`Gm*NWSJACL_AA$o;hAp<iFQm_w!k7PjTjsXtfQB3>bs~EXcCXx(drQcb
3B`Fx$)^%va$Ar)C7cUkZf<XMVRUJ4ZgT(%0a*4CUF>dKHyBH|__hx_vscRWAu^w2r{b^x;wDWyGXd29
kG60)seH8)H{-R`;$q)jqasX><q0M!l`@bT^cMgC000000093000000000P7WpZt4ZeeT&0R?kqVQg~%
2?DaF(%=`Gm*NWSJACL_AA$o;hAp<iFQm_w!k7PjTjuV2ydV3C2%R*{@NQPmw`|&?$z^kTMC~l)wFI-T
uZaKv000000096000000000bBWpZt4ZeeUwWnpXt0sswTZ*F5{VQgh&Rdjf700jX8ZyuKUhrL_QB$OCu
+VTUE>b16EcuX?V{EC+7E3Kt-Xc_Cg)w39@m$R6qOEzWQ+NTC@=;<Wq17N9?v%LmR0Sk9&bZ%vHb5?J4
bN~eb0TX_fa94&Bu29Y@iYbE=m1@l(sk?}**g#WG_ntHXj1N?DVQzD2bZKvHNoHYVWd;cdZEs|0W@%+|
0hAo?WyWV%Bqkq0>u^7-u;qAzHYrYiZOnAva3v<@st9jzbZKvHVQd1*EFN!zncXl9K5w2;FV{y1jDTJC
C^p$-mHEbO0#qkqh9c2>uJC38-{*D7fZ(%hZo23R4S;p`Q9JBQllDyrZDn*}WMOn+00{y`>Z4!V_T!KN
I`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+p<?Hl01LM?X!H~4Y@0000000030
0000000007XKZg`VQg~%3IavyqhH(h<B$P5@#5`<3V$8+S7~5Qj4-A{WE1=O5ZN2FSOM~2u5HNtDFUVZ
)Px`L*HDD*8{ol0Eq4Mp_;LcWrqbXSnwR1V>^pquSs#J}PKGVE!7rrGmcp0+eOu->!8D=zpn(&o-7tVW
Ua<1Q{n`|;)uYyv!)~4rGOBq100000000300000000006X>M?JbaMa-0!8YhU)%QMkO4aJ;_ZeCe;xE!
X<$x_Fs4If6Z`oP*&DQ20rFt3ZOHs70;T-agdg$OP=xIp;K4#IcLF!~asslZ(%=`Gm*NWSJACL_AA$o;
hAp<iFQm_w!k7PjTjn;wG@<&SffJ|QFn~N>u=2wF+7z(Wqt=tdZk`V^s(Ana000000093000000000YN
b8~5DZf#|5baMa-0!8YhU)%QMkO4aJ;_ZeCe;xE!X<$x_Fs4If6Z`oP*&DQ20rFt3ZOHs70;T-agdg$O
P=xIp;K4#IcLF!~asslZ(%=`Gm*NWSJACL_AA$o;hAp<iFQm_w!k7PjTjn;wG@<&SffJ|QFn~N>u=2wF
+7z(Wqt=tdZk`V^s(Ana000000093000000000SgVQgh?V`*h`00{y`>Z4!V_T!KNI`QJ|h6;Zj^jB$M
PK+?7Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+p<?Hl01LM?X!H~4Y@00000000300000000006WpZ+F
a&rI)0!8YhU)%QMkO4aJ;_ZeCe;xE!X<$x_Fs4If6Z`oP*$IZhiz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#
&aRFSj{pDw000000RI300000001;$mW?^+~bU|}-X=iS2Wo~o;1OfmAZf|a7000011aog~WdH>M0!8Yh
U)%QMkO4aJ;_ZeCe;xE!X<$x_Fs4If6Z`oP*&DQ20rFt3ZOHs70;T-agdg$OP=xIp;K4#IcLF!~atu~s
Y-Mg^c}ZqrV`T;b2y$g{b!l>CWCF@89&dx0-7pM3Z=O*v*GCA9fL-<|HrZsA`NnJlR3~AEBGG%U@MZ$v
=XJ?|;InIPy66cFfOYp#JM2r7_Duy=WpYk$0|EkeFaQE}F#!lxZ*_E2WnpXv0|sqnbZBp60&gCc`G>t*
&Lor=XWH@ulIpd#VR%e3()@~+=qs(Ib1t_KCAn^87TS9h9ibhaZ&^Bcn*B*;w|~I;-PD|t>jZXhb#wyt
Y!hN5_Bp3Y36tDMM#=e#tGI($UA5U3KNx<*C>jbO<32;hs$B9ZCsU(1!DsC|W1LOd&b_IRG-(&Q$wPGr
Vr*${WNB_^000O

-----END STRICT TYPE LIB-----

Binary file modified stl/[email protected]
Binary file not shown.
7 changes: 3 additions & 4 deletions stl/[email protected]
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{-
Id: stl:hYQHisDw-Xlm3v1j-P7A1VJg-luZS$ja-0AZHFIx-QtWo!SY#carrot-salt-sport
Id: stl:JWQFfoHI-ASiyaQC-W0$vG!m-vBFkbJ3-fJAdVOr-rzKa5yU#weather-toyota-cadet
Name: RGBStd
Version: 0.11.0
Description: RGB standard library
Expand Down Expand Up @@ -351,10 +351,9 @@ data OwnedIface : any ()
| anyAttach ()
| data StrictTypes.SemId
@mnemonic(novel-camilla-tokyo)
@mnemonic(paper-visa-storm)
data PubWitness : txid Bitcoin.Txid
, tx Bitcoin.Tx?
, spv CommitVerify.ReservedBytes1
| tx Bitcoin.Tx
@mnemonic(insect-cello-avalon)
data SigBlob : [Byte ^ 1..0x1000]
Expand Down

0 comments on commit afe14d3

Please sign in to comment.