From a2b0aff7c8f51332a04abaec602d0b6d2895826b Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Wed, 24 Jul 2024 13:54:36 +0200 Subject: [PATCH 01/12] chore: update to use new WitnessOrd variants --- Cargo.lock | 2 +- Cargo.toml | 2 +- src/persistence/stock.rs | 3 +- src/stl/stl.rs | 2 +- stl/RGBStd@0.11.0.sta | 189 ++++++++++++++++++++------------------- stl/RGBStd@0.11.0.stl | Bin 19275 -> 19357 bytes stl/RGBStd@0.11.0.sty | 48 +++++----- 7 files changed, 124 insertions(+), 122 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a5a00bb1..a7081bad 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -661,7 +661,7 @@ dependencies = [ [[package]] name = "rgb-core" version = "0.11.0-beta.6" -source = "git+https://github.com/RGB-WG/rgb-core?branch=master#84892fd826f6f7805b076e70cba467b85c1eb8f7" +source = "git+https://github.com/RGB-WG/rgb-core?branch=mining#f57448b5d2047fb017f34719f193e673558f49ec" dependencies = [ "aluvm", "amplify", diff --git a/Cargo.toml b/Cargo.toml index 5065bcec..4942a4ec 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -99,4 +99,4 @@ features = ["all"] [patch.crates-io] bp-consensus = { git = "https://github.com/BP-WG/bp-core", branch = "master" } bp-invoice = { git = "https://github.com/BP-WG/bp-std.git", branch = "master" } -rgb-core = { git = "https://github.com/RGB-WG/rgb-core", branch = "master" } +rgb-core = { git = "https://github.com/RGB-WG/rgb-core", branch = "mining" } diff --git a/src/persistence/stock.rs b/src/persistence/stock.rs index 2332573e..10579e2a 100644 --- a/src/persistence/stock.rs +++ b/src/persistence/stock.rs @@ -1221,6 +1221,7 @@ impl Stock { pub fn consume_fascia( &mut self, fascia: Fascia, + priority: u32, ) -> Result<(), StockError> { self.store_transaction(move |stash, state, index| { let witness_id = fascia.witness_id(); @@ -1242,7 +1243,7 @@ impl Stock { state.update_state::(contract_id, |history| { for transition in bundle.known_transitions.values() { - let witness_anchor = WitnessAnchor::from_mempool(witness_id); + let witness_anchor = WitnessAnchor::from_mempool(witness_id, priority); history.add_transition(transition, witness_anchor); } Ok(()) diff --git a/src/stl/stl.rs b/src/stl/stl.rs index f2b7c38a..986b2775 100644 --- a/src/stl/stl.rs +++ b/src/stl/stl.rs @@ -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:JWQFfoHI-ASiyaQC-W0$vG!m-vBFkbJ3-fJAdVOr-rzKa5yU#weather-toyota-cadet"; + "stl:j4bMNJl$-401lZky-v4WMeak-hrOCZ2O-7kMes7m-MhtQB0E#genetic-joseph-analyze"; fn _rgb_std_stl() -> Result { LibBuilder::new(libname!(LIB_NAME_RGB_STD), tiny_bset! { diff --git a/stl/RGBStd@0.11.0.sta b/stl/RGBStd@0.11.0.sta index c26b21a6..0913cbc2 100644 --- a/stl/RGBStd@0.11.0.sta +++ b/stl/RGBStd@0.11.0.sta @@ -1,19 +1,19 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:JWQFfoHI-ASiyaQC-W0$vG!m-vBFkbJ3-fJAdVOr-rzKa5yU#weather-toyota-cadet +Id: stl:j4bMNJl$-401lZky-v4WMeak-hrOCZ2O-7kMes7m-MhtQB0E#genetic-joseph-analyze Name: RGBStd Dependencies: StrictTypes#century-comrade-chess, + RGB#poetic-tiger-scorpio, AluVM#congo-archive-folio, BPCore#garbo-radius-peru, - RGB#bless-donald-poker, Std#ralph-blue-lucky, CommitVerify#tennis-peace-olympic, Bitcoin#signal-color-cipher -Check-SHA256: 9ebce97a4b4651eb2ea53e93f25d76debaebb55a5dc793423d3927a443cd720c +Check-SHA256: 5d47956e2138e4ed75960f37ed06c72ec761311eb1c45e9408a499da5740c606 -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 -WwNHy;1`;g;tK3LeCSypf&)&5Ew;fgq|cVZm;ZfR<^xhkLdq;2Z-bfLFbqC#o>4E?M+l67UG^w8*<_XZ +22w{tQ*>kpMe3tp+xFv-0Xp&G?S=|}9rRaeU`~uMrbA>C`}q*r3sZD*X=8L$d2nTOP`@?NgdP&?cGMjQ +%Oc3IT93X)=MdMIXnRJ^ee7~l15!sqVsJHoA?4$swuZp1Wc+9AOf`(TIbyKWjTy4WkGaM+1wm|eR!wgn +midRhTh1hu7-!n@1Cr{swqbZoGSd8tmgp<3rE>;CP(yEWWy&lbZ-bfLFbqC#o>4E?M+l67UG^w8*<_XZ #%uyqCj(P-WZ}`>96CYQxM)es+421}!Q~o5fc_fP)zRw7=FYk8VUzOX>?<6X>JDvL2PwaO$GoG1gEwF5PXV6FZDLo1#Vec_~kix7WfVQ #Sd|CM9$^|Ole|m@1Z8)ymjIKNK5;L!8FkfGTe+FK;UUh9M-4n+}vRYOle|MX>?_hf2s0TH8C&EH;|vtDTYgh)4~t7}WW`YoMQ(L%R$+2! VQzGDn938Qb#DiI%LhXtBc@pg0t!L7$2{bU&sPXOO(dS=5LRJwX<=@3Np5CuQ)O*QWc?UbbJ9Xwr}~3w v^yxa@v}v^+kiGSR2X#8M$tG2GZIy9X>V>;VRC6_vj93RHP;Wm9=`bY*QR01rWKV`y)3Wn@BiZe(m_a|8nc26SO?a%FS?1p)$Z9+vrsy<5&Clo)5) -@&l6UwYFh+Ofu5^ik9drt)+8X1Pb;^kcqrN>J=(17*>vH+sNfO>T@W!FHOn$!h0|RvZm7D7n+yi3hX<4 -=vg0v15So5w!tr?&z8cM|9xBL;kH10;mxDeK6AemMgKpTLeB_FFJSRdS6BpI8#0ag0tIhya%FS?1p)$Z +@&l6UwYFh+Ofu5^ik9drt)+8X1Pb;^kcqrN>J=(17*>vH+sNfO>T@W!FHOn$!h0|RP`@?NgdP&?cGMjQ +%Oc3IT93X)=MdMIXnRJ^ee7~l;kH10;mxDeK6AemMgKpTLeB_FFJSRdS6BpI8#0ag0tIhya%FS?1p)$Z 9+vrsy<5&Clo)5)@&l6UwYFh+Ofu5^ik9drt)+8l=4M8LTC~&#`$$#8Iy^W^m+EyXg*jJBgp@?C1dX`@ -vZm7D7n+yi3hX<4=vg0v15So5w!tr?&z8cM|9xBL;kH10;mxDeK6AemMgKpTLeB_FFJSRdS6BpI8#0ag +P`@?NgdP&?cGMjQ%Oc3IT93X)=MdMIXnRJ^ee7~l;kH10;mxDeK6AemMgKpTLeB_FFJSRdS6BpI8#0ag 0|sPobz*E~00smMbYXCEWpqJqV`y)30&gCc`G>t*&Lor=XWH@ulIpd#VR%e3()@~+=qs(Ib6Nxn_DPV5 -yg=#|Dl8aQj%nM-^pquSs#J}PKGVE!7rrG -mcp0+eOuQ&j?B{VDV5_SOi`hGL88QZ*X#DbU|)oXm4@?ZyuKUhrL_QB$OCu +yg=#|Dl8aQj%nM-9un+!)Ex)QBFL~>kG@9d5Z9Mz +dq&QE>~d1!wm^L0&7;&lbH5Zt|38>Q&j?B{VDV5_SOi`hGL88QZ*X#DbU|)oXm4@?ZyuKUhrL_QB$OCu +VTUE>b16EcuX?V{EC+7E3Kt-Xy#@{fm*cG2Kz`=!#X@TN|)+&DTO&#N`#a|t^|#_3vY08WpqMyZe(m_ -0~_>02g@SJuv(A4M&}UMmuP!N&VB51QsK5heBsTb)IM{+6h;3(m_pA8N-tpXP*+$4UK=uv `3^yDZf|s9bZKvHPGN0j1pxpB0s_h`9&dx0-7pM3Z=O*v*GCA9fL-<|HrZsA`NnJlR3|5d(Tr;j#yqcI 82>cBr>9x-Cs#sheE97?nsOaXHkbei0?I5NZ-bfLFbqC#o>4E?M+l67UG^w8*<_XZ#%uyqCwOUiX0mI# UQqw(qY;tp7Zc6+Qb4G4KrzO(t)@DpIsgCw000000R8{~0000001H8GZf|s9bZKvHa|Hna3IQ=o-yZ}> @@ -130,62 +130,62 @@ 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 -AA$o;hApb7^w`1pxxG -rqbXSnwR1V>^pquSs#J}PKGVE!7rrGmcp0+eOuh5j^*S;F +6`Drj_fC5M7<0km5x1u)VS{2*yf9yYl?p>|ZggdCbW&wz1OxyEb7N>_ZD9Zf0Rm9JHPM6~66|)=9S6%I +$gob7^w`1pxw3 +zctZ>9un+!)Ex)QBFL~>kG@9d5Z9Mzdq&QE>~d0{2rNlD$O59e#ogQsB77jPl+h5j^*S;F 1!-nsV`TsZ0RcP8z<~n@;VY|KA!vt$qMEp^75#kD_Tqj3WXX=Y(#Wl3#tYybrT0anNlc)Z3! -7CPHT_+Dq|&?jn_(4)LjFAF^$MA+G=`wK&FZggdCbW>?(a|Hna3IejG(%=`Gm*NWSJACL_AA$o;hApbs~EXcCXx(drQcb3B`Fx$)^%va$Ar)C7b~v#}{qTDnK1gUZ=~4IPtBJuMnKC +7CPHT_+Dq|&?jn_(4)LjFAF^$MA+G=`wK&FZggdCbW>?(a|Hna3Ib5SHPM6~66|)=9S6%I$gobs~EXcCXx(drQcb3B`Fx$)^%va$Ar)C7b~v#}{qTDnK1gUZ=~4IPtBJuMnKC WEcQ$kD_ZvQg;gh000000000A000000000EMR;^&ZgXjGZb@cgV`T;j2yJg~GYywm# VTK~nd#>C`}q*r8?;yf@?frQ$owe+rTo-{AMw{vgzX#P!9p!}0yp?_0000000000{{R30000002WM<= Vqt7^015&{>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+pGEG0000000000{{R30000003t@9}X=iS2Wo~qH015&{>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7 -Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+pGEG0000000000{{R30000002XbX(Wo2!1 +Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+pGEG0000000000{{R30000002XbX(Wo2!1 00{y`>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+pa{vhfMe3tp+xFv-0Xp&G?S=|}9rRaeU`~uMrbA>C`}q*r 8?;yf@?frQ$owe+rTo-{AMw{vgzX#P!9p!}0yp?_0000000000{{R300000024!+`Z*p@02?9mxqhH(h @@ -195,10 +195,10 @@ H~4Y@00000000300000000009c42H~ZewX>a{vhfMe3tp+xFv-0Xp&G?S=|}9rRaeU`~uMrbA>C`}q*r 1_*6$WNBt;WpV+O9PeeuXILaAA3^JIKdZ3ic!M@6PJV67bl-3#Cg!RLZDn*}WMOn+00{y`>Z4!V_T!KN I`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+p^pquSs#J}PKGVE!7rrGmcp0+eOu->!8D=zpn(&o-7tVW +)Px`L*HDD*8{ol0Eq4Mp_;LbJzctZ>9un+!)Ex)QBFL~>kG@9d5Z9Mzdq&QE>~c~z!8D=zpn(&o-7tVW Ua<1Q{n`|;)uYyv!)~4rGOBq10000000030000000000BVRLh7XKrm}Zgg`13IavyqhH(h^pqu -Ss#J}PKGVE!7rrGmcp0+eOu->!8D=zpn(&o-7tVWUa<1Q{n`|;)uYyv!)~4rGOBq1000000003000000 +3V$8+S7~5Qj4-A{WE1=O5ZN2FSOM~2u5HNtDFUVZ)Px`L*HDD*8{ol0Eq4Mp_;LbJzctZ>9un+!)Ex)Q +BFL~>kG@9d5Z9Mzdq&QE>~c~z!8D=zpn(&o-7tVWUa<1Q{n`|;)uYyv!)~4rGOBq1000000003000000 00009c42H~ZewX>a{vhfMe3tp+xFv-0Xp&G?S=|}9rRaeU`~uMrbA>C`}q*r8?;yf@?frQ$owe+rTo-{ AMw{vgzX#P!9p!}0yp?_0000000000{{R300000024!+`Z*p@02?9mxqhH(hD`aAk5~bZKvH00aU61a5C`WdHyG0R(ezZDjxj0RlzpqhH(hC`}q*r35LOoBKkGaY9#cS7Qj{WgyAGcS>>g~&^g7^pquSs#J}PKGVE!7rrGmcp0+eOu9un+!)Ex)QBFL~>kG@9d5Z9Mzdq&QE>~d1J=zxYC D0L!x4tB5Hm3vFbl?lapNXe%XU~*fKJ0+Y4NoHYVWl3ZO0RRU806-uB2}x#QV`WKgaBKz)2X^pquSs#J}PKGVE -!7rrGmcp0+eOu;~Qq$W5tE;F{pQrXd&=l*`O?@#x{Qdy?T_k!`1dtF1X=Y(#Wl3ZKJIcU;0|?9un+!)Ex)QBFL~>kG@9d +5Z9Mzdq&QE>~d0+Qq$W5tE;F{pQrXd&=l*`O?@#x{Qdy?T_k!`1dtF1X=Y(#Wl3ZKJIcU;0|?p#+${pKVqYC33O>~Wpi|4ZEyepNC<6ZbYWy+bYTDq0lk5UVp0y6#Opn49V(cQc;WdI2QadI6-(bd|-i#!&GYaF>qoh8ar dV?G00{v&KD$)QXhhr5^*YH=BF-=c yOsxg-v9sr000000RI300000000w1pa&K~T00{xZXXT7NJOW`Spw3o_*cmz+=1%_1gm*5-D79nn{HtC7 -00000000300000000009WMy_`Y;SO7asslZ(%=`Gm*NWSJACL_AA$o;hAp +00000000300000000009WMy_`Y;SO7asp7lHPM6~66|)=9S6%I$go bs~EXcCXx(drQcb3B`Fx$)^%va$Ar)C7cFHZE$Q!WCZ~L2LJ#-AOHhPX>#x3$o4Af`kVHyQ&~TYC -SRqgV00000000300000000008b7N>_ZDDj_00{!JrqbXSnwR1V>^pquSs#J}PKGVE!7rrGmcp0+eOu;a +SRqgV00000000300000000008b7N>_ZDDj_00{z6zctZ>9un+!)Ex)QBFL~>kG@9d5Z9Mzdq&QE>~d0M iS7Qcy@o`Ksx-hZyo%1Xyg?u*hB?+UW{Twjef1*%00000000300000000006X=!b6Y;yn!0fbj(2M`|< m3T|4oDcSEr%ah$$XqR+hQ$77qvA$o%>V!Z000000RI300000001I<Z4!V_T!KNI`QJ|h6;Zj @@ -247,26 +247,26 @@ D$lsiICW4a8e$Z2e6I7`3evG=Yh^sO0000000000{{R30000001$23EWpe^W>Z4!V_T!KNI`QJ|h6;Zj lr&gK9B00000 0096000000000VeX=iR>bairNa{vkf;?xyT5z&Ua+M@}mOiDpYxh>^^GknUxTJ!XL#OUcE0frb5ENEw7 &f?o%+)B!ZpG}K!%4G?I4vp$|ttu*CMF0Q*000000RI300000000>QQWNBt;WpV=p2w`G#baG*1bN~o% -c4cyMX=G&q1!ie(VQl{xPGN0jWJYOaY-B-mb7^O8ZDnqBRC#b^1_J_VWCF6L(%=`Gm*NWSJACL_AA$o; -hApKfZ0H=mhJ>?uV;$>KfZ0H=mhJ>?uVC`}q*r8?;yf@?frQ$owe+rTo-{AMw{vgzX#P!9p!}0yp?_2y$g}WpZ|9WCG#Q -5feW*SKg&%h~b$G{NN>LxBDo)YaDXjV8yEYGv>06AuO0fiYoI|8ZKC9(55{UNs2(LOhfb*8wh)9?KU_ -VQpn(MrmbiWJP#%Wo~n6Z*Ek1aAgJq0%>FdvZm7D7n+yi3hX<4=vg0v15So5w!tr?&z8cM|9xBLWOW`w +VQpn(MrmbiWJP#%Wo~n6Z*Ek1aAgJq0%>FdP`@?NgdP&?cGMjQ%Oc3IT93X)=MdMIXnRJ^ee7~lWOW`w sTH9-LlJ`2|Ay5Z(?oEikl{+~pis;@Q*TJ#1a4t%WdcR&qhH(he1kloHngE|MP08BSqsWn@NaWo%?eY;R&=Y*Tb$ -bY)a|aAgJq0%>FdvZm7D7n+yi3hX<4=vg0v15So5w!tr?&z8cM|9xBL)$WoGNrFdP`@?NgdP&?cGMjQ%Oc3IT93X)=MdMIXnRJ^ee7~l)$WoGNre1kloHngE|MP05>8=lWn@NaWo%?kWprUwd2nS00|IGe0Z4!V +1=xWxVN?HcT9qDk5m#O{2>e1kloHngE|MP05>8=lWn@NaWo%?kWprUwd2nS00|IGe0#Ls-(S#ln>~_>0 +2g@SJuv(A4M&}UMmuP!N&VB51Qg!4__}|Wp0vpvv$c&#PW69R$ltr%da5t5w^x+8!q6BVXZDj&Q>Z4!V _T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+pFdvZm7D7n+yi3hX<4=vg0v15So5w!tr?&z8cM -|9xBLG*S<)6P6lYy(#<=BR_>s@(?%#f7ArN-=Rj?7Ns(11a4t%WdcR&qhH(hFdP`@?NgdP&?cGMjQ%Oc3IT93X)=MdMIXnRJ^ +ee7~lG*S<)6P6lYy(#<=BR_>s@(?%#f7ArN-=Rj?7Ns(11a4t%WdcR&qhH(he1kloHngE|MP06;5GoWn@NaWo%?t -VQgh?V|i40aAgJq0%>FdvZm7D7n+yi3hX<4=vg0v15So5w!tr?&z8cM|9xBLM(yUq2ps*m=2xUDT;RqC +VQgh?V|i40aAgJq0%>FdP`@?NgdP&?cGMjQ%Oc3IT93X)=MdMIXnRJ^ee7~lM(yUq2ps*m=2xUDT;RqC gn#@WzFu~@adfH5^@&-|1a4t%WdcR&qhH(he1kloHngE|MP04o+chWn@-ia%o|1bagle0|IGe00035ZeeX@0!8Yh @@ -274,45 +274,46 @@ 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(hioJ -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 -Vr*${WNB_^000O +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 +@z+p~GYywm#VTK~nd#>$v +Yz6}cZDn+5Z)5^*9+vrsy<5&Clo)5)@&l6UwYFh+Ofu5^ik9drt)+7=w-6<{Ze +NoKcy!1~?PoRaGVc5iib0`+VYVk7oBr%DNv+($;q`HHK!gIHa)*%m(-e#9sm3L)b@L&d6G@+l`%qd385 +?K@+fP1(-9sgE>i7rMzqbqHc?X>Md`Zf5`h2m -----END STRICT TYPE LIB----- diff --git a/stl/RGBStd@0.11.0.stl b/stl/RGBStd@0.11.0.stl index 44d4db89973ff4887eb13d8c8166b8df8b3806c2..f6a18a93d7b50a3afe600993a8d6b2156d5d2ec1 100644 GIT binary patch delta 1645 zcmX>-jdAXD#t9}W0sBoaw#W&+DZ3)eep>0ohN%91ZqEg-PtT}!J6HRrD2O@8-Dz^I zqQb-w-N}ry3LB5Umrx+2XYxX6g~?weeTY-oAeBy>LUrjVf(kb;ln!JfsA_VWfWl-W zxg&%XipdkUbMgdvJ;EkU5LB4_Pd=ES!p(&W*^Go${ZTX{tZMRLb^hc(ic2QnQPU>q z&&l3q3X|Q{c?m0=uTeGmow^HQg(R5RP1v+|E()8oG~!tj`fP z&c@~fVMPysS<%OKC1HhTyb6;|?bZ`kxSva5vWop0f(kc(u>Z)&&c@7AQjwW5`Jb2K zWL_r)W~P#g$>;RNCYw4rurL=FlueFzP@MdbU14*nQzTJgJ%ymfljTJeHXm}mNK80; U7)*Zb?oHT8Vp8DdcOJ1!0Neco7ytkO delta 1630 zcmbO`o$>TE#t9~qYZVnHR_Lm1T6XDy_^j!VxZYUTyoi)G^SQ>ZQ-MNr}9h0=jc1XWE=6Hu6J zBzJ_cLNR&5c21rkuSeLV34#if|H%gvRJgfNA)Aq~sy~WmgjG!*tj?eOM{&vIJ8Iel z{W;m&OkuLSIxk^`^EIj_zf*T1tdIl~y9t}-;Ht1WOEZp$xLDxPK-jni9tN9tXh#!~ zgo!fF!Sng%UHT7M30n;G$K>0l0R$Cp_BP`u!gV0yW?8fnG;VSukHY47%kxBppP%(P z!p7OyTp+CI0Wd52*sdh3(2Q4MvZ>vA!V33uDNI(eUqevg<`4EC897*(7+6XwGE*ko zIjKzMbW&hpWGblua$GhacZwt`aHkNoX|lYC!e$Y-i$nx0FwIRi_3$QaBr!>Dvx8?W F6983!H$VUY diff --git a/stl/RGBStd@0.11.0.sty b/stl/RGBStd@0.11.0.sty index 17f40c01..7536786b 100644 --- a/stl/RGBStd@0.11.0.sty +++ b/stl/RGBStd@0.11.0.sty @@ -1,5 +1,5 @@ {- - Id: stl:JWQFfoHI-ASiyaQC-W0$vG!m-vBFkbJ3-fJAdVOr-rzKa5yU#weather-toyota-cadet + Id: stl:j4bMNJl$-401lZky-v4WMeak-hrOCZ2O-7kMes7m-MhtQB0E#genetic-joseph-analyze Name: RGBStd Version: 0.11.0 Description: RGB standard library @@ -28,29 +28,7 @@ import StrictTypes#century-comrade-chess use UnionVariantsSemId#santana-address-pepper use TypeSystem#adrian-boris-sponsor -import AluVM#congo-archive-folio - use Lib#gate-biology-optimal - use LibSite#ultra-grace-message - use IsaName#taboo-olympic-cloud - use LibId#germany-culture-olivia - use IsaSeg#size-shake-olga - use LibSeg#lemon-philips-horse - -import BPCore#garbo-radius-peru - use TapretNodePartner#roger-member-educate - 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 AnchorMerkleProofTapretProof#meter-mobile-appear - use SecretSeal#dollar-iris-wizard - use AnchorMerkleProofOpretProof#prime-salsa-magnet - use BlindSealTxid#media-judge-anita - use TxPtr#italian-july-eddie - -import RGB#bless-donald-poker +import RGB#poetic-tiger-scorpio use ExtensionSchema#active-eddie-empty use BundleId#carmen-farmer-diesel use GlobalValues#pilot-boris-alice @@ -120,6 +98,28 @@ import RGB#bless-donald-poker use RevealedData#olivia-copper-stamp use AssignRevealedValueBlindSealTxid#photo-jump-silicon +import AluVM#congo-archive-folio + use Lib#gate-biology-optimal + use LibSite#ultra-grace-message + use IsaName#taboo-olympic-cloud + use LibId#germany-culture-olivia + use IsaSeg#size-shake-olga + use LibSeg#lemon-philips-horse + +import BPCore#garbo-radius-peru + use TapretNodePartner#roger-member-educate + 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 AnchorMerkleProofTapretProof#meter-mobile-appear + use SecretSeal#dollar-iris-wizard + use AnchorMerkleProofOpretProof#prime-salsa-magnet + use BlindSealTxid#media-judge-anita + use TxPtr#italian-july-eddie + import Std#ralph-blue-lucky use AlphaCaps#picnic-soprano-aurora use AsciiPrintable#ultra-sunset-format From 79915e97e3260cb93a15818f0235d6bba8d35886 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Wed, 24 Jul 2024 14:38:21 +0200 Subject: [PATCH 02/12] stl: add additional RGBStorage stl library --- Cargo.lock | 2 +- src/lib.rs | 2 +- src/persistence/memory.rs | 10 +- src/stl/mod.rs | 5 +- src/stl/stl.rs | 41 +++++- stl/RGBContract@0.11.0.sty | 2 +- stl/RGBStd@0.11.0.sta | 120 +++++++++--------- stl/RGBStd@0.11.0.stl | Bin 19357 -> 19357 bytes stl/RGBStd@0.11.0.sty | 40 +++--- stl/RGBStorage@0.11.0.sta | 208 +++++++++++++++++++++++++++++++ stl/RGBStorage@0.11.0.stl | Bin 0 -> 12114 bytes stl/RGBStorage@0.11.0.sty | 248 +++++++++++++++++++++++++++++++++++++ stl/src/main.rs | 28 ++++- 13 files changed, 612 insertions(+), 94 deletions(-) create mode 100644 stl/RGBStorage@0.11.0.sta create mode 100644 stl/RGBStorage@0.11.0.stl create mode 100644 stl/RGBStorage@0.11.0.sty diff --git a/Cargo.lock b/Cargo.lock index a7081bad..03bbfcdb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -661,7 +661,7 @@ dependencies = [ [[package]] name = "rgb-core" version = "0.11.0-beta.6" -source = "git+https://github.com/RGB-WG/rgb-core?branch=mining#f57448b5d2047fb017f34719f193e673558f49ec" +source = "git+https://github.com/RGB-WG/rgb-core?branch=mining#0f94cc05643b93769466cdd8e74a7a85d4b30a9c" dependencies = [ "aluvm", "amplify", diff --git a/src/lib.rs b/src/lib.rs index 290f5bec..268e982e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -96,7 +96,7 @@ pub use contract::{BundleExt, MergeReveal, MergeRevealError, RevealError, TypedA pub use invoice::{Allocation, Amount, CoinAmount, OwnedFraction, Precision, TokenIndex}; pub use rgb::prelude::*; pub use rgb::rgbasm; -pub use stl::{LIB_NAME_RGB_CONTRACT, LIB_NAME_RGB_STD}; +pub use stl::{LIB_NAME_RGB_CONTRACT, LIB_NAME_RGB_STD, LIB_NAME_RGB_STORAGE}; /// BIP32 derivation index for outputs which may contain assigned RGB state. pub const RGB_NATIVE_DERIVATION_INDEX: u32 = 9; diff --git a/src/persistence/memory.rs b/src/persistence/memory.rs index db73dca1..1543a106 100644 --- a/src/persistence/memory.rs +++ b/src/persistence/memory.rs @@ -52,7 +52,7 @@ use crate::interface::{Iface, IfaceClass, IfaceId, IfaceImpl, IfaceRef}; #[cfg(feature = "fs")] use crate::persistence::fs::FsStored; use crate::resolvers::ResolveHeight; -use crate::LIB_NAME_RGB_STD; +use crate::LIB_NAME_RGB_STORAGE; ////////// // STASH @@ -62,7 +62,7 @@ use crate::LIB_NAME_RGB_STD; #[derive(Getters, Clone, Debug, Default)] #[getter(prefix = "debug_")] #[derive(StrictType, StrictEncode, StrictDecode)] -#[strict_type(lib = LIB_NAME_RGB_STD)] +#[strict_type(lib = LIB_NAME_RGB_STORAGE)] pub struct MemStash { #[strict_type(skip)] dirty: bool, @@ -427,7 +427,7 @@ impl From for StateUpdateError { #[derive(Getters, Clone, Debug, Default)] #[getter(prefix = "debug_")] #[derive(StrictType, StrictEncode, StrictDecode)] -#[strict_type(lib = LIB_NAME_RGB_STD)] +#[strict_type(lib = LIB_NAME_RGB_STORAGE)] pub struct MemState { #[strict_type(skip)] dirty: bool, @@ -518,7 +518,7 @@ impl From for IndexWriteError { #[derive(Clone, Debug, Default)] #[derive(StrictType, StrictEncode, StrictDecode)] -#[strict_type(lib = LIB_NAME_RGB_STD)] +#[strict_type(lib = LIB_NAME_RGB_STORAGE)] #[cfg_attr( feature = "serde", derive(Serialize, Deserialize), @@ -532,7 +532,7 @@ pub struct ContractIndex { #[derive(Getters, Clone, Debug, Default)] #[getter(prefix = "debug_")] #[derive(StrictType, StrictEncode, StrictDecode)] -#[strict_type(lib = LIB_NAME_RGB_STD)] +#[strict_type(lib = LIB_NAME_RGB_STORAGE)] pub struct MemIndex { #[strict_type(skip)] dirty: bool, diff --git a/src/stl/mod.rs b/src/stl/mod.rs index 82bffb6a..e6ef660d 100644 --- a/src/stl/mod.rs +++ b/src/stl/mod.rs @@ -36,6 +36,9 @@ pub use specs::{ }; pub use stl::{ aluvm_stl, bp_core_stl, bp_tx_stl, commit_verify_stl, rgb_contract_stl, rgb_core_stl, - rgb_std_stl, StandardTypes, LIB_ID_RGB, LIB_ID_RGB_CONTRACT, LIB_ID_RGB_STD, + rgb_std_stl, rgb_storage_stl, StandardTypes, LIB_ID_RGB, LIB_ID_RGB_CONTRACT, LIB_ID_RGB_STD, + LIB_ID_RGB_STORAGE, }; + pub const LIB_NAME_RGB_STD: &str = "RGBStd"; +pub const LIB_NAME_RGB_STORAGE: &str = "RGBStorage"; diff --git a/src/stl/stl.rs b/src/stl/stl.rs index 986b2775..6f2799e1 100644 --- a/src/stl/stl.rs +++ b/src/stl/stl.rs @@ -24,6 +24,7 @@ pub use bp::stl::bp_core_stl; #[allow(unused_imports)] pub use commit_verify::stl::{commit_verify_stl, LIB_ID_COMMIT_VERIFY}; use invoice::{Allocation, Amount}; +use rgb::stl::rgb_state_stl; pub use rgb::stl::{aluvm_stl, rgb_core_stl, LIB_ID_RGB}; use strict_types::stl::{std_stl, strict_types_stl}; use strict_types::typesys::SystemBuilder; @@ -31,12 +32,18 @@ use strict_types::{CompileError, LibBuilder, SemId, SymbolicSys, TypeLib, TypeSy use super::{ AssetSpec, BurnMeta, ContractSpec, ContractTerms, Error, IssueMeta, MediaType, - LIB_NAME_RGB_CONTRACT, + LIB_NAME_RGB_CONTRACT, LIB_NAME_RGB_STORAGE, }; use crate::containers::{Contract, Kit, Transfer}; +use crate::persistence::{MemIndex, MemStash, MemState}; use crate::stl::ProofOfReserves; use crate::LIB_NAME_RGB_STD; +/// Strict types id for the library providing standard data types which may be +/// used in RGB smart contracts. +pub const LIB_ID_RGB_STORAGE: &str = + "stl:ZZBpExyg-zYQDRZh-1UZxjsV-VHmDa!K-ykNK3bQ-HOlVbHc#sinatra-sweet-clinic"; + /// Strict types id for the library providing standard data types which may be /// used in RGB smart contracts. pub const LIB_ID_RGB_CONTRACT: &str = @@ -44,7 +51,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:j4bMNJl$-401lZky-v4WMeak-hrOCZ2O-7kMes7m-MhtQB0E#genetic-joseph-analyze"; + "stl:peektHMR-cVHolnW-j$54$lX-GfFsZFk-A0jQBM5-krtTqzc#clinic-couple-ibiza"; fn _rgb_std_stl() -> Result { LibBuilder::new(libname!(LIB_NAME_RGB_STD), tiny_bset! { @@ -79,6 +86,24 @@ fn _rgb_contract_stl() -> Result { .compile() } +fn _rgb_storage_stl() -> Result { + LibBuilder::new(libname!(LIB_NAME_RGB_STORAGE), tiny_bset! { + std_stl().to_dependency(), + strict_types_stl().to_dependency(), + commit_verify_stl().to_dependency(), + bp_tx_stl().to_dependency(), + bp_core_stl().to_dependency(), + aluvm_stl().to_dependency(), + rgb_core_stl().to_dependency(), + rgb_state_stl().to_dependency(), + rgb_std_stl().to_dependency() + }) + .transpile::() + .transpile::() + .transpile::() + .compile() +} + /// Generates strict type library representation of RGB StdLib data types. pub fn rgb_std_stl() -> TypeLib { _rgb_std_stl().expect("invalid strict type RGBStd library") } @@ -88,6 +113,12 @@ pub fn rgb_contract_stl() -> TypeLib { _rgb_contract_stl().expect("invalid strict type RGBContract library") } +/// Generates strict type library providing standard storage for state, contract +/// state and index. +pub fn rgb_storage_stl() -> TypeLib { + _rgb_storage_stl().expect("invalid strict type RGBStorage library") +} + #[derive(Debug)] pub struct StandardTypes(SymbolicSys); @@ -140,4 +171,10 @@ mod test { let lib = rgb_std_stl(); assert_eq!(lib.id().to_string(), LIB_ID_RGB_STD); } + + #[test] + fn storage_lib_id() { + let lib = rgb_storage_stl(); + assert_eq!(lib.id().to_string(), LIB_ID_RGB_STORAGE); + } } diff --git a/stl/RGBContract@0.11.0.sty b/stl/RGBContract@0.11.0.sty index 2c278e5e..54324362 100644 --- a/stl/RGBContract@0.11.0.sty +++ b/stl/RGBContract@0.11.0.sty @@ -4,7 +4,7 @@ Version: 0.11.0 Description: Types for writing RGB contracts and interfaces Author: Dr Maxim Orlovsky - Copyright (C) 2023-2024-2024 LNP/BP Standards Association. All rights reserved. + Copyright (C) 2023-2024 LNP/BP Standards Association. All rights reserved. License: Apache-2.0 -} diff --git a/stl/RGBStd@0.11.0.sta b/stl/RGBStd@0.11.0.sta index 0913cbc2..405990c2 100644 --- a/stl/RGBStd@0.11.0.sta +++ b/stl/RGBStd@0.11.0.sta @@ -1,18 +1,18 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:j4bMNJl$-401lZky-v4WMeak-hrOCZ2O-7kMes7m-MhtQB0E#genetic-joseph-analyze +Id: stl:peektHMR-cVHolnW-j$54$lX-GfFsZFk-A0jQBM5-krtTqzc#clinic-couple-ibiza Name: RGBStd Dependencies: + RGB#diploma-montana-elastic, StrictTypes#century-comrade-chess, - RGB#poetic-tiger-scorpio, AluVM#congo-archive-folio, BPCore#garbo-radius-peru, Std#ralph-blue-lucky, CommitVerify#tennis-peace-olympic, Bitcoin#signal-color-cipher -Check-SHA256: 5d47956e2138e4ed75960f37ed06c72ec761311eb1c45e9408a499da5740c606 +Check-SHA256: 7303acb1af4b72c3fc3acf674f2c43fccbea7535db3882d0c5fb99578079262b -22w{tQ*>kpMe3tp+xFv-0Xp&G?S=|}9rRaeU`~uMrbA>C`}q*r3sZD*X=8L$d2nTOP`@?NgdP&?cGMjQ -%Oc3IT93X)=MdMIXnRJ^ee7~l15!sqVsJHoA?4$swuZp1Wc+9AOf`(TIbyKWjTy4WkGaM+1wm|eR!wgn +22w{tQ*>kp4%IjbPV%^csz6ckvx2)X2S(*${SgyN=74!2gcAK;15!sqMe3tp+xFv-0Xp&G?S=|}9rRae +U`~uMrbA>C`}q*r3sZD*X=8L$d2nTOVsJHoA?4$swuZp1Wc+9AOf`(TIbyKWjTy4WkGaM+1wm|eR!wgn midRhTh1hu7-!n@1Cr{swqbZoGSd8tmgp<3rE>;CP(yEWWy&lbZ-bfLFbqC#o>4E?M+l67UG^w8*<_XZ #%uyqCj(P-WZ}`>96CYQxM)es+421}!Q~o5fc_fP)zRw7=FYk8VUzOX>?<6X>JDvL2PwaO$GoG1gEwF5PXV6FZDLo1#Vec_~kix7WfVQ @@ -113,15 +113,15 @@ z1^xtuG$bzVQpn(MrmbiWOGwxZAoO8A%m*X98W>f2s0TH8C&EH;|vtDTYgh)4~t7}WW`YoMQ(L%R$+2! VQzGDn938Qb#DiI%LhXtBc@pg0t!L7$2{bU&sPXOO(dS=5LRJwX<=@3Np5CuQ)O*QWc?UbbJ9Xwr}~3w v^yxa@v}v^+kiGSR2X#8M$tG2GZIy9X>V>;VRC6_vj93RHP;Wm9=`bY*QR01rWKV`y)3Wn@BiZe(m_a|8nc26SO?a%FS?1p)$Z9+vrsy<5&Clo)5) -@&l6UwYFh+Ofu5^ik9drt)+8X1Pb;^kcqrN>J=(17*>vH+sNfO>T@W!FHOn$!h0|RP`@?NgdP&?cGMjQ -%Oc3IT93X)=MdMIXnRJ^ee7~l;kH10;mxDeK6AemMgKpTLeB_FFJSRdS6BpI8#0ag0tIhya%FS?1p)$Z +@&l6UwYFh+Ofu5^ik9drt)+8X1Pb;^kcqrN>J=(17*>vH+sNfO>T@W!FHOn$!h0|R4%IjbPV%^csz6ck +vx2)X2S(*${SgyN=74!2gcAK;;kH10;mxDeK6AemMgKpTLeB_FFJSRdS6BpI8#0ag0tIhya%FS?1p)$Z 9+vrsy<5&Clo)5)@&l6UwYFh+Ofu5^ik9drt)+8l=4M8LTC~&#`$$#8Iy^W^m+EyXg*jJBgp@?C1dX`@ -P`@?NgdP&?cGMjQ%Oc3IT93X)=MdMIXnRJ^ee7~l;kH10;mxDeK6AemMgKpTLeB_FFJSRdS6BpI8#0ag +4%IjbPV%^csz6ckvx2)X2S(*${SgyN=74!2gcAK;;kH10;mxDeK6AemMgKpTLeB_FFJSRdS6BpI8#0ag 0|sPobz*E~00smMbYXCEWpqJqV`y)30&gCc`G>t*&Lor=XWH@ulIpd#VR%e3()@~+=qs(Ib6Nxn_DPV5 -yg=#|Dl8aQj%nM-9un+!)Ex)QBFL~>kG@9d5Z9Mz -dq&QE>~d1!wm^L0&7;&lbH5Zt|38>Q&j?B{VDV5_SOi`hGL88QZ*X#DbU|)oXm4@?ZyuKUhrL_QB$OCu +yg=#|Dl8aQj%nM-Q&j?B{VDV5_SOi`hGL88QZ*X#DbU|)oXm4@?ZyuKUhrL_QB$OCu +VTUE>b16EcuX?V{EC+7E3Kt-Xy#@{fm*cG2Kz`=!#X@TN|)+&DTO&#N`#a|t^|#_3vY08WpqMyZe(m_ -0#Ls-(S#ln>~_>02g@SJuv(A4M&}UMmuP!N&VB51QsK5heBsTb)IM{+6h;3(m_pA8N-tpXP*+$4UK=uv +0uI$U2~P63fvP}J@w0-vF9$~DV*L>lO6GuhA%qhBUg5SteBsTb)IM{+6h;3(m_pA8N-tpXP*+$4UK=uv `3^yDZf|s9bZKvHPGN0j1pxpB0s_h`9&dx0-7pM3Z=O*v*GCA9fL-<|HrZsA`NnJlR3|5d(Tr;j#yqcI 82>cBr>9x-Cs#sheE97?nsOaXHkbei0?I5NZ-bfLFbqC#o>4E?M+l67UG^w8*<_XZ#%uyqCwOUiX0mI# UQqw(qY;tp7Zc6+Qb4G4KrzO(t)@DpIsgCw000000R8{~0000001H8GZf|s9bZKvHa|Hna3IQ=o-yZ}> @@ -130,62 +130,62 @@ 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 +Wo=;q1pxvM)i?=G^0-W|y2ahx 3nF|Vuawki#7NH?S|Q-Q!u2{b0tIPiVPjm(ZiUQ7;QU9z@vLsQUy3b9HcVYybrT0cSFYzzA^b -6`Drj_fC5M7<0km5x1u)VS{2*yf9yYl?p>|ZggdCbW&wz1OxyEb7N>_ZD9Zf0Rm9JHPM6~66|)=9S6%I -$gob7^w`1pxw3 -zctZ>9un+!)Ex)QBFL~>kG@9d5Z9Mzdq&QE>~d0{2rNlD$O59e#ogQsB77jPl+h5j^*S;F +6`Drj_fC5M7<0km5x1u)VS{2*yf9yYl?p>|ZggdCbW&wz1OxyEb7N>_ZD9Zf0Rj%yI0;VjxPhubQSq~a +yDtYub7^w`1pxvM +)i?=G^0h5j^*S;F 1!-nsV`TsZ0RcP8z<~n@;VY|KA!vt$qMEp^75#kD_Tqj3WXX=Y(#Wl3#tYybrT0anNlc)Z3! -7CPHT_+Dq|&?jn_(4)LjFAF^$MA+G=`wK&FZggdCbW>?(a|Hna3Ib5SHPM6~66|)=9S6%I$gobs~EXcCXx(drQcb3B`Fx$)^%va$Ar)C7b~v#}{qTDnK1gUZ=~4IPtBJuMnKC +7CPHT_+Dq|&?jn_(4)LjFAF^$MA+G=`wK&FZggdCbW>?(a|Hna3IYz*I0;VjxPhubQSq~ayDtYubs~EXcCXx(drQcb3B`Fx$)^%va$Ar)C7b~v#}{qTDnK1gUZ=~4IPtBJuMnKC WEcQ$kD_ZvQg;gh000000000A000000000EMR;^&ZgXjGZb@cgV`T;j2yJg~GYywm# VTK~nd#>C`}q*r8?;yf@?frQ$owe+rTo-{AMw{vgzX#P!9p!}0yp?_0000000000{{R30000002WM<= Vqt7^015&{>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+pGEG0000000000{{R30000003t@9}X=iS2Wo~qH015&{>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7 -Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+pGEG0000000000{{R30000002XbX(Wo2!1 +Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+pGEG0000000000{{R30000002XbX(Wo2!1 00{y`>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+pa{vhfMe3tp+xFv-0Xp&G?S=|}9rRaeU`~uMrbA>C`}q*r 8?;yf@?frQ$owe+rTo-{AMw{vgzX#P!9p!}0yp?_0000000000{{R300000024!+`Z*p@02?9mxqhH(h @@ -195,10 +195,10 @@ H~4Y@00000000300000000009c42H~ZewX>a{vhfMe3tp+xFv-0Xp&G?S=|}9rRaeU`~uMrbA>C`}q*r 1_*6$WNBt;WpV+O9PeeuXILaAA3^JIKdZ3ic!M@6PJV67bl-3#Cg!RLZDn*}WMOn+00{y`>Z4!V_T!KN I`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+p9un+!)Ex)QBFL~>kG@9d5Z9Mzdq&QE>~c~z!8D=zpn(&o-7tVW +)Px`L*HDD*8{ol0Eq4Mp_;Lac)i?=G^09un+!)Ex)Q -BFL~>kG@9d5Z9Mzdq&QE>~c~z!8D=zpn(&o-7tVWUa<1Q{n`|;)uYyv!)~4rGOBq1000000003000000 +3V$8+S7~5Qj4-A{WE1=O5ZN2FSOM~2u5HNtDFUVZ)Px`L*HDD*8{ol0Eq4Mp_;Lac)i?=G^0a{vhfMe3tp+xFv-0Xp&G?S=|}9rRaeU`~uMrbA>C`}q*r8?;yf@?frQ$owe+rTo-{ AMw{vgzX#P!9p!}0yp?_0000000000{{R300000024!+`Z*p@02?9mxqhH(hD`aAk5~bZKvH00aU61a5C`WdHyG0R(ezZDjxj0RlzpqhH(hC`}q*r35LOoBKkGaY9#cS7Qj{WgyAGcS>>g~&^g79un+!)Ex)QBFL~>kG@9d5Z9Mzdq&QE>~d1J=zxYC +0000000000{{R300000031nq9un+!)Ex)QBFL~>kG@9d -5Z9Mzdq&QE>~d0+Qq$W5tE;F{pQrXd&=l*`O?@#x{Qdy?T_k!`1dtF1X=Y(#Wl3ZKJIcU;0|?J)i?=G^0p#+${pKVqYC33O>~Wpi|4ZEyepNC<6ZbYWy+bYTDq0lk5UVp0y6#Opn49V(cQc;WdI2QadI6-(bd|-i#!&GYaF>qoh8ar dV?G00{v&KD$)QXhhr5^*YH=BF-=c yOsxg-v9sr000000RI300000000w1pa&K~T00{xZXXT7NJOW`Spw3o_*cmz+=1%_1gm*5-D79nn{HtC7 -00000000300000000009WMy_`Y;SO7asp7lHPM6~66|)=9S6%I$go +00000000300000000009WMy_`Y;SO7asm$3I0;VjxPhubQSq~ayDtYu bs~EXcCXx(drQcb3B`Fx$)^%va$Ar)C7cFHZE$Q!WCZ~L2LJ#-AOHhPX>#x3$o4Af`kVHyQ&~TYC -SRqgV00000000300000000008b7N>_ZDDj_00{z6zctZ>9un+!)Ex)QBFL~>kG@9d5Z9Mzdq&QE>~d0M +SRqgV00000000300000000008b7N>_ZDDj_00{yP)i?=G^0V!Z000000RI300000001I<Z4!V_T!KNI`QJ|h6;Zj @@ -247,26 +247,26 @@ D$lsiICW4a8e$Z2e6I7`3evG=Yh^sO0000000000{{R30000001$23EWpe^W>Z4!V_T!KNI`QJ|h6;Zj lr&gK9B00000 0096000000000VeX=iR>bairNa{vkf;?xyT5z&Ua+M@}mOiDpYxh>^^GknUxTJ!XL#OUcE0frb5ENEw7 &f?o%+)B!ZpG}K!%4G?I4vp$|ttu*CMF0Q*000000RI300000000>QQWNBt;WpV=p2w`G#baG*1bN~o% -c4cyMX=G&q1!ie(VQl{xPGN0jWJYOaY-B-mb7^O8ZDnqBRC#b^1_J_VWCBpXHPM6~66|)=9S6%I$go;$>KfZ0H=mhJ>?uVKfZ0H=mhJ>?uVC`}q*r8?;yf@?frQ$owe+rTo-{AMw{vgzX#P!9p!}0yp?_2y$g}WpZ|9WCG#Q -5feW*SKg&%h~b$G{NN>LxBDo)YaDXjV8yEYGv>06AuO0fiYoI|8ZKC9(55{UNs2(LOhfb*8wh)9?KU_ -VQpn(MrmbiWJP#%Wo~n6Z*Ek1aAgJq0%>FdP`@?NgdP&?cGMjQ%Oc3IT93X)=MdMIXnRJ^ee7~lWOW`w +VQpn(MrmbiWJP#%Wo~n6Z*Ek1aAgJq0%>Fd4%IjbPV%^csz6ckvx2)X2S(*${SgyN=74!2gcAK;WOW`w sTH9-LlJ`2|Ay5Z(?oEikl{+~pis;@Q*TJ#1a4t%WdcR&qhH(he1kloHngE|MP08BSqsWn@NaWo%?eY;R&=Y*Tb$ -bY)a|aAgJq0%>FdP`@?NgdP&?cGMjQ%Oc3IT93X)=MdMIXnRJ^ee7~l)$WoGNrFd4%IjbPV%^csz6ckvx2)X2S(*${SgyN=74!2gcAK;)$WoGNre1kloHngE|MP05>8=lWn@NaWo%?kWprUwd2nS00|IGe0#Ls-(S#ln>~_>0 -2g@SJuv(A4M&}UMmuP!N&VB51Qg!4__}|Wp0vpvv$c&#PW69R$ltr%da5t5w^x+8!q6BVXZDj&Q>Z4!V +1=xWxVN?HcT9qDk5m#O{2>e1kloHngE|MP05>8=lWn@NaWo%?kWprUwd2nS00|IGe0uI$U2~P63fvP}J +@w0-vF9$~DV*L>lO6GuhA%qhBUUlS6_}|Wp0vpvv$c&#PW69R$ltr%da5t5w^x+8!q6BVXZDj&Q>Z4!V _T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+pFdP`@?NgdP&?cGMjQ%Oc3IT93X)=MdMIXnRJ^ -ee7~lG*S<)6P6lYy(#<=BR_>s@(?%#f7ArN-=Rj?7Ns(11a4t%WdcR&qhH(hFd4%IjbPV%^csz6ckvx2)X2S(*${SgyN=74!2 +gcAK;G*S<)6P6lYy(#<=BR_>s@(?%#f7ArN-=Rj?7Ns(11a4t%WdcR&qhH(he1kloHngE|MP06;5GoWn@NaWo%?t -VQgh?V|i40aAgJq0%>FdP`@?NgdP&?cGMjQ%Oc3IT93X)=MdMIXnRJ^ee7~lM(yUq2ps*m=2xUDT;RqC +VQgh?V|i40aAgJq0%>Fd4%IjbPV%^csz6ckvx2)X2S(*${SgyN=74!2gcAK;M(yUq2ps*m=2xUDT;RqC gn#@WzFu~@adfH5^@&-|1a4t%WdcR&qhH(he1kloHngE|MP04o+chWn@-ia%o|1bagle0|IGe00035ZeeX@0!8Yh @@ -287,10 +287,10 @@ VQzFzVQpmq1pxv@>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI&hQW&>`ZdvNB=ndTz*X~v;Uq>` 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{bOrPeW=$` -IKP*ssSB}HE2Rl^X>Db5bYX39002k_V{&C-bZ>G3P`@?NgdP&?cGMjQ%Oc3IT93X)=MdMIXnRJ^ee7~l +IKP*ssSB}HE2Rl^X>Db5bYX39002k_V{&C-bZ>G34%IjbPV%^csz6ckvx2)X2S(*${SgyN=74!2gcAK; w&;L{94K`ndk%K5+?9Jv$dw7jc}U5p5@2#$kUJ%u3t?_V?G015$E_7Pp|Zd*4POSky84?DA0 %Jd;JpJb=vumIvFO*=CI)c=pRa5$-awG%hvwbbHb-(903OpfIVCMlINkQ($C0000000000{{R3000000 -2vlWqZE0>{Yz6@Zb7f&{a{vhfP`@?NgdP&?cGMjQ%Oc3IT93X)=MdMIXnRJ^ee7~l?t8o+`-uphG|cdB +2vlWqZE0>{Yz6@Zb7f&{a{vhf4%IjbPV%^csz6ckvx2)X2S(*${SgyN=74!2gcAK;?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;!;B4E?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#Ls-(S#ln>~_>02g@SJuv(A4M&}UMmuP!N -&VB51QZ~Ufq57bK6Q|uUfIMEX^1}Vv6tLB!)|10-o)0prc>n+a000000RI300000000wDpaCLNZ015&{ +`}q*r8?;yf@?frQ$owe+rTo-{AMw{vgzX#P!9p!}0yp?_0uI$U2~P63fvP}J@w0-vF9$~DV*L>lO6Guh +A%qhBUN*rrq57bK6Q|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+pGEG +4%IjbPV%^csz6ckvx2)X2S(*${SgyN=74!2gcAK;Ho-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+pGEG0000000000{{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 diff --git a/stl/RGBStd@0.11.0.stl b/stl/RGBStd@0.11.0.stl index f6a18a93d7b50a3afe600993a8d6b2156d5d2ec1..478109100866298e3327bc5b854d1144711e5a22 100644 GIT binary patch delta 1605 zcmbO`opJ7TMjf^wcciIYX}3PR+tZ}Kg2G!Yk&3-f}q0WfAYZu6>ct6$Yvz0>W`usVO5g{tMe!SQCu?l zj+!<>e@^x`Q<&_o&P!O~e2uEf@6=rgD06~SDz0LTEa2?3FSr)AXjho!aqp&&N@;njY z=VyJ6uyHmv7YHkQ0L+R$wkruMG~-p6Y-+cju)_UZ3X@gr*AP^=`GdUyQIRo)piz_M eMHDuRxLqV763LB)-iBqU99Ys*#=7rLMOaxU; zP7_d=Y$SJtutG6;!gfxcAg@Q*qzQrwlmE#F6I8glP$8RQ zcW6fwk%Wmd&cXBf=3V*^SqWPV^vC4erU3*MZuU0gC&G0g<7Qd35;SgdBag!7c+2xd zgrA@FIl{)-*jym2=m9V*`q-`{tk8^CVX~>+dcq3#b16(#v0p<_;pPwa21G^16oN)g gmKRajEaG;Nh>!y&s>!Av-h_=LCQWU2@Qh^w09*O*?*IS* diff --git a/stl/RGBStd@0.11.0.sty b/stl/RGBStd@0.11.0.sty index 7536786b..0f5bdcfc 100644 --- a/stl/RGBStd@0.11.0.sty +++ b/stl/RGBStd@0.11.0.sty @@ -1,34 +1,17 @@ {- - Id: stl:j4bMNJl$-401lZky-v4WMeak-hrOCZ2O-7kMes7m-MhtQB0E#genetic-joseph-analyze + Id: stl:peektHMR-cVHolnW-j$54$lX-GfFsZFk-A0jQBM5-krtTqzc#clinic-couple-ibiza Name: RGBStd Version: 0.11.0 Description: RGB standard library Author: Dr Maxim Orlovsky - Copyright (C) 2023-2024-2024 LNP/BP Standards Association. All rights reserved. + Copyright (C) 2023-2024 LNP/BP Standards Association. All rights reserved. License: Apache-2.0 -} @context typelib RGBStd -import StrictTypes#century-comrade-chess - use VariantName#theory-austin-before - use FieldName#present-flute-herman - use Primitive#deliver-arrow-boxer - use TySemId#popcorn-super-young - use FieldSemId#spiral-road-marco - use TypeName#edgar-carol-mystery - use UnnamedFieldsSemId#freedom-degree-gregory - use SemId#logic-absorb-hilton - use Variant#humor-regard-promise - use Sizing#courage-alien-salon - use NamedFieldsSemId#solar-salad-smoke - use EnumVariants#dispute-natasha-vega - use VariantInfoSemId#museum-edward-mirror - use UnionVariantsSemId#santana-address-pepper - use TypeSystem#adrian-boris-sponsor - -import RGB#poetic-tiger-scorpio +import RGB#diploma-montana-elastic use ExtensionSchema#active-eddie-empty use BundleId#carmen-farmer-diesel use GlobalValues#pilot-boris-alice @@ -98,6 +81,23 @@ import RGB#poetic-tiger-scorpio use RevealedData#olivia-copper-stamp use AssignRevealedValueBlindSealTxid#photo-jump-silicon +import StrictTypes#century-comrade-chess + use VariantName#theory-austin-before + use FieldName#present-flute-herman + use Primitive#deliver-arrow-boxer + use TySemId#popcorn-super-young + use FieldSemId#spiral-road-marco + use TypeName#edgar-carol-mystery + use UnnamedFieldsSemId#freedom-degree-gregory + use SemId#logic-absorb-hilton + use Variant#humor-regard-promise + use Sizing#courage-alien-salon + use NamedFieldsSemId#solar-salad-smoke + use EnumVariants#dispute-natasha-vega + use VariantInfoSemId#museum-edward-mirror + use UnionVariantsSemId#santana-address-pepper + use TypeSystem#adrian-boris-sponsor + import AluVM#congo-archive-folio use Lib#gate-biology-optimal use LibSite#ultra-grace-message diff --git a/stl/RGBStorage@0.11.0.sta b/stl/RGBStorage@0.11.0.sta new file mode 100644 index 00000000..7f270122 --- /dev/null +++ b/stl/RGBStorage@0.11.0.sta @@ -0,0 +1,208 @@ +-----BEGIN STRICT TYPE LIB----- +Id: stl:ZZBpExyg-zYQDRZh-1UZxjsV-VHmDa!K-ykNK3bQ-HOlVbHc#sinatra-sweet-clinic +Name: RGBStorage +Dependencies: + RGB#diploma-montana-elastic, + StrictTypes#century-comrade-chess, + RGBState#icon-passage-bonanza, + AluVM#congo-archive-folio, + BPCore#garbo-radius-peru, + RGBStd#clinic-couple-ibiza, + Std#ralph-blue-lucky, + CommitVerify#tennis-peace-olympic, + Bitcoin#signal-color-cipher +Check-SHA256: 6838c7410dd9885ef881b0af5c72365d6a81affa390145e93175a0efd162c483 + +3Q|WxQ*>`~VP|Ct4%IjbPV%^csz6ckvx2)X2S(*${SgyN=74!2gcAK;15!sqMe3tp+xFv-0Xp&G?S=|} +9rRaeU`~uMrbA>C`}q*r3sZD*X=8L$d2nTOUS2#4vyl1NjMA5#i(xNnkxdFye7)QWlvQI4GQQDD2vSEv +Q*>c;WnyqOe<9`Lptgpr6F_xjAC6(~TLj#*ewiHU&X!byiJp9+vrsy<5&Clo)5)@&l6UwYFh+ +Ofu5^ik9drt)+7YLQq3*a%H9Gq_lGpaZ%`&b))~DKb3Kx7RE)84I@AkIg-0mt2YKxM?zC{WXdcaZ-bfL +FbqC#o>4E?M+l67UG^w8*<_XZ#%uyqCj(P-WZ}`>96CYQxM)es+421}!Q~o5fc_fP)zRw7=FYk8VUzOX>?<6X>JJxL2PwaO$GoG1gEwF +5PXV6FZDLo1#Vec_~kix7WfVQ#Sd|CM9$^|Ole|m@1Z8)ymjIKNK5;L!8FkfGTe+FK;UUh9M-4n+}vRY +Ole|MX>?_hT7_z0LJs9vI3^Q`9-kMwahgh8>BYhA> +cyMfKV`+3#WnpYocxhx0wjY>38tto&d&=eDF1HXRxo%|^+Itiop&gxXSvq){{YhrG +f57_P)SQy*22EvjXm4aVKVmL%Q_{#Gkvz+H9iKg9-*)mSRaq_gMnjYqO>G4cRAF#(Wpq+$XJ~Xna$#;` +XhtWfE>N`F8f<{_M@^MEhcVy#omh=bI-rl&{j_4Y)eb^zX>MdwWnpYocu;h5M^4XN(CAD)cag{3QuryWpq$-Z*OK?mf%5n?HDW%5cU2uZ?<6X>Jq%0U2$DDaiKPL`@Y=jhu|Vo)3+Q0$Mw;ks-!CQm`I} +1yf~lPHzeskk?c43YBIb6Fc=IN+pl}OUT^`C!`zX1ig-;MydoD@qdC-Hdlhx3aZBNPbr@aHF*SPB$t~%I3sYlqX>fExd30rSF}tql +go$^>um>@6G0l?pFt#Zz&53{9y57aQ#OZ(83shlnPH$voNMUnmHQF5&IUsJk-Q1+ZJ%=&s@|&mHbl*M5 +f*>4D7PYw?2uyEdYgB1%WjJ*Nu}gdoMr}u)7e{?0bR>WH17z$yORD!eAooFZYY9_nXH#QxX>fF3tl4el +KTgFI*|CjhfZ7VH>n$b={WmS6z+ej~gaaD&)?_rinzLQ&_n0fy*Yd +yZ9}hJM#rpcu#e7m-W{MLar(^k|jH+P94s~ljFZW({ZtfbA~le%!q<(1XE#jbDdR_th)Kl;F~x`_=5>? +(>Td5ZgsqT;~+(zt2h~^9tT%xbZ%vHbEASn^UK%K(4i9Ajp1M~R@C@!4#dQE#lUD;OiKi1Rs>XdX=JE; +#(89COl4taR%LR&{2u&fr5XKX +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 +Y*Tb$bY?j2hN@!NP)tgb_zc;Wm98lWo=>Kρ +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 +#=h2RwFCkV)i?=G^05%bR49 +t5yk`^qQ9d0000000030|Nj6000008O=WFUbYXL71`P;vV`yb!;-c-;uXb!>v*u#RTR@N|4s<<3s6Ey0&i$8~x{Nsgre00000000300000000006 +X=Y(#Wpe-u0;T7qv~v-0QRtR+qyL^im2saI#zl|~BR~^5lDku@H#^F}fddHPE2~=}XorO3wsWOd*yR8% +b;g^;wLfB`aRR01q_lGpaZ%`&b))~DKb3Kx7RE)84I@AkIg-0mt2a5v8a{pyIM27foOFHbufC9*xQ=a* +L`qQ5aG5b!Ay5DS000000093000000000MPWo~72Wpe-u0uI$U2~P63fvP}J@w0-vF9$~DV*L>lO6Guh +A%qhBUY`goNjk^^qPoT1+zTRnAg`3vXv9d*8d@RXy~6c6G6D|OI0;VjxPhubQSq~ayDtYu!-yn60lO6GuhA%qhBUITlRwLKbzE(ciwC3nrXLGTEzPUiqvVS}~6O1lO6GuhA%qhBUeOsz&Y*v--zjUllx0#iGfnkz +5*^MQ6A8z^6$))3vH$=8000000RR90{{R30010<#bZ%vHb7gY?3IYz*I0;VjxPhubQSq~ayDtYu!;%&e-~k=n*?EC13_Efz{78l#`qW2t}!0cu>!&Y2j4>0000000030|Ns900000BVRUq1 +V`yzjuaWwz{ +0000000960{{R30000Vfd2nS@d2@7SZ30E=qhH(h&PZdlOljoA7|k;k>s6qoa5|8f~g8=WMyu2X>@62a{vkg4%IjbPV%^csz6ckvx2)X2S(*${SgyN +=74!2gcAK;w&;L{94K`ndk%K5+?9Jv$dw7jc}U5p5@2#$kUJ%u0;T7qv~v-0QRtR+qyL^im2saI#zl|~ +BR~^5lDku@H=^KK)X}ib9i^%gOs*8bY}uR&S59aNAMwsm_ykY{pa1{>000000RR600000000eAlVsiir +0%CAAe<9`Lptgpr6F_xjAC6(~TLj#*ewiHm5LE0xkJm$nc4yMWR2J-cc#Q6SofWC)gp7L6!Sc +3IbwqHGd)Hlr +&gK9B000000096000000000DYX=if)3Ie6)q_lGpaZ%`&b))~DKb3Kx7RE)84I@AkIg-0mt2g4*6;Kh; +hPv9L38+j;K}xwT<$*JN%D`Il^nAqV=^+B8=cKfA5phxImUW~5o!UOOvDqlqa0000000030{{R3000008O=WFUbYXO51_1|XX>)XMa(Ms> +0uI$U2~P63fvP}J@w0-vF9$~DV*L>lO6GuhA%qhBUY`goNjk^^qPoT1+zTRnAg`3vXv9d*8d@RXy~6c6 +G6G&+JPWgs`Phuomz|4YFKUrZ3R8T&+zFIbV+=CB(MtA}YLb;1+l3>_YW;&H2XX#JJbY16COHBLIj?f1 +*8Kng000000093000000000 + +-----END STRICT TYPE LIB----- + diff --git a/stl/RGBStorage@0.11.0.stl b/stl/RGBStorage@0.11.0.stl new file mode 100644 index 0000000000000000000000000000000000000000..af0e970e7c1e2b1f3720f78eb0a6bb05d87190cc GIT binary patch literal 12114 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 + Copyright (C) 2023-2024 LNP/BP Standards Association. All rights reserved. + License: Apache-2.0 +-} + +@context +typelib RGBStorage + +import RGB#diploma-montana-elastic + use ExtensionSchema#active-eddie-empty + use BundleId#carmen-farmer-diesel + use AssignmentWitness#camilla-bison-chant + use GlobalValues#pilot-boris-alice + use MetaValue#split-package-recycle + use InputMap#octavia-north-gram + use GenesisSchema#iron-forbid-hamlet + use OutputAssignmentVoidState#concept-private-garlic + use AltLayer1Set#flute-flex-bottle + use OwnedStateSchema#python-snake-capsule + use AssetTags#anita-nice-deliver + use AssignmentsBlindSealTxid#telecom-right-visible + use VoidState#email-snow-safari + use DataState#short-noise-postal + use TransitionType#picture-reflex-brigade + use Occurrences#source-olga-mirage + use AssignVoidStateBlindSealTxPtr#profit-granite-fuji + use MediaType#isabel-heaven-north + use ValencyType#aloha-dublin-brush + use PedersenCommitment#pupil-scale-jerome + use ConcealedFungible#story-shrink-aloha + use OutputAssignmentRevealedData#spoon-info-snow + use AssignRevealedDataBlindSealTxid#fantasy-monica-jump + use ExtensionType#apropos-scoop-viva + use Schema#junior-remote-jordan + use RevealedAttach#before-bravo-partner + use RevealedFungible#origin-iris-insect + use ConcealedData#ivan-tripod-young + use MetaType#quebec-mission-quota + use TransitionSchema#jumbo-matrix-normal + use AssignRevealedDataBlindSealTxPtr#ritual-license-arcade + use XChainBlindSealTxid#dynamic-life-brown + use AttachId#factor-hair-everest + use BlindingFactor#animal-plume-minus + use AssignmentType#secret-penguin-limit + use XChainTxid#liquid-river-absorb + use XChainBlindSealTxPtr#senator-limbo-raymond + use Opout#yoga-samba-karma + use AssignVoidStateBlindSealTxid#senior-beyond-cement + use SchemaId#ramirez-patron-simon + use OpId#picnic-single-gloria + use ContractId#uniform-welcome-papa + use AssignmentsBlindSealTxPtr#canyon-eternal-optimal + use XChainPubWitness#order-nominal-gloria + use TypedAssignsBlindSealTxid#pogo-social-idea + use FungibleState#guide-poker-coconut + use Inputs#herman-liberal-galaxy + use TypedAssignsBlindSealTxPtr#flipper-marble-plate + use OutputAssignmentRevealedValue#farmer-giraffe-norway + use Identity#smart-pioneer-nominal + use OutputAssignmentRevealedAttach#mentor-crimson-sunset + use AltLayer1#edison-survive-nitro + use AssignRevealedAttachBlindSealTxid#cobalt-eddie-resume + use AssetTag#slang-amber-club + use Extension#emotion-quality-society + use XChainExplicitSealTxid#acid-nepal-melon + use Input#actor-minus-multi + use GlobalStateType#yoga-quick-jasmine + use Ffv#pigment-career-hippie + use AssignRevealedValueBlindSealTxPtr#cuba-needle-salami + use XChainSecretSeal#alex-griffin-left + use Valencies#light-letter-comet + use GlobalState#stadium-barcode-bazaar + use AssignRevealedAttachBlindSealTxPtr#karma-podium-melon + use GlobalStateSchema#connect-ricardo-lava + use Redeemed#mile-lady-perfect + use TransitionBundle#adios-legend-everest + use Transition#reform-sofia-point + use Genesis#element-gondola-buffalo + use Metadata#member-nobody-imitate + use FungibleType#matrix-optimal-sinatra + use ConcealedAttach#meter-arizona-albino + use RevealedData#olivia-copper-stamp + use AssignRevealedValueBlindSealTxid#photo-jump-silicon + +import StrictTypes#century-comrade-chess + use VariantName#theory-austin-before + use FieldName#present-flute-herman + use Primitive#deliver-arrow-boxer + use TySemId#popcorn-super-young + use FieldSemId#spiral-road-marco + use TypeName#edgar-carol-mystery + use UnnamedFieldsSemId#freedom-degree-gregory + use SemId#logic-absorb-hilton + use Variant#humor-regard-promise + use Sizing#courage-alien-salon + use NamedFieldsSemId#solar-salad-smoke + use EnumVariants#dispute-natasha-vega + use VariantInfoSemId#museum-edward-mirror + use UnionVariantsSemId#santana-address-pepper + use TypeSystem#adrian-boris-sponsor + +import RGBState#icon-passage-bonanza + use WitnessPos#snow-local-tonight + use GlobalOrd#natural-lunar-arizona + use WitnessAnchor#scoop-scoop-cadet + use WitnessOrd#chief-digital-vitamin + use ContractHistory#amazon-plaster-harmony + +import AluVM#congo-archive-folio + use Lib#gate-biology-optimal + use LibSite#ultra-grace-message + use IsaName#taboo-olympic-cloud + use LibId#germany-culture-olivia + use IsaSeg#size-shake-olga + use LibSeg#lemon-philips-horse + +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 AnchorMerkleBlockTapretProof#poem-serpent-broken + use Method#bali-boris-plasma + use TapretRightBranch#miracle-patriot-touch + use BlindSealTxPtr#fortune-iron-salmon + use OpretProof#good-village-flex + use AnchorMerkleBlockOpretProof#gentle-gate-page + use SecretSeal#dollar-iris-wizard + use BlindSealTxid#media-judge-anita + use TxPtr#italian-july-eddie + +import RGBStd#clinic-couple-ibiza + use ContentRef#polo-ramirez-parker + use SigBlob#insect-cello-avalon + use PubWitness#novel-camilla-tokyo + use AnnotationName#domino-waiter-orlando + use TransitionIface#axiom-parker-pyramid + use NamedFieldTransitionType#express-brush-desire + use ExtensionIface#model-ramirez-mentor + use Iface#violin-student-system + use IfaceId#nova-cola-carbon + use ValencyIface#buzzer-holiday-fiber + use Annotations#spend-linda-romeo + use AssignIface#fractal-baker-outside + use VerNo#textile-next-stretch + use NamedFieldValencyType#invest-apollo-inca + use ImplId#seminar-data-table + use SupplSub#canoe-denmark-short + use SealWitness#bicycle-polite-brother + use Supplement#caviar-zebra-precise + use SchemaIfaces#europe-nina-gopher + use SupplId#pilot-claudia-minute + use NamedFieldExtensionType#tuna-archer-melon + use AnchorSet#shadow-dominic-pencil + use NamedFieldGlobalStateType#museum-ohio-arizona + use GenesisIface#rocket-paradox-press + use IfaceImpl#permit-learn-samba + use ContentSigs#oval-sister-triton + use SupplItem#jargon-orchid-forget + use Modifier#saturn-escort-jordan + use NamedFieldAssignmentType#origin-caramel-flipper + use TrustLevel#cobra-script-albino + use NamedFieldMetaType#prefix-carmen-artist + use NamedVariantu8#star-pilgrim-pilgrim + use GlobalIface#concert-combat-charm + use SupplMap#sailor-observe-bundle + use OwnedIface#delphi-athlete-fresh + use ContentId#scarlet-portal-office + +import Std#ralph-blue-lucky + use AlphaCaps#picnic-soprano-aurora + use AsciiPrintable#ultra-sunset-format + use Bool#oxygen-complex-duet + use U5#orbit-graph-sonic + use AlphaNumDash#sponsor-snake-nice + use AlphaCapsNum#aladdin-zebra-marble + use AlphaNumLodash#percent-bingo-caesar + use AlphaCapsLodash#duet-hammer-labor + use AlphaSmallLodash#pioneer-eagle-spell + +import CommitVerify#tennis-peace-olympic + use ProtocolId#shadow-eclipse-program + use Message#druid-blitz-rover + use MerkleHash#horse-popcorn-bundle + use MerkleBlock#pegasus-delta-eddie + use ReservedBytes1#origin-roger-relax + use ReservedBytes2#florida-libra-circus + use TreeNode#kansas-scarlet-ricardo + use ReservedBytes4#young-goblin-academy + use ReservedBytes8#rudolf-tape-adrian + +import Bitcoin#signal-color-cipher + use SeqNo#copper-verbal-ingrid + use TxIn#slang-cherry-gizmo + use Vout#brush-gloria-heroic + use ScriptBytes#equator-cockpit-gong + use TapNodeHash#paprika-amanda-hunter + use LockTime#lobster-liberal-jump + use SigScript#neptune-spiral-sample + use LeafScript#bison-doctor-oscar + use TxOut#aspect-eddie-message + use Sats#metro-picasso-roger + use Witness#engine-daniel-magnum + use Txid#shallow-light-reverse + use TxVer#nepal-symbol-uniform + use InternalPk#habitat-paprika-oliver + use LeafVer#benefit-carbon-africa + use ScriptPubkey#second-lobster-philips + use ByteStr#royal-anatomy-june + use Tx#radar-salon-page + use Outpoint#logo-alamo-madam + use XOnlyPk#clever-swim-carpet + + +@mnemonic(carol-salute-aroma) +data ContractIndex : publicOpouts {RGB.Opout ^ ..0xffffff}, outpointOpouts {RGB.XChainExplicitSealTxid -> ^ ..0xffffff {RGB.Opout ^ ..0xffffff}} + +@mnemonic(flower-unicorn-bazaar) +data MemIndex : opBundleIndex {RGB.OpId -> ^ ..0xffffff RGB.BundleId} + , bundleContractIndex {RGB.BundleId -> ^ ..0xffffff RGB.ContractId} + , bundleWitnessIndex {RGB.BundleId -> ^ ..0xffffff RGB.XChainTxid} + , contractIndex {RGB.ContractId -> ^ ..0xff ContractIndex} + , terminalIndex {RGB.XChainSecretSeal -> ^ ..0xffffff RGB.Opout} + +@mnemonic(cartoon-decide-shadow) +data MemStash : schemata {RGB.SchemaId -> ^ ..0xff RGBStd.SchemaIfaces} + , ifaces {RGBStd.IfaceId -> ^ ..0xff RGBStd.Iface} + , geneses {RGB.ContractId -> ^ ..0xff RGB.Genesis} + , suppl {RGBStd.ContentRef -> ^ ..0xff {RGBStd.Supplement ^ ..0xff}} + , bundles {RGB.BundleId -> ^ ..0xffffffff RGB.TransitionBundle} + , extensions {RGB.OpId -> ^ ..0xffffffff RGB.Extension} + , witnesses {RGB.XChainTxid -> ^ ..0xffffffff RGBStd.SealWitness} + , attachments {RGB.AttachId -> [Byte ^ ..0xffffff]} + , secretSeals {RGB.XChainBlindSealTxPtr ^ ..0xffffff} + , typeSystem StrictTypes.TypeSystem + , identities {RGB.Identity -> RGBStd.TrustLevel} + , libs {AluVM.LibId -> AluVM.Lib} + , sigs {RGBStd.ContentId -> RGBStd.ContentSigs} + +@mnemonic(visitor-italian-escort) +data MemState : history {RGB.ContractId -> ^ ..0xff RGBState.ContractHistory} + + diff --git a/stl/src/main.rs b/stl/src/main.rs index ef706914..ec16efa2 100644 --- a/stl/src/main.rs +++ b/stl/src/main.rs @@ -27,7 +27,7 @@ use commit_verify::CommitmentLayout; use rgbstd::containers::Transfer; use rgbstd::stl::{ aluvm_stl, bp_core_stl, bp_tx_stl, commit_verify_stl, rgb_contract_stl, rgb_core_stl, - rgb_std_stl, + rgb_std_stl, rgb_storage_stl, }; use strict_types::stl::{std_stl, strict_types_stl}; use strict_types::{parse_args, StlFormat, SystemBuilder}; @@ -52,7 +52,7 @@ fn main() { " Description: Types for writing RGB contracts and interfaces Author: Dr Maxim Orlovsky - Copyright (C) 2023-2024-2024 LNP/BP Standards Association. All rights reserved. + Copyright (C) 2023-2024 LNP/BP Standards Association. All rights reserved. License: Apache-2.0", ), ) @@ -74,7 +74,29 @@ fn main() { " Description: RGB standard library Author: Dr Maxim Orlovsky - Copyright (C) 2023-2024-2024 LNP/BP Standards Association. All rights reserved. + Copyright (C) 2023-2024 LNP/BP Standards Association. All rights reserved. + License: Apache-2.0", + ), + ) + .expect("unable to write to the file"); + + let rgb_storage = rgb_storage_stl(); + rgb_storage + .serialize(StlFormat::Binary, Some(&dir), "0.11.0", None) + .expect("unable to write to the file"); + rgb_storage + .serialize(StlFormat::Armored, Some(&dir), "0.11.0", None) + .expect("unable to write to the file"); + rgb_storage + .serialize( + StlFormat::Source, + Some(&dir), + "0.11.0", + Some( + " + Description: RGB storage library + Author: Dr Maxim Orlovsky + Copyright (C) 2023-2024 LNP/BP Standards Association. All rights reserved. License: Apache-2.0", ), ) From a5b96ec9c1dfcb34a6f371fe454e5e4ebb234daa Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Wed, 24 Jul 2024 17:58:37 +0200 Subject: [PATCH 03/12] refactor: state management, introducing witness filtering --- Cargo.lock | 2 +- invoice/src/amount.rs | 4 +- invoice/src/data.rs | 4 +- src/containers/anchors.rs | 5 +- src/containers/consignment.rs | 110 ++--- src/containers/indexed.rs | 6 +- src/containers/mod.rs | 3 +- src/contract/assignments.rs | 139 +++++- src/contract/mod.rs | 2 +- src/interface/builder.rs | 15 +- src/interface/contract.rs | 126 ++--- src/interface/{filters.rs => filter.rs} | 88 +--- src/interface/iface.rs | 4 +- src/interface/mod.rs | 8 +- src/interface/resolver.rs | 9 +- src/lib.rs | 37 -- src/persistence/index.rs | 12 +- src/persistence/memory.rs | 397 ++++++++++++++-- src/persistence/mod.rs | 5 +- src/persistence/stash.rs | 5 +- src/persistence/state.rs | 227 ++++++++- src/persistence/stock.rs | 162 +++---- src/resolvers.rs | 24 +- src/stl/mod.rs | 6 +- src/stl/stl.rs | 14 +- stl/RGBStd@0.11.0.sta | 596 ++++++++++++------------ stl/RGBStd@0.11.0.stl | Bin 19357 -> 19331 bytes stl/RGBStd@0.11.0.sty | 227 ++++----- stl/RGBStorage@0.11.0.sta | 406 ++++++++-------- stl/RGBStorage@0.11.0.stl | Bin 12114 -> 13013 bytes stl/RGBStorage@0.11.0.sty | 265 ++++++----- stl/Transfer.vesper | 60 ++- stl/src/main.rs | 11 +- 33 files changed, 1747 insertions(+), 1232 deletions(-) rename src/interface/{filters.rs => filter.rs} (56%) diff --git a/Cargo.lock b/Cargo.lock index 03bbfcdb..ac5db827 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -661,7 +661,7 @@ dependencies = [ [[package]] name = "rgb-core" version = "0.11.0-beta.6" -source = "git+https://github.com/RGB-WG/rgb-core?branch=mining#0f94cc05643b93769466cdd8e74a7a85d4b30a9c" +source = "git+https://github.com/RGB-WG/rgb-core?branch=mining#c40fd131f4ce9d39e55155b317cc3ceaec052ac0" dependencies = [ "aluvm", "amplify", diff --git a/invoice/src/amount.rs b/invoice/src/amount.rs index 1ac2e689..9007f085 100644 --- a/invoice/src/amount.rs +++ b/invoice/src/amount.rs @@ -27,7 +27,7 @@ use std::num::{ParseIntError, TryFromIntError}; use std::str::FromStr; use bp::Sats; -use rgb::{FungibleState, KnownState, RevealedValue}; +use rgb::{FungibleState, RevealedValue}; #[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use strict_encoding::{StrictDeserialize, StrictSerialize, VariantError}; @@ -62,8 +62,6 @@ pub struct Amount( impl StrictSerialize for Amount {} impl StrictDeserialize for Amount {} -impl KnownState for Amount {} - impl From for Amount { fn from(value: RevealedValue) -> Self { Amount(value.value.as_u64()) } } diff --git a/invoice/src/data.rs b/invoice/src/data.rs index 1a4e3071..7eaa93f7 100644 --- a/invoice/src/data.rs +++ b/invoice/src/data.rs @@ -21,7 +21,7 @@ use std::str::FromStr; -use rgb::{DataState, KnownState, RevealedData}; +use rgb::{DataState, RevealedData}; #[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use strict_encoding::{StrictDeserialize, StrictSerialize}; @@ -156,8 +156,6 @@ impl Allocation { impl StrictSerialize for Allocation {} impl StrictDeserialize for Allocation {} -impl KnownState for Allocation {} - impl From for Allocation { fn from(data: RevealedData) -> Self { Allocation::from_strict_serialized(data.value.into()).expect("invalid allocation data") diff --git a/src/containers/anchors.rs b/src/containers/anchors.rs index b0fad3d3..3a0f3c2f 100644 --- a/src/containers/anchors.rs +++ b/src/containers/anchors.rs @@ -28,9 +28,10 @@ use bp::dbc::tapret::TapretProof; use bp::dbc::{anchor, Anchor}; use bp::{Tx, Txid}; use commit_verify::{mpc, CommitId}; +use rgb::validation::{DbcProof, EAnchor}; use rgb::{ - BundleDisclosure, BundleId, ContractId, DbcProof, DiscloseHash, EAnchor, Operation, Transition, - TransitionBundle, XChain, XWitnessId, + BundleDisclosure, BundleId, ContractId, DiscloseHash, Operation, Transition, TransitionBundle, + XChain, XWitnessId, }; use strict_encoding::StrictDumb; diff --git a/src/containers/consignment.rs b/src/containers/consignment.rs index baab7f4f..63124ec1 100644 --- a/src/containers/consignment.rs +++ b/src/containers/consignment.rs @@ -19,11 +19,11 @@ // See the License for the specific language governing permissions and // limitations under the License. -use std::collections::{BTreeMap, BTreeSet}; +use std::collections::BTreeSet; +use std::fmt; use std::fmt::{Display, Formatter}; use std::ops::Deref; use std::str::FromStr; -use std::{fmt, iter}; use aluvm::library::Lib; use amplify::confinement::{ @@ -35,8 +35,8 @@ use baid64::{Baid64ParseError, DisplayBaid64, FromBaid64Str}; use commit_verify::{CommitEncode, CommitEngine, CommitId, CommitmentId, DigestExt, Sha256}; use rgb::validation::{ResolveWitness, Validator, Validity, Warning, CONSIGNMENT_MAX_LIBS}; use rgb::{ - impl_serde_baid64, validation, AttachId, BundleId, ContractHistory, ContractId, Extension, - Genesis, GraphSeal, Operation, Schema, SchemaId, XChain, + impl_serde_baid64, validation, AttachId, BundleId, ContractId, Extension, Genesis, GraphSeal, + Operation, Schema, SchemaId, XChain, }; use rgbcore::validation::ConsignmentApi; use strict_encoding::{StrictDeserialize, StrictDumb, StrictSerialize}; @@ -47,14 +47,40 @@ use super::{ TerminalDisclose, ASCII_ARMOR_CONSIGNMENT_TYPE, ASCII_ARMOR_CONTRACT, ASCII_ARMOR_IFACE, ASCII_ARMOR_SCHEMA, ASCII_ARMOR_TERMINAL, ASCII_ARMOR_VERSION, }; -use crate::containers::anchors::ToWitnessId; use crate::interface::{Iface, IfaceImpl}; -use crate::resolvers::{ConsignmentResolver, ResolveHeight}; +use crate::resolvers::ConsignmentResolver; use crate::{BundleExt, SecretSeal, LIB_NAME_RGB_STD}; pub type Transfer = Consignment; pub type Contract = Consignment; +pub trait ConsignmentExt { + fn contract_id(&self) -> ContractId; + fn schema_id(&self) -> SchemaId; + fn genesis(&self) -> &Genesis; + fn extensions(&self) -> impl Iterator; + fn bundled_witnesses(&self) -> impl Iterator; +} + +impl ConsignmentExt for &C { + #[inline] + fn contract_id(&self) -> ContractId { (*self).contract_id() } + + #[inline] + fn schema_id(&self) -> SchemaId { (*self).schema_id() } + + #[inline] + fn genesis(&self) -> &Genesis { (*self).genesis() } + + #[inline] + fn extensions(&self) -> impl Iterator { (*self).extensions() } + + #[inline] + fn bundled_witnesses(&self) -> impl Iterator { + (*self).bundled_witnesses() + } +} + /// Interface identifier. /// /// Interface identifier commits to all the interface data. @@ -229,6 +255,23 @@ impl CommitEncode for Consignment { } } +impl ConsignmentExt for Consignment { + #[inline] + fn contract_id(&self) -> ContractId { self.genesis.contract_id() } + + #[inline] + fn schema_id(&self) -> SchemaId { self.schema.schema_id() } + + #[inline] + fn genesis(&self) -> &Genesis { &self.genesis } + + #[inline] + fn extensions(&self) -> impl Iterator { self.extensions.iter() } + + #[inline] + fn bundled_witnesses(&self) -> impl Iterator { self.bundles.iter() } +} + impl Consignment { #[inline] pub fn consignment_id(&self) -> ConsignmentId { self.commit_id() } @@ -236,9 +279,6 @@ impl Consignment { #[inline] pub fn schema_id(&self) -> SchemaId { self.schema.schema_id() } - #[inline] - pub fn contract_id(&self) -> ContractId { self.genesis.contract_id() } - pub fn terminal_secrets(&self) -> impl Iterator)> { self.terminals .clone() @@ -255,58 +295,6 @@ impl Consignment { }) } - pub fn update_history( - &self, - history: Option, - resolver: &mut R, - ) -> Result { - let mut history = history.unwrap_or_else(|| { - ContractHistory::with(self.schema_id(), self.contract_id(), &self.genesis) - }); - - let mut extension_idx = self - .extensions - .iter() - .map(Extension::id) - .zip(iter::repeat(false)) - .collect::>(); - let mut ordered_extensions = BTreeMap::new(); - for bundled_witness in &self.bundles { - for bundle in bundled_witness.anchored_bundles.bundles() { - for transition in bundle.known_transitions.values() { - let witness_anchor = - resolver.resolve_height(bundled_witness.pub_witness.to_witness_id())?; - - history.add_transition(transition, witness_anchor); - for (id, used) in &mut extension_idx { - if *used { - continue; - } - for input in &transition.inputs { - if input.prev_out.op == *id { - *used = true; - if let Some(ord) = ordered_extensions.get_mut(id) { - if *ord > witness_anchor { - *ord = witness_anchor; - } - } else { - ordered_extensions.insert(*id, witness_anchor); - } - } - } - } - } - } - } - for extension in &self.extensions { - if let Some(witness_anchor) = ordered_extensions.get(&extension.id()) { - history.add_extension(extension, *witness_anchor); - } - } - - Ok(history) - } - #[must_use] pub fn reveal_bundle_seal(mut self, bundle_id: BundleId, revealed: XChain) -> Self { // We need to clone since ordered set does not allow us to mutate members. diff --git a/src/containers/indexed.rs b/src/containers/indexed.rs index e0213219..d0c7d472 100644 --- a/src/containers/indexed.rs +++ b/src/containers/indexed.rs @@ -24,10 +24,10 @@ use std::ops::Deref; use amplify::confinement::Collection; use commit_verify::Conceal; -use rgb::validation::{ConsignmentApi, Scripts}; +use rgb::validation::{ConsignmentApi, EAnchor, Scripts}; use rgb::{ - BundleId, EAnchor, Extension, Genesis, OpId, OpRef, Operation, Schema, Transition, - TransitionBundle, XChain, XWitnessId, + BundleId, Extension, Genesis, OpId, OpRef, Operation, Schema, Transition, TransitionBundle, + XChain, XWitnessId, }; use strict_types::TypeSystem; diff --git a/src/containers/mod.rs b/src/containers/mod.rs index f4b3c759..d85f0d9f 100644 --- a/src/containers/mod.rs +++ b/src/containers/mod.rs @@ -43,7 +43,8 @@ pub use anchors::{ AnchorSet, AnchoredBundles, BundledWitness, PubWitness, SealWitness, ToWitnessId, XPubWitness, }; pub use consignment::{ - Consignment, ConsignmentId, Contract, Transfer, ValidConsignment, ValidContract, ValidTransfer, + Consignment, ConsignmentExt, ConsignmentId, Contract, Transfer, ValidConsignment, + ValidContract, ValidTransfer, }; pub use disclosure::Disclosure; pub use file::{FileContent, LoadError, UniversalFile}; diff --git a/src/contract/assignments.rs b/src/contract/assignments.rs index fc740e29..c2d7dae7 100644 --- a/src/contract/assignments.rs +++ b/src/contract/assignments.rs @@ -19,12 +19,147 @@ // See the License for the specific language governing permissions and // limitations under the License. +use std::cmp::Ordering; +use std::fmt::Debug; + use amplify::confinement::SmallVec; use commit_verify::Conceal; +use invoice::Amount; +use rgb::vm::AssignmentWitness; use rgb::{ - Assign, AssignAttach, AssignData, AssignFungible, AssignRights, ExposedSeal, ExposedState, - TypedAssigns, XChain, + Assign, AssignAttach, AssignData, AssignFungible, AssignRights, AssignmentType, AttachState, + DataState, ExposedSeal, ExposedState, OpId, Opout, RevealedAttach, RevealedData, RevealedValue, + TypedAssigns, VoidState, XChain, XOutputSeal, XWitnessId, }; +use strict_encoding::{StrictDecode, StrictDumb, StrictEncode}; + +use crate::LIB_NAME_RGB_STD; + +/// Trait used by contract state. Unlike [`ExposedState`] it doesn't allow +/// concealment of the state, i.e. may contain incomplete data without blinding +/// factors, asset tags etc. +pub trait KnownState: Debug + StrictDumb + StrictEncode + StrictDecode + Eq + Clone {} + +impl KnownState for () {} +impl KnownState for VoidState {} +impl KnownState for DataState {} +impl KnownState for Amount {} +impl KnownState for AttachState {} +impl KnownState for RevealedValue {} +impl KnownState for RevealedData {} +impl KnownState for RevealedAttach {} + +#[derive(Copy, Clone, Eq, Debug)] +#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] +#[strict_type(lib = LIB_NAME_RGB_STD)] +#[cfg_attr( + feature = "serde", + derive(Serialize, Deserialize), + serde(crate = "serde_crate", rename_all = "camelCase") +)] +pub struct OutputAssignment { + pub opout: Opout, + pub seal: XOutputSeal, + pub state: State, + pub witness: AssignmentWitness, +} + +impl PartialEq for OutputAssignment { + fn eq(&self, other: &Self) -> bool { + if self.opout == other.opout && + (self.seal != other.seal || + self.witness != other.witness || + self.state != other.state) + { + panic!( + "RGB was provided with an updated operation using different witness transaction. \ + This may happen for instance when some ephemeral state (like a commitment or \ + HTLC transactions in the lightning channels) is added to the stash.\nThis error \ + means the software uses RGB stash in an invalid way and has business logic bug \ + which has to be fixed.\nOperation in stash: {:?}\nNew operation: {:?}\n", + self, other + ) + } + self.opout == other.opout + } +} + +impl PartialOrd for OutputAssignment { + fn partial_cmp(&self, other: &Self) -> Option { Some(self.cmp(other)) } +} + +impl Ord for OutputAssignment { + fn cmp(&self, other: &Self) -> Ordering { + if self == other { + return Ordering::Equal; + } + self.opout.cmp(&other.opout) + } +} + +impl OutputAssignment { + /// # Panics + /// + /// If the processing is done on invalid stash data, the seal is + /// witness-based and the anchor chain doesn't match the seal chain. + pub fn with_witness( + seal: XChain, + witness_id: XWitnessId, + state: State, + opid: OpId, + ty: AssignmentType, + no: u16, + ) -> Self { + OutputAssignment { + opout: Opout::new(opid, ty, no), + seal: seal.try_to_output_seal(witness_id).expect( + "processing contract from unverified/invalid stash: witness seal chain doesn't \ + match anchor's chain", + ), + state, + witness: witness_id.into(), + } + } + + /// # Panics + /// + /// If the processing is done on invalid stash data, the seal is + /// witness-based and the anchor chain doesn't match the seal chain. + pub fn with_no_witness( + seal: XChain, + state: State, + opid: OpId, + ty: AssignmentType, + no: u16, + ) -> Self { + OutputAssignment { + opout: Opout::new(opid, ty, no), + seal: seal.to_output_seal().expect( + "processing contract from unverified/invalid stash: seal must have txid \ + information since it comes from genesis or extension", + ), + state, + witness: AssignmentWitness::Absent, + } + } + + pub fn transmute(self) -> OutputAssignment + where S: From { + OutputAssignment { + opout: self.opout, + seal: self.seal, + state: self.state.into(), + witness: self.witness, + } + } + + pub fn check_witness(&self, filter: impl FnOnce(XWitnessId) -> bool) -> bool { + match self.witness { + AssignmentWitness::Absent => true, + AssignmentWitness::Present(witness_id) => filter(witness_id), + } + } +} pub trait TypedAssignsExt { fn reveal_seal(&mut self, seal: XChain); diff --git a/src/contract/mod.rs b/src/contract/mod.rs index 79644a85..07ac5453 100644 --- a/src/contract/mod.rs +++ b/src/contract/mod.rs @@ -23,6 +23,6 @@ mod assignments; mod bundle; mod merge_reveal; -pub use assignments::TypedAssignsExt; +pub use assignments::{KnownState, OutputAssignment, TypedAssignsExt}; pub use bundle::{BundleExt, RevealError}; pub use merge_reveal::{MergeReveal, MergeRevealError}; diff --git a/src/interface/builder.rs b/src/interface/builder.rs index 8bcbd68c..74659b75 100644 --- a/src/interface/builder.rs +++ b/src/interface/builder.rs @@ -30,17 +30,16 @@ use invoice::{Allocation, Amount}; use rgb::validation::Scripts; use rgb::{ validation, AltLayer1, AltLayer1Set, AssetTag, AssetTags, Assign, AssignmentType, Assignments, - BlindingFactor, ContractId, DataState, ExposedSeal, FungibleType, Genesis, GenesisSeal, - GlobalState, GraphSeal, Identity, Input, Layer1, MetadataError, Opout, OwnedStateSchema, - RevealedAttach, RevealedData, RevealedValue, Schema, Transition, TransitionType, TypedAssigns, - XChain, XOutpoint, + AttachState, BlindingFactor, ContractId, DataState, ExposedSeal, FungibleType, Genesis, + GenesisSeal, GlobalState, GraphSeal, Identity, Input, Layer1, MetadataError, Opout, + OwnedStateSchema, RevealedAttach, RevealedData, RevealedValue, Schema, Transition, + TransitionType, TypedAssigns, XChain, XOutpoint, }; use rgbcore::{GlobalStateSchema, GlobalStateType, MetaType, Metadata, ValencyType}; use strict_encoding::{FieldName, SerializeError, StrictSerialize}; use strict_types::{decode, SemId, TypeSystem}; use crate::containers::{BuilderSeal, ContainerVer, Contract, ValidConsignment}; -use crate::interface::contract::AttachedState; use crate::interface::resolver::DumbResolver; use crate::interface::{Iface, IfaceImpl, TransitionIface}; use crate::persistence::PersistedState; @@ -343,7 +342,7 @@ impl ContractBuilder { mut self, name: impl Into, seal: impl Into>, - attachment: AttachedState, + attachment: AttachState, ) -> Result { let seal = seal.into(); self.check_layer1(seal.layer1())?; @@ -774,7 +773,7 @@ impl TransitionBuilder { mut self, name: impl Into, seal: impl Into>, - attachment: AttachedState, + attachment: AttachState, ) -> Result { self.builder = self.builder.add_attachment(name, seal, attachment)?; Ok(self) @@ -1249,7 +1248,7 @@ impl OperationBuilder { self, name: impl Into, seal: impl Into>, - state: AttachedState, + state: AttachState, ) -> Result { debug_assert!( !self.deterministic, diff --git a/src/interface/contract.rs b/src/interface/contract.rs index 5a76bca2..e4f9fae2 100644 --- a/src/interface/contract.rs +++ b/src/interface/contract.rs @@ -19,22 +19,25 @@ // See the License for the specific language governing permissions and // limitations under the License. +use std::borrow::Borrow; use std::cmp::Ordering; use std::collections::HashMap; use amplify::confinement::{SmallOrdSet, SmallVec}; use invoice::{Allocation, Amount}; +use rgb::vm::AssignmentWitness; use rgb::{ - AssignmentWitness, AttachId, ContractId, ContractState, DataState, KnownState, MediaType, OpId, - OutputAssignment, RevealedAttach, RevealedData, RevealedValue, VoidState, XOutpoint, - XOutputSeal, XWitnessId, + AttachState, ContractId, DataState, OpId, RevealedAttach, RevealedData, RevealedValue, Schema, + VoidState, XOutpoint, XOutputSeal, XWitnessId, }; use strict_encoding::{FieldName, StrictDecode, StrictDumb, StrictEncode}; use strict_types::typify::TypedVal; use strict_types::{decode, StrictVal, TypeSystem}; +use crate::contract::{KnownState, OutputAssignment}; use crate::info::ContractInfo; -use crate::interface::{IfaceImpl, OutpointFilter, WitnessFilter}; +use crate::interface::{IfaceImpl, OutpointFilter}; +use crate::persistence::ContractStateRead; use crate::LIB_NAME_RGB_STD; #[derive(Clone, Eq, PartialEq, Debug, Display, Error, From)] @@ -78,7 +81,7 @@ pub enum AllocatedState { #[from] #[from(RevealedAttach)] #[strict_type(tag = 3)] - Attachment(AttachedState), + Attachment(AttachState), } impl KnownState for AllocatedState {} @@ -87,32 +90,7 @@ pub type OwnedAllocation = OutputAssignment; pub type RightsAllocation = OutputAssignment; pub type FungibleAllocation = OutputAssignment; pub type DataAllocation = OutputAssignment; -pub type AttachAllocation = OutputAssignment; - -#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug, Display)] -#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] -#[strict_type(lib = LIB_NAME_RGB_STD)] -#[display("{id}:{media_type}")] -#[cfg_attr( - feature = "serde", - derive(Serialize, Deserialize), - serde(crate = "serde_crate", rename_all = "camelCase") -)] -pub struct AttachedState { - pub id: AttachId, - pub media_type: MediaType, -} - -impl KnownState for AttachedState {} - -impl From for AttachedState { - fn from(attach: RevealedAttach) -> Self { - AttachedState { - id: attach.id, - media_type: attach.media_type, - } - } -} +pub type AttachAllocation = OutputAssignment; pub trait StateChange: Clone + Eq + StrictDumb + StrictEncode + StrictDecode { type State: KnownState; @@ -232,8 +210,9 @@ impl IfaceOp { /// Contract state is an in-memory structure providing API to read structured /// data from the [`rgb::ContractHistory`]. #[derive(Clone, Eq, PartialEq, Debug)] -pub struct ContractIface { - pub state: ContractState, +pub struct ContractIface { + pub state: S, + pub schema: Schema, pub iface: IfaceImpl, pub types: TypeSystem, pub info: ContractInfo, @@ -241,7 +220,7 @@ pub struct ContractIface { // TODO: Introduce witness checker: additional filter returning only those data // which witnesses are mined -impl ContractIface { +impl ContractIface { pub fn contract_id(&self) -> ContractId { self.state.contract_id() } /// # Panics @@ -254,34 +233,35 @@ impl ContractIface { .iface .global_type(&name) .ok_or(ContractError::FieldNameUnknown(name))?; - let type_schema = self - .state + let global_schema = self .schema .global_types .get(&type_id) .expect("schema doesn't match interface"); - let state = unsafe { self.state.global_unchecked(type_id) }; - let state = state - .into_iter() + let state = self + .state + .global(type_id) + .values() .map(|data| { self.types - .strict_deserialize_type(type_schema.sem_id, data.as_ref()) + .strict_deserialize_type(global_schema.sem_id, data.borrow().as_slice()) .map(TypedVal::unbox) }) - .take(type_schema.max_items as usize) + .take(global_schema.max_items as usize) .collect::, _>>()?; - Ok(SmallVec::try_from_iter(state).expect("same or smaller collection size")) + + Ok(SmallVec::from_collection_unsafe(state)) } - fn extract_state<'c, S, U>( + fn extract_state<'c, A, U>( &'c self, - state: impl IntoIterator> + 'c, + state: impl IntoIterator> + 'c, name: impl Into, filter: impl OutpointFilter + 'c, ) -> Result> + 'c, ContractError> where - S: Clone + KnownState + 'c, - U: From + KnownState + 'c, + A: Clone + KnownState + 'c, + U: From + KnownState + 'c, { let name = name.into(); let type_id = self @@ -293,7 +273,7 @@ impl ContractIface { .filter(move |outp| outp.opout.ty == type_id) .filter(move |outp| filter.include_outpoint(outp.seal)) .cloned() - .map(OutputAssignment::::transmute)) + .map(OutputAssignment::::transmute)) } pub fn rights<'c>( @@ -301,7 +281,7 @@ impl ContractIface { name: impl Into, filter: impl OutpointFilter + 'c, ) -> Result + 'c, ContractError> { - self.extract_state(self.state.rights(), name, filter) + self.extract_state(self.state.rights_all(), name, filter) } pub fn fungible<'c>( @@ -309,7 +289,7 @@ impl ContractIface { name: impl Into, filter: impl OutpointFilter + 'c, ) -> Result + 'c, ContractError> { - self.extract_state(self.state.fungibles(), name, filter) + self.extract_state(self.state.fungible_all(), name, filter) } pub fn data<'c>( @@ -317,7 +297,7 @@ impl ContractIface { name: impl Into, filter: impl OutpointFilter + 'c, ) -> Result + 'c, ContractError> { - self.extract_state(self.state.data(), name, filter) + self.extract_state(self.state.data_all(), name, filter) } pub fn attachments<'c>( @@ -325,7 +305,7 @@ impl ContractIface { name: impl Into, filter: impl OutpointFilter + 'c, ) -> Result + 'c, ContractError> { - self.extract_state(self.state.attach(), name, filter) + self.extract_state(self.state.attach_all(), name, filter) } pub fn allocations<'c>( @@ -347,11 +327,11 @@ impl ContractIface { .map(OutputAssignment::::transmute) } - f(filter, self.state.rights()) + f(filter, self.state.rights_all()) .map(OwnedAllocation::from) - .chain(f(filter, self.state.fungibles()).map(OwnedAllocation::from)) - .chain(f(filter, self.state.data()).map(OwnedAllocation::from)) - .chain(f(filter, self.state.attach()).map(OwnedAllocation::from)) + .chain(f(filter, self.state.fungible_all()).map(OwnedAllocation::from)) + .chain(f(filter, self.state.data_all()).map(OwnedAllocation::from)) + .chain(f(filter, self.state.attach_all()).map(OwnedAllocation::from)) } pub fn outpoint_allocations( @@ -366,27 +346,21 @@ impl ContractIface { &'c self, state: impl IntoIterator> + 'c, allocations: impl Iterator> + 'c, - witness_filter: impl WitnessFilter + Copy, - // resolver: impl WitnessCheck + 'c, ) -> HashMap> where C::State: 'c, { fn f<'a, S, U>( - filter: impl WitnessFilter + 'a, state: impl IntoIterator> + 'a, ) -> impl Iterator> + 'a where S: Clone + KnownState + 'a, U: From + KnownState + 'a, { - state - .into_iter() - .filter(move |outp| filter.include_witness(outp.witness)) - .map(OutputAssignment::::transmute) + state.into_iter().map(OutputAssignment::::transmute) } - let spent = f::<_, C::State>(witness_filter, state).map(OutputAssignment::from); + let spent = f::<_, C::State>(state).map(OutputAssignment::from); let mut ops = HashMap::>::new(); for alloc in spent { let AssignmentWitness::Present(witness_id) = alloc.witness else { @@ -416,68 +390,56 @@ impl ContractIface { pub fn fungible_ops>( &self, name: impl Into, - witness_filter: impl WitnessFilter + Copy, outpoint_filter: impl OutpointFilter + Copy, ) -> Result>, ContractError> { Ok(self.operations( self.state - .fungibles() - .iter() - .cloned() + .fungible_all() + .copied() .map(OutputAssignment::transmute), self.fungible(name, outpoint_filter)?, - witness_filter, )) } pub fn data_ops>( &self, name: impl Into, - witness_filter: impl WitnessFilter + Copy, outpoint_filter: impl OutpointFilter + Copy, ) -> Result>, ContractError> { Ok(self.operations( self.state - .data() - .iter() + .data_all() .cloned() .map(OutputAssignment::transmute), self.data(name, outpoint_filter)?, - witness_filter, )) } pub fn rights_ops>( &self, name: impl Into, - witness_filter: impl WitnessFilter + Copy, outpoint_filter: impl OutpointFilter + Copy, ) -> Result>, ContractError> { Ok(self.operations( self.state - .rights() - .iter() - .cloned() + .rights_all() + .copied() .map(OutputAssignment::transmute), self.rights(name, outpoint_filter)?, - witness_filter, )) } - pub fn attachment_ops>( + pub fn attachment_ops>( &self, name: impl Into, - witness_filter: impl WitnessFilter + Copy, outpoint_filter: impl OutpointFilter + Copy, ) -> Result>, ContractError> { Ok(self.operations( self.state - .attach() - .iter() + .attach_all() .cloned() .map(OutputAssignment::transmute), self.attachments(name, outpoint_filter)?, - witness_filter, )) } } diff --git a/src/interface/filters.rs b/src/interface/filter.rs similarity index 56% rename from src/interface/filters.rs rename to src/interface/filter.rs index 6f0eb2b6..5e802fff 100644 --- a/src/interface/filters.rs +++ b/src/interface/filter.rs @@ -22,11 +22,7 @@ use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet}; use std::ops::Deref; -use rgb::{AssignmentWitness, XOutpoint}; - -pub trait WitnessFilter { - fn include_witness(&self, witness: impl Into) -> bool; -} +use rgb::XOutpoint; pub trait OutpointFilter { fn include_outpoint(&self, outpoint: impl Into) -> bool; @@ -112,85 +108,3 @@ impl OutpointFilter for BTreeMap { self.keys().any(|o| *o == outpoint) } } - -// WitnessFilter - -impl WitnessFilter for FilterIncludeAll { - fn include_witness(&self, _: impl Into) -> bool { true } -} - -impl WitnessFilter for FilterExclude { - fn include_witness(&self, witness: impl Into) -> bool { - !self.0.include_witness(witness.into()) - } -} - -impl WitnessFilter for &T { - fn include_witness(&self, witness: impl Into) -> bool { - (*self).include_witness(witness) - } -} - -impl WitnessFilter for &mut T { - fn include_witness(&self, witness: impl Into) -> bool { - self.deref().include_witness(witness) - } -} - -impl WitnessFilter for Option { - fn include_witness(&self, witness: impl Into) -> bool { - self.as_ref() - .map(|filter| filter.include_witness(witness)) - .unwrap_or(true) - } -} - -impl WitnessFilter for AssignmentWitness { - fn include_witness(&self, witness: impl Into) -> bool { - *self == witness.into() - } -} - -impl WitnessFilter for [AssignmentWitness; LEN] { - fn include_witness(&self, witness: impl Into) -> bool { - self.contains(&witness.into()) - } -} - -impl WitnessFilter for &[AssignmentWitness] { - fn include_witness(&self, witness: impl Into) -> bool { - self.contains(&witness.into()) - } -} - -impl WitnessFilter for Vec { - fn include_witness(&self, witness: impl Into) -> bool { - self.contains(&witness.into()) - } -} - -impl WitnessFilter for HashSet { - fn include_witness(&self, witness: impl Into) -> bool { - self.contains(&witness.into()) - } -} - -impl WitnessFilter for BTreeSet { - fn include_witness(&self, witness: impl Into) -> bool { - self.contains(&witness.into()) - } -} - -impl WitnessFilter for HashMap { - fn include_witness(&self, witness: impl Into) -> bool { - let witness = witness.into(); - self.keys().any(|w| *w == witness) - } -} - -impl WitnessFilter for BTreeMap { - fn include_witness(&self, witness: impl Into) -> bool { - let witness = witness.into(); - self.keys().any(|w| *w == witness) - } -} diff --git a/src/interface/iface.rs b/src/interface/iface.rs index 1c103e88..8d70e5c3 100644 --- a/src/interface/iface.rs +++ b/src/interface/iface.rs @@ -37,7 +37,7 @@ use strict_encoding::{ }; use strict_types::{SemId, SymbolicSys, TypeLib}; -use crate::interface::{ContractIface, IfaceDisplay, IfaceImpl, VerNo}; +use crate::interface::{IfaceDisplay, IfaceImpl, VerNo}; use crate::persistence::SchemaIfaces; use crate::LIB_NAME_RGB_STD; @@ -340,7 +340,7 @@ pub struct TransitionIface { /// The instances implementing this trait are used as wrappers around /// [`ContractIface`] object, allowing a simple API matching the interface class /// requirements. -pub trait IfaceClass: From { +pub trait IfaceClass { const IFACE_NAME: &'static str; const IFACE_IDS: &'static [IfaceId]; diff --git a/src/interface/mod.rs b/src/interface/mod.rs index 0d8210ed..03a613ca 100644 --- a/src/interface/mod.rs +++ b/src/interface/mod.rs @@ -27,18 +27,18 @@ mod iface; mod iimpl; mod contract; mod builder; -mod filters; +mod filter; pub(crate) mod resolver; mod contractum; mod inheritance; pub use builder::{BuilderError, ContractBuilder, TransitionBuilder, TxOutpoint}; pub use contract::{ - AllocatedState, AmountChange, AttachAllocation, AttachedState, ContractError, ContractIface, - DataAllocation, FungibleAllocation, IfaceOp, OwnedAllocation, RightsAllocation, StateChange, + AllocatedState, AmountChange, AttachAllocation, ContractError, ContractIface, DataAllocation, + FungibleAllocation, IfaceOp, OwnedAllocation, RightsAllocation, StateChange, }; pub use contractum::IfaceDisplay; -pub use filters::{FilterExclude, FilterIncludeAll, OutpointFilter, WitnessFilter}; +pub use filter::{FilterExclude, FilterIncludeAll, OutpointFilter}; pub use iface::{ ArgMap, AssignIface, ExtensionIface, GenesisIface, GlobalIface, Iface, IfaceClass, IfaceId, IfaceInconsistency, IfaceRef, Modifier, OpName, OwnedIface, Req, TransitionIface, ValencyIface, diff --git a/src/interface/resolver.rs b/src/interface/resolver.rs index f5cf783e..ffb415e3 100644 --- a/src/interface/resolver.rs +++ b/src/interface/resolver.rs @@ -20,11 +20,12 @@ // limitations under the License. use rgb::validation::{ResolveWitness, WitnessResolverError}; +use rgb::vm::WitnessAnchor; use rgb::XWitnessTx; use strict_encoding::StrictDumb; -use crate::resolvers::ResolveHeight; -use crate::{WitnessAnchor, XWitnessId}; +use crate::resolvers::ResolveWitnessAnchor; +use crate::XWitnessId; pub(crate) struct DumbResolver; @@ -34,8 +35,8 @@ impl ResolveWitness for DumbResolver { } } -impl ResolveHeight for DumbResolver { - fn resolve_height(&mut self, _: XWitnessId) -> Result { +impl ResolveWitnessAnchor for DumbResolver { + fn resolve_witness_anchor(&mut self, _: XWitnessId) -> Result { Ok(WitnessAnchor::strict_dumb()) } } diff --git a/src/lib.rs b/src/lib.rs index 268e982e..2cf25b6e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -30,43 +30,6 @@ )] #![cfg_attr(docsrs, feature(doc_auto_cfg))] -// CORE LIB: -// issue :: Schema, Metadata, {GlobalState}, {Assignments} -> Genesis -// -// STD LIB: -// import :: Stash, (Schema | Interface) -> Stash -// state :: Inventory, ContractId -> ContractState -// interpret :: ContractState, Interface -> InterpretedState -// -// issue :: Schema, State, Interface -> Consignment -- calls `core::issue` -// -- internally -// extract :: Inventory, ContractId, Interface -> Consignment -// -- contract transfer -// -// compose :: Inventory, ContractId, Interface, [Outpoint] -> Consignment -// -- base for state transfer describing existing state -// transfer :: Consignment, (...) -> StateTransition -- prepares transition -// preserve :: Stash, [Outpoint], StateTransition -> [StateTransition] -// -- creates blank state transitions -// consign :: Stash, StateTransition -> Consignment -- extracts history data -// -// reveal :: Consignment, RevealInfo -> Consignment -- removes blinding from -// -- known UTXOs -// validate :: Consignment -> (Validity, ContractUpdate) -// enclose :: Inventory, Disclosure -> Inventory !! -// consume :: Inventory, Consignment -> Inventory !! -- for both transfers and -// -- contracts -// -// endpoints :: Consignment -> [Outpoint] -- used to construct initial PSBT - -// WALLET LIB: -// embed :: Psbt, ContractId -> Psbt -- adds contract information to PSBT -// commit :: Psbt, ContractId, Transition -> Psbt -- adds transition -// -- information to the PSBT -// bundle :: Psbt -> Psbt -- takes individual transitions and bundles them -// finalize :: Psbt -> Psbt -- should be performed by BP; converts individual -// -- commitments into tapret - extern crate core; #[macro_use] extern crate amplify; diff --git a/src/persistence/index.rs b/src/persistence/index.rs index 250a1db9..ffe55bd4 100644 --- a/src/persistence/index.rs +++ b/src/persistence/index.rs @@ -31,7 +31,7 @@ use rgb::{ }; use strict_encoding::SerializeError; -use crate::containers::{BundledWitness, Consignment, ToWitnessId}; +use crate::containers::{BundledWitness, ConsignmentExt, ToWitnessId}; use crate::persistence::StoreTransaction; use crate::SecretSeal; @@ -157,23 +157,23 @@ impl Index

{ #[cfg(feature = "fs")] pub(super) fn as_provider_mut(&mut self) -> &mut P { &mut self.provider } - pub(super) fn index_consignment( + pub(super) fn index_consignment( &mut self, - consignment: &Consignment, + consignment: impl ConsignmentExt, ) -> Result<(), IndexError

> { let contract_id = consignment.contract_id(); self.provider .register_contract(contract_id) .map_err(IndexError::WriteProvider)?; - self.index_genesis(contract_id, &consignment.genesis)?; - for extension in &consignment.extensions { + self.index_genesis(contract_id, consignment.genesis())?; + for extension in consignment.extensions() { self.index_extension(contract_id, extension)?; } for BundledWitness { pub_witness, anchored_bundles, - } in &consignment.bundles + } in consignment.bundled_witnesses() { let witness_id = pub_witness.to_witness_id(); for bundle in anchored_bundles.bundles() { diff --git a/src/persistence/memory.rs b/src/persistence/memory.rs index 1543a106..d4064bb9 100644 --- a/src/persistence/memory.rs +++ b/src/persistence/memory.rs @@ -19,6 +19,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +use std::borrow::Borrow; use std::collections::BTreeSet; use std::convert::Infallible; #[cfg(feature = "fs")] @@ -26,32 +27,35 @@ use std::path::PathBuf; use aluvm::library::{Lib, LibId}; use amplify::confinement::{ - self, Confined, LargeOrdMap, MediumBlob, MediumOrdMap, MediumOrdSet, SmallOrdMap, TinyOrdMap, - TinyOrdSet, + self, Confined, LargeOrdMap, LargeOrdSet, MediumBlob, MediumOrdMap, MediumOrdSet, SmallOrdMap, + TinyOrdMap, TinyOrdSet, }; use bp::dbc::tapret::TapretCommitment; use commit_verify::{CommitId, Conceal}; +use rgb::vm::{ContractState, GlobalOrd, WitnessAnchor}; use rgb::{ - Assign, AssignmentType, AttachId, BundleId, ContractHistory, ContractId, ExposedState, - Extension, Genesis, GenesisSeal, GraphSeal, Identity, OpId, Operation, Opout, Schema, SchemaId, - SecretSeal, TransitionBundle, XChain, XOutputSeal, XWitnessId, + Assign, AssignmentType, Assignments, AssignmentsRef, AttachId, AttachState, BundleId, + ContractId, DataState, ExposedSeal, ExposedState, Extension, FungibleState, Genesis, + GenesisSeal, GlobalStateType, GraphSeal, Identity, OpId, Operation, Opout, RevealedAttach, + RevealedData, RevealedValue, Schema, SchemaId, SecretSeal, Transition, TransitionBundle, + TypedAssigns, VoidState, WitnessOrd, XChain, XOutpoint, XOutputSeal, XWitnessId, }; use strict_encoding::{SerializeError, StrictDeserialize, StrictSerialize}; use strict_types::TypeSystem; use super::{ - ContractIfaceError, IndexInconsistency, IndexProvider, IndexReadError, IndexReadProvider, - IndexWriteError, IndexWriteProvider, SchemaIfaces, StashInconsistency, StashProvider, - StashProviderError, StashReadProvider, StashWriteProvider, StateProvider, StateReadProvider, - StateUpdateError, StateWriteProvider, StoreTransaction, + ContractIfaceError, ContractStateRead, ContractStateWrite, IndexInconsistency, IndexProvider, + IndexReadError, IndexReadProvider, IndexWriteError, IndexWriteProvider, SchemaIfaces, + StashInconsistency, StashProvider, StashProviderError, StashReadProvider, StashWriteProvider, + StateInconsistency, StateProvider, StateReadProvider, StateWriteProvider, StoreTransaction, }; use crate::containers::{ AnchorSet, ContentId, ContentRef, ContentSigs, SealWitness, SigBlob, Supplement, TrustLevel, }; +use crate::contract::{KnownState, OutputAssignment}; use crate::interface::{Iface, IfaceClass, IfaceId, IfaceImpl, IfaceRef}; #[cfg(feature = "fs")] use crate::persistence::fs::FsStored; -use crate::resolvers::ResolveHeight; use crate::LIB_NAME_RGB_STORAGE; ////////// @@ -420,10 +424,6 @@ impl StashWriteProvider for MemStash { // STATE ////////// -impl From for StateUpdateError { - fn from(err: confinement::Error) -> Self { StateUpdateError::Connectivity(err) } -} - #[derive(Getters, Clone, Debug, Default)] #[getter(prefix = "debug_")] #[derive(StrictType, StrictEncode, StrictDecode)] @@ -435,7 +435,8 @@ pub struct MemState { #[strict_type(skip)] filename: PathBuf, - history: TinyOrdMap, + witnesses: LargeOrdMap, + contracts: TinyOrdMap, } impl StrictSerialize for MemState {} @@ -463,43 +464,367 @@ impl StoreTransaction for MemState { impl StateProvider for MemState {} impl StateReadProvider for MemState { - type Error = confinement::Error; + type ContractRead<'a> = MemContractFiltered<'a>; + type Error = StateInconsistency; fn contract_state( &self, contract_id: ContractId, - ) -> Result, Self::Error> { - Ok(self.history.get(&contract_id)) + ) -> Result, Self::Error> { + let unfiltered = self + .contracts + .get(&contract_id) + .ok_or(StateInconsistency::UnknownContract(contract_id))?; + let filter = |witness_id: XWitnessId| match self.witnesses.get(&witness_id) { + None | Some(WitnessOrd::Archived) => false, + Some(WitnessOrd::OffChain { .. } | WitnessOrd::OnChain(_)) => true, + }; + Ok(MemContractFiltered { + filter: Box::new(filter), + unfiltered, + _empty: empty!(), + }) } } impl StateWriteProvider for MemState { + type ContractWrite<'a> = &'a mut MemContract; type Error = SerializeError; - fn create_or_update_state( + fn register_contract( &mut self, + genesis: &Genesis, contract_id: ContractId, - updater: impl FnOnce(Option) -> Result, - ) -> Result<(), StateUpdateError> { - let state = self.history.get(&contract_id); - let updated = - updater(state.cloned()).map_err(|e| StateUpdateError::Resolver(e.to_string()))?; - self.history - .insert(contract_id, updated) - .map_err(|e| StateUpdateError::Connectivity(e.into()))?; - Ok(()) + ) -> Result, Self::Error> { + // This crazy construction is caused by a stupidity of rust borrow checker + let mut contract = if self.contracts.contains_key(&contract_id) { + if let Some(contract) = self.contracts.get_mut(&contract_id) { + contract + } else { + unreachable!(); + } + } else { + self.contracts + .insert(contract_id, MemContract::new(genesis.schema_id, contract_id))?; + self.contracts.get_mut(&contract_id).expect("just inserted") + }; + contract.add_genesis(genesis)?; + Ok(contract) } - fn update_state( + fn update_contract( &mut self, contract_id: ContractId, - mut updater: impl FnMut(&mut ContractHistory) -> Result<(), String>, - ) -> Result<(), StateUpdateError> { - let state = self - .history - .get_mut(&contract_id) - .ok_or(StateUpdateError::UnknownContract(contract_id))?; - updater(state).map_err(|e| StateUpdateError::Resolver(e.to_string()))?; + ) -> Result>, Self::Error> { + Ok(self.contracts.get_mut(&contract_id)) + } +} + +// TODO: Consider uplifting to state module and make it universal for all state +// manager implementations +pub struct MemContractFiltered<'mem> { + filter: Box bool + 'mem>, + unfiltered: &'mem MemContract, + _empty: LargeOrdMap, +} + +/// Contract history accumulates raw data from the contract history, extracted +/// from a series of consignments over the time. It does consensus ordering of +/// the state data, but it doesn't interpret or validates the state against the +/// schema. +/// +/// To access the valid contract state use [`Contract`] APIs. +#[derive(Getters, Clone, Eq, PartialEq, Debug)] +#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] +#[strict_type(lib = LIB_NAME_RGB_STORAGE)] +#[cfg_attr( + feature = "serde", + derive(Serialize, Deserialize), + serde(crate = "serde_crate", rename_all = "camelCase") +)] +pub struct MemContract { + #[getter(as_copy)] + schema_id: SchemaId, + #[getter(as_copy)] + contract_id: ContractId, + #[getter(skip)] + global: TinyOrdMap>, + rights: LargeOrdSet>, + fungibles: LargeOrdSet>, + data: LargeOrdSet>, + attach: LargeOrdSet>, +} + +impl MemContract { + pub fn new(schema_id: SchemaId, contract_id: ContractId) -> Self { + MemContract { + schema_id, + contract_id, + global: empty!(), + rights: empty!(), + fungibles: empty!(), + data: empty!(), + attach: empty!(), + } + } + + fn add_operation(&mut self, op: &impl Operation, witness_anchor: Option) { + let opid = op.id(); + + for (ty, state) in op.globals() { + let map = match self.global.get_mut(ty) { + Some(map) => map, + None => { + // TODO: Do not panic here if we merge without checking against the schema + self.global.insert(*ty, empty!()).expect( + "consensus rules violation: do not add to the state consignments without \ + validation against the schema", + ); + self.global.get_mut(ty).expect("just inserted") + } + }; + for (idx, s) in state.iter().enumerate() { + let idx = idx as u16; + let glob_idx = GlobalOrd { + witness_anchor, + idx, + }; + map.insert(glob_idx, s.clone()) + .expect("contract global state exceeded 2^32 items, which is unrealistic"); + } + } + + // We skip removing of invalidated state for the cases of re-orgs or unmined + // witness transactions committing to the new state. + // TODO: Expose an API to prune historic state by witness txid + /* + // Remove invalidated state + for input in &op.inputs() { + if let Some(o) = self.rights.iter().find(|r| r.opout == input.prev_out) { + let o = o.clone(); // need this b/c of borrow checker + self.rights + .remove(&o) + .expect("collection allows zero elements"); + } + if let Some(o) = self.fungibles.iter().find(|r| r.opout == input.prev_out) { + let o = o.clone(); + self.fungibles + .remove(&o) + .expect("collection allows zero elements"); + } + if let Some(o) = self.data.iter().find(|r| r.opout == input.prev_out) { + let o = o.clone(); + self.data + .remove(&o) + .expect("collection allows zero elements"); + } + if let Some(o) = self.attach.iter().find(|r| r.opout == input.prev_out) { + let o = o.clone(); + self.attach + .remove(&o) + .expect("collection allows zero elements"); + } + } + */ + + let witness_id = witness_anchor.map(|wa| wa.witness_id); + match op.assignments() { + AssignmentsRef::Genesis(assignments) => { + self.add_assignments(witness_id, opid, assignments) + } + AssignmentsRef::Graph(assignments) => { + self.add_assignments(witness_id, opid, assignments) + } + } + } + + fn add_assignments( + &mut self, + witness_id: Option, + opid: OpId, + assignments: &Assignments, + ) { + fn process( + contract_state: &mut LargeOrdSet>, + assignments: &[Assign], + opid: OpId, + ty: AssignmentType, + witness_id: Option, + ) { + for (no, seal, state) in assignments + .iter() + .enumerate() + .filter_map(|(n, a)| a.to_revealed().map(|(seal, state)| (n, seal, state))) + { + let assigned_state = match witness_id { + Some(witness_id) => { + OutputAssignment::with_witness(seal, witness_id, state, opid, ty, no as u16) + } + None => OutputAssignment::with_no_witness(seal, state, opid, ty, no as u16), + }; + contract_state + .push(assigned_state) + .expect("contract state exceeded 2^32 items, which is unrealistic"); + } + } + + for (ty, assignments) in assignments.iter() { + match assignments { + TypedAssigns::Declarative(assignments) => { + process(&mut self.rights, assignments, opid, *ty, witness_id) + } + TypedAssigns::Fungible(assignments) => { + process(&mut self.fungibles, assignments, opid, *ty, witness_id) + } + TypedAssigns::Structured(assignments) => { + process(&mut self.data, assignments, opid, *ty, witness_id) + } + TypedAssigns::Attachment(assignments) => { + process(&mut self.attach, assignments, opid, *ty, witness_id) + } + } + } + } +} + +impl<'mem> ContractState for MemContractFiltered<'mem> { + // TODO: Global state must be filtered! + fn global(&self, ty: GlobalStateType) -> &LargeOrdMap> { + self.unfiltered.global.get(&ty).unwrap_or(&self._empty) + } + + fn rights(&self, outpoint: XOutpoint, ty: AssignmentType) -> u32 { + self.unfiltered + .rights + .iter() + .filter(|assignment| { + assignment.seal.to_outpoint() == outpoint && assignment.opout.ty == ty + }) + .filter(|assignment| assignment.check_witness(&self.filter)) + .count() as u32 + } + + fn fungible( + &self, + outpoint: XOutpoint, + ty: AssignmentType, + ) -> impl DoubleEndedIterator { + self.unfiltered + .fungibles + .iter() + .filter(move |assignment| { + assignment.seal.to_outpoint() == outpoint && assignment.opout.ty == ty + }) + .filter(|assignment| assignment.check_witness(&self.filter)) + .map(|assignment| assignment.state.value) + } + + fn data( + &self, + outpoint: XOutpoint, + ty: AssignmentType, + ) -> impl DoubleEndedIterator> { + self.unfiltered + .data + .iter() + .filter(move |assignment| { + assignment.seal.to_outpoint() == outpoint && assignment.opout.ty == ty + }) + .filter(|assignment| assignment.check_witness(&self.filter)) + .map(|assignment| &assignment.state.value) + } + + fn attach( + &self, + outpoint: XOutpoint, + ty: AssignmentType, + ) -> impl DoubleEndedIterator> { + self.unfiltered + .attach + .iter() + .filter(move |assignment| { + assignment.seal.to_outpoint() == outpoint && assignment.opout.ty == ty + }) + .filter(|assignment| assignment.check_witness(&self.filter)) + .map(|assignment| &assignment.state.file) + } +} + +impl<'mem> ContractStateRead for MemContractFiltered<'mem> { + #[inline] + fn contract_id(&self) -> ContractId { self.unfiltered.contract_id } + + #[inline] + fn schema_id(&self) -> SchemaId { self.unfiltered.schema_id } + + #[inline] + fn rights_all(&self) -> impl Iterator> { + self.unfiltered + .rights + .iter() + .filter(|assignment| assignment.check_witness(&self.filter)) + } + + #[inline] + fn fungible_all(&self) -> impl Iterator> { + self.unfiltered + .fungibles + .iter() + .filter(|assignment| assignment.check_witness(&self.filter)) + } + + #[inline] + fn data_all(&self) -> impl Iterator> { + self.unfiltered + .data + .iter() + .filter(|assignment| assignment.check_witness(&self.filter)) + } + + #[inline] + fn attach_all(&self) -> impl Iterator> { + self.unfiltered + .attach + .iter() + .filter(|assignment| assignment.check_witness(&self.filter)) + } +} + +impl ContractStateWrite for &mut MemContract { + type Error = SerializeError; + + /// # Panics + /// + /// If genesis violates RGB consensus rules and wasn't checked against the + /// schema before adding to the history. + fn add_genesis(&mut self, genesis: &Genesis) -> Result<(), Self::Error> { + self.add_operation(genesis, None); + Ok(()) + } + + /// # Panics + /// + /// If state transition violates RGB consensus rules and wasn't checked + /// against the schema before adding to the history. + fn add_transition( + &mut self, + transition: &Transition, + witness_anchor: WitnessAnchor, + ) -> Result<(), Self::Error> { + self.add_operation(transition, Some(witness_anchor)); + Ok(()) + } + + /// # Panics + /// + /// If state extension violates RGB consensus rules and wasn't checked + /// against the schema before adding to the history. + fn add_extension( + &mut self, + extension: &Extension, + witness_anchor: WitnessAnchor, + ) -> Result<(), Self::Error> { + self.add_operation(extension, Some(witness_anchor)); Ok(()) } } diff --git a/src/persistence/mod.rs b/src/persistence/mod.rs index 3c1421fd..796499a2 100644 --- a/src/persistence/mod.rs +++ b/src/persistence/mod.rs @@ -43,13 +43,14 @@ pub use index::{ Index, IndexError, IndexInconsistency, IndexProvider, IndexReadError, IndexReadProvider, IndexWriteError, IndexWriteProvider, }; -pub use memory::{MemIndex, MemStash, MemState}; +pub use memory::{MemContract, MemIndex, MemStash, MemState}; pub use stash::{ ProviderError as StashProviderError, SchemaIfaces, Stash, StashDataError, StashError, StashInconsistency, StashProvider, StashReadProvider, StashWriteProvider, }; pub use state::{ - PersistedState, StateProvider, StateReadProvider, StateUpdateError, StateWriteProvider, + ContractStateRead, ContractStateWrite, PersistedState, State, StateError, StateInconsistency, + StateProvider, StateReadProvider, StateWriteProvider, }; pub use stock::{ ComposeError, ConsignError, ContractIfaceError, FasciaError, InputError as StockInputError, diff --git a/src/persistence/stash.rs b/src/persistence/stash.rs index dab2c103..32f99a46 100644 --- a/src/persistence/stash.rs +++ b/src/persistence/stash.rs @@ -39,8 +39,8 @@ use strict_types::typesys::UnknownType; use strict_types::TypeSystem; use crate::containers::{ - BundledWitness, Consignment, ContentId, ContentRef, ContentSigs, Kit, SealWitness, SigBlob, - Supplement, TrustLevel, + BundledWitness, Consignment, ConsignmentExt, ContentId, ContentRef, ContentSigs, Kit, + SealWitness, SigBlob, Supplement, TrustLevel, }; use crate::interface::{ ContractBuilder, Iface, IfaceClass, IfaceId, IfaceImpl, IfaceRef, TransitionBuilder, @@ -61,6 +61,7 @@ pub enum StashError { /// /// It may happen due to RGB standard library bug, or indicate internal /// stash inconsistency and compromised stash data storage. + #[display(doc_comments)] Inconsistency(StashInconsistency), /// Errors caused by invalid input arguments. diff --git a/src/persistence/state.rs b/src/persistence/state.rs index 95a94849..2f2e2556 100644 --- a/src/persistence/state.rs +++ b/src/persistence/state.rs @@ -19,37 +19,61 @@ // See the License for the specific language governing permissions and // limitations under the License. +use std::collections::BTreeMap; use std::error::Error; use std::fmt::Debug; +use std::iter; use invoice::Amount; -use rgb::{AssetTag, BlindingFactor, ContractHistory, ContractId, DataState}; +use rgb::vm::{ContractState, WitnessAnchor}; +use rgb::{ + AssetTag, AttachState, BlindingFactor, ContractId, DataState, Extension, Genesis, Operation, + RevealedAttach, RevealedData, RevealedValue, SchemaId, Transition, TransitionBundle, VoidState, + XWitnessId, +}; -use crate::interface::AttachedState; +use crate::containers::{ConsignmentExt, ToWitnessId}; +use crate::contract::OutputAssignment; use crate::persistence::StoreTransaction; -use crate::resolvers::ResolveHeight; +use crate::resolvers::ResolveWitnessAnchor; + +#[derive(Clone, PartialEq, Eq, Debug, Display, Error, From)] +#[display(inner)] +pub enum StateError { + /// Connectivity errors which may be recoverable and temporary. + ReadProvider(

::Error), + + /// Connectivity errors which may be recoverable and temporary. + WriteProvider(

::Error), + + /// witness {0} can't be resolved: {1} + #[display(doc_comments)] + Resolver(XWitnessId, String), -#[derive(Clone, PartialEq, Eq, Debug, Display, Error)] -#[display(doc_comments)] -pub enum StateUpdateError { - /// unable to resolve witness. Details: - /// /// {0} - Resolver(String), + /// + /// It may happen due to RGB standard library bug, or indicate internal + /// stash inconsistency and compromised stash data storage. + #[from] + #[display(doc_comments)] + Inconsistency(StateInconsistency), +} +#[derive(Clone, PartialEq, Eq, Debug, Display, Error)] +#[display(doc_comments)] +pub enum StateInconsistency { /// contract state {0} is not known. UnknownContract(ContractId), - - #[display(inner)] - Connectivity(E), } #[derive(Clone, Eq, PartialEq, Debug, Hash)] pub enum PersistedState { Void, Amount(Amount, BlindingFactor, AssetTag), + // TODO: Use RevealedData Data(DataState, u128), - Attachment(AttachedState, u64), + // TODO: Use RevealedAttach + Attachment(AttachState, u64), } impl PersistedState { @@ -63,29 +87,192 @@ impl PersistedState { } } +#[derive(Clone, Debug)] +pub struct State { + provider: P, +} + +impl Default for State

+where P: Default +{ + fn default() -> Self { + Self { + provider: default!(), + } + } +} + +impl State

{ + pub(super) fn new(provider: P) -> Self { Self { provider } } + + #[doc(hidden)] + pub fn as_provider(&self) -> &P { &self.provider } + + #[doc(hidden)] + pub(super) fn as_provider_mut(&mut self) -> &mut P { &mut self.provider } + + #[inline] + pub fn contract_state( + &self, + contract_id: ContractId, + ) -> Result, StateError

> { + self.provider + .contract_state(contract_id) + .map_err(StateError::ReadProvider) + } + + pub fn update_from_bundle( + &mut self, + contract_id: ContractId, + bundle: &TransitionBundle, + witness_id: XWitnessId, + mut resolver: R, + ) -> Result<(), StateError

> { + let mut updater = self + .as_provider_mut() + .update_contract(contract_id) + .map_err(StateError::WriteProvider)? + .ok_or(StateInconsistency::UnknownContract(contract_id))?; + for transition in bundle.known_transitions.values() { + let witness_anchor = resolver + .resolve_witness_anchor(witness_id) + .map_err(|e| StateError::Resolver(witness_id, e))?; + updater + .add_transition(transition, witness_anchor) + .map_err(StateError::WriteProvider)?; + } + Ok(()) + } + + pub fn update_from_consignment( + &mut self, + consignment: impl ConsignmentExt, + mut resolver: R, + ) -> Result<(), StateError

> { + let mut state = self + .as_provider_mut() + .register_contract(consignment.genesis(), consignment.contract_id()) + .map_err(StateError::WriteProvider)?; + let mut extension_idx = consignment + .extensions() + .map(Extension::id) + .zip(iter::repeat(false)) + .collect::>(); + let mut ordered_extensions = BTreeMap::new(); + for bundled_witness in consignment.bundled_witnesses() { + for bundle in bundled_witness.anchored_bundles.bundles() { + for transition in bundle.known_transitions.values() { + let witness_id = bundled_witness.pub_witness.to_witness_id(); + let witness_anchor = resolver + .resolve_witness_anchor(witness_id) + .map_err(|e| StateError::Resolver(witness_id, e))?; + + state + .add_transition(transition, witness_anchor) + .map_err(StateError::WriteProvider)?; + for (id, used) in &mut extension_idx { + if *used { + continue; + } + for input in &transition.inputs { + if input.prev_out.op == *id { + *used = true; + if let Some(ord) = ordered_extensions.get_mut(id) { + if *ord > witness_anchor { + *ord = witness_anchor; + } + } else { + ordered_extensions.insert(*id, witness_anchor); + } + } + } + } + } + } + } + for extension in consignment.extensions() { + if let Some(witness_anchor) = ordered_extensions.get(&extension.id()) { + state + .add_extension(extension, *witness_anchor) + .map_err(StateError::WriteProvider)?; + } + } + + Ok(()) + } +} + +impl StoreTransaction for State

{ + type TransactionErr = StateError

; + + fn begin_transaction(&mut self) -> Result<(), Self::TransactionErr> { + self.provider + .begin_transaction() + .map_err(StateError::WriteProvider) + } + + fn commit_transaction(&mut self) -> Result<(), Self::TransactionErr> { + self.provider + .commit_transaction() + .map_err(StateError::WriteProvider) + } + + fn rollback_transaction(&mut self) { self.provider.rollback_transaction() } +} + pub trait StateProvider: Debug + StateReadProvider + StateWriteProvider {} pub trait StateReadProvider { + type ContractRead<'a>: ContractStateRead + where Self: 'a; type Error: Clone + Eq + Error; fn contract_state( &self, contract_id: ContractId, - ) -> Result, Self::Error>; + ) -> Result, Self::Error>; } pub trait StateWriteProvider: StoreTransaction { + type ContractWrite<'a>: ContractStateWrite + where Self: 'a; type Error: Clone + Eq + Error; - fn create_or_update_state( + fn register_contract( &mut self, + genesis: &Genesis, contract_id: ContractId, - updater: impl FnOnce(Option) -> Result, - ) -> Result<(), StateUpdateError>; + ) -> Result, Self::Error>; - fn update_state( + fn update_contract( &mut self, contract_id: ContractId, - updater: impl FnMut(&mut ContractHistory) -> Result<(), String>, - ) -> Result<(), StateUpdateError>; + ) -> Result>, Self::Error>; +} + +pub trait ContractStateRead: ContractState { + fn contract_id(&self) -> ContractId; + fn schema_id(&self) -> SchemaId; + fn rights_all(&self) -> impl Iterator>; + fn fungible_all(&self) -> impl Iterator>; + fn data_all(&self) -> impl Iterator>; + fn attach_all(&self) -> impl Iterator>; +} + +pub trait ContractStateWrite { + type Error: Clone + Eq + Error; + + fn add_genesis(&mut self, genesis: &Genesis) -> Result<(), Self::Error>; + + fn add_transition( + &mut self, + transition: &Transition, + witness_anchor: WitnessAnchor, + ) -> Result<(), Self::Error>; + + fn add_extension( + &mut self, + extension: &Extension, + witness_anchor: WitnessAnchor, + ) -> Result<(), Self::Error>; } diff --git a/src/persistence/stock.rs b/src/persistence/stock.rs index 10579e2a..872c8fa0 100644 --- a/src/persistence/stock.rs +++ b/src/persistence/stock.rs @@ -33,18 +33,19 @@ use bp::Vout; use chrono::Utc; use commit_verify::Conceal; use invoice::{Amount, Beneficiary, InvoiceState, NonFungible, RgbInvoice}; +use rgb::validation::{DbcProof, EAnchor}; use rgb::{ - validation, AssignmentType, BlindingFactor, BundleId, ContractHistory, ContractId, - ContractState, DbcProof, EAnchor, GraphSeal, Identity, OpId, Operation, Opout, SchemaId, - SecretSeal, Transition, WitnessAnchor, XChain, XOutpoint, XOutputSeal, XWitnessId, + validation, AssignmentType, BlindingFactor, BundleId, ContractId, GraphSeal, Identity, OpId, + Operation, Opout, SchemaId, SecretSeal, Transition, XChain, XOutpoint, XOutputSeal, XWitnessId, }; use strict_encoding::FieldName; use super::{ - Index, IndexError, IndexInconsistency, IndexProvider, IndexReadProvider, IndexWriteProvider, - MemIndex, MemStash, MemState, PersistedState, SchemaIfaces, Stash, StashDataError, StashError, - StashInconsistency, StashProvider, StashReadProvider, StashWriteProvider, StateProvider, - StateReadProvider, StateUpdateError, StateWriteProvider, StoreTransaction, + ContractStateRead, Index, IndexError, IndexInconsistency, IndexProvider, IndexReadProvider, + IndexWriteProvider, MemIndex, MemStash, MemState, PersistedState, SchemaIfaces, Stash, + StashDataError, StashError, StashInconsistency, StashProvider, StashReadProvider, + StashWriteProvider, State, StateError, StateInconsistency, StateProvider, StateReadProvider, + StateWriteProvider, StoreTransaction, }; use crate::containers::{ AnchorSet, AnchoredBundles, Batch, BuilderSeal, BundledWitness, Consignment, ContainerVer, @@ -53,12 +54,11 @@ use crate::containers::{ ValidKit, ValidTransfer, VelocityHint, SUPPL_ANNOT_VELOCITY, }; use crate::info::{ContractInfo, IfaceInfo, SchemaInfo}; -use crate::interface::resolver::DumbResolver; use crate::interface::{ BuilderError, ContractBuilder, ContractIface, Iface, IfaceClass, IfaceId, IfaceRef, TransitionBuilder, }; -use crate::resolvers::ResolveHeight; +use crate::resolvers::ResolveWitnessAnchor; use crate::{MergeRevealError, RevealError}; pub type ContractAssignments = HashMap>; @@ -94,7 +94,7 @@ pub enum StockError< /// /// It may happen due to RGB standard library bug, or indicate internal /// stash inconsistency and compromised stash data storage. - StateInconsistency(ContractId), + StateInconsistency(StateInconsistency), #[from] #[display(doc_comments)] @@ -106,6 +106,9 @@ pub enum StockError< #[from] StashData(StashDataError), + + /// witness {0} can't be resolved: {1} + WitnessUnresolved(XWitnessId, String), } impl From> @@ -121,26 +124,26 @@ impl From From> +impl From> for StockError { - fn from(err: IndexError

) -> Self { + fn from(err: StateError) -> Self { match err { - IndexError::ReadProvider(err) => Self::IndexRead(err), - IndexError::WriteProvider(err) => Self::IndexWrite(err), - IndexError::Inconsistency(e) => Self::IndexInconsistency(e), + StateError::ReadProvider(err) => Self::StateRead(err), + StateError::WriteProvider(err) => Self::StateWrite(err), + StateError::Inconsistency(e) => Self::StateInconsistency(e), + StateError::Resolver(id, e) => Self::WitnessUnresolved(id, e), } } } - -impl - From::Error>> for StockError +impl From> + for StockError { - fn from(err: StateUpdateError<::Error>) -> Self { + fn from(err: IndexError

) -> Self { match err { - StateUpdateError::Resolver(err) => Self::Resolver(err), - StateUpdateError::Connectivity(err) => Self::StateWrite(err), - StateUpdateError::UnknownContract(err) => Self::StateInconsistency(err), + IndexError::ReadProvider(err) => Self::IndexRead(err), + IndexError::WriteProvider(err) => Self::IndexWrite(err), + IndexError::Inconsistency(e) => Self::IndexInconsistency(e), } } } @@ -307,6 +310,7 @@ macro_rules! stock_err_conv { StockError::StashInconsistency(e) => StockError::StashInconsistency(e), StockError::StateInconsistency(e) => StockError::StateInconsistency(e), StockError::IndexInconsistency(e) => StockError::IndexInconsistency(e), + StockError::WitnessUnresolved(id, e) => StockError::WitnessUnresolved(id, e), } } } @@ -349,7 +353,7 @@ pub struct Stock< P: IndexProvider = MemIndex, > { stash: Stash, - state: H, + state: State, index: Index

, } @@ -432,7 +436,7 @@ mod fs { let mut filename = path.to_owned(); filename.push("state.dat"); - self.state.set_filename(filename); + self.state.as_provider_mut().set_filename(filename); let mut filename = path.to_owned(); filename.push("index.dat"); @@ -453,7 +457,7 @@ impl Stock { pub fn with(stash_provider: S, state_provider: H, index_provider: P) -> Self { Stock { stash: Stash::new(stash_provider), - state: state_provider, + state: State::new(state_provider), index: Index::new(index_provider), } } @@ -461,7 +465,7 @@ impl Stock { #[doc(hidden)] pub fn as_stash_provider(&self) -> &S { self.stash.as_provider() } #[doc(hidden)] - pub fn as_state_provider(&self) -> &H { &self.state } + pub fn as_state_provider(&self) -> &H { self.state.as_provider() } #[doc(hidden)] pub fn as_index_provider(&self) -> &P { self.index.as_provider() } @@ -498,7 +502,8 @@ impl Stock { pub fn contracts_by<'a, C: IfaceClass + 'a>( &'a self, - ) -> Result + 'a, StockError> { + ) -> Result + 'a, StockError> + where C: From>> { Ok(self.stash.geneses_by::()?.filter_map(|genesis| { self.contract_iface_class::(genesis.contract_id()) .as_ref() @@ -508,7 +513,7 @@ impl Stock { } /// Iterates over ids of all contract assigning state to the provided set of - /// witness outputs. + /// output seals. pub fn contracts_assigning( &self, outputs: impl IntoIterator>, @@ -523,45 +528,39 @@ impl Stock { fn contract_raw( &self, contract_id: ContractId, - ) -> Result<(&SchemaIfaces, &ContractHistory, ContractInfo), StockError> { - let history = self - .state - .contract_state(contract_id) - .map_err(StockError::StateRead)? - .ok_or(StockError::StateInconsistency(contract_id))?; - let schema_id = history.schema_id(); + ) -> Result<(&SchemaIfaces, H::ContractRead<'_>, ContractInfo), StockError> { + let state = self.state.contract_state(contract_id)?; + let schema_id = state.schema_id(); let schema_ifaces = self.stash.schema(schema_id)?; let info = ContractInfo::with(self.stash.genesis(contract_id)?); - Ok((schema_ifaces, history, info)) + Ok((schema_ifaces, state, info)) } pub fn contract_state( &self, contract_id: ContractId, - ) -> Result> { - let (schema_ifaces, history, _) = self.contract_raw(contract_id)?; - Ok(ContractState { - schema: schema_ifaces.schema.clone(), - history: history.clone(), - }) + ) -> Result, StockError> { + self.state + .contract_state(contract_id) + .map_err(StockError::from) } - pub fn contract_iface_class( - &self, + pub fn contract_iface_class<'a, C: IfaceClass>( + &'a self, contract_id: ContractId, - ) -> Result> { - let (schema_ifaces, history, info) = self.contract_raw(contract_id)?; + ) -> Result> + where + C: From>>, + { + let (schema_ifaces, state, info) = self.contract_raw(contract_id)?; let iimpl = self.stash.impl_for::(schema_ifaces)?; let iface = self.stash.iface(iimpl.iface_id)?; let (types, _) = self.stash.extract(&schema_ifaces.schema, [iface])?; - let state = ContractState { - schema: schema_ifaces.schema.clone(), - history: history.clone(), - }; Ok(ContractIface { state, + schema: schema_ifaces.schema.clone(), iface: iimpl.clone(), types, info, @@ -574,8 +573,8 @@ impl Stock { &self, contract_id: ContractId, iface: impl Into, - ) -> Result> { - let (schema_ifaces, history, info) = self.contract_raw(contract_id)?; + ) -> Result>, StockError> { + let (schema_ifaces, state, info) = self.contract_raw(contract_id)?; let iface = self.stash.iface(iface)?; let iface_id = iface.iface_id(); @@ -585,12 +584,9 @@ impl Stock { let (types, _) = self.stash.extract(&schema_ifaces.schema, [iface])?; - let state = ContractState { - schema: schema_ifaces.schema.clone(), - history: history.clone(), - }; Ok(ContractIface { state, + schema: schema_ifaces.schema.clone(), iface: iimpl.clone(), types, info, @@ -604,12 +600,12 @@ impl Stock { ) -> Result> { let outputs: BTreeSet = outpoints.into_iter().map(|o| o.into()).collect(); - let history = self.contract_state(contract_id)?; + let state = self.contract_state(contract_id)?; let mut res = HashMap::>::with_capacity(outputs.len()); - for item in history.fungibles() { + for item in state.fungible_all() { let outpoint = item.seal.into(); if outputs.contains::(&outpoint) { res.entry(item.seal).or_default().insert( @@ -623,7 +619,7 @@ impl Stock { } } - for item in history.data() { + for item in state.data_all() { let outpoint = item.seal.into(); if outputs.contains::(&outpoint) { res.entry(item.seal).or_default().insert( @@ -633,7 +629,7 @@ impl Stock { } } - for item in history.rights() { + for item in state.rights_all() { let outpoint = item.seal.into(); if outputs.contains::(&outpoint) { res.entry(item.seal) @@ -642,7 +638,7 @@ impl Stock { } } - for item in history.attach() { + for item in state.attach_all() { let outpoint = item.seal.into(); if outputs.contains::(&outpoint) { res.entry(item.seal).or_default().insert( @@ -1136,11 +1132,13 @@ impl Stock { fn store_transaction( &mut self, - f: impl FnOnce(&mut Stash, &mut H, &mut Index

) -> Result<(), StockError>, + f: impl FnOnce( + &mut Stash, + &mut State, + &mut Index

, + ) -> Result<(), StockError>, ) -> Result<(), StockError> { - self.state - .begin_transaction() - .map_err(StockError::StateWrite)?; + self.state.begin_transaction()?; self.stash .begin_transaction() .inspect_err(|_| self.stash.rollback_transaction())?; @@ -1152,11 +1150,7 @@ impl Stock { self.index .commit_transaction() .map_err(StockError::from) - .and_then(|_| { - self.state - .commit_transaction() - .map_err(StockError::StateWrite) - }) + .and_then(|_| self.state.commit_transaction().map_err(StockError::from)) .and_then(|_| self.stash.commit_transaction().map_err(StockError::from)) .inspect_err(|_| { self.state.rollback_transaction(); @@ -1173,7 +1167,7 @@ impl Stock { Ok(status) } - pub fn import_contract( + pub fn import_contract( &mut self, contract: ValidContract, resolver: &mut R, @@ -1181,7 +1175,7 @@ impl Stock { self.consume_consignment(contract, resolver) } - pub fn accept_transfer( + pub fn accept_transfer( &mut self, contract: ValidTransfer, resolver: &mut R, @@ -1189,19 +1183,16 @@ impl Stock { self.consume_consignment(contract, resolver) } - fn consume_consignment( + fn consume_consignment( &mut self, consignment: ValidConsignment, - resolver: &mut R, + mut resolver: R, ) -> Result> { - let contract_id = consignment.contract_id(); let (mut consignment, status) = consignment.split(); consignment = self.stash.resolve_secrets(consignment)?; self.store_transaction(move |stash, state, index| { - state.create_or_update_state::(contract_id, |history| { - consignment.update_history(history, resolver) - })?; + state.update_from_consignment(&consignment, &mut resolver)?; index.index_consignment(&consignment)?; stash.consume_consignment(consignment)?; Ok(()) @@ -1218,10 +1209,10 @@ impl Stock { /// /// Must be called before the consignment is created, when witness /// transaction is not yet mined. - pub fn consume_fascia( + pub fn consume_fascia( &mut self, fascia: Fascia, - priority: u32, + mut resolver: R, ) -> Result<(), StockError> { self.store_transaction(move |stash, state, index| { let witness_id = fascia.witness_id(); @@ -1240,15 +1231,7 @@ impl Stock { } index.index_bundle(contract_id, &bundle, witness_id)?; - - state.update_state::(contract_id, |history| { - for transition in bundle.known_transitions.values() { - let witness_anchor = WitnessAnchor::from_mempool(witness_id, priority); - history.add_transition(transition, witness_anchor); - } - Ok(()) - })?; - + state.update_from_bundle(contract_id, &bundle, witness_id, &mut resolver)?; stash.consume_bundle(bundle)?; } Ok(()) @@ -1318,6 +1301,7 @@ mod test { use strict_encoding::TypeName; use super::*; + use crate::containers::ConsignmentExt; #[test] fn test_consign() { diff --git a/src/resolvers.rs b/src/resolvers.rs index ccd514e4..9c035913 100644 --- a/src/resolvers.rs +++ b/src/resolvers.rs @@ -20,14 +20,32 @@ // limitations under the License. use rgb::validation::{ResolveWitness, WitnessResolverError}; -use rgb::{WitnessAnchor, XWitnessId, XWitnessTx}; +use rgb::vm::WitnessAnchor; +use rgb::{XWitnessId, XWitnessTx}; use crate::containers::IndexedConsignment; -pub trait ResolveHeight { - fn resolve_height(&mut self, witness_id: XWitnessId) -> Result; +pub trait ResolveWitnessAnchor { + /// Resolves position of the witness anchor in the consensus data: + /// blockchain, state channel etc. Used for ordering of global state and for + /// ensuring that the we account only for the actual contract state after + /// blockchain re-orgs and channel updates. + /// + /// Witness resolution must happen as fast and as cheap as getting + /// key-values from HashMap. Thus, resolver must always be caching and + /// doesn't actually re-query indexers for deeply mined transactions. + fn resolve_witness_anchor(&mut self, witness_id: XWitnessId) -> Result; } +impl ResolveWitnessAnchor for &mut T { + #[inline] + fn resolve_witness_anchor(&mut self, witness_id: XWitnessId) -> Result { + (*self).resolve_witness_anchor(witness_id) + } +} + +// TODO: Implement caching witness resolver + pub(crate) struct ConsignmentResolver<'cons, R: ResolveWitness, const TRANSFER: bool> { pub consignment: &'cons IndexedConsignment<'cons, TRANSFER>, pub fallback: R, diff --git a/src/stl/mod.rs b/src/stl/mod.rs index e6ef660d..d2d84c82 100644 --- a/src/stl/mod.rs +++ b/src/stl/mod.rs @@ -35,9 +35,9 @@ pub use specs::{ Name, RicardianContract, Ticker, }; pub use stl::{ - aluvm_stl, bp_core_stl, bp_tx_stl, commit_verify_stl, rgb_contract_stl, rgb_core_stl, - rgb_std_stl, rgb_storage_stl, StandardTypes, LIB_ID_RGB, LIB_ID_RGB_CONTRACT, LIB_ID_RGB_STD, - LIB_ID_RGB_STORAGE, + aluvm_stl, bp_core_stl, bp_tx_stl, commit_verify_stl, rgb_commit_stl, rgb_contract_stl, + rgb_logic_stl, rgb_std_stl, rgb_storage_stl, StandardTypes, LIB_ID_RGB_COMMIT, + LIB_ID_RGB_CONTRACT, LIB_ID_RGB_LOGIC, LIB_ID_RGB_STD, LIB_ID_RGB_STORAGE, }; pub const LIB_NAME_RGB_STD: &str = "RGBStd"; diff --git a/src/stl/stl.rs b/src/stl/stl.rs index 6f2799e1..3f278ea2 100644 --- a/src/stl/stl.rs +++ b/src/stl/stl.rs @@ -24,8 +24,7 @@ pub use bp::stl::bp_core_stl; #[allow(unused_imports)] pub use commit_verify::stl::{commit_verify_stl, LIB_ID_COMMIT_VERIFY}; use invoice::{Allocation, Amount}; -use rgb::stl::rgb_state_stl; -pub use rgb::stl::{aluvm_stl, rgb_core_stl, LIB_ID_RGB}; +pub use rgb::stl::{aluvm_stl, rgb_commit_stl, rgb_logic_stl, LIB_ID_RGB_COMMIT, LIB_ID_RGB_LOGIC}; use strict_types::stl::{std_stl, strict_types_stl}; use strict_types::typesys::SystemBuilder; use strict_types::{CompileError, LibBuilder, SemId, SymbolicSys, TypeLib, TypeSystem}; @@ -42,7 +41,7 @@ use crate::LIB_NAME_RGB_STD; /// Strict types id for the library providing standard data types which may be /// used in RGB smart contracts. pub const LIB_ID_RGB_STORAGE: &str = - "stl:ZZBpExyg-zYQDRZh-1UZxjsV-VHmDa!K-ykNK3bQ-HOlVbHc#sinatra-sweet-clinic"; + "stl:kiahgTk7-Udyz6Es-cuB4FO9-mmbjd5t-tF1g6dR-SLT1m4Y#nepal-proxy-zebra"; /// Strict types id for the library providing standard data types which may be /// used in RGB smart contracts. @@ -51,7 +50,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:peektHMR-cVHolnW-j$54$lX-GfFsZFk-A0jQBM5-krtTqzc#clinic-couple-ibiza"; + "stl:SB0gkjHC-w$83KN1-zSKpnyI-MGoU2n0-8RaJVPk-YIUCocc#soviet-basket-kimono"; fn _rgb_std_stl() -> Result { LibBuilder::new(libname!(LIB_NAME_RGB_STD), tiny_bset! { @@ -61,7 +60,8 @@ fn _rgb_std_stl() -> Result { bp_tx_stl().to_dependency(), bp_core_stl().to_dependency(), aluvm_stl().to_dependency(), - rgb_core_stl().to_dependency() + rgb_commit_stl().to_dependency(), + rgb_logic_stl().to_dependency(), }) .transpile::() .transpile::() @@ -94,8 +94,8 @@ fn _rgb_storage_stl() -> Result { bp_tx_stl().to_dependency(), bp_core_stl().to_dependency(), aluvm_stl().to_dependency(), - rgb_core_stl().to_dependency(), - rgb_state_stl().to_dependency(), + rgb_commit_stl().to_dependency(), + rgb_logic_stl().to_dependency(), rgb_std_stl().to_dependency() }) .transpile::() diff --git a/stl/RGBStd@0.11.0.sta b/stl/RGBStd@0.11.0.sta index 405990c2..b2160d60 100644 --- a/stl/RGBStd@0.11.0.sta +++ b/stl/RGBStd@0.11.0.sta @@ -1,71 +1,77 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:peektHMR-cVHolnW-j$54$lX-GfFsZFk-A0jQBM5-krtTqzc#clinic-couple-ibiza +Id: stl:SB0gkjHC-w$83KN1-zSKpnyI-MGoU2n0-8RaJVPk-YIUCocc#soviet-basket-kimono Name: RGBStd Dependencies: - RGB#diploma-montana-elastic, StrictTypes#century-comrade-chess, AluVM#congo-archive-folio, BPCore#garbo-radius-peru, Std#ralph-blue-lucky, CommitVerify#tennis-peace-olympic, - Bitcoin#signal-color-cipher -Check-SHA256: 7303acb1af4b72c3fc3acf674f2c43fccbea7535db3882d0c5fb99578079262b + Bitcoin#signal-color-cipher, + RGBCommit#poem-amen-provide +Check-SHA256: 94d61d4c25eee8a53f35c6352d142e9a573bd324841017e42e4f634d3eb03ce9 -22w{tQ*>kp4%IjbPV%^csz6ckvx2)X2S(*${SgyN=74!2gcAK;15!sqMe3tp+xFv-0Xp&G?S=|}9rRae -U`~uMrbA>C`}q*r3sZD*X=8L$d2nTOVsJHoA?4$swuZp1Wc+9AOf`(TIbyKWjTy4WkGaM+1wm|eR!wgn -midRhTh1hu7-!n@1Cr{swqbZoGSd8tmgp<3rE>;CP(yEWWy&lbZ-bfLFbqC#o>4E?M+l67UG^w8*<_XZ -#%uyqCj(P-WZ}`>96CYQxM)es+421}!Q~o5fc_fP)zRw7=FYk8VUzOX>?<6X>JDvL2PwaO$GoG1gEwF5PXV6FZDLo1#Vec_~kix7WfVQ -#Sd|CM9$^|Ole|m@1Z8)ymjIKNK5;L!8FkfGTe+FK;UUh9M-4n+}vRYOle|MX>?_hM^%H|xc>sh|Dn*!v8^Ea7rh?dzC2n-8UVQ_L~bWn0{Z)Ow3Q&MIpyF?|7 -J7@IF!hZhz8Wft0d6dj=*oo`t>c$)o5X19O9 -`rXu=lIsRdWprq7WH>)!E^$-R$RUwD%Xb~0J!Ic@@+ehVE%-)5lom~G1rbzXaB^jIQfX&sbV71rZewUh -C#Wt^wA&hNfbvI8l{tqo-}{|djZ8YAkJtUQVz<=}LTqVnWK(5fY*ctqbaF>d&s@;xOg?z(`#e5a?6_IY -cQ>%7&o7^|1Fn59cLW!>7R25;!;BbW>$v -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 +aHwX>fFqJ7jQqgpV60Q!3=n#-@oxpi@}5@PW%F +v%B~$o;&jeRCrHybeHwl212eXGm<4cs7@Wu#FOK{KGSirhjWHCPRxjcYXnnabaS0mldQV=&ET6jM)-pX +anm@-FK%_beB&TRo~t++rXB}ZX>@L7b91ADLi5Yl(a@n1+Ku60FILp}Zw|!7cE!MGSxid=WmW`Kcxhy) +e8zcXXXRJdMCHk1I^Yb;mDw5%F9Y9nz;zN&zQ>*gRCrcpa;b%ccT=8d`>?<6$C@F;S3|*6`1-v+nBdcq +J?FPKcnV2wbY*gGVQf%qwlfK-7{9iX4Q|L-q$GzUMp|h#f#zWg5iW~CYZ +WKwE66NffESNf +Jhg}MqX$BHbY)X?a>aWgn!oosZgNI|twmNZeC(lYZa*g7-2eQ3Yy;-pL;_TJ=xRXCTqXIv;)MTcr4cfx +K`S9uy$)6q!N22#m0-mN2v2o%aBpdDbo`>HD!!5a&4Q@0n2=*4!cKOosx|T?(Q^f3pcpQQSqE58Zfto_ +YYangZEb0ER%LQ&W_bnxIG#g>Clv)aMjKgwAH@`bu1x<7g|G$};xvA~n-$_S3Qc8lYiwmmVRLAO(LK3V +&vL%&i(~ao9rExlGMgPx_&tqtqVlwo1}@PHO=WUxY-Lb#Z*OLk_h5K%L=laq&yA1JoJ^{7>oKLkF4~ia +x8KK|47hp@Qe|^xa&~28LV0v$b1}=fEj#9D^K)f#Cf|Xn@L3mU0Z2&n-dr?jcD1Ll0RawDWpib6c4cHj +d30rSGVkgW4+YqPF=12xaaxrgbrDxyH3 +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 -yDtYub7^w`1pxvM -)i?=G^0h5j^*S;F -1!-nsV`TsZ0RcP8z<~n@;VY|KA!vt$qMEp^75#kD_Tqj3WXX=Y(#Wl3#tYybrT0anNlc)Z3! -7CPHT_+Dq|&?jn_(4)LjFAF^$MA+G=`wK&FZggdCbW>?(a|Hna3IYz*I0;VjxPhubQSq~ayDtYubs~EXcCXx(drQcb3B`Fx$)^%va$Ar)C7b~v#}{qTDnK1gUZ=~4IPtBJuMnKC -WEcQ$kD_ZvQg;gh000000000A000000000EMR;^&ZgXjGZb@cgV`T;j2yJg~GYywm# -VTK~nd#>C`}q*r8?;yf@?frQ$owe+rTo-{AMw{vgzX#P!9p!}0yp?_0000000000{{R30000002WM<= -Vqt7^015&{>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+pGEG0000000000{{R30000003t@9}X=iS2Wo~qH015&{>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7 -Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+pGEG0000000000{{R30000002XbX(Wo2!1 -00{y`>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+pa{vhfMe3tp+xFv-0Xp&G?S=|}9rRaeU`~uMrbA>C`}q*r -8?;yf@?frQ$owe+rTo-{AMw{vgzX#P!9p!}0yp?_0000000000{{R300000024!+`Z*p@02?9mxqhH(h -&Z4!V_T!KN -I`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+pa{vhfMe3tp+xFv-0Xp&G?S=|}9rRaeU`~uMrbA>C`}q*r8?;yf@?frQ$owe+rTo-{ -AMw{vgzX#P!9p!}0yp?_0000000000{{R300000024!+`Z*p@02?9mxqhH(hNn`*70ssVVZ*FA(00035b8l^B00jX8Me3tp+xFv-0Xp&G?S=|}9rRaeU`~uMrbA>C -`}q*rYXqYdo~D%m7H6OD0<^0n_2##VWXRdjy=DB@qgYOj2y$g{b!l>CWCF@89&dx0-7pM3Z=O*v*GCA9 -fL-<|HrZsA`NnJlR3~AEBGG%U@MZ$v=XJ?|;InIPy66cFfOYp#JM2r7_Du+Fb!>ELaBO7)$}AplgPGkh -3_fq3Q7_j=2#kPT_9!;lWR>~GYywm#VTK~nd#>Z4!V_T!KNI`QJ|h6;Zj -^jB$MPK+?7Lu3>C`4HJt76^nC$%1sKzB<;EQA|)S-x88IWKN#S$#@T&w`gPtX>Mp`a%psP00;p)%D{mG -2;nQMTOnwNgyXhzrB~SH04;UKo5i(1Vxw^Y00000000300000000009bZKp6b97;CZ~y>E2yJC_VPs)+ -VE_sOMe3tp+xFv-0Xp&G?S=|}9rRaeU`~uMrbA>C`}q*r8?;yf@?frQ$owe+rTo-{AMw{vgzX#P!9p!} -0yp?_0!8YhU)%QMkO4aJ;_ZeCe;xE!X<$x_Fs4If6Z`oP*=q!&6rQG)02XJT?*g=|B=zREie$*y(7k2+ -*P~cYjQ{`u000000RI300000001IbqZ(?C=Q*>c;WdI5SMe3tp+xFv-0Xp&G?S=|}9rRaeU`~uMrbA>C -`}q*r8?;yf@?frQ$owe+rTo-{AMw{vgzX#P!9p!}0yp?_0m=yGke?j1l!xqXd>q7+-P0pRHy9#PwIC -`}q*r8?;yf@?frQ$owe+rTo-{AMw{vgzX#P!9p!}0yp?_0ZXaKh^f@$D{A?t{IfX>#}PNp!L%7{0GY9x -pq!KXGXMYp000000RI3000000010+sY-Mg^X=QT&3IavyqhH(hb7^w{b?qhoJW!8=sKG~^&Ni^C7tcO}co=3CQC(GPVoWSC3v_Z} -ZgXjLX>V?G015&{>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+p< -?Hl01LM?X!H~4Y^Hx3&bJ$HXE2K+s|vHZ6#&ske5?JSDZAfr}PGrQJ;0000000000{{R30000003T1e7 -Wo~n6Z*Fq{3IavyqhH(hD`aAk5~bZKvH00aU61a5C`WdHyG0R(ezZDjxj0RlzpqhH(hC`}q*r35LOoBKkGaY9#cS7Qj{WgyAGcS>>g~&^g7J)i?=G^0p#+${pKVqYC33O>~Wpi|4ZEyepNC<6ZbYWy+bYTDq0lk5UVp0y6#Opn49V(cQc;WdI2QadI6-(bd|-i#!&GYaF>qoh8ar -da{vheR)?jU+FZ2DLr`QR#xHIKjC^A48Li8o -%k$8HEod=_0000000000{{R30000003v_Z}ZgXjLX>V?G00{v&KD$)QXhhr5^*YH=BF-=c -yOsxg-v9sr000000RI300000000w1pa&K~T00{xZXXT7NJOW`Spw3o_*cmz+=1%_1gm*5-D79nn{HtC7 -00000000300000000009WMy_`Y;SO7asm$3I0;VjxPhubQSq~ayDtYu -bs~EXcCXx(drQcb3B`Fx$)^%va$Ar)C7cFHZE$Q!WCZ~L2LJ#-AOHhPX>#x3$o4Af`kVHyQ&~TYC -SRqgV00000000300000000008b7N>_ZDDj_00{yP)i?=G^0V!Z000000RI300000001I<Z4!V_T!KNI`QJ|h6;Zj -^jB$MPK+?7Lu3>C`4HLtfv$so3kRF1PV2}fOp_vjQ6FdFHId|lr&gK9B00000 -0096000000000VeX=iR>bairNa{vkf;?xyT5z&Ua+M@}mOiDpYxh>^^GknUxTJ!XL#OUcE0frb5ENEw7 -&f?o%+)B!ZpG}K!%4G?I4vp$|ttu*CMF0Q*000000RI300000000>QQWNBt;WpV=p2w`G#baG*1bN~o% -c4cyMX=G&q1!ie(VQl{xPGN0jWJYOaY-B-mb7^O8ZDnqBRC#b^1_J_VWC9M=I0;VjxPhubQSq~ayDtYu -KfZ0H=mhJ>?uVC`}q*r8?;yf@?frQ$owe+rTo-{AMw{vgzX#P!9p!}0yp?_2y$g}WpZ|9WCG#Q --5feW*SKg&%h~b$G{NN>LxBDo)YaDXjV8yEYGv>06AuO0fiYoI|8ZKC9(55{UNs2(LOhfb*8wh)9?KU_ -VQpn(MrmbiWJP#%Wo~n6Z*Ek1aAgJq0%>Fd4%IjbPV%^csz6ckvx2)X2S(*${SgyN=74!2gcAK;WOW`w -sTH9-LlJ`2|Ay5Z(?oEikl{+~pis;@Q*TJ#1a4t%WdcR&qhH(he1kloHngE|MP08BSqsWn@NaWo%?eY;R&=Y*Tb$ -bY)a|aAgJq0%>Fd4%IjbPV%^csz6ckvx2)X2S(*${SgyN=74!2gcAK;)$WoGNre1kloHngE|MP05>8=lWn@NaWo%?kWprUwd2nS00|IGe0uI$U2~P63fvP}J -@w0-vF9$~DV*L>lO6GuhA%qhBUUlS6_}|Wp0vpvv$c&#PW69R$ltr%da5t5w^x+8!q6BVXZDj&Q>Z4!V -_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+pFd4%IjbPV%^csz6ckvx2)X2S(*${SgyN=74!2 -gcAK;G*S<)6P6lYy(#<=BR_>s@(?%#f7ArN-=Rj?7Ns(11a4t%WdcR&qhH(he1kloHngE|MP06;5GoWn@NaWo%?t -VQgh?V|i40aAgJq0%>Fd4%IjbPV%^csz6ckvx2)X2S(*${SgyN=74!2gcAK;M(yUq2ps*m=2xUDT;RqC -gn#@WzFu~@adfH5^@&-|1a4t%WdcR&qhH(he1kloHngE|MP04o+chWn@-ia%o|1bagle0|IGe00035ZeeX@0!8Yh -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(hioJ -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 +kca!3_>4e9YQ#rfba;u!+d5tm#=h2RwFD4Y +Lug@XZc}Ara%FT=WnpaHg=PS6VPp{$?vC--s`v@B8YHl)C#jpVFzBk!DMw8SR$**qZewX>bKWD7Yo@G% +*b#-tU^&3KX?w7l?~*Sh8@1jRRblZzybDKcZ(?C=Q*>c;W#3O-*!kBY4M~g?F@sh?|4{T^)}<>?j2hN@ +!NP)tgb_zc;Wm98lWo=>KρhviK~w*eJg04e;HYn$=SsX>loIF_owDud_0- +=Ov5&mq(eSq^TM>JW4?*h+3X!X@fjr@d0IimUQ-Q4pL=yWnpY(WI=RvVPk0QvgUTbnZZteO3IOg0+3WD +-We)Tm9OC!w7#?l6>L?y +a&2jDVQf=nVQlq!O*mP8`7qV21dnrCyk{{a-lF$FG0V5TNAc?Tc{K=4WprU=VRT{n^sESGu0eNZ)cp(* +eFU-DRQ(QTUJ^TE1nY56>E%WYMs;pyX<}?;RC#b^{4_<~U(XE-|Ev|Hdb$N7;9H9;8!%;3hl7uME$faw +4?}NmV`X7%Wn@8gbYWv?|7c^tcv66A`G>fI&S@S1XLTY^Y?LL}v9ZWWu2|;XdXkkNPaC1n$BNr;@ghiU?gEXK9KMDE{ +F?;HZBRuDVqlk6qmbeZmb;*F>vukd;=m`ygb@x#_>`RmOO$0)3 +Z)|vJcxJL|x?WKK>7x;m>=zTw_)ojDN{iR+YxT1qeJQTRI%yh?{hxxA$L2PhnVMAeXb4+h!VRLBFJq*Jt +8?Abrta^#~Iw-!oZ%zqO(A&rh^vGm~tg_w^L2PhnVN-2kY-~(#WMOk?3sZD*X=8L$d2nTO4*&^LN2X=Q9=Q)O*QWK$LhgcQkwbf~^M){{|8P%hsRk~m~ep32F151Y4WWC&DwaAi(mZDnMP)DN(0hN+Kd +p}ZAoN($wDX8VgT7DmW3qm%zcviBmGB|7z0dgBIJ4&sCG^VR$+2!VQzGR(<~&{!{{>E +!(#o&^pB98KZhv1GEPn8Orhb4n;8ZMQ)zl>ZfBCy0{K32d-H~a`3x8b375ImR&CF_#3#*gz1^xtuG$bz +VQpn(MrmbiWOGwxZAoO8A%m*X98W>f2s0TH8C&EH;|vtDTYgh)4~t7}WW`YoMQ(L%R$+2!VQzGDn938Q +b#DiI%LhXtBc@pg0t!L7$2{bU&sPXOO(dS=5LRJwX<=@3Np5CuQ)O*QWc?UbbJ9Xwr}~3wv^yxa@v}v^ ++kiGSR2X#8M$tG2GZIy9X>V>;VRC6_vj9 +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 -@z+p~GYywm#VTK~nd#>$v -Yz6}cZDn+5Z)5^*9+vrsy<5&Clo)5)@&l6UwYFh+Ofu5^ik9drt)+7=w-6<{Ze -NoKcy!1~?PoRaGVc5iib0`+VYVk7oBr%DNv+($;q`HHK!gIHa)*%m(-e#9sm3L)b@L&d6G@+l`%qd385 -?K@+fP1(-9sgE>i7rMzqbqHc?X>Md`Zf5`h2m +v{(W1V6JV*{3!yZ{M3XW@z+p4r4l +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 +XaE2J1q5VabYTDm0RlzpqhH(hioJpYH;+t0eX2 +w~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;-pL1po(RWoBV@Y;*ts009Pcd2nS;ZvX`W +0006J2y}UHWlmvjWdH>M0!8YhU)%QMkO4aJ;_ZeCe;xE!X<$x_Fs4If6Z`oP*;5t>gcQkwbf~^M){{|8 +P%hsRk~m~ep32F151Y4WWD*HxX=Q9=PGN0j00jX8Me3tp+xFv-0Xp&G?S=|}9rRaeU`~uMrbA>C`}q*r +8?;yf@?frQ$owe+rTo-{AMw{vgzX#P!9p!}0yp?_6AN}>a%o|1bWUMyWdH>M0!8YhU)%QMkO4aJ;_ZeC +e;xE!X<$x_Fs4If6Z`oP*$IZhiz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSj|fwBaByr*VQ>Wj015$y +z}|oy`cC#6Uw2{wE+Sw~);*uMH+9Bf@aCY-RuiZDn*}0S0GmZ(?C=0tIh(Ze?Tx2XWo~16 +1PWnub7^O8ZDnqB1qWwkZe??6a|Q}@a$#@6CZU+fvcywiMb7^mG2nl6)V`Xr3X>V=`3R87(aBO95 +Wo~o^1PNnrZggdCbV+0Z2AHk4+Bm{3x%H=p>4!*u&n~Wpi|4ZEyepNC#tb +Wnpx0asv7BnDSh_Z-QlfPi-Gf7)Vx&p_A!QT4j&asc7kjG~c%9fQB3>bs~EXcCXx(drQcb3B`Fx$)^%v +a$Ar)C7cUkZfdKHyBH|__hx_vscRWAu^w2r{b^x;wDWyGXd29kG60)seH8) +H{-R`;$q)jqasX>b16E +cuX?V{EC+7E3Kt-Xc_Cg)w39@m$R6qOEzWQ+NTC@=;u^7-u;qAzHYrYiZOnAva3v<@st9jzbZKvHVQd1*EFN!zncXl9K5w2;FV{y1jDTJCC^p$-mHEbO +0#qkqh9c2>uJC38-{*D7fZ(%hZo23R4S;p`Q9JBQllDyrZDn*}WMOn+00{y`>Z4!V_T!KNI`QJ|h6;Zj +^jB$MPK+?7Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+plyl;YKd{1p3O&Ca4i=mV0P+Db=)TwCchBV(c!8D=zpn(&o-7tVWUa<1Q{n`|; +)uYyv!)~4rGOBq100000000300000000006X>M?JbaMa-0!8YhU)%QMkO4aJ;_ZeCe;xE!X<$x_Fs4If +6Z`oP*&DQ20rFt3ZOHs70;T-agdg$OP=xIp;K4#IcLF!~asv7BnDSh_Z-QlfPi-Gf7)Vx&p_A!QT4j&a +sc7kjG~YJCG@<&SffJ|QFn~N>u=2wF+7z(Wqt=tdZk`V^s(Ana000000093000000000YNb8~5DZf#|5 +baMa-0!8YhU)%QMkO4aJ;_ZeCe;xE!X<$x_Fs4If6Z`oP*&DQ20rFt3ZOHs70;T-agdg$OP=xIp;K4#I +cLF!~asv7BnDSh_Z-QlfPi-Gf7)Vx&p_A!QT4j&asc7kjG~YJCG@<&SffJ|QFn~N>u=2wF+7z(Wqt=td +Zk`V^s(Ana000000093000000000SgVQgh?V`*h`00{y`>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C +`4HI~v{(W1V6JV*{3!yZ{M3XW@z+pM0!8YhU)%QMkO4aJ +;_ZeCe;xE!X<$x_Fs4If6Z`oP*&DQ20rFt3ZOHs70;T-agdg$OP=xIp;K4#IcLF!~atu~sY-Mg^c}Zqr +V`T;b2y$g{b!l>CWCF@89&dx0-7pM3Z=O*v*GCA9fL-<|HrZsA`NnJlR3~AEBGG%U@MZ$v=XJ?|;InIP +y66cFfOYp#JM2r7_Duy=WpYk$0|EkeFaQE}F#!lxZ*_E2WnpXv0|sqnbZBp60&gCc`G>t*&Lor=XWH@u +lIpd#VR%e3()@~+=qs(Ib1t_KCAn^87TS9h9ibhaZ&^Bcn*B*;w|~I;-PD|t>jZXhb#wytY!hN5_Bp3Y +36tDMM#=e#tGI($UA5U3KNx<*C>jbO<32;hs$B9ZCsU(1!DsC|W1LOd&b_IRG-(&Q$wPGrVr*${WNB_^ +000O -----END STRICT TYPE LIB----- diff --git a/stl/RGBStd@0.11.0.stl b/stl/RGBStd@0.11.0.stl index 478109100866298e3327bc5b854d1144711e5a22..ad4d8b6581927f07f1d1ca98dab4c5590ec62c82 100644 GIT binary patch delta 2707 zcmbO`ow0d3BL`cMyHjvU3j1UQ9fgTLm$ZIc!AN0bidwtAuaud}CevBrNa*|U0D=h<2;w}sdVAi@S_3eb)|I=o3Z~o=iyYC$Ocara+McL_U z9CEv2mIxr+;#8WKl9L*IAvervZAkPhbD8-bjmbuWpH=PM8ycn5zPw;7nKH{;ak8AS zyiI0GRDR}W)qVF}V}2Ze^g8eHntvNxOmxZ}8X2QE_%68ll1Vb8vLH3ZvA8%hJ+Ig) zCo?Z4I5jaRq#`qAvM`T>V&W_DZ)Z!^O3F&Bh$;n7w*FM6w5w27U1u8ibcJ6#uVhI~ z-p4OCIglrO@^zk_*43L#a~;YK=gBaeuj+1`@%oK`ONH@UfqdIut3&7C&9#%lVOc;) z(dG%fyiAh?1==P%xGGHkBw#W*Lr`P#F2OK`YkQ109xMyyxc_N(<;KH*XMQu*QF!yh zvZmPPSFz7dR`JQQ!pf5cgx*ee5RUeLuG;-?y8FzJ5g!~cmCu)DQ%#86nwe!3yM-pAZdz; zQgb&Sls05iAY{tqGyw%e{=~fGjQpb16o}QujQ{o9dzO8B{jj3)!2caJ8?_E_i>EG_ zdV0dqiAS0~R%p$goGdq)u+d`jQT2rEClu*isjz%p%)m)7OfX6Xezam?@;`a$2sz0W z2X=2gy~a}fiMW35N1yZ!?9-?&`dR70%bFn*2`Pg|I>rOzb9X z8n9&DoTV8@L`qoT(LmU^1s(>QcW6fwk>QCl&cXBf=3V*^SqWPVsv&Nh1`t%Z+1ret z2-ks(n`O~T(74HsJPMoREzc7Xety>H2peZ(bAhm;2Z9QdeQZ|}R%phnFxk{@Jz<6W zxfCX=*smd|aPtTIkBl5FObjd~pw@t$lgeaHCj}NprjiOE$7SX=g+=F7$~Sx`-3voB*9J1a=qW%4?XsLdvvW{e72pIjZU$=-Ov zTj2E2Z~3=>ZD;<4zH6B&Zg^x~Rc=SG!{l|ml9RKzLMGeTD@^9(uAIDvTWhia&&0`o zybhC(^M>kY1e+-E+zCGBTlQ$1-l{bHTUIwG?q^%A$+zdiw<>0@Gkig*WvPidsVR;n zC5g!ylV$jJZWiF@Wl~(gWdAv}s+>zq+S@s7Q*WYctGOynJ}hXWV6^Lc#kr-@dyF$q*gcI4H2UPBerMg`byi!Gc5V?=RZ*NgO-P<8 zGiCBOK~1fTlAh-l)UUm-nZ0XDYLKb1@7F>h*>f_&oX7Wza^)&+;&iPjNzE(H%+H%F zFBCR;htOMvdsACgITlX0a}t z!)*>V56>>XVpqIh#Pz@Z45#xPUit|i1HvO%;-rmwe+q;YB?65u0UGX9nwOH3`skeA z;lx7;&Mf(#Sc@*_Pg}S4`^CUFO+p4|^(I9AYV71fXn0`8w_U zrsgdIk*qr;)c#mM@bO}IPu(0OGKLn@teL*k{QC^lsCPiaFY z1ww%`*-Oq)LF@bZ+;er>9}3&wwdUDIY|RO{K2ed)@Jq-&#;0zTDV&pM%S|S1(tQqv z$$9ct^@OY>6ro(Hu!LC5z{y0&G>l~Jg_f=vpx{3cfSBw_;1mcnn{na3Ws-}8em_2( z_5C4xtWvXH?20_Mxt>lL%NHuo`A}>yxlloZpuab-RLEu|sA_V7+LFmPlqL~YI2w$2 z>JVTso+liH@#?yS6|GUbqYZTY`*3Ck%+Jcr5|YzZ-T}F6B^-!4Nr|>I--o5%e;6Q0TFeB AhX4Qo diff --git a/stl/RGBStd@0.11.0.sty b/stl/RGBStd@0.11.0.sty index 0f5bdcfc..26d3c489 100644 --- a/stl/RGBStd@0.11.0.sty +++ b/stl/RGBStd@0.11.0.sty @@ -1,5 +1,5 @@ {- - Id: stl:peektHMR-cVHolnW-j$54$lX-GfFsZFk-A0jQBM5-krtTqzc#clinic-couple-ibiza + Id: stl:SB0gkjHC-w$83KN1-zSKpnyI-MGoU2n0-8RaJVPk-YIUCocc#soviet-basket-kimono Name: RGBStd Version: 0.11.0 Description: RGB standard library @@ -11,76 +11,6 @@ @context typelib RGBStd -import RGB#diploma-montana-elastic - use ExtensionSchema#active-eddie-empty - use BundleId#carmen-farmer-diesel - use GlobalValues#pilot-boris-alice - use MetaValue#split-package-recycle - use InputMap#octavia-north-gram - use GenesisSchema#iron-forbid-hamlet - use AltLayer1Set#flute-flex-bottle - use OwnedStateSchema#python-snake-capsule - use AssetTags#anita-nice-deliver - use AssignmentsBlindSealTxid#telecom-right-visible - use VoidState#email-snow-safari - use DataState#short-noise-postal - use TransitionType#picture-reflex-brigade - use Occurrences#source-olga-mirage - use AssignVoidStateBlindSealTxPtr#profit-granite-fuji - use MediaType#isabel-heaven-north - use ValencyType#aloha-dublin-brush - use PedersenCommitment#pupil-scale-jerome - use ConcealedFungible#story-shrink-aloha - use AssignRevealedDataBlindSealTxid#fantasy-monica-jump - use ExtensionType#apropos-scoop-viva - use Schema#junior-remote-jordan - use RevealedAttach#before-bravo-partner - use RevealedFungible#origin-iris-insect - use ConcealedData#ivan-tripod-young - use MetaType#quebec-mission-quota - use TransitionSchema#jumbo-matrix-normal - use AssignRevealedDataBlindSealTxPtr#ritual-license-arcade - use XChainBlindSealTxid#dynamic-life-brown - use AttachId#factor-hair-everest - use BlindingFactor#animal-plume-minus - use AssignmentType#secret-penguin-limit - use XChainBlindSealTxPtr#senator-limbo-raymond - use Opout#yoga-samba-karma - use AssignVoidStateBlindSealTxid#senior-beyond-cement - use SchemaId#ramirez-patron-simon - use OpId#picnic-single-gloria - use ContractId#uniform-welcome-papa - use AssignmentsBlindSealTxPtr#canyon-eternal-optimal - use TypedAssignsBlindSealTxid#pogo-social-idea - use FungibleState#guide-poker-coconut - use Inputs#herman-liberal-galaxy - use XChainPubWitness#carrot-import-nova - use TypedAssignsBlindSealTxPtr#flipper-marble-plate - use Identity#smart-pioneer-nominal - use AltLayer1#edison-survive-nitro - use AssignRevealedAttachBlindSealTxid#cobalt-eddie-resume - use AssetTag#slang-amber-club - use Extension#emotion-quality-society - use Input#actor-minus-multi - use GlobalStateType#yoga-quick-jasmine - use Ffv#pigment-career-hippie - use AssignRevealedValueBlindSealTxPtr#cuba-needle-salami - use XChainSecretSeal#alex-griffin-left - use Valencies#light-letter-comet - use GlobalState#stadium-barcode-bazaar - use AssignRevealedAttachBlindSealTxPtr#karma-podium-melon - use GlobalStateSchema#connect-ricardo-lava - use Redeemed#mile-lady-perfect - use TransitionBundle#adios-legend-everest - use Transition#reform-sofia-point - use Genesis#element-gondola-buffalo - use XChainTerminalSeal#canada-nova-barcode - use Metadata#member-nobody-imitate - use FungibleType#matrix-optimal-sinatra - use ConcealedAttach#meter-arizona-albino - use RevealedData#olivia-copper-stamp - use AssignRevealedValueBlindSealTxid#photo-jump-silicon - import StrictTypes#century-comrade-chess use VariantName#theory-austin-before use FieldName#present-flute-herman @@ -160,14 +90,85 @@ import Bitcoin#signal-color-cipher use Outpoint#logo-alamo-madam use XOnlyPk#clever-swim-carpet +import RGBCommit#poem-amen-provide + use ExtensionSchema#active-eddie-empty + use BundleId#carmen-farmer-diesel + use AttachState#lady-japan-fiesta + use GlobalValues#pilot-boris-alice + use MetaValue#split-package-recycle + use InputMap#octavia-north-gram + use GenesisSchema#iron-forbid-hamlet + use AltLayer1Set#flute-flex-bottle + use OwnedStateSchema#python-snake-capsule + use AssetTags#anita-nice-deliver + use VoidState#email-snow-safari + use DataState#short-noise-postal + use Transition#company-combat-disney + use TransitionType#picture-reflex-brigade + use Occurrences#source-olga-mirage + use AssignVoidStateBlindSealTxPtr#profit-granite-fuji + use Extension#bandit-consul-empire + use MediaType#isabel-heaven-north + use AssignmentsBlindSealTxPtr#village-result-bahama + use ValencyType#aloha-dublin-brush + use PedersenCommitment#pupil-scale-jerome + use ConcealedFungible#story-shrink-aloha + use TransitionBundle#method-match-logic + use AssignRevealedAttachBlindSealTxid#local-memo-modern + use TypedAssignsBlindSealTxid#garlic-project-zigzag + use AssignRevealedDataBlindSealTxid#fantasy-monica-jump + use AssignmentsBlindSealTxid#electra-bishop-helena + use ExtensionType#apropos-scoop-viva + use Schema#junior-remote-jordan + use RevealedFungible#origin-iris-insect + use ConcealedData#ivan-tripod-young + use MetaType#quebec-mission-quota + use TransitionSchema#jumbo-matrix-normal + use TypedAssignsBlindSealTxPtr#airline-video-travel + use AssignRevealedDataBlindSealTxPtr#ritual-license-arcade + use XChainBlindSealTxid#dynamic-life-brown + use AttachId#factor-hair-everest + use BlindingFactor#animal-plume-minus + use AssignmentType#secret-penguin-limit + use XChainBlindSealTxPtr#senator-limbo-raymond + use Opout#yoga-samba-karma + use AssignVoidStateBlindSealTxid#senior-beyond-cement + use SchemaId#ramirez-patron-simon + use OpId#picnic-single-gloria + use ContractId#uniform-welcome-papa + use FungibleState#guide-poker-coconut + use Inputs#herman-liberal-galaxy + use XChainPubWitness#carrot-import-nova + use Identity#smart-pioneer-nominal + use AltLayer1#edison-survive-nitro + use AssetTag#slang-amber-club + use Input#actor-minus-multi + use GlobalStateType#yoga-quick-jasmine + use AssignRevealedAttachBlindSealTxPtr#wave-comet-arnold + use Ffv#pigment-career-hippie + use AssignRevealedValueBlindSealTxPtr#cuba-needle-salami + use XChainSecretSeal#alex-griffin-left + use Valencies#light-letter-comet + use GlobalState#stadium-barcode-bazaar + use GlobalStateSchema#connect-ricardo-lava + use Redeemed#mile-lady-perfect + use RevealedAttach#slalom-phantom-voyage + use Genesis#round-sound-nectar + use XChainTerminalSeal#canada-nova-barcode + use Metadata#member-nobody-imitate + use FungibleType#matrix-optimal-sinatra + use ConcealedAttach#meter-arizona-albino + use RevealedData#olivia-copper-stamp + use AssignRevealedValueBlindSealTxid#photo-jump-silicon + -@mnemonic(demo-nobel-joshua) -data AnchoredBundles : tapret#1 (BPCore.AnchorMerkleProofTapretProof, RGB.TransitionBundle) - | opret (BPCore.AnchorMerkleProofOpretProof, RGB.TransitionBundle) +@mnemonic(lazarus-horse-silk) +data AnchoredBundles : tapret#1 (BPCore.AnchorMerkleProofTapretProof, RGBCommit.TransitionBundle) + | opret (BPCore.AnchorMerkleProofOpretProof, RGBCommit.TransitionBundle) | double (tapretAnchor BPCore.AnchorMerkleProofTapretProof - , tapretBundle RGB.TransitionBundle + , tapretBundle RGBCommit.TransitionBundle , opretAnchor BPCore.AnchorMerkleProofOpretProof - , opretBundle RGB.TransitionBundle) + , opretBundle RGBCommit.TransitionBundle) @mnemonic(domino-waiter-orlando) data AnnotationName : Std.AlphaCaps, [Std.AlphaNumDash ^ ..0xfe] @@ -182,36 +183,36 @@ data AssignIface : ownedState OwnedIface , multiple Std.Bool @mnemonic(explore-spiral-darwin) -data BundledWitness : pubWitness RGB.XChainPubWitness, anchoredBundles AnchoredBundles +data BundledWitness : pubWitness RGBCommit.XChainPubWitness, anchoredBundles AnchoredBundles -@mnemonic(tripod-tribune-farmer) +@mnemonic(record-organic-story) data Consignmentfalse : version ContainerVer , transfer Std.Bool - , terminals {RGB.BundleId -> Terminal} - , genesis RGB.Genesis - , extensions {RGB.Extension ^ ..0xffffffff} + , terminals {RGBCommit.BundleId -> Terminal} + , genesis RGBCommit.Genesis + , extensions {RGBCommit.Extension ^ ..0xffffffff} , bundles {BundledWitness ^ ..0xffffffff} - , schema RGB.Schema + , schema RGBCommit.Schema , ifaces {Iface -> ^ ..0xff IfaceImpl} , supplements {Supplement ^ ..0xff} , types StrictTypes.TypeSystem , scripts {AluVM.Lib ^ ..0x400} - , attachments {RGB.AttachId -> [Byte ^ ..0xffffff]} + , attachments {RGBCommit.AttachId -> [Byte ^ ..0xffffff]} , signatures {ContentId -> ^ ..0xff ContentSigs} -@mnemonic(rainbow-button-bernard) +@mnemonic(limbo-comet-sonata) data Consignmenttrue : version ContainerVer , transfer Std.Bool - , terminals {RGB.BundleId -> Terminal} - , genesis RGB.Genesis - , extensions {RGB.Extension ^ ..0xffffffff} + , terminals {RGBCommit.BundleId -> Terminal} + , genesis RGBCommit.Genesis + , extensions {RGBCommit.Extension ^ ..0xffffffff} , bundles {BundledWitness ^ ..0xffffffff} - , schema RGB.Schema + , schema RGBCommit.Schema , ifaces {Iface -> ^ ..0xff IfaceImpl} , supplements {Supplement ^ ..0xff} , types StrictTypes.TypeSystem , scripts {AluVM.Lib ^ ..0x400} - , attachments {RGB.AttachId -> [Byte ^ ..0xffffff]} + , attachments {RGBCommit.AttachId -> [Byte ^ ..0xffffff]} , signatures {ContentId -> ^ ..0xff ContentSigs} @mnemonic(giant-bravo-jacket) @@ -219,27 +220,27 @@ data ContainerVer : v2#2 @mnemonic(dispute-senator-parody) -data ContentId : schema RGB.SchemaId - | genesis RGB.ContractId +data ContentId : schema RGBCommit.SchemaId + | genesis RGBCommit.ContractId | iface IfaceId | ifaceImpl ImplId | suppl SupplId @mnemonic(reward-sharp-orca) -data ContentRef : schema RGB.SchemaId - | genesis RGB.ContractId +data ContentRef : schema RGBCommit.SchemaId + | genesis RGBCommit.ContractId | iface IfaceId | ifaceImpl ImplId @mnemonic(apropos-horizon-couple) -data ContentSigs : {RGB.Identity -> ^ 1..0xa SigBlob} +data ContentSigs : {RGBCommit.Identity -> ^ 1..0xa SigBlob} @mnemonic(corner-reptile-pagoda) data ExtensionIface : modifier Modifier , optional Std.Bool , metadata {StrictTypes.FieldName ^ ..0xff} - , globals {StrictTypes.FieldName -> ^ ..0xff RGB.Occurrences} - , assignments {StrictTypes.FieldName -> ^ ..0xff RGB.Occurrences} + , globals {StrictTypes.FieldName -> ^ ..0xff RGBCommit.Occurrences} + , assignments {StrictTypes.FieldName -> ^ ..0xff RGBCommit.Occurrences} , redeems {StrictTypes.FieldName ^ ..0xff} , valencies {StrictTypes.FieldName ^ ..0xff} , errors {StrictTypes.VariantName ^ ..0xff} @@ -248,8 +249,8 @@ data ExtensionIface : modifier Modifier @mnemonic(oregano-virus-ringo) data GenesisIface : modifier Modifier , metadata {StrictTypes.FieldName ^ ..0xff} - , globals {StrictTypes.FieldName -> ^ ..0xff RGB.Occurrences} - , assignments {StrictTypes.FieldName -> ^ ..0xff RGB.Occurrences} + , globals {StrictTypes.FieldName -> ^ ..0xff RGBCommit.Occurrences} + , assignments {StrictTypes.FieldName -> ^ ..0xff RGBCommit.Occurrences} , valencies {StrictTypes.FieldName ^ ..0xff} , errors {StrictTypes.VariantName ^ ..0xff} @@ -272,14 +273,14 @@ data Iface : version VerNo , extensions {StrictTypes.FieldName -> ^ ..0xff ExtensionIface} , defaultOperation StrictTypes.FieldName? , errors {StrictTypes.VariantName -> ^ ..0xff [Unicode ^ ..0xff]} - , developer RGB.Identity + , developer RGBCommit.Identity @mnemonic(nova-cola-carbon) data IfaceId : [Byte ^ 32] @mnemonic(chris-earth-pony) data IfaceImpl : version VerNo - , schemaId RGB.SchemaId + , schemaId RGBCommit.SchemaId , ifaceId IfaceId , timestamp I64 , metadata {NamedFieldMetaType ^ ..0xff} @@ -289,7 +290,7 @@ data IfaceImpl : version VerNo , transitions {NamedFieldTransitionType ^ ..0xff} , extensions {NamedFieldExtensionType ^ ..0xff} , errors {NamedVariantu8 ^ ..0xff} - , developer RGB.Identity + , developer RGBCommit.Identity @mnemonic(seminar-data-table) data ImplId : [Byte ^ 32] @@ -297,7 +298,7 @@ data ImplId : [Byte ^ 32] @mnemonic(rodent-maximum-bravo) data Kit : version ContainerVer , ifaces {Iface ^ ..0xff} - , schemata {RGB.Schema ^ ..0xff} + , schemata {RGBCommit.Schema ^ ..0xff} , iimpls {IfaceImpl ^ ..0xff} , supplements {Supplement ^ ..0xff} , types StrictTypes.TypeSystem @@ -309,32 +310,32 @@ data Modifier : abstract | override | final#255 @mnemonic(origin-caramel-flipper) -data NamedFieldAssignmentType : id RGB.AssignmentType +data NamedFieldAssignmentType : id RGBCommit.AssignmentType , name StrictTypes.FieldName , reserved CommitVerify.ReservedBytes4 @mnemonic(tuna-archer-melon) -data NamedFieldExtensionType : id RGB.ExtensionType +data NamedFieldExtensionType : id RGBCommit.ExtensionType , name StrictTypes.FieldName , reserved CommitVerify.ReservedBytes4 @mnemonic(museum-ohio-arizona) -data NamedFieldGlobalStateType : id RGB.GlobalStateType +data NamedFieldGlobalStateType : id RGBCommit.GlobalStateType , name StrictTypes.FieldName , reserved CommitVerify.ReservedBytes4 @mnemonic(prefix-carmen-artist) -data NamedFieldMetaType : id RGB.MetaType +data NamedFieldMetaType : id RGBCommit.MetaType , name StrictTypes.FieldName , reserved CommitVerify.ReservedBytes4 @mnemonic(express-brush-desire) -data NamedFieldTransitionType : id RGB.TransitionType +data NamedFieldTransitionType : id RGBCommit.TransitionType , name StrictTypes.FieldName , reserved CommitVerify.ReservedBytes4 @mnemonic(invest-apollo-inca) -data NamedFieldValencyType : id RGB.ValencyType +data NamedFieldValencyType : id RGBCommit.ValencyType , name StrictTypes.FieldName , reserved CommitVerify.ReservedBytes4 @@ -380,11 +381,11 @@ data SupplSub : itself | meta | global | owned @mnemonic(lobster-traffic-flame) data Supplement : contentId ContentRef , timestamp I64 - , creator RGB.Identity + , creator RGBCommit.Identity , annotations {SupplSub -> ^ ..0xff SupplMap} @mnemonic(lithium-torso-parent) -data Terminal : seals {RGB.XChainTerminalSeal} +data Terminal : seals {RGBCommit.XChainTerminalSeal} @mnemonic(amadeus-athena-lagoon) data TerminalSeal : concealedUtxo BPCore.SecretSeal @@ -394,9 +395,9 @@ data TerminalSeal : concealedUtxo BPCore.SecretSeal data TransitionIface : modifier Modifier , optional Std.Bool , metadata {StrictTypes.FieldName ^ ..0xff} - , globals {StrictTypes.FieldName -> ^ ..0xff RGB.Occurrences} - , inputs {StrictTypes.FieldName -> ^ ..0xff RGB.Occurrences} - , assignments {StrictTypes.FieldName -> ^ ..0xff RGB.Occurrences} + , globals {StrictTypes.FieldName -> ^ ..0xff RGBCommit.Occurrences} + , inputs {StrictTypes.FieldName -> ^ ..0xff RGBCommit.Occurrences} + , assignments {StrictTypes.FieldName -> ^ ..0xff RGBCommit.Occurrences} , valencies {StrictTypes.FieldName ^ ..0xff} , errors {StrictTypes.VariantName ^ ..0xff} , defaultAssignment StrictTypes.FieldName? diff --git a/stl/RGBStorage@0.11.0.sta b/stl/RGBStorage@0.11.0.sta index 7f270122..3935f5bd 100644 --- a/stl/RGBStorage@0.11.0.sta +++ b/stl/RGBStorage@0.11.0.sta @@ -1,208 +1,222 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:ZZBpExyg-zYQDRZh-1UZxjsV-VHmDa!K-ykNK3bQ-HOlVbHc#sinatra-sweet-clinic +Id: stl:kiahgTk7-Udyz6Es-cuB4FO9-mmbjd5t-tF1g6dR-SLT1m4Y#nepal-proxy-zebra Name: RGBStorage Dependencies: - RGB#diploma-montana-elastic, StrictTypes#century-comrade-chess, - RGBState#icon-passage-bonanza, + RGBStd#soviet-basket-kimono, + RGBLogic#second-germany-cloud, AluVM#congo-archive-folio, BPCore#garbo-radius-peru, - RGBStd#clinic-couple-ibiza, Std#ralph-blue-lucky, CommitVerify#tennis-peace-olympic, - Bitcoin#signal-color-cipher -Check-SHA256: 6838c7410dd9885ef881b0af5c72365d6a81affa390145e93175a0efd162c483 + Bitcoin#signal-color-cipher, + RGBCommit#poem-amen-provide +Check-SHA256: 3984abbc7c8c955e0ac627c9ad0e137f7e512dd105cb14cdc45fc2e9a47c664b -3Q|WxQ*>`~VP|Ct4%IjbPV%^csz6ckvx2)X2S(*${SgyN=74!2gcAK;15!sqMe3tp+xFv-0Xp&G?S=|} -9rRaeU`~uMrbA>C`}q*r3sZD*X=8L$d2nTOUS2#4vyl1NjMA5#i(xNnkxdFye7)QWlvQI4GQQDD2vSEv -Q*>c;WnyqOe<9`Lptgpr6F_xjAC6(~TLj#*ewiHU&X!byiJp9+vrsy<5&Clo)5)@&l6UwYFh+ -Ofu5^ik9drt)+7YLQq3*a%H9Gq_lGpaZ%`&b))~DKb3Kx7RE)84I@AkIg-0mt2YKxM?zC{WXdcaZ-bfL -FbqC#o>4E?M+l67UG^w8*<_XZ#%uyqCj(P-WZ}`>96CYQxM)es+421}!Q~o5fc_fP)zRw7=FYk8VUzOX>?<6X>JJxL2PwaO$GoG1gEwF -5PXV6FZDLo1#Vec_~kix7WfVQ#Sd|CM9$^|Ole|m@1Z8)ymjIKNK5;L!8FkfGTe+FK;UUh9M-4n+}vRY -Ole|MX>?_hT7_z0LJs9vI3^Q`9-kMwahgh8>BYhA> -cyMfKV`+3#WnpYocxhx0wjY>38tto&d&=eDF1HXRxo%|^+Itiop&gxXSvq){{YhrG -f57_P)SQy*22EvjXm4aVKVmL%Q_{#Gkvz+H9iKg9-*)mSRaq_gMnjYqO>G4cRAF#(Wpq+$XJ~Xna$#;` -XhtWfE>N`F8f<{_M@^MEhcVy#omh=bI-rl&{j_4Y)eb^zX>MdwWnpYocu;h5M^4XN(CAD)cag{3QuryWpq$-Z*OK?mf%5n?HDW%5cU2uZ?<6X>Jq%0U2$DDaiKPL`@Y=jhu|Vo)3+Q0$Mw;ks-!CQm`I} -1yf~lPHzeskk?c43YBIb6Fc=IN+pl}OUT^`C!`zX1ig-;MydoD@qdC-Hdlhx3aZBNPbr@aHF*SPB$t~%I3sYlqX>fExd30rSF}tql -go$^>um>@6G0l?pFt#Zz&53{9y57aQ#OZ(83shlnPH$voNMUnmHQF5&IUsJk-Q1+ZJ%=&s@|&mHbl*M5 -f*>4D7PYw?2uyEdYgB1%WjJ*Nu}gdoMr}u)7e{?0bR>WH17z$yORD!eAooFZYY9_nXH#QxX>fF3tl4el -KTgFI*|CjhfZ7VH>n$b={WmS6z+ej~gaaD&)?_rinzLQ&_n0fy*Yd -yZ9}hJM#rpcu#e7m-W{MLar(^k|jH+P94s~ljFZW({ZtfbA~le%!q<(1XE#jbDdR_th)Kl;F~x`_=5>? -(>Td5ZgsqT;~+(zt2h~^9tT%xbZ%vHbEASn^UK%K(4i9Ajp1M~R@C@!4#dQE#lUD;OiKi1Rs>XdX=JE; -#(89COl4taR%LR&{2u&fr5XKX -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 -Y*Tb$bY?j2hN@!NP)tgb_zc;Wm98lWo=>Kρ -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 -#=h2RwFCkV)i?=G^05%bR49 -t5yk`^qQ9d0000000030|Nj6000008O=WFUbYXL71`P;vV`yb!;-c-;uXb!>v*u#RTR@N|4s<<3s6Ey0&i$8~x{Nsgre00000000300000000006 -X=Y(#Wpe-u0;T7qv~v-0QRtR+qyL^im2saI#zl|~BR~^5lDku@H#^F}fddHPE2~=}XorO3wsWOd*yR8% -b;g^;wLfB`aRR01q_lGpaZ%`&b))~DKb3Kx7RE)84I@AkIg-0mt2a5v8a{pyIM27foOFHbufC9*xQ=a* -L`qQ5aG5b!Ay5DS000000093000000000MPWo~72Wpe-u0uI$U2~P63fvP}J@w0-vF9$~DV*L>lO6Guh -A%qhBUY`goNjk^^qPoT1+zTRnAg`3vXv9d*8d@RXy~6c6G6D|OI0;VjxPhubQSq~ayDtYu!-yn60lO6GuhA%qhBUITlRwLKbzE(ciwC3nrXLGTEzPUiqvVS}~6O1lO6GuhA%qhBUeOsz&Y*v--zjUllx0#iGfnkz -5*^MQ6A8z^6$))3vH$=8000000RR90{{R30010<#bZ%vHb7gY?3IYz*I0;VjxPhubQSq~ayDtYu!;%&e-~k=n*?EC13_Efz{78l#`qW2t}!0cu>!&Y2j4>0000000030|Ns900000BVRUq1 -V`yzjuaWwz{ -0000000960{{R30000Vfd2nS@d2@7SZ30E=qhH(h&PZdlOljoA7|k;k>s6qoa5|8f~g8=WMyu2X>@62a{vkg4%IjbPV%^csz6ckvx2)X2S(*${SgyN -=74!2gcAK;w&;L{94K`ndk%K5+?9Jv$dw7jc}U5p5@2#$kUJ%u0;T7qv~v-0QRtR+qyL^im2saI#zl|~ -BR~^5lDku@H=^KK)X}ib9i^%gOs*8bY}uR&S59aNAMwsm_ykY{pa1{>000000RR600000000eAlVsiir -0%CAAe<9`Lptgpr6F_xjAC6(~TLj#*ewiHm5LE0xkJm$nc4yMWR2J-cc#Q6SofWC)gp7L6!Sc -3IbwqHGd)Hlr -&gK9B000000096000000000DYX=if)3Ie6)q_lGpaZ%`&b))~DKb3Kx7RE)84I@AkIg-0mt2g4*6;Kh; -hPv9L38+j;K}xwT<$*JN%D`Il^nAqV=^+B8=cKfA5phxImUW~5o!UOOvDqlqa0000000030{{R3000008O=WFUbYXO51_1|XX>)XMa(Ms> -0uI$U2~P63fvP}J@w0-vF9$~DV*L>lO6GuhA%qhBUY`goNjk^^qPoT1+zTRnAg`3vXv9d*8d@RXy~6c6 -G6G&+JPWgs`Phuomz|4YFKUrZ3R8T&+zFIbV+=CB(MtA}YLb;1+l3>_YW;&H2XX#JJbY16COHBLIj?f1 -*8Kng000000093000000000 +3Q|WxQ*>`~VP|CtMe3tp+xFv-0Xp&G?S=|}9rRaeU`~uMrbA>C`}q*r3sZD*X=8L$d2nTONF5-OF~YJg#w|+22w{tQ*>ld!P;7WA{;OOf`cWj_^7bw123%yMF;1l01e^u=sA@L +Qb$5eZ)a&^VsJHoA?4$swuZp1Wc+9AOf`(TIbyKWjTy4WkGaM+1wm|eR!wgnmidRhTh1hu7-!n@1Cr{s +wqbZoGSd8tmgp<3rE>;CP(yEWWy&lbZ-bfLFbqC#o>4E?M+l67UG^w8*<_XZ#%uyqCj(P-WZ}`>96CYQ +xM)es+421}!Q~o5fc_fP)zRw +7=FYk8VUzOX>?<6X>R%PnDSh_Z-QlfPi-Gf7)Vx&p_A!QT4j&asc7kjG~WqQM?ynyZEb0E2?arHbyiIV +01^bJwgM1*ibOBDT%6aZ|SrJerP1pIOD57`7Ol|-ogQ6Pjg~y>s-v>!^VNPLfWv4Jz0xkJm$nc4y +MWR2J-cc#Q6SofWC)gp7L6!Sc3I$AQVo7AP4Jk3r!|EoW{Zi$060oMN(jLzPuNboiNpoRS +WoOdj7+WWC1?EKi+6QrwlvP$nl8x-M691f9z+~t)>6ivgX<}1lX9hx0LvM0r4FCar2VDR_OBR)w8yCZ2 +EylR&t_^>1Sz?kFbz0>alMxYAVQ_L~bWU$%Wl&*qbZ%vG1JyK;>qK>mX$cszrKCL=@F5H{a;)B(Tlt4r +og*WC5Jh-!Y-wX@bW>$vY*ct@WDm98Wft0d6dj=*oo`t> +c$)o5X19O9`rXu=lIsRdWprq7WH>)!E^$-R$RUwD%Xb~0J!Ic@@+ehVE%-)5lom~G1rbzXaB^jIQfX&s +bV71rZewUhC#Wt^wA&hNfbvI8l{tqo-}{|djZ8YAkJtUQVz<=}LTqVnWK(5fY*ctqbaF>d&s@;xOg?z( +`#e5a?6_IYcQ>qF5t# +xf?-lV`y)3O=WUxY-K`hZ)0muaB^jIP;zf?W@s7fyw$T9tCzEwrAszt-P)%HZ|LbH=L2A=l(W4CP6|_H +V{&D5Q)OXnu*Pw&hI`xNV4B0;>oUbhHyi-Y#=22)QEgSwgbZe&wsVQf@*X=JhGI5`vwIKJ?2 +8qdBQV5M*2;q-lY2q<~K(fZR6A>9R3cu;h52SRCdV{d706aWDkZG|bw_S!^E6;6$ujJ=)@jfnzUJFt-< +#ywK79)|@}WpPe#3K@{sQ}POxW*-wf^&?6pkN!)@-3ce88{`DNj-p1Y1XOrQZXx47L&d6G@+l`%qd385 +?K@+fP1(-9sgE>i7rMzqbp%##b#x`G^|=xh7rLW4)L(lQb*FJl;d*r#UC=Q#deq4+>4pnaV{&P5bV7M_ +WpgpRuIPk`cg3&=F>*1@lJ+pRDJ{*3f84s>#k$1lf7uIEVQ@}wWMxQUb7(c%9ThnsZoA#wq{BUjG3xT0 +r`mMiJ;;I}98MOsxf}>gZ)0mzX>DaVbp)|Xd=5r!N1hi)eI#@wfA|Ar>^)1W_c|c=L3C>gQ)y>YV{&P5 +bYHC5ZRI~s#T41Gjc0(`3ajfaCJX&HEu+ACq+L0mO$tn9VP;cfa%pgMkUL~>d4!J}CQ~Zp&c>#RM4(ex +xbT6?CbPTvEuK5`1yp!Xb##~Y*9JnaDl?KLJE%?_&cu`BzdqA(v4?YpHBQWkf@=g*VRUnyRgqGWM}19*F@#XVmjaq%az$04KD-Vbij2IPrk>V1yp!eWpb&7gm+V(X#23g?#G%T#8*SXRQUS6 +KbYXtkv-?PH+Tw3ZggdGZeeUtYqm29sTjYuk_~RiSfnI}BSut4!A4H=_ds@ZTntlVa%pgMP<3K!WqHJMYmbj8(R#s`$Q_Oip_^hvoaWGE +UH-@Ecs#X-@uLSqd30q{baKUeA)3GUIc{=BfUQMVFMRBwY;Hd$-Q55DeryBg+(ZIYc<5?C&0HnY62ZUYgq2{$1_)1ebZ~EJZgl*jrz*aY{>_4@v6zr!BEn8~s;V{eB++vPW1tu=h*<|% +Pi|~^P-_fBZ*6U9bXH|@X=Zr|05Fw)<{e=)S-S-YQ3WPbltNdpi4*91)SI!>2Tf&jb75y?IG#g>Clv)aMjKgwAH@`bu1x<7g|G$} +;xvA~n-$_S3Qc8lYiwmmVRL9)&E@`k{z!7(TI@Y9B6!g4sB24Po?(Fc@vtHNfU4XJO=WUxY-K`hZ)0nd +_h5K%L=laq&yA1JoJ^{7>oKLkF4~iax8KK|47hp@Qe|^xa&~28LV0v$b1}=fEj#9D^K)f#Cf|Xn@L3mU +0Z2&n-dr?jcD1Ll0RawDWpib6c4cHjd30rSGT61bmh)A>-9G+(AKhLw+s!eDmlO2>&}_PPHjCBJR|r&c +Wo1rpWM%K_6AuO0fiYoI|8ZKC9(55{UNs2(LOhfb*8wh)9?K3=Wpib6c4cHjd30rSH2#7XN#A(BKKz&v +`r;e6DUv<<*U}c>>c184%wsNMHUptBVZ#B!U% +rHo-i1kG~VoNp!e_~i}U4@G!%Wo~n6Z*Eg#Xk~3-1ACLTJsO2B2U!6ncg?mz@CdC==Kxq?gSEg)z2E{| +2tsvkWNc+gWC^x^65s1c;WeUUgB8EM+V1n+T +F3m?Yd1DC`X&GvUv9(-1>WQHGZVX3kZ(?C=R$**)WpfU{xa~M%Zlr^{H1ibsRCVcA*+(@K+$R_oJY%-u +iLnY-X>@L7b8}E{a}*^!j!?y>j|%qbz^!%<&Wu0B;HjDvS(4Y;;Uvd1Z1jQ)P4|MRdNw +xo;mu +Vif;}u9xW_W$|0g2|;snWpq?wXLByHrT!PdFhnqz;9Q#@6CZZuL4t`n9TUcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXbx0zVQzD2bZKvH +RC#b^Ho-KZ`k;Xmr`<4sJYKN!!u{G5u+^j1lf!PF4>GEG3r}NXb#iiLZewM0IVbbqN^4g)WDG0#SSGl- ++Q@e<+6H_!d>A}?>ex&T2C;PAKlCCveQ{N4udSh#@3Dqj&&J9b8~5DZf#|5baO&%X>MdwWnpYocu;h5M(yUq +2ps*m=2xUDT;RqCgn#@WzFu~@adfH5^@&-|3szxlWo~16RC#b^NWB_v7yE`g7JPmsUNvXifRDiWpZ<6ZbNTvZE19EWo~pzXnF^bIJ{KZXqHAX+2p+mzq!3hcVQzD2bZKvHLUnFrY-Ll> +ZB|09R9osd9G^&mV=@u*B|k@iff^?C=mvC@noA);b8~5DZc=4-WnpY(WI=RvVPj}QY-w&}Q)OXnRCsA* +T5oByCBEN9T=>W0>u%$${;`BKEO$VG0b8(5pxNmH8B}?2Wn@8fb7^O8b3$xsZe&wsVQf@*X=GZDa|tC) +BU>oS@xONigke(HCtahRyiRHf-TMdwWnpYocxhy0bsj>g6`?#s5rWnK +hSeO?L~x^!;Y#eFP|P}0Z%Ez^MR;^&ZgXjGZd7@2Wn_u%{;$1;M2o64z%IOs&b7QjASZ@7)-q;_V>*V`yb< +VSBPQZ9sOzZX5$Qs*8b`>+BFjcr)z~Z#|7V!q4uVJ{nYcaAjmcb8~5DZgWCxX>MdwWnpYocu;h5fgb0V +4v@cHO73HjlbgFm42mCs2<+~e+;O=m63^mMAVG6;X=iRyWp-s@Y-MCbVRT_aY-w&}Q)OXnRCrKya)JyE +uWS7@0e2{bYWv?No0k%_$#~gq^1qCzduE|50q|rgTt*-ZIkqGqXDRHN7@cTY-w&} +X>MmmVPkY}a)LMnX>MdwWnpYocu;h5lMuXsu{2tXFT+?;?hj39&>gq>HOrf1lB-q;n)I5N1y68qb##-! +lw1;)SBG%dXmxGxLL8mnw6u)Qc}1I}@VaR|$Sxc~b8~5DZdPw;WK(oubY((pX>MdwWnpYocxhymQq$W5 +tE;F{pQrXd&=l*`O?@#x{Qdy?T_k!`1dtF2Q)6glZDC1dmB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`Zq +Bog<<1W#~DWSEea4XlBy!~< +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 +>UA(Tr;j#yqcI82>cBr>9x- +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 +q~=AyZH&MKP+bW>$vY;yn! +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 ^ ..0xffffff {RGB.Opout ^ ..0xffffff}} +data ContractIndex : publicOpouts {RGBCommit.Opout ^ ..0xffffff}, outpointOpouts {RGBCommit.XChainExplicitSealTxid -> ^ ..0xffffff {RGBCommit.Opout ^ ..0xffffff}} + +@mnemonic(absorb-albino-prague) +data MemContract : schemaId RGBCommit.SchemaId + , contractId RGBCommit.ContractId + , global {RGBCommit.GlobalStateType -> ^ ..0xff {RGBLogic.GlobalOrd -> ^ ..0xffffffff RGBCommit.DataState}} + , rights {RGBStd.OutputAssignmentVoidState ^ ..0xffffffff} + , fungibles {RGBStd.OutputAssignmentRevealedValue ^ ..0xffffffff} + , data {RGBStd.OutputAssignmentRevealedData ^ ..0xffffffff} + , attach {RGBStd.OutputAssignmentRevealedAttach ^ ..0xffffffff} @mnemonic(flower-unicorn-bazaar) -data MemIndex : opBundleIndex {RGB.OpId -> ^ ..0xffffff RGB.BundleId} - , bundleContractIndex {RGB.BundleId -> ^ ..0xffffff RGB.ContractId} - , bundleWitnessIndex {RGB.BundleId -> ^ ..0xffffff RGB.XChainTxid} - , contractIndex {RGB.ContractId -> ^ ..0xff ContractIndex} - , terminalIndex {RGB.XChainSecretSeal -> ^ ..0xffffff RGB.Opout} - -@mnemonic(cartoon-decide-shadow) -data MemStash : schemata {RGB.SchemaId -> ^ ..0xff RGBStd.SchemaIfaces} +data MemIndex : opBundleIndex {RGBCommit.OpId -> ^ ..0xffffff RGBCommit.BundleId} + , bundleContractIndex {RGBCommit.BundleId -> ^ ..0xffffff RGBCommit.ContractId} + , bundleWitnessIndex {RGBCommit.BundleId -> ^ ..0xffffff RGBCommit.XChainTxid} + , contractIndex {RGBCommit.ContractId -> ^ ..0xff ContractIndex} + , terminalIndex {RGBCommit.XChainSecretSeal -> ^ ..0xffffff RGBCommit.Opout} + +@mnemonic(control-hobby-rufus) +data MemStash : schemata {RGBCommit.SchemaId -> ^ ..0xff RGBStd.SchemaIfaces} , ifaces {RGBStd.IfaceId -> ^ ..0xff RGBStd.Iface} - , geneses {RGB.ContractId -> ^ ..0xff RGB.Genesis} + , geneses {RGBCommit.ContractId -> ^ ..0xff RGBCommit.Genesis} , suppl {RGBStd.ContentRef -> ^ ..0xff {RGBStd.Supplement ^ ..0xff}} - , bundles {RGB.BundleId -> ^ ..0xffffffff RGB.TransitionBundle} - , extensions {RGB.OpId -> ^ ..0xffffffff RGB.Extension} - , witnesses {RGB.XChainTxid -> ^ ..0xffffffff RGBStd.SealWitness} - , attachments {RGB.AttachId -> [Byte ^ ..0xffffff]} - , secretSeals {RGB.XChainBlindSealTxPtr ^ ..0xffffff} + , bundles {RGBCommit.BundleId -> ^ ..0xffffffff RGBCommit.TransitionBundle} + , extensions {RGBCommit.OpId -> ^ ..0xffffffff RGBCommit.Extension} + , witnesses {RGBCommit.XChainTxid -> ^ ..0xffffffff RGBStd.SealWitness} + , attachments {RGBCommit.AttachId -> [Byte ^ ..0xffffff]} + , secretSeals {RGBCommit.XChainBlindSealTxPtr ^ ..0xffffff} , typeSystem StrictTypes.TypeSystem - , identities {RGB.Identity -> RGBStd.TrustLevel} + , identities {RGBCommit.Identity -> RGBStd.TrustLevel} , libs {AluVM.LibId -> AluVM.Lib} , sigs {RGBStd.ContentId -> RGBStd.ContentSigs} -@mnemonic(visitor-italian-escort) -data MemState : history {RGB.ContractId -> ^ ..0xff RGBState.ContractHistory} +@mnemonic(forum-context-flood) +data MemState : witnesses {RGBCommit.XChainTxid -> ^ ..0xffffffff RGBCommit.WitnessOrd}, contracts {RGBCommit.ContractId -> ^ ..0xff MemContract} diff --git a/stl/Transfer.vesper b/stl/Transfer.vesper index 916e4fa0..8aa59d7a 100644 --- a/stl/Transfer.vesper +++ b/stl/Transfer.vesper @@ -228,8 +228,9 @@ Consignmenttrue rec bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 liquid bytes len=32 wrapped aka=SecretSeal tag=1 state rec RevealedAttach - id bytes len=32 aka=AttachId - mediaType enum MediaType any=255 + file rec AttachState + id bytes len=32 aka=AttachId + mediaType enum MediaType any=255 salt is U64 lock bytes len=2 aka=ReservedBytes2 revealed rec tag=3 @@ -245,8 +246,9 @@ Consignmenttrue rec vout is U32 aka=Vout blinding is U64 state rec RevealedAttach - id bytes len=32 aka=AttachId - mediaType enum MediaType any=255 + file rec AttachState + id bytes len=32 aka=AttachId + mediaType enum MediaType any=255 salt is U64 lock bytes len=2 aka=ReservedBytes2 valencies set len=0..MAX8 aka=Valencies @@ -436,8 +438,9 @@ Consignmenttrue rec bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 liquid bytes len=32 wrapped aka=SecretSeal tag=1 state rec RevealedAttach - id bytes len=32 aka=AttachId - mediaType enum MediaType any=255 + file rec AttachState + id bytes len=32 aka=AttachId + mediaType enum MediaType any=255 salt is U64 lock bytes len=2 aka=ReservedBytes2 revealed rec tag=3 @@ -453,8 +456,9 @@ Consignmenttrue rec vout is U32 aka=Vout blinding is U64 state rec RevealedAttach - id bytes len=32 aka=AttachId - mediaType enum MediaType any=255 + file rec AttachState + id bytes len=32 aka=AttachId + mediaType enum MediaType any=255 salt is U64 lock bytes len=2 aka=ReservedBytes2 redeemed map len=0..MAX8 aka=Redeemed @@ -705,8 +709,9 @@ Consignmenttrue rec bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 liquid bytes len=32 wrapped aka=SecretSeal tag=1 state rec RevealedAttach - id bytes len=32 aka=AttachId - mediaType enum MediaType any=255 + file rec AttachState + id bytes len=32 aka=AttachId + mediaType enum MediaType any=255 salt is U64 lock bytes len=2 aka=ReservedBytes2 revealed rec tag=3 @@ -726,8 +731,9 @@ Consignmenttrue rec vout is U32 aka=Vout blinding is U64 state rec RevealedAttach - id bytes len=32 aka=AttachId - mediaType enum MediaType any=255 + file rec AttachState + id bytes len=32 aka=AttachId + mediaType enum MediaType any=255 salt is U64 lock bytes len=2 aka=ReservedBytes2 valencies set len=0..MAX8 aka=Valencies @@ -968,8 +974,9 @@ Consignmenttrue rec bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 liquid bytes len=32 wrapped aka=SecretSeal tag=1 state rec RevealedAttach - id bytes len=32 aka=AttachId - mediaType enum MediaType any=255 + file rec AttachState + id bytes len=32 aka=AttachId + mediaType enum MediaType any=255 salt is U64 lock bytes len=2 aka=ReservedBytes2 revealed rec tag=3 @@ -989,8 +996,9 @@ Consignmenttrue rec vout is U32 aka=Vout blinding is U64 state rec RevealedAttach - id bytes len=32 aka=AttachId - mediaType enum MediaType any=255 + file rec AttachState + id bytes len=32 aka=AttachId + mediaType enum MediaType any=255 salt is U64 lock bytes len=2 aka=ReservedBytes2 valencies set len=0..MAX8 aka=Valencies @@ -1235,8 +1243,9 @@ Consignmenttrue rec bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 liquid bytes len=32 wrapped aka=SecretSeal tag=1 state rec RevealedAttach - id bytes len=32 aka=AttachId - mediaType enum MediaType any=255 + file rec AttachState + id bytes len=32 aka=AttachId + mediaType enum MediaType any=255 salt is U64 lock bytes len=2 aka=ReservedBytes2 revealed rec tag=3 @@ -1256,8 +1265,9 @@ Consignmenttrue rec vout is U32 aka=Vout blinding is U64 state rec RevealedAttach - id bytes len=32 aka=AttachId - mediaType enum MediaType any=255 + file rec AttachState + id bytes len=32 aka=AttachId + mediaType enum MediaType any=255 salt is U64 lock bytes len=2 aka=ReservedBytes2 valencies set len=0..MAX8 aka=Valencies @@ -1497,8 +1507,9 @@ Consignmenttrue rec bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 liquid bytes len=32 wrapped aka=SecretSeal tag=1 state rec RevealedAttach - id bytes len=32 aka=AttachId - mediaType enum MediaType any=255 + file rec AttachState + id bytes len=32 aka=AttachId + mediaType enum MediaType any=255 salt is U64 lock bytes len=2 aka=ReservedBytes2 revealed rec tag=3 @@ -1518,8 +1529,9 @@ Consignmenttrue rec vout is U32 aka=Vout blinding is U64 state rec RevealedAttach - id bytes len=32 aka=AttachId - mediaType enum MediaType any=255 + file rec AttachState + id bytes len=32 aka=AttachId + mediaType enum MediaType any=255 salt is U64 lock bytes len=2 aka=ReservedBytes2 valencies set len=0..MAX8 aka=Valencies diff --git a/stl/src/main.rs b/stl/src/main.rs index ec16efa2..3cf24119 100644 --- a/stl/src/main.rs +++ b/stl/src/main.rs @@ -26,8 +26,8 @@ use std::io::Write; use commit_verify::CommitmentLayout; use rgbstd::containers::Transfer; use rgbstd::stl::{ - aluvm_stl, bp_core_stl, bp_tx_stl, commit_verify_stl, rgb_contract_stl, rgb_core_stl, - rgb_std_stl, rgb_storage_stl, + aluvm_stl, bp_core_stl, bp_tx_stl, commit_verify_stl, rgb_commit_stl, rgb_contract_stl, + rgb_logic_stl, rgb_std_stl, rgb_storage_stl, }; use strict_types::stl::{std_stl, strict_types_stl}; use strict_types::{parse_args, StlFormat, SystemBuilder}; @@ -104,7 +104,8 @@ fn main() { let std = std_stl(); let rgb = rgb_std_stl(); - let core = rgb_core_stl(); + let rgb_commit = rgb_commit_stl(); + let rgb_logic = rgb_logic_stl(); let tx = bp_tx_stl(); let bp = bp_core_stl(); let cv = commit_verify_stl(); @@ -114,7 +115,9 @@ fn main() { let sys = SystemBuilder::new() .import(rgb) .unwrap() - .import(core) + .import(rgb_logic) + .unwrap() + .import(rgb_commit) .unwrap() .import(vm) .unwrap() From d1479bb01446eaf786615a17cd5b052dbf7c3d32 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Sat, 27 Jul 2024 09:27:37 +0200 Subject: [PATCH 04/12] chore: export OutputAssignments and KnownState --- src/lib.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index 2cf25b6e..92ec2d38 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -55,7 +55,10 @@ mod contract; pub mod info; pub use bp::{Outpoint, Txid}; -pub use contract::{BundleExt, MergeReveal, MergeRevealError, RevealError, TypedAssignsExt}; +pub use contract::{ + BundleExt, KnownState, MergeReveal, MergeRevealError, OutputAssignment, RevealError, + TypedAssignsExt, +}; pub use invoice::{Allocation, Amount, CoinAmount, OwnedFraction, Precision, TokenIndex}; pub use rgb::prelude::*; pub use rgb::rgbasm; From e2b8a6a3ed54d6feb6be9a6463d124d37063724f Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Sat, 27 Jul 2024 09:50:07 +0200 Subject: [PATCH 05/12] chore: fix clippy lints --- src/contract/assignments.rs | 3 +-- src/persistence/stock.rs | 3 +++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/contract/assignments.rs b/src/contract/assignments.rs index c2d7dae7..f1b91304 100644 --- a/src/contract/assignments.rs +++ b/src/contract/assignments.rs @@ -143,8 +143,7 @@ impl OutputAssignment { } } - pub fn transmute(self) -> OutputAssignment - where S: From { + pub fn transmute>(self) -> OutputAssignment { OutputAssignment { opout: self.opout, seal: self.seal, diff --git a/src/persistence/stock.rs b/src/persistence/stock.rs index 872c8fa0..19f68683 100644 --- a/src/persistence/stock.rs +++ b/src/persistence/stock.rs @@ -500,6 +500,7 @@ impl Stock { Ok(self.stash.geneses()?.map(ContractInfo::with)) } + #[allow(clippy::multiple_bound_locations)] pub fn contracts_by<'a, C: IfaceClass + 'a>( &'a self, ) -> Result + 'a, StockError> @@ -525,6 +526,7 @@ impl Stock { Ok(self.index.contracts_assigning(outputs)?) } + #[allow(clippy::type_complexity)] fn contract_raw( &self, contract_id: ContractId, @@ -545,6 +547,7 @@ impl Stock { .map_err(StockError::from) } + #[allow(clippy::multiple_bound_locations)] pub fn contract_iface_class<'a, C: IfaceClass>( &'a self, contract_id: ContractId, From 3bcfa6951c638820b29becc0e215411124179fb9 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Sat, 27 Jul 2024 20:50:03 +0200 Subject: [PATCH 06/12] persistence: ensuring the global state matches consensus --- Cargo.lock | 2 +- src/containers/consignment.rs | 7 + src/interface/contract.rs | 69 +++++----- src/persistence/memory.rs | 178 +++++++++++++++++++----- src/persistence/mod.rs | 2 +- src/persistence/state.rs | 12 +- src/persistence/stock.rs | 7 +- src/stl/stl.rs | 4 +- stl/RGBStd@0.11.0.sta | 200 +++++++++++++-------------- stl/RGBStd@0.11.0.stl | Bin 19331 -> 19331 bytes stl/RGBStd@0.11.0.sty | 94 ++++++------- stl/RGBStorage@0.11.0.sta | 249 +++++++++++++++++----------------- stl/RGBStorage@0.11.0.stl | Bin 13013 -> 13078 bytes stl/RGBStorage@0.11.0.sty | 197 ++++++++++++++------------- stl/Transfer.vesper | 2 +- 15 files changed, 572 insertions(+), 451 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ac5db827..ca60ab95 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -661,7 +661,7 @@ dependencies = [ [[package]] name = "rgb-core" version = "0.11.0-beta.6" -source = "git+https://github.com/RGB-WG/rgb-core?branch=mining#c40fd131f4ce9d39e55155b317cc3ceaec052ac0" +source = "git+https://github.com/RGB-WG/rgb-core?branch=mining#aef42cbe2a386f5af72e94260814c4ee46ae1cb2" dependencies = [ "aluvm", "amplify", diff --git a/src/containers/consignment.rs b/src/containers/consignment.rs index 63124ec1..f8edc1f3 100644 --- a/src/containers/consignment.rs +++ b/src/containers/consignment.rs @@ -57,6 +57,7 @@ pub type Contract = Consignment; pub trait ConsignmentExt { fn contract_id(&self) -> ContractId; fn schema_id(&self) -> SchemaId; + fn schema(&self) -> &Schema; fn genesis(&self) -> &Genesis; fn extensions(&self) -> impl Iterator; fn bundled_witnesses(&self) -> impl Iterator; @@ -69,6 +70,9 @@ impl ConsignmentExt for &C { #[inline] fn schema_id(&self) -> SchemaId { (*self).schema_id() } + #[inline] + fn schema(&self) -> &Schema { (*self).schema() } + #[inline] fn genesis(&self) -> &Genesis { (*self).genesis() } @@ -262,6 +266,9 @@ impl ConsignmentExt for Consignment { #[inline] fn schema_id(&self) -> SchemaId { self.schema.schema_id() } + #[inline] + fn schema(&self) -> &Schema { &self.schema } + #[inline] fn genesis(&self) -> &Genesis { &self.genesis } diff --git a/src/interface/contract.rs b/src/interface/contract.rs index e4f9fae2..7a8fdc5e 100644 --- a/src/interface/contract.rs +++ b/src/interface/contract.rs @@ -22,8 +22,9 @@ use std::borrow::Borrow; use std::cmp::Ordering; use std::collections::HashMap; +use std::marker::PhantomData; -use amplify::confinement::{SmallOrdSet, SmallVec}; +use amplify::confinement::SmallOrdSet; use invoice::{Allocation, Amount}; use rgb::vm::AssignmentWitness; use rgb::{ @@ -31,8 +32,7 @@ use rgb::{ VoidState, XOutpoint, XOutputSeal, XWitnessId, }; use strict_encoding::{FieldName, StrictDecode, StrictDumb, StrictEncode}; -use strict_types::typify::TypedVal; -use strict_types::{decode, StrictVal, TypeSystem}; +use strict_types::{StrictVal, TypeSystem}; use crate::contract::{KnownState, OutputAssignment}; use crate::info::ContractInfo; @@ -45,10 +45,6 @@ use crate::LIB_NAME_RGB_STD; pub enum ContractError { /// field name {0} is unknown to the contract interface FieldNameUnknown(FieldName), - - #[from] - #[display(inner)] - Reify(decode::Error), } #[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, Display, From)] @@ -210,24 +206,26 @@ impl IfaceOp { /// Contract state is an in-memory structure providing API to read structured /// data from the [`rgb::ContractHistory`]. #[derive(Clone, Eq, PartialEq, Debug)] -pub struct ContractIface { +pub struct ContractIface<'c, S: ContractStateRead<'c>> { pub state: S, pub schema: Schema, pub iface: IfaceImpl, pub types: TypeSystem, pub info: ContractInfo, + pub _phantom: PhantomData<&'c ()>, } -// TODO: Introduce witness checker: additional filter returning only those data -// which witnesses are mined -impl ContractIface { +impl<'c, S: ContractStateRead<'c>> ContractIface<'c, S> { pub fn contract_id(&self) -> ContractId { self.state.contract_id() } /// # Panics /// /// If data are corrupted and contract schema doesn't match interface /// implementations. - pub fn global(&self, name: impl Into) -> Result, ContractError> { + pub fn global( + &'c self, + name: impl Into, + ) -> Result + 'c, ContractError> { let name = name.into(); let type_id = self .iface @@ -238,22 +236,19 @@ impl ContractIface { .global_types .get(&type_id) .expect("schema doesn't match interface"); - let state = self + Ok(self .state .global(type_id) - .values() + .expect("schema doesn't match interface") .map(|data| { self.types .strict_deserialize_type(global_schema.sem_id, data.borrow().as_slice()) - .map(TypedVal::unbox) - }) - .take(global_schema.max_items as usize) - .collect::, _>>()?; - - Ok(SmallVec::from_collection_unsafe(state)) + .expect("unvalidated contract data in stash") + .unbox() + })) } - fn extract_state<'c, A, U>( + fn extract_state( &'c self, state: impl IntoIterator> + 'c, name: impl Into, @@ -276,7 +271,7 @@ impl ContractIface { .map(OutputAssignment::::transmute)) } - pub fn rights<'c>( + pub fn rights( &'c self, name: impl Into, filter: impl OutpointFilter + 'c, @@ -284,7 +279,7 @@ impl ContractIface { self.extract_state(self.state.rights_all(), name, filter) } - pub fn fungible<'c>( + pub fn fungible( &'c self, name: impl Into, filter: impl OutpointFilter + 'c, @@ -292,7 +287,7 @@ impl ContractIface { self.extract_state(self.state.fungible_all(), name, filter) } - pub fn data<'c>( + pub fn data( &'c self, name: impl Into, filter: impl OutpointFilter + 'c, @@ -300,7 +295,7 @@ impl ContractIface { self.extract_state(self.state.data_all(), name, filter) } - pub fn attachments<'c>( + pub fn attachments( &'c self, name: impl Into, filter: impl OutpointFilter + 'c, @@ -308,7 +303,7 @@ impl ContractIface { self.extract_state(self.state.attach_all(), name, filter) } - pub fn allocations<'c>( + pub fn allocations( &'c self, filter: impl OutpointFilter + Copy + 'c, ) -> impl Iterator + 'c { @@ -335,14 +330,14 @@ impl ContractIface { } pub fn outpoint_allocations( - &self, + &'c self, outpoint: XOutpoint, - ) -> impl Iterator + '_ { + ) -> impl Iterator + 'c { self.allocations(outpoint) } // TODO: Ignore blank state transition - fn operations<'c, C: StateChange>( + fn operations( &'c self, state: impl IntoIterator> + 'c, allocations: impl Iterator> + 'c, @@ -388,9 +383,9 @@ impl ContractIface { } pub fn fungible_ops>( - &self, + &'c self, name: impl Into, - outpoint_filter: impl OutpointFilter + Copy, + outpoint_filter: impl OutpointFilter + Copy + 'c, ) -> Result>, ContractError> { Ok(self.operations( self.state @@ -402,9 +397,9 @@ impl ContractIface { } pub fn data_ops>( - &self, + &'c self, name: impl Into, - outpoint_filter: impl OutpointFilter + Copy, + outpoint_filter: impl OutpointFilter + Copy + 'c, ) -> Result>, ContractError> { Ok(self.operations( self.state @@ -416,9 +411,9 @@ impl ContractIface { } pub fn rights_ops>( - &self, + &'c self, name: impl Into, - outpoint_filter: impl OutpointFilter + Copy, + outpoint_filter: impl OutpointFilter + Copy + 'c, ) -> Result>, ContractError> { Ok(self.operations( self.state @@ -430,9 +425,9 @@ impl ContractIface { } pub fn attachment_ops>( - &self, + &'c self, name: impl Into, - outpoint_filter: impl OutpointFilter + Copy, + outpoint_filter: impl OutpointFilter + Copy + 'c, ) -> Result>, ContractError> { Ok(self.operations( self.state diff --git a/src/persistence/memory.rs b/src/persistence/memory.rs index d4064bb9..4f89c8b5 100644 --- a/src/persistence/memory.rs +++ b/src/persistence/memory.rs @@ -20,19 +20,26 @@ // limitations under the License. use std::borrow::Borrow; -use std::collections::BTreeSet; +use std::cmp::Ordering; +use std::collections::{BTreeMap, BTreeSet}; use std::convert::Infallible; +use std::marker::PhantomData; #[cfg(feature = "fs")] use std::path::PathBuf; +use std::{iter, mem}; use aluvm::library::{Lib, LibId}; use amplify::confinement::{ self, Confined, LargeOrdMap, LargeOrdSet, MediumBlob, MediumOrdMap, MediumOrdSet, SmallOrdMap, TinyOrdMap, TinyOrdSet, }; +use amplify::num::u24; use bp::dbc::tapret::TapretCommitment; use commit_verify::{CommitId, Conceal}; -use rgb::vm::{ContractState, GlobalOrd, WitnessAnchor}; +use rgb::vm::{ + ContractState, GlobalContractState, GlobalOrd, GlobalStateIter, UnknownGlobalStateType, + WitnessAnchor, +}; use rgb::{ Assign, AssignmentType, Assignments, AssignmentsRef, AttachId, AttachState, BundleId, ContractId, DataState, ExposedSeal, ExposedState, Extension, FungibleState, Genesis, @@ -464,7 +471,7 @@ impl StoreTransaction for MemState { impl StateProvider for MemState {} impl StateReadProvider for MemState { - type ContractRead<'a> = MemContractFiltered<'a>; + type ContractRead<'a> = MemContractFiltered<'a, 'a>; type Error = StateInconsistency; fn contract_state( @@ -482,7 +489,7 @@ impl StateReadProvider for MemState { Ok(MemContractFiltered { filter: Box::new(filter), unfiltered, - _empty: empty!(), + _phantom: PhantomData, }) } } @@ -493,9 +500,10 @@ impl StateWriteProvider for MemState { fn register_contract( &mut self, + schema: &Schema, genesis: &Genesis, - contract_id: ContractId, ) -> Result, Self::Error> { + let contract_id = genesis.contract_id(); // This crazy construction is caused by a stupidity of rust borrow checker let mut contract = if self.contracts.contains_key(&contract_id) { if let Some(contract) = self.contracts.get_mut(&contract_id) { @@ -505,7 +513,7 @@ impl StateWriteProvider for MemState { } } else { self.contracts - .insert(contract_id, MemContract::new(genesis.schema_id, contract_id))?; + .insert(contract_id, MemContract::new(schema, contract_id))?; self.contracts.get_mut(&contract_id).expect("just inserted") }; contract.add_genesis(genesis)?; @@ -520,12 +528,26 @@ impl StateWriteProvider for MemState { } } -// TODO: Consider uplifting to state module and make it universal for all state -// manager implementations -pub struct MemContractFiltered<'mem> { - filter: Box bool + 'mem>, - unfiltered: &'mem MemContract, - _empty: LargeOrdMap, +#[derive(Getters, Clone, Eq, PartialEq, Debug)] +#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] +#[strict_type(lib = LIB_NAME_RGB_STORAGE)] +#[cfg_attr( + feature = "serde", + derive(Serialize, Deserialize), + serde(crate = "serde_crate", rename_all = "camelCase") +)] +pub struct MemGlobalState { + known: LargeOrdMap, + limit: u24, +} + +impl MemGlobalState { + pub fn new(limit: u24) -> Self { + MemGlobalState { + known: empty!(), + limit, + } + } } /// Contract history accumulates raw data from the contract history, extracted @@ -548,7 +570,7 @@ pub struct MemContract { #[getter(as_copy)] contract_id: ContractId, #[getter(skip)] - global: TinyOrdMap>, + global: TinyOrdMap, rights: LargeOrdSet>, fungibles: LargeOrdSet>, data: LargeOrdSet>, @@ -556,11 +578,17 @@ pub struct MemContract { } impl MemContract { - pub fn new(schema_id: SchemaId, contract_id: ContractId) -> Self { + pub fn new(schema: &Schema, contract_id: ContractId) -> Self { + let global = TinyOrdMap::from_iter_unsafe( + schema + .global_types + .iter() + .map(|(ty, glob)| (*ty, MemGlobalState::new(glob.max_items))), + ); MemContract { - schema_id, + schema_id: schema.schema_id(), contract_id, - global: empty!(), + global, rights: empty!(), fungibles: empty!(), data: empty!(), @@ -572,24 +600,18 @@ impl MemContract { let opid = op.id(); for (ty, state) in op.globals() { - let map = match self.global.get_mut(ty) { - Some(map) => map, - None => { - // TODO: Do not panic here if we merge without checking against the schema - self.global.insert(*ty, empty!()).expect( - "consensus rules violation: do not add to the state consignments without \ - validation against the schema", - ); - self.global.get_mut(ty).expect("just inserted") - } - }; + let map = self + .global + .get_mut(ty) + .expect("global map must be initialized from the schema"); for (idx, s) in state.iter().enumerate() { let idx = idx as u16; let glob_idx = GlobalOrd { witness_anchor, idx, }; - map.insert(glob_idx, s.clone()) + map.known + .insert(glob_idx, s.clone()) .expect("contract global state exceeded 2^32 items, which is unrealistic"); } } @@ -687,10 +709,96 @@ impl MemContract { } } -impl<'mem> ContractState for MemContractFiltered<'mem> { - // TODO: Global state must be filtered! - fn global(&self, ty: GlobalStateType) -> &LargeOrdMap> { - self.unfiltered.global.get(&ty).unwrap_or(&self._empty) +// TODO: Consider uplifting to state module and make it universal for all state +// manager implementations +pub struct MemContractFiltered<'mem, 'me> +where + 'me: 'mem, + 'mem: 'me, +{ + filter: Box bool + 'mem>, + unfiltered: &'mem MemContract, + _phantom: PhantomData<&'me ()>, +} + +impl<'mem, 'me> ContractState<'me> for MemContractFiltered<'mem, 'me> +where + 'me: 'mem, + 'mem: 'me, +{ + fn global( + &'me self, + ty: GlobalStateType, + ) -> Result, UnknownGlobalStateType> { + type Src<'a> = &'a BTreeMap; + type FilteredIter<'a> = Box + 'a>; + struct Iter<'a> { + src: Src<'a>, + iter: FilteredIter<'a>, + last: Option<(GlobalOrd, &'a DataState)>, + depth: u24, + constructor: Box) -> FilteredIter<'a> + 'a>, + } + impl<'a> Iter<'a> { + fn swap(&mut self) -> FilteredIter<'a> { + let mut iter = (self.constructor)(&self.src); + mem::swap(&mut iter, &mut self.iter); + iter + } + } + impl<'a> GlobalStateIter for Iter<'a> { + type Data = &'a DataState; + fn size(&mut self) -> u24 { + let iter = self.swap(); + // TODO: Consuming iterator just to count items is highly inefficient, but I do + // not know any other way of computing this value + let size = iter.count(); + u24::try_from(size as u32).expect("iterator size must fit u24 due to `take` limit") + } + fn prev(&mut self) -> Option<(GlobalOrd, Self::Data)> { + self.last = self.iter.next(); + self.depth += u24::ONE; + self.last() + } + fn last(&mut self) -> Option<(GlobalOrd, Self::Data)> { self.last } + fn reset(&mut self, depth: u24) { + match self.depth.cmp(&depth) { + Ordering::Less => { + let mut iter = Box::new(iter::empty()) as FilteredIter; + mem::swap(&mut self.iter, &mut iter); + self.iter = Box::new(iter.skip(depth.to_usize() - depth.to_usize())) + } + Ordering::Equal => {} + Ordering::Greater => { + let iter = self.swap(); + self.iter = Box::new(iter.skip(depth.to_usize())); + } + } + } + } + + let state = self + .unfiltered + .global + .get(&ty) + .ok_or(UnknownGlobalStateType(ty))?; + let constructor = |src: Src<'mem>| -> FilteredIter<'mem> { + Box::new( + src.iter() + .rev() + .filter(|(ord, _)| ord.witness_id().map(|id| (self.filter)(id)).unwrap_or(true)) + .take(state.limit.to_usize()) + .map(|(ord, state)| (*ord, state)), + ) + }; + let iter = Iter { + src: state.known.as_inner(), + iter: constructor(state.known.as_inner()), + depth: u24::ZERO, + last: None, + constructor: Box::new(constructor), + }; + Ok(GlobalContractState::new(iter)) } fn rights(&self, outpoint: XOutpoint, ty: AssignmentType) -> u32 { @@ -750,7 +858,11 @@ impl<'mem> ContractState for MemContractFiltered<'mem> { } } -impl<'mem> ContractStateRead for MemContractFiltered<'mem> { +impl<'mem, 'me> ContractStateRead<'me> for MemContractFiltered<'mem, 'me> +where + 'me: 'mem, + 'mem: 'me, +{ #[inline] fn contract_id(&self) -> ContractId { self.unfiltered.contract_id } diff --git a/src/persistence/mod.rs b/src/persistence/mod.rs index 796499a2..5be38df8 100644 --- a/src/persistence/mod.rs +++ b/src/persistence/mod.rs @@ -43,7 +43,7 @@ pub use index::{ Index, IndexError, IndexInconsistency, IndexProvider, IndexReadError, IndexReadProvider, IndexWriteError, IndexWriteProvider, }; -pub use memory::{MemContract, MemIndex, MemStash, MemState}; +pub use memory::{MemContract, MemGlobalState, MemIndex, MemStash, MemState}; pub use stash::{ ProviderError as StashProviderError, SchemaIfaces, Stash, StashDataError, StashError, StashInconsistency, StashProvider, StashReadProvider, StashWriteProvider, diff --git a/src/persistence/state.rs b/src/persistence/state.rs index 2f2e2556..6c14c0a8 100644 --- a/src/persistence/state.rs +++ b/src/persistence/state.rs @@ -28,8 +28,8 @@ use invoice::Amount; use rgb::vm::{ContractState, WitnessAnchor}; use rgb::{ AssetTag, AttachState, BlindingFactor, ContractId, DataState, Extension, Genesis, Operation, - RevealedAttach, RevealedData, RevealedValue, SchemaId, Transition, TransitionBundle, VoidState, - XWitnessId, + RevealedAttach, RevealedData, RevealedValue, Schema, SchemaId, Transition, TransitionBundle, + VoidState, XWitnessId, }; use crate::containers::{ConsignmentExt, ToWitnessId}; @@ -151,7 +151,7 @@ impl State

{ ) -> Result<(), StateError

> { let mut state = self .as_provider_mut() - .register_contract(consignment.genesis(), consignment.contract_id()) + .register_contract(consignment.schema(), consignment.genesis()) .map_err(StateError::WriteProvider)?; let mut extension_idx = consignment .extensions() @@ -223,7 +223,7 @@ impl StoreTransaction for State

{ pub trait StateProvider: Debug + StateReadProvider + StateWriteProvider {} pub trait StateReadProvider { - type ContractRead<'a>: ContractStateRead + type ContractRead<'a>: ContractStateRead<'a> where Self: 'a; type Error: Clone + Eq + Error; @@ -240,8 +240,8 @@ pub trait StateWriteProvider: StoreTransaction { fn register_contract( &mut self, + schema: &Schema, genesis: &Genesis, - contract_id: ContractId, ) -> Result, Self::Error>; fn update_contract( @@ -250,7 +250,7 @@ pub trait StateWriteProvider: StoreTransaction { ) -> Result>, Self::Error>; } -pub trait ContractStateRead: ContractState { +pub trait ContractStateRead<'c>: ContractState<'c> { fn contract_id(&self) -> ContractId; fn schema_id(&self) -> SchemaId; fn rights_all(&self) -> impl Iterator>; diff --git a/src/persistence/stock.rs b/src/persistence/stock.rs index 19f68683..e03a0666 100644 --- a/src/persistence/stock.rs +++ b/src/persistence/stock.rs @@ -25,6 +25,7 @@ use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet}; use std::convert::Infallible; use std::error::Error; use std::fmt::Debug; +use std::marker::PhantomData; use amplify::confinement::{Confined, U24}; use amplify::Wrapper; @@ -504,7 +505,7 @@ impl Stock { pub fn contracts_by<'a, C: IfaceClass + 'a>( &'a self, ) -> Result + 'a, StockError> - where C: From>> { + where C: From>> { Ok(self.stash.geneses_by::()?.filter_map(|genesis| { self.contract_iface_class::(genesis.contract_id()) .as_ref() @@ -553,7 +554,7 @@ impl Stock { contract_id: ContractId, ) -> Result> where - C: From>>, + C: From>>, { let (schema_ifaces, state, info) = self.contract_raw(contract_id)?; let iimpl = self.stash.impl_for::(schema_ifaces)?; @@ -567,6 +568,7 @@ impl Stock { iface: iimpl.clone(), types, info, + _phantom: PhantomData, } .into()) } @@ -593,6 +595,7 @@ impl Stock { iface: iimpl.clone(), types, info, + _phantom: PhantomData, }) } diff --git a/src/stl/stl.rs b/src/stl/stl.rs index 3f278ea2..c541a5b5 100644 --- a/src/stl/stl.rs +++ b/src/stl/stl.rs @@ -41,7 +41,7 @@ use crate::LIB_NAME_RGB_STD; /// Strict types id for the library providing standard data types which may be /// used in RGB smart contracts. pub const LIB_ID_RGB_STORAGE: &str = - "stl:kiahgTk7-Udyz6Es-cuB4FO9-mmbjd5t-tF1g6dR-SLT1m4Y#nepal-proxy-zebra"; + "stl:SzlN0IlE-Zga3E46-5Att6!H-f1304sL-g2eJ685-foyjeTE#forbid-watch-invent"; /// Strict types id for the library providing standard data types which may be /// used in RGB smart contracts. @@ -50,7 +50,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:SB0gkjHC-w$83KN1-zSKpnyI-MGoU2n0-8RaJVPk-YIUCocc#soviet-basket-kimono"; + "stl:w4Hvo8zW-bFpTGAI-W6Zn$9u-qqXq$cI-ef0vzlQ-hg!AEZs#carol-edgar-escape"; fn _rgb_std_stl() -> Result { LibBuilder::new(libname!(LIB_NAME_RGB_STD), tiny_bset! { diff --git a/stl/RGBStd@0.11.0.sta b/stl/RGBStd@0.11.0.sta index b2160d60..e5dd77a4 100644 --- a/stl/RGBStd@0.11.0.sta +++ b/stl/RGBStd@0.11.0.sta @@ -1,21 +1,21 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:SB0gkjHC-w$83KN1-zSKpnyI-MGoU2n0-8RaJVPk-YIUCocc#soviet-basket-kimono +Id: stl:w4Hvo8zW-bFpTGAI-W6Zn$9u-qqXq$cI-ef0vzlQ-hg!AEZs#carol-edgar-escape Name: RGBStd Dependencies: StrictTypes#century-comrade-chess, AluVM#congo-archive-folio, BPCore#garbo-radius-peru, + RGBCommit#orbit-airport-voice, Std#ralph-blue-lucky, CommitVerify#tennis-peace-olympic, - Bitcoin#signal-color-cipher, - RGBCommit#poem-amen-provide -Check-SHA256: 94d61d4c25eee8a53f35c6352d142e9a573bd324841017e42e4f634d3eb03ce9 + Bitcoin#signal-color-cipher +Check-SHA256: 917354510ec641422fcd5b08ae9d6cb831e5839ebe9794e5306a04090a6f0ac8 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 -Wy&lbZ-bfLFbqC#o>4E?M+l67UG^w8*<_XZ#%uyqCj(P-WZ}`>96CYQxM)es+421}!Q~o5fc_fP)zRw7=FYk8VUzOX>?<6X>R%PnDSh_ -Z-QlfPi-Gf7)Vx&p_A!QT4j&asc7kjG~WqQM?ynyZEb0E2L(ZFbyiIV01^bJwgM1*ibOBM;9#?)(c8mUNj%`dgQjSJu&d2G{D9FxPD~VF^-4LPKwDZE1AMEFN!zncXl9K5w2;FV{y1jDTJC +C^p$-mHEbO0#qjhQ*>nE(cK(6LD#rwNz2*s{WQVl8bg5o8r0R+^o=IRl4@lPLvL+uX>?X)a%pCH^=uPj +BlbC`N(qzPM@Gr{imSMTSY5T*7C#t%#3&jH2SRCdV{d702L(ZFbyiIV01^bJwgM1*ibOBDT%6aZ| SrJerP1pIOD57`7Ol|-ogQ6Pjg~y>s-v>!^VNPLfWv4Jz0xkJm$nc4yMWR2J-cc#Q6SofWC)gp7L6!Sc 3I$AQVo7AP4Jk3r!|EoW{Zi$060oMN(jLzPuNboiNpoRSWoOdj7+WWC1?EKi+6QrwlvP$n @@ -57,40 +57,40 @@ DJ2dD!I{l`8$n-hZKY7lmuVif;}u9xW_W$|0g2|;snWpq?wXLByHrT!PdFhnqz;9Q#@6CZZuL4t`n9TUcD*&5hFi^PVx{q1b@^7 zTcrn*%qZTXbx0zVQzD2bZKvHRC#b^Ho-KZ`k;Xmr`<4sJYKN!!u{G5u+^j1lf!PF4>GEG3r}NXb#iiL ZewM0IVbbqN^4g)WDG0#SSGl-+Q@e<+6H_!d>A}?>ex&T2C;PAKlCCveQ{N4udSh#@3Dqj&&J9b8~5DZf#|5 -baO&%X>MdwWnpYocu;h5M(yUq2ps*m=2xUDT;RqCgn#@WzFu~@adfH5^@&-|3szxlWo~16RC#b^NWB_v -7yE`g7JPmsUNvXifRDiWpZ<6ZbNTvZE19EWo~pzXnF^bIJ{KZXqHAX+2p+mz -q!3hcVQzD2bZKvHLUnFrY-Ll>ZB|09R9osd9G^&mV=@u*B|k@iff^?C=mvC@noA);b8~5DZc=4-WnpY( -WI=RvVPj}QY-w&}Q)OXnRCsA*T5oByCBEN9T=>W0>u%$${;`BKEO$VG0b8(5pxNmH8B}?2Wn@8fb7^O8 -b3$xsZe&wsVQf@*X=GZDa|tC)BU>oS@xONigke(HCtahRyiRHf-TMdw -WnpYocxhy0bsj>g6`?#s5rWnKhSeO?L~x^!;Y#eFP|P}0Z%Ez^MR;^&ZgXjGZd7@2Wn_u%{;$1;M2o64 -z%IOs&b7QjASZ@7)-q;_V>*V`yb+BFjcr)z~Z#|7V!q4uVJ{nYcaAjmcb8~5D -ZgWCxX>MdwWnpYocu;h5fgb0V4v@cHO73HjlbgFm42mCs2<+~e+;O=m63^mMAVG6;X=iRyWp-s@Y-MCb -VRT_aY-w&}Q)OXnRCrKya)JyEuWS7@0e2{bYWv?No0k%_$#~gq^1qCzduE|50q|r -gTt*-ZIkqGqXDRHN7@cTY-w&}X>MmmVPkY}a)xYW^+v~7{W03rq(;firJ6j(!OVQFqcY-w&}Q)OXnRCrKy -a+46efUz`Mi!Z}iQtl5;XwV(E`Zdd&WRj~^37YhpmjzF7Z*_E&z?57PmRE;x*JyQZ??N1%-?X%h&UrKU%$CX5lEZwTb6rTk%m8vvBgJ_74J{Jehz7Np5g;baSek)I|~ROXFB3|9;oFKZ_7pLug@XZcue%S7~%^Wpi`3=zxYCD0L!x4tB5Hm3vFbl?lapNXe%XU~*fK -J0+Y5Nn~YibZK;X$ZLXo3tD}~kpv`ixis%MV9vZ(?C=Q*>c;WmI`^W!AhivB7pz2;cIX -d9lO&nf5a*AnfQld~-bdb4MdwWnpYocu;h5+M7`mSQb`x -kca!3_>4e9YQ#rfba;u!+d5tm#=h2RwFD4Y -Lug@XZc}Ara%FT=WnpaHg=PS6VPp{$?vC--s`v@B8YHl)C#jpVFzBk!DMw8SR$**qZewX>bKWD7Yo@G% -*b#-tU^&3KX?w7l?~*Sh8@1jRRblZzybDKcZ(?C=Q*>c;W#3O-*!kBY4M~g?F@sh?|4{T^)}<>?j2hN@ -!NP)tgb_zc;Wm98lWo=>KρhviK~w*eJg04e;HYn$=SsX>loIF_owDud_0- +baFX+V1~%|K(CXMeNGCqZ9Jrfz-^4c +1W;i8W#IuP5(!0kbY*UHX>V>qFkyv=$keM8CP2si$rmim(Ekws4U>QXM0|*v-OPCjO=V)bO0J^ce(PcW1p-OKH=(^)qTgDk?v){Y2{bs0f(b7^O8ZDnqBb3$xsZe&wsVQf@*P;_!e?dHP>9R0ZF +SEMRj;Km4qfBYZ5UUs>0bg9bqiCNAIR$**qZew{=d2nS&y&7&8`-VFfe10WfHD}v`L+>hHy6d9F3e5?w +o>3YSP-SFga&u*FLvL+uX>@I6Zgfg$dIyj=yj0m~TwLF91B-Lz;+I~gZmLfZ*F5{VQgh& +Ms;pyX<}?;Py;H}8urLW|I0R=+5HbL-$PaXl1;**YiA}19=cql5L9wuZgXjLX>V>qb#7#AWm6H&L#ixM +u*i?c0&0P(dEtC_h4cCjts9h^`DC;F84*WpZ(?C=Q*>c;Wm98lWo=MdwWnpYocxhx>k8=qnO(R<<%JIK<1B78x*e6}1oxDzJ +3ElvocGBq|L349yXKqquc4c8~Wn@HQbYVhlX>MdwWnpYocxhx|>KFFSbgda38zdDXQo#`G_01v*0&52ohAEX3$~{+&W0M0{2&GbCtpecGzFNi4r|Jm}LvL@6C +Zc}4uWo==5vNdf$cEfHQ12?LRftc&;5JY%0?GSH0jXJ{5?wvjwRC#b^WI=OtX=iS8LTqVnWK(5fY*ctq +baH_n=a&wUzgWZ$SVL%GX>LMnX>MdwWnpYocxhyWaSf9!PV~dK +2uo>;u!nFdemP_$e?^hl+JkM;eY!XZL3DIsV`xcag}C@DyY!@{4YR*LMYs=?Zg_*ktx|21^lzg9sBTBv +4nk~cZe(e0XGURTbZ>Hp{^Dg=h-~N_zJ`Red1EINWrM}GXaQb}6c#qIM2EQ!L349yXKrm}Zgf<6aAl9X +!sthuPUKDEU2%WC`V+X+(UG)mk--2W1{>juaWxcJLug@XZbEEnZe&wsVQf@*P;_#W5WIk~G+K)5%bR49t5yk`^qQ9iPjGK_bd$i8ToRU7hj7c;WkPIeZe&wsVQf@*X=IdA)7t~9tEf?*r}jS36zkMYeK9}${s8)2BzjZ?kPrw{V`yb-W|y2ahx3nF|Vuawki#7NH?S|Q-Q +!u2{b3PW#hbaG*1bV+2Uj4+W$OUgRJVvNU?M2#%ns>Kwa1v8ba_B>T#2Nxy{Ms;pyX<}?;Q*>c;WvQZi +SChz_$|Xx}eRkFNAr%^eLl(1e@}~9=0-ijXfCfo!aCLNZsEea4XlBy!~v3=AX`3Ri2tjjmWpq?wXVr~g2n?Horiuqf0^m>2O`jNRziT$b7#=ya6uYYC;sr@=aCLOm?vf5kh_h+& +YE#h%O8d1V_{UOl9{V;uR#^q%WVpSnQb8~5DZc=4-WnpY(WL9Bp +b!9?qX>MdwWnpYocu;h5+lpEmf)o&SDDwD>KtpQ8M_qJyiO1VIUJ=H=)@ii_5LiQKVQFqtWn*$>bW>$v +Y~6)s0B>Pr5ftu@@z<*O39}j`u&O7io3b$Is?RA$O$kloIF_owDud_0- =Ov5&mq(eSq^TM>JW4?*h+3X!X@fjr@d0IimUQ-Q4pL=yWnpY(WI=RvVPk0QvgUTbnZZteO3IOg0+3WD -We)Tm9OC!w7#?l6>L?y a&2jDVQf=nVQlq!O*mP8`7qV21dnrCyk{{a-lF$FG0V5TNAc?Tc{K=4WprU=VRT{n^sESGu0eNZ)cp(* @@ -114,15 +114,15 @@ VQpn(MrmbiWOGwxZAoO8A%m*X98W>f2s0TH8C&EH;|vtDTYgh)4~t7}WW`YoMQ(L%R$+2!VQzGDn938Q b#DiI%LhXtBc@pg0t!L7$2{bU&sPXOO(dS=5LRJwX<=@3Np5CuQ)O*QWc?UbbJ9Xwr}~3wv^yxa@v}v^ +kiGSR2X#8M$tG2GZIy9X>V>;VRC6_vj9 3RHP;Wm9=`bY*QR01rWKV`y)3Wn@BiZe(m_a|8nc26SO?a%FS?1p)$Z9+vrsy<5&Clo)5)@&l6UwYFh+ -Ofu5^ik9drt)+8X1Pb;^kcqrN>J=(17*>vH+sNfO>T@W!FHOn$!h0|R`SF4r4lPy;H}8urLW|I0R=+5HbL-$PaXl1;**YiA}19=cql0tIhya%FS?1p)$Z9+vrsy<5&C -lo)5)@&l6UwYFh+Ofu5^ik9drt)+8l=4M8LTC~&#`$$#8Iy^W^m+EyXg*jJBgp@?C1dX`@`SF4r4lPy;H}8urLW|I0R=+5HbL-$PaXl1;**YiA}19=cql0|sPobz*E~ +Ofu5^ik9drt)+8X1Pb;^kcqrN>J=(17*>vH+sNfO>T@W!FHOn$!h0|RwlQ4lF#CP({0kA5beTu`TbGnq +*3ot*&Lor=XWH@ulIpd#VR%e3()@~+=qs(Ib6Nxn_DPV5yg=#|Dl8aQ -j%nM-lyl;YKd{1p3O&Ca4i=mV0P+Db=)TwCchBV($ +j%nM-Ei>Xk6pZ8Tv} 11i-T_Q*#6%Ql_a{SPkRLsk8fO~RsUXC??9x?H3SZ*X#DbU|)oXm4@?ZyuKUhrL_QB$OCu+VTUE>b16E -cuX?V{EC+7E3Kt-Xy#@{fm*cG2Kz`=!#X@TN|)+&DTO&#N`#a|t^|#_3vY08WpqMyZe(m_0{QWn@?5-c -f@OS9Z68e-NLGuXlj%@eWslUUXz7MD-%tZ8)f)E5M*qt;o!R{lF5g2{{gO?>qHAX+2p+mzqz*xDZf|s9 +cuX?V{EC+7E3Kt-Xy#@{fm*cG2Kz`=!#X@TN|)+&DTO&#N`#a|t^|#_3vY08WpqMyZe(m_0=6++>M;9# +?)(c8mUNj%`dgQjSJu&d2G{D9FxPD~VNe4q)f)E5M*qt;o!R{lF5g2{{gO?>qHAX+2p+mzqz*xDZf|s9 bZKvHPGN0j1pxpB0s_h`9&dx0-7pM3Z=O*v*GCA9fL-<|HrZsA`NnJlR3|5d(Tr;j#yqcI82>cBr>9x- Cs#sheE97?nsOaXHkbei0?I5NZ-bfLFbqC#o>4E?M+l67UG^w8*<_XZ#%uyqCwOUiX0mI#UQqw(qY;tp 7Zc6+Qb4G4KrzO(t)@DpIsgCw000000R8{~0000001H8GZf|s9bZKvHa|Hna3IQ=o-yZ}>6>Cqk43jf- @@ -131,61 +131,61 @@ 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 +wlQ4lF#CP({0kA5beTu`TbGnq*3oGEG 0000000000{{R30000003t@9}X=iS2Wo~qH015&{>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI~ -v{(W1V6JV*{3!yZ{M3XW@z+p4r4l +v{(W1V6JV*{3!yZ{M3XW@z+pGEG0000000000{{R30000002XbX(Wo2!100{y`>Z4!V _T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+pa{vhfMe3tp+xFv-0Xp&G?S=|}9rRaeU`~uMrbA>C`}q*r8?;yf@?frQ @@ -196,10 +196,10 @@ j4-A{WE1=O5ZN2FSOM~2u5HNtDFUVZ)Px`L*HDD*8{ol0Eq4Mp_;L(KWo~72X>&Z4!V_T!KNI`QJ|h6;Zj ^jB$MPK+?7Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+plyl;YKd{1p3O&Ca4i=mV0P+Db=)TwCchBV(c!8D=zpn(&o-7tVWUa<1Q{n`|; +8{ol0Eq4Mp_;LcaFEi>Xk6pZ8Tvv!8D=zpn(&o-7tVWUa<1Q{n`|; )uYyv!)~4rGOBq10000000030000000000BVRLh7XKrm}Zgg`13IavyqhH(hlyl;YKd{1p3O&Ca4i=mV0 -P+Db=)TwCchBV(c!8D=zpn(&o-7tVWUa<1Q{n`|;)uYyv!)~4rGOBq100000000300000000009c42H~ +j4-A{WE1=O5ZN2FSOM~2u5HNtDFUVZ)Px`L*HDD*8{ol0Eq4Mp_;LcaFEi>Xk6pZ8Tvv!8D=zpn(&o-7tVWUa<1Q{n`|;)uYyv!)~4rGOBq100000000300000000009c42H~ ZewX>a{vhfMe3tp+xFv-0Xp&G?S=|}9rRaeU`~uMrbA>C`}q*r8?;yf@?frQ$owe+rTo-{AMw{vgzX#P !9p!}0yp?_0000000000{{R300000024!+`Z*p@02?9mxqhH(hD`aAk5~ bZKvH00aU61a5C`WdHyG0R(ezZDjxj0RlzpqhH(hC `}q*r35LOoBKkGaY9#cS7Qj{WgyAGcS>>g~&^g7lyl;YKd{1p3O&Ca4i=mV0P+Db=)TwCchBV){=zxYCD0L!x4tB5H +{{R300000031nqEi>Xk6pZ8TxF=zxYCD0L!x4tB5H m3vFbl?lapNXe%XU~*fKJ0+Y4NoHYVWl3ZO0RRU806-uB2}x#QV`WKgaBKz)2Xlyl;YKd{1p3O&Ca4i=mV0P+Db=)TwCc -hBV)lQq$W5tE;F{pQrXd&=l*`O?@#x{Qdy?T_k!`1dtF1X=Y(#Wl3ZKJIcU;0|?Ei>Xk6p +Z8Tw&Qq$W5tE;F{pQrXd&=l*`O?@#x{Qdy?T_k!`1dtF1X=Y(#Wl3ZKJIcU;0|?p#+${pKVqYC33O>~Wpi|4ZEyepNC<6ZbYWy+bYTDq0lk5UVp0y6#Opn49V(cQc;WdI2QadI6-(bd|-i#!&GYaF>qoh8arda{vheR)?jU+FZ2DLr`QR#xHIKjC^A48Li8o%k$8HEod=_ 0000000000{{R30000003v_Z}ZgXjLX>V?G00{v&KD$)QXhhr5^*YH=BF-=cyOsxg-v9sr 000000RI300000000w1pa&K~T00{xZXXT7NJOW`Spw3o_*cmz+=1%_1gm*5-D79nn{HtC70000000030 -0000000009WMy_`Y;SO7asv7BnDSh_Z-QlfPi-Gf7)Vx&p_A!QT4j&asc7kjG~c%9fQB3>bs~EXcCXx( +0000000009WMy_`Y;SO7assw7Tbs~EXcCXx( drQcb3B`Fx$)^%va$Ar)C7cFHZE$Q!WCZ~L2LJ#-AOHhPX>#x3$o4Af`kVHyQ&~TYCSRqgV00000 -000300000000008b7N>_ZDDj_00{#5@tE>lyl;YKd{1p3O&Ca4i=mV0P+Db=)TwCchBV(~iS7Qcy@o`K -sx-hZyo%1Xyg?u*hB?+UW{Twjef1*%00000000300000000006X=!b6Y;yn!0fbj(2M`|_ZDDj_00{!NFEi>Xk6pZ8Tvydtiph_du_c +l6_7Jvu!-2h2yT^5yv>ite$I%(jAWg00000000300000000006X=!b6Y;yn!0fbj(2M`|V!Z000000RI300000001I<Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7 Lu3>C`4HLtfv$so3kRF1PV2}fOp_vjQ6FdFHId|lr&gK9B000000096000000 000VeX=iR>bairNa{vkf;?xyT5z&Ua+M@}mOiDpYxh>^^GknUxTJ!XL#OUcE0frb5ENEw7&f?o%+)B!Z pG}K!%4G?I4vp$|ttu*CMF0Q*000000RI300000000>QQWNBt;WpV=p2w`G#baG*1bN~o%c4cyMX=G&q -1!ie(VQl{xPGN0jWJYOaY-B-mb7^O8ZDnqBRC#b^1_J_VWCHo|nDSh_Z-QlfPi-Gf7)Vx&p_A!QT4j&a -sc7kjG~b8*;$>KfZ0H=mhJ>?uVKfZ0H=mhJ>?uVC`}q*r8?;yf@?frQ$owe+rTo-{AMw{vgzX#P!9p!}0yp?_2y$g}WpZ|9WCG#Q-5feW*SKg& %h~b$G{NN>LxBDo)YaDXjV8yEYGv>06AuO0fiYoI|8ZKC9(55{UNs2(LOhfb*8wh)9?KU_VQpn(Mrmbi -WJP#%Wo~n6Z*Ek1aAgJq0%>Fd`SF4r4lWOW`wsTH9-LlJ`2 +WJP#%Wo~n6Z*Ek1aAgJq0%>FdwlQ4lF#CP({0kA5beTu`TbGnq*3oe1kloHngE|MP08BSqsWn@NaWo%?eY;R&=Y*Tb$bY)a|aAgJq -0%>Fd`SF4r4l)$WoGNrFdwlQ4lF#CP({0kA5beTu`TbGnq*3oe1kloHngE|MP05>8=lWn@NaWo%?kWprUwd2nS00|IGe0{QWn@?5-cf@OS9Z68e-NLGuX -lj%@eWslUUXz7MD-*x0o_}|Wp0vpvv$c&#PW69R$ltr%da5t5w^x+8!q6BVXZDj&Q>Z4!V_T!KNI`QJ| +T9qDk5m#O{2>e1kloHngE|MP05>8=lWn@NaWo%?kWprUwd2nS00|IGe0=6++>M;9#?)(c8mUNj%`dgQj +SJu&d2G{D9FxPD~VRht9_}|Wp0vpvv$c&#PW69R$ltr%da5t5w^x+8!q6BVXZDj&Q>Z4!V_T!KNI`QJ| h6;Zj^jB$MPK+?7Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+pFd`SF4r4lG*S<) +ZDnLeX=Q9=RB~Z%b7^#GZ*Ek1aAgJq0%>FdwlQ4lF#CP({0kA5beTu`TbGnq*3os@(?%#f7ArN-=Rj?7Ns(11a4t%WdcR&qhH(he1kloHngE|MP06;5GoWn@NaWo%?tVQgh?V|i40 -aAgJq0%>Fd`SF4r4lM(yUq2ps*m=2xUDT;RqCgn#@WzFu~@ +aAgJq0%>FdwlQ4lF#CP({0kA5beTu`TbGnq*3oe1kloHngE|MP04o+chWn@-ia%o|1bagle0|IGe00035ZeeX@0!8YhU)%QMkO4aJ @@ -287,10 +287,10 @@ z}|oy`cC#6Uw2{wE+Sw~);*uMH+9Bf@aCY-RuiZDn*}0S0GmZ(?C=0tIh(Ze?Tx2XWo~16 1PWnub7^O8ZDnqB1qWwkZe??6a|Q}@a$#@6CZU+fvcywiMb7^mG2nl6)V`Xr3X>V=`3R87(aBO95 Wo~o^1PNnrZggdCbV+0Z2AHk4+Bm{3x%H=p>4!*u&n~Wpi|4ZEyepNC#tb -Wnpx0asv7BnDSh_Z-QlfPi-Gf7)Vx&p_A!QT4j&asc7kjG~c%9fQB3>bs~EXcCXx(drQcb3B`Fx$)^%v +Wnpx0assw7Tbs~EXcCXx(drQcb3B`Fx$)^%v a$Ar)C7cUkZfdKHyBH|__hx_vscRWAu^w2r{b^x;wDWyGXd29kG60)seH8) -H{-R`;$q)jqasX>b16E cuX?V{EC+7E3Kt-Xc_Cg)w39@m$R6qOEzWQ+NTC@=;u^7-u;qAzHYrYiZOnAva3v<@st9jzbZKvHVQd1*EFN!zncXl9K5w2;FV{y1jDTJCC^p$-mHEbO 0#qkqh9c2>uJC38-{*D7fZ(%hZo23R4S;p`Q9JBQllDyrZDn*}WMOn+00{y`>Z4!V_T!KNI`QJ|h6;Zj ^jB$MPK+?7Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+plyl;YKd{1p3O&Ca4i=mV0P+Db=)TwCchBV(c!8D=zpn(&o-7tVWUa<1Q{n`|; +8{ol0Eq4Mp_;LcaFEi>Xk6pZ8Tvv!8D=zpn(&o-7tVWUa<1Q{n`|; )uYyv!)~4rGOBq100000000300000000006X>M?JbaMa-0!8YhU)%QMkO4aJ;_ZeCe;xE!X<$x_Fs4If -6Z`oP*&DQ20rFt3ZOHs70;T-agdg$OP=xIp;K4#IcLF!~asv7BnDSh_Z-QlfPi-Gf7)Vx&p_A!QT4j&a -sc7kjG~YJCG@<&SffJ|QFn~N>u=2wF+7z(Wqt=tdZk`V^s(Ana000000093000000000YNb8~5DZf#|5 +6Z`oP*&DQ20rFt3ZOHs70;T-agdg$OP=xIp;K4#IcLF!~assw7Tu=2wF+7z(Wqt=tdZk`V^s(Ana000000093000000000YNb8~5DZf#|5 baMa-0!8YhU)%QMkO4aJ;_ZeCe;xE!X<$x_Fs4If6Z`oP*&DQ20rFt3ZOHs70;T-agdg$OP=xIp;K4#I -cLF!~asv7BnDSh_Z-QlfPi-Gf7)Vx&p_A!QT4j&asc7kjG~YJCG@<&SffJ|QFn~N>u=2wF+7z(Wqt=td +cLF!~assw7Tu=2wF+7z(Wqt=td Zk`V^s(Ana000000093000000000SgVQgh?V`*h`00{y`>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C `4HI~v{(W1V6JV*{3!yZ{M3XW@z+pBL;nyzKuw8#O)!=%rNg`*EyOVQ% zZf<7D#KuZac2>un(lB2(hRK3z3Y&cyO}W%9s}tHze0Nwsc~Y$(*XCTCC9RLwJrF!@ zadgeR?5<0){cOR>8L7F6lf@JiHZS5fWHb~!>%2-QaKnlI<4jqNt12JXl(&BV#kW>^ z%Iu#hoBv1(y65C4CFTT|B$lK?v~Iq{qs+KjhOdit^9^AUHU&aXp1hDpVX}^t4{-{2 zNTm~}FkU)}D21DUN*gi}R_P`8M4o_8Cg0;woSY|bMc6QX5rxSwSO}|BbDcs^(dJvOABhM#P)d>Z@Fr*+ VFi8ZXM delta 1846 zcmZpk&e%MiaYEzdKpBOJrz4Gjew^_sW>0=oYK?!cysv~uSogxoF9V`d`>(9bc-dxh zpEJna$vHnaH?xGD)iI|u%$JQ}vY?v6W?x2AuFWgC0~t5#@G3E?r*yvkw|;M%OZO_1 z1A2S9&TZY}sG#0vdCe%T>nUUHS7o-~_8|02}R=O zlM3F9gsm%3TQd2E(j>wPhk;Me6ZU1ix-MZwYt;7BX#! z3|vfvVt%rktHS0*nsG$Lu7Y+0L6>empxsSGb|A*6$qL#AlYNc3H@oTg5>W&I{V`eC zEP$X3C&#NRY+h{ko(KOd$A3Fe;ZmgkAEj$c4w@-pjngngjEr!aYn%?82> z%Y_ssx7e;EtkBnvh~#Wze}8Hnu@F=ROmtHSD%yO@^&=6X21+H;9^M3v112ZJ S$rqmH!gNF#H Terminal} @@ -200,7 +200,7 @@ data Consignmentfalse : version ContainerVer , attachments {RGBCommit.AttachId -> [Byte ^ ..0xffffff]} , signatures {ContentId -> ^ ..0xff ContentSigs} -@mnemonic(limbo-comet-sonata) +@mnemonic(salute-client-between) data Consignmenttrue : version ContainerVer , transfer Std.Bool , terminals {RGBCommit.BundleId -> Terminal} @@ -295,7 +295,7 @@ data IfaceImpl : version VerNo @mnemonic(seminar-data-table) data ImplId : [Byte ^ 32] -@mnemonic(rodent-maximum-bravo) +@mnemonic(sultan-dexter-lotus) data Kit : version ContainerVer , ifaces {Iface ^ ..0xff} , schemata {RGBCommit.Schema ^ ..0xff} diff --git a/stl/RGBStorage@0.11.0.sta b/stl/RGBStorage@0.11.0.sta index 3935f5bd..b249297f 100644 --- a/stl/RGBStorage@0.11.0.sta +++ b/stl/RGBStorage@0.11.0.sta @@ -1,24 +1,24 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:kiahgTk7-Udyz6Es-cuB4FO9-mmbjd5t-tF1g6dR-SLT1m4Y#nepal-proxy-zebra +Id: stl:SzlN0IlE-Zga3E46-5Att6!H-f1304sL-g2eJ685-foyjeTE#forbid-watch-invent Name: RGBStorage Dependencies: StrictTypes#century-comrade-chess, - RGBStd#soviet-basket-kimono, - RGBLogic#second-germany-cloud, AluVM#congo-archive-folio, BPCore#garbo-radius-peru, + RGBLogic#target-locate-justin, + RGBCommit#orbit-airport-voice, + RGBStd#carol-edgar-escape, Std#ralph-blue-lucky, CommitVerify#tennis-peace-olympic, - Bitcoin#signal-color-cipher, - RGBCommit#poem-amen-provide -Check-SHA256: 3984abbc7c8c955e0ac627c9ad0e137f7e512dd105cb14cdc45fc2e9a47c664b + Bitcoin#signal-color-cipher +Check-SHA256: 4702f61a1ba4de530f9500f68ee42ef7d4ca2959106e9c3779ba1572d4ac67d1 -3Q|WxQ*>`~VP|CtMe3tp+xFv-0Xp&G?S=|}9rRaeU`~uMrbA>C`}q*r3sZD*X=8L$d2nTONF5-OF~YJg#w|+22w{tQ*>ld!P;7WA{;OOf`cWj_^7bw123%yMF;1l01e^u=sA@L -Qb$5eZ)a&^VsJHoA?4$swuZp1Wc+9AOf`(TIbyKWjTy4WkGaM+1wm|eR!wgnmidRhTh1hu7-!n@1Cr{s -wqbZoGSd8tmgp<3rE>;CP(yEWWy&lbZ-bfLFbqC#o>4E?M+l67UG^w8*<_XZ#%uyqCj(P-WZ}`>96CYQ -xM)es+421}!Q~o5fc_fP)zRw -7=FYk8VUzOX>?<6X>R%PnDSh_Z-QlfPi-Gf7)Vx&p_A!QT4j&asc7kjG~WqQM?ynyZEb0E2?arHbyiIV +3Q|WxQ*>`~VP|CtMe3tp+xFv-0Xp&G?S=|}9rRaeU`~uMrbA>C`}q*r3sZD*X=8L$d2nTOVsJHoA?4$s +wuZp1Wc+9AOf`(TIbyKWjTy4WkGaM+1wm|eR!wgnmidRhTh1hu7-!n@1Cr{swqbZoGSd8tmgp<3rE>;C +P(yEWWro%lZ6!ob>Z)F^+#%=mzd2Bb4}cMy22w{tQ*>m? +EFN!zncXl9K5w2;FV{y1jDTJCC^p$-mHEbO0#qjhQ*>nE(cK(6LD#rwNz2*s{WQVl8bg5o8r0R+^o=IR +l4@lPLvL+uX>?X)a%pCH^=uPjBlbC`N(qzPM@Gr{imSMTSY5T*7C#t%#3&jH2SRCdV{d702?arHbyiIV 01^bJwgM1*ibOBDT%6aZ|SrJerP1pIOD57`7Ol|-ogQ6Pjg~y>s-v>!^VNPLfWv4Jz0xkJm$nc4y MWR2J-cc#Q6SofWC)gp7L6!Sc3I$AQVo7AP4Jk3r!|EoW{Zi$060oMN(jLzPuNboiNpoRS @@ -63,41 +63,41 @@ Vif;}u9xW_W$|0g2|;snWpq?wXLByHrT!PdFhnqz;9Q#@6CZZuL4t`n9TUcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXbx0zVQzD2bZKvH RC#b^Ho-KZ`k;Xmr`<4sJYKN!!u{G5u+^j1lf!PF4>GEG3r}NXb#iiLZewM0IVbbqN^4g)WDG0#SSGl- -+Q@e<+6H_!d>A}?>ex&T2C;PAKlCCveQ{N4udSh#@3Dqj&&J9b8~5DZf#|5baO&%X>MdwWnpYocu;h5M(yUq -2ps*m=2xUDT;RqCgn#@WzFu~@adfH5^@&-|3szxlWo~16RC#b^NWB_v7yE`g7JPmsUNvXifRDiWpZ<6ZbNTvZE19EWo~pzXnF^bIJ{KZXqHAX+2p+mzq!3hcVQzD2bZKvHLUnFrY-Ll> -ZB|09R9osd9G^&mV=@u*B|k@iff^?C=mvC@noA);b8~5DZc=4-WnpY(WI=RvVPj}QY-w&}Q)OXnRCsA* -T5oByCBEN9T=>W0>u%$${;`BKEO$VG0b8(5pxNmH8B}?2Wn@8fb7^O8b3$xsZe&wsVQf@*X=GZDa|tC) -BU>oS@xONigke(HCtahRyiRHf-TMdwWnpYocxhy0bsj>g6`?#s5rWnK -hSeO?L~x^!;Y#eFP|P}0Z%Ez^MR;^&ZgXjGZd7@2Wn_u%{;$1;M2o64z%IOs&b7QjASZ@7)-q;_V>*V`yb< -VSBPQZ9sOzZX5$Qs*8b`>+BFjcr)z~Z#|7V!q4uVJ{nYcaAjmcb8~5DZgWCxX>MdwWnpYocu;h5fgb0V -4v@cHO73HjlbgFm42mCs2<+~e+;O=m63^mMAVG6;X=iRyWp-s@Y-MCbVRT_aY-w&}Q)OXnRCrKya)JyE -uWS7@0e2{bYWv?No0k%_$#~gq^1qCzduE|50q|rgTt*-ZIkqGqXDRHN7@cTY-w&} -X>MmmVPkY}a)LMnX>MdwWnpYocu;h5lMuXsu{2tXFT+?;?hj39&>gq>HOrf1lB-q;n)I5N1y68qb##-! -lw1;)SBG%dXmxGxLL8mnw6u)Qc}1I}@VaR|$Sxc~b8~5DZdPw;WK(oubY((pX>MdwWnpYocxhymQq$W5 -tE;F{pQrXd&=l*`O?@#x{Qdy?T_k!`1dtF2Q)6glZDC1dmB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`Zq -Bog<<1W#~DWSEea4XlBy!~< -Cy&t2#Tr*=pi4ihF+dwUej^D%Y;;Uvd1Z1j$&Z?;!v;$l{rzVfm%J+c{!D0(A9Khp>v3=AX`3Ri2tjjm -Wpq?wXVGUDy+ac4_6daU{%%bk3j+fu`A*2Y1(Gbp$uTFEsuoy7Xklq?MR;&*X=7=0Q)OXnRCsA*)s0^W -44ZLWpmymk!z-`g4hv-$6z_YxoLZ_neUP>BpbEf7FA*KKfDV^Y;R&=Y*Tb$ -bYA}?>ez-^4c1W;i8W#IuP5(!0kbY*UHX>V>q +Fkyv=$keM8CP2si$rmim(Ekws4U>QXM0|*v-OPCjO=V)bO0J^ce(PcW1p-OKH=(^)qT +gDk?v){Y2{bs0f(b7^O8ZDnqBb3$xsZe&wsVQf@*P;_!e?dHP>9R0ZFSEMRj;Km4qfBYZ5UUs>0bg9bq +iCNAIR$**qZew{=d2nS&y&7&8`-VFfe10WfHD}v`L+>hHy6d9F3e5?wo>3YSP-SFga&u*FLvL+uX>@I6 +Zgfg$dIyj=yj0m~TwLF91B-Lz;+I~gZmLfZ*F5{VQgh&Ms;pyX<}?;Py;H}8urLW|I0R= ++5HbL-$PaXl1;**YiA}19=cql5L9wuZgXjLX>V>qb#7#AWm6H&L#ixMu*i?c0&0P(dEtC_h4cCjts9h^ +`DC;F84*WpZ(?C=Q*>c;Wm98lWo=MdwWnpYocxhx>k8=qnO(R<<%JIK<1B78x*e6}1oxDzJ3ElvocGBq|L349yXKqquc4c8~ +Wn@HQbYVhlX>MdwWnpYocxhx|>KFFSbgda38zdDXQo#`G_0 +1v*0&52ohAEX3$~{+&W0M0{2&GbC +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 >UA(Tr;j#yqcI82>cBr>9x- Cs#sheE97?nsOaXHkb)PY;b5{Lt$`pNWLQ%D(Hkon&*Qwpawq)`VKLB>Wd>h=Ype%b?2724ncEcX=zY$ @@ -153,70 +153,71 @@ X<=@3fzvD`*Td*C*~4P}$n=kpoj->tyfRKrOAiJKV)22*KzX>Mnd(*pTEa(nZJgZT^?2ML$C)mClK yTm8WaJ}8CMy}crPGN0jWJYOaY-Dp&Wo=1hmm!0y(Hu`f(Fijc5*b_M4dVsY!8b|ZDhq!3`K5r ZB}7&X<=@3bC}8#qjhfwd&>tyAtR<)2LcK~xyL-@iqBUFK20Q^G*lRL(MHiY2Qv~?ZfS3BR$+2!VQzGDQ)O*QWc`7zgMJGKo2X9f$R^xB4~9n`Dx!RtcK)nwJ0o00000 -00960{{R30000heb#!oVX>N2+aBp>Va{vkg`SF4r4l(PtOE -LlW@z354$cZcQEw0|O`dPRP3jk}Sl@F(;O)00{#5@tE>lyl;YKd{1p3O&Ca4i=mV0P+Db=)TwCchBV)k +XW=!G^xB4~9n`Dx!RtcK)nwJ0o00000 +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 -q~=AyZH&MKP+bW>$vY;yn! -0{QWn@?5-cf@OS9Z68e-NLGuXlj%@eWslUUXz7MD-;cY(=tr7Plyl;YKd{1p3O&Ca4i=mV0 -P+Db=)TwCchBV){=zxYCD0L!x4tB5Hm3vFbl?lapNXe%XU~*fKJ0+X~NF5-OF~YJg#w|+qTpH7(Xh=OrK%E4t`xv**_;YjPG|`q@y<~A1W*K^0000000000|Nj60000001Z-(y -a{vkgVsJHoA?4$swuZp1Wc+9AOf`(TIbyKWjTy4WkGaM+r!Z9lE%{u?@QI^EqCb}2Q7OO^w+`_q*ddTX -mHSf)0%CAAe<9`Lptgpr6F_xjAC6(~TLj#*ewiHWCDlyl;YKd{1p3O&Ca4i=mV0P+Db=)TwCchBV*siLw(#0aXLM3hA##zZw95i--R%+RvH+ -?}aDv#(shT0000000030|Ns9000009V{dMBa$#e1a{vkg`SF4r4lp9m~TI>-W|y2ahx3nF|Vuawki#7NH?S|Q-Q!u2{b0WN|Y9V9KzIb<5NcH&Uo@#+OEi>Xk6pZ8Tw&Qq$W5tE;F{ +pQrXd&=l*`O?@#x{Qdy?T_k!`1dtF4V{dMBa$#e1Nn`@HFEi>Xk6p +Z8Tw@2rNlD$O59e#ogQsB77jPl+h5j^*S;JXKZg`VQc^j0=6++>M;9#?)(c8mUNj%`dgQj +SJu&d2G{D9FxPD~Vb$)E4oQf!Y4K`P(FaQVwIle)QgI&pHa%8Z1>xis%K;6JM)jb~`pwPhE8JwG@z6IS +%&PYD6hp1e4Hp6!ob>Z)F^+#%=m +zd2Bb4}cMy8AL=u*O5wLWDw%Hqrp}TR8Fs6(a+l@X;Z+|xmA%R0000000000|NsC00000031)R}XK7+= +Wpe-t0>gptqs-Q9T2mMT7U`M)_Ufu$uiPQ$^uIY!h7W)do3>h#7cpnO^z3 +qkU`2%>V!Z000000RR90{{R3000d-VbYTDq0>gptqs-Q9T2mMT7U`M)_Ufu$uiPQ$^uIY!h7W)dn@w8- +unN%Ogv+IWOlAQDZ9;ju-OD&R*`2#>nd!~X9RL6T000000RR90{{R3000v=nbYWv?00{!af$yWt)@)i+ +7y=gQng90cs$Q?$A?NhJIZ%cVfDxO#TYVO?seC1S{QArwfdw7Lk{C1;NUo@^@ZkrrT134;769U7R#~+?oh0LU&6o%67?L@&dLoTDnA0009BO=WFK +Ze(S61_cdoa6)x%WNc+gZe(S6015)OFEi>Xk6pZ8Tw($mV(;bz)!C +mQ_M(k?Vd!kfCo{nDM?)_qK{868FUdwlQ4lF#CP({0kA5beTu`TbGnq*3oEi>Xk6pZ8Tv6dy}<28ig(gSpg+?&9*`C2(3=%09avzwZKZf-~wC% +wlQ4lF#CP({0kA5beTu`TbGnq*3o-W|y2ahx3nF|Vuawki#7NH?S|Q-Q!u2{b +0000000000|Ns90000005@L03WNc+uX>@L7b8|^g)RqK0VQ|Mwn6X+txo3vSYd;;z)HQ~0$c*NFEi +>Xk6pZ8TwtYgi@C#*klFTE}3hP#3Wmki}o*nL&Ed10e7tM;q|~0000000030|Nj600000DV{dMBa$#e1 +Np56icmN6lwlQ4lF#CP({0kA5beTu`TbGnq*3o-W|y2ahx3nF|Vuawki#7NH? +S|Q-Q!u2{b0W8#V&bbGUt!Bq`S1yuTOW~jDcd`iI3^X_>4e9YQ#rfba;u! ++d5tm#=h2RwFCmTFEi>Xk6pZ8Tw%5WIk~G+K)5 +%bR49t5yk`^qQ9d0000000030|Nj6000008O=WFUbYXL71`P;vV`ybgptqs-Q9T2mMT7U`M)_Ufu$uiPQ$^uIY!h7W)dn>)(DfddHPE2~=}XorO3wsWOd +*yR8%b;g^;wLfB`aRS4E@1xAtY+6$o0v73+|Mu#tUa#CC=k&ihP=*hH5t}*38a{pyIM27foOFHbufC9* +xQ=a*L`qQ5aG5b!Ay5DS000000093000000000MPWo~72Wpe-u0=6++>M;9#?)(c8mUNj%`dgQjSJu&d +2G{D9FxPD~VV?*rNjk^^qPoT1+zTRnAg`3vXv9d*8d@RXy~6c6G6J?STM;9#?)(c8mUNj% +`dgQjSJu&d2G{D9FxPD~VFP=UwLKbzE(ciwC3nrXLGTEzPUiqvVS}~6O1M;9#?)(c8mUNj%`dgQjSJu&d2G{D9FxPD~VLhB@b7Kb_&5X6vxqke! +dZgw>z-^4c1W;i8W#IuP5&!@I000000RR90{{R30010<#bZ%vHb7gY?3Ietju +aWwz{0000000960{{R30000Vfd2nS@d2@7SZ30E=qhH(h&PZdlOljoA7|k;k>s6qoa5|8f~g8=WMyu2X>@62a{vkgwlQ4lF#CP({0kA5beTu`TbGnq +*3ogptqs-Q9T2mMT7U`M)_Ufu$ +uiPQ$^uIY!h7W)do1)-Z)X}ib9i^%gOs*8bY}uR&S59aNAMwsm_ykY{pa1{>000000RR600000000eAl +Vsiir0%CAAe<9`Lptgpr6F_xjAC6(~TLj#*ewiHm5LE0xkJm$nc4yMWR2J-cc#Q6SofWC)gp7 +L6!Sc3IbwqHGd)Hlr&gK9B000000096000000000DYX=if)3IfA{@1xAtY+6$o0v73+|Mu#tUa#CC=k&ihP=*hH5u4)F +6;Kh;hPv9L38+j;K}xwT<$*JN%D`Il^nAqV=^+Bcf$yWt)@)i+7y=gQng90cs$Q?$A?NhJIZ%cVfDxO9 +7!WLIXJF3a+g{vC%7&j!i*U+i34;!e>UOOvDqlqa0000000030{{R3000008O=WFUbYXO51_B9pX>@L7 +b8}^L015)OFEi>Xk6pZ8TwtYgi@C#*klFTE}3hP#3Wmki}o*nL&Ed +10e7tM;q}1wlQ4lF#CP({0kA5beTu`TbGnq*3oM;9#?)(c8mUNj%`dgQjSJu&d2G{D9 +FxPD~VV?*rNjk^^qPoT1+zTRnAg`3vXv9d*8d@RXy~6c6G66pQ#!Rc>OgY(gu#$~TxYU$IxWP~f5$uSq +J}hV9QGNgb000000093000000000 -----END STRICT TYPE LIB----- diff --git a/stl/RGBStorage@0.11.0.stl b/stl/RGBStorage@0.11.0.stl index c0fd15c9badb340b2cdb03480018d63064596696..620cd444facc3303d5c497f4385c4b2c876d27ee 100644 GIT binary patch delta 2207 zcmcbbIxTI2#l#NZ`nGH0`BNvi?l|WmGd&{m!4!Bys{3I_Kx+W|kaoe82e2 zwVbG62_~_ZGyi{kwJL7?9mVHg_FD$D@iz$0W&^4WE=f71BbVPi@m9&^3Pv+-b<666 zwiDkS)=!>P>&LY@*JerU<8==Nk6RpFGcUXAl59U)aB@a!ZsOz*x(b`m@fb213Z8Xd zr4zW}ME`N7tj1N94{OR>KmX!eD?MfQ&y>x7Bn91b@{ zn{~6P=zrGDiPD_Rx|hoJOP_C-K9I7(^8B&Tvz!HTXQn;-I{p9ZrmH8r=NX0YK=gX1 zB_^j9Z_bii$HK@qSyEY1flzQv{;zB>xl37yu);mc%7hjDSB@a8Xrh*a4p(x1UP)16 za*1aO6G1n|Yba>3rGo>Cfs3$mUR4D}M&3TRuM5unI(zn|_MMc)A1|0IomutmvxxKB zv%KOGMw22ZA5@i6Ae00q|5mjntSDYqVRD6<1Yw06)T{_AnhP{dOI^T<&o?y}DRHnd zv1aGxm*)WkfKXnT>?p3FNH~}#sv2;z=41kM0s{l{WGi(U!ZEjAS5cloY)!t;sW|z% zx;kOQ1ayf=p79!PR5Hm|Phql}CQ()@Om5e7B5ZB72rC_xe` z2NKa^(61eXZFL_^4A>r)3BnI{`+%MebXijoSGd$pwr`v{nCiAaY%q6(8WbtDPf zdsbXQnSqm_PbPCpD@;DBqfOX-M5Vw$T|2@i0W$_+MIUr+2`lo|QzRS`eR}qUP1-1+ zFqv21gs{Ry{Vu|axDAMKmyf|k!j9i32TT=&lH=q$Ll44^0tFU<@+fh#x)Bk<4os?s qjCOyI`K*5EV|lZ5!=zrH9apBf?l>60Dfp&it({K#!@xT9+ywyl^CnjS delta 2151 zcmbQ1b~SZ^MSzE_!X(2(hyR;v+%5K4m42d`ZK3b-%SWPAgP$a{GA%sL7Ub>}T#^!S z@K#ivl8pZUre@VOKUQpb&aA(d-Ie|MQU>0KpI=x`&bR;8?`?DGUS)DXZ%@~`t$Q35)Y~kt8KreSWvun=FM4h z>sT0BCrc_TDiHGCmlS@2PmTRJ#&7`O;4=T%iu2C5^J5+*aM6A?ZKxD^B#px{3cfS8m0RHYOMrN_w~s8VX}mVI$_fSi7{<~h8vYk>eEx0 zoUTcP2Y~5j@(E2R!q%=8QBWkDu0UC3ww5?y`v@44Lp#nanAzFqutP zo3Q(cN`YT^6((=el_P8#QMtoV&z7)BeR_(7L*u-jJzh zM7XQh;38qi*BKIF(tbk^!fpbE6~U??!-$Ab2c}j-M!hC!Sry%LmMKzO${q#W{rHMC V-BUFxH1~?%&NXId`2^AP7XagS;=TX? diff --git a/stl/RGBStorage@0.11.0.sty b/stl/RGBStorage@0.11.0.sty index 41b325cc..195b91a3 100644 --- a/stl/RGBStorage@0.11.0.sty +++ b/stl/RGBStorage@0.11.0.sty @@ -1,5 +1,5 @@ {- - Id: stl:kiahgTk7-Udyz6Es-cuB4FO9-mmbjd5t-tF1g6dR-SLT1m4Y#nepal-proxy-zebra + Id: stl:SzlN0IlE-Zga3E46-5Att6!H-f1304sL-g2eJ685-foyjeTE#forbid-watch-invent Name: RGBStorage Version: 0.11.0 Description: RGB storage library @@ -28,53 +28,6 @@ import StrictTypes#century-comrade-chess use UnionVariantsSemId#santana-address-pepper use TypeSystem#adrian-boris-sponsor -import RGBStd#soviet-basket-kimono - use PubWitness#paper-visa-storm - use ContentRef#polo-ramirez-parker - use OutputAssignmentVoidState#concept-private-garlic - use SigBlob#insect-cello-avalon - use AnnotationName#domino-waiter-orlando - use TransitionIface#axiom-parker-pyramid - use NamedFieldTransitionType#express-brush-desire - use ExtensionIface#model-ramirez-mentor - use Iface#violin-student-system - use IfaceId#nova-cola-carbon - use ValencyIface#buzzer-holiday-fiber - use Annotations#spend-linda-romeo - use AssignIface#fractal-baker-outside - use VerNo#textile-next-stretch - use OutputAssignmentRevealedData#spoon-info-snow - use NamedFieldValencyType#invest-apollo-inca - use ImplId#seminar-data-table - use SupplSub#canoe-denmark-short - use SealWitness#vanilla-crimson-zero - use Supplement#caviar-zebra-precise - use SchemaIfaces#europe-nina-gopher - use SupplId#pilot-claudia-minute - use NamedFieldExtensionType#tuna-archer-melon - use AnchorSet#shadow-dominic-pencil - use NamedFieldGlobalStateType#museum-ohio-arizona - use GenesisIface#rocket-paradox-press - use IfaceImpl#permit-learn-samba - use ContentSigs#oval-sister-triton - use SupplItem#jargon-orchid-forget - use Modifier#saturn-escort-jordan - use NamedFieldAssignmentType#origin-caramel-flipper - use TrustLevel#cobra-script-albino - use OutputAssignmentRevealedValue#farmer-giraffe-norway - use OutputAssignmentRevealedAttach#hawaii-analog-rubber - use NamedFieldMetaType#prefix-carmen-artist - use NamedVariantu8#star-pilgrim-pilgrim - use GlobalIface#concert-combat-charm - use SupplMap#sailor-observe-bundle - use OwnedIface#delphi-athlete-fresh - use ContentId#scarlet-portal-office - -import RGBLogic#second-germany-cloud - use AssignmentWitness#camilla-bison-chant - use GlobalOrd#natural-lunar-arizona - use WitnessAnchor#scoop-scoop-cadet - import AluVM#congo-archive-folio use Lib#gate-biology-optimal use LibSite#ultra-grace-message @@ -98,51 +51,12 @@ import BPCore#garbo-radius-peru use BlindSealTxid#media-judge-anita use TxPtr#italian-july-eddie -import Std#ralph-blue-lucky - use AlphaCaps#picnic-soprano-aurora - use AsciiPrintable#ultra-sunset-format - use Bool#oxygen-complex-duet - use U5#orbit-graph-sonic - use AlphaNumDash#sponsor-snake-nice - use AlphaCapsNum#aladdin-zebra-marble - use AlphaNumLodash#percent-bingo-caesar - use AlphaCapsLodash#duet-hammer-labor - use AlphaSmallLodash#pioneer-eagle-spell - -import CommitVerify#tennis-peace-olympic - use ProtocolId#shadow-eclipse-program - use Message#druid-blitz-rover - use MerkleHash#horse-popcorn-bundle - use MerkleBlock#pegasus-delta-eddie - use ReservedBytes1#origin-roger-relax - use ReservedBytes2#florida-libra-circus - use TreeNode#kansas-scarlet-ricardo - use ReservedBytes4#young-goblin-academy - use ReservedBytes8#rudolf-tape-adrian - -import Bitcoin#signal-color-cipher - use SeqNo#copper-verbal-ingrid - use TxIn#slang-cherry-gizmo - use Vout#brush-gloria-heroic - use ScriptBytes#equator-cockpit-gong - use TapNodeHash#paprika-amanda-hunter - use LockTime#lobster-liberal-jump - use SigScript#neptune-spiral-sample - use LeafScript#bison-doctor-oscar - use TxOut#aspect-eddie-message - use Sats#metro-picasso-roger - use Witness#engine-daniel-magnum - use Txid#shallow-light-reverse - use TxVer#nepal-symbol-uniform - use InternalPk#habitat-paprika-oliver - use LeafVer#benefit-carbon-africa - use ScriptPubkey#second-lobster-philips - use ByteStr#royal-anatomy-june - use Tx#radar-salon-page - use Outpoint#logo-alamo-madam - use XOnlyPk#clever-swim-carpet +import RGBLogic#target-locate-justin + use AssignmentWitness#camilla-bison-chant + use GlobalOrd#natural-lunar-arizona + use WitnessAnchor#scoop-scoop-cadet -import RGBCommit#poem-amen-provide +import RGBCommit#orbit-airport-voice use ExtensionSchema#active-eddie-empty use BundleId#carmen-farmer-diesel use AttachState#lady-japan-fiesta @@ -160,6 +74,7 @@ import RGBCommit#poem-amen-provide use TransitionType#picture-reflex-brigade use Occurrences#source-olga-mirage use AssignVoidStateBlindSealTxPtr#profit-granite-fuji + use Schema#vocal-hammer-logic use Extension#bandit-consul-empire use MediaType#isabel-heaven-north use AssignmentsBlindSealTxPtr#village-result-bahama @@ -167,12 +82,12 @@ import RGBCommit#poem-amen-provide use PedersenCommitment#pupil-scale-jerome use ConcealedFungible#story-shrink-aloha use TransitionBundle#method-match-logic + use GlobalStateSchema#silk-college-august use AssignRevealedAttachBlindSealTxid#local-memo-modern use TypedAssignsBlindSealTxid#garlic-project-zigzag use AssignRevealedDataBlindSealTxid#fantasy-monica-jump use AssignmentsBlindSealTxid#electra-bishop-helena use ExtensionType#apropos-scoop-viva - use Schema#junior-remote-jordan use RevealedFungible#origin-iris-insect use ConcealedData#ivan-tripod-young use MetaType#quebec-mission-quota @@ -204,7 +119,6 @@ import RGBCommit#poem-amen-provide use XChainSecretSeal#alex-griffin-left use Valencies#light-letter-comet use GlobalState#stadium-barcode-bazaar - use GlobalStateSchema#connect-ricardo-lava use Redeemed#mile-lady-perfect use RevealedAttach#slalom-phantom-voyage use Genesis#round-sound-nectar @@ -216,19 +130,108 @@ import RGBCommit#poem-amen-provide use RevealedData#olivia-copper-stamp use AssignRevealedValueBlindSealTxid#photo-jump-silicon +import RGBStd#carol-edgar-escape + use PubWitness#paper-visa-storm + use ContentRef#polo-ramirez-parker + use OutputAssignmentVoidState#concept-private-garlic + use SigBlob#insect-cello-avalon + use AnnotationName#domino-waiter-orlando + use TransitionIface#axiom-parker-pyramid + use NamedFieldTransitionType#express-brush-desire + use ExtensionIface#model-ramirez-mentor + use Iface#violin-student-system + use IfaceId#nova-cola-carbon + use ValencyIface#buzzer-holiday-fiber + use Annotations#spend-linda-romeo + use AssignIface#fractal-baker-outside + use VerNo#textile-next-stretch + use OutputAssignmentRevealedData#spoon-info-snow + use NamedFieldValencyType#invest-apollo-inca + use ImplId#seminar-data-table + use SupplSub#canoe-denmark-short + use SealWitness#vanilla-crimson-zero + use Supplement#caviar-zebra-precise + use SupplId#pilot-claudia-minute + use NamedFieldExtensionType#tuna-archer-melon + use AnchorSet#shadow-dominic-pencil + use NamedFieldGlobalStateType#museum-ohio-arizona + use GenesisIface#rocket-paradox-press + use IfaceImpl#permit-learn-samba + use ContentSigs#oval-sister-triton + use SupplItem#jargon-orchid-forget + use Modifier#saturn-escort-jordan + use NamedFieldAssignmentType#origin-caramel-flipper + use TrustLevel#cobra-script-albino + use OutputAssignmentRevealedValue#farmer-giraffe-norway + use OutputAssignmentRevealedAttach#hawaii-analog-rubber + use NamedFieldMetaType#prefix-carmen-artist + use NamedVariantu8#star-pilgrim-pilgrim + use GlobalIface#concert-combat-charm + use SchemaIfaces#fossil-nepal-airline + use SupplMap#sailor-observe-bundle + use OwnedIface#delphi-athlete-fresh + use ContentId#scarlet-portal-office + +import Std#ralph-blue-lucky + use AlphaCaps#picnic-soprano-aurora + use AsciiPrintable#ultra-sunset-format + use Bool#oxygen-complex-duet + use U5#orbit-graph-sonic + use AlphaNumDash#sponsor-snake-nice + use AlphaCapsNum#aladdin-zebra-marble + use AlphaNumLodash#percent-bingo-caesar + use AlphaCapsLodash#duet-hammer-labor + use AlphaSmallLodash#pioneer-eagle-spell + +import CommitVerify#tennis-peace-olympic + use ProtocolId#shadow-eclipse-program + use Message#druid-blitz-rover + use MerkleHash#horse-popcorn-bundle + use MerkleBlock#pegasus-delta-eddie + use ReservedBytes1#origin-roger-relax + use ReservedBytes2#florida-libra-circus + use TreeNode#kansas-scarlet-ricardo + use ReservedBytes4#young-goblin-academy + use ReservedBytes8#rudolf-tape-adrian + +import Bitcoin#signal-color-cipher + use SeqNo#copper-verbal-ingrid + use TxIn#slang-cherry-gizmo + use Vout#brush-gloria-heroic + use ScriptBytes#equator-cockpit-gong + use TapNodeHash#paprika-amanda-hunter + use LockTime#lobster-liberal-jump + use SigScript#neptune-spiral-sample + use LeafScript#bison-doctor-oscar + use TxOut#aspect-eddie-message + use Sats#metro-picasso-roger + use Witness#engine-daniel-magnum + use Txid#shallow-light-reverse + use TxVer#nepal-symbol-uniform + use InternalPk#habitat-paprika-oliver + use LeafVer#benefit-carbon-africa + use ScriptPubkey#second-lobster-philips + use ByteStr#royal-anatomy-june + use Tx#radar-salon-page + use Outpoint#logo-alamo-madam + use XOnlyPk#clever-swim-carpet + @mnemonic(carol-salute-aroma) data ContractIndex : publicOpouts {RGBCommit.Opout ^ ..0xffffff}, outpointOpouts {RGBCommit.XChainExplicitSealTxid -> ^ ..0xffffff {RGBCommit.Opout ^ ..0xffffff}} -@mnemonic(absorb-albino-prague) +@mnemonic(quasi-battery-mirror) data MemContract : schemaId RGBCommit.SchemaId , contractId RGBCommit.ContractId - , global {RGBCommit.GlobalStateType -> ^ ..0xff {RGBLogic.GlobalOrd -> ^ ..0xffffffff RGBCommit.DataState}} + , global {RGBCommit.GlobalStateType -> ^ ..0xff MemGlobalState} , rights {RGBStd.OutputAssignmentVoidState ^ ..0xffffffff} , fungibles {RGBStd.OutputAssignmentRevealedValue ^ ..0xffffffff} , data {RGBStd.OutputAssignmentRevealedData ^ ..0xffffffff} , attach {RGBStd.OutputAssignmentRevealedAttach ^ ..0xffffffff} +@mnemonic(bottle-postal-logic) +data MemGlobalState : known {RGBLogic.GlobalOrd -> ^ ..0xffffffff RGBCommit.DataState}, limit U24 + @mnemonic(flower-unicorn-bazaar) data MemIndex : opBundleIndex {RGBCommit.OpId -> ^ ..0xffffff RGBCommit.BundleId} , bundleContractIndex {RGBCommit.BundleId -> ^ ..0xffffff RGBCommit.ContractId} @@ -236,7 +239,7 @@ data MemIndex : opBundleIndex {RGBCommit.OpId -> ^ ..0xffffff RGBCommit , contractIndex {RGBCommit.ContractId -> ^ ..0xff ContractIndex} , terminalIndex {RGBCommit.XChainSecretSeal -> ^ ..0xffffff RGBCommit.Opout} -@mnemonic(control-hobby-rufus) +@mnemonic(candle-john-grid) data MemStash : schemata {RGBCommit.SchemaId -> ^ ..0xff RGBStd.SchemaIfaces} , ifaces {RGBStd.IfaceId -> ^ ..0xff RGBStd.Iface} , geneses {RGBCommit.ContractId -> ^ ..0xff RGBCommit.Genesis} diff --git a/stl/Transfer.vesper b/stl/Transfer.vesper index 8aa59d7a..db12bbb4 100644 --- a/stl/Transfer.vesper +++ b/stl/Transfer.vesper @@ -1552,7 +1552,7 @@ Consignmenttrue rec value rec GlobalStateSchema reserved bytes len=1 aka=ReservedBytes1 semId bytes len=32 aka=SemId - maxItems is U16 + maxItems is U24 ownedTypes map len=0..MAX8 key is U16 aka=AssignmentType value union OwnedStateSchema From 398e9364b5ca13a15f2a97d6f55301ee7c9103a9 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Sun, 28 Jul 2024 09:36:45 +0200 Subject: [PATCH 07/12] persistence: update witness information in MemContractWriter --- src/persistence/memory.rs | 51 ++++++++++++++++++++++++++++++--------- 1 file changed, 40 insertions(+), 11 deletions(-) diff --git a/src/persistence/memory.rs b/src/persistence/memory.rs index 4f89c8b5..694d7907 100644 --- a/src/persistence/memory.rs +++ b/src/persistence/memory.rs @@ -495,7 +495,7 @@ impl StateReadProvider for MemState { } impl StateWriteProvider for MemState { - type ContractWrite<'a> = &'a mut MemContract; + type ContractWrite<'a> = MemContractWriter<'a>; type Error = SerializeError; fn register_contract( @@ -505,7 +505,7 @@ impl StateWriteProvider for MemState { ) -> Result, Self::Error> { let contract_id = genesis.contract_id(); // This crazy construction is caused by a stupidity of rust borrow checker - let mut contract = if self.contracts.contains_key(&contract_id) { + let contract = if self.contracts.contains_key(&contract_id) { if let Some(contract) = self.contracts.get_mut(&contract_id) { contract } else { @@ -516,15 +516,38 @@ impl StateWriteProvider for MemState { .insert(contract_id, MemContract::new(schema, contract_id))?; self.contracts.get_mut(&contract_id).expect("just inserted") }; - contract.add_genesis(genesis)?; - Ok(contract) + let mut writer = MemContractWriter { + writer: Box::new(|wa: WitnessAnchor| -> Result<(), SerializeError> { + // NB: We do not check the existence of the witness since we have a newer + // version anyway and even if it is known we have to replace it + self.witnesses.insert(wa.witness_id, wa.witness_ord)?; + Ok(()) + }), + contract, + }; + writer.add_genesis(genesis)?; + Ok(writer) } fn update_contract( &mut self, contract_id: ContractId, ) -> Result>, Self::Error> { - Ok(self.contracts.get_mut(&contract_id)) + Ok(self + .contracts + .get_mut(&contract_id) + .map(|contract| MemContractWriter { + // We can't move this constructor to a dedicated method due to the rust borrower + // checker + writer: Box::new(|wa: WitnessAnchor| -> Result<(), SerializeError> { + // NB: We do not check the existence of the witness since we have a newer + // version anyway and even if it is known we have to replace + // it + self.witnesses.insert(wa.witness_id, wa.witness_ord)?; + Ok(()) + }), + contract, + })) } } @@ -709,8 +732,6 @@ impl MemContract { } } -// TODO: Consider uplifting to state module and make it universal for all state -// manager implementations pub struct MemContractFiltered<'mem, 'me> where 'me: 'mem, @@ -902,7 +923,12 @@ where } } -impl ContractStateWrite for &mut MemContract { +pub struct MemContractWriter<'mem> { + writer: Box Result<(), SerializeError> + 'mem>, + contract: &'mem mut MemContract, +} + +impl<'mem> ContractStateWrite for MemContractWriter<'mem> { type Error = SerializeError; /// # Panics @@ -910,7 +936,7 @@ impl ContractStateWrite for &mut MemContract { /// If genesis violates RGB consensus rules and wasn't checked against the /// schema before adding to the history. fn add_genesis(&mut self, genesis: &Genesis) -> Result<(), Self::Error> { - self.add_operation(genesis, None); + self.contract.add_operation(genesis, None); Ok(()) } @@ -923,7 +949,9 @@ impl ContractStateWrite for &mut MemContract { transition: &Transition, witness_anchor: WitnessAnchor, ) -> Result<(), Self::Error> { - self.add_operation(transition, Some(witness_anchor)); + (self.writer)(witness_anchor)?; + self.contract + .add_operation(transition, Some(witness_anchor)); Ok(()) } @@ -936,7 +964,8 @@ impl ContractStateWrite for &mut MemContract { extension: &Extension, witness_anchor: WitnessAnchor, ) -> Result<(), Self::Error> { - self.add_operation(extension, Some(witness_anchor)); + (self.writer)(witness_anchor)?; + self.contract.add_operation(extension, Some(witness_anchor)); Ok(()) } } From 90f3efb969eb536743dec2a7682ae8731072eb29 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Sun, 28 Jul 2024 11:05:09 +0200 Subject: [PATCH 08/12] iface: add collecting methods to the ContractIface required to deal with complex lifetime situations downstream --- src/interface/contract.rs | 40 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/src/interface/contract.rs b/src/interface/contract.rs index 7a8fdc5e..472f8a54 100644 --- a/src/interface/contract.rs +++ b/src/interface/contract.rs @@ -279,6 +279,16 @@ impl<'c, S: ContractStateRead<'c>> ContractIface<'c, S> { self.extract_state(self.state.rights_all(), name, filter) } + pub fn rights_all( + &'c self, + name: impl Into, + filter: impl OutpointFilter + 'c, + ) -> Result, ContractError> { + Ok(self + .extract_state(self.state.rights_all(), name, filter)? + .collect()) + } + pub fn fungible( &'c self, name: impl Into, @@ -287,6 +297,16 @@ impl<'c, S: ContractStateRead<'c>> ContractIface<'c, S> { self.extract_state(self.state.fungible_all(), name, filter) } + pub fn fungible_all( + &'c self, + name: impl Into, + filter: impl OutpointFilter + 'c, + ) -> Result, ContractError> { + Ok(self + .extract_state(self.state.fungible_all(), name, filter)? + .collect()) + } + pub fn data( &'c self, name: impl Into, @@ -295,6 +315,16 @@ impl<'c, S: ContractStateRead<'c>> ContractIface<'c, S> { self.extract_state(self.state.data_all(), name, filter) } + pub fn data_all( + &'c self, + name: impl Into, + filter: impl OutpointFilter + 'c, + ) -> Result, ContractError> { + Ok(self + .extract_state(self.state.data_all(), name, filter)? + .collect()) + } + pub fn attachments( &'c self, name: impl Into, @@ -303,6 +333,16 @@ impl<'c, S: ContractStateRead<'c>> ContractIface<'c, S> { self.extract_state(self.state.attach_all(), name, filter) } + pub fn attachments_all( + &'c self, + name: impl Into, + filter: impl OutpointFilter + 'c, + ) -> Result, ContractError> { + Ok(self + .extract_state(self.state.attach_all(), name, filter)? + .collect()) + } + pub fn allocations( &'c self, filter: impl OutpointFilter + Copy + 'c, From 21f9b206697b08f8473092618d9801c197ed576a Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Sun, 28 Jul 2024 19:10:44 +0200 Subject: [PATCH 09/12] epic: new global state iterators instead of collections --- Cargo.lock | 2 +- src/contract/assignments.rs | 7 +- src/contract/mod.rs | 20 ++++ src/interface/contract.rs | 44 ++++--- src/lib.rs | 2 +- src/persistence/memory.rs | 125 ++++++++++---------- src/persistence/state.rs | 4 +- src/persistence/stock.rs | 7 +- src/stl/stl.rs | 2 +- stl/RGBStorage@0.11.0.sta | 229 ++++++++++++++++++------------------ stl/RGBStorage@0.11.0.stl | Bin 13078 -> 13027 bytes stl/RGBStorage@0.11.0.sty | 9 +- 12 files changed, 234 insertions(+), 217 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ca60ab95..0532db74 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -661,7 +661,7 @@ dependencies = [ [[package]] name = "rgb-core" version = "0.11.0-beta.6" -source = "git+https://github.com/RGB-WG/rgb-core?branch=mining#aef42cbe2a386f5af72e94260814c4ee46ae1cb2" +source = "git+https://github.com/RGB-WG/rgb-core?branch=mining#5a824a3c973c28285d116049a43c15bb26d9c7e6" dependencies = [ "aluvm", "amplify", diff --git a/src/contract/assignments.rs b/src/contract/assignments.rs index f1b91304..0dc0053d 100644 --- a/src/contract/assignments.rs +++ b/src/contract/assignments.rs @@ -20,6 +20,7 @@ // limitations under the License. use std::cmp::Ordering; +use std::collections::HashMap; use std::fmt::Debug; use amplify::confinement::SmallVec; @@ -29,7 +30,7 @@ use rgb::vm::AssignmentWitness; use rgb::{ Assign, AssignAttach, AssignData, AssignFungible, AssignRights, AssignmentType, AttachState, DataState, ExposedSeal, ExposedState, OpId, Opout, RevealedAttach, RevealedData, RevealedValue, - TypedAssigns, VoidState, XChain, XOutputSeal, XWitnessId, + TypedAssigns, VoidState, WitnessOrd, XChain, XOutputSeal, XWitnessId, }; use strict_encoding::{StrictDecode, StrictDumb, StrictEncode}; @@ -152,10 +153,10 @@ impl OutputAssignment { } } - pub fn check_witness(&self, filter: impl FnOnce(XWitnessId) -> bool) -> bool { + pub fn check_witness(&self, filter: &HashMap) -> bool { match self.witness { AssignmentWitness::Absent => true, - AssignmentWitness::Present(witness_id) => filter(witness_id), + AssignmentWitness::Present(witness_id) => filter.contains_key(&witness_id), } } } diff --git a/src/contract/mod.rs b/src/contract/mod.rs index 07ac5453..a3ae1fba 100644 --- a/src/contract/mod.rs +++ b/src/contract/mod.rs @@ -26,3 +26,23 @@ mod merge_reveal; pub use assignments::{KnownState, OutputAssignment, TypedAssignsExt}; pub use bundle::{BundleExt, RevealError}; pub use merge_reveal::{MergeReveal, MergeRevealError}; +use rgb::vm::AssignmentWitness; +use rgb::OpId; + +use crate::LIB_NAME_RGB_STD; + +/// Reference to operation element. +#[derive(Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, Display)] +#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] +#[strict_type(lib = LIB_NAME_RGB_STD)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(crate = "serde_crate"))] +#[display("{op}/{no}")] +pub struct OpEl { + pub op: OpId, + pub no: u16, + pub witness: AssignmentWitness, +} + +impl OpEl { + pub fn new(op: OpId, no: u16, witness: AssignmentWitness) -> OpEl { OpEl { op, no, witness } } +} diff --git a/src/interface/contract.rs b/src/interface/contract.rs index 472f8a54..5cb55d27 100644 --- a/src/interface/contract.rs +++ b/src/interface/contract.rs @@ -22,7 +22,6 @@ use std::borrow::Borrow; use std::cmp::Ordering; use std::collections::HashMap; -use std::marker::PhantomData; use amplify::confinement::SmallOrdSet; use invoice::{Allocation, Amount}; @@ -206,16 +205,15 @@ impl IfaceOp { /// Contract state is an in-memory structure providing API to read structured /// data from the [`rgb::ContractHistory`]. #[derive(Clone, Eq, PartialEq, Debug)] -pub struct ContractIface<'c, S: ContractStateRead<'c>> { +pub struct ContractIface { pub state: S, pub schema: Schema, pub iface: IfaceImpl, pub types: TypeSystem, pub info: ContractInfo, - pub _phantom: PhantomData<&'c ()>, } -impl<'c, S: ContractStateRead<'c>> ContractIface<'c, S> { +impl ContractIface { pub fn contract_id(&self) -> ContractId { self.state.contract_id() } /// # Panics @@ -223,9 +221,9 @@ impl<'c, S: ContractStateRead<'c>> ContractIface<'c, S> { /// If data are corrupted and contract schema doesn't match interface /// implementations. pub fn global( - &'c self, + &self, name: impl Into, - ) -> Result + 'c, ContractError> { + ) -> Result + '_, ContractError> { let name = name.into(); let type_id = self .iface @@ -248,7 +246,7 @@ impl<'c, S: ContractStateRead<'c>> ContractIface<'c, S> { })) } - fn extract_state( + fn extract_state<'c, A, U>( &'c self, state: impl IntoIterator> + 'c, name: impl Into, @@ -271,7 +269,7 @@ impl<'c, S: ContractStateRead<'c>> ContractIface<'c, S> { .map(OutputAssignment::::transmute)) } - pub fn rights( + pub fn rights<'c>( &'c self, name: impl Into, filter: impl OutpointFilter + 'c, @@ -279,7 +277,7 @@ impl<'c, S: ContractStateRead<'c>> ContractIface<'c, S> { self.extract_state(self.state.rights_all(), name, filter) } - pub fn rights_all( + pub fn rights_all<'c>( &'c self, name: impl Into, filter: impl OutpointFilter + 'c, @@ -289,7 +287,7 @@ impl<'c, S: ContractStateRead<'c>> ContractIface<'c, S> { .collect()) } - pub fn fungible( + pub fn fungible<'c>( &'c self, name: impl Into, filter: impl OutpointFilter + 'c, @@ -297,7 +295,7 @@ impl<'c, S: ContractStateRead<'c>> ContractIface<'c, S> { self.extract_state(self.state.fungible_all(), name, filter) } - pub fn fungible_all( + pub fn fungible_all<'c>( &'c self, name: impl Into, filter: impl OutpointFilter + 'c, @@ -307,7 +305,7 @@ impl<'c, S: ContractStateRead<'c>> ContractIface<'c, S> { .collect()) } - pub fn data( + pub fn data<'c>( &'c self, name: impl Into, filter: impl OutpointFilter + 'c, @@ -315,7 +313,7 @@ impl<'c, S: ContractStateRead<'c>> ContractIface<'c, S> { self.extract_state(self.state.data_all(), name, filter) } - pub fn data_all( + pub fn data_all<'c>( &'c self, name: impl Into, filter: impl OutpointFilter + 'c, @@ -325,7 +323,7 @@ impl<'c, S: ContractStateRead<'c>> ContractIface<'c, S> { .collect()) } - pub fn attachments( + pub fn attachments<'c>( &'c self, name: impl Into, filter: impl OutpointFilter + 'c, @@ -333,7 +331,7 @@ impl<'c, S: ContractStateRead<'c>> ContractIface<'c, S> { self.extract_state(self.state.attach_all(), name, filter) } - pub fn attachments_all( + pub fn attachments_all<'c>( &'c self, name: impl Into, filter: impl OutpointFilter + 'c, @@ -343,7 +341,7 @@ impl<'c, S: ContractStateRead<'c>> ContractIface<'c, S> { .collect()) } - pub fn allocations( + pub fn allocations<'c>( &'c self, filter: impl OutpointFilter + Copy + 'c, ) -> impl Iterator + 'c { @@ -370,14 +368,14 @@ impl<'c, S: ContractStateRead<'c>> ContractIface<'c, S> { } pub fn outpoint_allocations( - &'c self, + &self, outpoint: XOutpoint, - ) -> impl Iterator + 'c { + ) -> impl Iterator + '_ { self.allocations(outpoint) } // TODO: Ignore blank state transition - fn operations( + fn operations<'c, C: StateChange>( &'c self, state: impl IntoIterator> + 'c, allocations: impl Iterator> + 'c, @@ -422,7 +420,7 @@ impl<'c, S: ContractStateRead<'c>> ContractIface<'c, S> { ops } - pub fn fungible_ops>( + pub fn fungible_ops<'c, C: StateChange>( &'c self, name: impl Into, outpoint_filter: impl OutpointFilter + Copy + 'c, @@ -436,7 +434,7 @@ impl<'c, S: ContractStateRead<'c>> ContractIface<'c, S> { )) } - pub fn data_ops>( + pub fn data_ops<'c, C: StateChange>( &'c self, name: impl Into, outpoint_filter: impl OutpointFilter + Copy + 'c, @@ -450,7 +448,7 @@ impl<'c, S: ContractStateRead<'c>> ContractIface<'c, S> { )) } - pub fn rights_ops>( + pub fn rights_ops<'c, C: StateChange>( &'c self, name: impl Into, outpoint_filter: impl OutpointFilter + Copy + 'c, @@ -464,7 +462,7 @@ impl<'c, S: ContractStateRead<'c>> ContractIface<'c, S> { )) } - pub fn attachment_ops>( + pub fn attachment_ops<'c, C: StateChange>( &'c self, name: impl Into, outpoint_filter: impl OutpointFilter + Copy + 'c, diff --git a/src/lib.rs b/src/lib.rs index 92ec2d38..c14badfc 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -56,7 +56,7 @@ pub mod info; pub use bp::{Outpoint, Txid}; pub use contract::{ - BundleExt, KnownState, MergeReveal, MergeRevealError, OutputAssignment, RevealError, + BundleExt, KnownState, MergeReveal, MergeRevealError, OpEl, OutputAssignment, RevealError, TypedAssignsExt, }; pub use invoice::{Allocation, Amount, CoinAmount, OwnedFraction, Precision, TokenIndex}; diff --git a/src/persistence/memory.rs b/src/persistence/memory.rs index 694d7907..b4d9a684 100644 --- a/src/persistence/memory.rs +++ b/src/persistence/memory.rs @@ -21,9 +21,8 @@ use std::borrow::Borrow; use std::cmp::Ordering; -use std::collections::{BTreeMap, BTreeSet}; +use std::collections::{BTreeMap, BTreeSet, HashMap}; use std::convert::Infallible; -use std::marker::PhantomData; #[cfg(feature = "fs")] use std::path::PathBuf; use std::{iter, mem}; @@ -37,8 +36,8 @@ use amplify::num::u24; use bp::dbc::tapret::TapretCommitment; use commit_verify::{CommitId, Conceal}; use rgb::vm::{ - ContractState, GlobalContractState, GlobalOrd, GlobalStateIter, UnknownGlobalStateType, - WitnessAnchor, + AssignmentWitness, ContractState, GlobalContractState, GlobalOrd, GlobalStateIter, + UnknownGlobalStateType, WitnessAnchor, }; use rgb::{ Assign, AssignmentType, Assignments, AssignmentsRef, AttachId, AttachState, BundleId, @@ -63,7 +62,7 @@ use crate::contract::{KnownState, OutputAssignment}; use crate::interface::{Iface, IfaceClass, IfaceId, IfaceImpl, IfaceRef}; #[cfg(feature = "fs")] use crate::persistence::fs::FsStored; -use crate::LIB_NAME_RGB_STORAGE; +use crate::{OpEl, LIB_NAME_RGB_STORAGE}; ////////// // STASH @@ -471,7 +470,7 @@ impl StoreTransaction for MemState { impl StateProvider for MemState {} impl StateReadProvider for MemState { - type ContractRead<'a> = MemContractFiltered<'a, 'a>; + type ContractRead<'a> = MemContractFiltered<'a>; type Error = StateInconsistency; fn contract_state( @@ -482,15 +481,25 @@ impl StateReadProvider for MemState { .contracts .get(&contract_id) .ok_or(StateInconsistency::UnknownContract(contract_id))?; - let filter = |witness_id: XWitnessId| match self.witnesses.get(&witness_id) { - None | Some(WitnessOrd::Archived) => false, - Some(WitnessOrd::OffChain { .. } | WitnessOrd::OnChain(_)) => true, - }; - Ok(MemContractFiltered { - filter: Box::new(filter), - unfiltered, - _phantom: PhantomData, - }) + let filter = self + .witnesses + .iter() + .filter(|(id, _)| { + let id = **id; + unfiltered + .global + .values() + .map(|state| state.known.keys()) + .flatten() + .any(|el| el.witness == id) || + unfiltered.rights.iter().any(|a| a.witness == id) || + unfiltered.fungibles.iter().any(|a| a.witness == id) || + unfiltered.data.iter().any(|a| a.witness == id) || + unfiltered.attach.iter().any(|a| a.witness == id) + }) + .map(|(id, ord)| (*id, *ord)) + .collect(); + Ok(MemContractFiltered { filter, unfiltered }) } } @@ -554,13 +563,9 @@ impl StateWriteProvider for MemState { #[derive(Getters, Clone, Eq, PartialEq, Debug)] #[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] #[strict_type(lib = LIB_NAME_RGB_STORAGE)] -#[cfg_attr( - feature = "serde", - derive(Serialize, Deserialize), - serde(crate = "serde_crate", rename_all = "camelCase") -)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(crate = "serde_crate"))] pub struct MemGlobalState { - known: LargeOrdMap, + known: LargeOrdMap, limit: u24, } @@ -619,7 +624,7 @@ impl MemContract { } } - fn add_operation(&mut self, op: &impl Operation, witness_anchor: Option) { + fn add_operation(&mut self, op: &impl Operation, witness_id: AssignmentWitness) { let opid = op.id(); for (ty, state) in op.globals() { @@ -628,13 +633,9 @@ impl MemContract { .get_mut(ty) .expect("global map must be initialized from the schema"); for (idx, s) in state.iter().enumerate() { - let idx = idx as u16; - let glob_idx = GlobalOrd { - witness_anchor, - idx, - }; + let el = OpEl::new(opid, idx as u16, witness_id); map.known - .insert(glob_idx, s.clone()) + .insert(el, s.clone()) .expect("contract global state exceeded 2^32 items, which is unrealistic"); } } @@ -672,7 +673,6 @@ impl MemContract { } */ - let witness_id = witness_anchor.map(|wa| wa.witness_id); match op.assignments() { AssignmentsRef::Genesis(assignments) => { self.add_assignments(witness_id, opid, assignments) @@ -685,7 +685,7 @@ impl MemContract { fn add_assignments( &mut self, - witness_id: Option, + witness_id: AssignmentWitness, opid: OpId, assignments: &Assignments, ) { @@ -694,7 +694,7 @@ impl MemContract { assignments: &[Assign], opid: OpId, ty: AssignmentType, - witness_id: Option, + witness_id: AssignmentWitness, ) { for (no, seal, state) in assignments .iter() @@ -702,10 +702,12 @@ impl MemContract { .filter_map(|(n, a)| a.to_revealed().map(|(seal, state)| (n, seal, state))) { let assigned_state = match witness_id { - Some(witness_id) => { + AssignmentWitness::Present(witness_id) => { OutputAssignment::with_witness(seal, witness_id, state, opid, ty, no as u16) } - None => OutputAssignment::with_no_witness(seal, state, opid, ty, no as u16), + AssignmentWitness::Absent => { + OutputAssignment::with_no_witness(seal, state, opid, ty, no as u16) + } }; contract_state .push(assigned_state) @@ -732,26 +734,17 @@ impl MemContract { } } -pub struct MemContractFiltered<'mem, 'me> -where - 'me: 'mem, - 'mem: 'me, -{ - filter: Box bool + 'mem>, +pub struct MemContractFiltered<'mem> { + filter: HashMap, unfiltered: &'mem MemContract, - _phantom: PhantomData<&'me ()>, } -impl<'mem, 'me> ContractState<'me> for MemContractFiltered<'mem, 'me> -where - 'me: 'mem, - 'mem: 'me, -{ +impl<'mem> ContractState for MemContractFiltered<'mem> { fn global( - &'me self, + &self, ty: GlobalStateType, - ) -> Result, UnknownGlobalStateType> { - type Src<'a> = &'a BTreeMap; + ) -> Result, UnknownGlobalStateType> { + type Src<'a> = &'a BTreeMap; type FilteredIter<'a> = Box + 'a>; struct Iter<'a> { src: Src<'a>, @@ -797,21 +790,33 @@ where } } } + // We need this due to the limitations of the rust compiler to enforce lifetimes + // on closures + fn constrained<'a, F: Fn(Src<'a>) -> FilteredIter<'a>>(f: F) -> F { f } let state = self .unfiltered .global .get(&ty) .ok_or(UnknownGlobalStateType(ty))?; - let constructor = |src: Src<'mem>| -> FilteredIter<'mem> { + + let constructor = constrained(move |src: Src<'_>| -> FilteredIter<'_> { Box::new( src.iter() .rev() - .filter(|(ord, _)| ord.witness_id().map(|id| (self.filter)(id)).unwrap_or(true)) - .take(state.limit.to_usize()) - .map(|(ord, state)| (*ord, state)), + .filter_map(|(el, data)| { + let ord = match el.witness.witness_id() { + None => GlobalOrd::genesis(el.no), + Some(id) => { + let ord = self.filter.get(&id)?; + GlobalOrd::with_witness(id, *ord, el.no) + } + }; + Some((ord, data)) + }) + .take(state.limit.to_usize()), ) - }; + }); let iter = Iter { src: state.known.as_inner(), iter: constructor(state.known.as_inner()), @@ -879,11 +884,7 @@ where } } -impl<'mem, 'me> ContractStateRead<'me> for MemContractFiltered<'mem, 'me> -where - 'me: 'mem, - 'mem: 'me, -{ +impl<'mem> ContractStateRead for MemContractFiltered<'mem> { #[inline] fn contract_id(&self) -> ContractId { self.unfiltered.contract_id } @@ -936,7 +937,8 @@ impl<'mem> ContractStateWrite for MemContractWriter<'mem> { /// If genesis violates RGB consensus rules and wasn't checked against the /// schema before adding to the history. fn add_genesis(&mut self, genesis: &Genesis) -> Result<(), Self::Error> { - self.contract.add_operation(genesis, None); + self.contract + .add_operation(genesis, AssignmentWitness::Absent); Ok(()) } @@ -951,7 +953,7 @@ impl<'mem> ContractStateWrite for MemContractWriter<'mem> { ) -> Result<(), Self::Error> { (self.writer)(witness_anchor)?; self.contract - .add_operation(transition, Some(witness_anchor)); + .add_operation(transition, AssignmentWitness::Present(witness_anchor.witness_id)); Ok(()) } @@ -965,7 +967,8 @@ impl<'mem> ContractStateWrite for MemContractWriter<'mem> { witness_anchor: WitnessAnchor, ) -> Result<(), Self::Error> { (self.writer)(witness_anchor)?; - self.contract.add_operation(extension, Some(witness_anchor)); + self.contract + .add_operation(extension, AssignmentWitness::Present(witness_anchor.witness_id)); Ok(()) } } diff --git a/src/persistence/state.rs b/src/persistence/state.rs index 6c14c0a8..fc5f0d79 100644 --- a/src/persistence/state.rs +++ b/src/persistence/state.rs @@ -223,7 +223,7 @@ impl StoreTransaction for State

{ pub trait StateProvider: Debug + StateReadProvider + StateWriteProvider {} pub trait StateReadProvider { - type ContractRead<'a>: ContractStateRead<'a> + type ContractRead<'a>: ContractStateRead where Self: 'a; type Error: Clone + Eq + Error; @@ -250,7 +250,7 @@ pub trait StateWriteProvider: StoreTransaction { ) -> Result>, Self::Error>; } -pub trait ContractStateRead<'c>: ContractState<'c> { +pub trait ContractStateRead: ContractState { fn contract_id(&self) -> ContractId; fn schema_id(&self) -> SchemaId; fn rights_all(&self) -> impl Iterator>; diff --git a/src/persistence/stock.rs b/src/persistence/stock.rs index e03a0666..19f68683 100644 --- a/src/persistence/stock.rs +++ b/src/persistence/stock.rs @@ -25,7 +25,6 @@ use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet}; use std::convert::Infallible; use std::error::Error; use std::fmt::Debug; -use std::marker::PhantomData; use amplify::confinement::{Confined, U24}; use amplify::Wrapper; @@ -505,7 +504,7 @@ impl Stock { pub fn contracts_by<'a, C: IfaceClass + 'a>( &'a self, ) -> Result + 'a, StockError> - where C: From>> { + where C: From>> { Ok(self.stash.geneses_by::()?.filter_map(|genesis| { self.contract_iface_class::(genesis.contract_id()) .as_ref() @@ -554,7 +553,7 @@ impl Stock { contract_id: ContractId, ) -> Result> where - C: From>>, + C: From>>, { let (schema_ifaces, state, info) = self.contract_raw(contract_id)?; let iimpl = self.stash.impl_for::(schema_ifaces)?; @@ -568,7 +567,6 @@ impl Stock { iface: iimpl.clone(), types, info, - _phantom: PhantomData, } .into()) } @@ -595,7 +593,6 @@ impl Stock { iface: iimpl.clone(), types, info, - _phantom: PhantomData, }) } diff --git a/src/stl/stl.rs b/src/stl/stl.rs index c541a5b5..93a1e860 100644 --- a/src/stl/stl.rs +++ b/src/stl/stl.rs @@ -41,7 +41,7 @@ use crate::LIB_NAME_RGB_STD; /// Strict types id for the library providing standard data types which may be /// used in RGB smart contracts. pub const LIB_ID_RGB_STORAGE: &str = - "stl:SzlN0IlE-Zga3E46-5Att6!H-f1304sL-g2eJ685-foyjeTE#forbid-watch-invent"; + "stl:DKVsldZ8-zYwnjtp-igdl80j-eifV0Ef-asKEvF6-JyZP3to#song-wave-story"; /// Strict types id for the library providing standard data types which may be /// used in RGB smart contracts. diff --git a/stl/RGBStorage@0.11.0.sta b/stl/RGBStorage@0.11.0.sta index b249297f..2369a8e9 100644 --- a/stl/RGBStorage@0.11.0.sta +++ b/stl/RGBStorage@0.11.0.sta @@ -1,5 +1,5 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:SzlN0IlE-Zga3E46-5Att6!H-f1304sL-g2eJ685-foyjeTE#forbid-watch-invent +Id: stl:DKVsldZ8-zYwnjtp-igdl80j-eifV0Ef-asKEvF6-JyZP3to#song-wave-story Name: RGBStorage Dependencies: StrictTypes#century-comrade-chess, @@ -11,7 +11,7 @@ Dependencies: Std#ralph-blue-lucky, CommitVerify#tennis-peace-olympic, Bitcoin#signal-color-cipher -Check-SHA256: 4702f61a1ba4de530f9500f68ee42ef7d4ca2959106e9c3779ba1572d4ac67d1 +Check-SHA256: 7757f149c764f7f97d07b74391e57da90d849ba134e72193e1004714e78eb198 3Q|WxQ*>`~VP|CtMe3tp+xFv-0Xp&G?S=|}9rRaeU`~uMrbA>C`}q*r3sZD*X=8L$d2nTOVsJHoA?4$s wuZp1Wc+9AOf`(TIbyKWjTy4WkGaM+1wm|eR!wgnmidRhTh1hu7-!n@1Cr{swqbZoGSd8tmgp<3rE>;C @@ -105,119 +105,118 @@ O=WapWMOn+`Sh#^X0AbZX4L%*5q$))*;M@wXI>IJVg&1PPwC}G3`TWsXK7+=WmI`^W%?FonAcm{gpRna zG2}LOJH|wPc!@bMkfvN&8?kIwGdcCXklq?P<3KgX>@L7b94MOMcrS|4GaIQ6{LE)1tQ>Eiz^#2Wm1QO k9#fajy(@UZ*F5{VQgh&L3DIsV`%?qW59S)fNA-MxPs%HqZ2GTKAXWWi*W4(A64;XFkcK(Wp-s@Y-MCb VRT{t(nscpRQseH2M_=yMbKuEP&Z_j#!rrT134;769U7R#~+?oh0LU&6o%67?L@(D+5Z(?C=PjY0cHl?AQScVAdvLs9|mSg?#oA;1U -G-i?9G&KHXBP}EiS7~%^Wpi^uZewU~at2aILQ`~PC;$dKOOmXVLEy~oQ-C|EJ{=;K=5mqowm^*AJFBo! -g5e5Kbz)a(bZ%vHa|W2Lx7s+uExGllhUte$e$Op^sMk_Bzn7+|3$axzr3yoDZggdCbW&wz8AL=u*O5wL -WDw%Hqrp}TR8Fs6(a+l@X;Z+|xmA%R8BcX|aCLM+b8~5DZf#|5bXIR^WK(oubY&sO7j4igKpjn9r^|;p -@vV@r5S*`M7yxdMqH9J{cMAtoX=g%gZ(=b^-yZ}>6>Cqk43jf-YC|}(kgS&RQe`% -bQtg9OuU(MB+3^mE|~AfiD0OzeAWk8kQh#3ZDnLeX=Q9=RB~Z%b7^#GZ*Ek1aAi1aE_h*Lbg9zSQXNeF -+Qu*8L^1@@Y8ulZ0qRRZb7l@jcywiMb7^mGNoHYVWjV(hK7J55&$qsubbafuzL1-^j%|=cN>I>nnK4)) -Pz6b5VPj=G%D{mG2;nQMTOnwNgyXhzrB~SH04;UKo5i(1Vxw^fNoHYVWl3Z{Yw`7y(SHDgMM6vX0;lo= -W-SMLKDgmdc1Y|2T5mrLR$**qZew{#W?^GxKDS8EHu@2+7MVFP1hs6^$We8|k3le2=(%KZsrQgo3qfvf -Z**aFX>V?GOR30+snp{uYWb)9vpEdM5jV}jv>9vwnX#InoRj)93qf;pX=iRpW?^GxOmsqKkxP5xCLpf? -kur-g(F6&@HI9dWN1yNftOldQ1y*HpPH#~32(7)!VK -whueASIYDuGM{9p;;;bXCQUmt2vc=%aBNd`VqP%zi0g$2n6-TWNhgSA?dx`~TofZYQwM8#9N}@u^b1pE -VQg1vbZ%vHb7MWziLgsaRw~c9&Ny{YCK_TCaeS`x+X~XLW@}|UwF*;paBys8ZDnqBXEKMt2yp8annvOG -PI~_sbHU;fx2Gv#gJM&>FkgU`2UB%$aBN9rX~bo}HX&M*bLmIr&^7fxYq -Wn@NaWo%?ccywiMb7^mGRC#b^YA4Dwm}$*86Pjf30dWpinBNoHYVWrSB|2M`|UOOvDqlqlLvL<$Wo~p+X=ihWz}|oy -`cC#6Uw2{wE+Sw~);*uMH+9Bfu^7-u;qAzHYrYiZOnAv -a3v<@st8SQWNBt;WpbG!D6vtN)nOBt^-8kIfU|q1tW1{=rTuzSVHJ;M)NmM1VQpn(MrmbiWI=OtX=iS2 -Wo~p-d2nT-;91nsu+1H%suE1D6u@lRoC;S?XbB(j&QSOSPz0a~RC0B5bWCM-Wo))uk{2;&?las2cOc^_ -;dM$B=NQ;>bLvEMwWED&%FP{5b#!obbU|}-X=iS2Wo~p*Wp-s@Y-MCtVQh6}yjy)1vZ;I}d;I#$Ab|xP -#*!E`6iBY9uJGXwR=Lnc9#3_2aCLM+b8~5DZf#|5bW&w@WnpY(WI=RvVPj~$frw&K4w%I2J!>5*n2+UE -n$VY06ag%An>_FbOoG7@PGN0jWJYOaY-CMkbYWC^aAm`1<%~T%0%0eh&Q^)o89Ex~PX5eq7+-P0pRHy9#PwI ->UA(Tr;j#yqcI82>cBr>9x- -Cs#sheE97?nsOaXHkb)PY;b5{Lt$`pNWLQ%D(Hkon&*Qwpawq)`VKLB>Wd>h=Ype%b?2724ncEcX=zY$ -X>N33Vr*q$h9c2>uJC38-{*D7fZ(%hZo23R4S;p`Q9JBQllDynLT_(uW>|38j$F|Rkm*bpSUudIqf?x< -LRg@~V42^pIs*%m0#!A5X?SL`Yr0-g|LLO|1Bk8zGh-IHIi*o-3_)ygXkkNPaC1&|ZI#2l$xQ-a`EhCyJoZT~T}~sIjxz)> -1`ZdvNB=ndTz*X~v;Uq>`<)y^XImOPdju4LvR$+2!VQzFzVQpm_v{(W1V6JV*{3!yZ -{M3XW@z+pX9JtzktHWiJ@1L)babHELfN$u@7k>`Uy~S -X>DnAX?A5X{h;vIo29B#Zbv)THgnzJqzni;K&ISmvL -d)pN>Rl&wr9&I-v?L-&~MrmbiWK(5rNn}$N2!s^Lf^?|9I@Xg>Oi(W05|TJ%PM*ricn_PmXk-Xfd2nS; -VQpn(jMNXXYlf+hXQ9AJ%?72#_KJ5v@E-96x!ZDnLeX=Q9=b5mt)Nn~pTqZFQ|l>ioJ -pYH;+t0eX2w~A!Q+0eaZ{MVycPK^aqWo=1heaS*6)M5bHCYFUH@63IY`6K;Dlo$g{Z6f4)7N~Yk2UcNn -X<=@3fzvD`*Td*C*~4P}$n=kpoj->tyfRKrOAiJKV)22*KzX>Mnd(*pTEa(nZJgZT^?2ML$C)mClK -yTm8WaJ}8CMy}crPGN0jWJYOaY-Dp&Wo=1hmm!0y(Hu`f(Fijc5*b_M4dVsY!8b|ZDhq!3`K5r -ZB}7&X<=@3bC}8#qjhfwd&>tyAtR<)2LcK~xyL-@iqBUFK20Q^G*lRL(MHiY2Qv~?ZfS3BR$+2!VQzGDQ)O*QWc`7zgMJGKo2X9f$R^xB4~9n`Dx!RtcK)nwJ0o00000 -00960{{R30000heb#!oVX>N2+aBp>Va{vkgwlQ4lF#CP({0kA5beTu`TbGnq*3oEi>Xk6pZ8Tw% -5WIk~G+K)5%bR49t5yk`^qQ9d0000000030|Nj60000000000000030|Nj600000B -O=WFEZ*FvQVPkX#2MBXxXk~3-Nn`@HFEi>Xk6pZ8Tw&Qq$W5tE;F{ -pQrXd&=l*`O?@#x{Qdy?T_k!`1dtF4V{dMBa$#e1Nn`@HFEi>Xk6p -Z8Tw@2rNlD$O59e#ogQsB77jPl+h5j^*S;JXKZg`VQc^j0=6++>M;9#?)(c8mUNj%`dgQj -SJu&d2G{D9FxPD~Vb$)E4oQf!Y4K`P(FaQVwIle)QgI&pHa%8Z1>xis%K;6JM)jb~`pwPhE8JwG@z6IS -%&PYD6hp1e4Hp6!ob>Z)F^+#%=m -zd2Bb4}cMy8AL=u*O5wLWDw%Hqrp}TR8Fs6(a+l@X;Z+|xmA%R0000000000|NsC00000031)R}XK7+= -Wpe-t0>gptqs-Q9T2mMT7U`M)_Ufu$uiPQ$^uIY!h7W)do3>h#7cpnO^z3 -qkU`2%>V!Z000000RR90{{R3000d-VbYTDq0>gptqs-Q9T2mMT7U`M)_Ufu$uiPQ$^uIY!h7W)dn@w8- -unN%Ogv+IWOlAQDZ9;ju-OD&R*`2#>nd!~X9RL6T000000RR90{{R3000v=nbYWv?00{!af$yWt)@)i+ -7y=gQng90cs$Q?$A?NhJIZ%cVfDxO#TYVO?seC1S{QArwfdw7Lk{C1;NUo@^@ZkrrT134;769U7R#~+?oh0LU&6o%67?L@&dLoTDnA0009BO=WFK -Ze(S61_cdoa6)x%WNc+gZe(S6015)OFEi>Xk6pZ8Tw($mV(;bz)!C -mQ_M(k?Vd!kfCo{nDM?)_qK{868FUdwlQ4lF#CP({0kA5beTu`TbGnq*3oEi>Xk6pZ8Tv6dy}<28ig(gSpg+?&9*`C2(3=%09avzwZKZf-~wC% -wlQ4lF#CP({0kA5beTu`TbGnq*3o-W|y2ahx3nF|Vuawki#7NH?S|Q-Q!u2{b -0000000000|Ns90000005@L03WNc+uX>@L7b8|^g)RqK0VQ|Mwn6X+txo3vSYd;;z)HQ~0$c*NFEi ->Xk6pZ8TwtYgi@C#*klFTE}3hP#3Wmki}o*nL&Ed10e7tM;q|~0000000030|Nj600000DV{dMBa$#e1 -Np56icmN6lwlQ4lF#CP({0kA5beTu`TbGnq*3o-W|y2ahx3nF|Vuawki#7NH? -S|Q-Q!u2{b0W8#V&bbGUt!Bq`S1yuTOW~jDcd`iI3^X_>4e9YQ#rfba;u! -+d5tm#=h2RwFCmTFEi>Xk6pZ8Tw%5WIk~G+K)5 -%bR49t5yk`^qQ9d0000000030|Nj6000008O=WFUbYXL71`P;vV`ybgptqs-Q9T2mMT7U`M)_Ufu$uiPQ$^uIY!h7W)dn>)(DfddHPE2~=}XorO3wsWOd -*yR8%b;g^;wLfB`aRS4E@1xAtY+6$o0v73+|Mu#tUa#CC=k&ihP=*hH5t}*38a{pyIM27foOFHbufC9* -xQ=a*L`qQ5aG5b!Ay5DS000000093000000000MPWo~72Wpe-u0=6++>M;9#?)(c8mUNj%`dgQjSJu&d -2G{D9FxPD~VV?*rNjk^^qPoT1+zTRnAg`3vXv9d*8d@RXy~6c6G6J?STM;9#?)(c8mUNj% -`dgQjSJu&d2G{D9FxPD~VFP=UwLKbzE(ciwC3nrXLGTEzPUiqvVS}~6O1M;9#?)(c8mUNj%`dgQjSJu&d2G{D9FxPD~VLhB@b7Kb_&5X6vxqke! -dZgw>z-^4c1W;i8W#IuP5&!@I000000RR90{{R30010<#bZ%vHb7gY?3Ietju -aWwz{0000000960{{R30000Vfd2nS@d2@7SZ30E=qhH(h&PZdlOljoA7|k;k>s6qoa5|8f~g8=WMyu2X>@62a{vkgwlQ4lF#CP({0kA5beTu`TbGnq -*3ogptqs-Q9T2mMT7U`M)_Ufu$ -uiPQ$^uIY!h7W)do1)-Z)X}ib9i^%gOs*8bY}uR&S59aNAMwsm_ykY{pa1{>000000RR600000000eAl -Vsiir0%CAAe<9`Lptgpr6F_xjAC6(~TLj#*ewiHm5LE0xkJm$nc4yMWR2J-cc#Q6SofWC)gp7 -L6!Sc3IbwqHGd)Hlr&gK9B000000096000000000DYX=if)3IfA{@1xAtY+6$o0v73+|Mu#tUa#CC=k&ihP=*hH5u4)F -6;Kh;hPv9L38+j;K}xwT<$*JN%D`Il^nAqV=^+Bcf$yWt)@)i+7y=gQng90cs$Q?$A?NhJIZ%cVfDxO9 -7!WLIXJF3a+g{vC%7&j!i*U+i34;!e>UOOvDqlqa0000000030{{R3000008O=WFUbYXO51_B9pX>@L7 -b8}^L015)OFEi>Xk6pZ8TwtYgi@C#*klFTE}3hP#3Wmki}o*nL&Ed -10e7tM;q}1wlQ4lF#CP({0kA5beTu`TbGnq*3oM;9#?)(c8mUNj%`dgQjSJu&d2G{D9 -FxPD~VV?*rNjk^^qPoT1+zTRnAg`3vXv9d*8d@RXy~6c6G66pQ#!Rc>OgY(gu#$~TxYU$IxWP~f5$uSq -J}hV9QGNgb000000093000000000 +RCsA*2vSEvOmAmtV*vmKbKuEP&Z_j#!6>Cqk43jf-YC|}(kgS&RQe`%bQtg9OuU(MB+3^mE|~AfiD0OzeAWk8 +kQh#3ZDnLeX=Q9=RB~Z%b7^#GZ*Ek1aAi1aE_h*Lbg9zSQXNeF+Qu*8L^1@@Y8ulZ0qRRZb7l@jcywiM +b7^mGNoHYVWjV(hK7J55&$qsubbafuzL1-^j%|=cN>I>nnK4))Pz6b5VPj=G%D{mG2;nQMTOnwNgyXhz +rB~SH04;UKo5i(1Vxw^fNoHYVWl3Z{Yw`7y(SHDgMM6vX0;lo=W-SMLKDgmdc1Y|2T5mrLR$**qZew{# +W?^GxKDS8EHu@2+7MVFP1hs6^$We8|k3le2=(%KZsrQgo3qfvfZ**aFX>V?GOR30+snp{uYWb)9vpEdM +5jV}jv>9vwnX#InoRj)93qf;pX=iRpW?^GxOmsqKkxP5xCLpf?kur-g(F6&@HI9dWN1yNftOldQ1y*Hp +PH#~32(7)!VKwhueASIYDuGM{9p;;;bXCQUmt2vc=% +aBNd`VqP%zi0g$2n6-TWNhgSA?dx`~TofZYQwM8#9N}@u^b1pEVQg1vbZ%vHb7MWziLgsaRw~c9&Ny{Y +CK_TCaeS`x+X~XLW@}|UwF*;paBys8ZDnqBXEKMt2yp8annvOGPI~_sbHU;fx2Gv#gJM&>FkgU`2UB%$ +aBN9rX~bo}HX&M*bLmIr&^7fxYqWn@NaWo%?ccywiMb7^mGRC#b^YA4Dw +m}$*86Pjf30dWpinBNoHYVWrSB|2M`|UOOvDqlqlLvL<$Wo~p+X=ihWz}|oy`cC#6Uw2{wE+Sw~);*uMH+9Bfu^7-u;qAzHYrYiZOnAva3v<@st8SQWNBt;WpbG!D6vtN)nOBt +^-8kIfU|q1tW1{=rTuzSVHJ;M)NmM1VQpn(MrmbiWI=OtX=iS2Wo~p-d2nT-;91nsu+1H%suE1D6u@lR +oC;S?XbB(j&QSOSPz0a~RC0B5bWCM-Wo))uk{2;&?las2cOc^_;dM$B=NQ;>bLvEMwWED&%FP{5b#!ob +bU|}-X=iS2Wo~p*Wp-s@Y-MCtVQh6}yjy)1vZ;I}d;I#$Ab|xP#*!E`6iBY9uJGXwR=Lnc9#3_2aCLM+ +b8~5DZf#|5bW&w@WnpY(WI=RvVPj~$frw&K4w%I2J!>5*n2+UEn$VY06ag%An>_FbOoG7@PGN0jWJYOa +Y-CMkbYWC^aAm`1<%~T%0%0eh&Q^)o89Ex~PX5eq7+-P0pRHy9#PwI>j(%Z=tP3MGA +l?VZ&Yy?kmMQqY{FLmd)8^C0+InTyb%?WTG%$DZ$m;bAR)ya#VGE@vxV`ybT!Ej;9TxQjc0+10Fg2)p +3Qu=#Wn@WaVPj?D)D=(>(T2L(qY0=?NI^CwqAYJB+ZKALhJOg5MaL2PhnVMAeXb4b1;7b@t4MVjY>G@u4Q3HlB(d+LiLJm-R= +h;`?dxDG*cV`*tna%paKVPb4$VTK~nd#>-Vi}-aA;vuZDDL| +OmAdib7%`wbaH89bX0k8WpfVz35LOoBKkGaY9#cS7Qj{WgyAGcS>>g~&^g7Kv@4tY;$BCg=lGO40 +qbyjMBe4%@A^HhWa%pX8bZK^FG5w(M*PErPQ*K8));4q9;G_%)IzXn}g(wG03t}BM5{Lay5>;+)VQpn(MrmbiWOGwx +ZAoNn1fvw5rj-B|XP@r^w5ufb=C_Ju$l1`nW&GEpSWb-vQ)O*QWPQm(C)8p9*(R2SB=5|9lKCV3N0b-? +Ol>0MdKRd5P6t+Da%o|1bb-?>B-g{}GTFmo{mAr>kexq=D7-RGP2^0W;fb3W1_o1UdTDNFlG6hDK5~2W +hJ*PG7zYWLxz$!}&%4AY&2YWlsz$Eb5KdujWn@NaWo%?~Q)O*QWS1d>s?i)zLD2{^84?*=6Qgx+2Ybs0Lm?xkSqB0NLAl2~i-ZdPG(X<=@3b5mt)No4(ju7iFH +2b-u)>&PZdlOljoA7|k;k>s6qoa5|8f~g8rd2nS@d2@7SZ3X}hLvL<$a$#e1Np56icm@ItaCKsAX=6`t +Z*_EY00{!NFEi>Xk6pZ8Tw%5WIk~G+K)5%bR49 +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 +&nOG#EL&$!Mw +bxg)RqK0VQ|Mwn6X+txo3vSYd;;z)HQ~0$c*N +FEi>Xk6pZ8Tv}11i-T_Q*#6%Ql_a{SPkRLsk8fO~RsUXC??9x?H3H +0000000030|Ns900000AWq5RDZgXjGZgT(%0=6++>M;9#?)(c8mUNj%`dgQjSJu&d2G{D9FxPD~VU@_{ +dLDIRU(}XWLTZugenOC;Z(5k~zEJnJiX;;E#R9f5T@L7b8}^L015)OFEi>Xk6pZ8TwtYgi@C#*klFTE}3hP#3Wmki}o*nL&Ed10e7tM;q}1!-4Ok +%+_pLQy2mk>6!ob>Z)F^+#%=mzd2Bb4}cMyUNH8E>xBrIwS50cCx~Y4>vpbO6eBrP2Wxp8;c>|H00000 +00000|NsC0000003t@D0VPj}*Wo~qH015)OFEi>Xk6pZ8TwoaSf9! +PV~dK2uo>;u!nFdemP_$e?^hl+JkM;eY!XR2mk;;0000000000|Ns90000000000000000|Nj6000000 +3v*>-a%FT=WnpY{00{!NFEi>Xk6pZ8TwzyTa&4noi_R;$3lnz4{Zl +)X|Z&ZIQtMA_g1big7gn0000000030|Nj600000Aba`-PQ+acAWo-gQ>Z4!V_T!KNI`QJ|h6;Zj^jB$M +PK+?7Lu3>C`4HLtfv$so3kRF1PV2}fOp_vjQ6FdFHId|M;9# +?)(c8mUNj%`dgQjSJu&d2G{D9FxPD~VYcXih8!q$B6|*YuiTY;OURW8#d%1{rxIXtTaY^?oC3pv@1xAt +Y+6$o0v73+|Mu#tUa#CC=k&ihP=*hH5u2jmS=7<6%^jtx5=^cXz--x^3Rg~O2_Ny!Q1}E;1fT!_00000 +0096000000000DRX<~B#3IbwqHGd)HR2XhQO_4{AcS-HH^7AVzASV8M4NYxyCjU1gEwF5PXV6FZDLo +1#Vec_~kix7WfVQ#Sd|CM9$^_0000000030{{R3000004b7^OD015)bf$yWt)@)i+7y=gQng90cs$Q?$ +A?NhJIZ%cVfDxPG)D=(>(T2L(qY0=?N!-4Ok%+_pLQy2mk>6!ob>Z)F^ ++#%=mzd2Bb4}cMyh8PemXlG!~;@e)_O3H?xO^a~KWeI~0jp}x-Dk@(^0000000000|Nj60000002u)>e +Q*>c;Wd;HXcWHEPWpi_7a{vkgwlQ4lF#CP({0kA5beTu`TbGnq*3oM;9#?)(c8mUNj%`dgQjSJu&d2G{D9FxPD~VepBv6GZ`41H209 +uSUNb0Dy~!|1R3kngQ>HC-KI9f&c&j000000RR90{{R30010DnZgg^CV{~%>3IetQv3I^D zsTXbLoVnRgbu#1RW*r3uLWXWuR6ojX@O@K2fD1?dnL3~5qMCPAXSCljWavqpOxW(0 P%C}+Fn|uZ+_z$H4nc+;W delta 256 zcmaEyIxTGjuQ(&~WIl1@gq6uRQ*V?zEV~`l%rDx@6g$VH`pzs4ZKrZ?-BV>J<3Dk_ z=j10P=J*$-tTJ1=a85)U$E!^$KKj#=|9+hPeS*J9+Qd61CjU~Dbyax7GfVPPi;Ere zk~8v)*n-@hf=f~~HhYTCVVnFwOJTE?+(kA8-afal3(ovHd-kRFos`8NFPJNxS@rF+ zi1XUByy6l@lOi`ut4?N|*s7pF$X$~QjTATYt1sa;u={(=XZ1rL%bTSeCiVL4xH83c Y$H4$j!8aXi?R3%~2G%h^!G9;M1& diff --git a/stl/RGBStorage@0.11.0.sty b/stl/RGBStorage@0.11.0.sty index 195b91a3..4e2e595c 100644 --- a/stl/RGBStorage@0.11.0.sty +++ b/stl/RGBStorage@0.11.0.sty @@ -1,5 +1,5 @@ {- - Id: stl:SzlN0IlE-Zga3E46-5Att6!H-f1304sL-g2eJ685-foyjeTE#forbid-watch-invent + Id: stl:DKVsldZ8-zYwnjtp-igdl80j-eifV0Ef-asKEvF6-JyZP3to#song-wave-story Name: RGBStorage Version: 0.11.0 Description: RGB storage library @@ -53,8 +53,6 @@ import BPCore#garbo-radius-peru import RGBLogic#target-locate-justin use AssignmentWitness#camilla-bison-chant - use GlobalOrd#natural-lunar-arizona - use WitnessAnchor#scoop-scoop-cadet import RGBCommit#orbit-airport-voice use ExtensionSchema#active-eddie-empty @@ -167,6 +165,7 @@ import RGBStd#carol-edgar-escape use NamedFieldMetaType#prefix-carmen-artist use NamedVariantu8#star-pilgrim-pilgrim use GlobalIface#concert-combat-charm + use OpEl#period-opera-chicken use SchemaIfaces#fossil-nepal-airline use SupplMap#sailor-observe-bundle use OwnedIface#delphi-athlete-fresh @@ -229,8 +228,8 @@ data MemContract : schemaId RGBCommit.SchemaId , data {RGBStd.OutputAssignmentRevealedData ^ ..0xffffffff} , attach {RGBStd.OutputAssignmentRevealedAttach ^ ..0xffffffff} -@mnemonic(bottle-postal-logic) -data MemGlobalState : known {RGBLogic.GlobalOrd -> ^ ..0xffffffff RGBCommit.DataState}, limit U24 +@mnemonic(chamber-academy-academy) +data MemGlobalState : known {RGBStd.OpEl -> ^ ..0xffffffff RGBCommit.DataState}, limit U24 @mnemonic(flower-unicorn-bazaar) data MemIndex : opBundleIndex {RGBCommit.OpId -> ^ ..0xffffff RGBCommit.BundleId} From 120e01957af037fa95e1fa611ee90235b48e6645 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Sun, 28 Jul 2024 21:25:20 +0200 Subject: [PATCH 10/12] persistence: add API for updating witnesses --- src/persistence/memory.rs | 36 ++++++++++++++++++++++++++++++++++++ src/persistence/mod.rs | 2 +- src/persistence/state.rs | 19 ++++++++++++++++++- src/persistence/stock.rs | 14 ++++++++++++++ src/resolvers.rs | 3 ++- 5 files changed, 71 insertions(+), 3 deletions(-) diff --git a/src/persistence/memory.rs b/src/persistence/memory.rs index b4d9a684..81353680 100644 --- a/src/persistence/memory.rs +++ b/src/persistence/memory.rs @@ -23,6 +23,7 @@ use std::borrow::Borrow; use std::cmp::Ordering; use std::collections::{BTreeMap, BTreeSet, HashMap}; use std::convert::Infallible; +use std::num::NonZeroU32; #[cfg(feature = "fs")] use std::path::PathBuf; use std::{iter, mem}; @@ -54,6 +55,7 @@ use super::{ IndexReadError, IndexReadProvider, IndexWriteError, IndexWriteProvider, SchemaIfaces, StashInconsistency, StashProvider, StashProviderError, StashReadProvider, StashWriteProvider, StateInconsistency, StateProvider, StateReadProvider, StateWriteProvider, StoreTransaction, + UpdateRes, }; use crate::containers::{ AnchorSet, ContentId, ContentRef, ContentSigs, SealWitness, SigBlob, Supplement, TrustLevel, @@ -62,6 +64,7 @@ use crate::contract::{KnownState, OutputAssignment}; use crate::interface::{Iface, IfaceClass, IfaceId, IfaceImpl, IfaceRef}; #[cfg(feature = "fs")] use crate::persistence::fs::FsStored; +use crate::resolvers::ResolveWitnessAnchor; use crate::{OpEl, LIB_NAME_RGB_STORAGE}; ////////// @@ -512,6 +515,7 @@ impl StateWriteProvider for MemState { schema: &Schema, genesis: &Genesis, ) -> Result, Self::Error> { + // TODO: Add begin/commit transaction let contract_id = genesis.contract_id(); // This crazy construction is caused by a stupidity of rust borrow checker let contract = if self.contracts.contains_key(&contract_id) { @@ -542,6 +546,7 @@ impl StateWriteProvider for MemState { &mut self, contract_id: ContractId, ) -> Result>, Self::Error> { + // TODO: Add begin/commit transaction Ok(self .contracts .get_mut(&contract_id) @@ -558,6 +563,37 @@ impl StateWriteProvider for MemState { contract, })) } + + fn update_witnesses( + &mut self, + mut resolver: impl ResolveWitnessAnchor, + after_height: u32, + ) -> Result { + let after_height = NonZeroU32::new(after_height).unwrap_or(NonZeroU32::MIN); + let mut succeeded = 0; + let mut failed = map![]; + self.begin_transaction()?; + let mut witnesses = LargeOrdMap::new(); + mem::swap(&mut self.witnesses, &mut witnesses); + let mut witnesses = witnesses.unbox(); + for (id, ord) in &mut witnesses { + if matches!(ord, WitnessOrd::OnChain(pos) if pos.height() < after_height) { + continue; + } + match resolver.resolve_witness_anchor(*id) { + Ok(new) => *ord = new.witness_ord, + Err(err) => { + failed.insert(*id, err.to_string()); + } + } + succeeded += 1; + } + let mut witnesses = + LargeOrdMap::try_from(witnesses).inspect_err(|_| self.rollback_transaction())?; + mem::swap(&mut self.witnesses, &mut witnesses); + self.commit_transaction()?; + Ok(UpdateRes { succeeded, failed }) + } } #[derive(Getters, Clone, Eq, PartialEq, Debug)] diff --git a/src/persistence/mod.rs b/src/persistence/mod.rs index 5be38df8..439a1240 100644 --- a/src/persistence/mod.rs +++ b/src/persistence/mod.rs @@ -54,7 +54,7 @@ pub use state::{ }; pub use stock::{ ComposeError, ConsignError, ContractIfaceError, FasciaError, InputError as StockInputError, - Stock, StockError, StockErrorAll, StockErrorMem, + Stock, StockError, StockErrorAll, StockErrorMem, UpdateRes, }; pub trait StoreTransaction { diff --git a/src/persistence/state.rs b/src/persistence/state.rs index fc5f0d79..4b4e6b4b 100644 --- a/src/persistence/state.rs +++ b/src/persistence/state.rs @@ -34,7 +34,7 @@ use rgb::{ use crate::containers::{ConsignmentExt, ToWitnessId}; use crate::contract::OutputAssignment; -use crate::persistence::StoreTransaction; +use crate::persistence::{StoreTransaction, UpdateRes}; use crate::resolvers::ResolveWitnessAnchor; #[derive(Clone, PartialEq, Eq, Debug, Display, Error, From)] @@ -200,6 +200,17 @@ impl State

{ Ok(()) } + + pub fn update_witnesses( + &mut self, + resolver: impl ResolveWitnessAnchor, + after_height: u32, + ) -> Result> { + Ok(self + .provider + .update_witnesses(resolver, after_height) + .map_err(StateError::WriteProvider)?) + } } impl StoreTransaction for State

{ @@ -248,6 +259,12 @@ pub trait StateWriteProvider: StoreTransaction { &mut self, contract_id: ContractId, ) -> Result>, Self::Error>; + + fn update_witnesses( + &mut self, + resolver: impl ResolveWitnessAnchor, + after_height: u32, + ) -> Result; } pub trait ContractStateRead: ContractState { diff --git a/src/persistence/stock.rs b/src/persistence/stock.rs index 19f68683..701224a9 100644 --- a/src/persistence/stock.rs +++ b/src/persistence/stock.rs @@ -1293,6 +1293,20 @@ impl Stock { ) -> Result> { Ok(self.stash.store_secret_seal(seal)?) } + + pub fn update_witnesses( + &mut self, + resolver: impl ResolveWitnessAnchor, + after_height: u32, + ) -> Result> { + Ok(self.state.update_witnesses(resolver, after_height)?) + } +} + +#[derive(Clone, Eq, PartialEq, Debug)] +pub struct UpdateRes { + pub succeeded: usize, + pub failed: HashMap, } #[cfg(test)] diff --git a/src/resolvers.rs b/src/resolvers.rs index 9c035913..c28a3728 100644 --- a/src/resolvers.rs +++ b/src/resolvers.rs @@ -28,12 +28,13 @@ use crate::containers::IndexedConsignment; pub trait ResolveWitnessAnchor { /// Resolves position of the witness anchor in the consensus data: /// blockchain, state channel etc. Used for ordering of global state and for - /// ensuring that the we account only for the actual contract state after + /// ensuring that the account only for the actual contract state after /// blockchain re-orgs and channel updates. /// /// Witness resolution must happen as fast and as cheap as getting /// key-values from HashMap. Thus, resolver must always be caching and /// doesn't actually re-query indexers for deeply mined transactions. + // TODO: Return WitnessOrd instead of WitnessAnchor fn resolve_witness_anchor(&mut self, witness_id: XWitnessId) -> Result; } From b7a66489978ae86780f17aa6e8799a8c9af049c4 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Mon, 29 Jul 2024 11:18:27 +0200 Subject: [PATCH 11/12] chore: fix clippy lints --- src/persistence/memory.rs | 5 ++--- src/persistence/state.rs | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/persistence/memory.rs b/src/persistence/memory.rs index 81353680..9550d108 100644 --- a/src/persistence/memory.rs +++ b/src/persistence/memory.rs @@ -492,8 +492,7 @@ impl StateReadProvider for MemState { unfiltered .global .values() - .map(|state| state.known.keys()) - .flatten() + .flat_map(|state| state.known.keys()) .any(|el| el.witness == id) || unfiltered.rights.iter().any(|a| a.witness == id) || unfiltered.fungibles.iter().any(|a| a.witness == id) || @@ -791,7 +790,7 @@ impl<'mem> ContractState for MemContractFiltered<'mem> { } impl<'a> Iter<'a> { fn swap(&mut self) -> FilteredIter<'a> { - let mut iter = (self.constructor)(&self.src); + let mut iter = (self.constructor)(self.src); mem::swap(&mut iter, &mut self.iter); iter } diff --git a/src/persistence/state.rs b/src/persistence/state.rs index 4b4e6b4b..1501a84f 100644 --- a/src/persistence/state.rs +++ b/src/persistence/state.rs @@ -206,10 +206,9 @@ impl State

{ resolver: impl ResolveWitnessAnchor, after_height: u32, ) -> Result> { - Ok(self - .provider + self.provider .update_witnesses(resolver, after_height) - .map_err(StateError::WriteProvider)?) + .map_err(StateError::WriteProvider) } } From a2ff52cb393ee67f4a8d9d7226d6ae788a5e657a Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Mon, 29 Jul 2024 21:16:14 +0200 Subject: [PATCH 12/12] contract: fix witness filter checks --- src/contract/assignments.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/contract/assignments.rs b/src/contract/assignments.rs index 0dc0053d..fe6b977c 100644 --- a/src/contract/assignments.rs +++ b/src/contract/assignments.rs @@ -156,7 +156,9 @@ impl OutputAssignment { pub fn check_witness(&self, filter: &HashMap) -> bool { match self.witness { AssignmentWitness::Absent => true, - AssignmentWitness::Present(witness_id) => filter.contains_key(&witness_id), + AssignmentWitness::Present(witness_id) => { + !matches!(filter.get(&witness_id), None | Some(WitnessOrd::Archived)) + } } } }