From cfbe787ed4436a1b82de9b393d0c11262030067a Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 12 May 2023 13:56:40 +0200 Subject: [PATCH 01/92] Adapt TIP-47 from TIP-19 --- .../assets/microtransactions_pt3_layer1.png | Bin 0 -> 151403 bytes .../assets/microtransactions_pt3_layer2.png | Bin 0 -> 135355 bytes tips/TIP-0047/tip-0047.md | 145 ++++++++++++++++++ 3 files changed, 145 insertions(+) create mode 100644 tips/TIP-0047/assets/microtransactions_pt3_layer1.png create mode 100644 tips/TIP-0047/assets/microtransactions_pt3_layer2.png create mode 100644 tips/TIP-0047/tip-0047.md diff --git a/tips/TIP-0047/assets/microtransactions_pt3_layer1.png b/tips/TIP-0047/assets/microtransactions_pt3_layer1.png new file mode 100644 index 0000000000000000000000000000000000000000..561db0bb10b06d55b8b34ad89ce27f95c5f45c22 GIT binary patch literal 151403 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
    0bU6`jY&V0Bfv!nW;`K!e*PYS%T;eKcRFCFJo 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 X;=Oo!w%qtV@SmEJCN@vO#P9zAY}gb> literal 0 HcmV?d00001 diff --git a/tips/TIP-0047/assets/microtransactions_pt3_layer2.png b/tips/TIP-0047/assets/microtransactions_pt3_layer2.png new file mode 100644 index 0000000000000000000000000000000000000000..67a46901dc89a453ddbd72cf8006a417f9097760 GIT binary patch literal 135355 zcmc$`N6z!ywkCEA8-`IpO`zcJ0c;refH^c7#3YKODCW)uvlzvkX5g7rtA^r^N8qMs z;l=O2*De>}hC6iuy|1Lrw8PpfJnLEdUoAua_y6uc{JX#X?Qj2HRYd!5fBWyezy0mM z{XhPP{~lWY_y736{2ku@o7tB6zx}8G?SK3~|Ms`qTpq#F9YxjVfBQQw{PpSY81nti z%inSF?-&*j!#}brE~mJg|Iz0QG{N!imsLfTXMdf8AsG5kDDqDj>Y(`FagJo*ABOyc zrm^U+^W!q_|K*0{KM=UV{}iC;-*Fy3=~cfT@P07VKU2j244=4RXmdYLo)tVzB60d3 zICWq0RGgRocT9lKZPn!PCg*AMyDt&G)31XTi6#Dl{DYtn>K_aW?Vq@ar|Lhu%iZ~W ziOat_p7>Z6r~f1?UabeX)FcGz{ng!w%;p$%|>dN>voVbw5^g_4V7RT-MuN(9+bpOwUTX3s?g1+B3 zp*?i!C{3L=0$QX(L3Y|7;geixLsAJt=*5ie7W^aQT@~6ZKA>58<5|PRl}5g_LY~< z##d5(7SW4Jt?FiLm3mO$QxCU6CNa?sZSKB_{@yW|DamC{VQAq)N8zUDC-5nWv~e<4 z_>>0Bv~o40Sv1l$ZqzJyXGTrG2dS@?^qWtzZL2JAilqxBICuudRFZ=0!RUE%i?I&D z(CM4QE!h|#7tw+tC6b*-fJ-tMlk@D!e&a7F^LlUhnh zm2Ks_N9kQoFZ(UFbHr2-$bLWe$|>kO-w(09^h^jJXT?`a0dcM9)yxhwX!;kVoYyUK z?&;{uwum1Z(OY?&uMFDnhcs(N2sC_%W*K`&3Zof6CgI5jEnY_3VV_v3icM)hqo}}H z!tSPigpk96^ecMClI~l*!l$zH6bq7F=OH2xPk*O&YmiJGA=AMmqNlF_N@73 zmqzsN1#Qs4l!A*>9nuOLX+3(o`otUvt`uxVluRb&b5TfOb4aJ0`SR%1*wgu*_uv2( zkS$KARV5|6_GW!IhpA1^ZpymNw?#stTOb9qw(_6PN;IL-np@0L0au@Jq^4OI6aU=E ziMi*)+86?wNfTi^Qa$|+MP2U2GM&kzTS+C9XxNNxz$qJ?#|zKiz&qwe^``YgYHZSq zQT&l-P4iY#NU7Tga2CxzL90kl_`4F*GI&aO1=d3M>s}G%BUaiN<5g@Yw&G}h7p{{< zh8ouNJYu*cVG_bMReq3|d$khYJqtPyql=Z<>zr*q!5LmDfA?y0Hrip`d5=W;ViS{= z^=WYtUZ?hCo`SRaZQNeoQQ{+}52SwGv$*oD>SBzHbc7uKPEsbycOmsyzZd9MwC(V>T7zTU6WRK*Czotl_Sxv}eII+Q4wEObg3aX$9zEjIc8Rn5dG#<+ zFcbXa_f$8kc)noQ@)MjI#9$L7cDkJS9C5qdpuIu7XsfL#yR1`sl%Sq(fs>BkGP^Q- zp%@MA2(7Kg#4T#x-p*F8l7dF5NRv#%q2KKC4mqxZO zK*&wtzT5krD5r4IHNniI+DoY?4sy7xGf`Y$P13bg$dSu zigWohnO4QHI0O0WTtH%4WfxIM0|)W-815slIegROPp=KCPq7(QL9JeYe+OUT2X;)#Hqo3ooUj?EImdiWs^CrF76|NLHM z8hm(_V>c*~|GAgeFwO@V6v2mhqFaOv{%pRmJ%t(IP22kJ=p{Pp?^^~4%&4SGSWI?R zkM0Am-)eDDCbQ6g3z!sXNmtNkyDkM~oH3pmI-ACQLh6#ugg{<2yXrXc#Uv%Dk0_t% z>HJMf&b~N#HL&R0O_w?*KKWIcICZk9#1<>H9&qCyf`-ypDlNr(=cbp{hp#_%G}Xp9 z8nR9wmQ`0XV_$whwv(4oKndPtZH!=O`cqt9a@mo1!JR;=%uyw;2X%7WFen}!VE9;+ zz9X(b%f#3*!R9O)$cHE>!&INjbL$(rR6DVlpn zQJ;@uDrk=hMX6y6A!;wKbIDAf4Cx(OIO_&SSF=I+^3YyrPLIdxmFh1vtcZRQzA#Xk z&72%9ttemn#A-!Z1)kTa<|3o*AnNJ6OJz|`*qa6& z%44gtwkKBR@6+zbgbA%*j{jgCPARa==aj{_W%|CG(mH>jO?Wo!m2xsZ$?9{j!ttDv zIDXLHjW354znFfu46ETrkAwA)o*mP}8j*%YW;OneZb`t0X>xm#3P8W}&4V;Z5s#iT zE}l=H)5)Q^&F9%y`nGRn5TETZ4XL>49k;Bd({Ij#pAFlH^2gBxtBdH-X1E#3PI$;EVItc<9A1mi&n!=S%R zP%?buwe5RzU>#uCGi#_@;%ANE9o?Ab@mDnTgXJ6SSq5rOid*9Sn(|scU4*2wL4qRZ zm*Yz}?OX6yGDl@J$jgS}EQja=C9Qv&R-`odssmK;0RSeNg5k)d6++ewf zRt`+pbzBwFAtRV9sQz6*^yvGWM5k40|4mrnX-bSZgt*fQOKIy56RE4md3Xz%KB(?v z@g8ZtA^J~_ER6seEM zmSzp1f4?`hKBJ?7A;Ck%qeQVs^u`{f^SzgrA5k~fbx~cIdV8`YhBh$oyq7M#ectx` z_#pAb<3-(>LUi%1c{>_ULXcdE-pB1$kp36{?7h$N-JmDy+lj+?z(%CqB>Lo~cTUEU zz5TW=y&Y`#lN0%YhU!sO@ykLZQnA-fmZLd%U}!BU(+AEnCc=CKa2e)J**#mxOC0Go zeCud)#IJDceDyJM1+oM#A+5qF@U`Ed?f6Adhq|(dcqQc`HN2?Xi2$13!(L&COy9if z>BGmYK?!|3hVvcjZV^0&2Ivm*x1bEveu!lCiC0v3@oW zY<+|s*wUnSu4Qk_=83G;JU?Ao2xln||LDN-+kpAxkC8RDA-t#GD0Y?*ow}QaXViW+ zW|N<|sgh?FN&JJw?_ltkn_V5NTinX-ZEp&=E-EBJ<@e?j( zBZ}IF=vyOh>VrDCKR5cU0 zGRi$}J^SN!Anl5ba`bo6!;lkH#xbrO{7$uYD;|3FP;pA z_s_(9&QyQXDvq@?%jx;EC>~r&UST71?G-sQHl5Ey>-g69G)pMKT^Oz$y0rJ1%0-@K zw}E74`Lgg^C>~$5GgjiQfGUyXaxO2P?4`E(CdtD67mvigvcC-xNNdRz(mJY9 zt7Kd+w_YBi->yzVAw>>xV0gZbs|LM{Dxhc9iH0T$s|Y}m#n7DmGet?o{hZ|2{x)jB zMV7!%j?yW~e|WU$%=>sNb@f#_Dff<^vO98lX6s4D^Tm_iA8A}0;Va`Wg1qAqk@a=s z+8wH-KPqjuQK*DOCYbXTzH_7CTkj>Cc4Du^??GWxKc+t$Z8|;Lr>_;?4l0>^>iNm0 z;-#)mjTANKGjAj;#dbYJ84xdT!9Cw<66So~TBsx_u6F&`4%&Gg+urQoIib?e)Ct~d zWZPV_3mae+CgRais2WL>Y}JJ+N>s}Z7WU_rS0 z5GWN79~T!PQHkR&Q!4Rze3z^F-LaePG&}O>DyisJvN0xBPzmPaU$tNwldY|slE$6&<$=Rl*Us{YJpQy(Moytx#*Apn=?al2rXMy~ZSd&ip?d?!R+|Hofc^1Ma zX_1TiaW2K^B;)%l|0so-axN=wC+R9(MY{G|=w3DbQ!%v(Le4Pie7(w=5YW*z{S~J7 z?GbIsyrkPgaNDO+MS{}kLTb1T5QOwoIZH?7F=E!3b#c_{_{n7ulYAc5|#NLj3+Z}ClDv?qQ z{yIcw-DikoFe3}gSAOf@Qao@fHX-P!1V5aLFid{eXQQ)Q%m@fn_BmTc^Y8(z z$%qqtPM)9#QhZrY;#A(}#Yfv9b%~rQ5^p`D_)H^* z2;Lz_xXDm|iKDG~wAKr*UHylQ?=M2c31Ou-r%s$A6E_i>i(fB`jgs)s&Nuh-XE6FCy}$u+B8)EOb8XxY^&}(_%}AbGBW z%oZX;IKNJ}7C?zZk*ue-i|)xJcU)cvdrX~1*eT4e1X(NIjSj-m z?2Kl$=Duk{ElTBi8~O1G$`3zIuM}`Z4&Ue%?={W6niE;xll0({6+l-3#|;!OlUf45 z>*-nua#VPUvVX1NvA+v|H3U|-BB`H3H1yE&b~oyLdVf{#SE2E6tnqw+re~{=be!3; z7h!W-E2bZ|)30O-VGSR^H5}#fB{p$6pmVn?^v(lnK=t$;NTT`**I`#=orq`|DZZAF zC)AZpHinGFR|9;j&$@}@=TEXIw9khhrZ^;>W9X3j>2-m$e7_c`SP(m5jYcu|cP|O< z9fvl~zRWY>uJU(H?2J@f>J6_cXl!PxQSqE#BUNyF8Vx21Nv+$VRddSMP#1=2hk zM-US_VTKW{Hr8i?z*jw%IVV3Lphu0B&M{q&aJ`=7&Wgf78K@mO5c6I#h!=$C-pH5W{8_~>)}Ebus@;xyx_MMHIr ztF;dHaDw?=Vd_|L&g*@GbVv*a05cZV_$$gXBdn~jW~Hw~FF`#oCoClY$@g@xf3^-9 zQo>y2cF?%%aYt7iLBW4okMQ1-m2KylQ(Va0!G~tu|-Cl zWoq&o4tsuU@j3H_ExJbl7>6?_RmK-!N9v|vK3Q~0Gb2vQ3`X(0F&b@#-LB#4IW!rhacAeawPkBqi8Zeim}TY`5c)njWFe?MbAmzHCZ{7uQdM)Iv%u*mo(_5Z|-2E^0CBp=xn7>oI|~m z#5sH6;ySe|WLYjwwnMWOjjmEu00ZEZEiLNI4xXgoU=-y<2kJ@F&=97wP{e1#>&*&& z23TIuanflfdcA**&A{SU^4oL#y+iZ5!#$vPotIWxIkF5W{K=}dkJUQwgx+w!Hy7lA zXS<2RdD8utI*a!dOmDORPn7$FRG~4k_i>@N8_$gPw@|=)pHSpJ5M9nE*N0}w^ayf1 z;n;0j$fS;3oDHWZ9$fe1x5;4+@-n;lS;K6w1`ao%U)^U<6W~hnc{OWO{YFLvC)@HBn0(Xd=UEz%jK=T}>lxrb*XZPvk zD3-AkV0gNfAMVLF^#cA6K%Qj%aZmxIPdZ$;70-PcY!>Dc>x>uLol#t{Qv#^mtv%xA zm41i1Zo_z4-|Ts>jW$|rX{BvHxxq|U>l?SVi|=DG(^}d+G6W;YTh#t6BprTco`v3! zb-kGSmYNG{lk>FL?gXI+bsZ}~e(}&BZuLsUKO*=p%f}^K9gNhh(K+I!TtX@msj>vk zjvUP-w;x48s2p8k<>mvxZ&K(dys~rKwOa3#=3K-7FtkWH{r3rQpmbXOrc{V86zN9< zHvpQ-*Ytg(Hl>_ur&~RE$2wWnYDKXG`O6Pt7+lD6sk8rJRGFpvmH~W3>0eFWr3-D` zI~cn05vSt4^TQxbbp2Lz6xWTm*nUjE_w1}-@fdc1Y zMFJb7J^m*#x~%=5PXSP_R()hB`1fC11EZd?M1oOqSUDQE>->~u3RmWxk^K+eU8x*XNqpeNQGS09I zntTnbYd)rOG}yqnUpsP1`xa-5{dBtd;fW@=#K=DRH4|8>3g@4$c@$MKkYQQE-KVgR zE=_?zSYBE;#@vq4#&)x~d0l{JT9JKFi(GOk*`=b_GV@0Z$%}j{crXMOan^ovrJWrS zwLb(`((&0!DimS1pXcpox$Tm8@l-3QUQ_5$&gw)a8r_X>EWaIZcwdw0#AcH2_1u&g zvPIc#zb5kZXRTRhunkhSBnMToSD5U(kR_&eC&lp2yEceNzqG}ImUn#TsnsX%XXMlM zLO9{L9|G@38~i{>dLq1;PoSUU^OtswBc1VZ$7v+bSn6v~~%xGuHjbTymWS zrkq_2L;6W)P%&{NZ1e8Il@*rao#TP#1_bW;^Pdwce-h-dBS;o1*QF(}lY5mEJ!bd9PS?z5fVPr#xY;^E_>wR9dAB4P}9C!WbgAsKFFP-)p z93r`?+k>7!n@aa+e|}@pSNK_jchBmDi_7*0g|H`K#EZysQn}3;&w^}zhTCA>V*%Wq z=}^n&==pp@B+j7YvhP#3wNDW82j49~Fxl%Sb(8l`B z^0aE;oSJwsqMdykJXN0t_#cd}#=a>UYW1zA+U_}mcsq}k>5Do0lly;G0skR9T-e$K zI%26SCc~|nbp$(M7`&!&bfOCY4;*6U-!37RuyJt(t5YzIcl(op1=4j^;dk<{Ql4Ml z!vfkL7DUkk9${f`J6fjN zd}vq{zGnv3R`SeQSrhWZ?gNygnM7?aK4i^$Y>;)9X-2O^U;d`02Y3Z20!jXTJvw>F z;fD8aaUQp7LC8Wh%R*!&U}nLci{7Dv9FRhoe+gHmoGTKEjv*OS?@YmMkQ;Zi0QE+E z+$PKaeVM|pFP-ewlDd4yb?6Ew^8%OwdEpf^DHieP&~B;7In8jk*aHn#GYGkfW);_tP9f?3aNaPw7#1D5Kc! zC9XPS{|bG<4nks==hR2Kdz%v7q}Z=R-;x;-=EIjyTF;Vk~`H~SJW zJlIxBQPt#jz0G^VSS8s>)?aVXk#ei+MUcUGO^*`yZmq%qtL_do>2D_aduNE+eWm5Y zMBawxO~lGcrv5{#NMWWPrmhokuED;sz`KZeY;gT;D8rFQbimQ9CPtLr#n!G z&$NC&$e{?jL;Bn<5>h2KaS}gtU9|4&!xp-BMd;69k3Qk^!X|9|eg9yAQ@=Uj`^U6U z47XPhv)G>DiIDO5Si2oeLnpj~6luq0*;8Dd z57SZA7jL}>{gbjj}i&qlrmcMd1B^AGhb$jco_cq1QDE&I-Z55 z6MU3}qyH5}E{{i641<%|^lnca04b{y(u_~ekF(nrj*Vh34S%}`p_r1ng?KteBRr@0 z5p@ws69mqA?Zg(FV29YcYQH*otvYtSAF$y3YA`!+8pYqeMgSM^SWcSeCfT}#)9u&X zrUP9Gg2|Oh%IZ5%|6z=9M1<1k65FZt`F`|RbJTKfnC65_G<%Dd2sw4au<~>uTu-F) zjss{01Cl1>U#DaQ?#Tap$B9>7K6i`K??#bIHO@2kXGL*M`aoB;R=%`i?!21wxb^S!HUSGuZqy21 zeDpG@lA$l;yWOf3>G~#prD4VXfkd*aLWK416}(s(HW%*_7sX{!$35#+b^z+Z^^cvC zs0}DlPklzsP`n@h&WMT7GsEXjhtpbXODWL~s0)K0`~m5PAD+{qmnZufsU@A$8GBOm zk=oez4d<|VH{f(Aty^J}^7$1Ju_ztY2fiHBZn;NU=%YcEd+W$$9+Odh+F;V8LsFFQ z1&Cefq!<5jg3k;S| zruh{#@~3%xw7tz>*4%ireaw5YF9PY8ZXhM-U4n9~eeFZt%?xv$rfR4Rs!NS6;X* zxAd)PSwm}N;%P8j(HjY)F3TVmiYLdnv_>EHzC9&7MGDi!F|Ep<70{`&cTY(Rw(%yG zv%g7wJ&=&W)tbo;U#8cc;Y(UrfijB-)LBZBv7JH?=IvMp32Z!x{1zo;S@$!Xmdd@` z4PBl#;u2Ofs?KdeF3~8>?cx@ZrXDo$YAR#419l|?%)mbQ@>T$t$mk752^Z5vKe`TXd7JT(&RwH0s}6Db;%nX>JF?+NAu5C!+J;VHBN4)qPkr2`**CCB*9r z7&39B8YB;9|CZTugxKs83+4i&(ae7Y4O;m3_wzO+$0r-3SSRbL)CZ^7)T<0oGlUjsC*_}_5oBD zQo4Az*@$WnVH$x0v2{&uvjyOwkG=z*XDnF1vS&rq%fZ4*zX^u@?I#a?Ek9TzDIW>~ ztt{c1OOzhhZDw6WoUSf;CqPjNUtuw?Z!P6%^Nt`oeq!2_`<>C^xdUKp3?s(uM?SBt zO6!Nvnf81^aYz73)A~IsP=d0S zcowMedz#P);f&xUz;cU^;_C(@I`!-Nf|3SBWHMgHKZhwz_EcoVt!DuLQs!O;BA2o@vhut@J<$%KNv_>PCD(@OAOde3Mp2!TdlzVlDkh@p<;s6TBxB^P`J@E9HOG zdB~>18J0#%+Z{hkeDh0~R`1KYye>Q`_x{^CW ziV2a?bfm#bZD$I6y|1p^#X=^flLt#ToauPQ)lN*-JAEZjGXyNT?FE{mRhsK6zopWFb95Pu&x%`{_B} z*7*Y}Npko^di1$lysvL>2++>&_&^-fi_jTa{?>l!qbc(C&|wLlrnLbJ?cHPZjzC_G zj4Fiu8fQRkNfHka?@zk9I6W-3p$=eaS5^2LOXc4#P28u}R;NF4-hN(a2aI7}!q}r8 z`q4|EFukdk6R%jy;)$?`z!Z7}q=*Mr#7>;AE-Ld==>{}_TX7Z;`<^xAdAu-V`6xg- z`Uy#(-z$!)>rB#@h`xFs3yBM|PA}w$&CG=WNCJOdr`-Ijbaws)Tn=o?mu)KYD~r#2 zJtGos&#Q6*)jF6b9v~%B+Vw>!SY>#~^(^L^zK)S-qcqeKodJi=g5tU5^WbQx0dN*z zihvh#`<1~(zSu8Mg|`x7G)8A^oh{B=uDPe$1H^ulS`aY+q!~yp(;rd`9Q;FT>8si6 zZy)EgU{>fKh?HnoB|g|@21bQknNH^3lbY$5@yI7%5}BRuPha^l*123?V~0fKa@ies z-AgT4KuZ;i!>=#2SARDsCWLkU<1OVG*2P66E*Sz6#2 z6kefXJ@9GR`qy)3=-FW8PoirK5n(JaTtoZpKHJ&r;_Csd`=Jp!Id?<87@B^b$*A-< zAcGARo4Gd0j(VqzoeX#7b!OJ?@UuMLR``D66=SmXi=FR->-Q}(o@Je>)TPnhR);|} za}1k13$0H3D9`Q3?spjVO*@m6a4Ef@GGcDHLKlQAW<7-s1eOIZD7Zt+@}R&1XV{Z| zFsRt)TBzP*yX9E@&@MUHb)kZ`Vz@30r&h0V%9>x)H^s7-vPLLC*S)W4tp?SV>N+t# zYa_}P7Nv12-y)dU=_nO7pOxaC?-B2{+p6#%%|62Ey96kdMg%^;N&9y482ua4U@t#j`F+68|>t&UJ3u>u)Kme!_j&El zKf{(%7iGbX9{>3{FqM+TrdXL*Hq!dlYY%^7BSH|#$_dA>5m{U z`;RSaVo|i@ki3>>V-^Kmysx*TB4oI{Wr<^FEL2i158yQwU))wgoupoKcJeQ7SVp>g z+e!Bssh3fLO5w#h8a{(Z4|}qg0NHOO4jA7SFRwi2)yLXjmsGhdA)ABs3sglC>X9aN zDk9;LS2zq>ExCw9zeRQ?APAMoL^spJixLNcg1?@8{cub}g?Vuo%k8vGz`0_y;puboe;lT*_OiM1#|Ig?z z*y}I)OX^bhg1XxBuLKxe9pQ4w&x%k(aj69<4n3MiEsl7do(UG-p~{NFHBS;J^+ubd z3w(cW)q(xVDx{d(#6#SE^lSN3LTrx7RkxA(4H#hD3nwkh3|CtMDlWDtmW*4#=0vrJ6-x^ts z#n5}9+xwlI&ny$LbBa;NEiSx^!E+8Y;;?;iNd({u4IC1>=gy?Kwu`0thjQcf_mhEK zQw9s}YZu!*64dbdqqMSLfrdF3JqSukzs)WK9<0x2eZ{)??XCSudmFjh5HwFf?1}qV zI%OPL>wcWlJ+5mdU_{g%iISXryua$Av*C6(w1 z=2||26DrY0_QFDrg{{LUi$q?f2OvhNuXlq(YwsK1`v6l){C$9;2ZbhP_P|N|bzyz$ zC5x}GuM12WZvv*54#UU7zRoa5_4v}UNv`VBrTfoe2XG1)LIZJrHS@pBcYSPcX5UM6(W?5tFCB~@0YMJH0ZRG3{aRid%oPxa( z&mL&R0`8C$P7#e0QB&@W@m}K^3^GquWs?TjRYZSSoDc=DkY%9aDKq-i6+f8PYh&I2 z^q*B82XV}_U5kC-C1#mksz0BQM`zFcroNmjKK`M;EdMw4CFYCH0c$1Q!CuiHhJDYGyPjFcl1--HmAKc94okF4qifSqriM}0 zw9;h;v_=h`p$OFe{osURNSM?&f)z!L3D6YBs*8>8h5i%C((n7k>65HRcEx-;4;0{H z*-4HG%LtMyStPhL{Akta)?|;}Rs4H4sG^v1G|w|NEIU%E>can17~TcM$u1mrUvoa7 zKqN{rsEdN!prmI|GlsQukXdTc>ob%DL%^X|>{MuGek&z?d`8#33qFl#Hft`cr9pje zbEvJNmo&vtZw#w*XIsQ^4wZEebll4R;}QVE%A}8zPYVe07ZmVU=}mr#2=5R1)Wt?kYZ)YPgN{(d~_$vWw-^UWCswPF8rwIaQOoD>rcH6wzs56pLk6w zKz$Ld6w3ZYDe2)S6d1{@r>@TSKh&4GFH$L(C*p=KwP$_;0_6D*78Ysc7Uo+)bCWY0 zTixUrIj7bGu+#Z?nn)1L#s*a*T%h3o@0pc?JZX7x$3fb6Zw(d*Avk+}EZ$mG8R8e7 z>s2TbhQ0hO`@xbUCojl|1 zzBh|mzvuou$FZC^h*w8p7UpsMw`haj06^;10ZX*(duwmUCQQiDBYg*|QUADZw@N*$5rTrjv9$)_;1igkHya5o)@ge)!{}0)w zrSyOOJrbuvS7~a0r|;Vk^Tw3yZ?6Lga_%Ghv^inqMfLhV9=PA>R7Phjdm$5&X`-cl zn0L@3C-i=5SPHB?x{#K!x1BOW+s7GxAJ|6|`pFD{gkI1_+;RtXI%!+)zwJ+GS2to# zN&2B2;T}Av15pV73S#fOv_$VGpFt{<3H5(|r1|F=#I)7MN#QksxjgXO9`*CEa%?Aj z@F9NvEwSL^Dlzs=aKrJj$>mplsS`IEfK0^X?r`=LU!KvmZT>_iA;3My{M4+@nV z-Z@7&Mt6U5PSmZkYG-(|HDrjWg0Rq~*VzlI6K1G!o^OY3H8+els@+>5pk#N9RmXLjm3spH%9++`l}cm4q$7In3Af z2VOcqzc~FjBr&KhLm&R+Wp8N~@1F{h>NHFeLv4AJqy~PO!(3|`WMfxm|EwLPCXxXa zkJ{G1&1|eumGUBb2z1s^y&oisHoA-BLIEHNb$ZUhglbkEPzZQKDM4r-S z)90;$zpCZQ?|V>?XJQl9uAd1N<^&S520ds$@U-)Vyfa-=aMG$))+zg4IA1yT4|6MB zcpZV{d~Qh69b<|B!e@s3*tF1rEb>U#TH}@H1;Bb#-?7u+HcZ$0kp&t3Ku78n0Re`} z5%qq9$rrw%uJa zS|X-tsvVqo^Cq^GYR{&&ZWWbAQox<)x&V0EQv`cT(mvtn9muUPT2DdAZ&yzJP|1*N z+hPmcJqbT70)7qR(hT@jp^AZ)m48NG!wJ?|F3FCqSqM0Qs7UeBC^C1a%@DtHwh{ql zhVbSqEHN1_uujtHKKip9H zZZ#N3-U!|N7EM(za-!)zd$5K0JUyHrk$cj2zaQ4}D=zee=QReI;$wV=U^K3J)24hG zD2td@rAo9&yVIr8$C<)cx3oF%`M|*PCq4oXDZJgh?SlFy6;qCLN?B`w`rEH20VU*} zz(EIoEe76x-NA1ehU1*jOA6&8-}@lE-qd@nVX)G3y0sbSB8V@Wc<83asB7T6yjrt* z?ETg<)5G@(yOp@phu`XOzMsnY6>5LSmIe3y+WFq}*!#WmeB+|>JKDp*d`JWqv&S7$ zQqt(axPecW?9bmeW`TC=MV8>1Y3l>T5B!PdTl{6hmXYB10(1)tR2O`TRJ)8oalIUn zAUJfpFptLp|Jzd}z1vTDD?hi)fmX5@KTG><=(ty)qNI7Y-HlxctGpn=N}(TWVz+m_ z=1&i1RhmxebqWN}LNz&j6;y?Ae*88f1VqmwIZ6>76T}N@Ib@6c`IbnHVG5ea&Bxnq zpa>i13DcD1J@AX<^nZAmrc2k{hKzELvs5#`YW)52`vPIl1=0;4O?j(ATS$8KhrYIQdr%WiY3)3A8&>tU;{^Th*kKHl%ECoW! zf0rW35&(hW2Y_-s(D5Rd815+vpyGQSzfP!5r8#3Y_kmu417m+Spn5>j&NRR#g*s!M6M@DW#RM*O z>rx>b-YiD=E{=sY?S0K9D7;0)@q1Q&N^$cDBrj5K6)lsb`dv(vtZC3d64v4o(vS0z zd0dB9tY(?NK7Kr;=3S_Z*+?`~BXZ`<&nJpZh+)b3W(H z(U^J7yq?Q-UC(QIT#o_${&bNVoVyNm99k`eLQD*i8o~yJ^f(09U?#yqUm2ULgC>iT zQn)-9C&`M2Qm96zoh+8ZO>oda!E`Z+G#Z>NRl*2nwSi$Z@zGqNUe8kTF>KJSW8B$!Pgv+E(`q-2n5hM*G|Ojj&38EP`o4Guj52UDk*kus=?t~7#bdP0)I!nd;J zCbomhNn5v3{rO?&DMB~jUtUC}@8d2b12t?{qI-qK)ogk;H0EGwx$dL*y6v1dHz*GP( z|NS7Eqz;bMEg#@vqR=fkvYrHJ0__mD0oEDVR*8-!k^t-e8>JDaQV z<6_IyLLf2<8K30_k`So?!9oB~P$O6YcUBy)2FOef(yAxQun53fWdIY!Gh^e~GNX!t z21sUw*@Bf=9eSV{EV+Q7VM!r!I25D8!O2(~597jMSzKUti6k+NYZY6y9HcNFC3L%X z2#i>Yra;*SO&p326R0Q(P!WegX)-tgMFG4j*uU|rxJdDUSH;Q^3Y=Pt2`Q4Z*(5R( z@Tw@Snq)L+CO@wLnQz>H(s_8BbA~?1}_ARZXT#6@(^ z3^ZPt0%l4iBQP!pRtYdwGCo*3oSICv3mq(hJ2`-(O958X(=JSrkt8V7{~ zM;8g8>JBtdjj-A6PQYx5lw;{Gm;oo($2nIfQ&RAR+IOb$R(B>}FcS;T_C^?I1vok_E^bd}PMhR_5Y3I>E?M5d8M zj3E{|RG};6w@emS?t=CiBKo+h>3rCvhN{0o(!hl*4 z%Ni?n=(#o?3XQ^uv;>qK90Dq`Rs&FT7@2!v)9*>WCeVMhbZnlpbL64M>xSuHr)VN*)zN`St`P-e5C| zi~|Km9vRL18-zvcHU~nDO{`6} z8Gi#<;#_h3lvtD%$_E7mA(}06@wr3|i13MG4gfN#)NFUw7B90VOJc1S7AlFxLa2=9 z1eiLWVU)uR?kXM=B_Oyz;8f{^CCL|#FEG&wNs6z#l|W15L7G{FrOxA%sK&&hd}~x4odApiRfaz7H!u^6fy=8@Vp3M zXdVe+vg62hv?Pf|VP%2WnOW*+fhTtIVJeGlj zlR1GMT1qb{klQ>$J3=~r^45mYgaVxjpiZL<>8aZDLN097nwFNNw z0*WFP&qc7M!0cSIkJ25Jsl z28jo9EWdd=DFPvxE@trv4hmKR)3^~VYLO#WV@{CJOo|jS!Qez&jdZ62mmrB_fwCGu zi2%1Mj43D@){LQ%m>967NHmVXK)P=rk|Kl%qkB5m-xCJ}JvtXL*~PQVAqhf+dz-03 zCOX#6`psvOU=cDvv}=aK^;iK`zz~tZTEakZkP?fgiupJMlL0VFZt6&2V~h$tlwqbR zf%{C>n%R7q)vmUyd%2K3mUmSmQvKHc^#ARmQ>NEGRR?Af$(+n33-5^$3nx2h01tP7(`-h;1hD4%E>Sat$HhrhvT3e77RdAkOgLq zMg+l#kO+WX;X=)T!w8(M6cWf?K*e^43Xj6l&$D8?Dox?~dQ zK@?NbbcIxcgW9D4(#kg(jVxPAoJ~ZvilqpK#c5Z$3)XZo4j^ds3IO`In&B|J$)%vF zlt~s)u?6GSu#(I?(20|*fw8n=x2?uIXn>pr{MEofvpUI1fv3y(D?!Ssy3`Uwv!2&WPm&vXZCF@kO6bG6atB8|=%VUKkHNz;AAslRo4#$AS z@&R4}d`uUQcIgBXfy=69>P$8OV?=QQ`b=u)A)scn!-P%dD49TQ0F;gbN-qc{IB&uK zkO?jo9SYdL7y_)=9ckl}h-@~UC}IHqASnbd6Tu)5w<WszN;EXu48m)&i0Z)sI zNMSo^JS&K){~LHE;lF}c0P>X&|F1kP2scj)(n`WO;4HEnfHt`aCWOO6(m?6*WEV9F zPM0~6ZXpCNEz|(0Ex=V6k)5egnbDR6lmY{Uibx{?Xqa3B@-m=tz#-?NhzN&6F13Kx zGEiem5;GAZE!@J_bC^y7-yPk;)DXH5@SY)Mu_;m|gl-jLHTpQ1+fRfj9VzTM3$J*o)qJjrdDquuJHaKkXA|je^(YSC- zd~!01EyBbn+i*~b!4iuE?MVPG3doic*dQx}my(!T5`$0Rz%4j7%;i3%Eh?!y?nV=# z$rg4zA21Em0KuL)!N^3$C&Re$;1U%N{KI#-v_imLXrfEp-xLRW!&UHPwH1gW(d-29 zNm4ADroou(8lsMgCR1z>K?*_PRt&M$j8}pDC%6tFw>lI^6w7QizyX4V01zx3gUb%M z_9&QSAw>^UG1(Hh%snxHUvaqMECPTw7dzP^;qU4N)yW2I=?)_uYUhJoEf@$$5wpl> zi<71muoO-<4YY#5@dn^d;6b%f&j&q?Opep+=D-FdCvG_wD!2-{C0-4enJ`EsC=BRq zR!cnS4`3nWfV?GvZgfF-Iyn}nQ7IfMjC*~BbP*`@!U?Q+Il+biiHKy32xLI;bUGbm zS1kl=oV#iv$7q2|M%3^)c7)alP131Rbns!oYUoZe>V$S7PtI~!slbmQCbO9CvEZo| z9ZTS%u*`50MP^rPP;M6m5swoYK>8O!VL-_&t6D1NTNoUu&WS{(=-F%{Ou^vstqcjo zoPaQL=p-gX#wG)t9pD<#f&3!Usx)zB2+#=zO#)dNA_6YuTUBIT9Dr~pBrEt{a5x2Q zww?{ZsV0lo?zUu90S*iK}!^9rk>_LVAwD=h^A$HG{s?dF9nC4MC4l) zXdKzVcFFZZhRn_dDNKqL;es+`Py!SSIFBR%lM0ndb%00%VbCEofH4O!xy36}*ebRr z#ibMo081rGCAT;=Vg!LH6zSA_3zI-FfP8O~#O*mbmA?yG5Q>P-GO`@M33dc{f=-)4 zwj{6tZV$&2@L0kG1qqAR8tEz_2kZr&3WOpV1Jh6>PH-sWV@b>eqmv-#E14Q4PV6Eh z*>1iTvVa4VgG~Exz83jE`C1SpSTgT7UkeZ7a-Vm<*;t#X#^ar)d+DjwEzf*>c7ENQUF{(($PL<@FK zsbd-4?z>xb0g*Sb^C%Y*G@t2(2o%yiSdbrLDiw4y614Y`Pz`Aw*rXzp!6}EaIZiPK*by^;p^B+8fmw$Eq>gBeRj=1E=vW$ui6X-7&^W3! z9tR*#5II>vz%sxfh=c?L)+7McizEye&z1mMUq}jx2J{P`K;|h^1WKX?q0>WUu@tt8 zrF91j!~_)|O@g^+KnKL#TAS78ZtNif23Q>EGeXNX?p?76K^?5_dT}y=YG;}` z;3JASD9j0TOrxf07;wPiB0>pt;y9W@tygiKfW{tNV`O1?45z|`LX)i01f<5UKtgOB zIERA7VF8P-S%Zae)n*t13Je_HZU?u3Q{pjrH0tj_mIR^9y{bg4MInTN!j~J$k_@0M z2tb3)1yB|e%O(=qEm${)OM=qP;evwOAsj$A$74Z2TtjppP;wqo$yC6>Go6)46uMJ{ zsAM2RQcN6A6^lqhTO3p~-tG`5B=Fc=lp;=#cBLrMcDYN9pkmcTI0+|Js$?dGke`4; z0|pl|Tc`sJF3Cw6JrF^+J=BA)O$bac`_18kgHVCI6H#Ox#F1bo>$FZfmkoZG00kOp zaeVNOiDH-2-P6KRWfDG-M8rsRBDtIsj})sFaI^q~GvG}}idcq~gC_zEXwN5tm+&r{ z)m^rv5kv%mOwQIj<0TBYrbz%R1Ng(Sb08+ITY6#cjZ*{MDsTtz8l%BPQ#sx02Pp1c zP@&VvcDaCI$MfY>EJx`g=xk6S+XN&UFR{AU$!T|AEV0Jhl1v7pn_ve|v!`+qNr3v{?R+j^2?m8> z0K3K}yJIdJO^_067AoyLpxfXIfNtR=L(vMT7EsX(5FCfwjlzLncKUZbKH#mt|8^8S z?&9F7vAueQ^r8@O368{%=lh@5#dThYSz@75?BgdqU$s7D@Srgx`@b9R+q?HWo$rKV z9Cu_GfxGte=g)b+tTi3z?wExwZ=N=%$_l&B95Qb=e@ld#4~vc|XSGGwuU{O9 z@FdUfnv(wA*k?;BQU99Ze;Fv%k1dS!y#3dIdFfwID{@l) z-B$c(qyDif>HpcNzc0mqH0mD)@IM;$AJg|gjQW4hsDGS(|1ZucZ&9BQhcBd_ezDZ6 z>%INUrGd+5etRst{_s&wJ1U(Lz9p=z^Uc=98%}qBK6e@KHRXQohNEBo-uCGeRZ@yS z-H;XBMKwK5+M9U`U0>!!eHa|~c29Xy>5bOTro!deH=D;tcYi$A(vXXJncZ-EM)UD$ zpI7bCL{7NF0mt;{%H~@WLeeh*Hw3oXa^7~p)B9US(Sz6RF2A?^`=oW=m|qdTHTj<4 ze(^@}q-UlZQ_i!$9*UHq+ZmrG-T?O-wQ-*9$*iBpZlUHl-WDydxITW(Gi1$`r9c{< zlYp1fU9e(8-bDj$$)!&zr=EX1fA(j0{jVWyH8E+70op@nl&3!)y-{wz8S|^Nru4CN zWqZ$}eO^)Zi#z6B^lCbAxO@=&79#$8<+N1j+~eC5OB$mNm-#VcdcF!R{F*?Kd|fkd z*J%H&MERr7u)yv;DJP$Vk4pQ|@@eYTwHNAt{p`44cvrkBtL^rTY0uJr^)wtjRX6Bs zl0O}S``)r9ZB**FV}+TL%UPL6u8lc|Sjmd%LEOZ=%57+WG=I&bi`_3S4IJxjzKvBq z(3XF_N4xviy5_1~Yi5nCTiAU5qV?)%`!mR0f`6v7X*+uInZ`WH`Sypw>?c&g{uTZ) zosIdz!15E2)b3BGE)N{L$hZH}mTO~UZo+O%maLetG27Y@%)NE?PrXJUdMK2wGIYM) z)DepPeEL;|KCQbp{O!Vh{lXw+L)pR+bp@x}H_YDTyDz-tH=5QdtM~Oq4XS}&F?Sgka zYo_%=S)5PI55vtu&hcMAnqnj;9`L;!2M}7vq8GRo1Ig$hEI##TTj6q`lI8DS-h^EC zZunNK_sM5YPr6`UPLlNRb$kU7#G`8}S40#9rM7LYN8Ebg9~P3{uxv?1^_P}y2aEfi zT|Il2^U{kq?D4DB`xgMwsjnCioP5VVM6z?y_?&M~wTCOe#Q(g#YVB^GU>-7S@X*y6Brnfm zu(?ma05R{FVFL;>eE4V^f0)oNu;V z#P=^^o|yt{RKuZjpK~PfRapYb>p!%IR@6U~n{OcnH&5(zM=|>d!11<)_V%=7fF;0% zNWQq5&v#rsT59$=6PrVvI`o+_rt9sl?@|1jBYK4glUD}}pzSSiY33drKXyPx|Gpo< zy&|p_!i7DTd{V!hhe3Cgw?CZIoyr_FW5s7%owF&Z_V$9Zdpbfkxg?|E&CkPWJyD1D zkMrvRlAdd94!d0otkmT-sb6=cc7(C64WEI@J6|_Yeyoo6O#9Vc|B8@t^p<>tC#n*O}=bY_%zY#1V@1 zIo75A#?PgTUZf9{9_q)JZ+S~cKerhD=prRpqWyH=Pn*?{6)&*)swI@*nvRH=PRgQ_ z(XSSb0VRwBNy0;woFndF~s&SCr!E*fGA1c~sP!&9bYb!eqHn zV%)Q`{4!NlYR`xH%Ymf+S$~ASXXs?#0UqWMLPkgSs4x$YTHU#no8#}jox$iM>^kE% zk1fxO)~K&sXW`E=vIh1l=yis(G5YY}9!PT<9CS-PKlM~|pn2X-$Ebl9*Q~uy?VR^z zAE7kT^(^6iQ$yZx@6-G)8&nblPAXX%;dXviL}B!-z7;t+i&Np&axY(~@Th|nF8q8Zs&1t{kQG@zqU!p&%XYRq2xf!hOS%qFwQ5yKwlmUgjzWK*}5%@0;h~cz&yqe3m>~^(@=g8=2PkAA;txT11@e@0--3D z&L8zLR0=swzbao=WuYci*R1TTdv@!QNVWa!p)b2up~RRUUoQ8pg6AWnN)U5q5mwIc zc`s-H(sSs^RKt-ApU-~S>9Ibzj_7Qagm;!S!YGa30a@9JQ+K1iOH6;+CZ!bj{AjBo z*>wXRobcvktcdh~yc4=FQG4*jq(io*Ye1LIrjI6by?-w7h@xj~&NdaguG)^4jrG{H ztUdSrhV=Rl@s>G}CF@htzS6Sgk?$srnpXCu;<0|%;GvER&xqWmvZG*8A|{t!?6de+ z)95R;hu>~rJKyW>$RmMkGN1XDwP{0hA(6`VS{jBHqc|(xqN5V_x<9Q2%6pcw1PO_vc8#7+TGO!K`dKX|y$Al%?U;+R1_Z%@ctK zv#8!YLv^u61O5D@(vv!C?ReajzVZCS=9U!?P94v=dL{EprtsM7%faD=2``E-A6rUl zy-#kJ7H@rUZjl%DXW`-8R_{&oQ#(&{g*PT0{Py$f-k49DB9_1mDL+$zjh5DBJ`2j$ zAHPdn93wSV_O!ivk@2{%>?v*59p%70>6``ks(0tPCXBbFpEXad8+Qh}kF=vI4SrTj-m4SKD@|>4VxlC-%&)OKdJ{yZwDg)8Z$%g@Qa2Yj>h8?XX>2db_`GtM%_maX)N?CgWv zC0Xvc_hKDsMr00aL)RXECZ?$H#r!|#Zg_ubXJ5b!v&g4&<6pN;MT4dh2}L{6((|c) zEztQv7vqyoJ-2;m8@@k*e>!w&>yMSTt0PqX2=C=z|17=dPTLFvDWJ#U;PhSXJCT{V zc_Q5NjXrn#sJww*zf|0dOLFdv^!D+u&;@-B)AEIpXBn?LFE&OGUbF>q%-p|&!hhyE zak?0O=%xqEp@yWZN>|>w6yhJ1)8BidsFM~|ahjmN(DQ9EB?-IS6gs4_Rx++v$e;-a zHp+^(v>q8p?=*9=DS|=9ON#BP^@m6Kk6gBwcr>EGG4AH{4<(C#sg^FqTpE74L^rON z;TG^d&(_ZlJd&QC0t?4w2Uaa0!>&dTTgr11wysxY9eu?w$bBC3rJR!0t2fEyy&zg} zdT-aulfT{{IDFN%aq|4C*Qy_@**RfdLvsc!d>kfg-5MdhT0E;TgTM9T{jHFYSq&!( za#sxeRQQehWGHkq!B@N?CU!M$eR4be{ka9J(!NT!%$ZQ)eY_{2o)lg5rC^eaclT=B zcAbZ$=(+TG-|#(W_AODbTX^YiLDJnhP}D)tEai|3@uXQxbHh|v-go*d4Xg4`1g=ub;YiRh0YNR)|HEXY)c({H&oQJ zov2O^JlFi9xbK|XkvUhsX5Mlg40-GKaD8yf#K5YNuLaSEgg#x|pNKhYqF10h9;*r$ zcaae z@vIF9LEU(ehFw^5(~q`*?3RZwjkD>YM?$l**B(xUj$ng|S{t(A)a-}X0B;Rc>=pBBb;$yY||BkXE^3Z(Y)e=tSyi?JA?3p&m@>+ClE1NUE}viPIsGcg+2QM_lt<|$+wIi z@bQcmGtRGIQk6Kg1Og4Ahj^}>8+>^8%eIE5X#eo&Dvw9wfT;0j?n(`b`ms0g1|2E> zy}6v>(c?_bnbK~+kTH>7Ks~-VdTJgfdwH;PbzZ2)ORE4;=hZJUw`09_xBUorAg5{)i%^AM#}U3vQNKydIC94)B6jV~^J({LR_0rxhjX)+CJ9l2T z54~34djIG5sS&$$*>}(E^;}_JxtMnz7W(!@?@itfQO(odZ=e66*fH$-?hcuz0N({`q`PsIs9U=3>_O0KPZ59Ph%-NEimht|#eK&!i^yEO0c^=t%OCM%d+&~CM=J&`D+AHT;lhQ{o^z@?ILDvy3hLJ(&`##C z%zyzmPe0mQwK(LcqxlIBo}k^Wlq#LN$9h5)80{&-UXJ_ z#n;J4EkDIQ%J+!MsBYMvpZhJ&!6}}SxCJx*=If13o74~B`yVB`j@-QeC$EA!bJmY? ze)p>m4{yrbSHF(`S`-%(xUF+$k-GC+X?DLeUqqDXH)YbdjGwppnrVBtnW!;q))L=~ zn}hN`_+2$#9*q7vIwzaCPjP!ko%Q?7(Ddv>Rr^!&x7v2ot~DIwPD_ZmkOsB*6`>|b znojTZU|02B_UdiN_qqu)fS0|iNea(e4x*GQ-yyz6vE}(6T>$6{VbM=cnT|0R7?pvP#?LMoG6%E)h7Sr zOvez(lnh8?(ad*qO}$F}eJF^QA)!x3rhR2!Z%euz#m%EK`$SDB zxvOK`(21Umw$Y2oJ86f;)z!m@kJSZ@BaAyYr)7K?_dWb>&M$%2;RF1volD}kZ3~R+ zbtU83)+zH&oo=HS+&nk2AmBz`zYeKm!pq>q*&Dj*lv_^j9P`Y-IkJM%MyNhfeQ%H? z^I77V2-ey8#^vY5lw~7UHhLCy4*4?kj@z$jbUT_pza7m4e|`@1VTroo>UP^1ie&aM zS4ai5W!7Au-XZl3dxiqm@8Wx(QSYYT@`$>!A0v;`3Vr_-Bi5-Y@>!qP`T7$tv}9!ZN%R`(WC72`CnE`V@dafW7)qeRml?MYV2Ccxvt9x}s{D`dA z&6wt2G`O)>wSBFTRK0Dp!f`(G{32%TWRLM+f*3rqy>pcZRnzqOz)hlxEC6^4tQu za#*@~$Tuk`J;v zbHmGT#q_h}#5vDGUv9V8y*ov{RUPGjvTgoJCzUQW@nNz>Vq#!>95nAK%O*vTu`=8@ai25x4i`-OCUzpVB z8WsO+$d+%pf^mt`gQe0|aqFG6z0RvW7C0=8eWvX6UZl;u6GFH-qq(fdc8IoAH-`Ci z5N_v)T}^R&|A7SW{neZJ_oX(>@?^I` z)`BE*<+BNAjvVMyFsN!XBEQ#$J3;Os>hxcOn~n{Je(pNcaAMioyyfM-N0&a%E16ib zcG-Y6xjT{KS!LFo1IOchd|Hc22ivBy*BW4~vyX3vl|0-%nllh>3tHP9p1CyOgTT_n z^qcl7tYqX`2m>$ zWlK!yQ$`E4t=yy!FEzEUrV6>HDSJwl7^D`g?DIn9`}<(40zOS^x^bm&(WJ<+9tESr zRxz8UC+5j>&g}LL8XDFz=;o@Q8FL9gwpC58>z71(p?pd^k6PCi-4#{$K_2FJ>(n4! zHhd7I3I!B!I51qU2)E+f`|GPPFcbN{{M<2(pRcG}t*zWPosSc=F$EM;( ztjyZv)x()uZlvFxb0nbs#f(3ixd~+h@n~#%>!*t?7pwfY#h-L3lD=+zq@Ktw{KvHoyCHgU&WzUxxaWZhC5FR`Y9CW; z&*gpelSI_)%DWQc*DyT7&smVUK4_Ec^@?FDYm460F1j3Wcue>Kiud@i6#=?vQC>iV zu=2qI0z6}N*zMvr5ZFJC?3X@eL}(}od~AiPA)&oI*v@^!uW=Kj1M*J1AA!6V*)H9( zavhHEPvB|vd8_k;*mW2)rmn=;ie|p%=+n7xq>pfGZ-g~*>8euEXk&B{t zhj>o9dRvw~P!YZDeM?ca<5I)mb>1z0>q-lTO8O7945 zuO7@A^;BP=F9~R$m{r_TaK~rQl*8{Lo_q^lQ+Pk3Z8Y&K>7({|VKUgteWk4z`}z=? zcgr2&q0Il8(7Er&pU5^oI3G0N3bbzk|MY-{ah1K%eHRaSklenNb#??BT6(*!6fr%U zwsuP|=nncE(%!;+__E&N%esFQID~T-wN!FuUq5({IeJ^oe$;_`NfFzW)u%2E2>x0- zeM>hqDB@Yhr$W!=fY#(Yu6+M>=*K^n1ltdUf1;OtnOGeGNj{cKn{lonM85U~x+A=3 zRK}{i`~{d#$Nw5|(#5>$^q51Rqyt4B%)2Ycmbmr?Bu3}?Qm>ys`srjXu|prurz6a- zoE((j$~RZrtIn@ocy;Z^z)RuiaLw`Y;nS0Dd~)RnmJQ#$t?}G;1LL-=q7!5VJ8DIl z_3nIRdcUF*Pj4@naQJn>dEpyr{eAktE%;aB2R~aEj{kaZPurKc)cG{Ti;l*FJ7zXD zOwGuC@nm-Q?O1PY0c3R7L;0<;zuJX&_3NMSImunUThlQ<8sZ}hBM}caKKilx({)P0 z(~{8g7ck!hN<({`}%0d8Y5RwkyZC z#Rd(p9}@jTUGIS1owXWNBg=Qbnn0OTd0<6lri&ij^9DJoBxL=o(2XTq`dz!#+Tj37 zc?x7=zJ6;v21=8nKJCB@$FQN^**T~1Ldk~02WtLL?FgyIfilPD#)of1rp7Ff(mNlY47lC-ZCB@FV_JlK$%EHYZmp$887^sW zwZEuZwl!5uIo!VJ@!(}m`R6_#J4#O+6ul!SYsu2?8IqXF=W{Tq4my5Y!}QKc3yY6l zTz<)ATpHKeGIC;0Qe`(tmKdTBb<>%TU+>)*IU5nurgDQqg z!a9fF?mVQ~@VRPX_3#g2^uza6!)l7slw0kDzch1L=vJorIY{2m^X7kq%9pK?rfh^=5mF~R%V>-Rx=4k)nR~id@L&rpI+uC{r zF{d0|=NKQJs8~W{282h1jSh?U91tWOhV?d#-}~(J#$y`hV>Ud$)KxL4!}a0dsh8%^ zXUnzzXD=U1_p(k1TRxpnoqn@3J2d%J)o$-;fdgKDT$Enx6yGJXD`sS>)}X!WCME}L zYvNv_E$M146Aq4$udMR0?wtbvKJ_zfLrhdz;pXFaZ}00nSG3}}=D@)|=M)Rt!@WD( zH}5!_m$Q6GO#%2BjcC^w<_l*-LwuFECwJth1+L%mK3EK>~#g=FM6+`=&f`t|ua@3{LgJ9%fSB-0dh9(jf;mp5?T8&+@ap`ZUJUYVXH4h-Y*T4xC-G8x%$I-KaytKaqPDY;Sz1 zF!Gwr`!cORYhu~Nx?*aS z(LQ|n_6Mzm`?RTNvyZ07DWCN5IB2mZ~V~5gSO2}^6-)l46$7RHP!PknUln?`n|BZlQY|Adju3E`~eCR zkH-{j|8jkP#*yF`z#AShT&xb2{H}sIi|7g_zkc$6*Yt*|U)R)@&pQvqy3eO`~=A@k9VE|^Ld&AF17k*kX zuh+-FtT_qrL53eK*E-mrChz};_WZ+dxWBc7vacJ&%g5hsS@gYOx#S)tVsK&FPiOt; zv5UT3f^Z_zX9= zLh^cpV90@kC&fYLo6rvhwbgy!-|7}SryYJU61Xl08-yK`BDPz&kAZX8J^B;~lCl68 z>*VJ%@0R>;?}eCDl2FmIYi!TNQ2-bw>1ltY4?gH>D?b@mv(W_egfJ_dlgfUCj!GUC(^(0{DL-$f#8a{A6v z*oTs11KvpEx?68dyF5pKJ|Ho*^R>IXqrJxkFjgLW3sYT>0m`hlVqaa^;VGG4!WjUG zmo!LlX4zQR+agF!bla8up)Rd`Li@@u}~Qh&*F>!Xyn73B*COIkzz0gC>+3$eIg zPDQn1)4btsOqpQ9*Ed`BS@7GK@gFbz`q}$P|M7&kPgI42{TYb6JMyh{=(pK(Qu}6Z z*f_rDXMfL5$_hF9nc*^|<%<9E@oS=CW4`}Y_!BYL{@glvLq%XoD1A)WKh%Az$2RLj zQ3JpWWp{d9kGtb}uC+SqGQhBnF^BwU-E`q2VQAUjeqncB_xmG&&$UhkAd=EL*N658 zt8c|VCdf-~IqMhr>w4M)_~M%5^#LQ2>8L02hMtc4H8B@{wBFcNea4L(`L)K4BCQOZ zpW8Rj^~Q_8X06++`#sei+d;p}cppAgRoh+S4%|Kkn1;fgBHsa@|b1GHD*j8#c{x1ZE)DF-lF!_Us9V!+$rp!v{mzl#yWJiP&jD-hGmtI%~p z)6RgLM!z@q6Cl$+%gYVYl_pfA0rA4rNK+A)`uS&wlv^g;K5_j4H){99!Vc&)+4y0H z76Nbg+L=HZz=bTTRTeJ(R(gB-hYWy#iT?3oV9b{Wdp1BXhAf+}+@h$Ma_X61GhP-0 zk{>TG4CM}){&vTA{gqrW;ORq@8qtA_4QW4Kjg^2&tnT}#=IW03thBE9$CBlv_m46E z>giZM|HsR~^xljqTY>qIHQ^(EBLgSKF6mw6-kG)iGF*=?1{>1*4-c9eE}Fl%o%j92 z{9hv@E??++aQJ=EpEH60R%OOz028jiWAzofo%tNkUcqN)2M?);THibd@4M_(;tBr4 zWmj_T&y1u|A0NT5hG$2uoP3mADerzBQgZ*m?^Jmh#8;Bp{LGCm_AqWuIr)y(!d~(I zfnfgVrbQ>-h_+oLj$b~;rJj59ki4^O&BD(oYjrKbd~IDElT~j2biKE1W!EeKOT{Gz zlzf8*QAQLyLj&g|A90Wpb3m^3O!Mbcb%6E(z*Dsw_kfy0^*eWz5|k|~!H51VT@^HA z*z?65&pADG0KZ+H34qeC7ruUZI)E=M(g%*?Lnys6rPReka}J$;nNyAnKCsPkVr@Lp zjc2@{|LUciyAgZU6k2J7Jii|UI=nX-s1pZ zv~I>I$BXoqAs&;n2cKD|dhN!X#z-MIb7WJ3_mwWK{gHg^*250it7=RONvt^lTMRNBoQ-2n4_;2k$Q zd(CAUZFZlT)FtI%XP&=o&B5df=iJI(MhqbrMTH&PJuP^DR!2x0C~$}Dnd^F2ym;rJ zhW(TKh2e^?4>68eGjQ%YXqn<+;=)gdyf2)6zyH9?3fy6@C;)wsRsrKx8?o_6V?>N6 z$VS+CkBs4d-cR#YUN60x=YN(QD1{{~9R6WKdQsetl2X%s4k>fH?P+AiMgNRWpOw?& z#y{`dR?<R(1}puLWue+XnDgEtsotkMM0<=gexB4XL!}cE0qC*yekF zUf$3l=RX`eH=ue;u5(oI9`z?sx`2_(k{U~T9eKKJwBcg!-bEA8rftbbDu=g_yc3Nh zZp5vY-W@QhWbF+Fum~$QZI`XaR`m6WW*Z@uOSW9%i$_llPn!NRdwf@!Fk7ISP%1vN z!m~;2F-eHz+18F(wrK;%RrKl|-VA_r<`T-TF%#)s@6tq1wxs>+?9SZ(;`yb1<~&Nc zr`u8ZYLT!n*Ub9$qirJl%Z$02YXJD{m_Gpj)!Ml0qITJ~sdU(u^$%O`&%U$gm&}^e zy$Cn}oW`OW`3cWy7Zxp9A2StCY8k%SUgwm>RQI%?UQGW{s102tfR%YXnxEE_RrnJ? zn#U$O8ZsR}a^bgwd~XIr`FF;Eh5*OJL;^S%zjrWSZSB+d@ug+IE-y)s{J4NUW%$pgU}9z4j8n;V~>rsDW`Z}2}OtHmkP4`E^A68l{-G=K-94o{IDNjNPt~U`j4s3csr@>#(?}sK2w3p}8Ywf)LGagk7_WR8 zPF`$H9n~`diLbxm8lz~~hU)5>9tTRoZvW`4Nn8E-O4#n#rvZZZRI}gL8_$A! zkLo=m)4H3`;DP@0V|!32f3D?jTnl7C`f2DR{{i=qL+u_MT-ZyWrSZCw7nf!|uQ0 z4=Z~{oM_mZ^Y+%`@r(7F4>!E7kSs$vsE_z%?)ZP$d+WC>x2|iLmQpT2;G(-b1QC!Fr9&koFG56Gr9tUdT0lZjKoO9V zM!M6Ykq#xK6%g^Ar~AI2Z}0tl$NLw&$FYC$*y71~uC?YIbIdWv3Sds4z& znAlw=EBuuYo)lui3T?lnpE}HCD%`p$YRaocxcxeN=;pJ*S8}%bMFqmzOy_Nt1Gmg= z45diRa<13E5{ckEdlnNSmZ*u&I;LkO6lQA0kb8(sPWDT@>_bEdmXdJEqe3Yt_+NMgcelUxx}?m| zCPSNzS5)sRZ>56QiqJ{-RPG#p1%RH0NQ zCg^lw!&h2PO!)_KtJb(Xc(dEVquMvVb`)oMhPsie%Cue;sJ?+TvvrLnv$$dEfeb2) z54U%4mGR)gt~c{9R)0)!=}i^J_DmaZ z=ONX#RX1FaFN%rWry9CR(VWd!JoYK-ZrfYNIZoO_qhSicGb%`usBzk$h zOQRT(R0`?gwrPH?gY1()O+*eA^PuRxQE0Sm%}P znyH?}0bRKrB82ZBEtfU&n@LFFurj(htFhmH6?-H?_!D^`Z?%N|ik+86=?%kU4_5tc zO;N5X&4#;$+*c%e4`H^+MDuKS^W(97b=)c0+$gi%J5sI$`yulzRjg;P-|*&WCoD-- zcP}uEz2U@6PQ0lXat5!?pmSPkCnoh?bH4uD9R_tmgPuvL5*?<_YrOr%k4ryXIb5yG zQ9YuHjSs-9O9za?ISj%cEx9{G-Fq_B`bO8f4l2HW#s9AsKzrAzaOE&fiP2cL+2|HG zw`sZGbeHEwmhZO$lGJT=in7C-xeSY@o%vNi~>XHC2Q=*HTL`+9^*WVAYbeDYW_dYD+sIyJ@gLrQxVd3J3#K_ta1XHV+ zoXk>nJvE(r>9JvIRImsG^0gxR_MsWpcgP3`t{r|4OG=UVVq?L&PEo!ck|W8I`i`(rq_K`KS`G@{o*v#;$#ORy#c);@$?PU=Sfb=#a2u1(1aQ! zza`N{d{?}IWgAPeKYLT_*M(>iB&GkTy25p?)xgAwioa|Ag4!OvsLFQoac@5Y*acZ|IDxXaiN9! z8)A~L4F(eOd#gJ18uB;RQzt;hSU&&Qa=?;9n$q--Z@>V`5=V6=>cwSZX5K8F18mC6 zN42+!^zLG8$4W7xvM+AgJDA)b6yizd`cUhsC^+~024h;TIBy5x0~S#;XZzNu7oa^6IGPp)!1e zRGw$h&nb3~Ak`UJ2fh2z*B6^If^ysqMJR$N`*g*yp_kZ4N!4h|ZYEGl>94etDTW-& z+Ggpo|6pC@54}OIni;MJy&y;!=kzcBXDdH%RnNPzNbmVBJW*cIg0zQbm}p#Ux7kPK z%5>IIB~<23E{WuWeJlRJb-2yoC>1*_k6Jq)LWSCBPJZl90-y5@iYsNlP5zw-jp;N$ z=jGeUr62l9EZTvw=?Y==7-Kz2RlN4PNHXdUj1GRSCLaCb%>*&*3JbYqXu8>DLNc~v zip|((H)EIhtns3O zPTZ{|@llm2>+RsG6p!<*{M@vxT8kzvQLV(2&SIq{+zQux`__h^8*B!=ps6Rp3{!MJ z-Y~meHdJD~d46in*nTNNYMTknPK~U3fdYt>!E(j zxv}iBP*FdC82_B+{o6xQ!h#+ZKT$FyobW+ou8+06&WeA^x3PNT?CsUewaru7&~lw6 z{b`0t)RH7BIyv2L#HbZXx4Q;)d5^Le+BDZGJ6(|5{rMv_e+@_8A8(0!Pp}fjRH*M{ z#f=6N38^L+Qn)YI8YO@PbB~k8U~9fP{rRoR5UOvnUp~B)aTUbmB^bq}*aGzOmPg^D zo@{YBjwC+&P{B=P5p~LrWLmwRD{ps4BzZnpUMJ=TFRf#pD#-18GRRxDR0}xfuUi4a zNU%eB``=0&m;jxX>Q1VJNfz7B+eE(f-l`26H4`s>RGAz167u8nTD;vs+I!hQiAb** z^|bk;JU)6RK3Qp6FiG$@_3APw8NQW+-Lg;5jyJP(Ju;r=lM-#7;H7P)Lc0!%826#= zfDwcfW9&N!iq96=&_+nHYY!uZr>UhrznR1e_791*I^KuhLiVdbuw4Qlm7yEGqT-Hp zRbYGSOWjd*=e>ufebxwXL`s0ILQV04OE37d$&Ta62FhTky(+{jK^cFD@~DqvXE8^i z5?+(C6(ZoMxvvv*q1Efu@*(aa`8KIwIFkZT_h{O#fmrR+e1FK(gYQXao;8j8`Tls+4lR$`^o!JRfmog)*Hq;sKE zT{i9HVl^$9=XKsips#7xj49=ss{{F}z>5<>z24nvQ~ZThWUN&^YY0a#^q9ZHEd1p) zA)b5sMi}3(Z`>tJOSN(IGL{SKZ*3r%?b4Ah>e)s@qURs9yf zIeX21CFj~K!rUO^+uKdUN`ZVEw?7hY`s}~-e8|!4W-2HAOnubqnJzE+1NP$@^K&K7 z{J8UO*I#x!fsyTzlxiSer$2s2s*w0*h0x?Fho=tgmbn+pYKBF7dW|hhY(ucfiIZX) zoDRPQ95$51^I%JA^dwI0nhjBAPqGm_1>YGG+KRjFP}I|xbSu#9m(#MRnN5rb&l@R0aq!FNl|L$@UfIkMK0AUdx{IgVrPvB21vyc%O^=`Vv&l| z0%y^PWe=weXEVTbtoSmg)?yUpcnh_`P9|pTas1X}^{~sQr`e3SL#cL*OZCGDL&LH7 zZzd}}D~-AoAQ>_57z9|>u% z-WBrxuyDJ_!8n&Cw`$rTpE9R z#P2Ao{<9#(^fAhQr^J$&e?O}VAxWd~pw6ECrT8H9I>m(@Zv*y2t(}k>f!4S^IkJv{ z75}MS7&wn%@*j?2Jn1G1pJVK+DR}QvTby?ec-0$iqRv!3*)? zw)=LbMIr4)CVtrG5Aag2x_`!RvQ|=wE{w3M zn=Sg2j38J1B`i(p;V3H%>`AqAm{5GqZ!Ic$6E(a#jeV784OTBol7R+*7!RnKtzr}4 z;1;A#7ba;wUaSDO1DzSqv!dytnd+)GSTmYCtr%oz?L5fvj~H*9HTd#ltG)Q9-`x*W z56e#3v%EnnVtaBIk6ug{LyRnc1J6TJ_2_Cl*N3x#PM{9N)?*u22&GEWc&($!5?24? z5{=m>mv=fZDu8PFGlR{f%!nqP&r2X3l~Tz~Vu&;g6RKY?zyHmVA^HWe3IEk^pUC4m z+>mw#xw|kse04Iso#fjMwA8>=JmKGH=chDpUL^~&%&eb0Q&pP4T`B0yoRLK{$)7Nl z+(@nyuP#$5aRH;1coN9*)Hbf`wJ5J7y<4!N4d-^|1=L9}OHegYST**c@lNW_q)XG= zOm%`jW=k7Ik>oL%^LhK?k_pYqD63{PN58%AE(~Z22~v4wru3vK*eWrTg69cs7 zTRg};#~0y9J{}>yk2+!_SJ)){Ie*cs?cIIe)b?}fRpIL>`DK~D zeN@Wb$(!j;tuSpr_T%9tSMKY0?{PXfb`i6IF({gkv{xoN7>k&A*4t1aSPkgZ9!O{dqR5Ah+I?YRPZcfY4L5W`RzA|JdHlC$8h|n zHZN)IH>VSnJpR-(dvQ?Grp9mA#dK<14n|+izZCjBr!A(pU2>y{Yu*A&3t~$CqZ=`c zj+%sOTMyIuDMgPYj@XYxJ@C~h%ME(n#Ku4y#g#$fme#{oc!hU{+P&rZ5==>xA~W6n zwxOr6_l;l-cz(NwF0*vnt&0&mhk%_U8SP{wx-9@V0#%~9-g|LzxIx(#qyHTUOPMHR zkp~ zQe16Q$*H;ZiLfc-uHLMbY>P}_nQrjAV0sy+5DxY2X{FkkVvnJuC3G}~akgm{By2x+28KOp8HN2bgK`t^qgI_-$e6KJ{T8{Cf zC#on~d{_^*0LZ92uX)yI|8DVQ>iWaw4|ePywmxgqXS)_n^JO|L5c3OK>NxuBv|3_? z%A9lau#HJc4HUpFlt8J`W}2`TxoTb0too!`)|=eh(@f*;0Uj9zH%?Q`me;9p>-C{g zPB8q5SZ)X|bzBX5z5-oDxUWEXN=cbG zR!tzG=IKeSZi}|aC5I$MK@8{21sOB>q56+s$9P01 zI`qvyIlc1@top5pgEZajnjxY8XxN$AHRZXyV_EDjH1zlq<%DBiaSi>F;RdZ}V2cT# z;3r+`Z)sdy5s!E!9_kiy5Vkz^6AqE!Et1&XlQY0+<3`8}0sMxO@s}Jrle%B&Vnn;2 zCzE_keq`Mk&TaLcM1-*(28>jO9>m-`(|?NG@`}9Pz?MXwynxU>2@}IuVZ`%=q58gE z8BV80$hkU3gW}0~J*8Wx!=%(EFi-{%kJ^SNc{vd*v{yaPC|63F^3zj0^pvws2q#MDV=?>L16!O&Qdms1q=Wj)CujBBuwvAt_;uIEg3evQEE#dFMo5cbTGg2Q&+zZ9 z*^;u7xP=a1ILVX^s9~y=-@4HJGxx@^*L@vo;;ol0?7MSoUda|!@85P<#h9Yd##r&+qH%3LAv?{B|18xm#7;oL_cUb!kma(JdS8sEzJyD zqg0G9s!=-2!GNMUyoCF6?F3)Zy+?07AOAz4_E&4S3z7C7;J!KdS3e#3zxN&iz*`yf zwfk4&8~Lj~8SwvN;Q!^5R&NX05 z)YC2v+o}g!ZDfCh6c<66(pZbWTl!v=UhpK%DvGxiJY0fB_CH+>PrLbq7xB`;Jh9KW zw+MXuF&i0TJX;j(`yN`t5B@auh2QS!p9lEXhIDKX#2!Fb#$SpF6GDFU>nHe!ME}-# z@WSHJxe+4_%u|z+2$U)q0ae`!ZFt5|n*Zfd*{CzSQ9W}8@%pJjv=E3W6LGQue=X)c z8Igf5RR*{A=3_zQi_8n2@`pV-tx^21(JNLTb>#h1Z#|2|kstMmhW$$>Cmcd4t1ndd z<=NJcrr&b#IJxT@^3z@mq4BD8yfL7Tf4?u_{kj3Vb-&Elk8yZjBJCt2Oej?=NSCRB zR({R&%vz80KMFrM7k>)hGuY2?zClss3hI$i6X#maDKHqFgO+}wm$*tY5mzdUDv3xJ z+qt&O%>HNDNuqEx?_)1p^|wimSq6(hXTI|=V}u@R1D^%yP_UqoUWZRK2TK>rrsiCe zpat>`4D^DcU)#bTAd+Fb*~VX@juaMW64JSNXyXNV6nDNCdVMH4)7MQWM_=;4BbGq* zTq{Tm3CVibMK|IltwjIvdk2nCTDti{kDtsg(|zOzb-`sO@5NLP4D7^Mk_i&bnPC@su*FJk9$zp_MV6yNo-%NZ;7pFz%^*Y}h> z=oAwl2q3IuhWj2i@YKXO!IU=!fY+lkp8>j8yjj9_8E&dIu!o-~Jefoqe2-x6-i!HP z>)yPjG7G{SQkji6SNn4k=%x9kCT=}11)rAAj&-qVPC`D!`KImbi>FLNAZ*z>`MLSP zrO|WTHYF6F#?;kIX*$vUy3yD9u0QTcDd-klYz|scFR*EGFuGlkcVks6XrnaBiwy>t-CE>gaF+!@2@Bai%NL~L~X}?%3Z@nrgziY5EV^B|@f=LLb zexr&cTCmDUv;G|)`w!x;Oxn=3cO5u4x@Sfmn+kn#38eom+Hhq}8{|}<4^3OC3{AF;RR$@StqP0Ed$XON#xw_|^g_)-vFpI~6A`RHAM-&wqgmxQ#7@C~ zh@*3c{CUcqf*7%09_-k7kV?rp_Y4cM3->`!pW2g2-R*(nsj!-$>X?7I%Ube~*MKIc z4Mb1V+_zEl%3{VU$;`jLTy`p4g^f;sMrOSfeQs+h#iH|PLSN_(E#0T8u6J7x&l=FF z4rk%^NW2BhwDyp4v=TvN!U*VY6tAlm4nI=SsL7pstAt|~)4-2R%o{;xeiFB%{$H^Q zZG$7=>H_v&a{!*BJ)hVM0D_}MM3}Tub z;x15j4Sql0^Pmi>Z~YuC*ii-UbOCpw;^&T#E=Ipk@jpK;#TQ!~IK7@zRLPk>rAUc{ z^yx7TMr-(TN{tHhuBmjajUEECiY1z1ecUIA#l7UzJYs_k}61vT*2rp zj5EcwTtgk*iqOeaQ!81%LXU}PB=Bf@U;X>3mvF$g?%n}(PN!E2#D=e34Mh-fQNvEJ z*;U46GkK6?{E->;NdQ5I=OMt>s<d;qVUKja3<1)a|J4$-R{p-FbrZ3AtN<#H*I34sVF>NXjP|}sS~u3f4#$_I zZ$aJYelR{bCH%QF*QED(>4!P)7Rg@6Og~6e9SJPDv$P)u4mG+}wQyd%8M-hTmkAjs zxbCW6ICEn4f3;+PZQC#wY>+j9MO)VsEwLUBQDXrUKF`9kcUp(3m#sj!=YAgiujc0) zMxxGZjeB^#6vC!_1_&M)1@soGPap!fAv!al3C`-Y`ajALL8NU9G}~AH1%Vh@0=l}u zNQwz%SPIfTZlA)^Jhy84yJb+=2%CB@C6~QiG_Hl!Z#`Iuo!Pj=T)u=n__?j{9=sfT zom-B?{97f8XXa%fiQw*su?Iv98GT7r`ZF9$pS**|SO0$cLCs0T;Jp}+S;_Q#RLOn0 z2jr4y&&jV;zF^#Fb>$tRgjA)o&vk`AstQvVi$iL;&?fgs9M{FHLS!BSVkRj>a>mG~ zbvVhEzYc?I+c=JDVf1uX(f>O5+4Mv#&q^1Dpfy1refdHdFo{+4(KjkI9~^yr+6oqm zj5Mp}NZxLJf+WwZ@$r}R z(l@yNv3D$8i88=}#chRoSpVapi!HDm<)t6YMH$I>c0E znP1y|)Ru8d*LZ(4S>`SgL{60LswjiNJfL_cj_AEF{o~~na5xD?epsbjEeoypMq!D9 z;xna2-!pRuQO<(UK@u6vDzj9f$d$J9OuqN!F+A|d z6m{Kp@B0a5z$kJV3uYI=Z}MeCdE%Kcr3;W8s>|?#eG5Tldl9S!F9e=%LSXI`Y%vVT z(io=Fecb=`ZtjG#Ab>*P5*bGcXVVg5Q<}O^a22hSEbCL33ra(e>q?Gv`4zSVX|NStL-xn6+l&uh$G9qR7)h6wR_a+>? z3&-C)n@GS&(yKwhp7zR6c4as`!uNcaNH#op)Zfhy5i=QqiR9$HAKyPOgPSEGa*`WZ zP1G!WH!3&kYdsVGm4X7X?ouXn5lWdkU}@X)V6xc?RgUQ5 z>i9z{eIxsiSG@u8T9ZsJJp8W~0R0Y>GN>PF+}69gy(I}EY`JmSDW3x)wtWGqhG!UR zr$33Q{%7vHp)d>V9bv8jOV<*73u=(i7S%)#>Wc4li=2Ya>j{mg<6FeS&cCt+Daj6E z78pU8`@20QEi;ho$*pHwfQ(6dY?Oc>(B8YoTIGW1DM90{+|T{|-^m>>5HJLHQCTNl zV8=IrQNn|Ih^}4xtgY^54;L@ke|jH)oYE>Q89+EkKlro;`{)RtJV12VpD4z{Qa2*X zI3F9aA$oBP#7viupC^6OAxFrdR@?jh;K?C~GOKJd3wI33T5e+;?syYw#ANNQ{h=I^a#a$ib#jsD~XnnPR@749dO3t zWG6-W=7R&tb5t%seE$ufy@_iEYff@VeMldAnTa;)J4lg3z`Ru$0lsBE{e1_||MP$; z9ix`$1pxIiuWzwGI&YQ!ZF+ig9mKkGkb$D5Iy6=w=eoFHH>Ce7oBzJdGEwzFM5N$gXADNDWsbGQl><`nj=s& zo1^4Rg0ty^7oKyQkY7Wv^4bA17r|Fp zMDd&}AB?_oZhU@SkOCor3BR=$A~xL*EoOibZEz0I2uUD0RV!Z2(kCfxQ_7p4%GLlI z<^T6n34Ff@0W%&qdJ5cSr{ZjP787;C0N%&|T|t9EraA!XIHy8^9`5L0pJxRh&x-=& z`Ck16e?mXPDfq!I*0ZF2nK6i9xPI$loI|8J}B`J#r+oSia!L$6bP0uFdML@ zB06zLXZZ=jbCBXcL52;GS<#zN$W~4HdNoGEOJ6cg$DgQm4SLGeK#*LKW@(GZ0*bE;7xqT;t>_z<4CS2 zFIy^nH%t43>II5wm!Fi)67#?PaV${wk6la=h=77PUp(t@gDQ5WSE@S`P=JVWm4F`E zz6}Z@CmvmTrYiV2EQx_WP)@B;8aP8=tQ7Wr)!bla?WIQkcStalbN~149hod~B>ae} z#h7c`X&Jqks;OOwk)AP+55QV?Va8GTVe_-oLP!)@qAxl5pdsAx_Cw?fz56GeBG(`$Ce*u zXtJd2FJ#PP9kAmZd|Cwm&GMXX6 zf0W{uhP~Sc(RXTzQ^=wLb{907KBxzp@OVb|GFe4P#e{(jIW6QKXR!^E7Bvm zaq=&@iQ2@V9Xlm_1R+*nGWkpcLogW|J&Jx_kRb<^u!E6Z{!_NkfR{qD8Z{XUBmu_-vQ7=WH<5Dj{&|M&6wiqgl3mg4^l z*61C)Z!m9F+RIlM0)I<9uKPQ1eT0xf5911@WUvu_44HKzV~-J0@&ZTHjOfa*ybxK5 zB!oqA+5lV9Zyo@Y4prmMd;?!~#%T=u7Ql(v%n^j?f;Z}#*qM2kn!lVco-niONKggKY!{h)vi9y&ig2O}@BtfK4bk4_K& z`q)#f^oVMGMgF%psrMhR)Bg!Mz`7?iL+Ln8!`60_9^t0Aqs4iCG{T8&1=vkrGGO%s zwgYu1=z|q&Q)o62icL!}2*vVUbH*xKaGp_(tzBDDc_7^y98E}o(Zv)kz*~@?xp*)u zN&a2(?;j7oBOj&ZZX8gBA}4oX50OC5IEqu+ha(z})YN}Q6V1CAJxw)jG_J%+9smF# zcPNo0 z*`IYI2*omy6ua^hA(j#L6RDuK5X=hJ-D2-%UdRW#-KAy(YMHs+g(!0RGPIvlQyihj ze>gJ$ly(LGsVISGFx_}cbSfpz$g2#O<-tobcg#{;oi5p`GGq7zTc70{q7q(+;+ENX zgYv(ROMAG|+c(ED?hewz32PiXMMlNm)Eh)1gl2+SM58>!)HVO+yZ@;J(2mHMjaxu3 z%PLs3+nr?#i$W^P_xmw6Y6yW`1KtpAFhnSI?UkJzf*DBdaUyuuA8!G4z9h;?#OGI^ z@G?ku3&QIqy-+Xr6DCq?_lGS)R_#2`V<f&;&d|Jh!cSE3tbHlbUJHdV%(_)*W9J_SL`0DFp|jxS#QifnQ#H4L8Q) z%GuB@19^a)K;NSKtp$51v;SZnB zpxiVq81|((zzfOK^S=<%)^HKUfwD|s`8c@4mMsgNfjRiWKP0{Bl>$3Lp$J6|T8^^W zHy^d>J;^d0%X{V((3{jD=(onJ@p~Xb3c#b|Rv<*}Qju;Z?`?LLyvw{?e!d)ri$dXY zh6~iLh|=>kerw|h!s%_yO?lFMKWl-=LlpL5rqB(n?oY^1>AiI>`ZT8>F4h|WHPz5* zq|z@j?Aw7+APRIj-ocqU#X}%n!eKg$=k+XkV?qcufxTDWy~LNTZC8TuaEKoeQYu|b zv(Hca(|qvsKX@N||C7Ncm4_L^cjB@(Az|&fQ_89*J=BNg*;cq2!_8Dom=R3~wXE@l zrO1z07-dyqt1AeTBfW{A%RDL+vQSzovoU;uV--7jWmjq@28J(05MJl)-YuWTA^=49 zL)!O5jjS%kU4IF6zi`}E<>=|k6th_UEUGFqCUw#1w+jxgrn5_ebFuz%() zXK?ZpSFp-+0438G1+^P@H4;W%m$nkWH_O0gsb|bd`r}c>@y;7(Zy;oEHd(2g%zqCq zl3-|3R36{5QM|^gc8q}dP7pq$B|r6+(#iUPI;sv$5OV6BC9M@X6F>j!8mm1YPGJ(a z-QuD?%jC~%2ygX85@&A|{vp4;v3BT9ye>ruNfS|eAu^^!uerDXPQv>PPvCr0C&j*skyfADDsis60 z30X2w8iPXTILg?oX-u#@O~fWz2x55xn_CAJ{XAD7_=v#F`5Tp_S^E2MTZJknRPgbs z$t_()w7R<@58Jp?p>hU6J(IZwa-3ce%?_7A7W^JL|6gk0f>}}iW)lL(l*!~IgdT4d z*Z)5GX-(l-{0k|RhZ;5?onmlR=)V*cEg9TU_`2@Zi*l(7oI1FfM)k*?bpWblj+p$v zHtY)gvK)G$*wh%lA^G2aEM2`@juB*pze5O+i!t6uhkgzruyU;UGda^+&+Ww1%pV(X-WMS#zXfJ zHg_(kUy%I9n?b~whV+M*p=mWTnAsTO`7$3Fw$dq*jW2Zp?ha|k85H$FZl`_?moL-^ z=KckmGuZ=PDt#kUx<>dLb6xxAZ=x8{PBf;6Gldi};kUjs8E8aY(dv*#*+T}Ml-^PZ z-Cbio?bLFH1UnLPh7b;?3FG#XAFAl@Y(qQZeE#h(p_y9b!Hb9Rv zXMV?!z}l?d;~adp=ZvU_bmw}VO&C1dWb%A}d>fezYhl1upKr8fW5I#{I@lGS9s|^R z^7Z43$tgn)4V}6d>OKyouP)Df$r?V9uun*Q!Gmj(fG?KXad+wGW)s<)ZMUDD3sfak z27<`>slUxjiA|2eCf`yGnBohGU`tBO3T)sf6u?MTMIv*I8>Wt6eI>cj6bXMzmG{*Iep-sOCs;V8|7$9%TsE($|`D!BS0LGXfb?IH#JB==wcFb@+p*P+*o z{-^RY&b2jG9mJ7*wi2g;@Ph3Pt9;O1b4z2^zWkSJ#OVpVj0zZmkusK9yhW|JU6cA`F; z@F$fHqtqoL-7<5aY;M2{o=x!Y$GDCpLf`=etf#lup|y|%4n(8-Yjgb@LRXH%L1 z!`m~^;uv$_szCDoqm)cK*#vijujhz>i(SRXO)kKeCv`1n5F z9F})mi8tH&;_;U9$7h#FD(-#N_q|NuUE>p~80ZIG70rdthZ?O9cqoO%g3qTRzh8vH zHespw0N~}@rvf7OiW-*swn8jlgut$xJ~P!lr}(=G$if?&kCc{n6(X7!f=iza7aE$7 zp**tN=<$SgWL0)-KLv7B`90YFp6xu2w)K#9<`G^}b!>46WnK;13R;tN$Ji!4_4A>A zFX_HEQW?#H5T_&VJ^3dWE+g;uOdHEB^t3dp<4|%P*r5^er)FbOPJV`|o^$b0dR)|V zyw3#~@L+R1XH-{jnFXy$v8bq3UifMHn+wNLRO0^7ph*Y6isu|R8EC8<3|B`>n8kef z9wBeX5sj6&v(%R|*+NxMC!#mhaWFW0s9Sr-wmwvtDKdgDg5OJjz5oG4^gBK*bz4^n zm2+LK@LI{O$ocPS$7K&X3P)aP*}N;ds_B0QNbGc%JnhU2wWiK*@7lB9M@6Abj841H z6T4>%eIjWg#BdpIQcsWueu1t?#fITa$zFaAvp?&nq!iF$<3W5!W|dW+jQQf!8|Tk; zJe=)oZml6i`4&z0IcL0r`{&{N<^@J&R&LDtpUsfPV^a;lUxbEkj}NVtAK6&PKG1LF zhebhRc%IawJ%#fzo0KyotpPT3Z16s&8+!UrU;t|hX&rv=Xfe{81aWLXFrIc6rAoCH z^*9I*WF~;m5!9-d&a~GU7raGTUq{R?jT?OQJIODwv3V0{CYNk`C{Q(DLrBMq3q9Q(#jh zEmA6=i0>k0I4_c<=I(DG`Z!#}h{&ztnf}g>X2$t4j+q|GE8?a`o8XjsBzL@0zqB5j0<8mpr% zi{NMiS2|X1b%Sq4W z#@BaLewMf4%ixKs#{Csr54Zzr0$pb+>~#32U)(p@Vqul1k=frm{TYuuFiXjQM7e35&v!G=RyNz^tj**RpT^!Ek+hYbPk zm!R0ZaS`-Z zKaBM717+#0haaLhK;t${yzeLc%+YTR#c^{e%W2`g8g=@^npTDH;4&kjl`dI1Gi-&f zHQZ`#@lBGi(0Zpajiwm)`1+wE3`N6FbYB#`nuTn~I2|0q&$%|1DJ;*3^_@VHR0bwU zVW*wWP~%Zk=cYxMIaQ=b$6E!~qUBYH<6N`6(K9>u7SjFTZaQPVP>#ygrrq%;p|y`g zl3QH|Ca-&Ad&i?08UbBON)T4Nln@b{lvd=&~1KGIV$`h{TnW%I924eQd)jnU9 z{yKc)jTr%<~x}=9!R30%HTtl#F{q-tYonMW-7tHZgSia&- z-DHdS2(6A+wSYDUfXbPrjqZz9WBxY$Gj8*Y3}w7P%Eb&9$$2f&#>-j!uW%oRB%|c; zoE_9m)3$}Yp(=kqy3u$PmJ9-oe!l@S6yFl5y_HJq&3L)S*u>GpccF_#(30S zuOEZgNZLwd4@#btepqljIm3oCy;s+|R(V<5PSZ)0&PV-cuZv?RG=JRuFtZbENHiy( ztHq*8>GIoA<(sLOVS#>!Ps)xmUj#6~?LO_ZdXZzTewx&0a3~C-rq0y-D7U!4ufI;9 z@ZmxU4l(ZAYq4ivgs?>>hWhUu1o0^_OZ6Aq~A~9dS62ugJu{?6>aP6V1I36y~xda$Uj#ZIvrV3 zwDW#Cg1_eJLdR;?&!n~aFl{As3TA?|I4Sz&ztVFMSF;qZ&RHp%=S}-{OLBLg?rjFA zYt$}orLDG!PD!~BE-$;8uULf;&$+1w-C4E@VdJf1`SQZ<^G`J+UYrNAx?|qqG-$oh zKz)1RcoJMI5!1@s*XawxQ(K7X>d)ua?5%DHP`Y%5RRUePJr4u6ZvUi?!QmYxo@pB*Vt5o z4Z$O@{;x0*t;Z+7pkWk8-+tt+-~q}fo`kcOuM$7PoOsu7*-L|>vUz)NC}%;n(GsIkj5QQ=H#I;=Se>t&fzb2 zot`4MYCJh|;Kv(C6Yn~+UZ7kjYWducLuq}YvheFvZ3Qd&>;G&$Pn-~Ja;^(Ld$-nV zXGb|{4Xvsumg%p?FuL5~p8ZAa*9LbpQq_ONIW#z4eilfEyAmx__wrK*@n&AnMmK!l z$uaWdu%T#hBG8UFV$M_N>zn(P?jD)Oc$4Dble9-r zdIh4Q+M3clS@p$f?tVoPi_$Di4*rPR5gnZm_g)0}wb3dyr`F#Vaj$!^<;sK29S2b| z8DNsEf4?Q`6X(O^H46s*I3+CdipOo{tFUMmXN~oOf2&8tu}JE|Z|}0Un+;PDf;
    @GVI=78mTm?pJw;^-E|@&`a*Z@W2#uA( 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
    B*EQRjTbEL+idRQV9=N%hbD#_oNTh1~ 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 +discussions-to: TODO +status: Draft +type: Standards +layer: Core +created: 2023-05-12 +requires: TIP-20, TIP-21, TIP-22 and TIP-38 +replaces: TIP-19 +--- + +## Summary + +This document describes a `dust protection` concept, called `storage deposit` which was originally introduced in TIP-19. This cocnept creates a monetary incentive to keep the ledger state small. This is achieved by enforcing a minimum IOTA coin deposit in every output based on the actually used disc space of the output itself. + +This document minimally extends on TIP-19 by allowing for additional weights to be defined in other TIPs and no longer includes the deposit calculation for each individual output. Instead, each TIP defining outputs has to include the deposit calculation. + +## Motivation + +In a distributed ledger network, every participant, a so-called node, needs to keep track of the current ledger state. Since `chrysalis-pt2`, the IOTA ledger state is based on the UTXO model, where every node keeps track of all the currently unspent outputs. + +Misusage by honest users or intentionally bad behavior by malicious actors can lead to growing database and snapshot sizes and increasing computational costs (database lookups, balance calculations). Due to these increasing hardware requirements, the entry barrier to participate in the network becomes unaffordable and less nodes would operate the network. + +Especially in a fee-less system like IOTA, this is a serious issue, since an attacker can create a lot of damage with low effort. Other DLTs do not yet face this problem, as such an attack would be much more expensive due to the high transaction fees. +However, in order to solve scalability issues more and more transactions need to be handled. Therefore, other DLT projects will also eventually run into the same dust limitations. This document proposes to introduce `storage deposit` to address this. + +## Requirements + +- The maximum possible ledger database size must be limited to a reasonable and manageable size. +- The `dust protection` must not depend on a global shared state of the ledger, so that transaction validation can happen in parallel. +- The `dust protection` should work for outputs with arbitrary data and size. +- The ledger database size should be fairly allocated to users based on the scarce resource, IOTA coins. + +## Detailed Design + +A transaction validation rule is introduced which is exactly the same as the one defined in TIP-19, but stated here again for self-containment. + +Blocks including payloads, even transaction payloads, are considered to be pruned by the nodes, but unspent transaction outputs must be kept until they are spent. Therefore the `dust protection` is based on the unspent outputs only. + +**Every output created by a transaction needs to have at least a minimum amount of IOTA coins deposited in the output itself, otherwise the output is syntactically invalid.** + +min_deposit_of_output = ⌊v_byte_cost · v_byte⌋ +v_byte = ∑(weight𝑖 · byte_size𝑖) + offset + +where: +- v_byte_cost: costs in IOTA coins per virtual byte +- weight𝑖: factor of field 𝑖 that takes computational and storage costs into account +- byte_size𝑖: size of field 𝑖 in bytes +- offset: additional v_bytes that are caused by additional data that has to be stored in the database but is not part of the output itself + +| :warning: `min_deposit_of_output` is rounded down | +| ------------------------------------------------- | + +TIP-18 and its replacement TIPs introduce new output types that contain mandatory and optional fields with variable length. Each of these fields result in different computational and storage costs, which will be considered by the positive `weight_i`. The size of the field itself is expressed with `byte_size_i`. `offset` is used to take the overhead of the specific output itself into account. + +The `v_byte_cost` is a protocol value, which has to be defined based on reasonable calculations and estimates. + +**In simple words, the more data you write to the global ledger database, the more IOTA you need to deposit in the output.** +This is not a fee, because the deposited coins can be reclaimed by consuming the output in a new transaction. + +### How does it affect other parts of the protocol? + +The `dust protection` only affects "value-transactions". Since blocks containing other payloads are not stored in the ledger state and are subject to pruning, they cannot cause permanent "dust" and do not need to be considered for `dust protection`. +However, all output types like e.g. smart contract requests are affected and must comply with the `min_deposit_of_output` criteria. Therefore, these requests could get quite expensive for the user, but the same mechanism introduced for [Microtransactions on Layer 1](#Microtransactions-on-Layer-1) can be utilized for smart contract requests as well. + +### Byte cost calculations + +To limit the maximum database size, the total IOTA supply needs to be divided by the target database size in bytes to get the worst case scenario regarding the byte costs. + +However, in this scenario no outputs hold more IOTA coins than required for the `dust protection`. This does not represent the real distribution of funds over the UTXOs. We could assume that these output amounts follow Zipf's law. Unfortunately, fitting a Zipf distribution to the current ledger state will not match the future distribution of the funds for several reasons: + +- There is already another `dust protection` in place, which distorts the distribution. +- With new use cases enabled by the new `dust protection` (e.g. tokenization, storing arbitrary data in the ledger), the distribution will dramatically change. +- Fittings for other DLT projects do not match because there are transaction fees in place, which decrease the amount of dust outputs in the distribution. + +Another possibility would be to estimate how much percentage of the database will be used for outputs with minimum required deposit (`fund sparsitiy percentage`) in the future. The remaining IOTA coins can be ignored in that case to simplify the calculation. Since a fund sparsity percentage of less than 20% would already be bad for other upcoming protocol features like the mana calculation, we could take this value for our calculation instead of the worst case. + +### Weights for different outputs + +Output types contain several mandatory and optional fields. Every field itself creates individual computational and storage requirements for the node, which is considered by having different weights for every field. + +##### Field types + +The following table describes different field types in an output: + + + + + + + + + + + + + + + + + + + + +
    NameDescriptionWeightReasoning
    keyCreates a key lookup in the database.10.0Keys need to be stored in the LSM tree of the key-value database engine and need to be merged and leveled, which is computational-, memory- and read/write IO-wise a heavy task.
    dataPlain binary data on disk.1.0Data is stored as the value in the key-value database, and therefore only consumes disc space.
    + +TIPs that define new output types may define additional weights based on the storage and computational requirements that the affected fields induce for the node. However, the weights defined here should take precedence whenever possible and inform the newly defined weights. + +| :warning: Protocol parameters are not set yet | +| ---------------------------------------------- | + +Protocol parameters presented in this document are design parameters that will change in the future based on simulation results, benchmarking and security assumptions. The reader should not take these values as definitive. + +An example of such parameter for example is the `weight` assigned to different output field types. + +### Microtransactions + +#### Microtransactions on Layer 1 + +To enable microtransactions on Layer 1 and still satisfy the `min_deposit_of_output` requirement, a new mechanism called `conditional sending` is introduced with [TIP-38](../TIP-0038/tip-0038.md). + +![Microtransactions on Layer 1](assets/microtransactions_pt3_layer1.png) + +The preceding picture shows the process of the `conditional sending` mechanism. Alice uses the `Basic Output` ([TIP-41](../TIP-0041/tip-0041.md)) to send a microtransaction of 1 IOTA to Bob's `Address`. To fulfill the `min_deposit_of_output` requirement, the `Amount` is increased by `min_deposit_of_output` IOTA, which is 1 MIOTA in the above example. To prevent Bob from accessing these additional funds called the `storage deposit`, Alice adds the optional `Storage Deposit Return Unlock Condition` to the `Basic Output`. Now Bob can only consume the newly created output, if the unlocking transaction deposits the specified `Return Amount` IOTA coins, in this case 1 MIOTA, to the `Return Address` value defined by Alice. By consuming another UTXO and adding its amount to the received 1 IOTA, Bob takes care to create a valid output according to the dust protection rules. + +To prevent Bob from blocking access to the `storage deposit` forever, Alice specifies the additional `Expiration Unlock Condition` in the `Basic Output`. If Bob does not consume the output before the time window defined by Alice expires, Alice regains total control over the output. + +This means that there is no risk for Alice to lose the `storage deposit`, because either Bob needs to return the specified `Return Amount`, or the ownership of the created output switches back to Alice after the specified time-window has expired. + +This mechanism can also be used to transfer native tokens or on-chain requests to ISCP chains without losing control over the required `storage deposit`. + +#### Microtransactions on Layer 2 + +Another solution is to outsource microtransactions to Layer 2 applications like smart contracts. In Layer 2 there are no restrictions regarding the minimum balance of an output. + +![Microtransactions on Layer 2](assets/microtransactions_pt3_layer2.png) + +In this example, Alice sends funds to a smart contract chain on Layer 1 with an output that covers at least `min_deposit_of_output`. From this point on, Alice can send any number of off-chain requests to the smart contract chain, causing the smart contract to send microtransactions from Alice' on-chain account to Bob's on-chain account. Bob can now request his on-chain account balances to be withdrawn to his Layer 1 address. The last step can also be combined with the formerly introduced `conditional sending` mechanism, in case Bob wants to withdraw less than `min_deposit_of_output` IOTA coins or native assets. + +## Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). From 54d3faa1563cd1a0e12da1544ec86309f353a8ff Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 16 May 2023 09:32:29 +0200 Subject: [PATCH 02/92] Replace TIP-19, add TIP-47 in Readme --- README.md | 1 + tips/TIP-0019/tip-0019.md | 1 + tips/TIP-0047/tip-0047.md | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b1da09f1d..fd4f081c3 100644 --- a/README.md +++ b/README.md @@ -69,6 +69,7 @@ more improvements. Browse the [list of TIPs](#list-of-tips) below with the _Star | 34 | [Wotsicide (Stardust update)](tips/TIP-0034/tip-0034.md) | Define migration from legacy W-OTS addresses to post-Chrysalis networks. Replaces TIP-17. | Standards | Core | Proposed | **Stardust** | | 35 | [Local Snapshot File Format (Stardust Update)](tips/TIP-0035/tip-0035.md) | File format to export/import ledger state. Replaces TIP-9. | Standards | Interface | Proposed | **Stardust** | | 37 | [Dynamic Proof-of-Work](https://github.com/iotaledger/tips/pull/81) | Dynamically adapt the PoW difficulty | Standards | Core | Draft | **Stardust** | +| 47 | [Storage Deposit Dust Protection (IOTA 2.0)](tips/TIP-0047/tip-0047.md) | Prevent bloating the ledger size with dust outputs | Standards | Core | Draft | **IOTA 2.0** | ## Need help? diff --git a/tips/TIP-0019/tip-0019.md b/tips/TIP-0019/tip-0019.md index a63145875..91dfb1058 100644 --- a/tips/TIP-0019/tip-0019.md +++ b/tips/TIP-0019/tip-0019.md @@ -10,6 +10,7 @@ layer: Core created: 2021-11-04 requires: TIP-18, TIP-20, TIP-21 and TIP-22 replaces: TIP-15 +superseded-by: TIP-47 --- ## Summary diff --git a/tips/TIP-0047/tip-0047.md b/tips/TIP-0047/tip-0047.md index 70410a6f6..db76ef3f2 100644 --- a/tips/TIP-0047/tip-0047.md +++ b/tips/TIP-0047/tip-0047.md @@ -1,6 +1,6 @@ --- tip: 47 -title: Dust Protection Based on Byte Costs (Storage Deposit) +title: Storage Deposit Dust Protection (IOTA 2.0) description: Prevent bloating the ledger size with dust outputs author: Max Hase (@muXxer) discussions-to: TODO From ad88d08346da9c42c1edb63b87c50a37ffb3907a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daria=20Dziuba=C5=82towska?= Date: Wed, 12 Jul 2023 10:31:01 +0200 Subject: [PATCH 03/92] Move API files from iota core --- tips/TIPS-API/asyncapi3.yaml | 1255 +++++++++++ tips/TIPS-API/openapi3-core.yaml | 3049 +++++++++++++++++++++++++++ tips/TIPS-API/openapi3-indexer.yaml | 897 ++++++++ 3 files changed, 5201 insertions(+) create mode 100644 tips/TIPS-API/asyncapi3.yaml create mode 100644 tips/TIPS-API/openapi3-core.yaml create mode 100644 tips/TIPS-API/openapi3-indexer.yaml diff --git a/tips/TIPS-API/asyncapi3.yaml b/tips/TIPS-API/asyncapi3.yaml new file mode 100644 index 000000000..72c18821f --- /dev/null +++ b/tips/TIPS-API/asyncapi3.yaml @@ -0,0 +1,1255 @@ +asyncapi: 2.4.0 +info: + title: Node Event API + contact: + email: contact@iota.org + version: 3.0.0 + description: >- + The node event API is in charge of publishing information about events + within the node software. +externalDocs: + description: Find out more about IOTA + url: 'https://iota.org' +tags: + - name: commitments + description: Everything about commitments. + - name: blocks + description: Everything about blocks. + - name: outputs + description: Everything about outputs. + - name: transactions + description: Everything about transactions. +channels: + commitment-info/latest: + subscribe: + operationId: commitmentInfoLatest + tags: + - name: commitments + description: Publishes the latest known commitment slot index and its identifier. + message: + $ref: '#/components/messages/CommitmentInfoResponse' + commitment-info/finalized: + subscribe: + tags: + - name: commitments + operationId: commitmentInfoFinalized + description: Publishes the newly finalized commitment slot index and its identifier. + message: + $ref: '#/components/messages/CommitmentInfoResponse' + commitments: + subscribe: + tags: + - name: commitments + operationId: commitments + description: Publishes newly created commitment. + message: + $ref: '#/components/messages/CommitmentPayloadSerialized' + blocks: + subscribe: + tags: + - name: blocks + operationId: blocks + description: Publishes newly received blocks in their serialized binary form. + message: + $ref: '#/components/messages/Block' + blocks/transaction: + subscribe: + tags: + - name: blocks + - name: transactions + operationId: blocksTransaction + description: >- + Publishes newly received blocks containing a transaction payload in + their serialized binary form. + message: + $ref: '#/components/messages/Block' + blocks/transaction/tagged-data: + subscribe: + tags: + - name: blocks + - name: transactions + operationId: blocksTransactionsWithTaggedData + description: >- + Publishes newly received blocks containing a Tagged Data payload inside + transactions. + message: + $ref: '#/components/messages/Block' + 'blocks/transaction/tagged-data/{tag}': + parameters: + tag: + description: >- + Hex encoded tag of the Tagged Data Payload inside the Transaction + Payload. + schema: + type: string + examples: + - '0xe45' + subscribe: + tags: + - name: blocks + - name: transactions + operationId: blocksTransactionsWithTag + description: >- + Publishes newly received blocks containing a Tagged Data payload inside + transactions with a specific tag. + message: + $ref: '#/components/messages/Block' + blocks/tagged-data: + subscribe: + tags: + - name: blocks + operationId: blocksWithTaggedData + description: >- + Publishes newly received blocks which contain tagged data payloads + (encoded in hex) in their serialized binary form. + message: + $ref: '#/components/messages/Block' + 'blocks/tagged-data/{tag}': + parameters: + tag: + description: Hex encoded tag of the Tagged Data Payload. + schema: + type: string + examples: + - '0xe45' + subscribe: + tags: + - name: blocks + operationId: blocksWithSpecificTag + description: >- + Publishes newly received blocks which contain tagged data payloads with + the specified tag parameter (encoded in hex) in their serialized binary + form. Untagged data blocks do not get published. + message: + $ref: '#/components/messages/Block' + 'block-metadata/{blockId}': + parameters: + blockId: + description: Hex encoded identifier of the block. + schema: + type: string + examples: + - '0xcf5f77d62285b9ed8d617729e9232ae346a328c1897f0939837198e93ec13e85' + subscribe: + tags: + - name: blocks + operationId: blockSpecificMetadata + description: Publishes metadata of a particular block whenever its metadata changes. + message: + $ref: '#/components/messages/BlockMetadata' + block-metadata/confirmed: + subscribe: + tags: + - name: blocks + operationId: blockMetadataConfirmed + description: Publishes metadata of a block whenever it gets confirmed. + message: + $ref: '#/components/messages/BlockMetadata' + block-metadata/finalized: + subscribe: + tags: + - name: blocks + operationId: blockMetadataFinalized + description: Publishes metadata of a block whenever it gets finalized. + message: + $ref: '#/components/messages/BlockMetadata' + 'transactions/{transactionId}/included-block': + parameters: + transactionId: + description: Hex encoded identifier of the transaction. + schema: + type: string + examples: + - '0xd026f8b1c856d4e844cc734bbe095429fb880ec4d93f3ccffe3b292a7de17be7' + subscribe: + tags: + - name: transactions + - name: blocks + operationId: transactionIncludedBlock + description: >- + Publishes the earliest confirmed block which carried the transaction with the + specified transaction ID. + message: + $ref: '#/components/messages/Block' + 'outputs/{outputId}': + parameters: + outputId: + description: Hex encoded identifier of the output. + schema: + type: string + examples: + - '0xd026f8b1c856d4e844cc734bbe095429fb880ec4d93f3ccffe3b292a7de17be70000' + subscribe: + tags: + - name: outputs + operationId: output + description: >- + Publishes the given wanted output on subscriptions. + message: + $ref: '#/components/messages/OutputPayload' + + 'output-metadata/{outputId}': + parameters: + outputId: + description: Hex encoded identifier of the output. + schema: + type: string + examples: + - '0xd026f8b1c856d4e844cc734bbe095429fb880ec4d93f3ccffe3b292a7de17be70000' + subscribe: + tags: + - name: outputs + operationId: outputMetadata + description: >- + Publishes the given wanted output metadata on subscription and when its state + changes (created, spent). + message: + $ref: '#/components/messages/OutputMetadataPayload' + + 'outputs/account/{accountId}': + parameters: + accountId: + description: The unique identifier of the account chain. Hex encoded with 0x prefix. + schema: + type: string + examples: + - '0x1505ec099896ab05d9e08fbc7101ae4dff0093b3943b28f789ed2ca728bcc8d6' + subscribe: + tags: + - name: outputs + operationId: accountOutputByAccountId + description: Publishes the newly created account output of an account chain. + message: + $ref: '#/components/messages/OutputPayload' + 'outputs/nft/{nftId}': + parameters: + nftId: + description: The unique identifier of the nft chain. Hex encoded with 0x prefix. + schema: + type: string + examples: + - '0x19c82b32761fd8729a1a6c77f7c17597e4b9b01759794e52381f6a0050b0c11f' + subscribe: + tags: + - name: outputs + operationId: nftOutputByNftId + description: Publishes the newly created nft output of an nft chain. + message: + $ref: '#/components/messages/OutputPayload' + 'outputs/foundry/{foundryId}': + parameters: + foundryId: + description: >- + The unique identifier of the foundry chain. Hex encoded with 0x + prefix. + schema: + type: string + examples: + - '0x081505ec099896ab05d9e08fbc7101ae4dff0093b3943b28f789ed2ca728bcc8d60100000000' + subscribe: + tags: + - name: outputs + operationId: foundryOutputByFoundryId + description: Publishes the newly created foundry output of a foundry chain. + message: + $ref: '#/components/messages/OutputPayload' + 'outputs/unlock/{condition}/{address}': + parameters: + condition: + description: Type of unlock condition of the output to look for. + schema: + type: string + enum: + - address + - storage-return + - expiration + - state-controller + - governor + - immutable-account + - + + address: + description: Bech32 encoded address. + schema: + type: string + examples: + - 'iota1qrwfnskm4f7utdrxqnkfntfqxehtpj8s0kf68zkcwm0yrhuemzjp5sjfw5v' + subscribe: + tags: + - name: outputs + operationId: outputByUnlockAndAddress + description: >- + Publishes newly created outputs that have a specific address in a + specific unlock condition. + message: + $ref: '#/components/messages/OutputPayload' + 'outputs/unlock/{condition}/{address}/spent': + parameters: + condition: + description: Type of unlock condition of the output to look for. + schema: + type: string + enum: + - address + - storage-return + - expiration + - state-controller + - governor + - immutable-account + - + + address: + description: Bech32 encoded address. + schema: + type: string + examples: + - 'iota1qrwfnskm4f7utdrxqnkfntfqxehtpj8s0kf68zkcwm0yrhuemzjp5sjfw5v' + subscribe: + tags: + - name: outputs + operationId: outputByUnlockAndAddressSpent + description: >- + Publishes newly spent outputs that have a specific address in a specific + unlock condition. + message: + $ref: '#/components/messages/OutputPayload' +components: + messages: + CommitmentPayload: + contentType: application/json + payload: + type: object + required: + - index + - rootsId + - prevId + properties: + index: + type: integer + description: The slot index of the commitment. + example: 200 + prevId: + type: string + description: The commitment identifier of the previous slot. + example: "0x8fb6cbb1ecf02c6b5a6a5a6a5f6c5a6a5f6c5a6a5a6a5a6a5f6c5a6a5a6a5f6c50000000000000000" + rootsId: + type: string + description: The digest of multiple merkle roots within this slot. + example: "0xa4dd36465af63d495d35a05f592d42a51511c153e1bae8fad00453c8cbb48727" + cumulativeWeight: + type: integer + description: + The sum of previous slot commitment cumulative weight and + weight of issuers of accepted blocks within this slot. + It is just an indication of "committed into" this slot, + and can not strictly be used for evaluating the switching of a chain. + example: 78901 + + CommitmentPayloadSerialized: + contentType: application/vnd.iota.serializer-v1 + description: The commitment in its serialized form. + payload: + type: string + format: binary + example: >- + 070000000a1a0000977c626276b19ef8b3c445709f2f0f2ccc4abb98d97617f421f240c0d1ee066d4306e67a0321889ef8ec89b7eff1378049e058f0fa87a78c2452ae72631a5a99d913d1cbb3525b8faa1800e28dfcb28154bcba10154c39ef87ceda793cb44f58ae1549c88ea13fe4a9695bb6f0aba6cb756522209e5066a96039ae12b398b975693bdc21e222997c86ff9bfc5844f0372d58ff6fa510688e53c181bbdf4db41f9b627540a70e5751c026e543b2e8ab2eb06099daa1d1e5df47778f7787faab45cdf12fe3a80000000300d85e5b1590d898d1e0cdebb2e3b5337c8b76270142663d78811683ba47c17c989ad7a8f0ff2c6438bf435786d4a5b0125a5caf7367061b49a739389d5ebea234c0466c86f88a3f8add03bff04c2e34b214683f2f6983641e1d1185da7e2c3e0200d9922819a39e94ddf3907f4b9c8df93f39f026244fcb609205b9a879022599f218be2536d8b7b8547faa3dbdfe98339ebe9e2b2417a8a03eee02b2a8312b9e026dd0a33261a58a240cd0a1b06cdf1775d98d316f162d3eec402f4bf08bea2a0700f9d9656a60049083eef61487632187b351294c1fa23d118060d813db6d03e8b6ca8180d435708e826bc2042ccd667babb59c5cc461ff29dba966359fcd6fc511cdfdf10d6576f36ac2a6e5cb691e13968c13947ffbd9239939d3802b2fbe0f06 + CommitmentInfoResponse: + contentType: application/json + payload: + type: object + required: + - commitmentSlotIndex + properties: + commitmentSlotIndex: + type: number + description: The slot index of the commitment. + example: 242412 + commitmentId: + type: string + description: Hex encoded identifier of the slot commitment. + example: '0x7a09324557e9200f39bf493fc8fd6ac43e9ca750c6f6d884cc72386ddcb7d695' + Block: + contentType: application/vnd.iota.serializer-v1 + description: The block in its serialized binary form. + payload: + type: string + format: binary + example: >- + 0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eb000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000020000016920b176f613ec7be59e68fc68f597eb3393af80f74c7c3db78198147d5f1f92640000000000000000018afe1f314622cc1ef52f16d619d1baccff81816b7e4e35fe268dc247b730acd65d5d2dd3f7df09000000000001000001f7868ab6bb55800b77b8b74191ad8285a9bf428ace579d541fda47661803ff44e0af5c34ad4edf475a01fb46e089a7afcab158b4a0133f32e889083e1c77eef65548933e0c6d2c3b0ac006cd77e77d778bf37b8d38d219fb62a9a2f718d4c9095100000000000000 + Receipt: + contentType: application/vnd.iota.serializer-v1 + description: The migration receipts in its serialized binary form. + payload: + type: string + format: binary + example: >- + 010000000000000000000000000000000000000000000000000000000000000000000000000000000 + OutputPayload: + contentType: application/json + payload: + type: object + properties: + output: + anyOf: + - $ref: '#/components/schemas/BasicOutput' + - $ref: '#/components/schemas/AccountOutput' + - $ref: '#/components/schemas/FoundryOutput' + - $ref: '#/components/schemas/NFTOutput' + - $ref: '#/components/schemas/DelegationOutput' + + OutputMetadataPayload: + contentType: application/json + payload: + type: object + properties: + metadata: + oneOf: + - $ref: '#/components/schemas/OutputMetadata' + + BlockMetadata: + contentType: application/json + payload: + type: object + required: + - blockId + - strongParents + properties: + blockId: + type: string + description: The ID of the block. + example: '0xcf5f77d62285b9ed8d617729e9232ae346a328c1897f0939837198e93ec13e85' + strongParents: + type: array + description: The identifiers of the blocks this block references. Hex-encoded data with 0x prefix. + items: + type: string + example: + - >- + 0xd026f8b1c856d4e844cc734bbe095429fb880ec4d93f3ccffe3b292a7de17be7 + weakParents: + type: array + description: The identifiers of the blocks this block references. Hex-encoded data with 0x prefix. + items: + type: string + example: + - >- + 0xcf5f77d62285b9ed8d617729e9232ae346a328c1897f0939837198e93ec13e85 + shallowLikeParents: + type: array + description: The identifiers of the blocks this block references. Hex-encoded data with 0x prefix. + items: + type: string + example: + - >- + 0xd026f8b1c856d4e844cc734bbe095429fb880ec4d93f3ccffe3b292a7de17be7 + blockState: + type: string + description: If `pending`, the block is stored but not confirmed. If `confirmed`, the block is confirmed with the first level of knowledge. If `finalized`, the block is included and cannot be reverted anymore. + enum: + - pending + - confirmed + - finalized + txState: + type: string + description: The inclusion state of the transaction. + enum: + - pending + - confirmed + - finalized + example: conflicting + blockStateReason: + type: integer + enum: [1,2,3] + description: | + Values: + * `1` - denotes that the block is invalid. + * `2` - denotes that the block is orphaned due to congestion control. + * `3` - denotes that the block is orphaned due to negative mana balance. + * Note: more reasons will be added. + txStateReason: + type: integer + enum: + - 1 + - 2 + - 3 + - 4 + - 5 + - 6 + - 7 + - 8 + - 9 + - 10 + - 11 + - 12 + - 255 + description: | + Values: + * `1` - denotes that the referenced UTXO was already spent. + * `2` - denotes that the transaction is conflicting with another transaction. Conflicting specifically means a double spend situation that both transaction pass all validation rules, eventually losing one(s) should have this reason. + * `3` - denotes that the referenced UTXO cannot be found. + * `4` - denotes that the sum of the inputs and output values does not match. + * `5` - denotes that the unlock block signature is invalid. + * `6` - denotes that the configured timelock is not yet expired. + * `7` - denotes that the given native tokens are invalid. + * `8` - denotes that the return amount in a transaction is not fulfilled by the output side. + * `9` - denotes that the input unlock is invalid. + * `10` - denotes that the inputs commitment is invalid. + * `11` - denotes that an output contains a Sender with an ident (address) which is not unlocked. + * `12` - denotes that the chain state transition is invalid. + * `255` - denotes that the semantic validation failed. + example: 1 + reissuePayload: + type: boolean + description: >- + Whether the block should be issued again. + example: false + schemas: + NativeToken: + description: A native token and its balance in the output. + properties: + tokenId: + type: string + description: >- + Hex-encoded identifier of the native token that equals the foundryId + of the controlling foundry. + example: >- + 0x08de3fa7acc30ec899bb797b1d80680690b54a1cdb78b2f7f50b1ad073e74c8cbd0100000000 + amount: + type: string + description: Amount of native tokens (up to uint256). Hex encoded number. + example: '0xc8' + required: + - tokenId + - amount + Ed25519Address: + description: The Ed25519 address. + properties: + type: + type: integer + description: Set to value 0 to denote an Ed25519 Address. + example: 0 + pubKeyHash: + type: string + description: The hex-encoded BLAKE2b-256 hash of the Ed25519 public key. + example: '0x713c3e879b53398431f67312254101ffdd23067febc77f4949de57ee279c8bee' + required: + - type + - pubKeyHash + AccountAddress: + description: Address of an account. + properties: + type: + type: integer + description: Set to value 8 to denote an Account Address. + example: 1 + accountId: + type: string + description: >- + The hex-encoded BLAKE2b-256 hash of the outputId that created the + account. + example: '0x1505ec099896ab05d9e08fbc7101ae4dff0093b3943b28f789ed2ca728bcc8d6' + required: + - type + - accountId + NFTAddress: + description: Address of an NFT account. + properties: + type: + type: integer + description: Set to value 16 to denote an NFT Address. + example: 1 + nftId: + type: string + description: >- + The hex-encoded BLAKE2b-256 hash of the outputId that created the + NFT. + example: '0x19c82b32761fd8729a1a6c77f7c17597e4b9b01759794e52381f6a0050b0c11f' + required: + - type + - nftId + AccountUnlockCondition: + description: Can be unlocked by unlocking the address. + properties: + type: + type: integer + description: Set to value 0 to denote an Address Unlock Condition. + example: 0 + address: + oneOf: + - $ref: '#/components/schemas/Ed25519Address' + - $ref: '#/components/schemas/AccountAddress' + - $ref: '#/components/schemas/NFTAddress' + required: + - type + - address + ImmutableAccountAddressUnlockCondition: + description: >- + Can be unlocked by unlocking the permanent account address. The unlock + condition has to be kept in future state transitions of the UTXO state + machine. + properties: + type: + type: integer + description: >- + Set to value 6 to denote an Immutable Account Address Unlock + Condition. + example: 6 + address: + oneOf: + - $ref: '#/components/schemas/AccountAddress' + required: + - type + - address + StorageDepositReturnUnlockCondition: + description: >- + Can be unlocked by depositing return amount to return address via an + output that only has Address Unlock Condition. + properties: + type: + type: integer + description: Set to value 1 to denote a Storage Deposit Return Unlock Condition. + example: 1 + returnAddress: + oneOf: + - $ref: '#/components/schemas/Ed25519Address' + - $ref: '#/components/schemas/AccountAddress' + - $ref: '#/components/schemas/NFTAddress' + amount: + type: integer + description: >- + Amount of IOTA tokens the consuming transaction should deposit to + the address defined in Return Address. + example: 50 + required: + - type + - returnAddress + - amount + + AddressUnlockCondition: + description: Can be unlocked by unlocking the address. + properties: + type: + type: integer + description: Set to value 0 to denote an Address Unlock Condition. + example: 0 + address: + oneOf: + - $ref: '#/components/schemas/Ed25519Address' + - $ref: '#/components/schemas/AccountAddress' + - $ref: '#/components/schemas/NFTAddress' + required: + - type + - address + + TimelockUnlockCondition: + description: Can be unlocked if the confirming commitment has a >= Unix Timestamp. + properties: + type: + type: integer + description: Set to value 2 to denote a Timelock Unlock Condition. + example: 2 + slotIndex: + type: integer + description: >- + The slot index until which the timelock applies (inclusive) + example: 16 + exclusiveMinimum: 0 + required: + - type + - slotIndex + + ExpirationUnlockCondition: + description: >- + Defines a unix time until which only Address, defined in Address Unlock + Condition, is allowed to unlock the output. After the unix time, only + Return Address can unlock it. + properties: + type: + type: integer + description: Set to value 3 to denote an Expiration Unlock Condition. + example: 3 + returnAddress: + oneOf: + - $ref: '#/components/schemas/Ed25519Address' + - $ref: '#/components/schemas/AccountAddress' + - $ref: '#/components/schemas/NFTAddress' + slotIndex: + type: integer + description: >- + The slot index at which the expiration happens. + example: 16 + exclusiveMinimum: 0 + required: + - type + - returnAddress + - slotIndex + + StateControllerAddressUnlockCondition: + description: Can be unlocked by unlocking the address. + properties: + type: + type: integer + description: Set to value 4 to denote a Sate Controller Address Unlock Condition. + example: 4 + address: + oneOf: + - $ref: '#/components/schemas/Ed25519Address' + - $ref: '#/components/schemas/AccountAddress' + - $ref: '#/components/schemas/NFTAddress' + required: + - type + - address + + GovernorAddressUnlockCondition: + description: Can be unlocked by unlocking the address. + properties: + type: + type: integer + description: Set to value 5 to denote a Governor Address Unlock Condition. + example: 5 + address: + oneOf: + - $ref: '#/components/schemas/Ed25519Address' + - $ref: '#/components/schemas/AccountAddress' + - $ref: '#/components/schemas/NFTAddress' + required: + - type + - address + SenderFeature: + description: Identifies the validated sender of the output. + properties: + type: + type: integer + description: Set to value 0 to denote a Sender Feature. + example: 0 + address: + oneOf: + - $ref: '#/components/schemas/Ed25519Address' + - $ref: '#/components/schemas/AccountAddress' + - $ref: '#/components/schemas/NFTAddress' + required: + - type + - address + + IssuerFeature: + description: Identifies the validated issuer of the UTXO state machine (account/NFT). + properties: + type: + type: integer + description: Set to value 1 to denote an Issuer Feature. + example: 1 + address: + oneOf: + - $ref: '#/components/schemas/Ed25519Address' + - $ref: '#/components/schemas/AccountAddress' + - $ref: '#/components/schemas/NFTAddress' + required: + - type + - address + + BlockIssuerFeature: + description: >- + A feature which indicates that this account can issue blocks. + properties: + type: + type: integer + description: Set to value 4 to denote a Block Issuer Feature. + example: 4 + blockIssuerKeys: + type: array + description: The keys allowed to issue blocks from an account with a BlockIssuerFeature. + items: + type: string + description: Ed25519 public key in Hex. + expirySlot: + type: integer + description: Indicates when the BlockIssuerKeys are expired. + required: + - type + - blockIssuerKeys + - expirySlot + + StakingFeature: + description: A feature which indicates that this account can issue blocks. + properties: + type: + type: integer + description: Set to value 5 to denote a Staking Feature. + example: 5 + stakedAmount: + type: integer + description: The amount of IOTA coins that are locked and staked in the containing account. + fixedCost: + type: integer + description: Indicates when the BlockIssuerKeys are expired. + startEpoch: + type: integer + description: The epoch index at which the staking starts. + endEpoch: + type: integer + description: The epoch index at which the staking ends. + required: + - type + - stakedAmount + - fixedCost + - startEpoch + - endEpoch + + MetadataFeature: + description: >- + Defines metadata (arbitrary binary data) that will be stored in the + output. + properties: + type: + type: integer + description: Set to value 2 to denote a Metadata Feature. + example: 2 + data: + type: string + description: Hex-encoded binary data. + example: '0xfa0de75d225cca2799395e5fc340702fc7eac8' + required: + - type + - data + TagFeature: + description: >- + Defines an indexation tag to which the output can be indexed by + additional node plugins. + properties: + type: + type: integer + description: Set to value 3 to denote a Tag Feature. + example: 3 + tag: + type: string + description: Hex-encoded binary indexation tag. + example: '0xfa0de75' + required: + - type + - tag + SimpleTokenScheme: + description: >- + Defines the simple supply control scheme of native tokens. Tokens can be + minted by the foundry without additional restrictions as long as maximum + supply is requested and circulating supply is not negative. + properties: + type: + type: integer + description: Set to value 0 to denote an Simple Token Scheme. + example: 0 + mintedTokens: + type: string + description: Minted tokens controlled by this foundry. Hex encoded number. + example: '0x2710' + meltedTokens: + type: string + description: Melted tokens controlled by this foundry. Hex encoded number. + example: '0x1388' + maxSupply: + type: string + description: >- + Maximum supply of tokens controlled by this foundry. Hex encoded + number. + example: '0x186a0' + required: + - type + - mintedTokens + - meltedTokens + - maxSupply + BasicOutput: + description: Describes a basic output with optional features. + properties: + type: + type: integer + description: Set to value 3 to denote a Basic Output. + example: 3 + amount: + type: string + description: >- + The amount of IOTA tokens to deposit with this BasicOutput output. + Encoded as plain string. + example: '100' + nativeTokens: + type: array + description: Native tokens held by the otuput. + items: + anyOf: + - $ref: '#/components/schemas/NativeToken' + unlockConditions: + type: array + description: >- + Unlock condtions that define how the output can be unlocked in a + transaction. + items: + anyOf: + - $ref: '#/components/schemas/AddressUnlockCondition' + - $ref: '#/components/schemas/StorageDepositReturnUnlockCondition' + - $ref: '#/components/schemas/TimelockUnlockCondition' + - $ref: '#/components/schemas/ExpirationUnlockCondition' + features: + type: array + description: >- + Features that add utility to the output but do not impose unlocking + conditions. + items: + anyOf: + - $ref: '#/components/schemas/SenderFeature' + - $ref: '#/components/schemas/MetadataFeature' + - $ref: '#/components/schemas/TagFeature' + mana: + type: integer + description: The stored mana held by the output. + example: 3000 + required: + - type + - amount + - mana + + AccountOutput: + description: >- + Describes an account in the ledger that can be controlled by the + state and governance controllers. + properties: + type: + type: integer + description: Set to value 4 to denote an Account Output. + example: 4 + amount: + type: string + description: >- + The amount of IOTA tokens to deposit with this output. Encoded as + plain string. + example: '100' + nativeTokens: + type: array + description: Native tokens held by the otuput. + items: + anyOf: + - $ref: '#/components/schemas/NativeToken' + accountId: + type: string + description: >- + Unique identifier of the account, which is the BLAKE2b-256 hash of the + Output ID that created it. Account Address = Account Address Type || + Account ID + example: '0x1505ec099896ab05d9e08fbc7101ae4dff0093b3943b28f789ed2ca728bcc8d6' + stateIndex: + type: integer + description: >- + A counter that must increase by 1 every time the account is state + transitioned. + example: 1337 + stateMetadata: + type: string + description: >- + Hex-encoded metadata that can only be changed by the state + controller. + example: '0x7665727920696d706f7274616e74207374617465206d65746164617461' + foundryCounter: + type: integer + description: >- + A counter that denotes the number of foundries created by this account. + example: 3 + unlockConditions: + type: array + description: >- + Unlock condtions that define how the output can be unlocked in a + transaction. + items: + anyOf: + - $ref: '#/components/schemas/StateControllerAddressUnlockCondition' + - $ref: '#/components/schemas/GovernorAddressUnlockCondition' + features: + type: array + description: >- + Features that add utility to the output but do not impose unlocking + conditions. + items: + anyOf: + - $ref: '#/components/schemas/SenderFeature' + - $ref: '#/components/schemas/MetadataFeature' + - $ref: '#/components/schemas/BlockIssuerFeature' + - $ref: '#/components/schemas/StakingFeature' + immutableFeatures: + type: array + description: >- + Immutable features that add utility to the output but do not impose + unlocking conditions. These blocks need to be kept in future + transitions of the UTXO state machine. + items: + anyOf: + - $ref: '#/components/schemas/IssuerFeature' + - $ref: '#/components/schemas/MetadataFeature' + mana: + type: integer + description: The stored mana held by the output. + example: 3000 + required: + - type + - amount + - accountId + - stateIndex + - foundryCounter + - mana + + DelegationOutput: + description: >- + Describes an delegation output in the ledger that can be controlled by the + state and governance controllers. + properties: + type: + type: integer + description: Set to value 7 to denote a Delegation Output. + example: 7 + amount: + type: string + description: >- + The amount of IOTA tokens held by the output. Encoded as + plain string. + example: '100' + delegatedAmount: + type: integer + description: The amount of IOTA tokens that were delegated when the output was created. + delegationId: + type: string + description: >- + The identifier for this delegation output. + example: '0x1505ec099896ab05d9e08fbc7101ae4dff0093b3943b28f789ed2ca728bcc8d6' + validatorId: + type: string + description: >- + The Account ID of the validator to which this output is delegating. + example: '0x1505ec099896ab05d9e08fbc7101ae4dff0093b3943b28f789ed2ca728bcc8d6' + startEpoch: + type: integer + description: >- + The index of the first epoch for which this output delegates. + example: 10 + endEpoch: + type: integer + description: >- + The index of the last epoch for which this output delegates. + example: 12 + unlockConditions: + type: array + description: >- + Unlock condtions that define how the output can be unlocked in a + transaction. + items: + anyOf: + - $ref: '#/components/schemas/AddressUnlockCondition' + immutableFeatures: + type: array + description: >- + Immutable features that add utility to the output but do not impose + unlocking conditions. These blocks need to be kept in future + transitions of the UTXO state machine. + items: + anyOf: + - $ref: '#/components/schemas/IssuerFeature' + mana: + type: integer + description: The stored mana held by the output. + example: 3000 + required: + - type + - amount + - delegatedAmount + - delegationId + - validatorId + - startEpoch + - endEpoch + + FoundryOutput: + description: Describes a foundry output that is controlled by an account. + properties: + type: + type: integer + description: Set to value 5 to denote a Foundry Output. + example: 5 + amount: + type: string + description: >- + The amount of IOTA tokens to deposit with this output. Encoded as + plain string. + example: '100' + nativeTokens: + type: array + description: Native tokens held by the otuput. + items: + anyOf: + - $ref: '#/components/schemas/NativeToken' + serialNumber: + type: integer + description: >- + The serial number of the foundry with respect to the controlling + account. + example: 2 + tokenScheme: + type: array + description: >- + Defines the supply control scheme of the tokens controlled by the + foundry. + items: + oneOf: + - $ref: '#/components/schemas/SimpleTokenScheme' + unlockConditions: + type: array + description: >- + Unlock condtions that define how the output can be unlocked in a + transaction. + items: + anyOf: + - $ref: '#/components/schemas/ImmutableAccountAddressUnlockCondition' + features: + type: array + description: >- + Features that add utility to the output but do not impose unlocking + conditions. + items: + anyOf: + - $ref: '#/components/schemas/MetadataFeature' + immutableFeatures: + type: array + description: >- + Immutable features that add utility to the output but do not impose + unlocking conditions. These blocks need to be kept in future + transitions of the UTXO state machine. + items: + anyOf: + - $ref: '#/components/schemas/MetadataFeature' + mana: + type: integer + description: The stored mana held by the output. + example: 3000 + required: + - type + - amount + - serialNumber + - tokenScheme + - mana + NFTOutput: + description: 'Describes an NFT output, a globally unique token with metadata attached.' + properties: + type: + type: integer + description: Set to value 6 to denote a NFT Output. + amount: + type: string + description: >- + The amount of IOTA tokens to deposit with this output. Encoded as + plain string. + example: '100' + nativeTokens: + type: array + description: Native tokens held by the otuput. + items: + anyOf: + - $ref: '#/components/schemas/NativeToken' + nftId: + type: string + description: >- + Unique identifier of the NFT, which is the BLAKE2b-256 hash of the + Output ID that created it. NFT Address = NFT Address Type || NFT ID + example: '0x19c82b32761fd8729a1a6c77f7c17597e4b9b01759794e52381f6a0050b0c11f' + unlockConditions: + type: array + description: >- + Unlock condtions that define how the output can be unlocked in a + transaction. + items: + anyOf: + - $ref: '#/components/schemas/AddressUnlockCondition' + - $ref: '#/components/schemas/StorageDepositReturnUnlockCondition' + - $ref: '#/components/schemas/TimelockUnlockCondition' + - $ref: '#/components/schemas/ExpirationUnlockCondition' + features: + type: array + description: >- + Features that add utility to the output but do not impose unlocking + conditions. + items: + anyOf: + - $ref: '#/components/schemas/SenderFeature' + - $ref: '#/components/schemas/MetadataFeature' + - $ref: '#/components/schemas/TagFeature' + immutableFeatures: + type: array + description: >- + Immutable features that add utility to the output but do not impose + unlocking conditions. + + These blocks need to be kept in future transitions of the UTXO state + machine. + items: + anyOf: + - $ref: '#/components/schemas/IssuerFeature' + - $ref: '#/components/schemas/MetadataFeature' + mana: + type: integer + description: The stored mana held by the output + example: 3000 + required: + - type + - amount + - nftId + - mana + + Ed25519Signature: + description: Ed25519Signature defines an Ed25519 signature. + properties: + type: + type: number + description: Defines the type for an Ed255199Signature (0). + example: 0 + publicKey: + type: string + description: The public key used to verify the given signature. + example: '0x5368c0c1ee386222966ceca9a0029be32527959b9fd2a8a6d61388bcee6d66c1' + signature: + type: string + description: The signature. + example: '0x8e78a5e701e530365594aefb43a3219b6aa8bea214425847c654797a46ce1967528d2e6714f469ca308ee96a08319a4135fdc84923c04f784de414a840e4020e' + required: + - type + - publicKey + - signature + OutputMetadata: + description: Metadata of an output. + properties: + blockId: + type: string + description: The ID of the block. + example: '0xcf5f77d62285b9ed8d617729e9232ae346a328c1897f0939837198e93ec13e85' + transactionId: + type: string + description: The ID of the transaction which created this output. + example: '0xd026f8b1c856d4e844cc734bbe095429fb880ec4d93f3ccffe3b292a7de17be7' + outputIndex: + type: number + description: The index of the output within its transaction. + example: 0 + isSpent: + type: boolean + description: Whether the output is spent or not. + example: true + commitmentIdSpent: + type: string + description: The commitment ID of the slot at which this output was spent. + example: '0xe526f8b1c856d4e844cc734bbe095429fb880ec4d93f3ccffe3b292a7de17be7' + transactionIdSpent: + type: string + description: The transaction this output was spent with. + example: '0xe526f8b1c856d4e844cc734bbe095429fb880ec4d93f3ccffe3b292a7de17be7' + includedCommitmentId: + type: string + description: The commitment ID at which the output was included into the ledger. + example: '0xe526f8b1c856d4e844cc734bbe095429fb880ec4d93f3ccffe3b292a7de17be7' + latestCommitmentId: + type: string + description: The current latest commitment id for which the request was made. + example: '0x7c62d9b9ed3c1f3ef942a7ea17ec1270d77c109f0ba57b6c2d2b9e9fb3e69a3a' + required: + - blockId + - transactionId + - outputIndex + - isSpent + - includedCommitmentId diff --git a/tips/TIPS-API/openapi3-core.yaml b/tips/TIPS-API/openapi3-core.yaml new file mode 100644 index 000000000..45804fe33 --- /dev/null +++ b/tips/TIPS-API/openapi3-core.yaml @@ -0,0 +1,3049 @@ +openapi: 3.0.3 +info: + title: IOTA CORE REST API + description: This document specifies the REST API for IOTA CORE node software. + contact: + email: contact@iota.org + license: + name: Apache 2.0 + url: 'http://www.apache.org/licenses/LICENSE-2.0.html' + version: 3.0.0 +externalDocs: + description: Find out more about IOTA + url: 'https://iota.org' +servers: + - url: 'http://127.0.0.1:14265' +tags: + - name: node + description: Everything about the node itself. + - name: accounts + description: Everything about the accounts. + - name: rewards + description: Everything about Mana rewards. + - name: staking + description: Everything about staking. + - name: committee + description: Everything about the committee. + - name: blocks + description: Everything about blocks. + - name: UTXO + description: Everything about UTXOs. + - name: commitments + description: Everything about commitments. + +paths: + /health: + get: + tags: + - node + summary: Returns the health of the node. + description: >- + Returns the health of the node. A node considers itself healthy if it is bootstrapped and its Accepted Tangle Time (ATT) is not + further behind its local clock than BootstrapWindow. + responses: + '200': + description: "Successful operation: indicates that the node is healthy." + '403': + description: "Unsuccessful operation: indicates that the endpoint is not available for public use." + '500': + description: "Unsuccessful operation: indicates that an unexpected, internal server error happened which prevented the node from fulfilling the request." + '503': + description: "Unsuccessful operation: indicates that the node isn´t healthy." + + /api/routes: + get: + tags: + - node + summary: Returns the available API route groups of the node. + description: >- + Returns the available API route groups of the node. + responses: + '200': + description: "Successful operation" + content: + application/json: + schema: + $ref: '#/components/schemas/RoutesResponse' + examples: + default: + $ref: '#/components/examples/get-routes-response-example' + '403': + description: "Unsuccessful operation: indicates that the endpoint is not available for public use." + '500': + description: "Unsuccessful operation: indicates that an unexpected, internal server error happened which prevented the node from fulfilling the request." + '503': + description: "Unsuccessful operation: indicates that the node isn´t healthy." + + /api/core/v3/info: + get: + tags: + - node + summary: Returns general information about the node. + description: Returns general information about the node. + responses: + '200': + description: "Successful operation." + content: + application/json: + schema: + $ref: '#/components/schemas/InfoResponse' + examples: + default: + $ref: '#/components/examples/get-info-response-example' + '403': + description: "Unsuccessful operation: indicates that the endpoint is not available for public use." + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenResponse' + '500': + description: "Unsuccessful operation: indicates that an unexpected, internal server error happened which prevented the node from fulfilling the request." + content: + application/json: + schema: + $ref: '#/components/schemas/InternalErrorResponse' + + '/api/core/v3/accounts/{accountId}/congestion': + get: + tags: + - accounts + summary: Check if the account is ready to issue a block. + description: >- + Check the readiness of the node to issue a new block, the reference mana cost based on the rate setter and current network congestion, and the block issuance credits of the requested account. + parameters: + - in: path + name: accountId + schema: + type: string + example: "0xf532a53545103276b46876c473846d98648ee418468bce76df4868648dd73e5d" + required: true + description: Identifier of the account. + - in: query + name: slotIndex + schema: + type: integer + example: 1622568540 + required: false + description: Check the issuance readiness for a specific slot index. If this is not provided, current slot index will be used. + responses: + '200': + description: "Successful operation." + content: + application/json: + schema: + $ref: '#/components/schemas/CongestionResponse' + examples: + CongestionResponse: + $ref: '#/components/examples/get-congestion-estimate-response-example' + '400': + description: "Unsuccessful operation: indicates that the provided data is invalid." + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + '403': + description: "Unsuccessful operation: indicates that the endpoint is not available for public use." + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenResponse' + '500': + description: "Unsuccessful operation: indicates that an unexpected, internal server error happened which prevented the node from fulfilling the request." + content: + application/json: + schema: + $ref: '#/components/schemas/InternalErrorResponse' + '503': + description: "Unsuccessful operation: indicates that the node is not synced." + content: + application/json: + schema: + $ref: '#/components/schemas/ServiceUnavailableResponse' + + '/api/core/v3/rewards/{outputId}': + get: + tags: + - rewards + summary: Returns the totally available Mana rewards of an account or delegation output. + description: >- + Returns the totally available Mana rewards of an account or delegation output up until the current epoch index. Note that rewards for an epoch only become available at the beginning of the next epoch. If the end epoch of a staking feature is equal or greater than the current epoch, the rewards response will not include the potential future rewards for those epochs. + parameters: + - in: path + name: outputId + schema: + type: string + example: "0xf532a53545103276b46876c473846d98648ee418468bce76df4868648dd73e5d" + required: true + description: Identifier of the account or delegation output. + responses: + '200': + description: "Successful operation." + content: + application/json: + schema: + $ref: '#/components/schemas/ManaRewardsResponse' + examples: + CongestionResponse: + $ref: '#/components/examples/get-account-rewards-example' + '400': + description: "Unsuccessful operation: indicates that the provided data is invalid." + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + '403': + description: "Unsuccessful operation: indicates that the endpoint is not available for public use." + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenResponse' + '500': + description: "Unsuccessful operation: indicates that an unexpected, internal server error happened which prevented the node from fulfilling the request." + content: + application/json: + schema: + $ref: '#/components/schemas/InternalErrorResponse' + '503': + description: "Unsuccessful operation: indicates that the node is not synced." + content: + application/json: + schema: + $ref: '#/components/schemas/ServiceUnavailableResponse' + + /api/core/v3/committee: + get: + tags: + - committee + summary: Return the information of committee members. + # TODO: Revisit when committee selection is implemented, maybe also includes the selected committee of next epoch, if it's selected + description: Return the information of committee members at the given epoch index. If epoch index is not provided, the current committee members are returned. + parameters: + - in: query + name: epochIndex + schema: + type: integer + example: 20 + required: false + description: The epoch index to query. + responses: + '200': + description: "Successful operation." + content: + application/json: + schema: + $ref: '#/components/schemas/CommitteeResponse' + examples: + CongestionResponse: + $ref: '#/components/examples/get-committee-example' + '400': + description: "Unsuccessful operation: indicates that the provided data is invalid." + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + '403': + description: "Unsuccessful operation: indicates that the endpoint is not available for public use." + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenResponse' + '500': + description: "Unsuccessful operation: indicates that an unexpected, internal server error happened which prevented the node from fulfilling the request." + content: + application/json: + schema: + $ref: '#/components/schemas/InternalErrorResponse' + '503': + description: "Unsuccessful operation: indicates that the node is not synced." + content: + application/json: + schema: + $ref: '#/components/schemas/ServiceUnavailableResponse' + + /api/core/v3/staking: + get: + tags: + - staking + summary: Returns information of the active stakers. + responses: + '200': + description: "Successful operation." + content: + application/json: + schema: + $ref: '#/components/schemas/AccountStakingListResponse' + examples: + CongestionResponse: + $ref: '#/components/examples/get-staker-list-example' + '400': + description: "Unsuccessful operation: indicates that the provided data is invalid." + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + '403': + description: "Unsuccessful operation: indicates that the endpoint is not available for public use." + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenResponse' + '500': + description: "Unsuccessful operation: indicates that an unexpected, internal server error happened which prevented the node from fulfilling the request." + content: + application/json: + schema: + $ref: '#/components/schemas/InternalErrorResponse' + '503': + description: "Unsuccessful operation: indicates that the node is not synced." + content: + application/json: + schema: + $ref: '#/components/schemas/ServiceUnavailableResponse' + + /api/core/v3/staking/{accountId}: + get: + tags: + - staking + summary: Return the information of requested staker. + parameters: + - in: path + name: accountId + schema: + type: string + example: "0xf532a53545103276b46876c473846d98648ee418468bce76df4868648dd73e5d" + required: true + description: Identifier of the account. + responses: + '200': + description: "Successful operation." + content: + application/json: + schema: + $ref: '#/components/schemas/AccountStakingResponse' + examples: + CongestionResponse: + $ref: '#/components/examples/get-staker-example' + '400': + description: "Unsuccessful operation: indicates that the provided data is invalid." + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + '403': + description: "Unsuccessful operation: indicates that the endpoint is not available for public use." + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenResponse' + '500': + description: "Unsuccessful operation: indicates that an unexpected, internal server error happened which prevented the node from fulfilling the request." + content: + application/json: + schema: + $ref: '#/components/schemas/InternalErrorResponse' + '503': + description: "Unsuccessful operation: indicates that the node is not synced." + content: + application/json: + schema: + $ref: '#/components/schemas/ServiceUnavailableResponse' + + /api/core/v3/blocks/issuance: + get: + tags: + - blocks + summary: Returns information that are ideal for attaching a block. + description: >- + Returns information that are ideal for attaching a block. + responses: + '200': + description: "Successful operation." + content: + application/json: + schema: + $ref: '#/components/schemas/IssuanceBlockHeaderResponse' + examples: + default: + $ref: '#/components/examples/get-buildingBlock-response-example' + '403': + description: "Unsuccessful operation: indicates that the endpoint is not available for public use." + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenResponse' + '500': + description: "Unsuccessful operation: indicates that an unexpected, internal server error happened which prevented the node from fulfilling the request." + content: + application/json: + schema: + $ref: '#/components/schemas/InternalErrorResponse' + '503': + description: "Unsuccessful operation: indicates that there are no tips available or the node isn´t synced." + content: + application/json: + schema: + $ref: '#/components/schemas/ServiceUnavailableResponse' + + /api/core/v3/blocks: + post: + tags: + - blocks + summary: Submit a block. + description: >- + Submit a block or a payload. This endpoint will return the identifier of the built block. `protocolVersion` is always required! + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/SubmitBlockRequest' + examples: + Minimal block with Tagged Data Payload: + $ref: "#/components/examples/post-tagged-data-block-request-example-minimal" + Full block with Tagged Data Payload: + $ref: >- + #/components/examples/post-tagged-data-block-request-example-full + Minimal Block with Transaction Payload: + $ref: >- + #/components/examples/post-transaction-block-request-example-minimal + Full block with Transaction Payload: + $ref: >- + #/components/examples/post-transaction-block-request-example-full + application/vnd.iota.serializer-v1: + schema: + type: string + format: binary + description: block in raw binary format + required: true + responses: + '201': + description: "Successful operation." + content: + application/json: + schema: + $ref: '#/components/schemas/SubmitBlockResponse' + examples: + default: + $ref: '#/components/examples/post-blocks-response-example' + headers: + Location: + description: The blockId of the newly created block. + schema: + type: string + '400': + description: "Unsuccessful operation: indicates that the provided data is invalid." + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + '403': + description: "Unsuccessful operation: indicates that the endpoint is not available for public use." + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenResponse' + '500': + description: "Unsuccessful operation: indicates that an unexpected, internal server error happened which prevented the node from fulfilling the request." + content: + application/json: + schema: + $ref: '#/components/schemas/InternalErrorResponse' + '503': + description: "Unsuccessful operation: indicates that the node can´t auto-fill the parents or perform Proof-of-Work." + content: + application/json: + schema: + $ref: '#/components/schemas/ServiceUnavailableResponse' + /api/core/v3/blocks/{blockId}: + get: + tags: + - blocks + summary: Returns block data as JSON by its identifier. + description: >- + Find a block by its identifier. This endpoint returns the given block + as JSON. + parameters: + - in: path + name: blockId + schema: + type: string + example: "0xf532a53545103276b46876c473846d98648ee418468bce76df4868648dd73e5d" + required: true + description: Identifier of the block. + responses: + '200': + description: "Successful operation." + content: + application/json: + schema: + $ref: '#/components/schemas/BlockResponse' + examples: + Empty Payload: + $ref: >- + #/components/examples/get-block-by-id-empty-response-example + Transaction Payload: + $ref: >- + #/components/examples/get-block-by-id-transaction-response-example + Tagged Data Payload: + $ref: >- + #/components/examples/get-block-by-id-tagged-data-response-example + application/vnd.iota.serializer-v1: + schema: + type: string + format: binary + description: block in raw binary format + example: >- + 0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eb000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000020000016920b176f613ec7be59e68fc68f597eb3393af80f74c7c3db78198147d5f1f92640000000000000000018afe1f314622cc1ef52f16d619d1baccff81816b7e4e35fe268dc247b730acd65d5d2dd3f7df09000000000001000001f7868ab6bb55800b77b8b74191ad8285a9bf428ace579d541fda47661803ff44e0af5c34ad4edf475a01fb46e089a7afcab158b4a0133f32e889083e1c77eef65548933e0c6d2c3b0ac006cd77e77d778bf37b8d38d219fb62a9a2f718d4c9095100000000000000 + '400': + description: "Unsuccessful operation: indicates that the provided data is invalid." + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + '403': + description: "Unsuccessful operation: indicates that the endpoint is not available for public use." + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenResponse' + '404': + description: "Unsuccessful operation: indicates that the requested data was not found." + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + '500': + description: "Unsuccessful operation: indicates that an unexpected, internal server error happened which prevented the node from fulfilling the request." + content: + application/json: + schema: + $ref: '#/components/schemas/InternalErrorResponse' + '/api/core/v3/blocks/{blockId}/metadata': + get: + tags: + - blocks + summary: Find the metadata of a given block. + description: >- + Find the metadata of a given block. + parameters: + - in: path + name: blockId + schema: + type: string + example: "0xf532a53545103276b46876c473846d98648ee418468bce76df4868648dd73e5d" + required: true + description: Identifier of the block. + responses: + '200': + description: "Successful operation." + content: + application/json: + schema: + $ref: '#/components/schemas/BlockMetadataResponse' + examples: + New Block with Transaction Payload: + $ref: '#/components/examples/get-block-by-id-response-example-new-transaction' + New Block without Transaction Payload: + $ref: '#/components/examples/get-block-by-id-response-example-new' + Confirmed with Transaction Payload: + $ref: >- + #/components/examples/get-block-by-id-response-example-confirmed-transaction + Confirmed without Transaction Payload: + $ref: >- + #/components/examples/get-block-by-id-response-example-confirmed + Conflicting with Transaction Payload: + $ref: >- + #/components/examples/get-block-by-id-response-example-conflicting-transaction + '400': + description: "Unsuccessful operation: indicates that the provided data is invalid." + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + '403': + description: "Unsuccessful operation: indicates that the endpoint is not available for public use." + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenResponse' + '404': + description: "Unsuccessful operation: indicates that the requested data was not found." + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + '500': + description: "Unsuccessful operation: indicates that an unexpected, internal server error happened which prevented the node from fulfilling the request." + content: + application/json: + schema: + $ref: '#/components/schemas/InternalErrorResponse' + '503': + description: "Unsuccessful operation: indicates that the node is not synced." + content: + application/json: + schema: + $ref: '#/components/schemas/ServiceUnavailableResponse' + + '/api/core/v3/outputs/{outputId}': + get: + tags: + - UTXO + summary: Find an output by its identifier. + description: Find an output by its identifier. + parameters: + - in: path + name: outputId + schema: + type: string + required: true + description: >- + Identifier of the output encoded in hex. An output is identified by + the concatenation of `transactionId+outputIndex` where `outputIndex` needs to be converted to little endian first. + Hex-encoded with 0x prefix. + example: "0xfa0de75d225cca2799395e5fc340702fc7eac821d2bdd79911126f131ae097a20100" + responses: + '200': + description: "Successful operation." + content: + application/json: + schema: + $ref: '#/components/schemas/OutputResponse' + examples: + default: + $ref: '#/components/examples/get-outputs-by-id-response-example' + application/vnd.iota.serializer-v1: + schema: + type: string + format: binary + description: output in raw binary format + example: >- + 0440420f00000000000004056b0c542e18ac5f44a1c13c5922564b7accba030000000000010000000204007ffec9e1233204d9c6dce6812b1539ee96af691ca2e4d9065daa85907d33e5d305007ffec9e1233204d9c6dce6812b1539ee96af691ca2e4d9065daa85907d33e5d30200007ffec9e1233204d9c6dce6812b1539ee96af691ca2e4d9065daa85907d33e5d30203000102030101007ffec9e1233204d9c6dce6812b1539ee96af691ca2e4d9065daa85907d33e5d3 + '400': + description: "Unsuccessful operation: indicates that the provided data is invalid." + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + '403': + description: "Unsuccessful operation: indicates that the endpoint is not available for public use." + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenResponse' + '404': + description: "Unsuccessful operation: indicates that the requested data was not found." + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + '500': + description: "Unsuccessful operation: indicates that an unexpected, internal server error happened which prevented the node from fulfilling the request." + content: + application/json: + schema: + $ref: '#/components/schemas/InternalErrorResponse' + '/api/core/v3/outputs/{outputId}/metadata': + get: + tags: + - UTXO + summary: Returns metadata about an output by its identifier. + description: Returns metadata about an output by its identifier. + parameters: + - in: path + name: outputId + schema: + type: string + required: true + description: >- + Identifier of the output encoded in hex. An output is identified by + the concatenation of `transactionId+outputIndex` where `outputIndex` (u16) needs to be converted to little endian first. + Hex-encoded with 0x prefix. + example: "0xfa0de75d225cca2799395e5fc340702fc7eac821d2bdd79911126f131ae097a20100" + responses: + '200': + description: "Successful operation." + content: + application/json: + schema: + $ref: '#/components/schemas/OutputMetadataResponse' + examples: + unspent: + $ref: '#/components/examples/get-output-metadata-by-id-response-unspent-example' + spent: + $ref: '#/components/examples/get-output-metadata-by-id-response-spent-example' + '400': + description: "Unsuccessful operation: indicates that the provided data is invalid." + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + '403': + description: "Unsuccessful operation: indicates that the endpoint is not available for public use." + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenResponse' + '404': + description: "Unsuccessful operation: indicates that the requested data was not found." + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + '500': + description: "Unsuccessful operation: indicates that an unexpected, internal server error happened which prevented the node from fulfilling the request." + content: + application/json: + schema: + $ref: '#/components/schemas/InternalErrorResponse' + + '/api/core/v3/transactions/{transactionId}/included-block': + get: + tags: + - UTXO + summary: Returns the earliest block containing the tranaction that get confirmed. + description: Returns the earliest block containing the transaction that get confirmed. + parameters: + - in: path + name: transactionId + schema: + type: string + example: "0xaf7579fb57746219561072c2cc0e4d0fbb8d493d075bd21bf25ae81a450c11ef" + required: true + description: Identifier of the transaction to look up. + responses: + '200': + description: "Successful operation." + content: + application/json: + schema: + $ref: '#/components/schemas/BlockResponse' + examples: + default: + $ref: '#/components/examples/get-block-by-id-transaction-response-example' + application/vnd.iota.serializer-v1: + schema: + type: string + format: binary + description: block in raw binary format + example: >- + 0204174e3151f6ce2cfb7f00829ac4a96a35caa2078cc20eba99359867cd21aad0d65807bb4ad068e6cdadd103218e4e24ed55b62c985d4f64e97808d9f09180f89c7a09324557e9200f39bf493fc8fd6ac43e9ca750c6f6d884cc72386ddcb7d695de9e9d780ba7ebeebc38da16cb53b2a8991d38eee94bcdc3f3ef99aa8c345652530100000600000001c9b000b41dc00400010000af7579fb57746219561072c2cc0e4d0fbb8d493d075bd21bf25ae81a450c11ef00000e6c2998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a79010003a08601000000000000010000a18996d96163405e3c0eb13fa3459a07f68a89e8cf7cc239c89e7192344daa5b0069000000050000000b68656c6c6f20776f726c64550000005370616d6d696e6720646174612e0a436f756e743a203037323935320a54696d657374616d703a20323032312d30322d31315431303a32333a34392b30313a30300a54697073656c656374696f6e3a203934c2b57301000000ee26ac07834c603c22130fced361ca58552b0dbfc63e4b73ba24b3b59d9f40500492a353f96883c472e2686a640e77eda30be8fcc417aa9fc1c15eae854661e0253287be6ea68f649f19ca590de0a6c57fb88635ef0e013310e0be2b8360950350390000000000f0 + '400': + description: "Unsuccessful operation: indicates that the provided data is invalid." + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + '403': + description: "Unsuccessful operation: indicates that the endpoint is not available for public use." + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenResponse' + '404': + description: "Unsuccessful operation: indicates that the requested data was not found." + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + '500': + description: "Unsuccessful operation: indicates that an unexpected, internal server error happened which prevented the node from fulfilling the request." + content: + application/json: + schema: + $ref: '#/components/schemas/InternalErrorResponse' + '/api/core/v3/transactions/{transactionId}/included-block/metadata': + get: + tags: + - UTXO + summary: Find the metadata of the earliest block containing the transaction that get confirmed. + description: >- + Find the metadata of the earliest block containing the tx that get confirmed. + parameters: + - in: path + name: transactionId + schema: + type: string + example: "0xaf7579fb57746219561072c2cc0e4d0fbb8d493d075bd21bf25ae81a450c11ef" + required: true + description: Identifier of the transaction to look up. + responses: + '200': + description: "Successful operation." + content: + application/json: + schema: + $ref: '#/components/schemas/BlockMetadataResponse' + examples: + default: + $ref: '#/components/examples/get-block-by-id-response-example-confirmed-transaction' + '400': + description: "Unsuccessful operation: indicates that the provided data is invalid." + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + '403': + description: "Unsuccessful operation: indicates that the endpoint is not available for public use." + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenResponse' + '404': + description: "Unsuccessful operation: indicates that the requested data was not found." + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + '500': + description: "Unsuccessful operation: indicates that an unexpected, internal server error happened which prevented the node from fulfilling the request." + content: + application/json: + schema: + $ref: '#/components/schemas/InternalErrorResponse' + '503': + description: "Unsuccessful operation: indicates that the node is not synced." + content: + application/json: + schema: + $ref: '#/components/schemas/ServiceUnavailableResponse' + + '/api/core/v3/commitments/{commitmentId}': + get: + tags: + - commitments + summary: Look up a commitment by a given commitment ID. + description: Look up a commitment by a given commitment ID. + parameters: + - in: path + name: commitmentId + schema: + type: string + example: "0x7a09324557e9200f39bf493fc8fd6ac43e9ca750c6f6d884cc72386ddcb7d695" + required: true + description: Commitment ID of the commitment to look up. + responses: + '200': + description: "Successful operation." + content: + application/json: + schema: + $ref: '#/components/schemas/Commitment' + examples: + default: + $ref: >- + #/components/examples/get-commitment-response-example + application/vnd.iota.serializer-v1: + schema: + type: string + format: binary + description: Commitment in raw binary format + examples: + default: + $ref: >- + #/components/examples/get-commitment-response-binary-example + '400': + description: "Unsuccessful operation: indicates that the provided data is invalid." + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + '403': + description: "Unsuccessful operation: indicates that the endpoint is not available for public use." + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenResponse' + '404': + description: "Unsuccessful operation: indicates that the requested data was not found." + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + '500': + description: "Unsuccessful operation: indicates that an unexpected, internal server error happened which prevented the node from fulfilling the request." + content: + application/json: + schema: + $ref: '#/components/schemas/InternalErrorResponse' + '/api/core/v3/commitments/{commitmentId}/utxo-changes': + get: + tags: + - commitments + summary: Get all UTXO changes of a given slot by commitment ID. + description: Get all UTXO changes of a given slot by Commitment ID. + parameters: + - in: path + name: commitmentId + schema: + type: string + example: "0x7a09324557e9200f39bf493fc8fd6ac43e9ca750c6f6d884cc72386ddcb7d695" + required: true + description: Commitment ID of the commitment to look up. + responses: + '200': + description: "Successful operation." + content: + application/json: + schema: + $ref: '#/components/schemas/UTXOChangesResponse' + examples: + default: + $ref: >- + #/components/examples/get-utxo-changes-response-example + '400': + description: "Unsuccessful operation: indicates that the provided data is invalid." + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + '403': + description: "Unsuccessful operation: indicates that the endpoint is not available for public use." + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenResponse' + '404': + description: "Unsuccessful operation: indicates that the requested data was not found." + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + '500': + description: "Unsuccessful operation: indicates that an unexpected, internal server error happened which prevented the node from fulfilling the request." + content: + application/json: + schema: + $ref: '#/components/schemas/InternalErrorResponse' + '/api/core/v3/commitments/by-index/{index}': + get: + tags: + - commitments + summary: Look up a commitment by a given commitment index. + description: Look up a commitment by a given commitment index. + parameters: + - in: path + name: index + schema: + type: number + example: 154862 + required: true + description: Index of the commitment to look up. + responses: + '200': + description: "Successful operation." + content: + application/json: + schema: + $ref: '#/components/schemas/Commitment' + examples: + default: + $ref: >- + #/components/examples/get-commitment-response-example + application/vnd.iota.serializer-v1: + schema: + type: string + format: binary + description: Commitment in raw binary format + examples: + default: + $ref: >- + #/components/examples/get-commitment-response-binary-example + '400': + description: "Unsuccessful operation: indicates that the provided data is invalid." + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + '403': + description: "Unsuccessful operation: indicates that the endpoint is not available for public use." + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenResponse' + '404': + description: "Unsuccessful operation: indicates that the requested data was not found." + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + '500': + description: "Unsuccessful operation: indicates that an unexpected, internal server error happened which prevented the node from fulfilling the request." + content: + application/json: + schema: + $ref: '#/components/schemas/InternalErrorResponse' + '/api/core/v3/commitments/by-index/{index}/utxo-changes': + get: + tags: + - commitments + summary: Get all UTXO changes of a given slot by commitment index. + description: Get all UTXO changes of a given slot by commitment index. + parameters: + - in: path + name: index + schema: + type: number + example: 154862 + required: true + description: Index of the commitment to look up. + responses: + '200': + description: "Successful operation." + content: + application/json: + schema: + $ref: '#/components/schemas/UTXOChangesResponse' + examples: + default: + $ref: >- + #/components/examples/get-utxo-changes-response-example + '400': + description: "Unsuccessful operation: indicates that the provided data is invalid." + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + '403': + description: "Unsuccessful operation: indicates that the endpoint is not available for public use." + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenResponse' + '404': + description: "Unsuccessful operation: indicates that the requested data was not found." + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + '500': + description: "Unsuccessful operation: indicates that an unexpected, internal server error happened which prevented the node from fulfilling the request." + content: + application/json: + schema: + $ref: '#/components/schemas/InternalErrorResponse' + +components: + examples: + get-routes-response-example: + value: + routes: + - "core/v3" + - "dashboard-metrics/v2" + - "debug/v2" + get-info-response-example: + value: + name: Example Node + version: 1.0.0 + accountId: "0x11a37a8e65fe5dca25cbeb896000eca615eaf88b97ca8dc70d8b1839b53dbf1c" + status: + isHealthy: true + lastAcceptedBlockId: "0x8d6f3b6e3a63ce388d2eb8c927c5b9ba328b0e427ae727d8b3dddc429f6fb24a0000000000000000" + lastConfirmedBlockId: "0x59daaaba1cd10cd268966376e17710d100c90826fe258753d461acac99b7e3341500000000000000" + finalizedSlot: 100 + acceptedTangleTime: 1682328545 + relativeAcceptedTangleTime: 1682328550 + confirmedTangleTime: 1682328525 + relativeConfirmedTangleTime: 1682328535 + latestCommittedSlot: 107 + pruningSlot: 20 + metrics: + blocksPerSecond: 17 + confirmedBlocksPerSecond: 16.2 + confirmedRate: 98.82352941176471 + supportedProtocolVersions: + - 2 + - 3 + protocol: + networkName: iota-core-testnet + bech32Hrp: rms + tokenSupply: "2779530283277761" + version: 3 + minPowScore: 1000 + belowMaxDepth: 15 + rentStructure: + vByteCost: 500 + vByteFactorData: 1 + vByteFactorKey: 10 + genesisUnixTimestamp: 1582328545 + slotDurationInSeconds: 10 + baseToken: + baseToken: + name: "Shimmer" + tickerSymbol: "SMR" + unit: "SMR" + decimals: 6 + subunit: "glow" + useMetricPrefix: false + features: + - allowIncompleteBlock + + get-buildingBlock-response-example: + value: + strongParents: + - "0x4f746934d0075179a37ca3e807b7e793ec4ec9189ba31c9ad092d7497b01118c1000000000000000" + - "0x59daaaba1cd10cd268966376e17710d100c90826fe258753d461acac99b7e3341500000000000000" + weakParents: + - "0xebb058f1f1c8f1ac6508465deeee1dd090396f9e6e2b5c103eef5583f20a0c133a00000000000000" + - "0xb173e2d2b6f72600f00da84492ddb6eadee703dc39fb846725828059272093fb3b00000000000000" + shallowLikeParents: + - "0xdbf86c778d69f413296c2d4d3086d76c74bf4d719e6e95c03a3d9a955ed39bcf3e00000000000000" + - "0xf15b2ec698e396c9d2e69bc753246631aedebb657da09ba0e0c8d42518a1e8953e00000000000000" + latestFinalizedSlot: 1422 + commitment: + index: 1432 + prevId: "0xbf07dc16986166953f5a72c19d78642aab6cbde63964a2369ec3d425144eb42b3800000000000000" + rootsId: "0xa4dd36465af63d495d35a05f592d42a51511c153e1bae8fad00453c8cbb48727" + cumulativeWeight: 45678 + + post-blocks-response-example: + value: + blockId: "0xb173e2d2b6f72600f00da84492ddb6eadee703dc39fb846725828059272093fb3b00000000000000" + + get-block-by-id-response-example-new-transaction: + value: + blockId: "0x8e7c2d36c236f7d44f26cf8c70b3d99e18e7d7390b32c9637c08c086d9475e6a" + strongParents: + - "0x1e9d7f2e12552f84db6de00d57d25c7fa037fca5c31b5a354b9e6d2f6d84a6db" + - "0x6c91ee6f97a8a04ec92f9a6907baa32bca3c7cb15e83e0070ef0ba4f3f3a2e47" + blockState: "pending" + txState: "pending" + reissuePayload: false + + get-block-by-id-response-example-new: + value: + blockId: "0x8e7c2d36c236f7d44f26cf8c70b3d99e18e7d7390b32c9637c08c086d9475e6a" + strongParents: + - "0x1e9d7f2e12552f84db6de00d57d25c7fa037fca5c31b5a354b9e6d2f6d84a6db" + - "0x6c91ee6f97a8a04ec92f9a6907baa32bca3c7cb15e83e0070ef0ba4f3f3a2e47" + blockState: "pending" + reissuePayload: false + + get-block-by-id-response-example-confirmed-transaction: + value: + blockId: "0x8e7c2d36c236f7d44f26cf8c70b3d99e18e7d7390b32c9637c08c086d9475e6a" + strongParents: + - "0x1e9d7f2e12552f84db6de00d57d25c7fa037fca5c31b5a354b9e6d2f6d84a6db" + - "0x6c91ee6f97a8a04ec92f9a6907baa32bca3c7cb15e83e0070ef0ba4f3f3a2e47" + blockState: "confirmed" + txState: "confirmed" + + get-block-by-id-response-example-confirmed: + value: + blockId: "0x8e7c2d36c236f7d44f26cf8c70b3d99e18e7d7390b32c9637c08c086d9475e6a" + strongParents: + - "0x1e9d7f2e12552f84db6de00d57d25c7fa037fca5c31b5a354b9e6d2f6d84a6db" + - "0x6c91ee6f97a8a04ec92f9a6907baa32bca3c7cb15e83e0070ef0ba4f3f3a2e47" + blockState: "confirmed" + + get-block-by-id-response-example-conflicting-transaction: + value: + blockId: "0x8e7c2d36c236f7d44f26cf8c70b3d99e18e7d7390b32c9637c08c086d9475e6a" + strongParents: + - "0x1e9d7f2e12552f84db6de00d57d25c7fa037fca5c31b5a354b9e6d2f6d84a6db" + - "0x6c91ee6f97a8a04ec92f9a6907baa32bca3c7cb15e83e0070ef0ba4f3f3a2e47" + blockState: "pending" + txState: "pending" + blockStateReason: 1 + txStateReason: 5 + + post-tagged-data-block-request-example-minimal: + value: + protocolVersion: 3 + payload: + type: 5 + tag: "0x72616e646f6d207461673a206769746875622e636f6d" + data: "0x5468697320697320616e206578616d706c6520746578742077616c6c20776974682070726f746f636f6c20332e" + + post-transaction-block-request-example-minimal: + value: + protocolVersion: 3 + payload: + type: 6 + essence: + type: 1 + networkId: "1337133713371337" + creationTime: 1682328545 + inputsCommitment: "0x0e6c2998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a79" + inputs: + - type: 0 + transactionId: "0x0c78e998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a79" + transactionOutputIndex: 0 + - type: 0 + transactionId: "0x309b169bfa60c8cf80afd730741862d200405d5df7cabfe9b564361dce1f7036" + transactionOutputIndex: 0 + - type: 0 + transactionId: "0xc138ecdc882010245e9574fbc1f1f43cc7c182fa890e46e018365dd49de0f16e" + transactionOutputIndex: 0 + outputs: + - type: 3 + amount: "50000000" + unlockConditions: + - type: 0 + address: + type: 0 + pubKeyHash: "0xd49931814e6bfbb8e221f1b2936e206e5a6b6abeb9c070f8603814c525c9abe3" + unlocks: + - type: 0 + signature: + type: 0 + publicKey: "0x40d0c00fd629a5f528e4bcab4333926a90d06613a3f36a325defcdaf4c9e4092" + signature: "0xed4a63a3e1b22c85f9813b00a21c8576ed72c1f5bc939d01fcea7dcd678c2d0d8d80a2499965d8ce5574c9e92aa0d42b72b969bab3a2a35fe7dbc64659a0d703" + - type: 1 + reference: 0 + - type: 1 + reference: 0 + + post-tagged-data-block-request-example-full: + value: + protocolVersion: 3 + networkId: 10 + strongParents: + - "0x8d6f3b6e3a63ce388d2eb8c927c5b9ba328b0e427ae727d8b3dddc429f6fb24a0000000000000000" + - "0x408a53af982c49d1398ab5c5b5f5b390d4c4da7da48b61bb9ba7f97c1e8dd7f60000000000000000" + weakParents: + - "0xe8a904ce3ee081f20a68bb38b2d406cfd138775ba52ea555d93a4e4d4b0ad8440000000000000000" + - "0xbce912a0f383cd07660d3c08f3d3f3c7fb9de31e2cc1b93d4c29332ef693ba0c0000000000000000" + shallowLikeParents: + - "0x0276d29ec6b3cbbf3ed6d1f01af8e29b9c6a9ee9c9375e8e5b5b5c5b5b5d45580000000000000000" + - "0x70a5ce5d8fc3290a9885b1af5d8766d51db89a67a6a839f6d23a6cb8d6f3b6e30000000000000000" + accountId: "0x11a37a8e65fe5dca25cbeb896000eca615eaf88b97ca8dc70d8b1839b53dbf1c" + issuerPublicKey: "0xc6c83a78d06263ca937f21056a32d9b3099d04f0c92863d8b8dceabdd1421d2a" + issuingTime: 1649442459 + commitment: + index: 110 + prevId: "0x78bf1e6c30c6ed9192fa07e1466c09a10e9ea6c58d3b1b6c61a259f1a6f569ed0000000000000000" + rootsId: "0xa4dd36465af63d495d35a05f592d42a51511c153e1bae8fad00453c8cbb48727" + cumulativeWeight: 12345 + latestFinalizedSlot: 98 + payload: + type: 5 + tag: "0x72616e646f6d207461673a206769746875622e636f6d" + data: "0x5468697320697320616e206578616d706c6520746578742077616c6c20776974682070726f746f636f6c20332e" + nonce: "105368" + signature: "0xd2215b9307c272eb12ea42c18768b9e133ed5b674abc23c577f5096520e433c807930497ed3f90498a7c82bbc1a730f20201413b10a30cd8737403fdbb63bf874966ca205f25e790a8860fbc152a9775e430b9618cd6282d2a0d29969412de07" + + + post-transaction-block-request-example-full: + value: + protocolVersion: 3 + networkId: 10 + strongParents: + - "0x8d6f3b6e3a63ce388d2eb8c927c5b9ba328b0e427ae727d8b3dddc429f6fb24a0000000000000000" + - "0x408a53af982c49d1398ab5c5b5f5b390d4c4da7da48b61bb9ba7f97c1e8dd7f60000000000000000" + weakParents: + - "0xe8a904ce3ee081f20a68bb38b2d406cfd138775ba52ea555d93a4e4d4b0ad8440000000000000000" + - "0xbce912a0f383cd07660d3c08f3d3f3c7fb9de31e2cc1b93d4c29332ef693ba0c0000000000000000" + shallowLikeParents: + - "0x0276d29ec6b3cbbf3ed6d1f01af8e29b9c6a9ee9c9375e8e5b5b5c5b5b5d45580000000000000000" + - "0x70a5ce5d8fc3290a9885b1af5d8766d51db89a67a6a839f6d23a6cb8d6f3b6e30000000000000000" + accountId: "0x11a37a8e65fe5dca25cbeb896000eca615eaf88b97ca8dc70d8b1839b53dbf1c" + issuerPublicKey: "0xc6c83a78d06263ca937f21056a32d9b3099d04f0c92863d8b8dceabdd1421d2a" + issuingTime: 1649442459 + commitment: + index: 110 + prevId: "0x78bf1e6c30c6ed9192fa07e1466c09a10e9ea6c58d3b1b6c61a259f1a6f569ed0000000000000000" + rootsId: "0xa4dd36465af63d495d35a05f592d42a51511c153e1bae8fad00453c8cbb48727" + cumulativeWeight: 12345 + latestFinalizedSlot: 98 + payload: + type: 6 + essence: + type: 1 + networkId: "1337133713371337" + creationTime: 1649442459 + inputsCommitment: "0x0e6c2998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a79" + inputs: + - type: 0 + transactionId: "0x0c78e998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a79" + transactionOutputIndex: 0 + - type: 0 + transactionId: "0x309b169bfa60c8cf80afd730741862d200405d5df7cabfe9b564361dce1f7036" + transactionOutputIndex: 0 + - type: 0 + transactionId: "0xc138ecdc882010245e9574fbc1f1f43cc7c182fa890e46e018365dd49de0f16e" + transactionOutputIndex: 0 + outputs: + - type: 3 + amount: "50000000" + unlockConditions: + - type: 0 + address: + type: 0 + pubKeyHash: "0xd49931814e6bfbb8e221f1b2936e206e5a6b6abeb9c070f8603814c525c9abe3" + payload: + unlocks: + - type: 0 + signature: + type: 0 + publicKey: "0x40d0c00fd629a5f528e4bcab4333926a90d06613a3f36a325defcdaf4c9e4092" + signature: "0xed4a63a3e1b22c85f9813b00a21c8576ed72c1f5bc939d01fcea7dcd678c2d0d8d80a2499965d8ce5574c9e92aa0d42b72b969bab3a2a35fe7dbc64659a0d703" + - type: 1 + reference: 0 + - type: 1 + reference: 0 + nonce: "105368" + signature: "0xd2215b9307c272eb12ea42c18768b9e133ed5b674abc23c577f5096520e433c807930497ed3f90498a7c82bbc1a730f20201413b10a30cd8737403fdbb63bf874966ca205f25e790a8860fbc152a9775e430b9618cd6282d2a0d29969412de07" + + get-committee-example: + value: + totalStake: 900000000 + totalValidatorStake: 60000000 + validators: + - accountId: "0x309b169bfa60c8cf80afd730741862d200405d5df7cabfe9b564361dce1f7036" + poolStake: 200000 + validatorStake: 100000 + fixedCost: 50000 + latestSupportedProtocolVersion: 3 + - accountId: "0x897dr69bfa60c8cf80afd730741862d200405d5df7cabfe9b564361dce1f7036" + poolStake: 205000 + validatorStake: 90000 + fixedCost: 52000 + latestSupportedProtocolVersion: 3 + + get-staker-list-example: + value: + stakers: + - accountId: "0x309b169bfa60c8cf80afd730741862d200405d5df7cabfe9b564361dce1f7036" + poolStake: 200000 + validatorStake: 100000 + fixedCost: 50000 + latestSupportedProtocolVersion: 3 + - accountId: "0x897dr69bfa60c8cf80afd730741862d200405d5df7cabfe9b564361dce1f7036" + poolStake: 205000 + validatorStake: 90000 + fixedCost: 52000 + latestSupportedProtocolVersion: 3 + + get-staker-example: + value: + accountId: "0x897dr69bfa60c8cf80afd730741862d200405d5df7cabfe9b564361dce1f7036" + poolStake: 205000 + validatorStake: 90000 + fixedCost: 52000 + latestSupportedProtocolVersion: 3 + + get-account-rewards-example: + value: + currentEpochIndex: 60 + rewards: 800000 + + get-congestion-estimate-response-example: + value: + slotIndex: 20 + ready: true + referenceManaCost: 50000 + blockIssuanceCredits: 10000000 + + get-block-by-id-empty-response-example: + value: + protocolVersion: 3 + networkId: 10 + strongParents: + - "0x8d6f3b6e3a63ce388d2eb8c927c5b9ba328b0e427ae727d8b3dddc429f6fb24a0000000000000000" + - "0x408a53af982c49d1398ab5c5b5f5b390d4c4da7da48b61bb9ba7f97c1e8dd7f60000000000000000" + accountId: "0x11a37a8e65fe5dca25cbeb896000eca615eaf88b97ca8dc70d8b1839b53dbf1c" + issuerPublicKey: "0xc6c83a78d06263ca937f21056a32d9b3099d04f0c92863d8b8dceabdd1421d2a" + issuingTime: 1649442459 + commitment: + index: 110 + prevId: "0x78bf1e6c30c6ed9192fa07e1466c09a10e9ea6c58d3b1b6c61a259f1a6f569ed0000000000000000" + rootsId: "0xa4dd36465af63d495d35a05f592d42a51511c153e1bae8fad00453c8cbb48727" + cumulativeWeight: 12345 + latestFinalizedSlot: 98 + nonce: '8423' + signature: "0xd2215b9307c272eb12ea42c18768b9e133ed5b674abc23c577f5096520e433c807930497ed3f90498a7c82bbc1a730f20201413b10a30cd8737403fdbb63bf874966ca205f25e790a8860fbc152a9775e430b9618cd6282d2a0d29969412de07" + + get-block-by-id-transaction-response-example: + value: + protocolVersion: 3 + networkId: 10 + strongParents: + - "0x8d6f3b6e3a63ce388d2eb8c927c5b9ba328b0e427ae727d8b3dddc429f6fb24a0000000000000000" + - "0x408a53af982c49d1398ab5c5b5f5b390d4c4da7da48b61bb9ba7f97c1e8dd7f60000000000000000" + weakParents: + - "0xe8a904ce3ee081f20a68bb38b2d406cfd138775ba52ea555d93a4e4d4b0ad8440000000000000000" + - "0xbce912a0f383cd07660d3c08f3d3f3c7fb9de31e2cc1b93d4c29332ef693ba0c0000000000000000" + shallowLikeParents: + - "0x0276d29ec6b3cbbf3ed6d1f01af8e29b9c6a9ee9c9375e8e5b5b5c5b5b5d45580000000000000000" + - "0x70a5ce5d8fc3290a9885b1af5d8766d51db89a67a6a839f6d23a6cb8d6f3b6e30000000000000000" + accountId: "0x11a37a8e65fe5dca25cbeb896000eca615eaf88b97ca8dc70d8b1839b53dbf1c" + issuerPublicKey: "0xc6c83a78d06263ca937f21056a32d9b3099d04f0c92863d8b8dceabdd1421d2a" + issuingTime: 1649442459 + commitment: + index: 2310 + prevId: "0x78bf1e6c30c6ed9192fa07e1466c09a10e9ea6c58d3b1b6c61a259f1a6f569ed0000000000000000" + rootsId: "0xa4dd36465af63d495d35a05f592d42a51511c153e1bae8fad00453c8cbb48727" + cumulativeWeight: 12345 + latestFinalizedSlot: 98 + payload: + type: 6 + essence: + type: 1 + networkId: "1337133713371337" + creationTime: 1649442459 + inputsCommitment: "0x0e6c2998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a79" + inputs: + - type: 0 + transactionId: "0x0c78e998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a79" + transactionOutputIndex: 0 + - type: 0 + transactionId: "0x309b169bfa60c8cf80afd730741862d200405d5df7cabfe9b564361dce1f7036" + transactionOutputIndex: 0 + - type: 0 + transactionId: "0xc138ecdc882010245e9574fbc1f1f43cc7c182fa890e46e018365dd49de0f16e" + transactionOutputIndex: 0 + outputs: + - type: 3 + amount: "50000000" + unlockConditions: + - type: 0 + address: + type: 0 + pubKeyHash: "0xd49931814e6bfbb8e221f1b2936e206e5a6b6abeb9c070f8603814c525c9abe3" + payload: + unlocks: + - type: 0 + signature: + type: 0 + publicKey: "0x40d0c00fd629a5f528e4bcab4333926a90d06613a3f36a325defcdaf4c9e4092" + signature: "0xed4a63a3e1b22c85f9813b00a21c8576ed72c1f5bc939d01fcea7dcd678c2d0d8d80a2499965d8ce5574c9e92aa0d42b72b969bab3a2a35fe7dbc64659a0d703" + - type: 1 + reference: 0 + - type: 1 + reference: 0 + nonce: "105368" + signature: "0xd2215b9307c272eb12ea42c18768b9e133ed5b674abc23c577f5096520e433c807930497ed3f90498a7c82bbc1a730f20201413b10a30cd8737403fdbb63bf874966ca205f25e790a8860fbc152a9775e430b9618cd6282d2a0d29969412de07" + + + get-block-by-id-tagged-data-response-example: + value: + protocolVersion: 3 + networkId: 10 + strongParents: + - "0x2f746934d0075179a37ca3e807b7e793ec4ec9189ba31c9ad092d7497b01118c1000000000000000" + - "0x1a4b52759a4a4e879d38478139913f71c6fcd2ee76c924e5be2b9c9321d61f6e1000000000000000" + - "0xb55045d5d57818e93b2c9e75f5e328ce5a04f3db3a5a5cf44949f7c8e4d0b4f10000000000000000" + weakParents: + - "0xa5ee03d7196d7ab8c0d61740f9c91e16b2bc33d82a22b531c71ccf117951682d1000000000000000" + - "0x3d1b7b51c66e2b06c1e819d82e7f20d1870c753bd25d19aae78a8b70e06b1aef1000000000000000" + - "0xd2ca3ef0f7d2f0b2d02e857cbe77f33a3bce54cf3d3c5f0446b7f6da3d8a3ea8000000000000000" + shallowLikeParents: + - "0x4f746934d0075179a37ca3e807b7e793ec4ec9189ba31c9ad092d7497b01118c1000000000000000" + - "0xc9e87d77b547deea65e7f1a36d125ef7c901139bebb3158e76ee1e9b71dcbfe4000000000000000" + - "0x2d237c37248f1e833c08a1189f9a69c0b3f8c3e039d14291ab7e60a88c4f4d3c000000000000000" + accountId: "0x11a37a8e65fe5dca25cbeb896000eca615eaf88b97ca8dc70d8b1839b53dbf1c" + issuerPublicKey: "0xc6c83a78d06263ca937f21056a32d9b3099d04f0c92863d8b8dceabdd1421d2a" + issuingTime: 1649442459 + commitment: + index: 928 + prevId: "0x6dcf06b23919b4d4c1c4d1f51af7e510618a2cecb7f2d4c4d0b4a4deef531b7e0000000000000000" + rootsId: "0xa4dd36465af63d495d35a05f592d42a51511c153e1bae8fad00453c8cbb48727" + cumulativeWeight: 98765 + latestFinalizedSlot: 98 + payload: + type: 5 + tag: "0x68656c6c6f20776f726c64" + data: "0x5370616d6d696e6720646174612e0a436f756e743a203037323935320a54696d657374616d703a20323032312d30322d31315431303a32333a34392b30313a30300a54697073656c656374696f6e3a203934c2b573" + nonce: "105368" + signature: "0xd2215b9307c272eb12ea42c18768b9e133ed5b674abc23c577f5096520e433c807930497ed3f90498a7c82bbc1a730f20201413b10a30cd8737403fdbb63bf874966ca205f25e790a8860fbc152a9775e430b9618cd6282d2a0d29969412de07" + + get-outputs-by-id-response-example: + value: + type: 3 + amount: "1000" + unlockConditions: + - type: 0 + address: + type: 0 + pubKeyHash: "0x8eaf87ac1f52eb05f2c7c0c15502df990a228838dc37bd18de9503d69afd257d" + + get-output-metadata-by-id-response-unspent-example: + value: + blockId: "0xd3a0a0c76ab2d9b406a32c30c43e102fe0f39a12a3f6c1e3b19d239db2f18d75" + transactionId: "0x1c52e8e630d1c6e45ab6f46c63d8d6cb02e6c2ed6e31b6c97d6f5c5f5a5d5c5b" + outputIndex: 3 + isSpent: false + includedCommitmentId: "0x7c62d9b9ed3c1f3ef942a7ea17ec1270d77c109f0ba57b6c2d2b9e9fb3e69a3a" + latestCommitmentId: "0x7c62d9b9ed3c1f3ef942a7ea17ec1270d77c109f0ba57b6c2d2b9e9fb3e69a3a" + + get-output-metadata-by-id-response-spent-example: + value: + blockId: "0xd3a0a0c76ab2d9b406a32c30c43e102fe0f39a12a3f6c1e3b19d239db2f18d75" + transactionId: "0x1c52e8e630d1c6e45ab6f46c63d8d6cb02e6c2ed6e31b6c97d6f5c5f5a5d5c5b" + outputIndex: 3 + isSpent: true + commitmentIdSpent: "0x4b91c935926c77d0ac9b4a569c3eb3b0f0c9918f2d4f4d9bb1c7dfc19b41e4c2" + transactionIdSpent: "0x1ee46e19f4219ee65afc10227d0ca22753f76ef32d1e922e5cbe3fbc9b5a5298" + includedCommitmentId: "0x7c62d9b9ed3c1f3ef942a7ea17ec1270d77c109f0ba57b6c2d2b9e9fb3e69a3a" + latestCommitmentId: "0x7c62d9b9ed3c1f3ef942a7ea17ec1270d77c109f0ba57b6c2d2b9e9fb3e69a3a" + + get-commitment-response-example: + value: + index: 986 + prevId: "0x8fb6cbb1ecf02c6b5a6a5a6a5f6c5a6a5f6c5a6a5a6a5a6a5f6c5a6a5a6a5f6c50000000000000000" + rootsId: "0xa4dd36465af63d495d35a05f592d42a51511c153e1bae8fad00453c8cbb48727" + cumulativeWeight: 78901 + + get-commitment-response-binary-example: + value: "070000000a1a0000977c626276b19ef8b3c445709f2f0f2ccc4abb98d97617f421f240c0d1ee066d4306e67a0321889ef8ec89b7eff1378049e058f0fa87a78c2452ae72631a5a99d913d1cbb3525b8faa1800e28dfcb28154bcba10154c39ef87ceda793cb44f58ae1549c88ea13fe4a9695bb6f0aba6cb756522209e5066a96039ae12b398b975693bdc21e222997c86ff9bfc5844f0372d58ff6fa510688e53c181bbdf4db41f9b627540a70e5751c026e543b2e8ab2eb06099daa1d1e5df47778f7787faab45cdf12fe3a80000000300d85e5b1590d898d1e0cdebb2e3b5337c8b76270142663d78811683ba47c17c989ad7a8f0ff2c6438bf435786d4a5b0125a5caf7367061b49a739389d5ebea234c0466c86f88a3f8add03bff04c2e34b214683f2f6983641e1d1185da7e2c3e0200d9922819a39e94ddf3907f4b9c8df93f39f026244fcb609205b9a879022599f218be2536d8b7b8547faa3dbdfe98339ebe9e2b2417a8a03eee02b2a8312b9e026dd0a33261a58a240cd0a1b06cdf1775d98d316f162d3eec402f4bf08bea2a0700f9d9656a60049083eef61487632187b351294c1fa23d118060d813db6d03e8b6ca8180d435708e826bc2042ccd667babb59c5cc461ff29dba966359fcd6fc511cdfdf10d6576f36ac2a6e5cb691e13968c13947ffbd9239939d3802b2fbe0f06" + + get-utxo-changes-response-example: + value: + index: 789 + createdOutputs: + - "0x1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2" + - "0x3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4" + consumedOutputs: + - "0x5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6" + - "0x7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7" + + schemas: + + Block: + description: A block is the object nodes gossip around in the network. It always references other blocks that are known as parents. It is stored as a vertex on the tangle data structure that the nodes maintain. A block can have a maximum size of 32Kb. + properties: + protocolVersion: + type: number + description: Protocol version identifier. It also tells which protocol rules apply to the block. + networkId: + type: number + description: Network version identifier. It also tells which network the node is running. + strongParents: + type: array + description: The identifiers of the blocks this block references. Hex-encoded data with 0x prefix. + items: + type: string + weakParents: + type: array + description: The identifiers of the blocks this block references. Hex-encoded data with 0x prefix. + items: + type: string + shallowLikeParents: + type: array + description: The identifiers of the blocks this block references. Hex-encoded data with 0x prefix. + items: + type: string + # TODO: accountId is currently issuerId in iota.go + accountId: + type: string + description: The identifier of the account of this block. + # TODO: issuerPublicKey is not part of Block in iota.go + issuerPublicKey: + type: string + description: The public key of the issuer. + issuingTime: + type: integer + description: The timestamp of issuing this block. + burnedMana: + type: number + description: The mana burned in this block. + commitment: + $ref: '#/components/schemas/Commitment' + description: The slot commitment contains in this block. + latestFinalizedSlot: + type: integer + description: The latest confirmed slot index of the node when issuing this block. + payload: + description: The inner payload of the block. Can be nil. + oneOf: + - $ref: '#/components/schemas/TransactionPayload' + - $ref: '#/components/schemas/TaggedDataPayload' + signature: + type: string + description: The signature of entire block, signed by the issuer. + nonce: + type: number + description: The nonce which fulfill the PoW requirements. + required: + - protocolVersion + - strongParents + - nonce + + TransactionPayload: + description: The Transaction Payload to be embedded into a block. + properties: + type: + type: integer + description: Set to value 6 to denote a Transaction Payload. + essence: + type: object + oneOf: + - $ref: '#/components/schemas/TransactionEssence' + unlocks: + type: array + items: + oneOf: + - $ref: '#/components/schemas/SignatureUnlock' + - $ref: '#/components/schemas/ReferenceUnlock' + - $ref: '#/components/schemas/AccountUnlock' + - $ref: '#/components/schemas/NFTUnlock' + required: + - type + - essence + - unlocks + + TransactionEssence: + description: Describes the essence data making up a transaction by defining its inputs and outputs and an optional payload. + properties: + type: + type: integer + description: Set to value 1 to denote a Transaction Essence. + networkId: + type: string + description: Network identifier. Plain string encoded number. This field signals for which network the block is meant for. It is computed out of the first 8 bytes of the `BLAKE2b-256` hash of the concatenation of the network name and protocol version string. + creationTime: + type: number + description: The slot index in which the transaction was created. + contextInputs: + type: array + items: + anyOf: + - $ref: '#/components/schemas/CommitmentInput' + - $ref: '#/components/schemas/BICInput' + - $ref: '#/components/schemas/RewardInput' + inputsCommitment: + type: string + description: BLAKE2b-256 hash of the BLAKE2b-256 hashes of the serialized outputs referenced in Inputs by their outputIds (transactionId || outputIndex). Hex-encoded data with 0x prefix. + inputs: + type: array + description: The inputs of this transaction. + items: + oneOf: + - $ref: '#/components/schemas/UTXOInput' + outputs: + type: array + description: The outputs of this transaction. + items: + anyOf: + - $ref: '#/components/schemas/BasicOutput' + - $ref: '#/components/schemas/AccountOutput' + - $ref: '#/components/schemas/FoundryOutput' + - $ref: '#/components/schemas/NFTOutput' + - $ref: '#/components/schemas/DelegationOutput' + allotments: + type: array + description: The accounts map with corresponding allotment values. + items: + oneOf: + - $ref: '#/components/schemas/Allotment' + payload: + description: The optional embedded payload. + oneOf: + - $ref: '#/components/schemas/TaggedDataPayload' + required: + - type + - networkId + - creationTime + - contextInputs + - inputsCommitment + - inputs + - outputs + + Allotment: + description: Allotment is a struct that represents a list of account IDs and an allotted value. + properties: + accountId: + type: string + description: The account ID to allot the mana to. + value: + type: number + description: The amount of mana to allot. + + CommitmentInput: + description: Allows to reference commitment to a certain slot. It is used to provide the VM with the necessary context information from the node, to prove that the time at the transaction execution is past certain slot in the past, as it indicates that the slot has been already committed. + properties: + type: + type: integer + description: Set to value 1 to denote a Commitment Input. + commitmentId: + type: string + description: The commitment identifier to reference. + required: + - type + - commitmentId + + # TODO: Consider rename it to CreditsInput, need to be aligned to implementaion. + BICInput: + description: Allows to provide the VM with context for the value of the BIC vector for a specific slot. It is necessary information needed for any Account transitions, and account destroying. + properties: + type: + type: integer + description: Set to value 2 to denote an BIC Input. + accountId: + type: string + description: The account identifier. + required: + - type + - accountId + + RewardInput: + description: Allows to claim Mana rewards for a referenced account or delegation input in a transaction. This enables the transaction to add the Mana rewards on the output side if the claiming rules of the staking feature or delegation output are adhered to. + properties: + type: + type: integer + description: Set to value 3 to denote an a Reward Input. + index: + type: integer + description: The index of the transaction input for which to claim rewards. + required: + - type + - index + + UTXOInput: + description: Describes an input which references an unspent transaction output to consume. + properties: + type: + type: integer + description: Set to value 0 to denote an UTXO Input. + transactionId: + type: string + description: The BLAKE2b-256 hash of the transaction from which the UTXO comes from. Hex-encoded data with 0x prefix. + transactionOutputIndex: + type: integer + description: The index of the output on the referenced transaction to consume. + required: + - type + - transactionId + - transactionOutputIndex + + BasicOutput: + description: Describes a basic output with optional features. + properties: + type: + type: integer + description: Set to value 3 to denote a Basic Output. + amount: + type: string + description: The amount of IOTA tokens to deposit with this BasicOutput output. Plain string encoded number. + nativeTokens: + type: array + description: Native tokens held by the otuput. + items: + anyOf: + - $ref: '#/components/schemas/NativeToken' + unlockConditions: + type: array + description: Unlock condtions that define how the output an be unlocked in a transaction. + items: + anyOf: + - $ref: '#/components/schemas/AddressUnlockCondition' + - $ref: '#/components/schemas/StorageDepositReturnUnlockCondition' + - $ref: '#/components/schemas/TimelockUnlockCondition' + - $ref: '#/components/schemas/ExpirationUnlockCondition' + features: + type: array + description: The features on the output + items: + anyOf: + - $ref: '#/components/schemas/SenderFeature' + - $ref: '#/components/schemas/MetadataFeature' + - $ref: '#/components/schemas/TagFeature' + mana: + type: integer + description: The stored mana held by the output. + required: + - type + - amount + - mana + + AccountOutput: + description: Describes an account in the ledger that can be controlled by the state and governance controllers. + properties: + type: + type: integer + description: Set to value 4 to denote an Account Output. + amount: + type: string + description: The amount of IOTA tokens to deposit with this output. Plain string encoded number. + accountId: + type: string + description: The identifier of the account. + nativeTokens: + type: array + description: Native tokens held by the otuput. + items: + anyOf: + - $ref: '#/components/schemas/NativeToken' + stateIndex: + type: integer + description: A counter that must increase by 1 every time the alias is state transitioned. + stateMetadata: + type: string + description: Hex-encoded metadata with 0x prefix that can only be changed by the state controller. + foundryCounter: + type: integer + description: A counter that denotes the number of foundries created by this account. + unlockConditions: + type: array + description: Unlock condtions that define how the output an be unlocked in a transaction. + items: + anyOf: + - $ref: '#/components/schemas/StateControllerAddressUnlockCondition' + - $ref: '#/components/schemas/GovernorAddressUnlockCondition' + features: + type: array + description: Features that add utility to the output but do not impose unlocking conditions. + items: + anyOf: + - $ref: '#/components/schemas/SenderFeature' + - $ref: '#/components/schemas/MetadataFeature' + - $ref: '#/components/schemas/BlockIssuerFeature' + - $ref: '#/components/schemas/StakingFeature' + immutableFeatures: + type: array + description: Immutable features that add utility to the output but do not impose unlocking conditions. + These features need to be kept in future transitions of the UTXO state machine. + items: + anyOf: + - $ref: '#/components/schemas/IssuerFeature' + - $ref: '#/components/schemas/MetadataFeature' + mana: + type: integer + description: The stored mana held by the output. + required: + - type + - amount + - accountId + - stateIndex + - foundryCounter + - mana + + DelegationOutput: + description: >- + Describes an delegation output in the ledger that can be controlled by the + state and governance controllers. + properties: + type: + type: integer + description: Set to value 7 to denote a Delegation Output. + example: 7 + amount: + type: string + description: >- + The amount of IOTA tokens held by the output. Encoded as a + plain string. + example: '100' + delegatedAmount: + type: integer + description: The amount of IOTA tokens that were delegated when the output was created. + delegationId: + type: string + description: >- + The identifier for this delegation output. + example: '0x1505ec099896ab05d9e08fbc7101ae4dff0093b3943b28f789ed2ca728bcc8d6' + validatorId: + type: string + description: >- + The Account ID of the validator to which this output is delegating. + example: '0x1505ec099896ab05d9e08fbc7101ae4dff0093b3943b28f789ed2ca728bcc8d6' + startEpoch: + type: integer + description: >- + The index of the first epoch for which this output delegates. + example: 10 + endEpoch: + type: integer + description: >- + The index of the last epoch for which this output delegates. + example: 12 + unlockConditions: + type: array + description: >- + Unlock condtions that define how the output can be unlocked in a + transaction. + items: + anyOf: + - $ref: '#/components/schemas/AddressUnlockCondition' + immutableFeatures: + type: array + description: >- + Immutable features that add utility to the output but do not impose + unlocking conditions. These blocks need to be kept in future + transitions of the UTXO state machine. + items: + anyOf: + - $ref: '#/components/schemas/IssuerFeature' + mana: + type: integer + description: The stored mana held by the output. + example: 3000 + required: + - type + - amount + - delegatedAmount + - delegationId + - validatorId + - startEpoch + - endEpoch + + + FoundryOutput: + description: Describes a foundry output that is controlled by an alias. + properties: + type: + type: integer + description: Set to value 5 to denote a Foundry Output. + amount: + type: string + description: The amount of IOTA tokens to deposit with this output. Plain string encoded number. + nativeTokens: + type: array + description: Native tokens held by the otuput. + items: + anyOf: + - $ref: '#/components/schemas/NativeToken' + serialNumber: + type: integer + description: The serial number of the foundry with respect to the controlling account. + tokenScheme: + type: array + description: Defines the supply control scheme of the tokens controlled by the foundry. + items: + oneOf: + - $ref: '#/components/schemas/SimpleTokenScheme' + unlockConditions: + type: array + description: Unlock condtions that define how the output an be unlocked in a transaction. + items: + anyOf: + - $ref: '#/components/schemas/ImmutableAccountAddressUnlockCondition' + features: + type: array + description: Features that add utility to the output but do not impose unlocking conditions. + items: + anyOf: + - $ref: '#/components/schemas/MetadataFeature' + immutableFeatures: + type: array + description: Immutable features that add utility to the output but do not impose unlocking conditions. + These features need to be kept in future transitions of the UTXO state machine. + items: + anyOf: + - $ref: '#/components/schemas/MetadataFeature' + mana: + type: integer + description: The stored mana held by the output. + required: + - type + - amount + - serialNumber + - tokenScheme + - mana + + NFTOutput: + description: Describes an NFT output, a globally unique token with metadata attached. + properties: + type: + type: integer + description: Set to value 6 to denote a NFT Output. + amount: + type: string + description: The amount of IOTA tokens to deposit with this output. Plain string encoded number. + nativeTokens: + type: array + description: Native tokens held by the otuput. + items: + anyOf: + - $ref: '#/components/schemas/NativeToken' + nftId: + type: string + description: Unique identifier of the NFT, which is the BLAKE2b-256 hash of the Output ID that created it. NFT Address = NFT Address Type || NFT ID. Hex-encoded data with 0x prefix. + unlockConditions: + type: array + description: Unlock condtions that define how the output an be unlocked in a transaction. + items: + anyOf: + - $ref: '#/components/schemas/AddressUnlockCondition' + - $ref: '#/components/schemas/StorageDepositReturnUnlockCondition' + - $ref: '#/components/schemas/TimelockUnlockCondition' + - $ref: '#/components/schemas/ExpirationUnlockCondition' + features: + type: array + description: Features that add utility to the output but do not impose unlocking conditions. + items: + anyOf: + - $ref: '#/components/schemas/SenderFeature' + - $ref: '#/components/schemas/MetadataFeature' + - $ref: '#/components/schemas/TagFeature' + immutableFeatures: + type: array + description: Immutable features that add utility to the output but do not impose unlocking conditions. + These features need to be kept in future transitions of the UTXO state machine. + items: + anyOf: + - $ref: '#/components/schemas/IssuerFeature' + - $ref: '#/components/schemas/MetadataFeature' + mana: + type: integer + description: The stored mana held by the output + required: + - type + - amount + - nftId + - mana + + NativeToken: + description: A native token and its balance in the output. + properties: + id: + type: string + description: Hex-encoded identifier with 0x prefix of the native token. Same as foundryId of the controlling foundry. + amount: + type: string + description: Amount of native tokens (up to uint256). Hex-encoded number with 0x prefix. + required: + - tokenId + - amount + + Ed25519Address: + description: The Ed25519 address. + properties: + type: + type: integer + description: Set to value 0 to denote an Ed25519 Address. + pubKeyHash: + type: string + description: The hex-encoded, 0x prefixed BLAKE2b-256 hash of the Ed25519 public key + required: + - type + - pubKeyHash + + AccountAddress: + description: Address of an alias account. + properties: + type: + type: integer + description: Set to value 8 to denote an Account Address. + accountId: + type: string + description: The hex-encoded, 0x prefixed BLAKE2b-256 hash of the outputId that created the account. + required: + - type + - accountId + + NFTAddress: + description: Address of an NFT account. + properties: + type: + type: integer + description: Set to value 16 to denote an NFT Address. + nftId: + type: string + description: The hex-encoded, 0x prefixed BLAKE2b-256 hash of the outputId that created the NFT. + required: + - type + - nftId + + AddressUnlockCondition: + description: Can be unlocked by unlocking the address. + properties: + type: + type: integer + description: Set to value 0 to denote an Address Unlock Condition. + address: + oneOf: + - $ref: '#/components/schemas/Ed25519Address' + - $ref: '#/components/schemas/AccountAddress' + - $ref: '#/components/schemas/NFTAddress' + required: + - type + - address + + ImmutableAccountAddressUnlockCondition: + description: Can be unlocked by unlocking the permanent account. + The unlock condition has to be kept in future state transitions of the UTXO state machine. + properties: + type: + type: integer + description: Set to value 6 to denote an Immutable Account Address Unlock Condition. + address: + oneOf: + - $ref: '#/components/schemas/AccountAddress' + required: + - type + - address + + StorageDepositReturnUnlockCondition: + description: Can be unlocked by depositing return amount to return address via an output that only has Address Unlock Condition. + properties: + type: + type: integer + description: Set to value 1 to denote a Storage Deposit Return Unlock Condition. + returnAddress: + oneOf: + - $ref: '#/components/schemas/Ed25519Address' + - $ref: '#/components/schemas/AccountAddress' + - $ref: '#/components/schemas/NFTAddress' + amount: + type: string + description: Amount of IOTA tokens the consuming transaction should deposit to the address defined in Return Address. Plain string encoded number. + required: + - type + - returnAddress + - amount + + TimelockUnlockCondition: + description: Can be unlocked if the CTT has a >= Unix Timestamp. + properties: + type: + type: integer + description: Set to value 2 to denote an Timelock Unlock Condition. + slotIndex: + type: integer + description: The slot index until which the timelock applies (inclusive). + minimum: 0 + exclusiveMinimum: true + required: + - type + + ExpirationUnlockCondition: + description: Defines a unix time until which only Address, defined in Address Unlock Condition, is allowed to unlock the output. After the unix time, only Return Address can unlock it. + properties: + type: + type: integer + description: Set to value 3 to denote an Expiration Unlock Condition. + returnAddress: + oneOf: + - $ref: '#/components/schemas/Ed25519Address' + - $ref: '#/components/schemas/AccountAddress' + - $ref: '#/components/schemas/NFTAddress' + slotIndex: + type: integer + description: The slot index at which the expiration happens. + minimum: 0 + exclusiveMinimum: true + required: + - type + - returnAddress + + StateControllerAddressUnlockCondition: + description: Can be unlocked by unlocking the address. + properties: + type: + type: integer + description: Set to value 4 to denote an Sate Controller Address Unlock Condition. + address: + oneOf: + - $ref: '#/components/schemas/Ed25519Address' + - $ref: '#/components/schemas/AccountAddress' + - $ref: '#/components/schemas/NFTAddress' + required: + - type + - address + + GovernorAddressUnlockCondition: + description: Can be unlocked by unlocking the address. + properties: + type: + type: integer + description: Set to value 5 to denote an Governor Address Unlock Condition. + address: + oneOf: + - $ref: '#/components/schemas/Ed25519Address' + - $ref: '#/components/schemas/AccountAddress' + - $ref: '#/components/schemas/NFTAddress' + required: + - type + - address + + SenderFeature: + description: Identifies the validated sender of the output. + properties: + type: + type: integer + description: Set to value 0 to denote a Sender Feature. + address: + oneOf: + - $ref: '#/components/schemas/Ed25519Address' + - $ref: '#/components/schemas/AccountAddress' + - $ref: '#/components/schemas/NFTAddress' + required: + - type + - address + + IssuerFeature: + description: Identifies the validated issuer of the UTXO state machine (account/NFT). + properties: + type: + type: integer + description: Set to value 1 to denote an Issuer Feature. + address: + oneOf: + - $ref: '#/components/schemas/Ed25519Address' + - $ref: '#/components/schemas/AccountAddress' + - $ref: '#/components/schemas/NFTAddress' + required: + - type + - address + + BlockIssuerFeature: + description: A feature which indicates that this account can issue blocks. + properties: + type: + type: integer + description: Set to value 4 to denote a Block Issuer Feature. + example: 4 + blockIssuerKeys: + type: array + description: The keys allowed to issue blocks from an account with a BlockIssuerFeature. + items: + type: string + description: Ed25519 public key in Hex. + expirySlot: + type: integer + description: Indicates when the BlockIssuerKeys are expired. + required: + - type + - blockIssuerKeys + - expirySlot + + StakingFeature: + description: A feature which indicates that this account can issue blocks. + properties: + type: + type: integer + description: Set to value 5 to denote a Staking Feature. + example: 5 + stakedAmount: + type: integer + description: The amount of IOTA coins that are locked and staked in the containing account. + fixedCost: + type: integer + description: Indicates when the BlockIssuerKeys are expired. + startEpoch: + type: integer + description: The epoch index at which the staking starts. + endEpoch: + type: integer + description: The epoch index at which the staking ends. + required: + - type + - stakedAmount + - fixedCost + - startEpoch + - endEpoch + + MetadataFeature: + description: Defines metadata (arbitrary binary data) that will be stored in the output. + properties: + type: + type: integer + description: Set to value 2 to denote a Metadata Feature. + data: + type: string + description: Hex-encoded binary data with 0x prefix. + required: + - type + - data + + TagFeature: + description: Defines an indexation tag to which the output can be indexed by additional node plugins. + properties: + type: + type: integer + description: Set to value 3 to denote a Tag Feature. + tag: + type: string + description: Hex-encoded binary indexation tag with 0x prefix. + required: + - type + - tag + + SimpleTokenScheme: + description: Defines the simple supply control scheme of native tokens. Tokens can be minted by the foundry without additional restrictions as long as maximum supply is requested and circulating supply is not negative. + properties: + type: + type: integer + description: Set to value 0 to denote an Simple Token Scheme. + mintedTokens: + type: string + description: Minted tokens controlled by this foundry. Hex-encoded number with 0x prefix. + meltedTokens: + type: string + description: Melted tokens controlled by this foundry. Hex-encoded number with 0x prefix. + maxSupply: + type: string + description: Maximum supply of tokens controlled by this foundry. Hex-encoded number with 0x prefix. + required: + - type + - mintedTokens + - meltedTokens + - maxSupply + + SignatureUnlock: + description: Defines an unlock containing signature(s) unlocking input(s). + properties: + type: + type: integer + description: Denotes a Signature Unlock. + signature: + type: object + oneOf: + - $ref: '#/components/schemas/Ed25519Signature' + required: + - type + - signature + + Ed25519Signature: + description: The Ed25519 signature. + properties: + type: + type: integer + description: Set to value 0 to denote an Ed25519 Signature. + publicKey: + type: string + description: The public key of the Ed25519 keypair which is used to verify the signature. Hex-encoded with 0x prefix. + signature: + type: string + description: The signature signing the serialized Transaction Essence. Hex-encoded with 0x prefix. + required: + - type + - publicKey + - signature + + ReferenceUnlock: + description: References a previous unlock in order to substitute the duplication of the same unlock data for inputs which unlock through the same data. + properties: + type: + type: integer + description: Set to value 1 to denote a Reference Unlock. + reference: + type: integer + description: Represents the index of a previous unlock. + required: + - type + - reference + + AccountUnlock: + description: References a previous unlock that unlocks an Alias Output. + properties: + type: + type: integer + description: Set to value 2 to denote an Alias Unlock. + reference: + type: integer + description: Represents the index of a previous unlock. + required: + - type + - reference + + NFTUnlock: + description: References a previous unlock that unlocks an NFT Output. + properties: + type: + type: integer + description: Set to value 3 to denote an NFT Unlock. + reference: + type: integer + description: Represents the index of a previous unlock. + required: + - type + - reference + + TaggedDataPayload: + description: The Tagged Data Payload to be embedded into a block. + properties: + type: + type: integer + description: Set to value 5 to denote a Tagged Data Payload. + tag: + type: string + description: The tag to allow external tools to find/look up this block. It has a size between 0 and 64 bytes and must be encoded as a hex-string with 0x prefix. Network nodes do not index blocks with Tagged Data Payload by the tag field by default. + data: + type: string + description: The optional data to attach. This may have a length of 0. Hex-encoded with 0x prefix. + required: + - type + + Gossip: + description: Information about the gossip stream with the peer. + properties: + heartbeat: + description: Information about the most recent heartbeat of the peer. The heartbeat is `null` if none has been received yet. + allOf: + - $ref: '#/components/schemas/Heartbeat' + nullable: true + metrics: + description: Metrics about the gossip stream with the peer. + allOf: + - $ref: '#/components/schemas/Metrics' + required: + - heartbeat + - metrics + + Heartbeat: + properties: + latestCommittedSlotIndex: + type: integer + description: The most recent slot that has been committed by the node. + prunedSlotIndex: + type: integer + description: Tells from which starting point the node holds data. + latestConfirmedSlotIndex: + type: integer + description: The most recent confirmed slot known to the node. + connectedNeighbors: + type: integer + description: Tells how many connected peers the node has. + syncedNeighbors: + type: integer + description: Tells how many synced peers the node has. + required: + - latestCommittedSlotIndex + - prunedSlotIndex + - latestConfirmedSlotIndex + - connectedNeighbors + - syncedNeighbors + + Metrics: + properties: + newBlocks: + type: integer + description: The number of received blocks that were new for the node. + knownBlocks: + type: integer + description: The number of received blocks that already were known to the node. + receivedBlocks: + type: integer + description: The number of received blocks from the peer. + receivedBlockRequests: + type: integer + description: The number of received block requests from the peer. + receivedHeartbeats: + type: integer + description: The number of received heartbeats from the peer. + sentBlocks: + type: integer + description: The number of sent blocks to the peer. + sentBlockRequests: + type: integer + description: The number of sent block requests to the peer. + sentHeartbeats: + type: integer + description: The number of sent heartbeats to the peer. + droppedPackets: + type: integer + description: The number of dropped packets. + required: + - newBlocks + - knownBlocks + - receivedBlocks + - receivedBlockRequests + - receivedHeartbeats + - sentBlocks + - sentBlockRequests + - sentHeartbeats + - droppedPackets + + ErrorResponse: + description: The error format. + properties: + error: + type: object + properties: + code: + type: string + description: The application error code. + message: + type: string + description: The error reason. + required: + - code + - message + required: + - error + + ForbiddenResponse: + description: Indicates that this endpoint is not available for public use. + allOf: + - $ref: '#/components/schemas/ErrorResponse' + example: + error: + code: 403 + message: not available for public use + + ServiceUnavailableResponse: + description: Indicates that the service is unavailable. + allOf: + - $ref: '#/components/schemas/ErrorResponse' + example: + error: + code: 503 + message: service unavailable + + BadRequestResponse: + description: Indicates that the request was bad. + allOf: + - $ref: '#/components/schemas/ErrorResponse' + example: + error: + code: 400 + message: invalid data provided + + NotFoundResponse: + description: Indicates that the data was not found. + allOf: + - $ref: '#/components/schemas/ErrorResponse' + example: + error: + code: 404 + message: could not find data + + InternalErrorResponse: + description: Indicates that the server encountered an unexpected condition, which prevented it from fulfilling the request by the client. + allOf: + - $ref: '#/components/schemas/ErrorResponse' + example: + error: + code: 500 + message: internal server error + + RoutesResponse: + description: Contains the available API routes of the node. + properties: + routes: + type: array + items: + type: string + required: + - routes + + InfoResponse: + description: Returns general information about the node. + properties: + name: + type: string + description: The name of the node. + version: + type: string + description: The semantic version of the node. + accountId: + type: string + description: The account identifier of the node. + status: + description: Status of the node. + properties: + isHealthy: + type: boolean + description: Tells whether the node is healthy or not. + lastAcceptedBlockId: + description: The identifier of the latest accepted block. + type: string + lastConfirmedBlockId: + description: The identifier of the latest confirmed block. + type: string + finalizedSlot: + description: The index of latest confirmed slot. + type: integer + acceptedTangleTime: + description: A notion of time that is anchored to the latest accepted block. + type: integer + relativeAcceptedTangleTime: + description: The Accepted Tangle Time after it has advanced with the system clock. + type: integer + confirmedTangleTime: + description: A notion of time that is anchored to the latest confirmed block. + type: integer + relativeConfirmedTangleTime: + description: The Confirmed Tangle Time after it has advanced with the system clock. + type: integer + latestCommittedSlot: + type: object + description: The latest slot that the node has committed to. + pruningSlot: + type: integer + description: The index of the slot before which the tangle history is pruned. + required: + - isHealthy + - latestCommittedSlot + - finalizedSlot + - pruningSlot + metrics: + description: Node metrics. + properties: + blocksPerSecond: + description: The current rate of new blocks per second. + type: number + format: float + confirmedBlocksPerSecond: + description: The current rate of confirmed blocks per second. + type: number + format: float + confirmedRate: + description: The ratio of confirmed blocks in relation to new blocks of the last confirmed slot. + type: number + format: float + required: + - blocksPerSecond + - confirmedBlocksPerSecond + - confirmedRate + supportedProtocolVersions: + type: array + description: The supported protocol versions. + items: + type: integer + protocol: + description: Protocol parameters. + properties: + networkName: + type: string + description: The Name of the network from which the networkId is derived. + bech32Hrp: + type: string + description: Tells whether the node supports mainnet or testnet addresses. Value `iota` indicates that the node supports mainnet addresses. Value `atoi` indicates that the node supports testnet addresses. + tokenSupply: + type: string + description: Current supply of base token. Plain string encoded number. + version: + type: integer + description: Protocol version used by the network. + minPowScore: + description: The Proof-of-Work difficulty for a block to be sent over the network to mitigate spam. + type: number + format: float + rentStructure: + description: The rent structure according to TIP-19. + properties: + vByteCost: + description: Defines the rent of a single virtual byte denoted in IOTA tokens. + type: integer + vByteFactorData: + description: Defines the factor to be used for data only fields. + type: integer + vByteFactoKey: + description: Defines the factor to be used for key/lookup generating fields. + type: integer + required: + - vByteCost + - vByteFactorData + - vByteFactoKey + genesisUnixTimestamp: + type: integer + description: The genesis timestamp at which the slots start to count. + slotDurationInSeconds: + type: number + description: The duration of a slot, in seconds. + slotsPerEpochExponent: + type: number + description: The number of slots in an epoch expressed as an exponent of 2. + manaGenerationRate: + type: number + description: The amount of potential Mana generated by 1 IOTA in 1 slot. + manaGenerationRateExponent: + type: number + description: The scaling of ManaGenerationRate expressed as an exponent of 2. + manaDecayFactors: + type: array + description: a lookup table of epoch index diff to mana decay factor (slice index 0 = 1 epoch). + items: + type: number + manaDecayFactorsExponent: + type: number + description: The scaling of ManaDecayFactors expressed as an exponent of 2. + manaDecayFactorEpochsSum: + type: number + description: An integer approximation of the sum of decay over epochs. + manaDecayFactorEpochsSumExponent: + type: number + description: The scaling of ManaDecayFactorEpochsSum expressed as an exponent of 2. + stakingUnbondingPeriod: + type: number + description: The unbonding period in epochs before an account can stop staking. + evictionAge: + type: number + description: The age in slots when you can evict blocks by committing them into a slot commitments and when slots stop being a consumable accounts' state relative to the latest committed slot. + livenessThreshold: + type: number + description: Determine if a block is eligibile by evaluating issuingTime and commitments in its pastcone to ATT and lastCommittedSlot respectively. + epochNearingThreshold: + type: number + description: Determine the slot that should trigger a new committee selection for the next and upcoming epoch. + required: + - networkName + - bech32Hrp + - tokenSupply + - protocolVersion + - minPowScore + - rentStructure + - version + - genesisSlotIndex + - slotDurationInSeconds + - epochNearingThreshold + baseToken: + description: Gives info about the base token the network uses. + properties: + name: + type: string + description: The name of the base token of the network. + tickerSymbol: + type: string + description: Ticker symbol of the token to be displayed on trading platforms. + unit: + type: string + description: The primary unit of the token. + decimals: + type: integer + description: Number of decimals the primary unit is divisible up to. + subunit: + type: string + description: The name of the smallest possible denomination of the primary unit. subunit * 10^decimals = unit + useMetricPrefix: + type: boolean + description: Whether to use metric prefixes for displaying unit. + required: + - name + - tickerSymbol + - unit + - decimals + - useMetricPrefix + features: + description: The features that are supported by the node. For example, a node could support the feature, which would allow the BIC to be included by the node account. All features must be lowercase. + type: array + items: + type: string + required: + - name + - version + - status + - metrics + - supportedProtocolVersions + - protocol + - baseToken + - features + + AccountStakingResponse: + description: Returns the requested staking information of the account. + oneOf: + - $ref: '#/components/schemas/Validator' + + AccountStakingListResponse: + description: Returns a list of active stakers to stake. + properties: + stakers: + type: array + items: + oneOf: + - $ref: '#/components/schemas/Validator' + + ManaRewardsResponse: + description: Returns the mana rewards of an account or delegation output. + properties: + currentEpochIndex: + type: integer + description: The epoch index of current time. + rewards: + type: integer + description: The amount of totally available rewards the requested output may claim. + + AccountResponse: + description: Returns information that are ideal for attaching a block. + properties: + slotIndex: + type: integer + blockIssuanceCredits: + type: integer + + CommitteeResponse: + description: Returns the validator information of the committee. + properties: + totalStake: + type: integer + description: The total amount of delegated and staked IOTA tokens in the selected committee. + totalValidatorStake: + type: integer + description: The total amount of staked IOTA tokens in the selected committee. + validators: + type: array + description: The validators of the committee. + items: + oneOf: + - $ref: '#/components/schemas/Validator' + + Validator: + description: Returns information of a validator. + properties: + accountId: + type: string + description: The account identifier of the validator + poolStake: + type: integer + description: The total stake of the pool, including delegators. + validatorStake: + type: integer + description: The stake of a validator. + fixedCost: + type: integer + description: The fixed cost of the validator, which it receives as part of its Mana rewards. + latestSupportedProtocolVersion: + type: integer + description: The latest protocol version the validator supported. + + IssuanceBlockHeaderResponse: + description: Returns information that are ideal for attaching a block. + properties: + strongParents: + type: array + items: + type: string + description: The block identifiers that can be used to a attach a block to. Hex-encoded with 0x prefix. + weakParents: + type: array + items: + type: string + description: The block identifiers that can be used to a attach a block to. Hex-encoded with 0x prefix. + shallowLikeParents: + type: array + items: + type: string + description: The block identifiers that can be used to a attach a block to. Hex-encoded with 0x prefix. + latestFinalizedSlot: + type: integer + description: The latest finalized slot index. + commitment: + $ref: '#/components/schemas/Commitment' + + CongestionResponse: + description: Provides the cost and readiness to issue estimates. + properties: + slotIndex: + type: integer + description: The slot index for which the congestion estimate is provided. + ready: + type: boolean + description: > + Indicates if a node is ready to issue a block in a current congestion or should wait. + referenceManaCost: + type: integer + description: The cost in mana for issuing a block in a current congestion estimated based on RMC and slot index. + blockIssuanceCredits: + type: integer + description: The Block Issuance Credits of the requested account. + required: + - slotIndex + - ready + - referenceManaCost + - blockIssuanceCredits + + + Commitment: + description: An object embedded to a block. + properties: + index: + type: integer + description: The slot index of the commitment. + prevId: + type: string + description: The commitment identifier of the previous slot. + rootsId: + type: string + description: The digest of multiple merkle roots within this slot. + cumulativeWeight: + type: integer + description: + The sum of previous slot commitment cumulative weight and + weight of issuers of accepted blocks within this slot. + It is just an indication of "committed into" this slot, + and can not strictly be used for evaluating the switching of a chain. + + SubmitBlockRequest: + description: Submits a block to the node. + properties: + protocolVersion: + type: number + description: Protocol version identifier. It also tells which protocol rules apply to the block. + networkId: + type: number + description: Network version identifier. It also tells which network the node is running. + strongParents: + type: array + description: The identifiers of the blocks this block references. Hex-encoded data with 0x prefix. + items: + type: string + weakParents: + type: array + description: The identifiers of the blocks this block references. Hex-encoded data with 0x prefix. + items: + type: string + shallowLikeParents: + type: array + description: The identifiers of the blocks this block references. Hex-encoded data with 0x prefix. + items: + type: string + accountId: + type: string + description: The identifier of the issuer of this block. + issuerPublicKey: + type: string + description: The public key of the issuer. + issuingTime: + type: integer + description: The timestamp of issuing this block. + commitment: + $ref: '#/components/schemas/Commitment' + description: The slot commitment contains in this block. + latestFinalizedSlot: + type: integer + description: The latest finalized slot index of the node when issuing this block. + payload: + description: The inner payload of the block. Can be nil. + oneOf: + - $ref: '#/components/schemas/TransactionPayload' + - $ref: '#/components/schemas/TaggedDataPayload' + nonce: + type: string + description: The nonce which lets this block fulfill the Proof-of-Work requirement. Plain string encoded number. + signature: + type: string + description: The signature of entire block, signed by the issuer. + required: + - protocolVersion + + SubmitBlockResponse: + description: Returns the block identifier of the submitted block. + properties: + blockId: + type: string + description: The block identifier of the submitted block. Hex-encoded with 0x prefix. + required: + - blockId + + BlockMetadataResponse: + description: Returns the metadata of a given block. + properties: + blockId: + type: string + description: The identifier of the block. Hex-encoded with 0x prefix. + strongParents: + type: array + description: The identifiers of the blocks this block references. Hex-encoded data with 0x prefix. + items: + type: string + weakParents: + type: array + description: The identifiers of the blocks this block references. Hex-encoded data with 0x prefix. + items: + type: string + shallowLikeParents: + type: array + description: The identifiers of the blocks this block references. Hex-encoded data with 0x prefix. + items: + type: string + blockState: + type: string + enum: + - pending + - confirmed + - finalized + description: If `pending`, the block is stored but not confirmed. If `confirmed`, the block is confirmed with the first level of knowledge. If `finalized`, the block is included and cannot be reverted anymore. + txState: + type: string + enum: + - pending + - confirmed + - finalized + description: If 'pending', the block contains not yet included transaction. If 'confirmed' means transaction is confirmed with the first level of knowledge. If 'finalized' means transaction is included and cannot be reverted anymore. + blockStateReason: + type: integer + enum: [1,2,3] + description: > + Values: + * `1` - denotes that the block is invalid. + * `2` - denotes that the block is orphaned due to congestion control. + * `3` - denotes that the block is orphaned due to negative mana balance. + * Note: more reasons will be added. + txStateReason: + type: integer + enum: [1,2,3,4,5,6,7,8,9,10,11,12,255] + description: > + Values: + * `1` - denotes that the referenced UTXO was already spent. + * `2` - denotes that the transaction is conflicting with another transaction. Conflicting specifically means a double spend situation that both transaction pass all validation rules, eventually losing one(s) should have this reason. + * `3` - denotes that the referenced UTXO cannot be found. + * `4` - denotes that the sum of the inputs and output values does not match. + * `5` - denotes that the unlock block signature is invalid. + * `6` - denotes that the configured timelock is not yet expired. + * `7` - denotes that the given native tokens are invalid. + * `8` - denotes that the return amount in a transaction is not fulfilled by the output side. + * `9` - denotes that the input unlock is invalid. + * `10` - denotes that the inputs commitment is invalid. + * `11` - denotes that an output contains a Sender with an ident (address) which is not unlocked. + * `12` - denotes that the chain state transition is invalid. + * `255` - denotes that the semantic validation failed. + reissuePayload: + type: boolean + description: Tells if the payload should be issued again. + required: + - blockId + - strongParents + + BlockResponse: + description: Returns a given block. + properties: + allOf: + $ref: '#/components/schemas/Block' + + OutputResponse: + description: Returns an output and its metadata. + anyOf: + - $ref: '#/components/schemas/BasicOutput' + - $ref: '#/components/schemas/AccountOutput' + - $ref: '#/components/schemas/FoundryOutput' + - $ref: '#/components/schemas/NFTOutput' + - $ref: '#/components/schemas/DelegationOutput' + + OutputMetadataResponse: + description: Returns metadata about an output. + properties: + blockId: + type: string + description: The block identifier that references the output. Hex-encoded with 0x prefix. + transactionId: + type: string + description: The identifier of the transaction. Hex-encoded with 0x prefix. + outputIndex: + type: integer + description: The index of the output. + isSpent: + type: boolean + description: Tells if the output is spent in a confirmed transaction or not. + commitmentIdSpent: + type: string + description: The commitment ID of the slot at which this output was spent. + transactionIdSpent: + type: string + description: The transaction this output was spent with. Hex-encoded with 0x prefix. + includedCommitmentId: + type: string + description: The commitment ID at which the output was included into the ledger. + latestCommitmentId: + type: string + description: The current latest commitment id for which the request was made. + required: + - blockId + - transactionId + - outputIndex + - isSpent + - latestCommitmentId + + UTXOChangesResponse: + description: Returns all UTXO changes of the given slot. + properties: + index: + type: integer + description: The slot index of the given slot. + createdOutputs: + description: The created outputs of the given slot. + type: array + items: + type: string + description: Hex-encoded with 0x prefix. + consumedOutputs: + description: The consumed outputs of the given slot. + type: array + items: + type: string + description: Hex-encoded with 0x prefix. + required: + - index + - createdOutputs + - consumedOutputs diff --git a/tips/TIPS-API/openapi3-indexer.yaml b/tips/TIPS-API/openapi3-indexer.yaml new file mode 100644 index 000000000..5345da3ed --- /dev/null +++ b/tips/TIPS-API/openapi3-indexer.yaml @@ -0,0 +1,897 @@ +openapi: 3.0.3 +info: + title: IOTA UTXO Indexer REST API + description: This document specifies the REST API for IOTA UTXO indexers. + contact: + email: contact@iota.org + license: + name: Apache 2.0 + url: 'http://www.apache.org/licenses/LICENSE-2.0.html' + version: 3.0.0 +externalDocs: + description: Find out more about IOTA + url: 'https://iota.org' +servers: + - url: 'http://127.0.0.1:14265' +tags: + - name: basic outputs + description: Query Basic Outputs. + - name: account outputs + description: Query Account Outputs. + - name: delegation outputs + description: Query Delegation Outputs. + - name: foundry outputs + description: Query Foundry Outputs. + - name: nft outputs + description: Query NFT Outputs. +paths: + /api/indexer/v2/outputs/basic: + get: + tags: + - basic outputs + summary: Returns basic outputs filtered based on parameters. + description: Returns basic outputs filtered based on parameters. + parameters: + - in: query + name: address + schema: + type: string + example: iota1qrhacyfwlcnzkvzteumekfkrrwks98mpdm37cj4xx3drvmjvnep6xqgyzyx + description: The Bech32-encoded address that should be searched for in the Address Unlock Condition of outputs. + - in: query + name: hasNativeTokens + schema: + type: boolean + example: true + description: Filters outputs based on the presence of native tokens. + - in: query + name: minNativeTokenCount + schema: + type: integer + example: 2 + description: Filters outputs that have at least a certain number of distinct native tokens. + - in: query + name: maxNativeTokenCount + schema: + type: integer + example: 5 + description: Filters outputs that have at most a certain number of distinct native tokens. + - in: query + name: hasStorageDepositReturn + schema: + type: boolean + example: true + description: Filters outputs based on the presence of storage deposit return unlock condition. + - in: query + name: storageDepositReturnAddress + schema: + type: string + example: iota1qrhacyfwlcnzkvzteumekfkrrwks98mpdm37cj4xx3drvmjvnep6xqgyzyx + description: Filter outputs based on the presence of a specific return address in the storage deposit return + unlock condition. + - in: query + name: hasTimelock + schema: + type: boolean + example: true + description: Filters outputs based on the presence of timelock unlock condition. + - in: query + name: timelockedBefore + schema: + type: integer + example: 1643383242 + description: Return outputs that are timelocked before a certain Unix timestamp. + - in: query + name: timelockedAfter + schema: + type: integer + example: 1643383242 + description: Return outputs that are timelocked after a certain Unix timestamp. + - in: query + name: hasExpiration + schema: + type: boolean + example: true + description: Filters outputs based on the presence of expiration unlock condition. + - in: query + name: expiresBefore + schema: + type: integer + example: 1643383242 + description: Return outputs that expire before a certain Unix timestamp. + - in: query + name: expiresAfter + schema: + type: integer + example: 1643383242 + description: Return outputs that expire after a certain Unix timestamp. + - in: query + name: expirationReturnAddress + schema: + type: string + example: iota1qrhacyfwlcnzkvzteumekfkrrwks98mpdm37cj4xx3drvmjvnep6xqgyzyx + description: Filter outputs based on the presence of a specific return address in the expiration unlock + condition. + - in: query + name: sender + schema: + type: string + example: iota1qrhacyfwlcnzkvzteumekfkrrwks98mpdm37cj4xx3drvmjvnep6xqgyzyx + description: Filters outputs based on the presence of validated Sender (bech32 encoded). + - in: query + name: tag + schema: + type: string + example: "0x4ec7f23" + description: Filters outputs based on matching Tag Feature. + - in: query + name: createdBefore + schema: + type: integer + example: 1643383242 + description: Return outputs that were created before a certain Unix timestamp. + - in: query + name: createdAfter + schema: + type: integer + example: 1643383242 + description: Return outputs that were created after a certain Unix timestamp. + - in: query + name: pageSize + schema: + type: integer + example: 10 + description: The maximum amount of items returned in one call. If there are more items, a cursor to the next page is returned too. + The parameter is ignored when pageSize is defined via the cursor parameter. + - in: query + name: cursor + schema: + type: string + example: 0c78e998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a790200.10 + description: Starts the search from the cursor (confirmationMS+outputId.pageSize). + responses: + '200': + description: "Successful operation." + content: + application/json: + schema: + $ref: '#/components/schemas/OutputsResponse' + examples: + Query results in 3 outputs: + $ref: >- + #/components/examples/get-outputs-response-three-example + No matching outputIds found: + $ref: >- + #/components/examples/get-outputs-empty-response-example + Paging - more items found than it can fit on single page: + $ref: >- + #/components/examples/get-outputs-pagesize2-response-example + '400': + description: "Unsuccessful operation: indicates that the provided data is invalid." + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + '403': + description: "Unsuccessful operation: indicates that the endpoint is not available for public use." + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenResponse' + '500': + description: "Unsuccessful operation: indicates that an unexpected, internal server error happened which prevented the node from fulfilling the request." + content: + application/json: + schema: + $ref: '#/components/schemas/InternalErrorResponse' + + /api/indexer/v2/outputs/account: + get: + tags: + - account outputs + summary: Returns account outputs filtered based on parameters. + description: Returns account outputs filtered based on parameters. + parameters: + - in: query + name: stateController + schema: + type: string + example: iota1qrhacyfwlcnzkvzteumekfkrrwks98mpdm37cj4xx3drvmjvnep6xqgyzyx + description: Filter outputs based on bech32-encoded state controller address. + - in: query + name: governor + schema: + type: string + example: iota1qrhacyfwlcnzkvzteumekfkrrwks98mpdm37cj4xx3drvmjvnep6xqgyzyx + description: Filter outputs based on bech32-encoded governor (governance controller) address. + - in: query + name: issuer + schema: + type: string + example: iota1qrhacyfwlcnzkvzteumekfkrrwks98mpdm37cj4xx3drvmjvnep6xqgyzyx + description: Filters outputs based on bech32-encoded issuer address. + - in: query + name: sender + schema: + type: string + example: iota1qrhacyfwlcnzkvzteumekfkrrwks98mpdm37cj4xx3drvmjvnep6xqgyzyx + description: Filters outputs based on bech32-encoded sender address. + - in: query + name: hasNativeTokens + schema: + type: boolean + example: true + description: Filters outputs based on the presence of native tokens. + - in: query + name: minNativeTokenCount + schema: + type: integer + example: 2 + description: Filters outputs that have at least a certain number of distinct native tokens. + - in: query + name: maxNativeTokenCount + schema: + type: integer + example: 5 + description: Filters outputs that have at most a certain number of distinct native tokens. + - in: query + name: createdBefore + schema: + type: integer + example: 1643383242 + description: Return outputs that were created before a certain Unix timestamp. + - in: query + name: createdAfter + schema: + type: integer + example: 1643383242 + description: Return outputs that were created after a certain Unix timestamp. + - in: query + name: pageSize + schema: + type: integer + example: 10 + description: The maximum amount of items returned in one call. If there are more items, a cursor to the next page is returned too. + The parameter is ignored when pageSize is defined via the cursor parameter. + - in: query + name: cursor + schema: + type: string + example: 0c78e998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a790200.10 + description: Starts the search from the cursor (confirmationMS+outputId.pageSize). + responses: + '200': + description: "Successful operation." + content: + application/json: + schema: + $ref: '#/components/schemas/OutputsResponse' + examples: + Query results in 3 outputs: + $ref: >- + #/components/examples/get-outputs-response-three-example + No matching outputIds found: + $ref: >- + #/components/examples/get-outputs-empty-response-example + Paging - more items found than it can fit on single page: + $ref: >- + #/components/examples/get-outputs-pagesize2-response-example + '400': + description: "Unsuccessful operation: indicates that the provided data is invalid." + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + '403': + description: "Unsuccessful operation: indicates that the endpoint is not available for public use." + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenResponse' + '500': + description: "Unsuccessful operation: indicates that an unexpected, internal server error happened which prevented the node from fulfilling the request." + content: + application/json: + schema: + $ref: '#/components/schemas/InternalErrorResponse' + + /api/indexer/v2/outputs/account/{accountId}: + get: + tags: + - account outputs + summary: Returns the outputId of the current unspent account output for accountId. + description: Returns the outputId of the current unspent account output for accountId. + parameters: + - in: path + name: accountId + schema: + type: string + example: "0x1505ec099896ab05d9e08fbc7101ae4dff0093b3943b28f789ed2ca728bcc8d6" + description: Unique identifier of the account. + required: true + responses: + '200': + description: "Successful operation." + content: + application/json: + schema: + $ref: '#/components/schemas/OutputsResponse' + examples: + Query results in single output: + $ref: >- + #/components/examples/get-outputs-response-single-example + '400': + description: "Unsuccessful operation: indicates that the provided data is invalid." + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + '403': + description: "Unsuccessful operation: indicates that the endpoint is not available for public use." + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenResponse' + '404': + description: "Unsuccessful operation: indicates that the requested data was not found." + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + '500': + description: "Unsuccessful operation: indicates that an unexpected, internal server error happened which prevented the node from fulfilling the request." + content: + application/json: + schema: + $ref: '#/components/schemas/InternalErrorResponse' + + /api/indexer/v2/outputs/delegation: + get: + tags: + - delegation outputs + summary: Returns basic outputs filtered based on parameters. + description: Returns basic outputs filtered based on parameters. + parameters: + - in: query + name: address + schema: + type: string + example: iota1qrhacyfwlcnzkvzteumekfkrrwks98mpdm37cj4xx3drvmjvnep6xqgyzyx + description: The Bech32-encoded address that should be searched for in the Address Unlock Condition of outputs. + - in: query + name: validatorId + schema: + type: string + example: "0xf532a53545103276b46876c473846d98648ee418468bce76df4868648dd73e5d" + description: Filters outputs based on the account of the validator to which the output is delegating. + - in: query + name: createdBefore + schema: + type: integer + example: 1643383242 + description: Return outputs that were created before a certain Unix timestamp. + - in: query + name: createdAfter + schema: + type: integer + example: 1643383242 + description: Return outputs that were created after a certain Unix timestamp. + - in: query + name: pageSize + schema: + type: integer + example: 10 + description: The maximum amount of items returned in one call. If there are more items, a cursor to the next page is returned too. + The parameter is ignored when pageSize is defined via the cursor parameter. + - in: query + name: cursor + schema: + type: string + example: 0c78e998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a790200.10 + description: Starts the search from the cursor (confirmationMS+outputId.pageSize). + responses: + '200': + description: "Successful operation." + content: + application/json: + schema: + $ref: '#/components/schemas/OutputsResponse' + examples: + Query results in 3 outputs: + $ref: >- + #/components/examples/get-outputs-response-three-example + No matching outputIds found: + $ref: >- + #/components/examples/get-outputs-empty-response-example + Paging - more items found than it can fit on single page: + $ref: >- + #/components/examples/get-outputs-pagesize2-response-example + '400': + description: "Unsuccessful operation: indicates that the provided data is invalid." + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + '403': + description: "Unsuccessful operation: indicates that the endpoint is not available for public use." + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenResponse' + '500': + description: "Unsuccessful operation: indicates that an unexpected, internal server error happened which prevented the node from fulfilling the request." + content: + application/json: + schema: + $ref: '#/components/schemas/InternalErrorResponse' + + /api/indexer/v2/outputs/foundry: + get: + tags: + - foundry outputs + summary: Returns foundry outputs filtered based on parameters. + description: Returns foundry outputs filtered based on parameters. + parameters: + - in: query + name: accountAddress + schema: + type: string + example: iota1prlgpsht03ekmghhex8v7y67a835uns8dtlxu807hj0v279c74kj76j6rev + description: Filter foundry outputs based on bech32-encoded address of the controlling account. + - in: query + name: hasNativeTokens + schema: + type: boolean + example: true + description: Filters outputs based on the presence of native tokens. + - in: query + name: minNativeTokenCount + schema: + type: integer + example: 2 + description: Filters outputs that have at least a certain number of distinct native tokens. + - in: query + name: maxNativeTokenCount + schema: + type: integer + example: 5 + description: Filters outputs that have at most a certain number of distinct native tokens. + - in: query + name: createdBefore + schema: + type: integer + example: 1643383242 + description: Return outputs that were created before a certain Unix timestamp. + - in: query + name: createdAfter + schema: + type: integer + example: 1643383242 + description: Return outputs that were created after a certain Unix timestamp. + - in: query + name: pageSize + schema: + type: integer + example: 10 + description: The maximum amount of items returned in one call. If there are more items, a cursor to the next page is returned too. + The parameter is ignored when pageSize is defined via the cursor parameter. + - in: query + name: cursor + schema: + type: string + example: 0c78e998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a790200.10 + description: Starts the search from the cursor (confirmationMS+outputId.pageSize). + responses: + '200': + description: "Successful operation." + content: + application/json: + schema: + $ref: '#/components/schemas/OutputsResponse' + examples: + Query results in 3 outputs: + $ref: >- + #/components/examples/get-outputs-response-three-example + No matching outputIds found: + $ref: >- + #/components/examples/get-outputs-empty-response-example + Paging - more items found than it can fit on single page: + $ref: >- + #/components/examples/get-outputs-pagesize2-response-example + '400': + description: "Unsuccessful operation: indicates that the provided data is invalid." + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + '403': + description: "Unsuccessful operation: indicates that the endpoint is not available for public use." + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenResponse' + '500': + description: "Unsuccessful operation: indicates that an unexpected, internal server error happened which prevented the node from fulfilling the request." + content: + application/json: + schema: + $ref: '#/components/schemas/InternalErrorResponse' + + /api/indexer/v2/outputs/foundry/{foundryId}: + get: + tags: + - foundry outputs + summary: Returns the outputId of the current unspent foundry output for foundryId. + description: Returns the outputId of the current unspent foundry output for foundryId. + parameters: + - in: path + name: foundryId + schema: + type: string + example: "0x081505ec099896ab05d9e08fbc7101ae4dff0093b3943b28f789ed2ca728bcc8d60100000000" + description: Unique identifier of the foundry. + required: true + responses: + '200': + description: "Successful operation." + content: + application/json: + schema: + $ref: '#/components/schemas/OutputsResponse' + examples: + Query results in single outout: + $ref: >- + #/components/examples/get-outputs-response-single-example + '400': + description: "Unsuccessful operation: indicates that the provided data is invalid." + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + '403': + description: "Unsuccessful operation: indicates that the endpoint is not available for public use." + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenResponse' + '404': + description: "Unsuccessful operation: indicates that the requested data was not found." + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + '500': + description: "Unsuccessful operation: indicates that an unexpected, internal server error happened which prevented the node from fulfilling the request." + content: + application/json: + schema: + $ref: '#/components/schemas/InternalErrorResponse' + + /api/indexer/v2/outputs/nft: + get: + tags: + - nft outputs + summary: Returns nft outputs filtered based on parameters. + description: Returns nft outputs filtered based on parameters. + parameters: + - in: query + name: address + schema: + type: string + example: iota1qrhacyfwlcnzkvzteumekfkrrwks98mpdm37cj4xx3drvmjvnep6xqgyzyx + description: The Bech32-encoded address that should be searched for in the Address Unlock Condition of outputs. + - in: query + name: issuer + schema: + type: string + example: iota1qrhacyfwlcnzkvzteumekfkrrwks98mpdm37cj4xx3drvmjvnep6xqgyzyx + description: Filters outputs based on bech32-encoded issuer address. + - in: query + name: sender + schema: + type: string + example: iota1qrhacyfwlcnzkvzteumekfkrrwks98mpdm37cj4xx3drvmjvnep6xqgyzyx + description: Filters outputs based on the presence of validated Sender (bech32 encoded). + - in: query + name: hasNativeTokens + schema: + type: boolean + example: true + description: Filters outputs based on the presence of native tokens. + - in: query + name: minNativeTokenCount + schema: + type: integer + example: 2 + description: Filters outputs that have at least a certain number of distinct native tokens. + - in: query + name: maxNativeTokenCount + schema: + type: integer + example: 5 + description: Filters outputs that have at most a certain number of distinct native tokens. + - in: query + name: hasStorageDepositReturn + schema: + type: boolean + example: true + description: Filters outputs based on the presence of storage deposit return unlock condition. + - in: query + name: storageDepositReturnAddress + schema: + type: string + example: iota1qrhacyfwlcnzkvzteumekfkrrwks98mpdm37cj4xx3drvmjvnep6xqgyzyx + description: Filter outputs based on the presence of a specific return address in the storage deposit return + unlock condition. + - in: query + name: hasTimelock + schema: + type: boolean + example: true + description: Filters outputs based on the presence of timelock unlock condition. + - in: query + name: timelockedBefore + schema: + type: integer + example: 1643383242 + description: Return outputs that are timelocked before a certain Unix timestamp. + - in: query + name: timelockedAfter + schema: + type: integer + example: 1643383242 + description: Return outputs that are timelocked after a certain Unix timestamp. + - in: query + name: hasExpiration + schema: + type: boolean + example: true + description: Filters outputs based on the presence of expiration unlock condition. + - in: query + name: expiresBefore + schema: + type: integer + example: 1643383242 + description: Return outputs that expire before a certain Unix timestamp. + - in: query + name: expiresAfter + schema: + type: integer + example: 1643383242 + description: Return outputs that expire after a certain Unix timestamp. + - in: query + name: expirationReturnAddress + schema: + type: string + example: iota1qrhacyfwlcnzkvzteumekfkrrwks98mpdm37cj4xx3drvmjvnep6xqgyzyx + description: Filter outputs based on the presence of a specific return address in the expiration unlock + condition. + - in: query + name: tag + schema: + type: string + example: "0x4ec7f23" + description: Filters outputs based on matching Tag Feature. + - in: query + name: createdBefore + schema: + type: integer + example: 1643383242 + description: Return outputs that were created before a certain Unix timestamp. + - in: query + name: createdAfter + schema: + type: integer + example: 1643383242 + description: Return outputs that were created after a certain Unix timestamp. + - in: query + name: pageSize + schema: + type: integer + example: 10 + description: The maximum amount of items returned in one call. If there are more items, a cursor to the next page is returned too. + The parameter is ignored when pageSize is defined via the cursor parameter. + - in: query + name: cursor + schema: + type: string + example: 0c78e998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a790200.10 + description: Starts the search from the cursor (confirmationMS+outputId.pageSize). + responses: + '200': + description: "Successful operation." + content: + application/json: + schema: + $ref: '#/components/schemas/OutputsResponse' + examples: + Query results in 3 outputs: + $ref: >- + #/components/examples/get-outputs-response-three-example + No matching outputIds found: + $ref: >- + #/components/examples/get-outputs-empty-response-example + Paging - more items found than it can fit on single page: + $ref: >- + #/components/examples/get-outputs-pagesize2-response-example + '400': + description: "Unsuccessful operation: indicates that the provided data is invalid." + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + '403': + description: "Unsuccessful operation: indicates that the endpoint is not available for public use." + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenResponse' + '500': + description: "Unsuccessful operation: indicates that an unexpected, internal server error happened which prevented the node from fulfilling the request." + content: + application/json: + schema: + $ref: '#/components/schemas/InternalErrorResponse' + + /api/indexer/v2/outputs/nft/{nftId}: + get: + tags: + - nft outputs + summary: Returns the outputId of the current unspent nft output for nftId. + description: Returns the outputId of the current nft output for nftId. + parameters: + - in: path + name: nftId + schema: + type: string + example: "0x19c82b32761fd8729a1a6c77f7c17597e4b9b01759794e52381f6a0050b0c11f" + description: Unique identifier of the nft. + required: true + responses: + '200': + description: "Successful operation." + content: + application/json: + schema: + $ref: '#/components/schemas/OutputsResponse' + examples: + Query results in single outout: + $ref: >- + #/components/examples/get-outputs-response-single-example + '400': + description: "Unsuccessful operation: indicates that the provided data is invalid." + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + '403': + description: "Unsuccessful operation: indicates that the endpoint is not available for public use." + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenResponse' + '404': + description: "Unsuccessful operation: indicates that the requested data was not found." + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + '500': + description: "Unsuccessful operation: indicates that an unexpected, internal server error happened which prevented the node from fulfilling the request." + content: + application/json: + schema: + $ref: '#/components/schemas/InternalErrorResponse' +components: + examples: + get-outputs-response-three-example: + value: + ledgerIndex: 101 + items: + - "0x0c78e998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a790000" + - "0x0c78e998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a790100" + - "0x0c78e998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a790200" + get-outputs-response-single-example: + value: + ledgerIndex: 101 + items: + - "0x0c78e998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a790000" + get-outputs-empty-response-example: + value: + ledgerIndex: 101 + items: + - + get-outputs-pagesize2-response-example: + value: + ledgerIndex: 101 + cursor: 61fa44a14d35ce14b9d0e7ee6ac9af70c0af156be269f69348be6d6f83c80a3a8a44ce440000.2 + items: + - "0x0c78e998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a790000" + - "0x0c78e998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a790100" + + get-account-response-example: + value: + + schemas: + ErrorResponse: + description: The error format. + properties: + error: + type: object + properties: + code: + type: string + description: The application error code. + message: + type: string + description: The error reason. + required: + - code + - message + required: + - error + + ForbiddenResponse: + description: Indicates that this endpoint is not available for public use. + allOf: + - $ref: '#/components/schemas/ErrorResponse' + example: + error: + code: 403 + message: not available for public use + + ServiceUnavailableResponse: + description: Indicates that the service is unavailable. + allOf: + - $ref: '#/components/schemas/ErrorResponse' + example: + error: + code: 503 + message: service unavailable + + BadRequestResponse: + description: Indicates that the request was bad. + allOf: + - $ref: '#/components/schemas/ErrorResponse' + example: + error: + code: 400 + message: invalid data provided + + NotFoundResponse: + description: Indicates that the data was not found. + allOf: + - $ref: '#/components/schemas/ErrorResponse' + example: + error: + code: 404 + message: could not find data + + InternalErrorResponse: + description: Indicates that the server encountered an unexpected condition, which prevented it from fulfilling the request by the client. + allOf: + - $ref: '#/components/schemas/ErrorResponse' + example: + error: + code: 500 + message: internal server error + + OutputsResponse: + description: Returns a list of OutputIds. + properties: + ledgerIndex: + type: integer + description: The current ledger index for which the request was made. + cursor: + type: string + description: The cursor to use for getting the next page of results. + nullable: true + items: + type: array + description: The output IDs (transaction hash + output index) of the outputs satisfying the query. Hex-encoded with 0x prefix. + items: + type: string + required: + - ledgerIndex + - items + From 1867897745322b6d815b3d86a4e9ff049d30d957 Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Wed, 19 Jul 2023 09:58:09 +0800 Subject: [PATCH 04/92] Add an endpoint to get BICs and align to implementation --- tips/TIPS-API/openapi3-core.yaml | 115 ++++++++++++++++++++++++++++--- 1 file changed, 107 insertions(+), 8 deletions(-) diff --git a/tips/TIPS-API/openapi3-core.yaml b/tips/TIPS-API/openapi3-core.yaml index 45804fe33..97209b79b 100644 --- a/tips/TIPS-API/openapi3-core.yaml +++ b/tips/TIPS-API/openapi3-core.yaml @@ -103,6 +103,63 @@ paths: schema: $ref: '#/components/schemas/InternalErrorResponse' + '/api/core/v3/accounts/{accountId}': + get: + tags: + - accounts + summary: Get Block Issuance Credits balance for an account of the given slot index. + description: >- + Get Block Issuance Credits balance for an account of the given slot index. If slot index is not provided, current slot index will be used. + parameters: + - in: path + name: accountId + schema: + type: string + example: "0xf532a53545103276b46876c473846d98648ee418468bce76df4868648dd73e5d" + required: true + description: Identifier of the account. + - in: query + name: slotIndex + schema: + type: integer + example: 1622568540 + required: false + description: The slot index for which the Block Issuance Credits balance should be returned. + responses: + '200': + description: "Successful operation." + content: + application/json: + schema: + $ref: '#/components/schemas/BlockIssuanceCreditResponse' + examples: + BlockIssuanceCreditResponse: + $ref: '#/components/examples/get-block-issuance-credits-response-example' + '400': + description: "Unsuccessful operation: indicates that the provided data is invalid." + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + '403': + description: "Unsuccessful operation: indicates that the endpoint is not available for public use." + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenResponse' + '500': + description: "Unsuccessful operation: indicates that an unexpected, internal server error happened which prevented the node from fulfilling the request." + content: + application/json: + schema: + $ref: '#/components/schemas/InternalErrorResponse' + '503': + description: "Unsuccessful operation: indicates that the node is not synced." + content: + application/json: + schema: + $ref: '#/components/schemas/ServiceUnavailableResponse' + '/api/core/v3/accounts/{accountId}/congestion': get: tags: @@ -1286,29 +1343,30 @@ components: get-committee-example: value: + epochIndex: 100 totalStake: 900000000 totalValidatorStake: 60000000 - validators: + committee: - accountId: "0x309b169bfa60c8cf80afd730741862d200405d5df7cabfe9b564361dce1f7036" poolStake: 200000 validatorStake: 100000 fixedCost: 50000 - latestSupportedProtocolVersion: 3 - accountId: "0x897dr69bfa60c8cf80afd730741862d200405d5df7cabfe9b564361dce1f7036" poolStake: 205000 validatorStake: 90000 fixedCost: 52000 - latestSupportedProtocolVersion: 3 get-staker-list-example: value: stakers: - accountId: "0x309b169bfa60c8cf80afd730741862d200405d5df7cabfe9b564361dce1f7036" + stakingEpochEnd: 100 poolStake: 200000 validatorStake: 100000 fixedCost: 50000 latestSupportedProtocolVersion: 3 - accountId: "0x897dr69bfa60c8cf80afd730741862d200405d5df7cabfe9b564361dce1f7036" + stakingEpochEnd: 100 poolStake: 205000 validatorStake: 90000 fixedCost: 52000 @@ -1317,6 +1375,7 @@ components: get-staker-example: value: accountId: "0x897dr69bfa60c8cf80afd730741862d200405d5df7cabfe9b564361dce1f7036" + stakingEpochEnd: 100 poolStake: 205000 validatorStake: 90000 fixedCost: 52000 @@ -1324,9 +1383,14 @@ components: get-account-rewards-example: value: - currentEpochIndex: 60 + epochIndex: 60 rewards: 800000 + get-block-issuance-credits-response-example: + value: + slotIndex: 20 + blockIssuanceCredits: 10000000 + get-congestion-estimate-response-example: value: slotIndex: 20 @@ -2728,9 +2792,9 @@ components: ManaRewardsResponse: description: Returns the mana rewards of an account or delegation output. properties: - currentEpochIndex: + epochIndex: type: integer - description: The epoch index of current time. + description: The epoch index for which the mana rewards are returned. rewards: type: integer description: The amount of totally available rewards the requested output may claim. @@ -2746,18 +2810,37 @@ components: CommitteeResponse: description: Returns the validator information of the committee. properties: + epochIndex: + type: integer + description: The epoch index of the committee. totalStake: type: integer description: The total amount of delegated and staked IOTA tokens in the selected committee. totalValidatorStake: type: integer description: The total amount of staked IOTA tokens in the selected committee. - validators: + committee: type: array description: The validators of the committee. items: oneOf: - - $ref: '#/components/schemas/Validator' + - $ref: '#/components/schemas/CommitteeMemeber' + + CommitteeMemeber: + description: Returns information of a validator. + properties: + accountId: + type: string + description: The account identifier of the validator + poolStake: + type: integer + description: The total stake of the pool, including delegators. + validatorStake: + type: integer + description: The stake of a validator. + fixedCost: + type: integer + description: The fixed cost of the validator, which it receives as part of its Mana rewards. Validator: description: Returns information of a validator. @@ -2765,6 +2848,9 @@ components: accountId: type: string description: The account identifier of the validator + stakingEpochEnd: + type: integer + description: The epoch index until which the validator registered to stake. poolStake: type: integer description: The total stake of the pool, including delegators. @@ -2802,6 +2888,19 @@ components: commitment: $ref: '#/components/schemas/Commitment' + BlockIssuanceCreditResponse: + description: Provides the cost and readiness to issue estimates. + properties: + slotIndex: + type: integer + description: The slot index for which the Block Issuance Credits estimate is provided. + blockIssuanceCredits: + type: integer + description: The Block Issuance Credits of the requested account. + required: + - slotIndex + - blockIssuanceCredits + CongestionResponse: description: Provides the cost and readiness to issue estimates. properties: From 8006936b9b322f4fac39b94277b52130d2838e37 Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Wed, 19 Jul 2023 17:18:25 +0800 Subject: [PATCH 05/92] Update info response --- tips/TIPS-API/openapi3-core.yaml | 94 +++++++++++++++++++------------- 1 file changed, 56 insertions(+), 38 deletions(-) diff --git a/tips/TIPS-API/openapi3-core.yaml b/tips/TIPS-API/openapi3-core.yaml index 97209b79b..17d8b6bde 100644 --- a/tips/TIPS-API/openapi3-core.yaml +++ b/tips/TIPS-API/openapi3-core.yaml @@ -1091,18 +1091,17 @@ components: value: name: Example Node version: 1.0.0 - accountId: "0x11a37a8e65fe5dca25cbeb896000eca615eaf88b97ca8dc70d8b1839b53dbf1c" status: isHealthy: true - lastAcceptedBlockId: "0x8d6f3b6e3a63ce388d2eb8c927c5b9ba328b0e427ae727d8b3dddc429f6fb24a0000000000000000" - lastConfirmedBlockId: "0x59daaaba1cd10cd268966376e17710d100c90826fe258753d461acac99b7e3341500000000000000" - finalizedSlot: 100 acceptedTangleTime: 1682328545 relativeAcceptedTangleTime: 1682328550 confirmedTangleTime: 1682328525 relativeConfirmedTangleTime: 1682328535 latestCommittedSlot: 107 + latestFinalizedSlot: 100 pruningSlot: 20 + latestAcceptedBlockId: "0x8d6f3b6e3a63ce388d2eb8c927c5b9ba328b0e427ae727d8b3dddc429f6fb24a0000000000000000" + latestConfirmedBlockId: "0x59daaaba1cd10cd268966376e17710d100c90826fe258753d461acac99b7e3341500000000000000" metrics: blocksPerSecond: 17 confirmedBlocksPerSecond: 16.2 @@ -1111,18 +1110,33 @@ components: - 2 - 3 protocol: - networkName: iota-core-testnet - bech32Hrp: rms - tokenSupply: "2779530283277761" version: 3 - minPowScore: 1000 - belowMaxDepth: 15 + networkName: iota-core-testnet + bech32Hrp: rms rentStructure: vByteCost: 500 vByteFactorData: 1 vByteFactorKey: 10 + tokenSupply: "2779530283277761" genesisUnixTimestamp: 1582328545 slotDurationInSeconds: 10 + slotsPerEpochExponent: 13 + manaGenerationRate: 1 + manaGenerationRateExponent: 0 + manaDecayFactors: + - 10 + - 20 + manaDecayFactorsExponent: 0 + manaDecayFactorEpochsSum: 0 + manaDecayFactorEpochsSumExponent: 0 + stakingUnbondingPeriod: 10 + evictionAge: 6 + livenessThreshold: 5 + epochNearingThreshold: 30 + versionSignaling: + windowSize: 7 + windowTargetRatio: 5 + activationOffset: 7 baseToken: baseToken: name: "Shimmer" @@ -2580,25 +2594,13 @@ components: description: The name of the node. version: type: string - description: The semantic version of the node. - accountId: - type: string - description: The account identifier of the node. + description: The semantic version of the node. status: description: Status of the node. properties: isHealthy: type: boolean description: Tells whether the node is healthy or not. - lastAcceptedBlockId: - description: The identifier of the latest accepted block. - type: string - lastConfirmedBlockId: - description: The identifier of the latest confirmed block. - type: string - finalizedSlot: - description: The index of latest confirmed slot. - type: integer acceptedTangleTime: description: A notion of time that is anchored to the latest accepted block. type: integer @@ -2613,14 +2615,23 @@ components: type: integer latestCommittedSlot: type: object - description: The latest slot that the node has committed to. + description: The latest slot that the node has committed to. + latestFinalizedSlot: + description: The index of latest confirmed slot. + type: integer pruningSlot: type: integer description: The index of the slot before which the tangle history is pruned. + latestAcceptedBlockId: + description: The identifier of the latest accepted block. + type: string + latestConfirmedBlockId: + description: The identifier of the latest confirmed block. + type: string required: - isHealthy - latestCommittedSlot - - finalizedSlot + - latestFinalizedSlot - pruningSlot metrics: description: Node metrics. @@ -2649,22 +2660,15 @@ components: protocol: description: Protocol parameters. properties: + version: + type: integer + description: Protocol version used by the network. networkName: type: string description: The Name of the network from which the networkId is derived. bech32Hrp: type: string description: Tells whether the node supports mainnet or testnet addresses. Value `iota` indicates that the node supports mainnet addresses. Value `atoi` indicates that the node supports testnet addresses. - tokenSupply: - type: string - description: Current supply of base token. Plain string encoded number. - version: - type: integer - description: Protocol version used by the network. - minPowScore: - description: The Proof-of-Work difficulty for a block to be sent over the network to mitigate spam. - type: number - format: float rentStructure: description: The rent structure according to TIP-19. properties: @@ -2681,6 +2685,9 @@ components: - vByteCost - vByteFactorData - vByteFactoKey + tokenSupply: + type: string + description: Current supply of base token. Plain string encoded number. genesisUnixTimestamp: type: integer description: The genesis timestamp at which the slots start to count. @@ -2722,15 +2729,26 @@ components: epochNearingThreshold: type: number description: Determine the slot that should trigger a new committee selection for the next and upcoming epoch. + versionSignaling: + description: The version signaling parameters. + properties: + windowSize: + type: number + windowTargetRatio: + type: number + activationOffset: + type: number + required: + - windowSize + - windowTargetRatio + - activationOffset required: + - version - networkName - bech32Hrp - tokenSupply - - protocolVersion - - minPowScore - rentStructure - - version - - genesisSlotIndex + - genesisUnixTimestamp - slotDurationInSeconds - epochNearingThreshold baseToken: From c808f5b16416d6cc027db985f81ed8da9805daf3 Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Mon, 24 Jul 2023 14:25:01 +0800 Subject: [PATCH 06/92] Remove BIC endpoint --- tips/TIPS-API/openapi3-core.yaml | 75 -------------------------------- 1 file changed, 75 deletions(-) diff --git a/tips/TIPS-API/openapi3-core.yaml b/tips/TIPS-API/openapi3-core.yaml index 17d8b6bde..ac5d9c614 100644 --- a/tips/TIPS-API/openapi3-core.yaml +++ b/tips/TIPS-API/openapi3-core.yaml @@ -103,63 +103,6 @@ paths: schema: $ref: '#/components/schemas/InternalErrorResponse' - '/api/core/v3/accounts/{accountId}': - get: - tags: - - accounts - summary: Get Block Issuance Credits balance for an account of the given slot index. - description: >- - Get Block Issuance Credits balance for an account of the given slot index. If slot index is not provided, current slot index will be used. - parameters: - - in: path - name: accountId - schema: - type: string - example: "0xf532a53545103276b46876c473846d98648ee418468bce76df4868648dd73e5d" - required: true - description: Identifier of the account. - - in: query - name: slotIndex - schema: - type: integer - example: 1622568540 - required: false - description: The slot index for which the Block Issuance Credits balance should be returned. - responses: - '200': - description: "Successful operation." - content: - application/json: - schema: - $ref: '#/components/schemas/BlockIssuanceCreditResponse' - examples: - BlockIssuanceCreditResponse: - $ref: '#/components/examples/get-block-issuance-credits-response-example' - '400': - description: "Unsuccessful operation: indicates that the provided data is invalid." - content: - application/json: - schema: - $ref: '#/components/schemas/BadRequestResponse' - '403': - description: "Unsuccessful operation: indicates that the endpoint is not available for public use." - content: - application/json: - schema: - $ref: '#/components/schemas/ForbiddenResponse' - '500': - description: "Unsuccessful operation: indicates that an unexpected, internal server error happened which prevented the node from fulfilling the request." - content: - application/json: - schema: - $ref: '#/components/schemas/InternalErrorResponse' - '503': - description: "Unsuccessful operation: indicates that the node is not synced." - content: - application/json: - schema: - $ref: '#/components/schemas/ServiceUnavailableResponse' - '/api/core/v3/accounts/{accountId}/congestion': get: tags: @@ -1400,11 +1343,6 @@ components: epochIndex: 60 rewards: 800000 - get-block-issuance-credits-response-example: - value: - slotIndex: 20 - blockIssuanceCredits: 10000000 - get-congestion-estimate-response-example: value: slotIndex: 20 @@ -2906,19 +2844,6 @@ components: commitment: $ref: '#/components/schemas/Commitment' - BlockIssuanceCreditResponse: - description: Provides the cost and readiness to issue estimates. - properties: - slotIndex: - type: integer - description: The slot index for which the Block Issuance Credits estimate is provided. - blockIssuanceCredits: - type: integer - description: The Block Issuance Credits of the requested account. - required: - - slotIndex - - blockIssuanceCredits - CongestionResponse: description: Provides the cost and readiness to issue estimates. properties: From 5169cc71a07081cf0fbde210053b219403035bb9 Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Wed, 26 Jul 2023 15:51:13 +0800 Subject: [PATCH 07/92] Replace Unix timestamp with slot index in indexer --- tips/TIPS-API/openapi3-indexer.yaml | 72 ++++++++++++++--------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/tips/TIPS-API/openapi3-indexer.yaml b/tips/TIPS-API/openapi3-indexer.yaml index 5345da3ed..1443328a7 100644 --- a/tips/TIPS-API/openapi3-indexer.yaml +++ b/tips/TIPS-API/openapi3-indexer.yaml @@ -79,14 +79,14 @@ paths: name: timelockedBefore schema: type: integer - example: 1643383242 - description: Return outputs that are timelocked before a certain Unix timestamp. + example: 150 + description: Return outputs that are timelocked before a certain slot index. - in: query name: timelockedAfter schema: type: integer - example: 1643383242 - description: Return outputs that are timelocked after a certain Unix timestamp. + example: 200 + description: Return outputs that are timelocked after a certain slot index. - in: query name: hasExpiration schema: @@ -97,14 +97,14 @@ paths: name: expiresBefore schema: type: integer - example: 1643383242 - description: Return outputs that expire before a certain Unix timestamp. + example: 200 + description: Return outputs that expire before a certain slot index. - in: query name: expiresAfter schema: type: integer - example: 1643383242 - description: Return outputs that expire after a certain Unix timestamp. + example: 200 + description: Return outputs that expire after a certain slot index. - in: query name: expirationReturnAddress schema: @@ -128,14 +128,14 @@ paths: name: createdBefore schema: type: integer - example: 1643383242 - description: Return outputs that were created before a certain Unix timestamp. + example: 200 + description: Return outputs that were created before a certain slot index. - in: query name: createdAfter schema: type: integer - example: 1643383242 - description: Return outputs that were created after a certain Unix timestamp. + example: 200 + description: Return outputs that were created after a certain slot index. - in: query name: pageSize schema: @@ -238,14 +238,14 @@ paths: name: createdBefore schema: type: integer - example: 1643383242 - description: Return outputs that were created before a certain Unix timestamp. + example: 200 + description: Return outputs that were created before a certain slot index. - in: query name: createdAfter schema: type: integer - example: 1643383242 - description: Return outputs that were created after a certain Unix timestamp. + example: 200 + description: Return outputs that were created after a certain slot index. - in: query name: pageSize schema: @@ -368,14 +368,14 @@ paths: name: createdBefore schema: type: integer - example: 1643383242 - description: Return outputs that were created before a certain Unix timestamp. + example: 200 + description: Return outputs that were created before a certain slot index. - in: query name: createdAfter schema: type: integer - example: 1643383242 - description: Return outputs that were created after a certain Unix timestamp. + example: 200 + description: Return outputs that were created after a certain slot index. - in: query name: pageSize schema: @@ -460,14 +460,14 @@ paths: name: createdBefore schema: type: integer - example: 1643383242 - description: Return outputs that were created before a certain Unix timestamp. + example: 200 + description: Return outputs that were created before a certain slot index. - in: query name: createdAfter schema: type: integer - example: 1643383242 - description: Return outputs that were created after a certain Unix timestamp. + example: 200 + description: Return outputs that were created after a certain slot index. - in: query name: pageSize schema: @@ -633,14 +633,14 @@ paths: name: timelockedBefore schema: type: integer - example: 1643383242 - description: Return outputs that are timelocked before a certain Unix timestamp. + example: 200 + description: Return outputs that are timelocked before a certain slot index. - in: query name: timelockedAfter schema: type: integer - example: 1643383242 - description: Return outputs that are timelocked after a certain Unix timestamp. + example: 200 + description: Return outputs that are timelocked after a certain slot index. - in: query name: hasExpiration schema: @@ -651,14 +651,14 @@ paths: name: expiresBefore schema: type: integer - example: 1643383242 - description: Return outputs that expire before a certain Unix timestamp. + example: 200 + description: Return outputs that expire before a certain slot index. - in: query name: expiresAfter schema: type: integer - example: 1643383242 - description: Return outputs that expire after a certain Unix timestamp. + example: 200 + description: Return outputs that expire after a certain slot index. - in: query name: expirationReturnAddress schema: @@ -676,14 +676,14 @@ paths: name: createdBefore schema: type: integer - example: 1643383242 - description: Return outputs that were created before a certain Unix timestamp. + example: 200 + description: Return outputs that were created before a certain slot index. - in: query name: createdAfter schema: type: integer - example: 1643383242 - description: Return outputs that were created after a certain Unix timestamp. + example: 200 + description: Return outputs that were created after a certain slot index. - in: query name: pageSize schema: From c600bff9449022edd725c0c01af68f129d3a4005 Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Mon, 31 Jul 2023 14:07:31 +0800 Subject: [PATCH 08/92] Align to latest info response --- tips/TIPS-API/openapi3-core.yaml | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/tips/TIPS-API/openapi3-core.yaml b/tips/TIPS-API/openapi3-core.yaml index ac5d9c614..7b75ef838 100644 --- a/tips/TIPS-API/openapi3-core.yaml +++ b/tips/TIPS-API/openapi3-core.yaml @@ -164,7 +164,7 @@ paths: get: tags: - rewards - summary: Returns the totally available Mana rewards of an account or delegation output. + summary: Returns the totally available Mana rewards of an account or delegation output. description: >- Returns the totally available Mana rewards of an account or delegation output up until the current epoch index. Note that rewards for an epoch only become available at the beginning of the next epoch. If the end epoch of a staking feature is equal or greater than the current epoch, the rewards response will not include the potential future rewards for those epochs. parameters: @@ -184,7 +184,7 @@ paths: $ref: '#/components/schemas/ManaRewardsResponse' examples: CongestionResponse: - $ref: '#/components/examples/get-account-rewards-example' + $ref: '#/components/examples/get-mana-rewards-example' '400': description: "Unsuccessful operation: indicates that the provided data is invalid." content: @@ -1040,11 +1040,11 @@ components: relativeAcceptedTangleTime: 1682328550 confirmedTangleTime: 1682328525 relativeConfirmedTangleTime: 1682328535 - latestCommittedSlot: 107 + latestCommitmentID: "0x8fb6cbb1ecf02c6b5a6a5a6a5f6c5a6a5f6c5a6a5a6a5a6a5f6c5a6a5a6a5f6c50000000000000000" latestFinalizedSlot: 100 pruningSlot: 20 - latestAcceptedBlockId: "0x8d6f3b6e3a63ce388d2eb8c927c5b9ba328b0e427ae727d8b3dddc429f6fb24a0000000000000000" - latestConfirmedBlockId: "0x59daaaba1cd10cd268966376e17710d100c90826fe258753d461acac99b7e3341500000000000000" + latestAcceptedBlockSlot: 100 + latestConfirmedBlockSlot: 95 metrics: blocksPerSecond: 17 confirmedBlocksPerSecond: 16.2 @@ -1338,7 +1338,7 @@ components: fixedCost: 52000 latestSupportedProtocolVersion: 3 - get-account-rewards-example: + get-mana-rewards-example: value: epochIndex: 60 rewards: 800000 @@ -2551,8 +2551,8 @@ components: relativeConfirmedTangleTime: description: The Confirmed Tangle Time after it has advanced with the system clock. type: integer - latestCommittedSlot: - type: object + latestCommitmentId: + type: string description: The latest slot that the node has committed to. latestFinalizedSlot: description: The index of latest confirmed slot. @@ -2560,15 +2560,15 @@ components: pruningSlot: type: integer description: The index of the slot before which the tangle history is pruned. - latestAcceptedBlockId: - description: The identifier of the latest accepted block. - type: string - latestConfirmedBlockId: - description: The identifier of the latest confirmed block. + latestAcceptedBlockSlot: + description: The slot index of the latest accepted block. + type: integer + latestConfirmedBlockSlot: + description: The slot index of the latest confirmed block. type: string required: - isHealthy - - latestCommittedSlot + - latestCommitmentId - latestFinalizedSlot - pruningSlot metrics: From aca7631214b2f45d35f446a91256f9484fc4d303 Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Mon, 31 Jul 2023 20:45:58 +0800 Subject: [PATCH 09/92] Update BlockMetadata response --- tips/TIPS-API/openapi3-core.yaml | 91 ++++++++++++-------------------- 1 file changed, 34 insertions(+), 57 deletions(-) diff --git a/tips/TIPS-API/openapi3-core.yaml b/tips/TIPS-API/openapi3-core.yaml index 7b75ef838..91d430d4c 100644 --- a/tips/TIPS-API/openapi3-core.yaml +++ b/tips/TIPS-API/openapi3-core.yaml @@ -1116,49 +1116,31 @@ components: get-block-by-id-response-example-new-transaction: value: blockId: "0x8e7c2d36c236f7d44f26cf8c70b3d99e18e7d7390b32c9637c08c086d9475e6a" - strongParents: - - "0x1e9d7f2e12552f84db6de00d57d25c7fa037fca5c31b5a354b9e6d2f6d84a6db" - - "0x6c91ee6f97a8a04ec92f9a6907baa32bca3c7cb15e83e0070ef0ba4f3f3a2e47" blockState: "pending" txState: "pending" - reissuePayload: false get-block-by-id-response-example-new: value: blockId: "0x8e7c2d36c236f7d44f26cf8c70b3d99e18e7d7390b32c9637c08c086d9475e6a" - strongParents: - - "0x1e9d7f2e12552f84db6de00d57d25c7fa037fca5c31b5a354b9e6d2f6d84a6db" - - "0x6c91ee6f97a8a04ec92f9a6907baa32bca3c7cb15e83e0070ef0ba4f3f3a2e47" blockState: "pending" - reissuePayload: false get-block-by-id-response-example-confirmed-transaction: value: blockId: "0x8e7c2d36c236f7d44f26cf8c70b3d99e18e7d7390b32c9637c08c086d9475e6a" - strongParents: - - "0x1e9d7f2e12552f84db6de00d57d25c7fa037fca5c31b5a354b9e6d2f6d84a6db" - - "0x6c91ee6f97a8a04ec92f9a6907baa32bca3c7cb15e83e0070ef0ba4f3f3a2e47" blockState: "confirmed" txState: "confirmed" get-block-by-id-response-example-confirmed: value: blockId: "0x8e7c2d36c236f7d44f26cf8c70b3d99e18e7d7390b32c9637c08c086d9475e6a" - strongParents: - - "0x1e9d7f2e12552f84db6de00d57d25c7fa037fca5c31b5a354b9e6d2f6d84a6db" - - "0x6c91ee6f97a8a04ec92f9a6907baa32bca3c7cb15e83e0070ef0ba4f3f3a2e47" blockState: "confirmed" get-block-by-id-response-example-conflicting-transaction: value: blockId: "0x8e7c2d36c236f7d44f26cf8c70b3d99e18e7d7390b32c9637c08c086d9475e6a" - strongParents: - - "0x1e9d7f2e12552f84db6de00d57d25c7fa037fca5c31b5a354b9e6d2f6d84a6db" - - "0x6c91ee6f97a8a04ec92f9a6907baa32bca3c7cb15e83e0070ef0ba4f3f3a2e47" - blockState: "pending" - txState: "pending" - blockStateReason: 1 - txStateReason: 5 + blockState: "confirmed" + txState: "failed" + txFailureReason: 2 post-tagged-data-block-request-example-minimal: value: @@ -2955,68 +2937,63 @@ components: blockId: type: string description: The identifier of the block. Hex-encoded with 0x prefix. - strongParents: - type: array - description: The identifiers of the blocks this block references. Hex-encoded data with 0x prefix. - items: - type: string - weakParents: - type: array - description: The identifiers of the blocks this block references. Hex-encoded data with 0x prefix. - items: - type: string - shallowLikeParents: - type: array - description: The identifiers of the blocks this block references. Hex-encoded data with 0x prefix. - items: - type: string blockState: type: string enum: - pending - confirmed - finalized - description: If `pending`, the block is stored but not confirmed. If `confirmed`, the block is confirmed with the first level of knowledge. If `finalized`, the block is included and cannot be reverted anymore. + - rejected + - failed + description: If `pending`, the block is stored but not confirmed. If `confirmed`, the block is confirmed with the first level of knowledge. If `finalized`, the block is included and cannot be reverted anymore. If `rejected`, the block is rejected by the node, and user should reissue payload if it contains one. If `failed`, the block is not successfully issued due to failure reason. txState: type: string enum: - pending - confirmed - finalized - description: If 'pending', the block contains not yet included transaction. If 'confirmed' means transaction is confirmed with the first level of knowledge. If 'finalized' means transaction is included and cannot be reverted anymore. - blockStateReason: + - failed + description: If 'pending', the block contains not yet included transaction. If 'confirmed' means transaction is confirmed with the first level of knowledge. If 'finalized' means transaction is included and cannot be reverted anymore. If 'failed' means transaction is not successfully issued due to failure reason. + blockFailureReason: type: integer enum: [1,2,3] description: > Values: - * `1` - denotes that the block is invalid. - * `2` - denotes that the block is orphaned due to congestion control. - * `3` - denotes that the block is orphaned due to negative mana balance. + * `1` - denotes that the block is too old to issue. + * `2` - denotes that the block's parents are too old. + * `3` - denotes that the block failed at the booker. + * `4` - denotes that the block is dropped due to congestion. + * `5` - denotes that the block is invalid. * Note: more reasons will be added. - txStateReason: + txFailureReason: type: integer enum: [1,2,3,4,5,6,7,8,9,10,11,12,255] description: > Values: * `1` - denotes that the referenced UTXO was already spent. * `2` - denotes that the transaction is conflicting with another transaction. Conflicting specifically means a double spend situation that both transaction pass all validation rules, eventually losing one(s) should have this reason. - * `3` - denotes that the referenced UTXO cannot be found. - * `4` - denotes that the sum of the inputs and output values does not match. - * `5` - denotes that the unlock block signature is invalid. - * `6` - denotes that the configured timelock is not yet expired. - * `7` - denotes that the given native tokens are invalid. - * `8` - denotes that the return amount in a transaction is not fulfilled by the output side. - * `9` - denotes that the input unlock is invalid. - * `10` - denotes that the inputs commitment is invalid. - * `11` - denotes that an output contains a Sender with an ident (address) which is not unlocked. - * `12` - denotes that the chain state transition is invalid. + * `3` - denotes that the referenced UTXO is invalid. + * `4` - denotes that the transaction is invalid. + * `5` - denotes that the sum of the inputs and output values does not match. + * `6` - denotes that the unlock block signature is invalid. + * `7` - denotes that the configured timelock is not yet expired. + * `8` - denotes that the given native tokens are invalid. + * `9` - denotes that the return amount in a transaction is not fulfilled by the output side. + * `10` - denotes that the input unlock is invalid. + * `11` - denotes that the inputs commitment is invalid. + * `12` - denotes that an output contains a Sender with an ident (address) which is not unlocked. + * `13` - denotes that the chain state transition is invalid. + * `14` - denotes that the referenced input is created after transaction issuing time. + * `15` - denotes that the mana amount is invalid. + * `16` - denotes that the Block Issuance Credits amount is invalid. + * `17` - denotes that Reward Input is invalid. + * `18` - denotes that Commitment Input is invalid. + * `19` - denotes that Staking Feature is not provided in account output when claiming rewards. + * `20` - denotes that fail to claim staking reward. + * `21` - denotes that fail to claim delegation reward. * `255` - denotes that the semantic validation failed. - reissuePayload: - type: boolean - description: Tells if the payload should be issued again. required: - blockId - - strongParents BlockResponse: description: Returns a given block. From 8fc31ef97c157be531ddb07b78e47ef52a72ead4 Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Mon, 31 Jul 2023 21:46:55 +0800 Subject: [PATCH 10/92] Update Block response to iota.go --- tips/TIPS-API/openapi3-core.yaml | 323 ++++++++++++++++++------------- 1 file changed, 192 insertions(+), 131 deletions(-) diff --git a/tips/TIPS-API/openapi3-core.yaml b/tips/TIPS-API/openapi3-core.yaml index 91d430d4c..c3242dc82 100644 --- a/tips/TIPS-API/openapi3-core.yaml +++ b/tips/TIPS-API/openapi3-core.yaml @@ -477,15 +477,18 @@ paths: schema: $ref: '#/components/schemas/BlockResponse' examples: - Empty Payload: + Basic Block - Empty Payload: $ref: >- #/components/examples/get-block-by-id-empty-response-example - Transaction Payload: + Basic Block - Transaction Payload: $ref: >- #/components/examples/get-block-by-id-transaction-response-example - Tagged Data Payload: + Basic Block - Tagged Data Payload: $ref: >- #/components/examples/get-block-by-id-tagged-data-response-example + Validation Block: + $ref: >- + #/components/examples/get-block-by-id-validation-response-example application/vnd.iota.serializer-v1: schema: type: string @@ -1335,115 +1338,131 @@ components: get-block-by-id-empty-response-example: value: protocolVersion: 3 - networkId: 10 - strongParents: - - "0x8d6f3b6e3a63ce388d2eb8c927c5b9ba328b0e427ae727d8b3dddc429f6fb24a0000000000000000" - - "0x408a53af982c49d1398ab5c5b5f5b390d4c4da7da48b61bb9ba7f97c1e8dd7f60000000000000000" - accountId: "0x11a37a8e65fe5dca25cbeb896000eca615eaf88b97ca8dc70d8b1839b53dbf1c" - issuerPublicKey: "0xc6c83a78d06263ca937f21056a32d9b3099d04f0c92863d8b8dceabdd1421d2a" - issuingTime: 1649442459 - commitment: - index: 110 - prevId: "0x78bf1e6c30c6ed9192fa07e1466c09a10e9ea6c58d3b1b6c61a259f1a6f569ed0000000000000000" - rootsId: "0xa4dd36465af63d495d35a05f592d42a51511c153e1bae8fad00453c8cbb48727" - cumulativeWeight: 12345 - latestFinalizedSlot: 98 - nonce: '8423' - signature: "0xd2215b9307c272eb12ea42c18768b9e133ed5b674abc23c577f5096520e433c807930497ed3f90498a7c82bbc1a730f20201413b10a30cd8737403fdbb63bf874966ca205f25e790a8860fbc152a9775e430b9618cd6282d2a0d29969412de07" + networkId: "0" + issuingTime: "2023-07-31T13:14:57.310104314Z" + slotCommitment: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000" + latestFinalizedSlot: "0" + issuerId: "0x375358f92cc94750669598b0aaa55a6ff73310b90710e1fad524c0f911be0fea" + block: + type: 1 + strongParents: + - "0x2de585533d9c9684747e49f70e5e620a4e6c3fd1c7d8b73520c198c7def29a050200000000000000" + - "0x5853745388056fb59c193dc6fe6f8c3f76bf8d82a42ed340eba621a9f5bb79790200000000000000" + weakParents: [] + shallowLikeParents: [] + burnedMana: "0" + signature: + type: 0 + publicKey: "0x05c1de274451db8de8182d64c6ee0dca3ae0c9077e0b4330c976976171d79064" + signature: "0xae8a0ad932ff958576bcd787fd578dfb740b8a319d63595a3af7307f56f0afcbc6187d67eee20026aa39b6ba62c93d1a6e27111607b1b1d8f2206889284e9408" get-block-by-id-transaction-response-example: value: protocolVersion: 3 - networkId: 10 - strongParents: - - "0x8d6f3b6e3a63ce388d2eb8c927c5b9ba328b0e427ae727d8b3dddc429f6fb24a0000000000000000" - - "0x408a53af982c49d1398ab5c5b5f5b390d4c4da7da48b61bb9ba7f97c1e8dd7f60000000000000000" - weakParents: - - "0xe8a904ce3ee081f20a68bb38b2d406cfd138775ba52ea555d93a4e4d4b0ad8440000000000000000" - - "0xbce912a0f383cd07660d3c08f3d3f3c7fb9de31e2cc1b93d4c29332ef693ba0c0000000000000000" - shallowLikeParents: - - "0x0276d29ec6b3cbbf3ed6d1f01af8e29b9c6a9ee9c9375e8e5b5b5c5b5b5d45580000000000000000" - - "0x70a5ce5d8fc3290a9885b1af5d8766d51db89a67a6a839f6d23a6cb8d6f3b6e30000000000000000" - accountId: "0x11a37a8e65fe5dca25cbeb896000eca615eaf88b97ca8dc70d8b1839b53dbf1c" - issuerPublicKey: "0xc6c83a78d06263ca937f21056a32d9b3099d04f0c92863d8b8dceabdd1421d2a" - issuingTime: 1649442459 - commitment: - index: 2310 - prevId: "0x78bf1e6c30c6ed9192fa07e1466c09a10e9ea6c58d3b1b6c61a259f1a6f569ed0000000000000000" - rootsId: "0xa4dd36465af63d495d35a05f592d42a51511c153e1bae8fad00453c8cbb48727" - cumulativeWeight: 12345 - latestFinalizedSlot: 98 - payload: - type: 6 - essence: - type: 1 - networkId: "1337133713371337" - creationTime: 1649442459 - inputsCommitment: "0x0e6c2998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a79" - inputs: - - type: 0 - transactionId: "0x0c78e998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a79" - transactionOutputIndex: 0 + networkId: "0" + issuingTime: "2023-07-31T13:14:57.310104314Z" + slotCommitment: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000" + latestFinalizedSlot: "0" + issuerId: "0x375358f92cc94750669598b0aaa55a6ff73310b90710e1fad524c0f911be0fea" + block: + type: 1 + strongParents: + - "0x8d6f3b6e3a63ce388d2eb8c927c5b9ba328b0e427ae727d8b3dddc429f6fb24a0000000000000000" + - "0x408a53af982c49d1398ab5c5b5f5b390d4c4da7da48b61bb9ba7f97c1e8dd7f60000000000000000" + weakParents: + - "0xe8a904ce3ee081f20a68bb38b2d406cfd138775ba52ea555d93a4e4d4b0ad8440000000000000000" + - "0xbce912a0f383cd07660d3c08f3d3f3c7fb9de31e2cc1b93d4c29332ef693ba0c0000000000000000" + shallowLikeParents: + - "0x0276d29ec6b3cbbf3ed6d1f01af8e29b9c6a9ee9c9375e8e5b5b5c5b5b5d45580000000000000000" + - "0x70a5ce5d8fc3290a9885b1af5d8766d51db89a67a6a839f6d23a6cb8d6f3b6e30000000000000000" + payload: + type: 6 + essence: + type: 1 + networkId: "1337133713371337" + creationTime: 1649442459 + inputsCommitment: "0x0e6c2998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a79" + inputs: + - type: 0 + transactionId: "0x0c78e998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a79" + transactionOutputIndex: 0 + - type: 0 + transactionId: "0x309b169bfa60c8cf80afd730741862d200405d5df7cabfe9b564361dce1f7036" + transactionOutputIndex: 0 + - type: 0 + transactionId: "0xc138ecdc882010245e9574fbc1f1f43cc7c182fa890e46e018365dd49de0f16e" + transactionOutputIndex: 0 + outputs: + - type: 3 + amount: "50000000" + unlockConditions: + - type: 0 + address: + type: 0 + pubKeyHash: "0xd49931814e6bfbb8e221f1b2936e206e5a6b6abeb9c070f8603814c525c9abe3" + payload: + unlocks: - type: 0 - transactionId: "0x309b169bfa60c8cf80afd730741862d200405d5df7cabfe9b564361dce1f7036" - transactionOutputIndex: 0 - - type: 0 - transactionId: "0xc138ecdc882010245e9574fbc1f1f43cc7c182fa890e46e018365dd49de0f16e" - transactionOutputIndex: 0 - outputs: - - type: 3 - amount: "50000000" - unlockConditions: - - type: 0 - address: - type: 0 - pubKeyHash: "0xd49931814e6bfbb8e221f1b2936e206e5a6b6abeb9c070f8603814c525c9abe3" - payload: - unlocks: - - type: 0 - signature: - type: 0 - publicKey: "0x40d0c00fd629a5f528e4bcab4333926a90d06613a3f36a325defcdaf4c9e4092" - signature: "0xed4a63a3e1b22c85f9813b00a21c8576ed72c1f5bc939d01fcea7dcd678c2d0d8d80a2499965d8ce5574c9e92aa0d42b72b969bab3a2a35fe7dbc64659a0d703" - - type: 1 - reference: 0 - - type: 1 - reference: 0 - nonce: "105368" - signature: "0xd2215b9307c272eb12ea42c18768b9e133ed5b674abc23c577f5096520e433c807930497ed3f90498a7c82bbc1a730f20201413b10a30cd8737403fdbb63bf874966ca205f25e790a8860fbc152a9775e430b9618cd6282d2a0d29969412de07" - + signature: + type: 0 + publicKey: "0x40d0c00fd629a5f528e4bcab4333926a90d06613a3f36a325defcdaf4c9e4092" + signature: "0xed4a63a3e1b22c85f9813b00a21c8576ed72c1f5bc939d01fcea7dcd678c2d0d8d80a2499965d8ce5574c9e92aa0d42b72b969bab3a2a35fe7dbc64659a0d703" + - type: 1 + reference: 0 + - type: 1 + reference: 0 + burnedMana: "105368" + signature: + type: 0 + publicKey: "0x05c1de274451db8de8182d64c6ee0dca3ae0c9077e0b4330c976976171d79064" + signature: "0xae8a0ad932ff958576bcd787fd578dfb740b8a319d63595a3af7307f56f0afcbc6187d67eee20026aa39b6ba62c93d1a6e27111607b1b1d8f2206889284e9408" get-block-by-id-tagged-data-response-example: value: protocolVersion: 3 - networkId: 10 - strongParents: - - "0x2f746934d0075179a37ca3e807b7e793ec4ec9189ba31c9ad092d7497b01118c1000000000000000" - - "0x1a4b52759a4a4e879d38478139913f71c6fcd2ee76c924e5be2b9c9321d61f6e1000000000000000" - - "0xb55045d5d57818e93b2c9e75f5e328ce5a04f3db3a5a5cf44949f7c8e4d0b4f10000000000000000" - weakParents: - - "0xa5ee03d7196d7ab8c0d61740f9c91e16b2bc33d82a22b531c71ccf117951682d1000000000000000" - - "0x3d1b7b51c66e2b06c1e819d82e7f20d1870c753bd25d19aae78a8b70e06b1aef1000000000000000" - - "0xd2ca3ef0f7d2f0b2d02e857cbe77f33a3bce54cf3d3c5f0446b7f6da3d8a3ea8000000000000000" - shallowLikeParents: - - "0x4f746934d0075179a37ca3e807b7e793ec4ec9189ba31c9ad092d7497b01118c1000000000000000" - - "0xc9e87d77b547deea65e7f1a36d125ef7c901139bebb3158e76ee1e9b71dcbfe4000000000000000" - - "0x2d237c37248f1e833c08a1189f9a69c0b3f8c3e039d14291ab7e60a88c4f4d3c000000000000000" - accountId: "0x11a37a8e65fe5dca25cbeb896000eca615eaf88b97ca8dc70d8b1839b53dbf1c" - issuerPublicKey: "0xc6c83a78d06263ca937f21056a32d9b3099d04f0c92863d8b8dceabdd1421d2a" - issuingTime: 1649442459 - commitment: - index: 928 - prevId: "0x6dcf06b23919b4d4c1c4d1f51af7e510618a2cecb7f2d4c4d0b4a4deef531b7e0000000000000000" - rootsId: "0xa4dd36465af63d495d35a05f592d42a51511c153e1bae8fad00453c8cbb48727" - cumulativeWeight: 98765 - latestFinalizedSlot: 98 - payload: - type: 5 - tag: "0x68656c6c6f20776f726c64" - data: "0x5370616d6d696e6720646174612e0a436f756e743a203037323935320a54696d657374616d703a20323032312d30322d31315431303a32333a34392b30313a30300a54697073656c656374696f6e3a203934c2b573" - nonce: "105368" - signature: "0xd2215b9307c272eb12ea42c18768b9e133ed5b674abc23c577f5096520e433c807930497ed3f90498a7c82bbc1a730f20201413b10a30cd8737403fdbb63bf874966ca205f25e790a8860fbc152a9775e430b9618cd6282d2a0d29969412de07" + networkId: "0" + issuingTime: "2023-07-31T13:14:57.310104314Z" + slotCommitment: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000" + latestFinalizedSlot: "0" + issuerId: "0x375358f92cc94750669598b0aaa55a6ff73310b90710e1fad524c0f911be0fea" + block: + type: 1 + strongParents: + - "0x2de585533d9c9684747e49f70e5e620a4e6c3fd1c7d8b73520c198c7def29a050200000000000000" + - "0x5853745388056fb59c193dc6fe6f8c3f76bf8d82a42ed340eba621a9f5bb79790200000000000000" + weakParents: [] + shallowLikeParents: [] + payload: + type: 5 + tag: "0x4143544956495459" + data: "" + burnedMana: "0" + signature: + type: 0 + publicKey: "0x05c1de274451db8de8182d64c6ee0dca3ae0c9077e0b4330c976976171d79064" + signature: "0xae8a0ad932ff958576bcd787fd578dfb740b8a319d63595a3af7307f56f0afcbc6187d67eee20026aa39b6ba62c93d1a6e27111607b1b1d8f2206889284e9408" + + get-block-by-id-validation-response-example: + value: + protocolVersion: 3 + networkId: "0" + issuingTime: "2023-07-31T13:14:57.310104314Z" + slotCommitment: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000" + latestFinalizedSlot: "0" + issuerId: "0x375358f92cc94750669598b0aaa55a6ff73310b90710e1fad524c0f911be0fea" + block: + type: 2 + strongParents: + - "0x2de585533d9c9684747e49f70e5e620a4e6c3fd1c7d8b73520c198c7def29a050200000000000000" + - "0x5853745388056fb59c193dc6fe6f8c3f76bf8d82a42ed340eba621a9f5bb79790200000000000000" + weakParents: [] + shallowLikeParents: [] + highestSupportedVersion: 3 + protocolParametersHash: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000" + signature: + type: 0 + publicKey: "0x05c1de274451db8de8182d64c6ee0dca3ae0c9077e0b4330c976976171d79064" + signature: "0xae8a0ad932ff958576bcd787fd578dfb740b8a319d63595a3af7307f56f0afcbc6187d67eee20026aa39b6ba62c93d1a6e27111607b1b1d8f2206889284e9408" get-outputs-by-id-response-example: value: @@ -1504,8 +1523,39 @@ components: type: number description: Protocol version identifier. It also tells which protocol rules apply to the block. networkId: - type: number + type: string description: Network version identifier. It also tells which network the node is running. + issuingTime: + type: string + description: The timestamp of issuing this block. + slotCommitment: + type: string + description: The slot commitment contains in this block. + latestFinalizedSlot: + type: string + description: The latest finalized slot of issuing node. + issuerId: + type: string + description: The identifier of the issuer. + block: + description: The block content. + oneOf: + - $ref: '#/components/schemas/BasicBlock' + - $ref: '#/components/schemas/ValidationBlock' + signature: + type: object + description: The signature of entire block, signed by the issuer. + oneOf: + - $ref: '#/components/schemas/Ed25519Signature' + required: + - protocolVersion + + BasicBlock: + description: A basic block is the object that can carry arbitrary payload, such as a tagged data payload or a transaction. + properties: + type: + type: integer + description: Set to value 1 to denote a Basic Block. strongParents: type: array description: The identifiers of the blocks this block references. Hex-encoded data with 0x prefix. @@ -1521,41 +1571,52 @@ components: description: The identifiers of the blocks this block references. Hex-encoded data with 0x prefix. items: type: string - # TODO: accountId is currently issuerId in iota.go - accountId: - type: string - description: The identifier of the account of this block. - # TODO: issuerPublicKey is not part of Block in iota.go - issuerPublicKey: - type: string - description: The public key of the issuer. - issuingTime: - type: integer - description: The timestamp of issuing this block. - burnedMana: - type: number - description: The mana burned in this block. - commitment: - $ref: '#/components/schemas/Commitment' - description: The slot commitment contains in this block. - latestFinalizedSlot: - type: integer - description: The latest confirmed slot index of the node when issuing this block. payload: description: The inner payload of the block. Can be nil. oneOf: - $ref: '#/components/schemas/TransactionPayload' - $ref: '#/components/schemas/TaggedDataPayload' - signature: - type: string - description: The signature of entire block, signed by the issuer. - nonce: + burnedMana: type: number - description: The nonce which fulfill the PoW requirements. + description: The mana burned in this block. required: - - protocolVersion + - type - strongParents - - nonce + - burnedMana + + ValidationBlock: + description: A validation block is the object that issued by validators. + properties: + type: + type: integer + description: Set to value 2 to denote a Validation Block. + strongParents: + type: array + description: The identifiers of the blocks this block references. Hex-encoded data with 0x prefix. + items: + type: string + weakParents: + type: array + description: The identifiers of the blocks this block references. Hex-encoded data with 0x prefix. + items: + type: string + shallowLikeParents: + type: array + description: The identifiers of the blocks this block references. Hex-encoded data with 0x prefix. + items: + type: string + highestSupportedVersion: + type: number + description: The highest supported version of the protocol. + protocolParametersHash: + type: string + description: The hash of the protocol parameters for the HighestSupportedVersion. + required: + - type + - strongParents + - highestSupportedVersion + - protocolParametersHash + TransactionPayload: description: The Transaction Payload to be embedded into a block. From 6422379f5be23c62c3c020dfd9066746b228949f Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Mon, 31 Jul 2023 22:05:49 +0800 Subject: [PATCH 11/92] Uint64 should return string with serix --- tips/TIPS-API/openapi3-core.yaml | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/tips/TIPS-API/openapi3-core.yaml b/tips/TIPS-API/openapi3-core.yaml index c3242dc82..1697042c8 100644 --- a/tips/TIPS-API/openapi3-core.yaml +++ b/tips/TIPS-API/openapi3-core.yaml @@ -1473,6 +1473,7 @@ components: address: type: 0 pubKeyHash: "0x8eaf87ac1f52eb05f2c7c0c15502df990a228838dc37bd18de9503d69afd257d" + mana: "2000" get-output-metadata-by-id-response-unspent-example: value: @@ -1496,10 +1497,10 @@ components: get-commitment-response-example: value: - index: 986 + index: '986' prevId: "0x8fb6cbb1ecf02c6b5a6a5a6a5f6c5a6a5f6c5a6a5a6a5a6a5f6c5a6a5a6a5f6c50000000000000000" rootsId: "0xa4dd36465af63d495d35a05f592d42a51511c153e1bae8fad00453c8cbb48727" - cumulativeWeight: 78901 + cumulativeWeight: '78901' get-commitment-response-binary-example: value: "070000000a1a0000977c626276b19ef8b3c445709f2f0f2ccc4abb98d97617f421f240c0d1ee066d4306e67a0321889ef8ec89b7eff1378049e058f0fa87a78c2452ae72631a5a99d913d1cbb3525b8faa1800e28dfcb28154bcba10154c39ef87ceda793cb44f58ae1549c88ea13fe4a9695bb6f0aba6cb756522209e5066a96039ae12b398b975693bdc21e222997c86ff9bfc5844f0372d58ff6fa510688e53c181bbdf4db41f9b627540a70e5751c026e543b2e8ab2eb06099daa1d1e5df47778f7787faab45cdf12fe3a80000000300d85e5b1590d898d1e0cdebb2e3b5337c8b76270142663d78811683ba47c17c989ad7a8f0ff2c6438bf435786d4a5b0125a5caf7367061b49a739389d5ebea234c0466c86f88a3f8add03bff04c2e34b214683f2f6983641e1d1185da7e2c3e0200d9922819a39e94ddf3907f4b9c8df93f39f026244fcb609205b9a879022599f218be2536d8b7b8547faa3dbdfe98339ebe9e2b2417a8a03eee02b2a8312b9e026dd0a33261a58a240cd0a1b06cdf1775d98d316f162d3eec402f4bf08bea2a0700f9d9656a60049083eef61487632187b351294c1fa23d118060d813db6d03e8b6ca8180d435708e826bc2042ccd667babb59c5cc461ff29dba966359fcd6fc511cdfdf10d6576f36ac2a6e5cb691e13968c13947ffbd9239939d3802b2fbe0f06" @@ -1798,7 +1799,7 @@ components: - $ref: '#/components/schemas/MetadataFeature' - $ref: '#/components/schemas/TagFeature' mana: - type: integer + type: string description: The stored mana held by the output. required: - type @@ -1883,7 +1884,7 @@ components: plain string. example: '100' delegatedAmount: - type: integer + type: string description: The amount of IOTA tokens that were delegated when the output was created. delegationId: type: string @@ -1896,15 +1897,15 @@ components: The Account ID of the validator to which this output is delegating. example: '0x1505ec099896ab05d9e08fbc7101ae4dff0093b3943b28f789ed2ca728bcc8d6' startEpoch: - type: integer + type: string description: >- The index of the first epoch for which this output delegates. - example: 10 + example: '10' endEpoch: - type: integer + type: string description: >- The index of the last epoch for which this output delegates. - example: 12 + example: '12' unlockConditions: type: array description: >- @@ -1923,9 +1924,9 @@ components: anyOf: - $ref: '#/components/schemas/IssuerFeature' mana: - type: integer + type: string description: The stored mana held by the output. - example: 3000 + example: '3000' required: - type - amount @@ -1980,7 +1981,7 @@ components: anyOf: - $ref: '#/components/schemas/MetadataFeature' mana: - type: integer + type: string description: The stored mana held by the output. required: - type @@ -2914,7 +2915,7 @@ components: description: An object embedded to a block. properties: index: - type: integer + type: string description: The slot index of the commitment. prevId: type: string @@ -2923,7 +2924,7 @@ components: type: string description: The digest of multiple merkle roots within this slot. cumulativeWeight: - type: integer + type: string description: The sum of previous slot commitment cumulative weight and weight of issuers of accepted blocks within this slot. From 8735143fafdc7b3e6031edc80fd8e6a8cf4b3681 Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Tue, 1 Aug 2023 14:40:35 +0800 Subject: [PATCH 12/92] Align new block structure and make (u)int64 to string --- tips/TIPS-API/openapi3-core.yaml | 511 +++++++++++++++---------------- 1 file changed, 255 insertions(+), 256 deletions(-) diff --git a/tips/TIPS-API/openapi3-core.yaml b/tips/TIPS-API/openapi3-core.yaml index 1697042c8..52dd8f1d0 100644 --- a/tips/TIPS-API/openapi3-core.yaml +++ b/tips/TIPS-API/openapi3-core.yaml @@ -1039,19 +1039,19 @@ components: version: 1.0.0 status: isHealthy: true - acceptedTangleTime: 1682328545 - relativeAcceptedTangleTime: 1682328550 - confirmedTangleTime: 1682328525 - relativeConfirmedTangleTime: 1682328535 + acceptedTangleTime: '1682328545' + relativeAcceptedTangleTime: '1682328550' + confirmedTangleTime: '1682328525' + relativeConfirmedTangleTime: '1682328535' latestCommitmentID: "0x8fb6cbb1ecf02c6b5a6a5a6a5f6c5a6a5f6c5a6a5a6a5a6a5f6c5a6a5a6a5f6c50000000000000000" - latestFinalizedSlot: 100 - pruningSlot: 20 - latestAcceptedBlockSlot: 100 - latestConfirmedBlockSlot: 95 + latestFinalizedSlot: '100' + latestAcceptedBlockSlot: '100' + latestConfirmedBlockSlot: '95' + pruningSlot: '20' metrics: - blocksPerSecond: 17 - confirmedBlocksPerSecond: 16.2 - confirmedRate: 98.82352941176471 + blocksPerSecond: '17' + confirmedBlocksPerSecond: '16.2' + confirmedRate: '98.82352941176471' supportedProtocolVersions: - 2 - 3 @@ -1063,8 +1063,21 @@ components: vByteCost: 500 vByteFactorData: 1 vByteFactorKey: 10 + workScoreStructure: + dataByte: 1 + block: 100 + missingParent: 500 + input: 20 + contextInput: 20 + output: 20 + nativeToken: 20 + staking: 100 + blockIssuer: 100 + allotment: 100 + signatureEd25519: 200 + minStrongParentsThreshold: 4 tokenSupply: "2779530283277761" - genesisUnixTimestamp: 1582328545 + genesisUnixTimestamp: "1582328545" slotDurationInSeconds: 10 slotsPerEpochExponent: 13 manaGenerationRate: 1 @@ -1075,10 +1088,10 @@ components: manaDecayFactorsExponent: 0 manaDecayFactorEpochsSum: 0 manaDecayFactorEpochsSumExponent: 0 - stakingUnbondingPeriod: 10 - evictionAge: 6 - livenessThreshold: 5 - epochNearingThreshold: 30 + stakingUnbondingPeriod: '10' + evictionAge: '6' + livenessThreshold: '5' + epochNearingThreshold: '30' versionSignaling: windowSize: 7 windowTargetRatio: 5 @@ -1105,12 +1118,12 @@ components: shallowLikeParents: - "0xdbf86c778d69f413296c2d4d3086d76c74bf4d719e6e95c03a3d9a955ed39bcf3e00000000000000" - "0xf15b2ec698e396c9d2e69bc753246631aedebb657da09ba0e0c8d42518a1e8953e00000000000000" - latestFinalizedSlot: 1422 + latestFinalizedSlot: '1422' commitment: - index: 1432 + index: '1432' prevId: "0xbf07dc16986166953f5a72c19d78642aab6cbde63964a2369ec3d425144eb42b3800000000000000" rootsId: "0xa4dd36465af63d495d35a05f592d42a51511c153e1bae8fad00453c8cbb48727" - cumulativeWeight: 45678 + cumulativeWeight: '45678' post-blocks-response-example: value: @@ -1195,145 +1208,133 @@ components: post-tagged-data-block-request-example-full: value: protocolVersion: 3 - networkId: 10 - strongParents: - - "0x8d6f3b6e3a63ce388d2eb8c927c5b9ba328b0e427ae727d8b3dddc429f6fb24a0000000000000000" - - "0x408a53af982c49d1398ab5c5b5f5b390d4c4da7da48b61bb9ba7f97c1e8dd7f60000000000000000" - weakParents: - - "0xe8a904ce3ee081f20a68bb38b2d406cfd138775ba52ea555d93a4e4d4b0ad8440000000000000000" - - "0xbce912a0f383cd07660d3c08f3d3f3c7fb9de31e2cc1b93d4c29332ef693ba0c0000000000000000" - shallowLikeParents: - - "0x0276d29ec6b3cbbf3ed6d1f01af8e29b9c6a9ee9c9375e8e5b5b5c5b5b5d45580000000000000000" - - "0x70a5ce5d8fc3290a9885b1af5d8766d51db89a67a6a839f6d23a6cb8d6f3b6e30000000000000000" - accountId: "0x11a37a8e65fe5dca25cbeb896000eca615eaf88b97ca8dc70d8b1839b53dbf1c" - issuerPublicKey: "0xc6c83a78d06263ca937f21056a32d9b3099d04f0c92863d8b8dceabdd1421d2a" - issuingTime: 1649442459 - commitment: - index: 110 - prevId: "0x78bf1e6c30c6ed9192fa07e1466c09a10e9ea6c58d3b1b6c61a259f1a6f569ed0000000000000000" - rootsId: "0xa4dd36465af63d495d35a05f592d42a51511c153e1bae8fad00453c8cbb48727" - cumulativeWeight: 12345 - latestFinalizedSlot: 98 - payload: - type: 5 - tag: "0x72616e646f6d207461673a206769746875622e636f6d" - data: "0x5468697320697320616e206578616d706c6520746578742077616c6c20776974682070726f746f636f6c20332e" - nonce: "105368" - signature: "0xd2215b9307c272eb12ea42c18768b9e133ed5b674abc23c577f5096520e433c807930497ed3f90498a7c82bbc1a730f20201413b10a30cd8737403fdbb63bf874966ca205f25e790a8860fbc152a9775e430b9618cd6282d2a0d29969412de07" - + networkId: "0" + issuingTime: "2023-08-01T01:56:56.203902095Z" + slotCommitment: "0x97c77ddb20d016826c1b6a403c5dee96f5b2acaa393bf0d118ec38f953a4cf3c6900000000000000" + latestFinalizedSlot: "104" + issuerId: "0x7a9ec5d9c0c145bae03b20cbe481cfea306e688c00525b410eb8cb18a169ed7f" + block: + type: 1 + strongParents: + - "0x447fea1555fccb0dbf1e0cefb226373f5367ad352ef27d04b15626a94a460da37000000000000000" + - "0xca1aad47e73e2e4779b6a24fb6938a85b68c940086f1fddc130cffffe14be9bd7000000000000000" + weakParents: [] + shallowLikeParents: [] + payload: + type: 5 + tag: "0x4143544956495459" + data: "" + burnedMana: "0" + signature: + type: 0 + publicKey: "0xcb5ea14175ce649149ee41217c44aa70c3205b9939968449eae408727a71f91b" + signature: "0x36787969fa4b74c4ccdfc8940e0a44f0cbb733e8a26bde130f57d40f58f136c710cecf063ff73cb7c73604d9e260cb02908cd8cdb54f4177e7c1da26533a090e" post-transaction-block-request-example-full: value: protocolVersion: 3 - networkId: 10 - strongParents: - - "0x8d6f3b6e3a63ce388d2eb8c927c5b9ba328b0e427ae727d8b3dddc429f6fb24a0000000000000000" - - "0x408a53af982c49d1398ab5c5b5f5b390d4c4da7da48b61bb9ba7f97c1e8dd7f60000000000000000" - weakParents: - - "0xe8a904ce3ee081f20a68bb38b2d406cfd138775ba52ea555d93a4e4d4b0ad8440000000000000000" - - "0xbce912a0f383cd07660d3c08f3d3f3c7fb9de31e2cc1b93d4c29332ef693ba0c0000000000000000" - shallowLikeParents: - - "0x0276d29ec6b3cbbf3ed6d1f01af8e29b9c6a9ee9c9375e8e5b5b5c5b5b5d45580000000000000000" - - "0x70a5ce5d8fc3290a9885b1af5d8766d51db89a67a6a839f6d23a6cb8d6f3b6e30000000000000000" - accountId: "0x11a37a8e65fe5dca25cbeb896000eca615eaf88b97ca8dc70d8b1839b53dbf1c" - issuerPublicKey: "0xc6c83a78d06263ca937f21056a32d9b3099d04f0c92863d8b8dceabdd1421d2a" - issuingTime: 1649442459 - commitment: - index: 110 - prevId: "0x78bf1e6c30c6ed9192fa07e1466c09a10e9ea6c58d3b1b6c61a259f1a6f569ed0000000000000000" - rootsId: "0xa4dd36465af63d495d35a05f592d42a51511c153e1bae8fad00453c8cbb48727" - cumulativeWeight: 12345 - latestFinalizedSlot: 98 - payload: - type: 6 - essence: - type: 1 - networkId: "1337133713371337" - creationTime: 1649442459 - inputsCommitment: "0x0e6c2998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a79" - inputs: - - type: 0 - transactionId: "0x0c78e998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a79" - transactionOutputIndex: 0 - - type: 0 - transactionId: "0x309b169bfa60c8cf80afd730741862d200405d5df7cabfe9b564361dce1f7036" - transactionOutputIndex: 0 - - type: 0 - transactionId: "0xc138ecdc882010245e9574fbc1f1f43cc7c182fa890e46e018365dd49de0f16e" - transactionOutputIndex: 0 - outputs: - - type: 3 - amount: "50000000" - unlockConditions: + networkId: "3650798313638353144" + issuingTime: "2023-08-01T06:01:12.886026643Z" + slotCommitment: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000" + latestFinalizedSlot: "0" + issuerId: "0x6aee704f25558e8aa7630fed0121da53074188abc423b3c5810f80be4936eb6e" + block: + type: 1 + strongParents: + - "0x52962b53d039371874a38a49190b6392d809b487428b6ed7d1181f20d64562c20600000000000000" + - "0xa2355b67865e8d5311a71156528dce15b04eb5e033ef80471edabf3d26bb7b780600000000000000" + weakParents: [] + shallowLikeParents: + - "0x52962b53d039371874a38a49190b6392d809b487428b6ed7d1181f20d64562c20600000000000000" + payload: + type: 6 + essence: + type: 2 + networkId: "3650798313638353144" + creationTime: "6" + contextInputs: [] + inputs: - type: 0 - address: + transactionId: "0x203892452900cc7021e2505003dc44647b352ada0d38f876807c3831ffb2e714" + transactionOutputIndex: 2 + inputsCommitment: "0xe7fcbd978e99be599866cad157bfb48534ba141677976a966170283e8b4b88bf" + outputs: + type: 3 + amount: "10000" + mana: "0" + unlockConditions: type: 0 - pubKeyHash: "0xd49931814e6bfbb8e221f1b2936e206e5a6b6abeb9c070f8603814c525c9abe3" - payload: - unlocks: - - type: 0 - signature: - type: 0 - publicKey: "0x40d0c00fd629a5f528e4bcab4333926a90d06613a3f36a325defcdaf4c9e4092" - signature: "0xed4a63a3e1b22c85f9813b00a21c8576ed72c1f5bc939d01fcea7dcd678c2d0d8d80a2499965d8ce5574c9e92aa0d42b72b969bab3a2a35fe7dbc64659a0d703" - - type: 1 - reference: 0 - - type: 1 - reference: 0 - nonce: "105368" - signature: "0xd2215b9307c272eb12ea42c18768b9e133ed5b674abc23c577f5096520e433c807930497ed3f90498a7c82bbc1a730f20201413b10a30cd8737403fdbb63bf874966ca205f25e790a8860fbc152a9775e430b9618cd6282d2a0d29969412de07" + address: + type: 0 + pubKeyHash: "0xcbd7dca348c695cf07f103f0e4e064be4f51f95f12dd028094631999c23b24e9" + allotments: [] + payload: + type: 5 + tag: "0x630375060a661023064c2803" + data: "0x630375060a661023064c2803" + unlocks: + - type: 0 + signature: + type: 0 + publicKey: "0x281159f405c5c3520592cf729707d5362252e0b0298b1e54e9f193ae25e1f71a" + signature: "0x7bca49300587d58f772e42307bf05ff81fafd194a9192534da4bbb55db0ed04e9ec70d37f5b4a0fa4311d105929e2e6fcfbe4e3a9e82b2ffe1707a0278dcf60e" + burnedMana: "0" + signature: + type: 0 + publicKey: "0x1e4b21eb51dcddf65c20db1065e1f1514658b23a3ddbf48d30c0efc926a9a648" + signature: "0x0dfb21ff7a4ea73f32a6f467a049714645e77eda2a93116c7151c1011ea2905247e05ed6d96279c0d96d4e78dae8a69017f82e989ab82d910199f9b71b30ad01" get-committee-example: value: - epochIndex: 100 - totalStake: 900000000 - totalValidatorStake: 60000000 + epochIndex: '100' + totalStake: '900000000' + totalValidatorStake: '60000000' committee: - accountId: "0x309b169bfa60c8cf80afd730741862d200405d5df7cabfe9b564361dce1f7036" - poolStake: 200000 - validatorStake: 100000 - fixedCost: 50000 + poolStake: '200000' + validatorStake: '100000' + fixedCost: '50000' - accountId: "0x897dr69bfa60c8cf80afd730741862d200405d5df7cabfe9b564361dce1f7036" - poolStake: 205000 - validatorStake: 90000 - fixedCost: 52000 + poolStake: '205000' + validatorStake: '90000' + fixedCost: '52000' get-staker-list-example: value: stakers: - accountId: "0x309b169bfa60c8cf80afd730741862d200405d5df7cabfe9b564361dce1f7036" - stakingEpochEnd: 100 - poolStake: 200000 - validatorStake: 100000 - fixedCost: 50000 + stakingEpochEnd: '100' + poolStake: '200000' + validatorStake: '100000' + fixedCost: '50000' latestSupportedProtocolVersion: 3 - accountId: "0x897dr69bfa60c8cf80afd730741862d200405d5df7cabfe9b564361dce1f7036" - stakingEpochEnd: 100 - poolStake: 205000 - validatorStake: 90000 - fixedCost: 52000 + stakingEpochEnd: '100' + poolStake: '205000' + validatorStake: '90000' + fixedCost: '52000' latestSupportedProtocolVersion: 3 get-staker-example: value: accountId: "0x897dr69bfa60c8cf80afd730741862d200405d5df7cabfe9b564361dce1f7036" - stakingEpochEnd: 100 - poolStake: 205000 - validatorStake: 90000 - fixedCost: 52000 + stakingEpochEnd: '100' + poolStake: '205000' + validatorStake: '90000' + fixedCost: '52000' latestSupportedProtocolVersion: 3 get-mana-rewards-example: value: - epochIndex: 60 - rewards: 800000 + epochIndex: '60' + rewards: '800000' get-congestion-estimate-response-example: value: - slotIndex: 20 + slotIndex: '20' ready: true - referenceManaCost: 50000 - blockIssuanceCredits: 10000000 + referenceManaCost: '50000' + blockIssuanceCredits: '10000000' get-block-by-id-empty-response-example: value: @@ -1507,7 +1508,7 @@ components: get-utxo-changes-response-example: value: - index: 789 + index: '789' createdOutputs: - "0x1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2" - "0x3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4" @@ -1578,7 +1579,7 @@ components: - $ref: '#/components/schemas/TransactionPayload' - $ref: '#/components/schemas/TaggedDataPayload' burnedMana: - type: number + type: string description: The mana burned in this block. required: - type @@ -1607,7 +1608,7 @@ components: items: type: string highestSupportedVersion: - type: number + type: integer description: The highest supported version of the protocol. protocolParametersHash: type: string @@ -1652,7 +1653,7 @@ components: type: string description: Network identifier. Plain string encoded number. This field signals for which network the block is meant for. It is computed out of the first 8 bytes of the `BLAKE2b-256` hash of the concatenation of the network name and protocol version string. creationTime: - type: number + type: string description: The slot index in which the transaction was created. contextInputs: type: array @@ -1660,16 +1661,16 @@ components: anyOf: - $ref: '#/components/schemas/CommitmentInput' - $ref: '#/components/schemas/BICInput' - - $ref: '#/components/schemas/RewardInput' - inputsCommitment: - type: string - description: BLAKE2b-256 hash of the BLAKE2b-256 hashes of the serialized outputs referenced in Inputs by their outputIds (transactionId || outputIndex). Hex-encoded data with 0x prefix. + - $ref: '#/components/schemas/RewardInput' inputs: type: array description: The inputs of this transaction. items: oneOf: - $ref: '#/components/schemas/UTXOInput' + inputsCommitment: + type: string + description: BLAKE2b-256 hash of the BLAKE2b-256 hashes of the serialized outputs referenced in Inputs by their outputIds (transactionId || outputIndex). Hex-encoded data with 0x prefix. outputs: type: array description: The outputs of this transaction. @@ -1706,7 +1707,7 @@ components: type: string description: The account ID to allot the mana to. value: - type: number + type: string description: The amount of mana to allot. CommitmentInput: @@ -1815,15 +1816,18 @@ components: amount: type: string description: The amount of IOTA tokens to deposit with this output. Plain string encoded number. - accountId: - type: string - description: The identifier of the account. + mana: + type: integer + description: The stored mana held by the output. nativeTokens: type: array description: Native tokens held by the otuput. items: anyOf: - - $ref: '#/components/schemas/NativeToken' + - $ref: '#/components/schemas/NativeToken' + accountId: + type: string + description: The identifier of the account. stateIndex: type: integer description: A counter that must increase by 1 every time the alias is state transitioned. @@ -1857,9 +1861,6 @@ components: anyOf: - $ref: '#/components/schemas/IssuerFeature' - $ref: '#/components/schemas/MetadataFeature' - mana: - type: integer - description: The stored mana held by the output. required: - type - amount @@ -1914,19 +1915,6 @@ components: items: anyOf: - $ref: '#/components/schemas/AddressUnlockCondition' - immutableFeatures: - type: array - description: >- - Immutable features that add utility to the output but do not impose - unlocking conditions. These blocks need to be kept in future - transitions of the UTXO state machine. - items: - anyOf: - - $ref: '#/components/schemas/IssuerFeature' - mana: - type: string - description: The stored mana held by the output. - example: '3000' required: - type - amount @@ -2034,7 +2022,7 @@ components: - $ref: '#/components/schemas/IssuerFeature' - $ref: '#/components/schemas/MetadataFeature' mana: - type: integer + type: string description: The stored mana held by the output required: - type @@ -2149,10 +2137,8 @@ components: type: integer description: Set to value 2 to denote an Timelock Unlock Condition. slotIndex: - type: integer + type: string description: The slot index until which the timelock applies (inclusive). - minimum: 0 - exclusiveMinimum: true required: - type @@ -2168,10 +2154,8 @@ components: - $ref: '#/components/schemas/AccountAddress' - $ref: '#/components/schemas/NFTAddress' slotIndex: - type: integer + type: string description: The slot index at which the expiration happens. - minimum: 0 - exclusiveMinimum: true required: - type - returnAddress @@ -2250,7 +2234,7 @@ components: type: string description: Ed25519 public key in Hex. expirySlot: - type: integer + type: string description: Indicates when the BlockIssuerKeys are expired. required: - type @@ -2261,20 +2245,20 @@ components: description: A feature which indicates that this account can issue blocks. properties: type: - type: integer + type: string description: Set to value 5 to denote a Staking Feature. example: 5 stakedAmount: - type: integer + type: string description: The amount of IOTA coins that are locked and staked in the containing account. fixedCost: - type: integer + type: string description: Indicates when the BlockIssuerKeys are expired. startEpoch: - type: integer + type: string description: The epoch index at which the staking starts. endEpoch: - type: integer + type: string description: The epoch index at which the staking ends. required: - type @@ -2585,31 +2569,31 @@ components: description: Tells whether the node is healthy or not. acceptedTangleTime: description: A notion of time that is anchored to the latest accepted block. - type: integer + type: string relativeAcceptedTangleTime: description: The Accepted Tangle Time after it has advanced with the system clock. - type: integer + type: string confirmedTangleTime: description: A notion of time that is anchored to the latest confirmed block. - type: integer + type: string relativeConfirmedTangleTime: description: The Confirmed Tangle Time after it has advanced with the system clock. - type: integer + type: string latestCommitmentId: type: string description: The latest slot that the node has committed to. latestFinalizedSlot: description: The index of latest confirmed slot. - type: integer - pruningSlot: - type: integer - description: The index of the slot before which the tangle history is pruned. + type: string latestAcceptedBlockSlot: description: The slot index of the latest accepted block. - type: integer + type: string latestConfirmedBlockSlot: description: The slot index of the latest confirmed block. type: string + pruningSlot: + type: string + description: The index of the slot before which the tangle history is pruned. required: - isHealthy - latestCommitmentId @@ -2620,15 +2604,15 @@ components: properties: blocksPerSecond: description: The current rate of new blocks per second. - type: number + type: string format: float confirmedBlocksPerSecond: description: The current rate of confirmed blocks per second. - type: number + type: string format: float confirmedRate: description: The ratio of confirmed blocks in relation to new blocks of the last confirmed slot. - type: number + type: string format: float required: - blocksPerSecond @@ -2667,59 +2651,98 @@ components: - vByteCost - vByteFactorData - vByteFactoKey + workScoreStructure: + description: Work structure lists the Work Score of each type, it is used to denote the computation costs of processing an object. + properties: + dataByte: + description: DataByte accounts for the network traffic per byte. + type: integer + block: + description: Block accounts for work done to process a block in the node software. + type: integer + missingParent: + description: MissingParent is used for slashing if there are not enough strong tips. + type: integer + input: + description: Input accounts for loading the UTXO from the database and performing the mana calculations. + type: integer + contextInput: + description: ContextInput accounts for loading and checking the context input. + type: integer + output: + description: Output accounts for storing the UTXO in the database. + type: integer + nativeToken: + description: NativeToken accounts for calculations done with native tokens. + type: integer + staking: + description: Staking accounts for the existence of a staking feature in the output. + type: integer + blockIssuer: + description: BlockIssuer accounts for the existence of a block issuer feature in the output. + type: integer + allotment: + description: Allotment accounts for accessing the account based ledger to transform the mana to block issuance credits. + type: integer + signatureEd25519: + description: SignatureEd25519 accounts for an Ed25519 signature check. + type: integer + minStrongParentsThreshold: + description: MinStrongParentsThreshold is the minimum amount of strong parents in a basic block, otherwise the issuer gets slashed. + type: integer tokenSupply: type: string description: Current supply of base token. Plain string encoded number. genesisUnixTimestamp: - type: integer + type: string description: The genesis timestamp at which the slots start to count. slotDurationInSeconds: - type: number + type: integer description: The duration of a slot, in seconds. slotsPerEpochExponent: - type: number + type: integer description: The number of slots in an epoch expressed as an exponent of 2. manaGenerationRate: - type: number + type: integer description: The amount of potential Mana generated by 1 IOTA in 1 slot. manaGenerationRateExponent: - type: number + type: integer description: The scaling of ManaGenerationRate expressed as an exponent of 2. manaDecayFactors: type: array description: a lookup table of epoch index diff to mana decay factor (slice index 0 = 1 epoch). items: - type: number + type: integer manaDecayFactorsExponent: - type: number + type: integer description: The scaling of ManaDecayFactors expressed as an exponent of 2. manaDecayFactorEpochsSum: - type: number + type: integer description: An integer approximation of the sum of decay over epochs. manaDecayFactorEpochsSumExponent: - type: number + type: integer description: The scaling of ManaDecayFactorEpochsSum expressed as an exponent of 2. stakingUnbondingPeriod: - type: number + type: string description: The unbonding period in epochs before an account can stop staking. evictionAge: - type: number + type: string description: The age in slots when you can evict blocks by committing them into a slot commitments and when slots stop being a consumable accounts' state relative to the latest committed slot. livenessThreshold: - type: number + type: string description: Determine if a block is eligibile by evaluating issuingTime and commitments in its pastcone to ATT and lastCommittedSlot respectively. epochNearingThreshold: - type: number + type: string description: Determine the slot that should trigger a new committee selection for the next and upcoming epoch. versionSignaling: description: The version signaling parameters. properties: windowSize: - type: number + type: integer windowTargetRatio: - type: number + type: integer activationOffset: - type: number + type: integer required: - windowSize - windowTargetRatio @@ -2793,31 +2816,23 @@ components: description: Returns the mana rewards of an account or delegation output. properties: epochIndex: - type: integer + type: string description: The epoch index for which the mana rewards are returned. rewards: - type: integer + type: string description: The amount of totally available rewards the requested output may claim. - - AccountResponse: - description: Returns information that are ideal for attaching a block. - properties: - slotIndex: - type: integer - blockIssuanceCredits: - type: integer CommitteeResponse: description: Returns the validator information of the committee. properties: epochIndex: - type: integer + type: string description: The epoch index of the committee. totalStake: - type: integer + type: string description: The total amount of delegated and staked IOTA tokens in the selected committee. totalValidatorStake: - type: integer + type: string description: The total amount of staked IOTA tokens in the selected committee. committee: type: array @@ -2833,13 +2848,13 @@ components: type: string description: The account identifier of the validator poolStake: - type: integer + type: string description: The total stake of the pool, including delegators. validatorStake: - type: integer + type: string description: The stake of a validator. fixedCost: - type: integer + type: string description: The fixed cost of the validator, which it receives as part of its Mana rewards. Validator: @@ -2849,16 +2864,16 @@ components: type: string description: The account identifier of the validator stakingEpochEnd: - type: integer + type: string description: The epoch index until which the validator registered to stake. poolStake: - type: integer + type: string description: The total stake of the pool, including delegators. validatorStake: - type: integer + type: string description: The stake of a validator. fixedCost: - type: integer + type: string description: The fixed cost of the validator, which it receives as part of its Mana rewards. latestSupportedProtocolVersion: type: integer @@ -2883,7 +2898,7 @@ components: type: string description: The block identifiers that can be used to a attach a block to. Hex-encoded with 0x prefix. latestFinalizedSlot: - type: integer + type: string description: The latest finalized slot index. commitment: $ref: '#/components/schemas/Commitment' @@ -2892,17 +2907,17 @@ components: description: Provides the cost and readiness to issue estimates. properties: slotIndex: - type: integer + type: string description: The slot index for which the congestion estimate is provided. ready: type: boolean description: > Indicates if a node is ready to issue a block in a current congestion or should wait. referenceManaCost: - type: integer + type: string description: The cost in mana for issuing a block in a current congestion estimated based on RMC and slot index. blockIssuanceCredits: - type: integer + type: string description: The Block Issuance Credits of the requested account. required: - slotIndex @@ -2914,6 +2929,9 @@ components: Commitment: description: An object embedded to a block. properties: + version: + type: integer + description: The version of the protocol running. index: type: string description: The slot index of the commitment. @@ -2938,49 +2956,30 @@ components: type: number description: Protocol version identifier. It also tells which protocol rules apply to the block. networkId: - type: number - description: Network version identifier. It also tells which network the node is running. - strongParents: - type: array - description: The identifiers of the blocks this block references. Hex-encoded data with 0x prefix. - items: - type: string - weakParents: - type: array - description: The identifiers of the blocks this block references. Hex-encoded data with 0x prefix. - items: - type: string - shallowLikeParents: - type: array - description: The identifiers of the blocks this block references. Hex-encoded data with 0x prefix. - items: - type: string - accountId: - type: string - description: The identifier of the issuer of this block. - issuerPublicKey: type: string - description: The public key of the issuer. + description: Network version identifier. It also tells which network the node is running. issuingTime: - type: integer + type: string description: The timestamp of issuing this block. - commitment: - $ref: '#/components/schemas/Commitment' + slotCommitment: + type: string description: The slot commitment contains in this block. latestFinalizedSlot: - type: integer - description: The latest finalized slot index of the node when issuing this block. - payload: - description: The inner payload of the block. Can be nil. - oneOf: - - $ref: '#/components/schemas/TransactionPayload' - - $ref: '#/components/schemas/TaggedDataPayload' - nonce: type: string - description: The nonce which lets this block fulfill the Proof-of-Work requirement. Plain string encoded number. - signature: + description: The latest finalized slot of issuing node. + issuerId: type: string + description: The identifier of the issuer. + block: + description: The block content. + oneOf: + - $ref: '#/components/schemas/BasicBlock' + - $ref: '#/components/schemas/ValidationBlock' + signature: + type: object description: The signature of entire block, signed by the issuer. + oneOf: + - $ref: '#/components/schemas/Ed25519Signature' required: - protocolVersion @@ -3110,7 +3109,7 @@ components: description: Returns all UTXO changes of the given slot. properties: index: - type: integer + type: string description: The slot index of the given slot. createdOutputs: description: The created outputs of the given slot. From dac53951b1e7c2cf93a191934ef3dccd54a1c163 Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Tue, 1 Aug 2023 20:55:41 +0800 Subject: [PATCH 13/92] Align type in asyncapi --- tips/TIPS-API/asyncapi3.yaml | 149 +++++++++++-------------------- tips/TIPS-API/openapi3-core.yaml | 5 +- 2 files changed, 56 insertions(+), 98 deletions(-) diff --git a/tips/TIPS-API/asyncapi3.yaml b/tips/TIPS-API/asyncapi3.yaml index 72c18821f..f8923f2a9 100644 --- a/tips/TIPS-API/asyncapi3.yaml +++ b/tips/TIPS-API/asyncapi3.yaml @@ -323,9 +323,9 @@ components: - prevId properties: index: - type: integer + type: string description: The slot index of the commitment. - example: 200 + example: '200' prevId: type: string description: The commitment identifier of the previous slot. @@ -335,13 +335,13 @@ components: description: The digest of multiple merkle roots within this slot. example: "0xa4dd36465af63d495d35a05f592d42a51511c153e1bae8fad00453c8cbb48727" cumulativeWeight: - type: integer + type: string description: The sum of previous slot commitment cumulative weight and weight of issuers of accepted blocks within this slot. It is just an indication of "committed into" this slot, and can not strictly be used for evaluating the switching of a chain. - example: 78901 + example: '78901' CommitmentPayloadSerialized: contentType: application/vnd.iota.serializer-v1 @@ -416,37 +416,15 @@ components: type: string description: The ID of the block. example: '0xcf5f77d62285b9ed8d617729e9232ae346a328c1897f0939837198e93ec13e85' - strongParents: - type: array - description: The identifiers of the blocks this block references. Hex-encoded data with 0x prefix. - items: - type: string - example: - - >- - 0xd026f8b1c856d4e844cc734bbe095429fb880ec4d93f3ccffe3b292a7de17be7 - weakParents: - type: array - description: The identifiers of the blocks this block references. Hex-encoded data with 0x prefix. - items: - type: string - example: - - >- - 0xcf5f77d62285b9ed8d617729e9232ae346a328c1897f0939837198e93ec13e85 - shallowLikeParents: - type: array - description: The identifiers of the blocks this block references. Hex-encoded data with 0x prefix. - items: - type: string - example: - - >- - 0xd026f8b1c856d4e844cc734bbe095429fb880ec4d93f3ccffe3b292a7de17be7 blockState: type: string - description: If `pending`, the block is stored but not confirmed. If `confirmed`, the block is confirmed with the first level of knowledge. If `finalized`, the block is included and cannot be reverted anymore. + description: If `pending`, the block is stored but not confirmed. If `confirmed`, the block is confirmed with the first level of knowledge. If `finalized`, the block is included and cannot be reverted anymore. If `rejected`, the block is rejected by the node, and user should reissue payload if it contains one. If `failed`, the block is not successfully issued due to failure reason. enum: - pending - confirmed - - finalized + - finalized + - rejected + - failed txState: type: string description: The inclusion state of the transaction. @@ -454,53 +432,47 @@ components: - pending - confirmed - finalized - example: conflicting - blockStateReason: + - failed + example: failed + blockFailureReason: type: integer - enum: [1,2,3] + enum: [1,2,3,4,5] description: | Values: - * `1` - denotes that the block is invalid. - * `2` - denotes that the block is orphaned due to congestion control. - * `3` - denotes that the block is orphaned due to negative mana balance. - * Note: more reasons will be added. - txStateReason: + * `1` - denotes that the block is too old to issue. + * `2` - denotes that the block's parents are too old. + * `3` - denotes that the block failed at the booker. + * `4` - denotes that the block is dropped due to congestion. + * `5` - denotes that the block is invalid. + txFailureReason: type: integer - enum: - - 1 - - 2 - - 3 - - 4 - - 5 - - 6 - - 7 - - 8 - - 9 - - 10 - - 11 - - 12 - - 255 + enum: [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,255] description: | Values: * `1` - denotes that the referenced UTXO was already spent. - * `2` - denotes that the transaction is conflicting with another transaction. Conflicting specifically means a double spend situation that both transaction pass all validation rules, eventually losing one(s) should have this reason. - * `3` - denotes that the referenced UTXO cannot be found. - * `4` - denotes that the sum of the inputs and output values does not match. - * `5` - denotes that the unlock block signature is invalid. - * `6` - denotes that the configured timelock is not yet expired. - * `7` - denotes that the given native tokens are invalid. - * `8` - denotes that the return amount in a transaction is not fulfilled by the output side. - * `9` - denotes that the input unlock is invalid. - * `10` - denotes that the inputs commitment is invalid. - * `11` - denotes that an output contains a Sender with an ident (address) which is not unlocked. - * `12` - denotes that the chain state transition is invalid. + * `2` - denotes that the transaction is conflicting with another transaction. Conflicting specifically means a double spend situation that both transaction pass all validation rules, eventually losing one(s) should have this reason. + * `3` - denotes that the referenced UTXO is invalid. + * `4` - denotes that the transaction is invalid. + * `5` - denotes that the sum of the inputs and output values does not match. + * `6` - denotes that the unlock block signature is invalid. + * `7` - denotes that the configured timelock is not yet expired. + * `8` - denotes that the given native tokens are invalid. + * `9` - denotes that the return amount in a transaction is not fulfilled by the output side. + * `10` - denotes that the input unlock is invalid. + * `11` - denotes that the inputs commitment is invalid. + * `12` - denotes that an output contains a Sender with an ident (address) which is not unlocked. + * `13` - denotes that the chain state transition is invalid. + * `14` - denotes that the referenced input is created after transaction issuing time. + * `15` - denotes that the mana amount is invalid. + * `16` - denotes that the Block Issuance Credits amount is invalid. + * `17` - denotes that Reward Input is invalid. + * `18` - denotes that Commitment Input is invalid. + * `19` - denotes that Staking Feature is not provided in account output when claiming rewards. + * `20` - denotes that fail to claim staking reward. + * `21` - denotes that fail to claim delegation reward. * `255` - denotes that the semantic validation failed. example: 1 - reissuePayload: - type: boolean - description: >- - Whether the block should be issued again. - example: false + schemas: NativeToken: description: A native token and its balance in the output. @@ -895,9 +867,9 @@ components: - $ref: '#/components/schemas/MetadataFeature' - $ref: '#/components/schemas/TagFeature' mana: - type: integer + type: string description: The stored mana held by the output. - example: 3000 + example: '3000' required: - type - amount @@ -979,9 +951,9 @@ components: - $ref: '#/components/schemas/IssuerFeature' - $ref: '#/components/schemas/MetadataFeature' mana: - type: integer + type: string description: The stored mana held by the output. - example: 3000 + example: '3000' required: - type - amount @@ -1006,7 +978,7 @@ components: plain string. example: '100' delegatedAmount: - type: integer + type: string description: The amount of IOTA tokens that were delegated when the output was created. delegationId: type: string @@ -1019,15 +991,15 @@ components: The Account ID of the validator to which this output is delegating. example: '0x1505ec099896ab05d9e08fbc7101ae4dff0093b3943b28f789ed2ca728bcc8d6' startEpoch: - type: integer + type: string description: >- The index of the first epoch for which this output delegates. - example: 10 + example: '10' endEpoch: - type: integer + type: string description: >- The index of the last epoch for which this output delegates. - example: 12 + example: '12' unlockConditions: type: array description: >- @@ -1036,19 +1008,6 @@ components: items: anyOf: - $ref: '#/components/schemas/AddressUnlockCondition' - immutableFeatures: - type: array - description: >- - Immutable features that add utility to the output but do not impose - unlocking conditions. These blocks need to be kept in future - transitions of the UTXO state machine. - items: - anyOf: - - $ref: '#/components/schemas/IssuerFeature' - mana: - type: integer - description: The stored mana held by the output. - example: 3000 required: - type - amount @@ -1117,9 +1076,9 @@ components: anyOf: - $ref: '#/components/schemas/MetadataFeature' mana: - type: integer + type: string description: The stored mana held by the output. - example: 3000 + example: '3000' required: - type - amount @@ -1184,9 +1143,9 @@ components: - $ref: '#/components/schemas/IssuerFeature' - $ref: '#/components/schemas/MetadataFeature' mana: - type: integer + type: string description: The stored mana held by the output - example: 3000 + example: '3000' required: - type - amount @@ -1224,7 +1183,7 @@ components: description: The ID of the transaction which created this output. example: '0xd026f8b1c856d4e844cc734bbe095429fb880ec4d93f3ccffe3b292a7de17be7' outputIndex: - type: number + type: integer description: The index of the output within its transaction. example: 0 isSpent: diff --git a/tips/TIPS-API/openapi3-core.yaml b/tips/TIPS-API/openapi3-core.yaml index 52dd8f1d0..627e8fd1a 100644 --- a/tips/TIPS-API/openapi3-core.yaml +++ b/tips/TIPS-API/openapi3-core.yaml @@ -3017,7 +3017,7 @@ components: description: If 'pending', the block contains not yet included transaction. If 'confirmed' means transaction is confirmed with the first level of knowledge. If 'finalized' means transaction is included and cannot be reverted anymore. If 'failed' means transaction is not successfully issued due to failure reason. blockFailureReason: type: integer - enum: [1,2,3] + enum: [1,2,3,4,5] description: > Values: * `1` - denotes that the block is too old to issue. @@ -3025,10 +3025,9 @@ components: * `3` - denotes that the block failed at the booker. * `4` - denotes that the block is dropped due to congestion. * `5` - denotes that the block is invalid. - * Note: more reasons will be added. txFailureReason: type: integer - enum: [1,2,3,4,5,6,7,8,9,10,11,12,255] + enum: [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,255] description: > Values: * `1` - denotes that the referenced UTXO was already spent. From c8b58a27e2184a26102a83633fd9bde0c8c571f4 Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Wed, 2 Aug 2023 14:11:17 +0800 Subject: [PATCH 14/92] Fix wrong name of example responses --- tips/TIPS-API/openapi3-core.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tips/TIPS-API/openapi3-core.yaml b/tips/TIPS-API/openapi3-core.yaml index 627e8fd1a..0df340b5c 100644 --- a/tips/TIPS-API/openapi3-core.yaml +++ b/tips/TIPS-API/openapi3-core.yaml @@ -183,7 +183,7 @@ paths: schema: $ref: '#/components/schemas/ManaRewardsResponse' examples: - CongestionResponse: + ManaRewardsResponse: $ref: '#/components/examples/get-mana-rewards-example' '400': description: "Unsuccessful operation: indicates that the provided data is invalid." @@ -233,7 +233,7 @@ paths: schema: $ref: '#/components/schemas/CommitteeResponse' examples: - CongestionResponse: + CommitteeResponse: $ref: '#/components/examples/get-committee-example' '400': description: "Unsuccessful operation: indicates that the provided data is invalid." @@ -273,7 +273,7 @@ paths: schema: $ref: '#/components/schemas/AccountStakingListResponse' examples: - CongestionResponse: + AccountStakingListResponse: $ref: '#/components/examples/get-staker-list-example' '400': description: "Unsuccessful operation: indicates that the provided data is invalid." @@ -321,7 +321,7 @@ paths: schema: $ref: '#/components/schemas/AccountStakingResponse' examples: - CongestionResponse: + AccountStakingResponse: $ref: '#/components/examples/get-staker-example' '400': description: "Unsuccessful operation: indicates that the provided data is invalid." From e8788aea6ba1381b71ca2c8cd8520e57ed992b5f Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Wed, 2 Aug 2023 15:45:25 +0800 Subject: [PATCH 15/92] Update info response struct and fix more examples --- tips/TIPS-API/openapi3-core.yaml | 365 ++++++++++++++++--------------- 1 file changed, 193 insertions(+), 172 deletions(-) diff --git a/tips/TIPS-API/openapi3-core.yaml b/tips/TIPS-API/openapi3-core.yaml index 0df340b5c..c0f0821cd 100644 --- a/tips/TIPS-API/openapi3-core.yaml +++ b/tips/TIPS-API/openapi3-core.yaml @@ -118,13 +118,6 @@ paths: example: "0xf532a53545103276b46876c473846d98648ee418468bce76df4868648dd73e5d" required: true description: Identifier of the account. - - in: query - name: slotIndex - schema: - type: integer - example: 1622568540 - required: false - description: Check the issuance readiness for a specific slot index. If this is not provided, current slot index will be used. responses: '200': description: "Successful operation." @@ -1055,49 +1048,50 @@ components: supportedProtocolVersions: - 2 - 3 - protocol: - version: 3 - networkName: iota-core-testnet - bech32Hrp: rms - rentStructure: - vByteCost: 500 - vByteFactorData: 1 - vByteFactorKey: 10 - workScoreStructure: - dataByte: 1 - block: 100 - missingParent: 500 - input: 20 - contextInput: 20 - output: 20 - nativeToken: 20 - staking: 100 - blockIssuer: 100 - allotment: 100 - signatureEd25519: 200 - minStrongParentsThreshold: 4 - tokenSupply: "2779530283277761" - genesisUnixTimestamp: "1582328545" - slotDurationInSeconds: 10 - slotsPerEpochExponent: 13 - manaGenerationRate: 1 - manaGenerationRateExponent: 0 - manaDecayFactors: - - 10 - - 20 - manaDecayFactorsExponent: 0 - manaDecayFactorEpochsSum: 0 - manaDecayFactorEpochsSumExponent: 0 - stakingUnbondingPeriod: '10' - evictionAge: '6' - livenessThreshold: '5' - epochNearingThreshold: '30' - versionSignaling: - windowSize: 7 - windowTargetRatio: 5 - activationOffset: 7 + protocolParameters: + - startEpoch: '1' + parameters: + version: 3 + networkName: iota-core-testnet + bech32Hrp: rms + rentStructure: + vByteCost: 500 + vByteFactorData: 1 + vByteFactorKey: 10 + workScoreStructure: + dataByte: 1 + block: 100 + missingParent: 500 + input: 20 + contextInput: 20 + output: 20 + nativeToken: 20 + staking: 100 + blockIssuer: 100 + allotment: 100 + signatureEd25519: 200 + minStrongParentsThreshold: 4 + tokenSupply: "2779530283277761" + genesisUnixTimestamp: "1582328545" + slotDurationInSeconds: 10 + slotsPerEpochExponent: 13 + manaGenerationRate: 1 + manaGenerationRateExponent: 0 + manaDecayFactors: + - 10 + - 20 + manaDecayFactorsExponent: 0 + manaDecayFactorEpochsSum: 0 + manaDecayFactorEpochsSumExponent: 0 + stakingUnbondingPeriod: '10' + evictionAge: '6' + livenessThreshold: '5' + epochNearingThreshold: '30' + versionSignaling: + windowSize: 7 + windowTargetRatio: 5 + activationOffset: 7 baseToken: - baseToken: name: "Shimmer" tickerSymbol: "SMR" unit: "SMR" @@ -1120,6 +1114,7 @@ components: - "0xf15b2ec698e396c9d2e69bc753246631aedebb657da09ba0e0c8d42518a1e8953e00000000000000" latestFinalizedSlot: '1422' commitment: + version: 3 index: '1432' prevId: "0xbf07dc16986166953f5a72c19d78642aab6cbde63964a2369ec3d425144eb42b3800000000000000" rootsId: "0xa4dd36465af63d495d35a05f592d42a51511c153e1bae8fad00453c8cbb48727" @@ -1161,128 +1156,139 @@ components: post-tagged-data-block-request-example-minimal: value: protocolVersion: 3 - payload: - type: 5 - tag: "0x72616e646f6d207461673a206769746875622e636f6d" - data: "0x5468697320697320616e206578616d706c6520746578742077616c6c20776974682070726f746f636f6c20332e" + block: + type: 1 + payload: + type: 5 + tag: "0x72616e646f6d207461673a206769746875622e636f6d" + data: "0x5468697320697320616e206578616d706c6520746578742077616c6c20776974682070726f746f636f6c20332e" post-transaction-block-request-example-minimal: value: protocolVersion: 3 - payload: - type: 6 - essence: - type: 1 - networkId: "1337133713371337" - creationTime: 1682328545 - inputsCommitment: "0x0e6c2998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a79" - inputs: - - type: 0 - transactionId: "0x0c78e998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a79" - transactionOutputIndex: 0 - - type: 0 - transactionId: "0x309b169bfa60c8cf80afd730741862d200405d5df7cabfe9b564361dce1f7036" - transactionOutputIndex: 0 - - type: 0 - transactionId: "0xc138ecdc882010245e9574fbc1f1f43cc7c182fa890e46e018365dd49de0f16e" - transactionOutputIndex: 0 - outputs: - - type: 3 - amount: "50000000" - unlockConditions: - - type: 0 - address: - type: 0 - pubKeyHash: "0xd49931814e6bfbb8e221f1b2936e206e5a6b6abeb9c070f8603814c525c9abe3" - unlocks: - - type: 0 - signature: - type: 0 - publicKey: "0x40d0c00fd629a5f528e4bcab4333926a90d06613a3f36a325defcdaf4c9e4092" - signature: "0xed4a63a3e1b22c85f9813b00a21c8576ed72c1f5bc939d01fcea7dcd678c2d0d8d80a2499965d8ce5574c9e92aa0d42b72b969bab3a2a35fe7dbc64659a0d703" - - type: 1 - reference: 0 - - type: 1 - reference: 0 + block: + type: 1 + payload: + type: 6 + essence: + type: 1 + networkId: "1337133713371337" + creationTime: 1682328545 + inputsCommitment: "0x0e6c2998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a79" + inputs: + - type: 0 + transactionId: "0x0c78e998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a79" + transactionOutputIndex: 0 + - type: 0 + transactionId: "0x309b169bfa60c8cf80afd730741862d200405d5df7cabfe9b564361dce1f7036" + transactionOutputIndex: 0 + - type: 0 + transactionId: "0xc138ecdc882010245e9574fbc1f1f43cc7c182fa890e46e018365dd49de0f16e" + transactionOutputIndex: 0 + outputs: + - type: 3 + amount: "50000000" + unlockConditions: + - type: 0 + address: + type: 0 + pubKeyHash: "0xd49931814e6bfbb8e221f1b2936e206e5a6b6abeb9c070f8603814c525c9abe3" + unlocks: + - type: 0 + signature: + type: 0 + publicKey: "0x40d0c00fd629a5f528e4bcab4333926a90d06613a3f36a325defcdaf4c9e4092" + signature: "0xed4a63a3e1b22c85f9813b00a21c8576ed72c1f5bc939d01fcea7dcd678c2d0d8d80a2499965d8ce5574c9e92aa0d42b72b969bab3a2a35fe7dbc64659a0d703" + - type: 1 + reference: 0 + - type: 1 + reference: 0 post-tagged-data-block-request-example-full: value: protocolVersion: 3 networkId: "0" - issuingTime: "2023-08-01T01:56:56.203902095Z" - slotCommitment: "0x97c77ddb20d016826c1b6a403c5dee96f5b2acaa393bf0d118ec38f953a4cf3c6900000000000000" - latestFinalizedSlot: "104" - issuerId: "0x7a9ec5d9c0c145bae03b20cbe481cfea306e688c00525b410eb8cb18a169ed7f" - block: + issuingTime: "2023-07-31T13:14:57.310104314Z" + slotCommitment: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000" + latestFinalizedSlot: "0" + issuerId: "0x375358f92cc94750669598b0aaa55a6ff73310b90710e1fad524c0f911be0fea" + block: type: 1 strongParents: - - "0x447fea1555fccb0dbf1e0cefb226373f5367ad352ef27d04b15626a94a460da37000000000000000" - - "0xca1aad47e73e2e4779b6a24fb6938a85b68c940086f1fddc130cffffe14be9bd7000000000000000" + - "0x2de585533d9c9684747e49f70e5e620a4e6c3fd1c7d8b73520c198c7def29a050200000000000000" + - "0x5853745388056fb59c193dc6fe6f8c3f76bf8d82a42ed340eba621a9f5bb79790200000000000000" weakParents: [] shallowLikeParents: [] payload: type: 5 tag: "0x4143544956495459" data: "" - burnedMana: "0" + burnedMana: "0" signature: type: 0 - publicKey: "0xcb5ea14175ce649149ee41217c44aa70c3205b9939968449eae408727a71f91b" - signature: "0x36787969fa4b74c4ccdfc8940e0a44f0cbb733e8a26bde130f57d40f58f136c710cecf063ff73cb7c73604d9e260cb02908cd8cdb54f4177e7c1da26533a090e" + publicKey: "0x05c1de274451db8de8182d64c6ee0dca3ae0c9077e0b4330c976976171d79064" + signature: "0xae8a0ad932ff958576bcd787fd578dfb740b8a319d63595a3af7307f56f0afcbc6187d67eee20026aa39b6ba62c93d1a6e27111607b1b1d8f2206889284e9408" post-transaction-block-request-example-full: value: protocolVersion: 3 - networkId: "3650798313638353144" - issuingTime: "2023-08-01T06:01:12.886026643Z" + networkId: "0" + issuingTime: "2023-07-31T13:14:57.310104314Z" slotCommitment: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000" latestFinalizedSlot: "0" - issuerId: "0x6aee704f25558e8aa7630fed0121da53074188abc423b3c5810f80be4936eb6e" + issuerId: "0x375358f92cc94750669598b0aaa55a6ff73310b90710e1fad524c0f911be0fea" block: type: 1 strongParents: - - "0x52962b53d039371874a38a49190b6392d809b487428b6ed7d1181f20d64562c20600000000000000" - - "0xa2355b67865e8d5311a71156528dce15b04eb5e033ef80471edabf3d26bb7b780600000000000000" - weakParents: [] + - "0x8d6f3b6e3a63ce388d2eb8c927c5b9ba328b0e427ae727d8b3dddc429f6fb24a0000000000000000" + - "0x408a53af982c49d1398ab5c5b5f5b390d4c4da7da48b61bb9ba7f97c1e8dd7f60000000000000000" + weakParents: + - "0xe8a904ce3ee081f20a68bb38b2d406cfd138775ba52ea555d93a4e4d4b0ad8440000000000000000" + - "0xbce912a0f383cd07660d3c08f3d3f3c7fb9de31e2cc1b93d4c29332ef693ba0c0000000000000000" shallowLikeParents: - - "0x52962b53d039371874a38a49190b6392d809b487428b6ed7d1181f20d64562c20600000000000000" + - "0x0276d29ec6b3cbbf3ed6d1f01af8e29b9c6a9ee9c9375e8e5b5b5c5b5b5d45580000000000000000" + - "0x70a5ce5d8fc3290a9885b1af5d8766d51db89a67a6a839f6d23a6cb8d6f3b6e30000000000000000" payload: type: 6 essence: - type: 2 - networkId: "3650798313638353144" - creationTime: "6" - contextInputs: [] - inputs: - - type: 0 - transactionId: "0x203892452900cc7021e2505003dc44647b352ada0d38f876807c3831ffb2e714" - transactionOutputIndex: 2 - inputsCommitment: "0xe7fcbd978e99be599866cad157bfb48534ba141677976a966170283e8b4b88bf" + type: 1 + networkId: "1337133713371337" + creationTime: 1649442459 + inputsCommitment: "0x0e6c2998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a79" + inputs: + - type: 0 + transactionId: "0x0c78e998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a79" + transactionOutputIndex: 0 + - type: 0 + transactionId: "0x309b169bfa60c8cf80afd730741862d200405d5df7cabfe9b564361dce1f7036" + transactionOutputIndex: 0 + - type: 0 + transactionId: "0xc138ecdc882010245e9574fbc1f1f43cc7c182fa890e46e018365dd49de0f16e" + transactionOutputIndex: 0 outputs: - type: 3 - amount: "10000" - mana: "0" + - type: 3 + amount: "50000000" unlockConditions: - type: 0 - address: + - type: 0 + address: type: 0 - pubKeyHash: "0xcbd7dca348c695cf07f103f0e4e064be4f51f95f12dd028094631999c23b24e9" - allotments: [] + pubKeyHash: "0xd49931814e6bfbb8e221f1b2936e206e5a6b6abeb9c070f8603814c525c9abe3" payload: - type: 5 - tag: "0x630375060a661023064c2803" - data: "0x630375060a661023064c2803" unlocks: - type: 0 - signature: + signature: type: 0 - publicKey: "0x281159f405c5c3520592cf729707d5362252e0b0298b1e54e9f193ae25e1f71a" - signature: "0x7bca49300587d58f772e42307bf05ff81fafd194a9192534da4bbb55db0ed04e9ec70d37f5b4a0fa4311d105929e2e6fcfbe4e3a9e82b2ffe1707a0278dcf60e" - burnedMana: "0" + publicKey: "0x40d0c00fd629a5f528e4bcab4333926a90d06613a3f36a325defcdaf4c9e4092" + signature: "0xed4a63a3e1b22c85f9813b00a21c8576ed72c1f5bc939d01fcea7dcd678c2d0d8d80a2499965d8ce5574c9e92aa0d42b72b969bab3a2a35fe7dbc64659a0d703" + - type: 1 + reference: 0 + - type: 1 + reference: 0 + burnedMana: "105368" signature: type: 0 - publicKey: "0x1e4b21eb51dcddf65c20db1065e1f1514658b23a3ddbf48d30c0efc926a9a648" - signature: "0x0dfb21ff7a4ea73f32a6f467a049714645e77eda2a93116c7151c1011ea2905247e05ed6d96279c0d96d4e78dae8a69017f82e989ab82d910199f9b71b30ad01" + publicKey: "0x05c1de274451db8de8182d64c6ee0dca3ae0c9077e0b4330c976976171d79064" + signature: "0xae8a0ad932ff958576bcd787fd578dfb740b8a319d63595a3af7307f56f0afcbc6187d67eee20026aa39b6ba62c93d1a6e27111607b1b1d8f2206889284e9408" get-committee-example: value: @@ -2623,8 +2629,61 @@ components: description: The supported protocol versions. items: type: integer - protocol: - description: Protocol parameters. + protocolParameters: + type: array + items: + allOf: + - $ref: '#/components/schemas/ProtocolParameters' + baseToken: + description: Gives info about the base token the network uses. + properties: + name: + type: string + description: The name of the base token of the network. + tickerSymbol: + type: string + description: Ticker symbol of the token to be displayed on trading platforms. + unit: + type: string + description: The primary unit of the token. + decimals: + type: integer + description: Number of decimals the primary unit is divisible up to. + subunit: + type: string + description: The name of the smallest possible denomination of the primary unit. subunit * 10^decimals = unit + useMetricPrefix: + type: boolean + description: Whether to use metric prefixes for displaying unit. + required: + - name + - tickerSymbol + - unit + - decimals + - useMetricPrefix + features: + description: The features that are supported by the node. For example, a node could support the feature, which would allow the BIC to be included by the node account. All features must be lowercase. + type: array + items: + type: string + required: + - name + - version + - status + - metrics + - supportedProtocolVersions + - protocol + - baseToken + - features + + ProtocolParameters: + description: Protocol parameters. + properties: + startEpoch: + description: The start epoch of the set of protocol parameters. + type: string + parameters: + description: The protocol parameters. properties: version: type: integer @@ -2756,47 +2815,9 @@ components: - genesisUnixTimestamp - slotDurationInSeconds - epochNearingThreshold - baseToken: - description: Gives info about the base token the network uses. - properties: - name: - type: string - description: The name of the base token of the network. - tickerSymbol: - type: string - description: Ticker symbol of the token to be displayed on trading platforms. - unit: - type: string - description: The primary unit of the token. - decimals: - type: integer - description: Number of decimals the primary unit is divisible up to. - subunit: - type: string - description: The name of the smallest possible denomination of the primary unit. subunit * 10^decimals = unit - useMetricPrefix: - type: boolean - description: Whether to use metric prefixes for displaying unit. - required: - - name - - tickerSymbol - - unit - - decimals - - useMetricPrefix - features: - description: The features that are supported by the node. For example, a node could support the feature, which would allow the BIC to be included by the node account. All features must be lowercase. - type: array - items: - type: string required: - - name - - version - - status - - metrics - - supportedProtocolVersions - - protocol - - baseToken - - features + - startEpoch + - parameters AccountStakingResponse: description: Returns the requested staking information of the account. From 75d99c4baa26d1db11e8e91a2133b8f36997db7e Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Wed, 2 Aug 2023 15:50:32 +0800 Subject: [PATCH 16/92] Remove managment api structures --- tips/TIPS-API/openapi3-core.yaml | 80 -------------------------------- 1 file changed, 80 deletions(-) diff --git a/tips/TIPS-API/openapi3-core.yaml b/tips/TIPS-API/openapi3-core.yaml index c0f0821cd..3bc4e5580 100644 --- a/tips/TIPS-API/openapi3-core.yaml +++ b/tips/TIPS-API/openapi3-core.yaml @@ -2405,86 +2405,6 @@ components: required: - type - Gossip: - description: Information about the gossip stream with the peer. - properties: - heartbeat: - description: Information about the most recent heartbeat of the peer. The heartbeat is `null` if none has been received yet. - allOf: - - $ref: '#/components/schemas/Heartbeat' - nullable: true - metrics: - description: Metrics about the gossip stream with the peer. - allOf: - - $ref: '#/components/schemas/Metrics' - required: - - heartbeat - - metrics - - Heartbeat: - properties: - latestCommittedSlotIndex: - type: integer - description: The most recent slot that has been committed by the node. - prunedSlotIndex: - type: integer - description: Tells from which starting point the node holds data. - latestConfirmedSlotIndex: - type: integer - description: The most recent confirmed slot known to the node. - connectedNeighbors: - type: integer - description: Tells how many connected peers the node has. - syncedNeighbors: - type: integer - description: Tells how many synced peers the node has. - required: - - latestCommittedSlotIndex - - prunedSlotIndex - - latestConfirmedSlotIndex - - connectedNeighbors - - syncedNeighbors - - Metrics: - properties: - newBlocks: - type: integer - description: The number of received blocks that were new for the node. - knownBlocks: - type: integer - description: The number of received blocks that already were known to the node. - receivedBlocks: - type: integer - description: The number of received blocks from the peer. - receivedBlockRequests: - type: integer - description: The number of received block requests from the peer. - receivedHeartbeats: - type: integer - description: The number of received heartbeats from the peer. - sentBlocks: - type: integer - description: The number of sent blocks to the peer. - sentBlockRequests: - type: integer - description: The number of sent block requests to the peer. - sentHeartbeats: - type: integer - description: The number of sent heartbeats to the peer. - droppedPackets: - type: integer - description: The number of dropped packets. - required: - - newBlocks - - knownBlocks - - receivedBlocks - - receivedBlockRequests - - receivedHeartbeats - - sentBlocks - - sentBlockRequests - - sentHeartbeats - - droppedPackets - ErrorResponse: description: The error format. properties: From ebe12358acaba00cc618dc9afb14a98112d8bf79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daria=20Dziuba=C5=82towska?= Date: Thu, 3 Aug 2023 08:52:58 +0200 Subject: [PATCH 17/92] Update stakers endpoint with active flag --- tips/TIPS-API/openapi3-core.yaml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/tips/TIPS-API/openapi3-core.yaml b/tips/TIPS-API/openapi3-core.yaml index 3bc4e5580..008c3d4d0 100644 --- a/tips/TIPS-API/openapi3-core.yaml +++ b/tips/TIPS-API/openapi3-core.yaml @@ -257,7 +257,7 @@ paths: get: tags: - staking - summary: Returns information of the active stakers. + summary: Returns information of all registered stakers and if they are active. responses: '200': description: "Successful operation." @@ -1313,12 +1313,14 @@ components: poolStake: '200000' validatorStake: '100000' fixedCost: '50000' + active: false latestSupportedProtocolVersion: 3 - accountId: "0x897dr69bfa60c8cf80afd730741862d200405d5df7cabfe9b564361dce1f7036" stakingEpochEnd: '100' poolStake: '205000' validatorStake: '90000' fixedCost: '52000' + active: true latestSupportedProtocolVersion: 3 get-staker-example: @@ -1328,6 +1330,7 @@ components: poolStake: '205000' validatorStake: '90000' fixedCost: '52000' + active: true latestSupportedProtocolVersion: 3 get-mana-rewards-example: @@ -2816,6 +2819,9 @@ components: fixedCost: type: string description: The fixed cost of the validator, which it receives as part of its Mana rewards. + active: + type: boolean + description: Shows weather validator was active recently. latestSupportedProtocolVersion: type: integer description: The latest protocol version the validator supported. From 80b23978e771bdae402a13a6c92d97ada9fc54d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daria=20Dziuba=C5=82towska?= Date: Thu, 3 Aug 2023 08:53:21 +0200 Subject: [PATCH 18/92] Remove duplicated protocol version from info api --- tips/TIPS-API/openapi3-core.yaml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/tips/TIPS-API/openapi3-core.yaml b/tips/TIPS-API/openapi3-core.yaml index 008c3d4d0..7eb3580cd 100644 --- a/tips/TIPS-API/openapi3-core.yaml +++ b/tips/TIPS-API/openapi3-core.yaml @@ -1045,9 +1045,6 @@ components: blocksPerSecond: '17' confirmedBlocksPerSecond: '16.2' confirmedRate: '98.82352941176471' - supportedProtocolVersions: - - 2 - - 3 protocolParameters: - startEpoch: '1' parameters: @@ -2547,11 +2544,6 @@ components: - blocksPerSecond - confirmedBlocksPerSecond - confirmedRate - supportedProtocolVersions: - type: array - description: The supported protocol versions. - items: - type: integer protocolParameters: type: array items: From 7e96c82afeb4ead11736f01628e99fb3f7e77360 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daria=20Dziuba=C5=82towska?= Date: Tue, 8 Aug 2023 15:31:09 +0200 Subject: [PATCH 19/92] Block type versioning should start from 0 --- tips/TIPS-API/openapi3-core.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tips/TIPS-API/openapi3-core.yaml b/tips/TIPS-API/openapi3-core.yaml index 7eb3580cd..b4eb6028a 100644 --- a/tips/TIPS-API/openapi3-core.yaml +++ b/tips/TIPS-API/openapi3-core.yaml @@ -1563,7 +1563,7 @@ components: properties: type: type: integer - description: Set to value 1 to denote a Basic Block. + description: Set to value 0 to denote a Basic Block. strongParents: type: array description: The identifiers of the blocks this block references. Hex-encoded data with 0x prefix. @@ -1597,7 +1597,7 @@ components: properties: type: type: integer - description: Set to value 2 to denote a Validation Block. + description: Set to value 1 to denote a Validation Block. strongParents: type: array description: The identifiers of the blocks this block references. Hex-encoded data with 0x prefix. From 43b25b17b564bc42963d9f32645a98f1bc2a58c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daria=20Dziuba=C5=82towska?= Date: Wed, 9 Aug 2023 13:38:31 +0200 Subject: [PATCH 20/92] Renaming of validator response, adding pagination, and more explanation for rewards endpoint. --- tips/TIPS-API/openapi3-core.yaml | 63 ++++++++++++++++++++------------ 1 file changed, 39 insertions(+), 24 deletions(-) diff --git a/tips/TIPS-API/openapi3-core.yaml b/tips/TIPS-API/openapi3-core.yaml index b4eb6028a..2db2556f2 100644 --- a/tips/TIPS-API/openapi3-core.yaml +++ b/tips/TIPS-API/openapi3-core.yaml @@ -20,8 +20,8 @@ tags: description: Everything about the accounts. - name: rewards description: Everything about Mana rewards. - - name: staking - description: Everything about staking. + - name: validators + description: Everything about validators and staking. - name: committee description: Everything about the committee. - name: blocks @@ -157,9 +157,12 @@ paths: get: tags: - rewards - summary: Returns the totally available Mana rewards of an account or delegation output. + summary: Returns the totally available Mana rewards of an account or delegation output decayed up to epochEnd index provided in the response. description: >- - Returns the totally available Mana rewards of an account or delegation output up until the current epoch index. Note that rewards for an epoch only become available at the beginning of the next epoch. If the end epoch of a staking feature is equal or greater than the current epoch, the rewards response will not include the potential future rewards for those epochs. + Returns the totally available Mana rewards of an account or delegation output up until the current epoch index. + Note that rewards for an epoch only become available at the beginning of the next epoch. + If the end epoch of a staking feature is equal or greater than the current epoch, the rewards response will not include the potential future rewards for those epochs. + epochStart and epochEnd indicates the actual range for which reward value is returned and decayed for. parameters: - in: path name: outputId @@ -253,21 +256,21 @@ paths: schema: $ref: '#/components/schemas/ServiceUnavailableResponse' - /api/core/v3/staking: + /api/core/v3/validators: get: tags: - - staking - summary: Returns information of all registered stakers and if they are active. + - validators + summary: Returns information of all registered validators and if they are active. responses: '200': description: "Successful operation." content: application/json: schema: - $ref: '#/components/schemas/AccountStakingListResponse' + $ref: '#/components/schemas/ValidatorsResponse' examples: - AccountStakingListResponse: - $ref: '#/components/examples/get-staker-list-example' + ValidatorsResponse: + $ref: '#/components/examples/get-validators-example' '400': description: "Unsuccessful operation: indicates that the provided data is invalid." content: @@ -293,10 +296,10 @@ paths: schema: $ref: '#/components/schemas/ServiceUnavailableResponse' - /api/core/v3/staking/{accountId}: + /api/core/v3/validators/{accountId}: get: tags: - - staking + - validators summary: Return the information of requested staker. parameters: - in: path @@ -315,7 +318,7 @@ paths: $ref: '#/components/schemas/AccountStakingResponse' examples: AccountStakingResponse: - $ref: '#/components/examples/get-staker-example' + $ref: '#/components/examples/get-validator-example' '400': description: "Unsuccessful operation: indicates that the provided data is invalid." content: @@ -1302,9 +1305,9 @@ components: validatorStake: '90000' fixedCost: '52000' - get-staker-list-example: + get-validators-example: value: - stakers: + validators: - accountId: "0x309b169bfa60c8cf80afd730741862d200405d5df7cabfe9b564361dce1f7036" stakingEpochEnd: '100' poolStake: '200000' @@ -1319,8 +1322,10 @@ components: fixedCost: '52000' active: true latestSupportedProtocolVersion: 3 + pageSize: 50 + cursor: "" - get-staker-example: + get-validator-example: value: accountId: "0x897dr69bfa60c8cf80afd730741862d200405d5df7cabfe9b564361dce1f7036" stakingEpochEnd: '100' @@ -1332,7 +1337,8 @@ components: get-mana-rewards-example: value: - epochIndex: '60' + epochStart: '60' + epochEnd: '80' rewards: '800000' get-congestion-estimate-response-example: @@ -2739,21 +2745,30 @@ components: oneOf: - $ref: '#/components/schemas/Validator' - AccountStakingListResponse: - description: Returns a list of active stakers to stake. + ValidatorsResponse: + description: Returns a paginated list of all registered validators ready for the next epoch and indicates if they were active recently (are eligible for committee selection). properties: - stakers: + validators: type: array items: oneOf: - $ref: '#/components/schemas/Validator' + pageSize: + type: integer + description: The number of validators returned per one API request with pagination. + cursor: + type: string + description: The cursor that needs to be provided as cursor query parameter to request the next page. If empty, this was the last page. ManaRewardsResponse: description: Returns the mana rewards of an account or delegation output. properties: - epochIndex: + EpochStart: + type: string + description: The starting epoch index for which the mana rewards are returned. + EpochEnd: type: string - description: The epoch index for which the mana rewards are returned. + description: The ending epoch index for which the mana rewards are returned, the decay is applied up to this point (including). rewards: type: string description: The amount of totally available rewards the requested output may claim. @@ -2775,9 +2790,9 @@ components: description: The validators of the committee. items: oneOf: - - $ref: '#/components/schemas/CommitteeMemeber' + - $ref: '#/components/schemas/CommitteeMember' - CommitteeMemeber: + CommitteeMember: description: Returns information of a validator. properties: accountId: From 4b8ecf8e3261fd984cec7e96ed0d59c63edaf873 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 14 Aug 2023 15:52:30 +0200 Subject: [PATCH 21/92] Fix concept typo --- tips/TIP-0047/tip-0047.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0047/tip-0047.md b/tips/TIP-0047/tip-0047.md index db76ef3f2..0384eb0f3 100644 --- a/tips/TIP-0047/tip-0047.md +++ b/tips/TIP-0047/tip-0047.md @@ -14,7 +14,7 @@ replaces: TIP-19 ## Summary -This document describes a `dust protection` concept, called `storage deposit` which was originally introduced in TIP-19. This cocnept creates a monetary incentive to keep the ledger state small. This is achieved by enforcing a minimum IOTA coin deposit in every output based on the actually used disc space of the output itself. +This document describes a `dust protection` concept, called `storage deposit` which was originally introduced in TIP-19. This concept creates a monetary incentive to keep the ledger state small. This is achieved by enforcing a minimum IOTA coin deposit in every output based on the actually used disc space of the output itself. This document minimally extends on TIP-19 by allowing for additional weights to be defined in other TIPs and no longer includes the deposit calculation for each individual output. Instead, each TIP defining outputs has to include the deposit calculation. From 30fda3e548cca0704d13dcd4564dd0e74206a5a0 Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Fri, 25 Aug 2023 21:34:01 +0800 Subject: [PATCH 22/92] Resolve comments --- tips/TIPS-API/openapi3-core.yaml | 220 +++++++++++++++++++++---------- 1 file changed, 154 insertions(+), 66 deletions(-) diff --git a/tips/TIPS-API/openapi3-core.yaml b/tips/TIPS-API/openapi3-core.yaml index 2db2556f2..eb6b03859 100644 --- a/tips/TIPS-API/openapi3-core.yaml +++ b/tips/TIPS-API/openapi3-core.yaml @@ -157,12 +157,12 @@ paths: get: tags: - rewards - summary: Returns the totally available Mana rewards of an account or delegation output decayed up to epochEnd index provided in the response. + summary: Returns the totally available Mana rewards of an account or delegation output decayed up to endEpoch index provided in the response. description: >- Returns the totally available Mana rewards of an account or delegation output up until the current epoch index. Note that rewards for an epoch only become available at the beginning of the next epoch. If the end epoch of a staking feature is equal or greater than the current epoch, the rewards response will not include the potential future rewards for those epochs. - epochStart and epochEnd indicates the actual range for which reward value is returned and decayed for. + startEpoch and endEpoch indicates the actual range for which reward value is returned and decayed for. parameters: - in: path name: outputId @@ -260,7 +260,15 @@ paths: get: tags: - validators - summary: Returns information of all registered validators and if they are active. + summary: Returns information of all registered validators and if they are active, ordered by their holding stake. + parameters: + - in: query + name: pageSize + schema: + type: integer + example: 1 + required: false + description: The page number of validators. responses: '200': description: "Successful operation." @@ -315,7 +323,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/AccountStakingResponse' + $ref: '#/components/schemas/Validator' examples: AccountStakingResponse: $ref: '#/components/examples/get-validator-example' @@ -348,9 +356,9 @@ paths: get: tags: - blocks - summary: Returns information that are ideal for attaching a block. + summary: Return information that is used to attach a block in the network. description: >- - Returns information that are ideal for attaching a block. + Return information that is used to attach a block in the network, which includes parents, last finalized slot index and the latest commitment the node created. responses: '200': description: "Successful operation." @@ -699,8 +707,8 @@ paths: get: tags: - UTXO - summary: Returns the earliest block containing the tranaction that get confirmed. - description: Returns the earliest block containing the transaction that get confirmed. + summary: Returns the earliest block containing the transaction that was confirmed. + description: Returns the earliest block containing the transaction that was confirmed. parameters: - in: path name: transactionId @@ -754,9 +762,9 @@ paths: get: tags: - UTXO - summary: Find the metadata of the earliest block containing the transaction that get confirmed. + summary: Find the metadata of the earliest block containing the transaction that was confirmed. description: >- - Find the metadata of the earliest block containing the tx that get confirmed. + Find the metadata of the earliest block containing the transaction that was confirmed. parameters: - in: path name: transactionId @@ -1035,19 +1043,19 @@ components: version: 1.0.0 status: isHealthy: true - acceptedTangleTime: '1682328545' - relativeAcceptedTangleTime: '1682328550' - confirmedTangleTime: '1682328525' - relativeConfirmedTangleTime: '1682328535' + acceptedTangleTime: '1692966168000000000' + relativeAcceptedTangleTime: '1692966173856059205' + confirmedTangleTime: '1692966168000000000' + relativeConfirmedTangleTime: '1692966173855931045' latestCommitmentID: "0x8fb6cbb1ecf02c6b5a6a5a6a5f6c5a6a5f6c5a6a5a6a5a6a5f6c5a6a5a6a5f6c50000000000000000" latestFinalizedSlot: '100' latestAcceptedBlockSlot: '100' latestConfirmedBlockSlot: '95' pruningSlot: '20' metrics: - blocksPerSecond: '17' - confirmedBlocksPerSecond: '16.2' - confirmedRate: '98.82352941176471' + blocksPerSecond: '1.5E+00' + confirmedBlocksPerSecond: '1.5E+00"' + confirmationRate: '1E+02' protocolParameters: - startEpoch: '1' parameters: @@ -1058,8 +1066,10 @@ components: vByteCost: 500 vByteFactorData: 1 vByteFactorKey: 10 + vByteFactorIssuerKeys: 100 + vByteFactorStakingFeature: 100 workScoreStructure: - dataByte: 1 + dataKilobyte: 0 block: 100 missingParent: 500 input: 20 @@ -1072,7 +1082,7 @@ components: signatureEd25519: 200 minStrongParentsThreshold: 4 tokenSupply: "2779530283277761" - genesisUnixTimestamp: "1582328545" + genesisUnixTimestamp: "1692966168" slotDurationInSeconds: 10 slotsPerEpochExponent: 13 manaGenerationRate: 1 @@ -1084,9 +1094,19 @@ components: manaDecayFactorEpochsSum: 0 manaDecayFactorEpochsSumExponent: 0 stakingUnbondingPeriod: '10' - evictionAge: '6' livenessThreshold: '5' + minCommittableAge: '10' + maxCommittableAge: '20' epochNearingThreshold: '30' + congestionControlParameters: + rmcMin: '500' + increase: '500' + decrease: '500' + increaseThreshold: 800000 + decreaseThreshold: 500000 + schedulerRate: 100000 + minMana: '1' + maxBufferSize: 3276800 versionSignaling: windowSize: 7 windowTargetRatio: 5 @@ -1099,7 +1119,7 @@ components: subunit: "glow" useMetricPrefix: false features: - - allowIncompleteBlock + - allowincompleteblock get-buildingBlock-response-example: value: @@ -1173,7 +1193,7 @@ components: essence: type: 1 networkId: "1337133713371337" - creationTime: 1682328545 + creationSlot: '1692966292150937822' inputsCommitment: "0x0e6c2998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a79" inputs: - type: 0 @@ -1208,7 +1228,7 @@ components: value: protocolVersion: 3 networkId: "0" - issuingTime: "2023-07-31T13:14:57.310104314Z" + issuingTime: "1692966293697706488" slotCommitment: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000" latestFinalizedSlot: "0" issuerId: "0x375358f92cc94750669598b0aaa55a6ff73310b90710e1fad524c0f911be0fea" @@ -1227,7 +1247,7 @@ components: signature: type: 0 publicKey: "0x05c1de274451db8de8182d64c6ee0dca3ae0c9077e0b4330c976976171d79064" - signature: "0xae8a0ad932ff958576bcd787fd578dfb740b8a319d63595a3af7307f56f0afcbc6187d67eee20026aa39b6ba62c93d1a6e27111607b1b1d8f2206889284e9408" + signaturvByteFactoKeye: "0xae8a0ad932ff958576bcd787fd578dfb740b8a319d63595a3af7307f56f0afcbc6187d67eee20026aa39b6ba62c93d1a6e27111607b1b1d8f2206889284e9408" post-transaction-block-request-example-full: value: @@ -1238,7 +1258,7 @@ components: latestFinalizedSlot: "0" issuerId: "0x375358f92cc94750669598b0aaa55a6ff73310b90710e1fad524c0f911be0fea" block: - type: 1 + type: 0 strongParents: - "0x8d6f3b6e3a63ce388d2eb8c927c5b9ba328b0e427ae727d8b3dddc429f6fb24a0000000000000000" - "0x408a53af982c49d1398ab5c5b5f5b390d4c4da7da48b61bb9ba7f97c1e8dd7f60000000000000000" @@ -1253,7 +1273,7 @@ components: essence: type: 1 networkId: "1337133713371337" - creationTime: 1649442459 + creationSlot: '1649442459' inputsCommitment: "0x0e6c2998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a79" inputs: - type: 0 @@ -1309,14 +1329,14 @@ components: value: validators: - accountId: "0x309b169bfa60c8cf80afd730741862d200405d5df7cabfe9b564361dce1f7036" - stakingEpochEnd: '100' + stakingEndEpoch: '100' poolStake: '200000' validatorStake: '100000' fixedCost: '50000' active: false latestSupportedProtocolVersion: 3 - accountId: "0x897dr69bfa60c8cf80afd730741862d200405d5df7cabfe9b564361dce1f7036" - stakingEpochEnd: '100' + stakingEndEpoch: '100' poolStake: '205000' validatorStake: '90000' fixedCost: '52000' @@ -1328,7 +1348,7 @@ components: get-validator-example: value: accountId: "0x897dr69bfa60c8cf80afd730741862d200405d5df7cabfe9b564361dce1f7036" - stakingEpochEnd: '100' + stakingEndEpoch: '100' poolStake: '205000' validatorStake: '90000' fixedCost: '52000' @@ -1337,8 +1357,8 @@ components: get-mana-rewards-example: value: - epochStart: '60' - epochEnd: '80' + startEpoch: '60' + endEpoch: '80' rewards: '800000' get-congestion-estimate-response-example: @@ -1352,7 +1372,7 @@ components: value: protocolVersion: 3 networkId: "0" - issuingTime: "2023-07-31T13:14:57.310104314Z" + issuingTime: "1692966346513784862" slotCommitment: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000" latestFinalizedSlot: "0" issuerId: "0x375358f92cc94750669598b0aaa55a6ff73310b90710e1fad524c0f911be0fea" @@ -1373,7 +1393,7 @@ components: value: protocolVersion: 3 networkId: "0" - issuingTime: "2023-07-31T13:14:57.310104314Z" + issuingTime: "1692966346513784862" slotCommitment: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000" latestFinalizedSlot: "0" issuerId: "0x375358f92cc94750669598b0aaa55a6ff73310b90710e1fad524c0f911be0fea" @@ -1393,7 +1413,7 @@ components: essence: type: 1 networkId: "1337133713371337" - creationTime: 1649442459 + creationSlot: 1649442459 inputsCommitment: "0x0e6c2998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a79" inputs: - type: 0 @@ -1434,7 +1454,7 @@ components: value: protocolVersion: 3 networkId: "0" - issuingTime: "2023-07-31T13:14:57.310104314Z" + issuingTime: "1692966346513784862" slotCommitment: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000" latestFinalizedSlot: "0" issuerId: "0x375358f92cc94750669598b0aaa55a6ff73310b90710e1fad524c0f911be0fea" @@ -1459,7 +1479,7 @@ components: value: protocolVersion: 3 networkId: "0" - issuingTime: "2023-07-31T13:14:57.310104314Z" + issuingTime: "1692966346513784862" slotCommitment: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000" latestFinalizedSlot: "0" issuerId: "0x375358f92cc94750669598b0aaa55a6ff73310b90710e1fad524c0f911be0fea" @@ -1541,7 +1561,7 @@ components: description: Network version identifier. It also tells which network the node is running. issuingTime: type: string - description: The timestamp of issuing this block. + description: The timestamp of issuing this block, a uint64 string. slotCommitment: type: string description: The slot commitment contains in this block. @@ -1664,7 +1684,7 @@ components: networkId: type: string description: Network identifier. Plain string encoded number. This field signals for which network the block is meant for. It is computed out of the first 8 bytes of the `BLAKE2b-256` hash of the concatenation of the network name and protocol version string. - creationTime: + creationSlot: type: string description: The slot index in which the transaction was created. contextInputs: @@ -1706,7 +1726,7 @@ components: required: - type - networkId - - creationTime + - creationSlot - contextInputs - inputsCommitment - inputs @@ -2515,7 +2535,7 @@ components: type: string description: The latest slot that the node has committed to. latestFinalizedSlot: - description: The index of latest confirmed slot. + description: The index of latest finalized slot. type: string latestAcceptedBlockSlot: description: The slot index of the latest accepted block. @@ -2542,14 +2562,14 @@ components: description: The current rate of confirmed blocks per second. type: string format: float - confirmedRate: + confirmationRate: description: The ratio of confirmed blocks in relation to new blocks of the last confirmed slot. type: string format: float required: - blocksPerSecond - confirmedBlocksPerSecond - - confirmedRate + - confirmationRate protocolParameters: type: array items: @@ -2592,8 +2612,7 @@ components: - version - status - metrics - - supportedProtocolVersions - - protocol + - protocolParameters - baseToken - features @@ -2624,18 +2643,26 @@ components: vByteFactorData: description: Defines the factor to be used for data only fields. type: integer - vByteFactoKey: + vByteFactorKey: description: Defines the factor to be used for key/lookup generating fields. type: integer + vByteFactorIssuerKeys: + description: Defines the factor to be used for block issuer feature public keys. + type: integer + vByteFactorStakingFeature: + description: Defines the factor to be used for staking feature. + type: integer required: - vByteCost - vByteFactorData - - vByteFactoKey + - vByteFactorKey + - vByteFactorIssuerKeys + - vByteFactorStakingFeature workScoreStructure: description: Work structure lists the Work Score of each type, it is used to denote the computation costs of processing an object. properties: - dataByte: - description: DataByte accounts for the network traffic per byte. + dataKilobyte: + description: DataKilobyte accounts for the network traffic per kilobyte. type: integer block: description: Block accounts for work done to process a block in the node software. @@ -2670,6 +2697,19 @@ components: minStrongParentsThreshold: description: MinStrongParentsThreshold is the minimum amount of strong parents in a basic block, otherwise the issuer gets slashed. type: integer + required: + - dataKilobyte + - block + - missingParent + - input + - contextInput + - output + - nativeToken + - staking + - blockIssuer + - allotment + - signatureEd25519 + - minStrongParentsThreshold tokenSupply: type: string description: Current supply of base token. Plain string encoded number. @@ -2705,15 +2745,54 @@ components: stakingUnbondingPeriod: type: string description: The unbonding period in epochs before an account can stop staking. - evictionAge: - type: string - description: The age in slots when you can evict blocks by committing them into a slot commitments and when slots stop being a consumable accounts' state relative to the latest committed slot. livenessThreshold: type: string - description: Determine if a block is eligibile by evaluating issuingTime and commitments in its pastcone to ATT and lastCommittedSlot respectively. + description: Determine if a block is eligible by evaluating issuingTime and commitments in its pastcone to ATT and lastCommittedSlot respectively. + minCommittableAge: + type: string + description: MinCommittableAge is the minimum age relative to the accepted tangle time slot index that a slot can be committed. + maxCommittableAge: + type: string + description: MaxCommittableAge is the maximum age for a slot commitment to be included in a block relative to the slot index of the block issuing time. epochNearingThreshold: type: string description: Determine the slot that should trigger a new committee selection for the next and upcoming epoch. + congestionControlParameters: + description: Congestion Control Parameters defines the parameters used by to calculate the Reference Mana Cost (RMC). + properties: + rmcMin: + description: RMCMin is the minimum value of the reference Mana cost. + type: string + increase: + description: Increase is the increase step size of the reference Mana cost. + type: string + decrease: + description: Decrease is the decrease step size of the reference Mana cost. + type: string + increaseThreshold: + description: IncreaseThreshold is the threshold for increasing the reference Mana cost. + type: integer + decreaseThreshold: + description: DecreaseThreshold is the threshold for decreasing the reference Mana cost. + type: integer + schedulerRate: + description: SchedulerRate is the rate at which the scheduler runs in workscore units per second. + type: integer + minMana: + description: MinMana is the minimum amount of Mana that an account must have to have a block scheduled. + type: string + maxBufferSize: + description: MaxBufferSize is the maximum size of the buffer. + type: integer + required: + - rmcMin + - increase + - decrease + - increaseThreshold + - decreaseThreshold + - schedulerRate + - minMana + - maxBufferSize versionSignaling: description: The version signaling parameters. properties: @@ -2733,18 +2812,27 @@ components: - bech32Hrp - tokenSupply - rentStructure + - workScoreStructure - genesisUnixTimestamp - slotDurationInSeconds + - slotsPerEpochExponent + - manaGenerationRate + - manaGenerationRateExponent + - manaDecayFactors + - manaDecayFactorsExponent + - manaDecayFactorEpochsSum + - manaDecayFactorEpochsSumExponent + - stakingUnbondingPeriod + - livenessThreshold + - minCommittableAge + - maxCommittableAge - epochNearingThreshold + - congestionControlParameters + - versionSignaling required: - startEpoch - parameters - AccountStakingResponse: - description: Returns the requested staking information of the account. - oneOf: - - $ref: '#/components/schemas/Validator' - ValidatorsResponse: description: Returns a paginated list of all registered validators ready for the next epoch and indicates if they were active recently (are eligible for committee selection). properties: @@ -2763,12 +2851,12 @@ components: ManaRewardsResponse: description: Returns the mana rewards of an account or delegation output. properties: - EpochStart: + startEpoch: type: string description: The starting epoch index for which the mana rewards are returned. - EpochEnd: + endEpoch: type: string - description: The ending epoch index for which the mana rewards are returned, the decay is applied up to this point (including). + description: The ending epoch index for which the mana rewards are returned, the decay is applied up to this point (inclusive). rewards: type: string description: The amount of totally available rewards the requested output may claim. @@ -2814,7 +2902,7 @@ components: accountId: type: string description: The account identifier of the validator - stakingEpochEnd: + stakingEndEpoch: type: string description: The epoch index until which the validator registered to stake. poolStake: @@ -2828,13 +2916,13 @@ components: description: The fixed cost of the validator, which it receives as part of its Mana rewards. active: type: boolean - description: Shows weather validator was active recently. + description: Shows whether validator was active recently. latestSupportedProtocolVersion: type: integer description: The latest protocol version the validator supported. IssuanceBlockHeaderResponse: - description: Returns information that are ideal for attaching a block. + description: Return information that is used to attach a block in the network. properties: strongParents: type: array @@ -2881,7 +2969,7 @@ components: Commitment: - description: An object embedded to a block. + description: An object embedded to a block, containing a summary of a slot. properties: version: type: integer @@ -3000,8 +3088,8 @@ components: * `14` - denotes that the referenced input is created after transaction issuing time. * `15` - denotes that the mana amount is invalid. * `16` - denotes that the Block Issuance Credits amount is invalid. - * `17` - denotes that Reward Input is invalid. - * `18` - denotes that Commitment Input is invalid. + * `17` - denotes that Reward Context Input is invalid. + * `18` - denotes that Commitment Context Input is invalid. * `19` - denotes that Staking Feature is not provided in account output when claiming rewards. * `20` - denotes that fail to claim staking reward. * `21` - denotes that fail to claim delegation reward. From 6714d93de7e87f6371c54f625c3df90dd858e51c Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Mon, 28 Aug 2023 14:45:26 +0800 Subject: [PATCH 23/92] Fix typos --- tips/TIPS-API/openapi3-core.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tips/TIPS-API/openapi3-core.yaml b/tips/TIPS-API/openapi3-core.yaml index eb6b03859..77799a1d0 100644 --- a/tips/TIPS-API/openapi3-core.yaml +++ b/tips/TIPS-API/openapi3-core.yaml @@ -2758,7 +2758,7 @@ components: type: string description: Determine the slot that should trigger a new committee selection for the next and upcoming epoch. congestionControlParameters: - description: Congestion Control Parameters defines the parameters used by to calculate the Reference Mana Cost (RMC). + description: Congestion Control Parameters defines the parameters used to calculate the Reference Mana Cost (RMC). properties: rmcMin: description: RMCMin is the minimum value of the reference Mana cost. @@ -3104,7 +3104,7 @@ components: $ref: '#/components/schemas/Block' OutputResponse: - description: Returns an output and its metadata. + description: Returns an output. anyOf: - $ref: '#/components/schemas/BasicOutput' - $ref: '#/components/schemas/AccountOutput' From 71016ec2e47166edb5020de39738f1e870df69b1 Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Mon, 28 Aug 2023 17:36:18 +0800 Subject: [PATCH 24/92] Add description to versionSignaling parameters --- tips/TIPS-API/openapi3-core.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tips/TIPS-API/openapi3-core.yaml b/tips/TIPS-API/openapi3-core.yaml index 77799a1d0..4352060e6 100644 --- a/tips/TIPS-API/openapi3-core.yaml +++ b/tips/TIPS-API/openapi3-core.yaml @@ -2798,10 +2798,13 @@ components: properties: windowSize: type: integer + description: The size of the window in epochs to find which version of protocol parameters was most signaled, from currentEpoch - windowSize to currentEpoch. windowTargetRatio: type: integer + description: The target number of supporters for a version to win in a windowSize. activationOffset: type: integer + description: The offset in epochs to activate the new version of protocol parameters. required: - windowSize - windowTargetRatio From e907057b2292ab7065ac551fee3ec7bdb4ebfd23 Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Mon, 28 Aug 2023 18:42:39 +0800 Subject: [PATCH 25/92] Add Ed25519PublicKey --- tips/TIPS-API/openapi3-core.yaml | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/tips/TIPS-API/openapi3-core.yaml b/tips/TIPS-API/openapi3-core.yaml index 4352060e6..c4c3ce2a1 100644 --- a/tips/TIPS-API/openapi3-core.yaml +++ b/tips/TIPS-API/openapi3-core.yaml @@ -2263,8 +2263,8 @@ components: type: array description: The keys allowed to issue blocks from an account with a BlockIssuerFeature. items: - type: string - description: Ed25519 public key in Hex. + oneOf: + - $ref: '#/components/schemas/Ed25519PublicKey' expirySlot: type: string description: Indicates when the BlockIssuerKeys are expired. @@ -2273,6 +2273,19 @@ components: - blockIssuerKeys - expirySlot + Ed25519PublicKey: + description: The Ed25519 public key. + properties: + type: + type: integer + description: Set to value 0 to denote an Ed25519 Public key. + publicKey: + type: string + description: Ed25519 public key in Hex. + required: + - type + - publicKey + StakingFeature: description: A feature which indicates that this account can issue blocks. properties: From 8f9883a42c3defa5d0313947ca987f4da93b1f6a Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Mon, 4 Sep 2023 20:18:51 +0800 Subject: [PATCH 26/92] Resolve comments --- tips/TIPS-API/asyncapi3.yaml | 31 +++----- tips/TIPS-API/openapi3-core.yaml | 114 +++++++++++++++------------- tips/TIPS-API/openapi3-indexer.yaml | 14 ++-- 3 files changed, 80 insertions(+), 79 deletions(-) diff --git a/tips/TIPS-API/asyncapi3.yaml b/tips/TIPS-API/asyncapi3.yaml index f8923f2a9..a0db10e38 100644 --- a/tips/TIPS-API/asyncapi3.yaml +++ b/tips/TIPS-API/asyncapi3.yaml @@ -129,7 +129,7 @@ channels: schema: type: string examples: - - '0xcf5f77d62285b9ed8d617729e9232ae346a328c1897f0939837198e93ec13e85' + - '0xdbf86c778d69f413296c2d4d3086d76c74bf4d719e6e95c03a3d9a955ed39bcf3e00000000000000' subscribe: tags: - name: blocks @@ -356,9 +356,9 @@ components: payload: type: object required: - - commitmentSlotIndex + - commitmentIndex properties: - commitmentSlotIndex: + commitmentIndex: type: number description: The slot index of the commitment. example: 242412 @@ -374,14 +374,6 @@ components: format: binary example: >- 0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eb000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000020000016920b176f613ec7be59e68fc68f597eb3393af80f74c7c3db78198147d5f1f92640000000000000000018afe1f314622cc1ef52f16d619d1baccff81816b7e4e35fe268dc247b730acd65d5d2dd3f7df09000000000001000001f7868ab6bb55800b77b8b74191ad8285a9bf428ace579d541fda47661803ff44e0af5c34ad4edf475a01fb46e089a7afcab158b4a0133f32e889083e1c77eef65548933e0c6d2c3b0ac006cd77e77d778bf37b8d38d219fb62a9a2f718d4c9095100000000000000 - Receipt: - contentType: application/vnd.iota.serializer-v1 - description: The migration receipts in its serialized binary form. - payload: - type: string - format: binary - example: >- - 010000000000000000000000000000000000000000000000000000000000000000000000000000000 OutputPayload: contentType: application/json payload: @@ -415,7 +407,7 @@ components: blockId: type: string description: The ID of the block. - example: '0xcf5f77d62285b9ed8d617729e9232ae346a328c1897f0939837198e93ec13e85' + example: '0xdbf86c778d69f413296c2d4d3086d76c74bf4d719e6e95c03a3d9a955ed39bcf3e00000000000000' blockState: type: string description: If `pending`, the block is stored but not confirmed. If `confirmed`, the block is confirmed with the first level of knowledge. If `finalized`, the block is included and cannot be reverted anymore. If `rejected`, the block is rejected by the node, and user should reissue payload if it contains one. If `failed`, the block is not successfully issued due to failure reason. @@ -631,7 +623,7 @@ components: ExpirationUnlockCondition: description: >- Defines a unix time until which only Address, defined in Address Unlock - Condition, is allowed to unlock the output. After the unix time, only + Condition, is allowed to unlock the output. After the slot index, only Return Address can unlock it. properties: type: @@ -729,8 +721,8 @@ components: type: array description: The keys allowed to issue blocks from an account with a BlockIssuerFeature. items: - type: string - description: Ed25519 public key in Hex. + oneOf: + - $ref: '#/components/schemas/Ed25519PublicKey' expirySlot: type: integer description: Indicates when the BlockIssuerKeys are expired. @@ -874,6 +866,7 @@ components: - type - amount - mana + - unlockConditions AccountOutput: description: >- @@ -1075,16 +1068,12 @@ components: items: anyOf: - $ref: '#/components/schemas/MetadataFeature' - mana: - type: string - description: The stored mana held by the output. - example: '3000' required: - type - amount - serialNumber - tokenScheme - - mana + NFTOutput: description: 'Describes an NFT output, a globally unique token with metadata attached.' properties: @@ -1177,7 +1166,7 @@ components: blockId: type: string description: The ID of the block. - example: '0xcf5f77d62285b9ed8d617729e9232ae346a328c1897f0939837198e93ec13e85' + example: '0xdbf86c778d69f413296c2d4d3086d76c74bf4d719e6e95c03a3d9a955ed39bcf3e00000000000000' transactionId: type: string description: The ID of the transaction which created this output. diff --git a/tips/TIPS-API/openapi3-core.yaml b/tips/TIPS-API/openapi3-core.yaml index c4c3ce2a1..91aebfd54 100644 --- a/tips/TIPS-API/openapi3-core.yaml +++ b/tips/TIPS-API/openapi3-core.yaml @@ -71,8 +71,6 @@ paths: description: "Unsuccessful operation: indicates that the endpoint is not available for public use." '500': description: "Unsuccessful operation: indicates that an unexpected, internal server error happened which prevented the node from fulfilling the request." - '503': - description: "Unsuccessful operation: indicates that the node isn´t healthy." /api/core/v3/info: get: @@ -269,6 +267,13 @@ paths: example: 1 required: false description: The page number of validators. + - in: query + name: cursor + schema: + type: string + example: "16,20" + required: false + description: Starts the search from the cursor (requested slot index+start index). responses: '200': description: "Successful operation." @@ -308,7 +313,7 @@ paths: get: tags: - validators - summary: Return the information of requested staker. + summary: Return information about a validator. parameters: - in: path name: accountId @@ -470,7 +475,7 @@ paths: name: blockId schema: type: string - example: "0xf532a53545103276b46876c473846d98648ee418468bce76df4868648dd73e5d" + example: "0x2de585533d9c9684747e49f70e5e620a4e6c3fd1c7d8b73520c198c7def29a050200000000000000" required: true description: Identifier of the block. responses: @@ -536,7 +541,7 @@ paths: name: blockId schema: type: string - example: "0xf532a53545103276b46876c473846d98648ee418468bce76df4868648dd73e5d" + example: "0x2de585533d9c9684747e49f70e5e620a4e6c3fd1c7d8b73520c198c7def29a050200000000000000" required: true description: Identifier of the block. responses: @@ -1051,7 +1056,7 @@ components: latestFinalizedSlot: '100' latestAcceptedBlockSlot: '100' latestConfirmedBlockSlot: '95' - pruningSlot: '20' + pruningEpoch: '20' metrics: blocksPerSecond: '1.5E+00' confirmedBlocksPerSecond: '1.5E+00"' @@ -1148,7 +1153,7 @@ components: value: blockId: "0x8e7c2d36c236f7d44f26cf8c70b3d99e18e7d7390b32c9637c08c086d9475e6a" blockState: "pending" - txState: "pending" + transactionState: "pending" get-block-by-id-response-example-new: value: @@ -1159,7 +1164,7 @@ components: value: blockId: "0x8e7c2d36c236f7d44f26cf8c70b3d99e18e7d7390b32c9637c08c086d9475e6a" blockState: "confirmed" - txState: "confirmed" + transactionState: "confirmed" get-block-by-id-response-example-confirmed: value: @@ -1170,8 +1175,8 @@ components: value: blockId: "0x8e7c2d36c236f7d44f26cf8c70b3d99e18e7d7390b32c9637c08c086d9475e6a" blockState: "confirmed" - txState: "failed" - txFailureReason: 2 + transactionState: "failed" + transactionFailureReason: 2 post-tagged-data-block-request-example-minimal: value: @@ -1534,6 +1539,7 @@ components: prevId: "0x8fb6cbb1ecf02c6b5a6a5a6a5f6c5a6a5f6c5a6a5a6a5a6a5f6c5a6a5a6a5f6c50000000000000000" rootsId: "0xa4dd36465af63d495d35a05f592d42a51511c153e1bae8fad00453c8cbb48727" cumulativeWeight: '78901' + referencedManaCost: '600' get-commitment-response-binary-example: value: "070000000a1a0000977c626276b19ef8b3c445709f2f0f2ccc4abb98d97617f421f240c0d1ee066d4306e67a0321889ef8ec89b7eff1378049e058f0fa87a78c2452ae72631a5a99d913d1cbb3525b8faa1800e28dfcb28154bcba10154c39ef87ceda793cb44f58ae1549c88ea13fe4a9695bb6f0aba6cb756522209e5066a96039ae12b398b975693bdc21e222997c86ff9bfc5844f0372d58ff6fa510688e53c181bbdf4db41f9b627540a70e5751c026e543b2e8ab2eb06099daa1d1e5df47778f7787faab45cdf12fe3a80000000300d85e5b1590d898d1e0cdebb2e3b5337c8b76270142663d78811683ba47c17c989ad7a8f0ff2c6438bf435786d4a5b0125a5caf7367061b49a739389d5ebea234c0466c86f88a3f8add03bff04c2e34b214683f2f6983641e1d1185da7e2c3e0200d9922819a39e94ddf3907f4b9c8df93f39f026244fcb609205b9a879022599f218be2536d8b7b8547faa3dbdfe98339ebe9e2b2417a8a03eee02b2a8312b9e026dd0a33261a58a240cd0a1b06cdf1775d98d316f162d3eec402f4bf08bea2a0700f9d9656a60049083eef61487632187b351294c1fa23d118060d813db6d03e8b6ca8180d435708e826bc2042ccd667babb59c5cc461ff29dba966359fcd6fc511cdfdf10d6576f36ac2a6e5cb691e13968c13947ffbd9239939d3802b2fbe0f06" @@ -1774,7 +1780,7 @@ components: properties: type: type: integer - description: Set to value 3 to denote an a Reward Input. + description: Set to value 3 to denote a Reward Input. index: type: integer description: The index of the transaction input for which to claim rewards. @@ -1787,7 +1793,7 @@ components: properties: type: type: integer - description: Set to value 0 to denote an UTXO Input. + description: Set to value 0 to denote a UTXO Input. transactionId: type: string description: The BLAKE2b-256 hash of the transaction from which the UTXO comes from. Hex-encoded data with 0x prefix. @@ -1810,13 +1816,13 @@ components: description: The amount of IOTA tokens to deposit with this BasicOutput output. Plain string encoded number. nativeTokens: type: array - description: Native tokens held by the otuput. + description: Native tokens held by the output. items: anyOf: - $ref: '#/components/schemas/NativeToken' unlockConditions: type: array - description: Unlock condtions that define how the output an be unlocked in a transaction. + description: Unlock conditions that define how the output can be unlocked in a transaction. items: anyOf: - $ref: '#/components/schemas/AddressUnlockCondition' @@ -1853,7 +1859,7 @@ components: description: The stored mana held by the output. nativeTokens: type: array - description: Native tokens held by the otuput. + description: Native tokens held by the output. items: anyOf: - $ref: '#/components/schemas/NativeToken' @@ -1862,7 +1868,7 @@ components: description: The identifier of the account. stateIndex: type: integer - description: A counter that must increase by 1 every time the alias is state transitioned. + description: A counter that must increase by 1 every time the account is state transitioned. stateMetadata: type: string description: Hex-encoded metadata with 0x prefix that can only be changed by the state controller. @@ -1871,7 +1877,7 @@ components: description: A counter that denotes the number of foundries created by this account. unlockConditions: type: array - description: Unlock condtions that define how the output an be unlocked in a transaction. + description: Unlock conditions that define how the output can be unlocked in a transaction. items: anyOf: - $ref: '#/components/schemas/StateControllerAddressUnlockCondition' @@ -1958,7 +1964,7 @@ components: FoundryOutput: - description: Describes a foundry output that is controlled by an alias. + description: Describes a foundry output that is controlled by an account. properties: type: type: integer @@ -1968,7 +1974,7 @@ components: description: The amount of IOTA tokens to deposit with this output. Plain string encoded number. nativeTokens: type: array - description: Native tokens held by the otuput. + description: Native tokens held by the output. items: anyOf: - $ref: '#/components/schemas/NativeToken' @@ -1983,7 +1989,7 @@ components: - $ref: '#/components/schemas/SimpleTokenScheme' unlockConditions: type: array - description: Unlock condtions that define how the output an be unlocked in a transaction. + description: Unlock conditions that define how the output can be unlocked in a transaction. items: anyOf: - $ref: '#/components/schemas/ImmutableAccountAddressUnlockCondition' @@ -2000,15 +2006,11 @@ components: items: anyOf: - $ref: '#/components/schemas/MetadataFeature' - mana: - type: string - description: The stored mana held by the output. required: - type - amount - serialNumber - tokenScheme - - mana NFTOutput: description: Describes an NFT output, a globally unique token with metadata attached. @@ -2021,7 +2023,7 @@ components: description: The amount of IOTA tokens to deposit with this output. Plain string encoded number. nativeTokens: type: array - description: Native tokens held by the otuput. + description: Native tokens held by the output. items: anyOf: - $ref: '#/components/schemas/NativeToken' @@ -2030,7 +2032,7 @@ components: description: Unique identifier of the NFT, which is the BLAKE2b-256 hash of the Output ID that created it. NFT Address = NFT Address Type || NFT ID. Hex-encoded data with 0x prefix. unlockConditions: type: array - description: Unlock condtions that define how the output an be unlocked in a transaction. + description: Unlock conditions that define how the output can be unlocked in a transaction. items: anyOf: - $ref: '#/components/schemas/AddressUnlockCondition' @@ -2089,7 +2091,7 @@ components: - pubKeyHash AccountAddress: - description: Address of an alias account. + description: Address of an account output. properties: type: type: integer @@ -2163,11 +2165,11 @@ components: - amount TimelockUnlockCondition: - description: Can be unlocked if the CTT has a >= Unix Timestamp. + description: Can be unlocked if the CTT (Confirmed Tangle Time) has a >= Unix Timestamp. properties: type: type: integer - description: Set to value 2 to denote an Timelock Unlock Condition. + description: Set to value 2 to denote a Timelock Unlock Condition. slotIndex: type: string description: The slot index until which the timelock applies (inclusive). @@ -2197,7 +2199,7 @@ components: properties: type: type: integer - description: Set to value 4 to denote an Sate Controller Address Unlock Condition. + description: Set to value 4 to denote a State Controller Address Unlock Condition. address: oneOf: - $ref: '#/components/schemas/Ed25519Address' @@ -2212,7 +2214,7 @@ components: properties: type: type: integer - description: Set to value 5 to denote an Governor Address Unlock Condition. + description: Set to value 5 to denote a Governor Address Unlock Condition. address: oneOf: - $ref: '#/components/schemas/Ed25519Address' @@ -2298,7 +2300,7 @@ components: description: The amount of IOTA coins that are locked and staked in the containing account. fixedCost: type: string - description: Indicates when the BlockIssuerKeys are expired. + description: The fixed cost that the validator receives from the total pool reward. startEpoch: type: string description: The epoch index at which the staking starts. @@ -2343,7 +2345,7 @@ components: properties: type: type: integer - description: Set to value 0 to denote an Simple Token Scheme. + description: Set to value 0 to denote a Simple Token Scheme. mintedTokens: type: string description: Minted tokens controlled by this foundry. Hex-encoded number with 0x prefix. @@ -2360,7 +2362,7 @@ components: - maxSupply SignatureUnlock: - description: Defines an unlock containing signature(s) unlocking input(s). + description: Defines an unlock containing a signature to unlock an input. properties: type: type: integer @@ -2391,7 +2393,7 @@ components: - signature ReferenceUnlock: - description: References a previous unlock in order to substitute the duplication of the same unlock data for inputs which unlock through the same data. + description: ReferenceUnlock is an Unlock which references a previous unlock. properties: type: type: integer @@ -2404,11 +2406,11 @@ components: - reference AccountUnlock: - description: References a previous unlock that unlocks an Alias Output. + description: References a previous unlock that unlocks an Account Output. properties: type: type: integer - description: Set to value 2 to denote an Alias Unlock. + description: Set to value 2 to denote an Account Unlock. reference: type: integer description: Represents the index of a previous unlock. @@ -2536,19 +2538,19 @@ components: description: A notion of time that is anchored to the latest accepted block. type: string relativeAcceptedTangleTime: - description: The Accepted Tangle Time after it has advanced with the system clock. + description: The time after Accepted Tangle Time has advanced with the system clock. type: string confirmedTangleTime: description: A notion of time that is anchored to the latest confirmed block. type: string relativeConfirmedTangleTime: - description: The Confirmed Tangle Time after it has advanced with the system clock. + description: The time after Confirmed Tangle Time has advanced with the system clock. type: string latestCommitmentId: type: string description: The latest slot that the node has committed to. latestFinalizedSlot: - description: The index of latest finalized slot. + description: The index of the latest finalized slot. type: string latestAcceptedBlockSlot: description: The slot index of the latest accepted block. @@ -2556,14 +2558,20 @@ components: latestConfirmedBlockSlot: description: The slot index of the latest confirmed block. type: string - pruningSlot: + pruningEpoch: type: string description: The index of the slot before which the tangle history is pruned. required: - isHealthy + - acceptedTangleTime + - relativeAcceptedTangleTime + - confirmedTangleTime + - relativeConfirmedTangleTime - latestCommitmentId - latestFinalizedSlot - - pruningSlot + - latestAcceptedBlockSlot + - latestConfirmedBlockSlot + - pruningEpoch metrics: description: Node metrics. properties: @@ -2576,7 +2584,7 @@ components: type: string format: float confirmationRate: - description: The ratio of confirmed blocks in relation to new blocks of the last confirmed slot. + description: The ratio of confirmed blocks to new blocks of the last confirmed slot. type: string format: float required: @@ -2600,12 +2608,12 @@ components: unit: type: string description: The primary unit of the token. - decimals: - type: integer - description: Number of decimals the primary unit is divisible up to. subunit: type: string description: The name of the smallest possible denomination of the primary unit. subunit * 10^decimals = unit + decimals: + type: integer + description: Number of decimals the primary unit is divisible up to. useMetricPrefix: type: boolean description: Whether to use metric prefixes for displaying unit. @@ -2789,7 +2797,7 @@ components: description: DecreaseThreshold is the threshold for decreasing the reference Mana cost. type: integer schedulerRate: - description: SchedulerRate is the rate at which the scheduler runs in workscore units per second. + description: SchedulerRate is the rate at which the scheduler runs in workscore units per second. type: integer minMana: description: MinMana is the minimum amount of Mana that an account must have to have a block scheduled. @@ -2897,7 +2905,7 @@ components: - $ref: '#/components/schemas/CommitteeMember' CommitteeMember: - description: Returns information of a validator. + description: Returns information of a committee member. properties: accountId: type: string @@ -3006,6 +3014,9 @@ components: weight of issuers of accepted blocks within this slot. It is just an indication of "committed into" this slot, and can not strictly be used for evaluating the switching of a chain. + referencedManaCost: + type: string + description: This field provides the Reference Mana Cost (RMC) to be used in the slot with index Index + Max Committable Age. SubmitBlockRequest: description: Submits a block to the node. @@ -3065,7 +3076,7 @@ components: - rejected - failed description: If `pending`, the block is stored but not confirmed. If `confirmed`, the block is confirmed with the first level of knowledge. If `finalized`, the block is included and cannot be reverted anymore. If `rejected`, the block is rejected by the node, and user should reissue payload if it contains one. If `failed`, the block is not successfully issued due to failure reason. - txState: + transactionState: type: string enum: - pending @@ -3083,7 +3094,7 @@ components: * `3` - denotes that the block failed at the booker. * `4` - denotes that the block is dropped due to congestion. * `5` - denotes that the block is invalid. - txFailureReason: + transactionFailureReason: type: integer enum: [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,255] description: > @@ -3092,7 +3103,7 @@ components: * `2` - denotes that the transaction is conflicting with another transaction. Conflicting specifically means a double spend situation that both transaction pass all validation rules, eventually losing one(s) should have this reason. * `3` - denotes that the referenced UTXO is invalid. * `4` - denotes that the transaction is invalid. - * `5` - denotes that the sum of the inputs and output values does not match. + * `5` - denotes that the sum of the inputs and output base token amount does not match. * `6` - denotes that the unlock block signature is invalid. * `7` - denotes that the configured timelock is not yet expired. * `8` - denotes that the given native tokens are invalid. @@ -3112,6 +3123,7 @@ components: * `255` - denotes that the semantic validation failed. required: - blockId + - blockState BlockResponse: description: Returns a given block. diff --git a/tips/TIPS-API/openapi3-indexer.yaml b/tips/TIPS-API/openapi3-indexer.yaml index 1443328a7..efa9bae01 100644 --- a/tips/TIPS-API/openapi3-indexer.yaml +++ b/tips/TIPS-API/openapi3-indexer.yaml @@ -148,7 +148,7 @@ paths: schema: type: string example: 0c78e998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a790200.10 - description: Starts the search from the cursor (confirmationMS+outputId.pageSize). + description: Starts the search from the cursor (createdSlotIndex+outputId.pageSize). responses: '200': description: "Successful operation." @@ -258,7 +258,7 @@ paths: schema: type: string example: 0c78e998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a790200.10 - description: Starts the search from the cursor (confirmationMS+outputId.pageSize). + description: Starts the search from the cursor (createdSlotIndex+outputId.pageSize). responses: '200': description: "Successful operation." @@ -388,7 +388,7 @@ paths: schema: type: string example: 0c78e998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a790200.10 - description: Starts the search from the cursor (confirmationMS+outputId.pageSize). + description: Starts the search from the cursor (createdSlotIndex+outputId.pageSize). responses: '200': description: "Successful operation." @@ -480,7 +480,7 @@ paths: schema: type: string example: 0c78e998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a790200.10 - description: Starts the search from the cursor (confirmationMS+outputId.pageSize). + description: Starts the search from the cursor (createdSlotIndex+outputId.pageSize). responses: '200': description: "Successful operation." @@ -539,7 +539,7 @@ paths: schema: $ref: '#/components/schemas/OutputsResponse' examples: - Query results in single outout: + Query results in single output: $ref: >- #/components/examples/get-outputs-response-single-example '400': @@ -696,7 +696,7 @@ paths: schema: type: string example: 0c78e998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a790200.10 - description: Starts the search from the cursor (confirmationMS+outputId.pageSize). + description: Starts the search from the cursor (createdSlotIndex+outputId.pageSize). responses: '200': description: "Successful operation." @@ -755,7 +755,7 @@ paths: schema: $ref: '#/components/schemas/OutputsResponse' examples: - Query results in single outout: + Query results in single output: $ref: >- #/components/examples/get-outputs-response-single-example '400': From 51c445ef58ae9610de2d8c38c7f68380405ff5e1 Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Mon, 4 Sep 2023 20:24:52 +0800 Subject: [PATCH 27/92] Align Output ID in descriptions --- tips/TIPS-API/asyncapi3.yaml | 4 ++-- tips/TIPS-API/openapi3-core.yaml | 6 +++--- tips/TIPS-API/openapi3-indexer.yaml | 26 +++++++++++++------------- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/tips/TIPS-API/asyncapi3.yaml b/tips/TIPS-API/asyncapi3.yaml index a0db10e38..a89d7cd70 100644 --- a/tips/TIPS-API/asyncapi3.yaml +++ b/tips/TIPS-API/asyncapi3.yaml @@ -507,7 +507,7 @@ components: accountId: type: string description: >- - The hex-encoded BLAKE2b-256 hash of the outputId that created the + The hex-encoded BLAKE2b-256 hash of the Output ID that created the account. example: '0x1505ec099896ab05d9e08fbc7101ae4dff0093b3943b28f789ed2ca728bcc8d6' required: @@ -523,7 +523,7 @@ components: nftId: type: string description: >- - The hex-encoded BLAKE2b-256 hash of the outputId that created the + The hex-encoded BLAKE2b-256 hash of the Output ID that created the NFT. example: '0x19c82b32761fd8729a1a6c77f7c17597e4b9b01759794e52381f6a0050b0c11f' required: diff --git a/tips/TIPS-API/openapi3-core.yaml b/tips/TIPS-API/openapi3-core.yaml index 91aebfd54..20faab14b 100644 --- a/tips/TIPS-API/openapi3-core.yaml +++ b/tips/TIPS-API/openapi3-core.yaml @@ -1708,7 +1708,7 @@ components: - $ref: '#/components/schemas/UTXOInput' inputsCommitment: type: string - description: BLAKE2b-256 hash of the BLAKE2b-256 hashes of the serialized outputs referenced in Inputs by their outputIds (transactionId || outputIndex). Hex-encoded data with 0x prefix. + description: BLAKE2b-256 hash of the BLAKE2b-256 hashes of the serialized outputs referenced in Inputs by their Output IDs (Transaction ID || Output Index). Hex-encoded data with 0x prefix. outputs: type: array description: The outputs of this transaction. @@ -2098,7 +2098,7 @@ components: description: Set to value 8 to denote an Account Address. accountId: type: string - description: The hex-encoded, 0x prefixed BLAKE2b-256 hash of the outputId that created the account. + description: The hex-encoded, 0x prefixed BLAKE2b-256 hash of the Output ID that created the account. required: - type - accountId @@ -2111,7 +2111,7 @@ components: description: Set to value 16 to denote an NFT Address. nftId: type: string - description: The hex-encoded, 0x prefixed BLAKE2b-256 hash of the outputId that created the NFT. + description: The hex-encoded, 0x prefixed BLAKE2b-256 hash of the Output ID that created the NFT. required: - type - nftId diff --git a/tips/TIPS-API/openapi3-indexer.yaml b/tips/TIPS-API/openapi3-indexer.yaml index efa9bae01..2c890de2f 100644 --- a/tips/TIPS-API/openapi3-indexer.yaml +++ b/tips/TIPS-API/openapi3-indexer.yaml @@ -160,7 +160,7 @@ paths: Query results in 3 outputs: $ref: >- #/components/examples/get-outputs-response-three-example - No matching outputIds found: + No matching Output IDs found: $ref: >- #/components/examples/get-outputs-empty-response-example Paging - more items found than it can fit on single page: @@ -270,7 +270,7 @@ paths: Query results in 3 outputs: $ref: >- #/components/examples/get-outputs-response-three-example - No matching outputIds found: + No matching Output IDs found: $ref: >- #/components/examples/get-outputs-empty-response-example Paging - more items found than it can fit on single page: @@ -299,8 +299,8 @@ paths: get: tags: - account outputs - summary: Returns the outputId of the current unspent account output for accountId. - description: Returns the outputId of the current unspent account output for accountId. + summary: Returns the Output ID of the current unspent account output for accountId. + description: Returns the Output ID of the current unspent account output for accountId. parameters: - in: path name: accountId @@ -400,7 +400,7 @@ paths: Query results in 3 outputs: $ref: >- #/components/examples/get-outputs-response-three-example - No matching outputIds found: + No matching Output IDs found: $ref: >- #/components/examples/get-outputs-empty-response-example Paging - more items found than it can fit on single page: @@ -492,7 +492,7 @@ paths: Query results in 3 outputs: $ref: >- #/components/examples/get-outputs-response-three-example - No matching outputIds found: + No matching Output IDs found: $ref: >- #/components/examples/get-outputs-empty-response-example Paging - more items found than it can fit on single page: @@ -521,8 +521,8 @@ paths: get: tags: - foundry outputs - summary: Returns the outputId of the current unspent foundry output for foundryId. - description: Returns the outputId of the current unspent foundry output for foundryId. + summary: Returns the Output ID of the current unspent foundry output for foundryId. + description: Returns the Output ID of the current unspent foundry output for foundryId. parameters: - in: path name: foundryId @@ -708,7 +708,7 @@ paths: Query results in 3 outputs: $ref: >- #/components/examples/get-outputs-response-three-example - No matching outputIds found: + No matching Output IDs found: $ref: >- #/components/examples/get-outputs-empty-response-example Paging - more items found than it can fit on single page: @@ -737,8 +737,8 @@ paths: get: tags: - nft outputs - summary: Returns the outputId of the current unspent nft output for nftId. - description: Returns the outputId of the current nft output for nftId. + summary: Returns the Output ID of the current unspent nft output for nftId. + description: Returns the Output ID of the current nft output for nftId. parameters: - in: path name: nftId @@ -877,7 +877,7 @@ components: message: internal server error OutputsResponse: - description: Returns a list of OutputIds. + description: Returns a list of Output IDs. properties: ledgerIndex: type: integer @@ -888,7 +888,7 @@ components: nullable: true items: type: array - description: The output IDs (transaction hash + output index) of the outputs satisfying the query. Hex-encoded with 0x prefix. + description: The Output IDs (transaction hash + output index) of the outputs satisfying the query. Hex-encoded with 0x prefix. items: type: string required: From 5698d68be927457bed1318a221a8c91d1f2f5f61 Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Mon, 4 Sep 2023 20:33:22 +0800 Subject: [PATCH 28/92] Add vByteFactorDelegation --- tips/TIPS-API/openapi3-core.yaml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tips/TIPS-API/openapi3-core.yaml b/tips/TIPS-API/openapi3-core.yaml index 20faab14b..adbe83290 100644 --- a/tips/TIPS-API/openapi3-core.yaml +++ b/tips/TIPS-API/openapi3-core.yaml @@ -1073,6 +1073,7 @@ components: vByteFactorKey: 10 vByteFactorIssuerKeys: 100 vByteFactorStakingFeature: 100 + vByteFactorDelegation: 100 workScoreStructure: dataKilobyte: 0 block: 100 @@ -2673,12 +2674,16 @@ components: vByteFactorStakingFeature: description: Defines the factor to be used for staking feature. type: integer + vByteFactorDelegation: + description: Defines the factor to be used for delegation output. + type: integer required: - vByteCost - vByteFactorData - vByteFactorKey - vByteFactorIssuerKeys - vByteFactorStakingFeature + - vByteFactorDelegation workScoreStructure: description: Work structure lists the Work Score of each type, it is used to denote the computation costs of processing an object. properties: From fced043a3b89f8a12954d94b989728ec45af1a6a Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Mon, 4 Sep 2023 20:36:37 +0800 Subject: [PATCH 29/92] Update `16` Transaction Failure Reason description --- tips/TIPS-API/openapi3-core.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIPS-API/openapi3-core.yaml b/tips/TIPS-API/openapi3-core.yaml index adbe83290..9f713a2c2 100644 --- a/tips/TIPS-API/openapi3-core.yaml +++ b/tips/TIPS-API/openapi3-core.yaml @@ -3119,7 +3119,7 @@ components: * `13` - denotes that the chain state transition is invalid. * `14` - denotes that the referenced input is created after transaction issuing time. * `15` - denotes that the mana amount is invalid. - * `16` - denotes that the Block Issuance Credits amount is invalid. + * `16` - denotes that the Block Issuance Credits Input is invalid. * `17` - denotes that Reward Context Input is invalid. * `18` - denotes that Commitment Context Input is invalid. * `19` - denotes that Staking Feature is not provided in account output when claiming rewards. From 93227c50259fdc413b1beaec56c35360a14a3efb Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Mon, 4 Sep 2023 20:40:30 +0800 Subject: [PATCH 30/92] Update description of missingParent in workScoreStructure --- tips/TIPS-API/openapi3-core.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIPS-API/openapi3-core.yaml b/tips/TIPS-API/openapi3-core.yaml index 9f713a2c2..2070d8e1b 100644 --- a/tips/TIPS-API/openapi3-core.yaml +++ b/tips/TIPS-API/openapi3-core.yaml @@ -2694,7 +2694,7 @@ components: description: Block accounts for work done to process a block in the node software. type: integer missingParent: - description: MissingParent is used for slashing if there are not enough strong tips. + description: MissingParent is used to multiply for each missing parent if there are not enough strong ones. type: integer input: description: Input accounts for loading the UTXO from the database and performing the mana calculations. From f6e0f63ac058de9bec1a3015abbafd2b8da65392 Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Mon, 4 Sep 2023 20:51:22 +0800 Subject: [PATCH 31/92] Fix wrong block type --- tips/TIPS-API/openapi3-core.yaml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/tips/TIPS-API/openapi3-core.yaml b/tips/TIPS-API/openapi3-core.yaml index 2070d8e1b..ae18528ba 100644 --- a/tips/TIPS-API/openapi3-core.yaml +++ b/tips/TIPS-API/openapi3-core.yaml @@ -1183,7 +1183,7 @@ components: value: protocolVersion: 3 block: - type: 1 + type: 0 payload: type: 5 tag: "0x72616e646f6d207461673a206769746875622e636f6d" @@ -1193,7 +1193,7 @@ components: value: protocolVersion: 3 block: - type: 1 + type: 0 payload: type: 6 essence: @@ -1239,7 +1239,7 @@ components: latestFinalizedSlot: "0" issuerId: "0x375358f92cc94750669598b0aaa55a6ff73310b90710e1fad524c0f911be0fea" block: - type: 1 + type: 0 strongParents: - "0x2de585533d9c9684747e49f70e5e620a4e6c3fd1c7d8b73520c198c7def29a050200000000000000" - "0x5853745388056fb59c193dc6fe6f8c3f76bf8d82a42ed340eba621a9f5bb79790200000000000000" @@ -1383,7 +1383,7 @@ components: latestFinalizedSlot: "0" issuerId: "0x375358f92cc94750669598b0aaa55a6ff73310b90710e1fad524c0f911be0fea" block: - type: 1 + type: 0 strongParents: - "0x2de585533d9c9684747e49f70e5e620a4e6c3fd1c7d8b73520c198c7def29a050200000000000000" - "0x5853745388056fb59c193dc6fe6f8c3f76bf8d82a42ed340eba621a9f5bb79790200000000000000" @@ -1404,7 +1404,7 @@ components: latestFinalizedSlot: "0" issuerId: "0x375358f92cc94750669598b0aaa55a6ff73310b90710e1fad524c0f911be0fea" block: - type: 1 + type: 0 strongParents: - "0x8d6f3b6e3a63ce388d2eb8c927c5b9ba328b0e427ae727d8b3dddc429f6fb24a0000000000000000" - "0x408a53af982c49d1398ab5c5b5f5b390d4c4da7da48b61bb9ba7f97c1e8dd7f60000000000000000" @@ -1465,7 +1465,7 @@ components: latestFinalizedSlot: "0" issuerId: "0x375358f92cc94750669598b0aaa55a6ff73310b90710e1fad524c0f911be0fea" block: - type: 1 + type: 0 strongParents: - "0x2de585533d9c9684747e49f70e5e620a4e6c3fd1c7d8b73520c198c7def29a050200000000000000" - "0x5853745388056fb59c193dc6fe6f8c3f76bf8d82a42ed340eba621a9f5bb79790200000000000000" @@ -1490,7 +1490,7 @@ components: latestFinalizedSlot: "0" issuerId: "0x375358f92cc94750669598b0aaa55a6ff73310b90710e1fad524c0f911be0fea" block: - type: 2 + type: 1 strongParents: - "0x2de585533d9c9684747e49f70e5e620a4e6c3fd1c7d8b73520c198c7def29a050200000000000000" - "0x5853745388056fb59c193dc6fe6f8c3f76bf8d82a42ed340eba621a9f5bb79790200000000000000" @@ -2159,7 +2159,7 @@ components: - $ref: '#/components/schemas/NFTAddress' amount: type: string - description: Amount of IOTA tokens the consuming transaction should deposit to the address defined in Return Address. Plain string encoded number. + description: Amount of IOTA tokens the consuming transaction must deposit to the address defined in Return Address. Plain string encoded number. required: - type - returnAddress From 276c6f63e67db59d87be604463ecaac422f897de Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Tue, 5 Sep 2023 17:11:23 +0800 Subject: [PATCH 32/92] Add manaBitsExponent to protocol parameter --- tips/TIPS-API/openapi3-core.yaml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tips/TIPS-API/openapi3-core.yaml b/tips/TIPS-API/openapi3-core.yaml index ae18528ba..dbd1ad187 100644 --- a/tips/TIPS-API/openapi3-core.yaml +++ b/tips/TIPS-API/openapi3-core.yaml @@ -1091,6 +1091,7 @@ components: genesisUnixTimestamp: "1692966168" slotDurationInSeconds: 10 slotsPerEpochExponent: 13 + manaBitsExponent: 63 manaGenerationRate: 1 manaGenerationRateExponent: 0 manaDecayFactors: @@ -2748,6 +2749,9 @@ components: slotsPerEpochExponent: type: integer description: The number of slots in an epoch expressed as an exponent of 2. + manaBitsExponent: + type: integer + description: The number of bits used to represent Mana expressed as an exponent of 2. manaGenerationRate: type: integer description: The amount of potential Mana generated by 1 IOTA in 1 slot. @@ -2845,6 +2849,7 @@ components: - genesisUnixTimestamp - slotDurationInSeconds - slotsPerEpochExponent + - manaBitsExponent - manaGenerationRate - manaGenerationRateExponent - manaDecayFactors From bf8bfa23c8d029571a7c5d34cc3c099339670b83 Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Tue, 5 Sep 2023 18:19:58 +0800 Subject: [PATCH 33/92] Add Ed25519PublicKey to event API --- tips/TIPS-API/asyncapi3.yaml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tips/TIPS-API/asyncapi3.yaml b/tips/TIPS-API/asyncapi3.yaml index a89d7cd70..e445228af 100644 --- a/tips/TIPS-API/asyncapi3.yaml +++ b/tips/TIPS-API/asyncapi3.yaml @@ -1160,6 +1160,20 @@ components: - type - publicKey - signature + + Ed25519PublicKey: + description: The Ed25519 public key. + properties: + type: + type: integer + description: Set to value 0 to denote an Ed25519 Public key. + publicKey: + type: string + description: Ed25519 public key in Hex. + required: + - type + - publicKey + OutputMetadata: description: Metadata of an output. properties: From 3683e2e59efbce0f6a922a733b2e91c12b1cc0aa Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Wed, 6 Sep 2023 15:02:01 +0800 Subject: [PATCH 34/92] Make block failure reason in booker more descriptive --- tips/TIPS-API/asyncapi3.yaml | 9 +++++---- tips/TIPS-API/openapi3-core.yaml | 11 ++++++----- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/tips/TIPS-API/asyncapi3.yaml b/tips/TIPS-API/asyncapi3.yaml index e445228af..066c83eeb 100644 --- a/tips/TIPS-API/asyncapi3.yaml +++ b/tips/TIPS-API/asyncapi3.yaml @@ -428,14 +428,15 @@ components: example: failed blockFailureReason: type: integer - enum: [1,2,3,4,5] + enum: [1,2,3,4,5,6] description: | Values: * `1` - denotes that the block is too old to issue. * `2` - denotes that the block's parents are too old. - * `3` - denotes that the block failed at the booker. - * `4` - denotes that the block is dropped due to congestion. - * `5` - denotes that the block is invalid. + * `3` - denotes that one of block's parents does not exist. + * `4` - denotes that one of block's parents is invalid. + * `5` - denotes that the block is dropped due to congestion. + * `6` - denotes that the block is invalid. txFailureReason: type: integer enum: [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,255] diff --git a/tips/TIPS-API/openapi3-core.yaml b/tips/TIPS-API/openapi3-core.yaml index dbd1ad187..fb0b94100 100644 --- a/tips/TIPS-API/openapi3-core.yaml +++ b/tips/TIPS-API/openapi3-core.yaml @@ -3096,14 +3096,15 @@ components: description: If 'pending', the block contains not yet included transaction. If 'confirmed' means transaction is confirmed with the first level of knowledge. If 'finalized' means transaction is included and cannot be reverted anymore. If 'failed' means transaction is not successfully issued due to failure reason. blockFailureReason: type: integer - enum: [1,2,3,4,5] + enum: [1,2,3,4,5,6] description: > Values: * `1` - denotes that the block is too old to issue. - * `2` - denotes that the block's parents are too old. - * `3` - denotes that the block failed at the booker. - * `4` - denotes that the block is dropped due to congestion. - * `5` - denotes that the block is invalid. + * `2` - denotes that one of block's parents is too old. + * `3` - denotes that one of block's parents does not exist. + * `4` - denotes that one of block's parents is invalid. + * `5` - denotes that the block is dropped due to congestion. + * `6` - denotes that the block is invalid. transactionFailureReason: type: integer enum: [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,255] From ff9e4e1e8c0128644906a213b31067516e3bdcb7 Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Wed, 6 Sep 2023 15:06:38 +0800 Subject: [PATCH 35/92] Rename manaBitsExponent to manaBitsCount --- tips/TIPS-API/openapi3-core.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tips/TIPS-API/openapi3-core.yaml b/tips/TIPS-API/openapi3-core.yaml index fb0b94100..1250f29a5 100644 --- a/tips/TIPS-API/openapi3-core.yaml +++ b/tips/TIPS-API/openapi3-core.yaml @@ -1091,7 +1091,7 @@ components: genesisUnixTimestamp: "1692966168" slotDurationInSeconds: 10 slotsPerEpochExponent: 13 - manaBitsExponent: 63 + manaBitsCount: 63 manaGenerationRate: 1 manaGenerationRateExponent: 0 manaDecayFactors: @@ -2749,9 +2749,9 @@ components: slotsPerEpochExponent: type: integer description: The number of slots in an epoch expressed as an exponent of 2. - manaBitsExponent: + manaBitsCount: type: integer - description: The number of bits used to represent Mana expressed as an exponent of 2. + description: The number of bits used to represent Mana. manaGenerationRate: type: integer description: The amount of potential Mana generated by 1 IOTA in 1 slot. @@ -2849,7 +2849,7 @@ components: - genesisUnixTimestamp - slotDurationInSeconds - slotsPerEpochExponent - - manaBitsExponent + - manaBitsCount - manaGenerationRate - manaGenerationRateExponent - manaDecayFactors From b6876c33d5d3ed8b96533de9ce447e046b0501b7 Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Wed, 6 Sep 2023 15:23:33 +0800 Subject: [PATCH 36/92] Update protocol parameter hash example in core api --- tips/TIPS-API/openapi3-core.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIPS-API/openapi3-core.yaml b/tips/TIPS-API/openapi3-core.yaml index 1250f29a5..91f2b7d7c 100644 --- a/tips/TIPS-API/openapi3-core.yaml +++ b/tips/TIPS-API/openapi3-core.yaml @@ -1498,7 +1498,7 @@ components: weakParents: [] shallowLikeParents: [] highestSupportedVersion: 3 - protocolParametersHash: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000" + protocolParametersHash: "0x69449327e1973152a1d2fdff1c8f27428fc52e4f1cf0bb8006eae397714e1968" signature: type: 0 publicKey: "0x05c1de274451db8de8182d64c6ee0dca3ae0c9077e0b4330c976976171d79064" From 450b51911994700151b6ab67b19ab43840e5e791 Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Thu, 7 Sep 2023 14:22:58 +0800 Subject: [PATCH 37/92] Update cursor description in ValidatorResponse --- tips/TIPS-API/openapi3-core.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIPS-API/openapi3-core.yaml b/tips/TIPS-API/openapi3-core.yaml index 91f2b7d7c..737791a4e 100644 --- a/tips/TIPS-API/openapi3-core.yaml +++ b/tips/TIPS-API/openapi3-core.yaml @@ -2880,7 +2880,7 @@ components: description: The number of validators returned per one API request with pagination. cursor: type: string - description: The cursor that needs to be provided as cursor query parameter to request the next page. If empty, this was the last page. + description: The cursor that needs to be provided as cursor query parameter to request the next page. Cursor is absent if the last page is returned. ManaRewardsResponse: description: Returns the mana rewards of an account or delegation output. From 21d773b24bc0a7ff6875766225136f039834c13e Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Tue, 12 Sep 2023 15:00:24 +0800 Subject: [PATCH 38/92] Rename SlotCommitment to SlotCommitmentId in Blocks --- tips/TIPS-API/openapi3-core.yaml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/tips/TIPS-API/openapi3-core.yaml b/tips/TIPS-API/openapi3-core.yaml index 737791a4e..06f881e4c 100644 --- a/tips/TIPS-API/openapi3-core.yaml +++ b/tips/TIPS-API/openapi3-core.yaml @@ -1236,7 +1236,7 @@ components: protocolVersion: 3 networkId: "0" issuingTime: "1692966293697706488" - slotCommitment: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000" + slotCommitmentId: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000" latestFinalizedSlot: "0" issuerId: "0x375358f92cc94750669598b0aaa55a6ff73310b90710e1fad524c0f911be0fea" block: @@ -1261,7 +1261,7 @@ components: protocolVersion: 3 networkId: "0" issuingTime: "2023-07-31T13:14:57.310104314Z" - slotCommitment: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000" + slotCommitmentId: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000" latestFinalizedSlot: "0" issuerId: "0x375358f92cc94750669598b0aaa55a6ff73310b90710e1fad524c0f911be0fea" block: @@ -1380,7 +1380,7 @@ components: protocolVersion: 3 networkId: "0" issuingTime: "1692966346513784862" - slotCommitment: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000" + slotCommitmentId: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000" latestFinalizedSlot: "0" issuerId: "0x375358f92cc94750669598b0aaa55a6ff73310b90710e1fad524c0f911be0fea" block: @@ -1401,7 +1401,7 @@ components: protocolVersion: 3 networkId: "0" issuingTime: "1692966346513784862" - slotCommitment: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000" + slotCommitmentId: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000" latestFinalizedSlot: "0" issuerId: "0x375358f92cc94750669598b0aaa55a6ff73310b90710e1fad524c0f911be0fea" block: @@ -1462,7 +1462,7 @@ components: protocolVersion: 3 networkId: "0" issuingTime: "1692966346513784862" - slotCommitment: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000" + slotCommitmentId: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000" latestFinalizedSlot: "0" issuerId: "0x375358f92cc94750669598b0aaa55a6ff73310b90710e1fad524c0f911be0fea" block: @@ -1487,7 +1487,7 @@ components: protocolVersion: 3 networkId: "0" issuingTime: "1692966346513784862" - slotCommitment: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000" + slotCommitmentId: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000" latestFinalizedSlot: "0" issuerId: "0x375358f92cc94750669598b0aaa55a6ff73310b90710e1fad524c0f911be0fea" block: @@ -1570,9 +1570,9 @@ components: issuingTime: type: string description: The timestamp of issuing this block, a uint64 string. - slotCommitment: + slotCommitmentId: type: string - description: The slot commitment contains in this block. + description: The slot commitment ID contains in this block. latestFinalizedSlot: type: string description: The latest finalized slot of issuing node. @@ -1652,7 +1652,7 @@ components: description: The highest supported version of the protocol. protocolParametersHash: type: string - description: The hash of the protocol parameters for the HighestSupportedVersion. + description: The hash of the protocol parameters for the highestSupportedVersion. required: - type - strongParents @@ -1688,7 +1688,7 @@ components: properties: type: type: integer - description: Set to value 1 to denote a Transaction Essence. + description: Set to value 2 to denote a Transaction Essence. networkId: type: string description: Network identifier. Plain string encoded number. This field signals for which network the block is meant for. It is computed out of the first 8 bytes of the `BLAKE2b-256` hash of the concatenation of the network name and protocol version string. @@ -3040,7 +3040,7 @@ components: issuingTime: type: string description: The timestamp of issuing this block. - slotCommitment: + slotCommitmentId: type: string description: The slot commitment contains in this block. latestFinalizedSlot: From eaf2b28fdd18ddccf4457a58abe953e1fccad99d Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Wed, 13 Sep 2023 16:23:00 +0800 Subject: [PATCH 39/92] Rename prevId to previousCommitmentId --- tips/TIPS-API/asyncapi3.yaml | 4 ++-- tips/TIPS-API/openapi3-core.yaml | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tips/TIPS-API/asyncapi3.yaml b/tips/TIPS-API/asyncapi3.yaml index 066c83eeb..a35c58f77 100644 --- a/tips/TIPS-API/asyncapi3.yaml +++ b/tips/TIPS-API/asyncapi3.yaml @@ -320,13 +320,13 @@ components: required: - index - rootsId - - prevId + - previousCommitmentId properties: index: type: string description: The slot index of the commitment. example: '200' - prevId: + previousCommitmentId: type: string description: The commitment identifier of the previous slot. example: "0x8fb6cbb1ecf02c6b5a6a5a6a5f6c5a6a5f6c5a6a5a6a5a6a5f6c5a6a5a6a5f6c50000000000000000" diff --git a/tips/TIPS-API/openapi3-core.yaml b/tips/TIPS-API/openapi3-core.yaml index 06f881e4c..f04b33971 100644 --- a/tips/TIPS-API/openapi3-core.yaml +++ b/tips/TIPS-API/openapi3-core.yaml @@ -1143,7 +1143,7 @@ components: commitment: version: 3 index: '1432' - prevId: "0xbf07dc16986166953f5a72c19d78642aab6cbde63964a2369ec3d425144eb42b3800000000000000" + previousCommitmentId: "0xbf07dc16986166953f5a72c19d78642aab6cbde63964a2369ec3d425144eb42b3800000000000000" rootsId: "0xa4dd36465af63d495d35a05f592d42a51511c153e1bae8fad00453c8cbb48727" cumulativeWeight: '45678' @@ -1538,7 +1538,7 @@ components: get-commitment-response-example: value: index: '986' - prevId: "0x8fb6cbb1ecf02c6b5a6a5a6a5f6c5a6a5f6c5a6a5a6a5a6a5f6c5a6a5a6a5f6c50000000000000000" + previousCommitmentId: "0x8fb6cbb1ecf02c6b5a6a5a6a5f6c5a6a5f6c5a6a5a6a5a6a5f6c5a6a5a6a5f6c50000000000000000" rootsId: "0xa4dd36465af63d495d35a05f592d42a51511c153e1bae8fad00453c8cbb48727" cumulativeWeight: '78901' referencedManaCost: '600' @@ -3011,7 +3011,7 @@ components: index: type: string description: The slot index of the commitment. - prevId: + previousCommitmentId: type: string description: The commitment identifier of the previous slot. rootsId: From c603944fe2662102e5d85bf01d6ba4a86a1a0cb0 Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Thu, 14 Sep 2023 16:07:03 +0800 Subject: [PATCH 40/92] Rename referencedManaCost to referenceManaCost and fill in missing field in the example --- tips/TIPS-API/openapi3-core.yaml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tips/TIPS-API/openapi3-core.yaml b/tips/TIPS-API/openapi3-core.yaml index f04b33971..701c5ea9c 100644 --- a/tips/TIPS-API/openapi3-core.yaml +++ b/tips/TIPS-API/openapi3-core.yaml @@ -1146,6 +1146,7 @@ components: previousCommitmentId: "0xbf07dc16986166953f5a72c19d78642aab6cbde63964a2369ec3d425144eb42b3800000000000000" rootsId: "0xa4dd36465af63d495d35a05f592d42a51511c153e1bae8fad00453c8cbb48727" cumulativeWeight: '45678' + referenceManaCost: '12345' post-blocks-response-example: value: @@ -1541,7 +1542,7 @@ components: previousCommitmentId: "0x8fb6cbb1ecf02c6b5a6a5a6a5f6c5a6a5f6c5a6a5a6a5a6a5f6c5a6a5a6a5f6c50000000000000000" rootsId: "0xa4dd36465af63d495d35a05f592d42a51511c153e1bae8fad00453c8cbb48727" cumulativeWeight: '78901' - referencedManaCost: '600' + referenceManaCost: '600' get-commitment-response-binary-example: value: "070000000a1a0000977c626276b19ef8b3c445709f2f0f2ccc4abb98d97617f421f240c0d1ee066d4306e67a0321889ef8ec89b7eff1378049e058f0fa87a78c2452ae72631a5a99d913d1cbb3525b8faa1800e28dfcb28154bcba10154c39ef87ceda793cb44f58ae1549c88ea13fe4a9695bb6f0aba6cb756522209e5066a96039ae12b398b975693bdc21e222997c86ff9bfc5844f0372d58ff6fa510688e53c181bbdf4db41f9b627540a70e5751c026e543b2e8ab2eb06099daa1d1e5df47778f7787faab45cdf12fe3a80000000300d85e5b1590d898d1e0cdebb2e3b5337c8b76270142663d78811683ba47c17c989ad7a8f0ff2c6438bf435786d4a5b0125a5caf7367061b49a739389d5ebea234c0466c86f88a3f8add03bff04c2e34b214683f2f6983641e1d1185da7e2c3e0200d9922819a39e94ddf3907f4b9c8df93f39f026244fcb609205b9a879022599f218be2536d8b7b8547faa3dbdfe98339ebe9e2b2417a8a03eee02b2a8312b9e026dd0a33261a58a240cd0a1b06cdf1775d98d316f162d3eec402f4bf08bea2a0700f9d9656a60049083eef61487632187b351294c1fa23d118060d813db6d03e8b6ca8180d435708e826bc2042ccd667babb59c5cc461ff29dba966359fcd6fc511cdfdf10d6576f36ac2a6e5cb691e13968c13947ffbd9239939d3802b2fbe0f06" @@ -3024,7 +3025,7 @@ components: weight of issuers of accepted blocks within this slot. It is just an indication of "committed into" this slot, and can not strictly be used for evaluating the switching of a chain. - referencedManaCost: + referenceManaCost: type: string description: This field provides the Reference Mana Cost (RMC) to be used in the slot with index Index + Max Committable Age. From f005d5a0949de987c481dc3a54cb35e1345ae375 Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Thu, 14 Sep 2023 20:59:28 +0800 Subject: [PATCH 41/92] Fix typo --- tips/TIPS-API/openapi3-core.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIPS-API/openapi3-core.yaml b/tips/TIPS-API/openapi3-core.yaml index 701c5ea9c..3a8f0dcf5 100644 --- a/tips/TIPS-API/openapi3-core.yaml +++ b/tips/TIPS-API/openapi3-core.yaml @@ -1255,7 +1255,7 @@ components: signature: type: 0 publicKey: "0x05c1de274451db8de8182d64c6ee0dca3ae0c9077e0b4330c976976171d79064" - signaturvByteFactoKeye: "0xae8a0ad932ff958576bcd787fd578dfb740b8a319d63595a3af7307f56f0afcbc6187d67eee20026aa39b6ba62c93d1a6e27111607b1b1d8f2206889284e9408" + signature: "0xae8a0ad932ff958576bcd787fd578dfb740b8a319d63595a3af7307f56f0afcbc6187d67eee20026aa39b6ba62c93d1a6e27111607b1b1d8f2206889284e9408" post-transaction-block-request-example-full: value: From 0f9aa6e2277e788f2d5438b20dac6e303dfc435f Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Tue, 19 Sep 2023 21:48:03 +0800 Subject: [PATCH 42/92] Rename vByteFactorIssuerKeys to vByteFactorBlockIssuerKey --- tips/TIPS-API/openapi3-core.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tips/TIPS-API/openapi3-core.yaml b/tips/TIPS-API/openapi3-core.yaml index 3a8f0dcf5..b8a095aa8 100644 --- a/tips/TIPS-API/openapi3-core.yaml +++ b/tips/TIPS-API/openapi3-core.yaml @@ -1071,7 +1071,7 @@ components: vByteCost: 500 vByteFactorData: 1 vByteFactorKey: 10 - vByteFactorIssuerKeys: 100 + vByteFactorBlockIssuerKey: 100 vByteFactorStakingFeature: 100 vByteFactorDelegation: 100 workScoreStructure: @@ -2670,7 +2670,7 @@ components: vByteFactorKey: description: Defines the factor to be used for key/lookup generating fields. type: integer - vByteFactorIssuerKeys: + vByteFactorBlockIssuerKey: description: Defines the factor to be used for block issuer feature public keys. type: integer vByteFactorStakingFeature: @@ -2683,7 +2683,7 @@ components: - vByteCost - vByteFactorData - vByteFactorKey - - vByteFactorIssuerKeys + - vByteFactorBlockIssuerKey - vByteFactorStakingFeature - vByteFactorDelegation workScoreStructure: From 59af75a9d67b8af5ad3d49dabb41ee5482d768ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daria=20Dziuba=C5=82towska?= Date: Wed, 20 Sep 2023 09:47:42 +0200 Subject: [PATCH 43/92] Change Cumulative Weight description --- tips/TIPS-API/openapi3-core.yaml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/tips/TIPS-API/openapi3-core.yaml b/tips/TIPS-API/openapi3-core.yaml index b8a095aa8..abdda1224 100644 --- a/tips/TIPS-API/openapi3-core.yaml +++ b/tips/TIPS-API/openapi3-core.yaml @@ -3020,11 +3020,9 @@ components: description: The digest of multiple merkle roots within this slot. cumulativeWeight: type: string - description: + description: The sum of previous slot commitment cumulative weight and - weight of issuers of accepted blocks within this slot. - It is just an indication of "committed into" this slot, - and can not strictly be used for evaluating the switching of a chain. + weight of issuers of accepted blocks within index minus Maximum Committable Age. It indicates the weight of the chain at index minus Maximum Committable Age committed at index slot. referenceManaCost: type: string description: This field provides the Reference Mana Cost (RMC) to be used in the slot with index Index + Max Committable Age. From 793a84d8588af28272c7ac0f06d0aed7a03ed6ba Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Fri, 22 Sep 2023 15:50:14 +0800 Subject: [PATCH 44/92] Update event API spec --- tips/TIPS-API/asyncapi3.yaml | 60 ++++++++++++++---------------------- 1 file changed, 23 insertions(+), 37 deletions(-) diff --git a/tips/TIPS-API/asyncapi3.yaml b/tips/TIPS-API/asyncapi3.yaml index a35c58f77..4669b8755 100644 --- a/tips/TIPS-API/asyncapi3.yaml +++ b/tips/TIPS-API/asyncapi3.yaml @@ -137,20 +137,20 @@ channels: description: Publishes metadata of a particular block whenever its metadata changes. message: $ref: '#/components/messages/BlockMetadata' - block-metadata/confirmed: + block-metadata/accepted: subscribe: tags: - name: blocks - operationId: blockMetadataConfirmed - description: Publishes metadata of a block whenever it gets confirmed. + operationId: blockMetadataAccepted + description: Publishes metadata of a block whenever it gets accepted. message: $ref: '#/components/messages/BlockMetadata' - block-metadata/finalized: + block-metadata/confirmed: subscribe: tags: - name: blocks - operationId: blockMetadataFinalized - description: Publishes metadata of a block whenever it gets finalized. + operationId: blockMetadataConfirmed + description: Publishes metadata of a block whenever it gets confirmed. message: $ref: '#/components/messages/BlockMetadata' 'transactions/{transactionId}/included-block': @@ -188,24 +188,6 @@ channels: message: $ref: '#/components/messages/OutputPayload' - 'output-metadata/{outputId}': - parameters: - outputId: - description: Hex encoded identifier of the output. - schema: - type: string - examples: - - '0xd026f8b1c856d4e844cc734bbe095429fb880ec4d93f3ccffe3b292a7de17be70000' - subscribe: - tags: - - name: outputs - operationId: outputMetadata - description: >- - Publishes the given wanted output metadata on subscription and when its state - changes (created, spent). - message: - $ref: '#/components/messages/OutputMetadataPayload' - 'outputs/account/{accountId}': parameters: accountId: @@ -379,6 +361,9 @@ components: payload: type: object properties: + metadata: + oneOf: + - $ref: '#/components/schemas/OutputMetadata' output: anyOf: - $ref: '#/components/schemas/BasicOutput' @@ -386,15 +371,6 @@ components: - $ref: '#/components/schemas/FoundryOutput' - $ref: '#/components/schemas/NFTOutput' - $ref: '#/components/schemas/DelegationOutput' - - OutputMetadataPayload: - contentType: application/json - payload: - type: object - properties: - metadata: - oneOf: - - $ref: '#/components/schemas/OutputMetadata' BlockMetadata: contentType: application/json @@ -1194,6 +1170,10 @@ components: type: boolean description: Whether the output is spent or not. example: true + spentSlot: + type: integer + description: The slot at which the output was spent. + example: 20 commitmentIdSpent: type: string description: The commitment ID of the slot at which this output was spent. @@ -1202,17 +1182,23 @@ components: type: string description: The transaction this output was spent with. example: '0xe526f8b1c856d4e844cc734bbe095429fb880ec4d93f3ccffe3b292a7de17be7' + includedSlot: + type: integer + description: The slot at which the output was included into the ledger. + example: 15 includedCommitmentId: type: string description: The commitment ID at which the output was included into the ledger. example: '0xe526f8b1c856d4e844cc734bbe095429fb880ec4d93f3ccffe3b292a7de17be7' - latestCommitmentId: - type: string - description: The current latest commitment id for which the request was made. - example: '0x7c62d9b9ed3c1f3ef942a7ea17ec1270d77c109f0ba57b6c2d2b9e9fb3e69a3a' + ledgerIndex: + type: integer + description: The current ledger index for which the request was made. + example: 25 required: - blockId - transactionId - outputIndex - isSpent + - includedSlot - includedCommitmentId + - ledgerIndex From 071871138169612d27b850296e49abb8a9a196fb Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Tue, 26 Sep 2023 10:24:07 +0800 Subject: [PATCH 45/92] Update protocol params --- tips/TIPS-API/openapi3-core.yaml | 144 +++++++++++++++++++++++-------- 1 file changed, 106 insertions(+), 38 deletions(-) diff --git a/tips/TIPS-API/openapi3-core.yaml b/tips/TIPS-API/openapi3-core.yaml index b8a095aa8..261ea59e5 100644 --- a/tips/TIPS-API/openapi3-core.yaml +++ b/tips/TIPS-API/openapi3-core.yaml @@ -1064,6 +1064,7 @@ components: protocolParameters: - startEpoch: '1' parameters: + type: 0 version: 3 networkName: iota-core-testnet bech32Hrp: rms @@ -1075,7 +1076,7 @@ components: vByteFactorStakingFeature: 100 vByteFactorDelegation: 100 workScoreStructure: - dataKilobyte: 0 + dataByte: 0 block: 100 missingParent: 500 input: 20 @@ -1091,22 +1092,25 @@ components: genesisUnixTimestamp: "1692966168" slotDurationInSeconds: 10 slotsPerEpochExponent: 13 - manaBitsCount: 63 - manaGenerationRate: 1 - manaGenerationRateExponent: 0 - manaDecayFactors: - - 10 - - 20 - manaDecayFactorsExponent: 0 - manaDecayFactorEpochsSum: 0 - manaDecayFactorEpochsSumExponent: 0 + manaStructure: + bitsCount: 63 + generationRate: 1 + generationRateExponent: 0 + decayFactors: + - 10 + - 20 + decayFactorsExponent: 0 + decayFactorEpochsSum: 0 + decayFactorEpochsSumExponent: 0 stakingUnbondingPeriod: '10' + validationBlocksPerSlot: 10 + punishmentEpochs: '10' livenessThreshold: '5' minCommittableAge: '10' maxCommittableAge: '20' epochNearingThreshold: '30' congestionControlParameters: - rmcMin: '500' + minReferenceManaCost: '500' increase: '500' decrease: '500' increaseThreshold: 800000 @@ -1114,10 +1118,19 @@ components: schedulerRate: 100000 minMana: '1' maxBufferSize: 3276800 + maxValidationBufferSize: 100 versionSignaling: windowSize: 7 windowTargetRatio: 5 activationOffset: 7 + rewardsParameters": + validatorBlocksPerSlot: 10 + profitMarginExponent: 8 + bootstrappinDuration: "1154" + manaShareCoefficient: "2" + decayBalancingConstantExponent: 8 + decayBalancingConstant: "1" + poolCoefficientExponent: 31 baseToken: name: "Shimmer" tickerSymbol: "SMR" @@ -2649,6 +2662,9 @@ components: parameters: description: The protocol parameters. properties: + type: + type: integer + description: Set to value 0 to denote a IOTA 2.0 protocol parameter. version: type: integer description: Protocol version used by the network. @@ -2689,7 +2705,7 @@ components: workScoreStructure: description: Work structure lists the Work Score of each type, it is used to denote the computation costs of processing an object. properties: - dataKilobyte: + dataByte: description: DataKilobyte accounts for the network traffic per kilobyte. type: integer block: @@ -2726,7 +2742,7 @@ components: description: MinStrongParentsThreshold is the minimum amount of strong parents in a basic block, otherwise the issuer gets slashed. type: integer required: - - dataKilobyte + - dataByte - block - missingParent - input @@ -2750,32 +2766,49 @@ components: slotsPerEpochExponent: type: integer description: The number of slots in an epoch expressed as an exponent of 2. - manaBitsCount: - type: integer - description: The number of bits used to represent Mana. - manaGenerationRate: - type: integer - description: The amount of potential Mana generated by 1 IOTA in 1 slot. - manaGenerationRateExponent: - type: integer - description: The scaling of ManaGenerationRate expressed as an exponent of 2. - manaDecayFactors: - type: array - description: a lookup table of epoch index diff to mana decay factor (slice index 0 = 1 epoch). - items: - type: integer - manaDecayFactorsExponent: - type: integer - description: The scaling of ManaDecayFactors expressed as an exponent of 2. - manaDecayFactorEpochsSum: - type: integer - description: An integer approximation of the sum of decay over epochs. - manaDecayFactorEpochsSumExponent: - type: integer - description: The scaling of ManaDecayFactorEpochsSum expressed as an exponent of 2. + manaStructure: + description: Mana Structure defines the parameters used by mana calculation. + properties: + bitsCount: + type: integer + description: The number of bits used to represent Mana. + generationRate: + type: integer + description: The amount of potential Mana generated by 1 IOTA in 1 slot. + generationRateExponent: + type: integer + description: The scaling of GenerationRate expressed as an exponent of 2. + decayFactors: + type: array + description: a lookup table of epoch index diff to mana decay factor (slice index 0 = 1 epoch). + items: + type: integer + decayFactorsExponent: + type: integer + description: The scaling of DecayFactors expressed as an exponent of 2. + decayFactorEpochsSum: + type: integer + description: An integer approximation of the sum of decay over epochs. + decayFactorEpochsSumExponent: + type: integer + description: The scaling of DecayFactorEpochsSum expressed as an exponent of 2. + required: + - bitsCount + - generationRate + - generationRateExponent + - decayFactors + - decayFactorsExponent + - decayFactorEpochsSum + - decayFactorEpochsSumExponent stakingUnbondingPeriod: type: string description: The unbonding period in epochs before an account can stop staking. + validationBlocksPerSlot: + type: integer + description: The number of validation blocks per slot. + punishmentEpochs: + type: string + description: The number of epochs worth of Mana that a node is punished with for each additional validation block it issues. livenessThreshold: type: string description: Determine if a block is eligible by evaluating issuingTime and commitments in its pastcone to ATT and lastCommittedSlot respectively. @@ -2791,7 +2824,7 @@ components: congestionControlParameters: description: Congestion Control Parameters defines the parameters used to calculate the Reference Mana Cost (RMC). properties: - rmcMin: + minReferenceManaCost: description: RMCMin is the minimum value of the reference Mana cost. type: string increase: @@ -2815,8 +2848,11 @@ components: maxBufferSize: description: MaxBufferSize is the maximum size of the buffer. type: integer + maxValidationBufferSize: + description: MaxValidationBufferSize is the maximum size of the validation buffer. + type: integer required: - - rmcMin + - minReferenceManaCost - increase - decrease - increaseThreshold @@ -2840,6 +2876,38 @@ components: - windowSize - windowTargetRatio - activationOffset + rewardsParameters: + description: Rewards Parameters defines the parameters that are used to calculate the rewards. + properties: + validatorBlocksPerSlot: + type: integer + description: The number of validation blocks that should be issued by a selected validator per slot during its epoch duties. + profitMarginExponent: + type: integer + description: ProfitMarginExponent is used for shift operation for calculation of profit margin. + bootstrappingDuration: + type: string + description: The length in epochs of the bootstrapping phase. + manaShareCoefficient: + type: string + description: The coefficient used for calculation of initial rewards. + decayBalancingConstantExponent: + type: integer + description: DecayBalancingConstantExponent is the exponent used for calculation of the initial reward. + decayBalancingConstant: + type: string + description: An integer approximation calculated based on chosen DecayBalancingConstantExponent. + poolCoefficientExponent: + type: integer + description: PoolCoefficientExponent is the exponent used for shifting operation in the pool rewards calculations. + required: + - validatorBlocksPerSlot + - profitMarginExponent + - bootstrappingDuration + - manaShareCoefficient + - decayBalancingConstantExponent + - decayBalancingConstant + - poolCoefficientExponent required: - version - networkName From bc7bbe00e0d4c2b78fac0d166c14eb64cc8ad6da Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Tue, 26 Sep 2023 10:28:32 +0800 Subject: [PATCH 46/92] Fix wrong comment of delegation output --- tips/TIPS-API/openapi3-core.yaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tips/TIPS-API/openapi3-core.yaml b/tips/TIPS-API/openapi3-core.yaml index 261ea59e5..dfafbf47c 100644 --- a/tips/TIPS-API/openapi3-core.yaml +++ b/tips/TIPS-API/openapi3-core.yaml @@ -1925,8 +1925,7 @@ components: DelegationOutput: description: >- - Describes an delegation output in the ledger that can be controlled by the - state and governance controllers. + Describes an delegation output. properties: type: type: integer From ef9b08d1bf1245672169eab8c9bf0650cc0f84b3 Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Tue, 26 Sep 2023 10:32:24 +0800 Subject: [PATCH 47/92] Remove an extra `"` in info example --- tips/TIPS-API/openapi3-core.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIPS-API/openapi3-core.yaml b/tips/TIPS-API/openapi3-core.yaml index 46d39da27..1f49a2d2f 100644 --- a/tips/TIPS-API/openapi3-core.yaml +++ b/tips/TIPS-API/openapi3-core.yaml @@ -1123,7 +1123,7 @@ components: windowSize: 7 windowTargetRatio: 5 activationOffset: 7 - rewardsParameters": + rewardsParameters: validatorBlocksPerSlot: 10 profitMarginExponent: 8 bootstrappinDuration: "1154" From 21fc627700928b408111145f5d010855078fc338 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 26 Sep 2023 17:30:09 +0200 Subject: [PATCH 48/92] Fix sparsity typo --- tips/TIP-0047/tip-0047.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0047/tip-0047.md b/tips/TIP-0047/tip-0047.md index 0384eb0f3..ff6ef32b4 100644 --- a/tips/TIP-0047/tip-0047.md +++ b/tips/TIP-0047/tip-0047.md @@ -76,7 +76,7 @@ However, in this scenario no outputs hold more IOTA coins than required for the - With new use cases enabled by the new `dust protection` (e.g. tokenization, storing arbitrary data in the ledger), the distribution will dramatically change. - Fittings for other DLT projects do not match because there are transaction fees in place, which decrease the amount of dust outputs in the distribution. -Another possibility would be to estimate how much percentage of the database will be used for outputs with minimum required deposit (`fund sparsitiy percentage`) in the future. The remaining IOTA coins can be ignored in that case to simplify the calculation. Since a fund sparsity percentage of less than 20% would already be bad for other upcoming protocol features like the mana calculation, we could take this value for our calculation instead of the worst case. +Another possibility would be to estimate how much percentage of the database will be used for outputs with minimum required deposit (`fund sparsity percentage`) in the future. The remaining IOTA coins can be ignored in that case to simplify the calculation. Since a fund sparsity percentage of less than 20% would already be bad for other upcoming protocol features like the mana calculation, we could take this value for our calculation instead of the worst case. ### Weights for different outputs From 06835e81ce634a7ae507e90072b61982ae614776 Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Mon, 16 Oct 2023 11:50:36 +0800 Subject: [PATCH 49/92] Update to latest changes --- tips/TIPS-API/openapi3-core.yaml | 411 ++++++++++++++----------------- 1 file changed, 185 insertions(+), 226 deletions(-) diff --git a/tips/TIPS-API/openapi3-core.yaml b/tips/TIPS-API/openapi3-core.yaml index 1f49a2d2f..d6289c9b4 100644 --- a/tips/TIPS-API/openapi3-core.yaml +++ b/tips/TIPS-API/openapi3-core.yaml @@ -1053,32 +1053,31 @@ components: confirmedTangleTime: '1692966168000000000' relativeConfirmedTangleTime: '1692966173855931045' latestCommitmentID: "0x8fb6cbb1ecf02c6b5a6a5a6a5f6c5a6a5f6c5a6a5a6a5a6a5f6c5a6a5a6a5f6c50000000000000000" - latestFinalizedSlot: '100' - latestAcceptedBlockSlot: '100' - latestConfirmedBlockSlot: '95' - pruningEpoch: '20' + latestFinalizedSlot: 100 + latestAcceptedBlockSlot: 100 + latestConfirmedBlockSlot: 95 + pruningEpoch: 20 metrics: blocksPerSecond: '1.5E+00' - confirmedBlocksPerSecond: '1.5E+00"' + confirmedBlocksPerSecond: '1.5E+00' confirmationRate: '1E+02' protocolParameters: - - startEpoch: '1' + - startEpoch: 1 parameters: type: 0 version: 3 networkName: iota-core-testnet bech32Hrp: rms - rentStructure: - vByteCost: 500 - vByteFactorData: 1 - vByteFactorKey: 10 - vByteFactorBlockIssuerKey: 100 - vByteFactorStakingFeature: 100 - vByteFactorDelegation: 100 + rentParameters: + storageCost: '500' + storageScoreFactorData: 1 + storageScoreOffsetOutput: '10' + storageScoreOffsetEd25519BlockIssuerKey: '100' + storageScoreOffsetStakingFeature: '100' + storageScoreOffsetDelegation: '100' workScoreStructure: dataByte: 0 block: 100 - missingParent: 500 input: 20 contextInput: 20 output: 20 @@ -1087,7 +1086,6 @@ components: blockIssuer: 100 allotment: 100 signatureEd25519: 200 - minStrongParentsThreshold: 4 tokenSupply: "2779530283277761" genesisUnixTimestamp: "1692966168" slotDurationInSeconds: 10 @@ -1102,13 +1100,14 @@ components: decayFactorsExponent: 0 decayFactorEpochsSum: 0 decayFactorEpochsSumExponent: 0 - stakingUnbondingPeriod: '10' + stakingUnbondingPeriod: 10 validationBlocksPerSlot: 10 - punishmentEpochs: '10' - livenessThreshold: '5' - minCommittableAge: '10' - maxCommittableAge: '20' - epochNearingThreshold: '30' + punishmentEpochs: 10 + livenessThresholdLowerBound: 5 + livenessThresholdUpperBound: 10 + minCommittableAge: 10 + maxCommittableAge: 20 + epochNearingThreshold: 30 congestionControlParameters: minReferenceManaCost: '500' increase: '500' @@ -1116,7 +1115,6 @@ components: increaseThreshold: 800000 decreaseThreshold: 500000 schedulerRate: 100000 - minMana: '1' maxBufferSize: 3276800 maxValidationBufferSize: 100 versionSignaling: @@ -1126,7 +1124,7 @@ components: rewardsParameters: validatorBlocksPerSlot: 10 profitMarginExponent: 8 - bootstrappinDuration: "1154" + bootstrappinDuration: 1154 manaShareCoefficient: "2" decayBalancingConstantExponent: 8 decayBalancingConstant: "1" @@ -1139,7 +1137,7 @@ components: subunit: "glow" useMetricPrefix: false features: - - allowincompleteblock + - [] get-buildingBlock-response-example: value: @@ -1152,10 +1150,10 @@ components: shallowLikeParents: - "0xdbf86c778d69f413296c2d4d3086d76c74bf4d719e6e95c03a3d9a955ed39bcf3e00000000000000" - "0xf15b2ec698e396c9d2e69bc753246631aedebb657da09ba0e0c8d42518a1e8953e00000000000000" - latestFinalizedSlot: '1422' + latestFinalizedSlot: 1422 commitment: version: 3 - index: '1432' + index: 1432 previousCommitmentId: "0xbf07dc16986166953f5a72c19d78642aab6cbde63964a2369ec3d425144eb42b3800000000000000" rootsId: "0xa4dd36465af63d495d35a05f592d42a51511c153e1bae8fad00453c8cbb48727" cumulativeWeight: '45678' @@ -1211,11 +1209,13 @@ components: type: 0 payload: type: 6 - essence: + transaction: type: 1 networkId: "1337133713371337" - creationSlot: '1692966292150937822' - inputsCommitment: "0x0e6c2998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a79" + creationSlot: 1692966292150937822 + contextInputs: + - type: 1 + commitmentId: "0x0e6c2998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a79" inputs: - type: 0 transactionId: "0x0c78e998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a79" @@ -1227,7 +1227,7 @@ components: transactionId: "0xc138ecdc882010245e9574fbc1f1f43cc7c182fa890e46e018365dd49de0f16e" transactionOutputIndex: 0 outputs: - - type: 3 + - type: 0 amount: "50000000" unlockConditions: - type: 0 @@ -1251,7 +1251,7 @@ components: networkId: "0" issuingTime: "1692966293697706488" slotCommitmentId: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000" - latestFinalizedSlot: "0" + latestFinalizedSlot: 0 issuerId: "0x375358f92cc94750669598b0aaa55a6ff73310b90710e1fad524c0f911be0fea" block: type: 0 @@ -1264,7 +1264,7 @@ components: type: 5 tag: "0x4143544956495459" data: "" - burnedMana: "0" + maxBurnedMana: "0" signature: type: 0 publicKey: "0x05c1de274451db8de8182d64c6ee0dca3ae0c9077e0b4330c976976171d79064" @@ -1276,7 +1276,7 @@ components: networkId: "0" issuingTime: "2023-07-31T13:14:57.310104314Z" slotCommitmentId: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000" - latestFinalizedSlot: "0" + latestFinalizedSlot: 0 issuerId: "0x375358f92cc94750669598b0aaa55a6ff73310b90710e1fad524c0f911be0fea" block: type: 0 @@ -1291,11 +1291,13 @@ components: - "0x70a5ce5d8fc3290a9885b1af5d8766d51db89a67a6a839f6d23a6cb8d6f3b6e30000000000000000" payload: type: 6 - essence: + transaction: type: 1 networkId: "1337133713371337" - creationSlot: '1649442459' - inputsCommitment: "0x0e6c2998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a79" + creationSlot: 1649442459 + contextInput: + - type: 0 + commitmentId: "0x0e6c2998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a79" inputs: - type: 0 transactionId: "0x0c78e998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a79" @@ -1306,15 +1308,19 @@ components: - type: 0 transactionId: "0xc138ecdc882010245e9574fbc1f1f43cc7c182fa890e46e018365dd49de0f16e" transactionOutputIndex: 0 + allotments: + - accountID: "0x030440433d7a726322151f735a6e72543e5b26142d68157d25746a6e45260f37" + value: "5285" + capabilities: "" outputs: - - type: 3 + - type: 0 amount: "50000000" + mana: "6802" unlockConditions: - type: 0 address: type: 0 pubKeyHash: "0xd49931814e6bfbb8e221f1b2936e206e5a6b6abeb9c070f8603814c525c9abe3" - payload: unlocks: - type: 0 signature: @@ -1325,7 +1331,7 @@ components: reference: 0 - type: 1 reference: 0 - burnedMana: "105368" + maxBurnedMana: "105368" signature: type: 0 publicKey: "0x05c1de274451db8de8182d64c6ee0dca3ae0c9077e0b4330c976976171d79064" @@ -1333,7 +1339,7 @@ components: get-committee-example: value: - epochIndex: '100' + epochIndex: 10 totalStake: '900000000' totalValidatorStake: '60000000' committee: @@ -1350,14 +1356,14 @@ components: value: validators: - accountId: "0x309b169bfa60c8cf80afd730741862d200405d5df7cabfe9b564361dce1f7036" - stakingEndEpoch: '100' + stakingEndEpoch: 100 poolStake: '200000' validatorStake: '100000' fixedCost: '50000' active: false latestSupportedProtocolVersion: 3 - accountId: "0x897dr69bfa60c8cf80afd730741862d200405d5df7cabfe9b564361dce1f7036" - stakingEndEpoch: '100' + stakingEndEpoch: 10 poolStake: '205000' validatorStake: '90000' fixedCost: '52000' @@ -1369,7 +1375,7 @@ components: get-validator-example: value: accountId: "0x897dr69bfa60c8cf80afd730741862d200405d5df7cabfe9b564361dce1f7036" - stakingEndEpoch: '100' + stakingEndEpoch: 100 poolStake: '205000' validatorStake: '90000' fixedCost: '52000' @@ -1378,13 +1384,13 @@ components: get-mana-rewards-example: value: - startEpoch: '60' - endEpoch: '80' + startEpoch: 60 + endEpoch: 80 rewards: '800000' get-congestion-estimate-response-example: value: - slotIndex: '20' + slotIndex: 20 ready: true referenceManaCost: '50000' blockIssuanceCredits: '10000000' @@ -1395,7 +1401,7 @@ components: networkId: "0" issuingTime: "1692966346513784862" slotCommitmentId: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000" - latestFinalizedSlot: "0" + latestFinalizedSlot: 0 issuerId: "0x375358f92cc94750669598b0aaa55a6ff73310b90710e1fad524c0f911be0fea" block: type: 0 @@ -1404,7 +1410,7 @@ components: - "0x5853745388056fb59c193dc6fe6f8c3f76bf8d82a42ed340eba621a9f5bb79790200000000000000" weakParents: [] shallowLikeParents: [] - burnedMana: "0" + maxBurnedMana: "0" signature: type: 0 publicKey: "0x05c1de274451db8de8182d64c6ee0dca3ae0c9077e0b4330c976976171d79064" @@ -1416,7 +1422,7 @@ components: networkId: "0" issuingTime: "1692966346513784862" slotCommitmentId: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000" - latestFinalizedSlot: "0" + latestFinalizedSlot: 0 issuerId: "0x375358f92cc94750669598b0aaa55a6ff73310b90710e1fad524c0f911be0fea" block: type: 0 @@ -1430,12 +1436,13 @@ components: - "0x0276d29ec6b3cbbf3ed6d1f01af8e29b9c6a9ee9c9375e8e5b5b5c5b5b5d45580000000000000000" - "0x70a5ce5d8fc3290a9885b1af5d8766d51db89a67a6a839f6d23a6cb8d6f3b6e30000000000000000" payload: - type: 6 - essence: - type: 1 + type: 1 + transaction: networkId: "1337133713371337" creationSlot: 1649442459 - inputsCommitment: "0x0e6c2998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a79" + contextInputs: + - type: 1 + commitmentId: "0x0e6c2998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a79" inputs: - type: 0 transactionId: "0x0c78e998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a79" @@ -1446,15 +1453,18 @@ components: - type: 0 transactionId: "0xc138ecdc882010245e9574fbc1f1f43cc7c182fa890e46e018365dd49de0f16e" transactionOutputIndex: 0 + allotments: + - accountID: "0x030440433d7a726322151f735a6e72543e5b26142d68157d25746a6e45260f37" + value: "5285" + capabilities: "" outputs: - - type: 3 + - type: 0 amount: "50000000" unlockConditions: - type: 0 address: type: 0 pubKeyHash: "0xd49931814e6bfbb8e221f1b2936e206e5a6b6abeb9c070f8603814c525c9abe3" - payload: unlocks: - type: 0 signature: @@ -1465,7 +1475,7 @@ components: reference: 0 - type: 1 reference: 0 - burnedMana: "105368" + maxBurnedMana: "105368" signature: type: 0 publicKey: "0x05c1de274451db8de8182d64c6ee0dca3ae0c9077e0b4330c976976171d79064" @@ -1477,7 +1487,7 @@ components: networkId: "0" issuingTime: "1692966346513784862" slotCommitmentId: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000" - latestFinalizedSlot: "0" + latestFinalizedSlot: 0 issuerId: "0x375358f92cc94750669598b0aaa55a6ff73310b90710e1fad524c0f911be0fea" block: type: 0 @@ -1490,7 +1500,7 @@ components: type: 5 tag: "0x4143544956495459" data: "" - burnedMana: "0" + maxBurnedMana: "0" signature: type: 0 publicKey: "0x05c1de274451db8de8182d64c6ee0dca3ae0c9077e0b4330c976976171d79064" @@ -1502,7 +1512,7 @@ components: networkId: "0" issuingTime: "1692966346513784862" slotCommitmentId: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000" - latestFinalizedSlot: "0" + latestFinalizedSlot: 0 issuerId: "0x375358f92cc94750669598b0aaa55a6ff73310b90710e1fad524c0f911be0fea" block: type: 1 @@ -1551,7 +1561,7 @@ components: get-commitment-response-example: value: - index: '986' + index: 986 previousCommitmentId: "0x8fb6cbb1ecf02c6b5a6a5a6a5f6c5a6a5f6c5a6a5a6a5a6a5f6c5a6a5a6a5f6c50000000000000000" rootsId: "0xa4dd36465af63d495d35a05f592d42a51511c153e1bae8fad00453c8cbb48727" cumulativeWeight: '78901' @@ -1562,7 +1572,7 @@ components: get-utxo-changes-response-example: value: - index: '789' + index: 789 createdOutputs: - "0x1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2" - "0x3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4" @@ -1588,7 +1598,7 @@ components: type: string description: The slot commitment ID contains in this block. latestFinalizedSlot: - type: string + type: integer description: The latest finalized slot of issuing node. issuerId: type: string @@ -1607,7 +1617,7 @@ components: - protocolVersion BasicBlock: - description: A basic block is the object that can carry arbitrary payload, such as a tagged data payload or a transaction. + description: A basic block is the object that can carry arbitrary payload, such as a tagged data payload ostringr a transaction. properties: type: type: integer @@ -1630,15 +1640,15 @@ components: payload: description: The inner payload of the block. Can be nil. oneOf: - - $ref: '#/components/schemas/TransactionPayload' + - $ref: '#/components/schemas/SignedTransactionPayload' - $ref: '#/components/schemas/TaggedDataPayload' - burnedMana: + maxBurnedMana: type: string description: The mana burned in this block. required: - type - strongParents - - burnedMana + - maxBurnedMana ValidationBlock: description: A validation block is the object that issued by validators. @@ -1673,17 +1683,16 @@ components: - highestSupportedVersion - protocolParametersHash - - TransactionPayload: - description: The Transaction Payload to be embedded into a block. + SignedTransactionPayload: + description: The Signed Transaction Payload to be embedded into a block. properties: type: type: integer - description: Set to value 6 to denote a Transaction Payload. - essence: + description: Set to value 1 to denote a Signed Transaction Payload. + transaction: type: object oneOf: - - $ref: '#/components/schemas/TransactionEssence' + - $ref: '#/components/schemas/Transaction' unlocks: type: array items: @@ -1694,27 +1703,24 @@ components: - $ref: '#/components/schemas/NFTUnlock' required: - type - - essence + - transaction - unlocks - TransactionEssence: - description: Describes the essence data making up a transaction by defining its inputs and outputs and an optional payload. + Transaction: + description: The Transaction to be embedded into a block. properties: - type: - type: integer - description: Set to value 2 to denote a Transaction Essence. networkId: type: string description: Network identifier. Plain string encoded number. This field signals for which network the block is meant for. It is computed out of the first 8 bytes of the `BLAKE2b-256` hash of the concatenation of the network name and protocol version string. creationSlot: - type: string + type: integer description: The slot index in which the transaction was created. contextInputs: type: array items: anyOf: - $ref: '#/components/schemas/CommitmentInput' - - $ref: '#/components/schemas/BICInput' + - $ref: '#/components/schemas/BlockIssuanceCreditInput' - $ref: '#/components/schemas/RewardInput' inputs: type: array @@ -1722,9 +1728,19 @@ components: items: oneOf: - $ref: '#/components/schemas/UTXOInput' - inputsCommitment: + allotments: + type: array + description: The accounts map with corresponding allotment values. + items: + oneOf: + - $ref: '#/components/schemas/Allotment' + capabilities: type: string - description: BLAKE2b-256 hash of the BLAKE2b-256 hashes of the serialized outputs referenced in Inputs by their Output IDs (Transaction ID || Output Index). Hex-encoded data with 0x prefix. + description: The capabilities of this transaction. + payload: + description: The optional embedded payload. + oneOf: + - $ref: '#/components/schemas/TaggedDataPayload' outputs: type: array description: The outputs of this transaction. @@ -1735,23 +1751,13 @@ components: - $ref: '#/components/schemas/FoundryOutput' - $ref: '#/components/schemas/NFTOutput' - $ref: '#/components/schemas/DelegationOutput' - allotments: - type: array - description: The accounts map with corresponding allotment values. - items: - oneOf: - - $ref: '#/components/schemas/Allotment' - payload: - description: The optional embedded payload. - oneOf: - - $ref: '#/components/schemas/TaggedDataPayload' required: - - type - networkId - creationSlot - contextInputs - - inputsCommitment - inputs + - allotments + - capabilities - outputs Allotment: @@ -1778,7 +1784,7 @@ components: - commitmentId # TODO: Consider rename it to CreditsInput, need to be aligned to implementaion. - BICInput: + BlockIssuanceCreditInput: description: Allows to provide the VM with context for the value of the BIC vector for a specific slot. It is necessary information needed for any Account transitions, and account destroying. properties: type: @@ -1826,16 +1832,13 @@ components: properties: type: type: integer - description: Set to value 3 to denote a Basic Output. + description: Set to value 0 to denote a Basic Output. amount: type: string description: The amount of IOTA tokens to deposit with this BasicOutput output. Plain string encoded number. - nativeTokens: - type: array - description: Native tokens held by the output. - items: - anyOf: - - $ref: '#/components/schemas/NativeToken' + mana: + type: string + description: The stored mana held by the output. unlockConditions: type: array description: Unlock conditions that define how the output can be unlocked in a transaction. @@ -1853,9 +1856,6 @@ components: - $ref: '#/components/schemas/SenderFeature' - $ref: '#/components/schemas/MetadataFeature' - $ref: '#/components/schemas/TagFeature' - mana: - type: string - description: The stored mana held by the output. required: - type - amount @@ -1866,19 +1866,13 @@ components: properties: type: type: integer - description: Set to value 4 to denote an Account Output. + description: Set to value 1 to denote an Account Output. amount: type: string description: The amount of IOTA tokens to deposit with this output. Plain string encoded number. mana: - type: integer + type: string description: The stored mana held by the output. - nativeTokens: - type: array - description: Native tokens held by the output. - items: - anyOf: - - $ref: '#/components/schemas/NativeToken' accountId: type: string description: The identifier of the account. @@ -1929,8 +1923,8 @@ components: properties: type: type: integer - description: Set to value 7 to denote a Delegation Output. - example: 7 + description: Set to value 5 to denote a Delegation Output. + example: 5 amount: type: string description: >- @@ -1945,18 +1939,18 @@ components: description: >- The identifier for this delegation output. example: '0x1505ec099896ab05d9e08fbc7101ae4dff0093b3943b28f789ed2ca728bcc8d6' - validatorId: + validatorAddress: type: string description: >- The Account ID of the validator to which this output is delegating. example: '0x1505ec099896ab05d9e08fbc7101ae4dff0093b3943b28f789ed2ca728bcc8d6' startEpoch: - type: string + type: integer description: >- The index of the first epoch for which this output delegates. example: '10' endEpoch: - type: string + type: integer description: >- The index of the last epoch for which this output delegates. example: '12' @@ -1983,16 +1977,10 @@ components: properties: type: type: integer - description: Set to value 5 to denote a Foundry Output. + description: Set to value 3 to denote a Foundry Output. amount: type: string description: The amount of IOTA tokens to deposit with this output. Plain string encoded number. - nativeTokens: - type: array - description: Native tokens held by the output. - items: - anyOf: - - $ref: '#/components/schemas/NativeToken' serialNumber: type: integer description: The serial number of the foundry with respect to the controlling account. @@ -2032,16 +2020,13 @@ components: properties: type: type: integer - description: Set to value 6 to denote a NFT Output. + description: Set to value 4 to denote a NFT Output. amount: type: string description: The amount of IOTA tokens to deposit with this output. Plain string encoded number. - nativeTokens: - type: array - description: Native tokens held by the output. - items: - anyOf: - - $ref: '#/components/schemas/NativeToken' + mana: + type: string + description: The stored mana held by the output nftId: type: string description: Unique identifier of the NFT, which is the BLAKE2b-256 hash of the Output ID that created it. NFT Address = NFT Address Type || NFT ID. Hex-encoded data with 0x prefix. @@ -2070,28 +2055,12 @@ components: anyOf: - $ref: '#/components/schemas/IssuerFeature' - $ref: '#/components/schemas/MetadataFeature' - mana: - type: string - description: The stored mana held by the output required: - type - amount - nftId - mana - NativeToken: - description: A native token and its balance in the output. - properties: - id: - type: string - description: Hex-encoded identifier with 0x prefix of the native token. Same as foundryId of the controlling foundry. - amount: - type: string - description: Amount of native tokens (up to uint256). Hex-encoded number with 0x prefix. - required: - - tokenId - - amount - Ed25519Address: description: The Ed25519 address. properties: @@ -2186,7 +2155,7 @@ components: type: integer description: Set to value 2 to denote a Timelock Unlock Condition. slotIndex: - type: string + type: integer description: The slot index until which the timelock applies (inclusive). required: - type @@ -2203,7 +2172,7 @@ components: - $ref: '#/components/schemas/AccountAddress' - $ref: '#/components/schemas/NFTAddress' slotIndex: - type: string + type: integer description: The slot index at which the expiration happens. required: - type @@ -2317,10 +2286,10 @@ components: type: string description: The fixed cost that the validator receives from the total pool reward. startEpoch: - type: string + type: integer description: The epoch index at which the staking starts. endEpoch: - type: string + type: integer description: The epoch index at which the staking ends. required: - type @@ -2451,7 +2420,7 @@ components: properties: type: type: integer - description: Set to value 5 to denote a Tagged Data Payload. + description: Set to value 0 to denote a Tagged Data Payload. tag: type: string description: The tag to allow external tools to find/look up this block. It has a size between 0 and 64 bytes and must be encoded as a hex-string with 0x prefix. Network nodes do not index blocks with Tagged Data Payload by the tag field by default. @@ -2566,15 +2535,15 @@ components: description: The latest slot that the node has committed to. latestFinalizedSlot: description: The index of the latest finalized slot. - type: string + type: integer latestAcceptedBlockSlot: description: The slot index of the latest accepted block. - type: string + type: integer latestConfirmedBlockSlot: description: The slot index of the latest confirmed block. - type: string + type: integer pruningEpoch: - type: string + type: integer description: The index of the slot before which the tangle history is pruned. required: - isHealthy @@ -2657,7 +2626,7 @@ components: properties: startEpoch: description: The start epoch of the set of protocol parameters. - type: string + type: integer parameters: description: The protocol parameters. properties: @@ -2673,46 +2642,43 @@ components: bech32Hrp: type: string description: Tells whether the node supports mainnet or testnet addresses. Value `iota` indicates that the node supports mainnet addresses. Value `atoi` indicates that the node supports testnet addresses. - rentStructure: + rentParameters: description: The rent structure according to TIP-19. properties: - vByteCost: - description: Defines the rent of a single virtual byte denoted in IOTA tokens. - type: integer - vByteFactorData: + storageCost: + description: Defines the number of IOTA tokens required per unit of storage score. + type: string + storageScoreFactorData: description: Defines the factor to be used for data only fields. type: integer - vByteFactorKey: - description: Defines the factor to be used for key/lookup generating fields. - type: integer - vByteFactorBlockIssuerKey: - description: Defines the factor to be used for block issuer feature public keys. - type: integer - vByteFactorStakingFeature: - description: Defines the factor to be used for staking feature. - type: integer - vByteFactorDelegation: - description: Defines the factor to be used for delegation output. - type: integer + storageScoreOffsetOutput: + description: Defines the offset to be used for key/lookup generating fields. + type: string + storageScoreOffsetEd25519BlockIssuerKey: + description: Defines the offset to be used for block issuer feature public keys. + type: string + storageScoreOffsetStakingFeature: + description: Defines the offset to be used for staking feature. + type: string + storageScoreOffsetDelegation: + description: Defines the offset to be used for delegation output. + type: string required: - - vByteCost - - vByteFactorData - - vByteFactorKey - - vByteFactorBlockIssuerKey - - vByteFactorStakingFeature - - vByteFactorDelegation + - storageCost + - storageScoreFactorData + - storageScoreOffsetOutput + - storageScoreOffsetEd25519BlockIssuerKey + - storageScoreOffsetStakingFeature + - storageScoreOffsetDelegation workScoreStructure: description: Work structure lists the Work Score of each type, it is used to denote the computation costs of processing an object. properties: dataByte: - description: DataKilobyte accounts for the network traffic per kilobyte. + description: DataByte accounts for the network traffic per byte. type: integer block: description: Block accounts for work done to process a block in the node software. type: integer - missingParent: - description: MissingParent is used to multiply for each missing parent if there are not enough strong ones. - type: integer input: description: Input accounts for loading the UTXO from the database and performing the mana calculations. type: integer @@ -2737,13 +2703,9 @@ components: signatureEd25519: description: SignatureEd25519 accounts for an Ed25519 signature check. type: integer - minStrongParentsThreshold: - description: MinStrongParentsThreshold is the minimum amount of strong parents in a basic block, otherwise the issuer gets slashed. - type: integer required: - dataByte - block - - missingParent - input - contextInput - output @@ -2752,7 +2714,6 @@ components: - blockIssuer - allotment - signatureEd25519 - - minStrongParentsThreshold tokenSupply: type: string description: Current supply of base token. Plain string encoded number. @@ -2800,25 +2761,28 @@ components: - decayFactorEpochsSum - decayFactorEpochsSumExponent stakingUnbondingPeriod: - type: string + type: integer description: The unbonding period in epochs before an account can stop staking. validationBlocksPerSlot: type: integer description: The number of validation blocks per slot. punishmentEpochs: - type: string + type: integer description: The number of epochs worth of Mana that a node is punished with for each additional validation block it issues. - livenessThreshold: - type: string - description: Determine if a block is eligible by evaluating issuingTime and commitments in its pastcone to ATT and lastCommittedSlot respectively. + livenessThresholdLowerBound: + type: integer + description: Determine if a block is eligible by evaluating issuingTimes and commitments in its past-cone to Accepted Tangle Time and lastCommittedSlot respectively. + livenessThresholdUpperBound: + type: integer + description: Determine if a block is eligible by evaluating issuingTimes and commitments in its past-cone to Accepted Tangle Time and lastCommittedSlot respectively. minCommittableAge: - type: string + type: integer description: MinCommittableAge is the minimum age relative to the accepted tangle time slot index that a slot can be committed. maxCommittableAge: - type: string + type: integer description: MaxCommittableAge is the maximum age for a slot commitment to be included in a block relative to the slot index of the block issuing time. epochNearingThreshold: - type: string + type: integer description: Determine the slot that should trigger a new committee selection for the next and upcoming epoch. congestionControlParameters: description: Congestion Control Parameters defines the parameters used to calculate the Reference Mana Cost (RMC). @@ -2841,9 +2805,6 @@ components: schedulerRate: description: SchedulerRate is the rate at which the scheduler runs in workscore units per second. type: integer - minMana: - description: MinMana is the minimum amount of Mana that an account must have to have a block scheduled. - type: string maxBufferSize: description: MaxBufferSize is the maximum size of the buffer. type: integer @@ -2857,7 +2818,6 @@ components: - increaseThreshold - decreaseThreshold - schedulerRate - - minMana - maxBufferSize versionSignaling: description: The version signaling parameters. @@ -2885,7 +2845,7 @@ components: type: integer description: ProfitMarginExponent is used for shift operation for calculation of profit margin. bootstrappingDuration: - type: string + type: integer description: The length in epochs of the bootstrapping phase. manaShareCoefficient: type: string @@ -2912,7 +2872,7 @@ components: - networkName - bech32Hrp - tokenSupply - - rentStructure + - rentParameters - workScoreStructure - genesisUnixTimestamp - slotDurationInSeconds @@ -2925,7 +2885,7 @@ components: - manaDecayFactorEpochsSum - manaDecayFactorEpochsSumExponent - stakingUnbondingPeriod - - livenessThreshold + - livenessThresholdLowerBound - minCommittableAge - maxCommittableAge - epochNearingThreshold @@ -2954,10 +2914,10 @@ components: description: Returns the mana rewards of an account or delegation output. properties: startEpoch: - type: string + type: integer description: The starting epoch index for which the mana rewards are returned. endEpoch: - type: string + type: integer description: The ending epoch index for which the mana rewards are returned, the decay is applied up to this point (inclusive). rewards: type: string @@ -2967,7 +2927,7 @@ components: description: Returns the validator information of the committee. properties: epochIndex: - type: string + type: integer description: The epoch index of the committee. totalStake: type: string @@ -3005,7 +2965,7 @@ components: type: string description: The account identifier of the validator stakingEndEpoch: - type: string + type: integer description: The epoch index until which the validator registered to stake. poolStake: type: string @@ -3042,7 +3002,7 @@ components: type: string description: The block identifiers that can be used to a attach a block to. Hex-encoded with 0x prefix. latestFinalizedSlot: - type: string + type: integer description: The latest finalized slot index. commitment: $ref: '#/components/schemas/Commitment' @@ -3051,7 +3011,7 @@ components: description: Provides the cost and readiness to issue estimates. properties: slotIndex: - type: string + type: integer description: The slot index for which the congestion estimate is provided. ready: type: boolean @@ -3077,7 +3037,7 @@ components: type: integer description: The version of the protocol running. index: - type: string + type: integer description: The slot index of the commitment. previousCommitmentId: type: string @@ -3110,7 +3070,7 @@ components: type: string description: The slot commitment contains in this block. latestFinalizedSlot: - type: string + type: integer description: The latest finalized slot of issuing node. issuerId: type: string @@ -3173,7 +3133,7 @@ components: * `6` - denotes that the block is invalid. transactionFailureReason: type: integer - enum: [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,255] + enum: [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,255] description: > Values: * `1` - denotes that the referenced UTXO was already spent. @@ -3186,17 +3146,16 @@ components: * `8` - denotes that the given native tokens are invalid. * `9` - denotes that the return amount in a transaction is not fulfilled by the output side. * `10` - denotes that the input unlock is invalid. - * `11` - denotes that the inputs commitment is invalid. - * `12` - denotes that an output contains a Sender with an ident (address) which is not unlocked. - * `13` - denotes that the chain state transition is invalid. - * `14` - denotes that the referenced input is created after transaction issuing time. - * `15` - denotes that the mana amount is invalid. - * `16` - denotes that the Block Issuance Credits Input is invalid. - * `17` - denotes that Reward Context Input is invalid. - * `18` - denotes that Commitment Context Input is invalid. - * `19` - denotes that Staking Feature is not provided in account output when claiming rewards. - * `20` - denotes that fail to claim staking reward. - * `21` - denotes that fail to claim delegation reward. + * `11` - denotes that an output contains a Sender with an ident (address) which is not unlocked. + * `12` - denotes that the chain state transition is invalid. + * `13` - denotes that the referenced input is created after transaction issuing time. + * `14` - denotes that the mana amount is invalid. + * `15` - denotes that the Block Issuance Credits Input is invalid. + * `16` - denotes that Reward Context Input is invalid. + * `17` - denotes that Commitment Context Input is invalid. + * `18` - denotes that Staking Feature is not provided in account output when claiming rewards. + * `19` - denotes that fail to claim staking reward. + * `20` - denotes that fail to claim delegation reward. * `255` - denotes that the semantic validation failed. required: - blockId @@ -3255,7 +3214,7 @@ components: description: Returns all UTXO changes of the given slot. properties: index: - type: string + type: integer description: The slot index of the given slot. createdOutputs: description: The created outputs of the given slot. From 11711ef170507ce19b2e4789d8a24d3cdce87129 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 17 Oct 2023 12:32:10 +0100 Subject: [PATCH 50/92] Remove outdated TIP-47 --- .../assets/microtransactions_pt3_layer1.png | Bin 151403 -> 0 bytes .../assets/microtransactions_pt3_layer2.png | Bin 135355 -> 0 bytes tips/TIP-0047/tip-0047.md | 145 ------------------ 3 files changed, 145 deletions(-) delete mode 100644 tips/TIP-0047/assets/microtransactions_pt3_layer1.png delete mode 100644 tips/TIP-0047/assets/microtransactions_pt3_layer2.png delete mode 100644 tips/TIP-0047/tip-0047.md diff --git a/tips/TIP-0047/assets/microtransactions_pt3_layer1.png b/tips/TIP-0047/assets/microtransactions_pt3_layer1.png deleted file mode 100644 index 561db0bb10b06d55b8b34ad89ce27f95c5f45c22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 151403 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
      0bU6`jY&V0Bfv!nW;`K!e*PYS%T;eKcRFCFJo z8>+IOEZ_8b&L^h6EqS@m=Z3dEJ1Uap8%W8NvYGNC(~d8D9|d?m_Nl=vNy1mAEH+OZ zlAHMh`r3pS*gH;pVM}t}fk9W_mM<6=9v_$0oZM0TD7y1FrdE7q%M=z?S)8f8iJf)4 z<_tRV>BR7O#-t7DZM5Sb+F3ObpVVcuc@JT$WIn@w*}j+&w)z|)^n+q)+%N0ns>cM6 z-7sinLwR}jqMUI(n^Rt0{QO<%g9Y!`&Wk?nLEW*XSsv{<`7^LdCuweHE*w9Id24jP z?ybx7dzFMOo;&dW-NLdx5))G&F$Z);7~AHOitN-RX=RhyZiIsEIYYfAM4Za zJ6>jD&6y=EBmqwi$zS_f-LG>u;AU&;LU*YNW;uwGmXJkkVEL!s(g%ChRdZ5il- zphVP!mSr{iw#5f`t&7J^>|o{>*F~T0H-;16%s78S6nE;tpj8 z9L@c;>rD{&#+(DmO-~;dh?eKI8%ZN}l|g?AqOwadNVf8VYx zT@G>A^9hIdpUTRO=os}$%@uBRbqsGT*j2;0p(mYYo3rwY)-8{8U(75YR8?KNq;pGc z;~L_}YnE>j;%QIt0)$7Ct!sKeP#hSIIT8cy?)Y!1JmYoW;VTI zq{Ig#F3g>FzRVlJel%})B@8orc&t66p2=^fp5IeselV&m>+KfF!^qQ%J$5&Cdt<%z z>h1S_Eyp|?_6JJl*+mmhOwe>Cz1{VDQsAYGAJXInx;ubR%zM606;gS4cGp4?gWkGg z&?&C>_?KI+A6d>?RxaPy*jqW<_x8Ss#nbWk{cs~s_}8F^Z@nt2)h~9= z&+Yqz?9Gco>z=h3x8(HAfaP{kpyMr61mJBxyfTM3W~ z(!%0*<}ZKLw%XKSRiY+J_dO`Dl9w**V8#pQOwP!Bn2GuUd-dvr#bMKkhraJYCuT^0 z{N{<*K#EtkZMc5SqM#AI(+5M)zCUF4LDq_2Rt6;&?u{5SQ8f!7rjHrn#AjDVv9OzjgC3E&%=PCCoXWf=uQZ zkEufdd7t5UZNnxd`R;X7Q?Q{^N;(9+Rxdw3;XC*w(~Qu~ma`WzgRZ8|4ilsTB-&x> zz4iLuJg-3`1o2D0F6+~gMR{wA-|xBFr{CwwW4v*~WuAlYH7bmE3t1@Jl{u0QN$G|4 zqu;#xt)5YoJJiEtvnZpnFZP-gAN?@s?%{|f+6lLnTj!}#Ec4FaEXnN99ldr?mX82I zrlWheh{h#*ZaR>;d3j1k)${T+Gr&|?InqDQ9GiG!?+=rdS-w{$XuxbF)!UXIx*SqE zzHAMDQPAn0JNmZn0|1sfc-_agA@$ZlPt#JJudI+}pjJL@eKFMW^2QhpdiQL>^PLOT zOECRJqEn*NqK>H@tu^7M2?tR>VV6o|%R*KUnWYmzPURif`-&|+)ZPk&Pzw4Pbx5>?{L!y(F1+M|!}m&_+Ol(bgQF>M>y z@2k1Mx8}Z36S)6oJy>>~g11wbxLZR%ToRpN*^4ew$`ZVKtyuFd4H||-`ryB~7zraL zY~Xv-$+ehGyFBYF|9&_cNtOnF^O=x7{y69ttS;%wR}Tqy=L-0WCn{}2<-YZ)#%&H!aQqV?>962xK-+RD&p+|*V zy#B$jdtbl~3_=PQ-tn;?8t+6QZA<7qOgnN>d1cETX#V_i^m}dHb^rh~6~u4g32b3# zjedgOSPp=T+7GDklM778pj%QmQIczbQmcrvc9?88X<5Zwd}819)`O!i$Nez{*>5wT zSPY?e71V^~LtE&#J9D5f*z{~`_>cFN95JzbCiW2Id4CJz$f(xz?b*-gH^(pI(-!3Q z8-}@L0>6|sQYkNg#cSw2g9Nk5lfu}Cd^bP!ki203lzGQ7m+!L!9`(F?+>LcdvoD~dY4e7p<5zTy4zYq3u+ zZM?C5J>mH;!)GrzTA;6)I`QI`>U_6w`e`;Y{RzN%Sk>bl{=tGM(SBjfe10@F9%s1y zu(R{SUGtoL)wLe2i&F*Oe%x%M-I$X|wA}emd6v?n>PQ>$5WDaJ9*wm*HI5i``6ni7ojq*d;Ve17-Q(MYn#Te-#m3*EzVf` zbap(n-WmbL3C$l5##JFO%)zVH4oxFiGjqa9YN7v%zmgVMy2D;Ai@k=eIXc{wj8axK zR_-RRFq~Q12N!kWhcB-V9BKp;w?|bDo;;(g{e9iRp*eGk3VV2XrXQO!xrUKZ#f*(h2&YF6#qL7(8B)#d-OQ_Gq8Hh2cK=<448p_`I{ z3%=fUF!zOpRk*il-EjQ%S<||pWAa*tG|-DeH&2vRX0n>D&v-Z87S;wP|*qd!9= zKEJO4hE@ov#HFSX{Hlnv%a3(Q9=^=px6{&f=;5{F_6DX$cY%JRr_Z%y^hIdgN0qj} zW2`zM=-#Z}>AG;-@n+{^RCs(xL4n~;MRo4HR9z`&Mia&nRo!pf-*FIj$AAQY;h>=% z`UP;)d#34**CQsPH{M&=_2og=@fR&sJJ%NM9GC9`I%Qqonx`pUvUy(`>rNE;?%G_N zpZ6;3)t#Bcu-g}J%SV`z0}wkKknzLR_s~PHy`xSWnKFxn&xaP!@tpeQ7HG{bEo=uI zV@{5|fL|woOvint;%H3NjOd4p?nK@r;zV8-cNEGAD&78XuEuGTgJ0j zw+?uv{FY1GI5zjw?)$kfo7VP-dUNti?)=ofTkz(vtp({RT+H8&rF+kcpD#hqHT3=X z9k#@#JNXxzA{%f20hs&&g=1fj`zfC&4O!Zr#Iwu$%^Q+P`RS!Ato#TRl6`Z!?pe$4 zbbNdeU-hBA{8im?yEWk;xUgf!SIhQ?%3$g>v)h}=lG-zRpn?>Y&;D|CbMe<4>a91l z^ZSV<9f<3HXMN#-dh>avCxmTHd` z8t>L7`3mk`+&{QLcWa_o@t(i)FhGq`f}qcV^vqgc-aKoRC(m}PrUM!I4(1*5upVBW%ma_KBWJ`ODZ1~zGG(7vy5|7xy!iKl2O5q^rfFN(bd^mybks2J z(8$>fZo6AwDPQfYX=%)X&nZE?>P&E5Wqb0|ho6J4rgl!DA!h!|2c@OHho74F^Qv}} zzyHWX>a6KGfms9Z7hLU?C|q6tXvOH*)LGC)Hq=*STwZrsTv!p}HBT`~l54xN+-t%D zq=Nw;(Qsu;f%)X;apxE6Ux|#2?mh)c_a7>5YJboFxA%ydxZ!?K#q}LCjLi>E=XPf8 zJiqx7+Wtzo6`MBq{nixjLp9I~=sjk4+LQiB_sWKnpybO@Ao1kh&no?#cB}OmW$a|> zVedQ4UzN=b8F_i_w=jb^S1J&n>>L2QFGNj`${7yb`oi2=>TsMPI-mL}H7}k`cs59~ zl+&~pf4{fKmc$0J>N`5p1rF(4+}KdRFRk$6==ghse>n(YWcZfn1)hT^9_>*_EZnPv zNcL>i!2R{T4)$37Pb=jQ?A_l7pp$Exqk5a&G1*>u?%A!&v+9S=N&X0goX{9A_4b(M z9qsSSU%zmFh=j>lugfCx+L#o$&gVre$%g;7t^v!fC#XAj01of zL)HMi!~@xr4Uk6Xz5D^%{pX;~__{C*_#ih9{`BZXrPEj!T&1hZ`f1p!Epv;I7LP7x zRoHyilM+GdW|o# zCoT@n9(8k3_wVM47lg8=xjM?vOnkO$O-EHN0wx^uJXHTID=g7{4ZPuQ!!Xo~{+MOv zImF2x`NhusEnM<+Y_Aiua9Sz^=(=;DVL@nyzuX8#(TpO z57aQ)yGw&;73cg@q~nU~mmLag-~a6Tj=O-EZZ%x~zRT^tDc=>;UC=8jC9Ky20EBmk zfD_m{*RpboEYIg!{=Qn){g+FB`jxUY?^EU6jUI@-7zTm8czik@p*_yQdd$IGS)%j) zt;R;??-)}um?wBNi!~`_?iHpt9Y2nx-=8@qwljHb1^M9vw!8ZMv;$}Eu~Ko@UcNfG z;_q5x!*@LwSJNuqw}AJ4wmjR{x%Y)g`7tY-U9n*ddG0k%ynw#)#Ovc%;?liNrQ*#$ z`pA#l>Tg(Eb`h5}0%X@O=S94@CO>zlt5VlC>LKg*z0=dfHZ~ure)2U(i}i$k+apdn zC|jB)w=DZ~#_{=f)cRxYVBN6toZ-p$*DNhU);C|06(6?yRLiK&zSD{~G}`vn-&yB5 zux!~sLq}*2;&=4RId9TNP+C{a{?dp(0rV2`>bCIqEl4xDacA|NEC}zKpOYauSvD^3 zrn^(!3UT}B^xax)*N2w4ha0J*=zrcL#R(|9dZ#T00vo3CY#~sb>J)vyqfFe8v@=y1 zP|lcEqNqFJaE$hvB%XYE&bD1i_o$w_WMMH7IY&RrS+E_l=`=j#QA5n&+&)A6<~k<{r2Gqt?@b}og-3w2{ZjRKQEh% zWGRYG$cWAsA?&mDqjqHH;7s=dgjsh>cOwf#uE3Pk16>4FMID*Cj>ifq6d6+gxjN|{ z0MxyME@E<@YugU)Ht9Okw4`C?4~0k8oen&L_^qjZeUAn40Tyn`DY_r3x5ie>)XC#c z^90YkVD?*|PyaTIB4ijlyVq^U>`lI)IUvgBpC5FjPettOds>7ZHb;22cF;>+f-WA6 z>~grz96Wb0AR&13hTPv|&zJO{eOP~}q&hAW6ERYMa>3_{l9A$nWHsK{1n|v3rb_m? z(gk@?!6x?f%S{zs=vkHfAKK;R7gqEi9c$;TDQU&ScyZ~g{RfzvUZvl{ zoJjpx7XiUFbLb8&5*ZFcnZN4c(08SGZuFyj3ggftT$;t?~?4On>XhCus= zo7B~Y-_2{lvC@qDXcw! zqVE=+$&Ul8tLVq??t{%}&4nbGJ@f6ky~jTRZ%+=%47vWOXLR<3#F}>WsrsCCi$j%V zN%Xf|@HF-lz}u_aX1n(LqX%O50_l*y3XUM}7rhnZHXPC19D6`?V9Utqwo3`WN!sP- z^F}ZH6!FpOk&+Z4Os8#BBy7$(l)N4fdHKT5hfDe+WQWa)JIz6fVP%l_PCY*`bL+wT z%|#FlQbTz+{tC5&cIT%jUj@@ndF4|-ZZAy62!&MdYr}5-5k(aYxS)rdUO#0;;i0#W zbV$Z^dDHmuL*Hc%k3AGtVt9FDw`u6eCH%O}%bsF0JSJ(L5AIbpIT|u*M&hdj%FQb= z3qD0lmfkqAlC#b4G*bArkw%){ubCx1K^c1}0nbN1&sFRt%s0`jGO^k882 zA=U3h$?hK(#y?M7IQ#cg-R48oCLPe$xPe*3t5>`Rj^ zpXW_wnS*UnmDhmenc!n2pKUT7ug~QEP6fJKO|B6^Ilst@oiQ&1jE$Px(p$GJ9bG{GHQq0F6@u@(vHSZSC1bM&U-@@_=#v`+WQ}Rl&MujG z|7I5y--S^Ze-wCMe$c|VwSRhB4V9&0_w%dCPdqL2J&tTHhzGm93(oV&&aE{EWlvOs z4?EwtZagF*jbl>ri%Uehbnx|;opfbmmORj?7nkwS5@PkeDbD7jVy2D&mV_9 zzchd*gs}coKz_;}r?2GQyt~}qPz@nxsP=gG{S!W%Uh;k2tIj*ap>Lns_@7O2A{o4LTON_I1g}u=!Arpp!B-|3t0+#sNdN+rP|E8uQ)j zDaoHwez+Juee5yg)g3cxY731GDi%AZerQ}(7BBN^##8x8L9;#}3O1QlcZj^B6sEw%21=)#8OtFnFPyxhBfwxw%y zHlW-Ez_67Zpb>w&7PPx)^2B$NLW9gL0aSo7tydYUS`T8SiyN z`nHDSRVBoK=IaB5-m?;XN_yUUuZFBR2YR5@>GXjgnNaQ!Q*_?iE%;l$@{)+`mf)DMj+GOyD3ESZ_fog^s5g@Xhbrc9c_)n|8@y~ zIky4-`W5bLj4kiw#J@Myzw?+KNaiU>i~IGjn*XnN1D+moG;SSx$UniPzg{#?0A4Qk zRlfNj)!d(B@m>dz!}*(+_Z;~5Oa1j*(AUg{9rt1F-y`_@ea~%#nFmal*#`g5DO_U1 z6z*h~pZs5D9srg2AnN$lxqkxR|9s^;zA%Lut#|PMbLIo6F!RSR6*ooy%M=jsO1W?0 zkj5{~kItG7+>c*Bf)Lqez3PAQXdnbG&yLHB>+9Qa?`cEr|d#YZ%}j}M?l zIH$AyGs35S-G#*KzvlFGP{McL|9Be-Ydd#4-rP3^wl^;U8a3wwFhgMv-M#ldf9GZ> zcnw!l@rRHsB1rVFt&e~S%ShNla;DM zVk?ZR=EqSpU!qz|nCavdKW1bBJ!n>7!yQ@E(I@Nj5vcHhIOm`^N4~o}f(o`|S&R%~ z#ud*|Ye&wgM$SYmrp9-ER_~`i?5C|H9jCib|2pmE)0~6PTErP}h(lbuFb>k{hJz4D zdv1Q**tYA$zgMR#JZPFMu%ktgiq&tq22SNo?c>vtaIwE>IWD@4nHIG zH3!-I%w*K-rZNBz8aoeU7ESo_p(%gX{0~P1;dn{D@lM`(fN}Il%GUw-1ijEz=DSY{ z00u&QK~l%_D}SyF{%aEr2zuDnv!$W{`b&k;k4PWe8$6b^v zN9{vm$;ydfdp}-ptjZQ3AkByKUg1mc?|j*7->!|z(|zaD@MqB11AeWe?u~gEzVLI# zwe5t;*`J>doO8^g)C~6|)sOpxU<)07KhCTxKKQo@!ZDNXn_b+dy}9#F)K+9L$n&Rh zcP;8WVxHylZ`Heq-$}*`?dvP-&h%`kIg~d4?4Hab-;^DsJM{fKg315BtKM6BV&?pz z8w?2A#HuOEnucWgw2=Hf?d|QJu8(gXJUH3$;qHyxr0&?rbG;An_EN;JcN!7@%Y*LT zAkpjJX9xz=KTkEsV%Ju+3<-&kug}h-TvJzfJdH4O~Yr-eR5&*h51bdHIxIx z8^8az!%Pr*2zL_8_qi9g%Asg6o?6sBwyl02mBndI8gzuuy{vaHteG6MbzZEjs_pbT zB*8m~M2^kJhu$t+rPJU00I2xA+I>4>QxNPKs-F`Vq?52m=MKp}5=unokkX(*Bt&LHnN^aC%6Du%==Xl_x7N4T|My?dlG}Yx>Rg1!_QvR+{K6HQe)akeEd31HfIu<-IAQ^Os7 ziO=H61xa;IQcnF$Yu#N@<+OsVHc0%}+bhT$f9fc+rCI%nFVoDV-f=KW$7oGR`%SA2 z$m*|WxR#(brzpWJwEn61&1(*-C52BOj!(%_QwyJxx7*5)5$UrM`q8K68KHrW%x+_ z(qG`Kt_U1huV3OM^ex=vcS^0ytl4r>(-Le#$D<#vGY24h>+#FdX3M3=HL5l=Z>!mT zoUrvAJ5QA}uG-jd=8~b4ZB+F=ZW)RA?@0plCAO)+DmqSGPBEilyPDc`qG4WM>IFFo zS-SEL_n}Qiv9=$9XkJ>0+)+C2nC|S?!enU{3%WVMz*-O*+a=+NowuzMNn#xuc@f4# za=iLs8_Tt^eV)q$zCEZX&s)A3`^uhu0Zdh0S=7!mKkkyaoz)m>W*HovCN^-pCm)S9 z8sdlI#BI7$r^Z?4m-sa;X>ubx_mFeCW~%kea6bD(R+O3=gd6edfXwLUm70S9P_D(( zl|W{=i*(?L8&boL9oJA0XdLY{;EsmQseWnnU&gU^?PZ|OH(Ph!5Ew}|;+GkF!83tcvxNjPMt^in?jF5#ei@JVUwMIg zpHT(XO5cMS07%hDwb}OMo(#>@AWzg7qemb+G8N{(y7}k>>u}Sec_RtrPg-(zWyayp zlsiD73z1Rim`ioU=KjPvGA7Yw$Q@LhP50BlFD|RcAro}COODIVpKvS%d9Nj3K|rH^ zT_u9Q+4-Ge^it`-Dp8pqT?^iMg-kWtqo>W|Fkq1v*4OU*lMA`|Kp9fpRg3Jy;4`Hr z4wX)zK3jvE<{bgg4I1^|&!f2AVSD+)CGuv3u36ew>NWjGH2%;?i&b_3y3$&MR&9#K zm$ixh)>Vn!#k2mxfa3o1o8}8K1cKtlr@nuZpfe=thmNrwP!|`VCd$QZVV&&|&cC-ki_*rSAaM^u z`Ms;sJYy@Yndc8lIL*V~6LBQgNFTjD@Kg5#Yj@eePDmO@mi2T8Z+0nA0@AwS(*?z8 zuzQP$sgJ4r8P2O|(`Q}zjxbs_0M*jC8@_Z*jJ8{menirE8N@1Ng076a@SV@6j@5e2 zS%8oADmS#2-qFo7OEYPOA~g>d*bGoSvbwDD*JzP-b9X|b>qv_!@ajyM{|nLL-ta2B ztDDG1=x&591pEAs(^-0*@Euphj<-EW8=bc_a?*ptdmBe@qfR7UGCCqE&v&7pHM5;d zpM?FtwF1S>2V7k<0V%f&IdN7kxaXAFk-DRiqy};qj%r!lhP`t)lfo1N6i&@aj=gA&)J&HlM!&LZ7Xkp|@wbosVvr0`yp)IDyWlcIzVRYo18q`3U}d<D<<40Ep%Xq`%>^z$&BJiV(@{ ze%U-~862|Fd)xO`qe*DR;OZwAiptOz)L7>6-B(g+*+Tr*0eG3n*8>kcr-mUVaLH4< zRee?L30m@2rR zJ^4=BFm==noDcm)IDw%D)y3dkhoA@iQMI`Xc<2_mMRRD)1M50&6tRbVYTP-29_=<& zbhk2YJOtF)ox>QN)HvER|Br!di`SnsR`qEi9@H6ZktovcA~p#;&H1@p&RL02wXFca z*pldK}^S6KGm+Fhs>4M7T$_uu50 z7mAyH_1Lx{Llo)ejTK`@b_volQI-(@yYn(aZ!Q8~DOLC&x98_aix@a4vD+=e|C&oY7Xm za%$|==9xf5+*iz?(#6$bw=PuLL#at7Oawhv`3164O+tv-znnpsYwnjCurO>wBGTO*J-GjOnM1FLb z6D)y$@V$cpYMnl$Psyif0IOR8ohT?3>#dG^=K{w{$H*G+I3e#OTkxt)4)WizKh{XJ z`qtgmnT;Ks33O;7GbVs9A>W@|g`{JL`5VrJPGmEn5PZTpwrtKM8J>d0?BQq3k6>i^Tvm_{j>9ZFzt(cQUnc-4$nydDch;( z!oh_eLnnE)y$`RcN&1gMnte0gauxBG?=!*bR+{pXB5$m(#?IsWsIz?AiULn`k!QUq zG)v;-5jt42^*NeQ{~Gy;cyAgN#*{ON&%4k8#bs-E|BHV-r~}W?*@DfvRC+w=$-Mh$7C40o4nREg zE>%)A`RfoO4Qv`L>eKkfgZqX{bDOr&(Em4HqQ1$WMg`$@OZBs)wJK<2ci!Qjk6g>r{TAb;Qiw8PcfGS%|cDzC9 z&c4gxMB8}cC2r(#EF_3H&Or7s?2)U-FXe!3Xa(7C4qz?_e!Vmf@P8|YTeR;d^AWWC zSN!kd{n!?cEZPcq+<}@w`@BpV6?8in!sEXCrdv}tIVwvkd6PpkQSl-hr7lE{ny>5- zrYX2aPONWl-#yuXWAw*c&`7;$Xfm1&6)1+*Q%}EoiPEqco!xN>4Lz34>!sbBf;T_t zpUj+wNl9l-9yp1l?IeM5>wf+LMr}~Wxnt$Bx1WiWNx|Y%ZF@B^obJKBLOp}vDhdE~ ziIi{{+sz*-`^{TmVG?aaz$Fity4cizbxJOT?534;zrH8_8i6$7Uq4c(VnD{AWFD!F z4AV|lU_inhzfwq(SJmTkhb`eJp(Kp={MMjz7_5cPk^4|P)ecd4{3B+g_W_Mx`nVnk zT)dk0zIF3f5$#(Va_i!zIknjaphzl2&7%MQv0wX=8n_vY#~cESFef392M%Ag&jCI( zO=2l=$*AcXVGO1KAurDa;OflUEJLaKF9{HTP2jZYC+t3*{Em9!@00~%q@heSv5(YZ ze!1^WXUhR)l=n)sbR*ZLYA+_DS@X%o*0q2jv_-&8gW^o`{iO)RVV|eWGsom7_)FdA zmpJ6NT_t%M>bVHP5o!0*)8O#hmN;7im~ve6KQVGEcUP3!n-XD4I}*!_*8FMjphgSY zVbxd_Vqo50QUDd1WZKleK5~W;YVI#|`U<0qYdxO4s_n3N9YRr?82{Mt+JpD4n^w-| zeWAzc)_V+#d4QX0|1v{WV^E65D#rCBt-Ic%X($NB*;i6yCLL2He(^wGvSP47$?X(U~Te?$9L?xgqD675bA`ULw7E>1!l) z2F1Z7qyP2=r*hwm_a0&%H2pBx6BK-pf78~&aQ~uossh{9mY}bkd#&e-`lU7KZ6HXX>{F!7fTDY!U!BIGL<4DE>ckaIiXyOp9pECUG&7O z9>z!ug%T}YW&JG7`p@1I;a z+5Wm|>+IU0*>LeKDrZzo)>T)D&C}iU zne)%#GXPac2)b96fT1IzR((jYFFS1JeppKIcLK4t7TFbHp_&D-u;cDO_jXbt{WvpI{yhgB zUkC`lblji-^;d`cct7(8BZafB+4skSM0o!Yniuh$@WLb~RXVHuZ~dptFbwtAc8|Eh z;M?j6yPJPYceLW%W}g1~adeBej5F*EgF~*n$!wgw42(b)D=U7j7qoz0;vUa7)-&5B%2w7bPmAOcSd z0&_FK!X75HnAEbR?|Odj$~qtvugs|ozg6j9e~0}-P(Kh%JKIl{9Tsi(?8V1 z(p~v?Mx}zL><*=0= zst<+adcGzLi>}8drv21b&BzVguJweD%^>vA9YwDlORMWO#8=8{d-Q}zw2f!}YxB8s zvNbh^B~JEnqPn>$BISlaNHUuaU9olqP2oZqVgIGG%CZuZ8aS zL6~Sp>D8u3ybj14aZxj=`d2;3x?7Q27<6t1c0Yy9A+qrSR%3gTk9ZJPE&CzK$U$Li zA(zjN`!WpO`Kg|V$IC1}E-}>-;?sG=(@vXxuRG|-C-L9&pn8C#kKbZ8JwWPh2YYK0 zJB=`fN$Yp*5j%J4jI+0&^%K!Ik(!D)?saw{%#BTcG^zZB) zb{%cVk2Zg=`b9Jp5eN3fydTNoCgJKYojUC`)mXI@UM7FdHnXNM9%Tdn8VIj9MA!)e z^f_*YKoXa%t!{TP@=z+(>VMM{bNX9d6NJY>uYG!}Ay5e$5dK6Mt#JJNK+AJ*_5`Y# zfL|&3CR#eY_1!zbquUHyj~yc`Ow`^LFJj(UFLmFSgFyX`CnV}@U%acypxG@Ge=^4_ zPFD_VXqi^73DLfZLYVDbu}cqf5rOVr)eoYDl^4}7%=CD4ns8Q29-+X$gFPo`a*VW?OQ95w$YPekv1%Z5Lxlzy5EI>e6hVaklhE%t zuu`cWLchqwpD1M1mH?%B0wT|)W zTpoX^o6SZ$7U%IN|HKh$N1vw?gyfBw^>yppc@C0)>JpM$#CcnejVX0IP&7>JN_cZP zl3}}XIn{R;K9Q3YkPM-~T578Ki%|c*`2!%Mzs~*;=l>M)8yWh479cw$Zs9^nYIG71 zrN~#KI;Vt0S}_T!E%<1I;+P(M%Ls_Xd@=z<#I?GR6iK%T)FSLU=~C#}w|}U$C_7}e z7ikijq~QFGMX`P8uJrCyDPmyB znh!I=XKs>WpU<1oj%`dq{eX`MY?*-f>W?mw8K)X3Ya5yCI6e-w5%&>=2Dc6&yEzW#N1Ox(*6WFSRg|C&Lh zhL7t>$cFsR0+%)QiD#!kn#>Sb+7G?zJD?<@}zc+c9gYlzgFFe zqG~5wQr(_yE0Tg(4wnSZmbILrNi@i9T-WS9zi_E)xJCAphOc@4Wu&krL&vl}D{p%+ zuuJbrEdlN-8{ci&MHe(aoEcq0B;tuSE%^ht`cB?K3&tXl6$iA3w(|84^xTDi@rMVm z`26xqNt&ceiS8zYdv8pa4jiylx6^Zy*G{?xUoRS(?=^kab=&S!UF8RLm0#Lq0Mwru zdsMWeL?}F*eGwa@;k?0}qKVzE^rVf*_1S?MdO|XkUfJKQyCag-xX$a_?mKKb?*5I7 zb)=Pt@HI8Bg%{c5^t2TBCB$8~7TCW5K9^}Z%3PD-jdu)+>mE#vN=>2l(gvA*nuJiL ztY#T+JJYvLAd4ceJUkyW2pmBN10euieFV#5gwSFWZ~ttK?Y&ksLR2r^`l^OTYEBi% zL{XRBy#L$qeNdHCsPL_Uj@uS)m)4x^C(I zr=o-DvHZw@pZeko`&6+`(wk|W^P6Ml~ zCUbeDttu*L2fJ-fUxhSN0z95vmnmT$aBLsX&w{UDQHfFLux1wGh;6LhklHtxmhs-U z#eX7|%ck1SZp%0Gs;5v(zZzPj ztDY!yH?{BN($xCA2j>je?oBe?v0XIP()H>t&zLGHJq~UitQP|<~K-g zd7Uak$5>k_`zMvo1>#BzBTw{&e=I_S5I7Y+x%zUDNOdK>F70~I} zTNCg8{x((ExvlO-hdsH=+!{J}Fo&F7e<#g2(!UP8C_w;Uc0^LANN`nd zysev;w)la8WAzTvIDy8v+^FsC0|?jFaDK&c6^~z8k9{|MURPkHV}+c1U;79D)k7z* z{F%cqnnjW_ZxAE}<(Ya--Jdkvu1hTxaSNKA(Vx0LY^LlL?)6`DB~D-ZlMxdc#qpuW zx9&^2xCO|`_9dr;IcBmh6OwhUif3-80t05Z&8&((^?`e7oqpJ}5cX1;wad~Z1Q~@Z z9JN%lZ3Av7g*fCL7rfPL=dS-2qrZsIqjZ2pBd9M=y>k}R^m(zk3aTUw79Gg_@dP5H z(l5{0??9fR*i?B2H!vWA@k30N7>Y^q?k(>rtsh}Y67=C29szlVBkl5 zd@P{-?NWkUH^cW;eD}K&8MRy?#~a10#P9rk2jd2X2B-{xT%JdtnRfXO>(boO#pw8XzLRm(LDPgmuK`+qSnX)z^CT@LJvW^#(nUznNJ; z)~PZmC&Zy^r-MB0ga7w`@G^%h-ZX+W(%-KU4hLvr;hRTRk5`#?@BUoAfV3*D+mR8I zJ9+59H$WmT->z#%yoKE3N}!SIO!iMCf~?fPL22DPX0597E!S>)&$*6kZP2lkGWn{% z%ZImV?A=6Kq0buP{GE|cSg{z-FshV3O}cLWJL?Yq-e!hFXfLZyl#v<#mANJedMmT< zoq9jo>Snb7UJqa0f2p$B_(@F(4W&{|Groa=g}(_Rf;R5hYd2BKHey1bL@WEu+K_IN z7>#%NiHzs^)q{dQqzjcQZObIXDuHl~+K2u%Cl9ye z+FqJ3hHUd+!rmnkmDG9t{l6L_OEQhaJMNlO zl4AX-T!x!!OU?%TsHbw#tTIKLm7z zgJ4KDh(lb;>W-2ad%$Rak`fs;yE#5htQr>Q_jpd;dwJykz-UxiXZBGUiD0o!Hq@S< zu5LSdN%}|E`LydkMqAQ>_CQmglrK@f0vWihFKH8{BGY7+D*pM#pM(;Cz)bom61Ltg zxKLBU19Hf zZ*MnTxoJkm_P0QIdei$H1(T73A?%ZIqKd8jgIHtsu|w@z9gtl82!3^Ih`L9m0&}Ct zgp+g5?zQTqq|3z=2Te&Q=lc3n8?)2P;~D8b_O5BJdldaK`TZkaQ}?CdosiC5{a7;7 z$niHLXVRyE3h^e$jPg|*k1!23p~M^D*S&6P)CG4cw$w_?ELy@qqhs=c+@rCosa!f# zK}5$^o+0l?{X37FNPQD9EbZJn>fh%?)5JQ3d2d~ja=K6+VOn0K9hp~!akA6$t6l9v@4{%?fWMK@SA!jA%){6; zs8lwWl|^UAQtRrfuGOT>EEkz}z4kWbZLU3+cjR4dA){e$C|@=Un#{bncDkq5%qGrFhIDD`;}v4Wg2Nx{OIP^&q_X~`ZR>wOv4w7r$G7fQqhq@Hbp zfTsHjdXK^h-3)?0cnz^adstz5=qO4BG)#4KPg+9R6yym`^lXKoZYpA)ExRc`+| z(}fyFjQw0%om`ZEDTMve%r{CX!mDnHb>#Om+@jnFip@wjszYtD`tWM$v-4m$?W!ZW zCjt#oQ_Xa7J8ysT1uku^o9C*F7rm9VUl=~xEiF?6-79dJRWTuX1bQp4!kBKyHRc!X zu@R&}V)Q0z{Co&%E>kIq|Ee^1JBC1viO;8PKM|Hl8d(VKcw| z7fYimyiWrH*2hQD}Q(m$1jRxZD=f%2%6lM1=@#g*c&f~$S@uT%sYTv7zZrwinS})H%ZOYd( z!BAtzr{S^#2zOnvpl?6ETzkcjind#cic9F_4PmBRS}jhMKC!fX4TH@mBGkJ-PQ4gb z-h(Mtm!&oxPASj#;SAl_T zngW9Zr`<1bxV*?dn7NFa{^>a?In8i(KJL>W9zabe%9w`4Gv|~`q{Q`yP6OHclDiJ5 z-z;v28tY)kio&^X@p-}WX5bl78+NZzuc;yZI8tI4uN5yf8u^lT>f0e0T3B$|qB#I}k%C>y)YrXxzF&M04C_ z0v9j*eIu;nLH^GOO2vJqiXlTOJy5n^G*4mLrF~F^4Ca2=DJZP+ry2T8`4e1et^UaGv0(N=9zL1#}xwqRf{spm#7xZ8ESzxH(!5TrKS`(K`YUVVXYcI9M~%IOV& zN4WqhD=`$w^}#Ue4jC?Ko7F2whccBg$}HaKUStl zlwwtYTIUI*7sjMg*e9d?^Aa%e)E!s$laB}Sc!!?&`1U7Kw-z*+cC9u9Rpe5c2$;mys5B>d-#Ef`4sWnlBNfiiwcKk3G$I=`|q1% zZRvOa?2T}NqM)>b3>v%@5gFH@o0>@*dG;P&r5W=5wl`q0T7gLGG+Oj8#|O)q1>Lw* zrqlln9i7f4v!tnuNh4nkV{NKmbUENOYu7gW3)}8O*C3AZ)SuS|o6hYWrx~r&acTXaDi`P4_ zSi%P*yen3^8sJGu4~956`LX*?Mz&_2|IfrY`Dx*62lrFQ0ZnVj)UD^xypd?}p8qrQ ztCBH}+siYa_z~G^E4Jy0&33eM(Ol=%_$(Jb=7&7C?~gnb2Vt+iHm0-WpJMs(XX?|) zts9qefqUQU*#|t#0xxQJFXWlzj8h~V#k7D%^3EM-_a;C#w1P+al#nO^pSpT@V~4(m zk5hx99>SbWeytJ_+7l^MPnm_wB5L{*ezK1it3bhZk04{qMlqz~)1`<$rK?d^n|dN9 z1{+?1=i4QbE$2M_`;*tnGfVk>=iCUBplTQB(?Zb4Rb|bnf{AusmX(aP`2FS6y8iL+2Oud?DxDn6FgzXL_(Q6%zW^ypF8PPw7K$KPnOF#ElT(W=9KiwL^qPw!{Lq3 zGS>*)HLG5$W32Dx9mVtm`a2B)p`OSXCYmn-Fvm?P7r%}{*4@MSdZ1TaZ#z9O zvd4bCd%iqnIgB0?awEqu@Ulz(Uyd-$*)cbz3rC_TBdetHH}wSQl|rxqQs+tqts{V9 z8{;;Sob#Wt^txa>8QJMe5h*Iwl9K#V01EI8@(AhtfVOwjHra)}(dEcAM`EqA?9&6u zfDxp{OT@N36g}oVdlXI7WRuVTal6UCSEa@z-<k$p2pV&-%1GON}?ta)!Fn z(24LO2R#a<_e~=2u)-vu9ANapJw0E~?z+kUh<#q2D4*sYMWD(%zjpE?pnOjO( zJzDKmavv~be$j5PNqfEX1FVcRD`=ecT9G4-3|0)Dj$McqNZLrtc$hMY6Osw@5I_6N zt<~YxrV%XWU5t{s;>Y1BFDv`F7WM1U#&p0vn0N40QJ{A2Yp7_q?vs5ik6LILPUcii z4I!Li#%E&;eVcRl8>533!cW&e<<#Qz*APJ$x zY;WY)E|@8ySVD=e->Tz&afU<-$TkW|bSQDMj~G={Eu=7SW!)_t_~HOwy>a@DM)#Xu zC$&Tg75^DP15b|}xTW-oZT22GNiD%jyyxs@1tE6Pe1cOnfTM<9T zjpb(@BFV%y`XG-l?XI#s8Si|h9pi&y485Bjl)7H|>$wgy%R9^o25 zm0maZRqyi&jrzX>|Ks|$%>5G=ua=^gQxC9X0iU{dlXYK zKWU~z*A*cTcY%bn88rR1Wt%5` zL(9Q_d>R{XK&@o5xokZA5a*rm|4hn7=g6%CybZ+h12K!Jq*KTk3-x4#U23#C?E?x`Dg0rY18K4cju z=>ash20mTbY!>JDLQc(R&db&cBt^8~rXts(Fyg(I?dlEfx4SLtn$&roOl2V;dfTVH z?q_GxT}rgqUum2u< zpDL!SQm$FS2D;E#LX_L$L^HNuY9un|Wei^*?YPGqpGE777_8_g~tNXgF z{2UW@;v8%E_=XSQc0S&3gsjbVoNrSJEvt{yQ)cC>nr&~f&SoCNIm%8Fz8~gI>;x?` zg7=o1S#X}%{|`YnUoVt~?n=M-v48mxkt?$AK$i_MrOKTP+PSEF|5%e8Cy%|IE zYB!T06*-dw*@C3TbVLE}NrrOJbq%`Nkzw0KfZ7^tG@r)^%UMLIiwAyBYv!1HqZibK z&u#*&YenXe=&L8!5naXkC|&M2+R5*q5`RedlN+jFLo#u%#3YcK@Q`m4n$|feVi}}1 zCQ-5aXF*qC^4&HvaATZp8-uEQc`b9nzo#LHS%b9>t@p%F1S}+{;M~u0u#vtjoaVLsN%uXcW$V!prsYf8Y;TkaVa&|z zJ8*HLiAS{+eYG}&Z`0{jxIQbVskxy%Sm7K-E)T;>o=rmhSq~iZtw#b?HcKVeyKgx2MdsXLPTE4>Z_L85l&~u{sKF+%g{?^1bXUh+{vs-X zb_wjoLyUHNUD$cnV+uL!@%#FP2#qJgWgju9pk^t=IH^`3MU@@FvDkT77?H7ph5JzA1?5Eg*?ZRQ+0zkg8uVX1B>ds9RhsbApza zX*B2gdeZXL3XMOxU3?v31ivaGh1eia)R=iblI zffnM2ctO%bjSd}o2Gmiqsx)*0GnYZ7X|)oyxi7CGFBfm>{rz&C$B;7?Le|s_VZkTs zcqHy4ND8hOu`ienG2XIG41#0&a_4<{rH_*Szu#)X;y#2ce7&=03A>cbMmf!V!@zG$ zFLwEyV+l8MdrwFDy*bQ3&|cmkv#0Nk?v}5#tYL2V9$Y!E67l}2D zX;}x_b4~ZvU*F;0;SMUxCeEf%Xba<))-2yg_4}o&6Wj-dqDyX7Ep2$5JQMa6$x31{ z(>OIYPeBb@6w zn0_<%S8yn+r&sQR*;jZhFPmAN%M#+ z!|1==m1ngB1kZD6tR{w50@=XG6@A;il%VEscaB?3;i@of#>3W_Ai6?aoMl#eLTY~d zztf(R3s+SjOv~XS+x9m0$3bfZIJpKeTFL$^VEy?0loqt2Z+oze1?Tk(H_WW=zp8MN zoaX(k<5SRNsB>Ru3uleZsQ>wIVZV}xi8Y+a^~hXAL)yigCTUq~Nlz*duVQD^FpQSZ zJ5<3^fB)ut)|+6s51TO}`3h4wn&?HR5~qJAT5o!Of9^?>jOp(q%gjN^ za?^NX{r3>zc=eh$mI}NT?XAPhX<~RtnopDpWYJ?95;DI(TntG0@gq7O zr*39BLO0N$9Cv0GAsE*-V@$E3SNUnLc=+&AMwQ!}C2@U)Z%SsUnI`?yVB(u@$K8nF zf4gw``r$v1<$@RaV76-I{yjfWxSkM_)7*WgQgk*;f3X=T->GGb{|q-0vIJ zN%pC+mK+6LlB$n}iq%nb@Js-aW9vO&_%|w4)oxdRmXMc}Tcr>@C^lG_#~b+rJsP5AY4u z-hgqrh;5UiHBqMGV&D=IXLHt|wBUFR14}C8aB1QapE}MnzcBA;$?yeN;ZgJkx7X3D z6i>*yydywDCS+6eD$NyD!%P7j1UIn7{MOR`0$fT?bG>JI9a8`|`6EO#F7+W&E4g37TGXFPZbdZR?13j0 z3hr(^f*5O!SU|55qsSiA%oHy7e&I!L*@#Kw2B-xOO4i0V=LQkp*)I z-H9vZzkYtb1FONOE7ry~!$qCl?2ane1_j8n5YN?EL*EEeI!!JgLzR*PA0%@v;nD4_ zETN%qF>4sJZ$l39q*wh|JqwOe(TZ~dfc+HAEyzn!W0KKMo|jrm!kGmvqaH<5p$?(; z>BG(FERyE2>M2+C7}0uMAVoPD*Q@K=#X|1=v(3-a3F(!@f@7+cM6gyfcO{E8)H z#u4%jW&N`6$8_8@wuuxYOyMRy2j{k2_5lMY?}yd}&4x09ydZ&Jk-_x1bK&)9autAY zg#@gmoM!K4lZQTNN2+&PU{LC^iCHD*i!l3aQNfuAbazZeX3C0(*ECTKU7wfm1AL96 zAv&Mih=ds$5G6`bh)y&8+=Byqjyy2ge3YF_XzHRaHRk6KKMp5q0TGq!O=b-qA*1Mg z?r>ys$HB(PQG%kanwQRg{4_T{F7SDm-YPC3CbK&@c`JtH z8eQ-d{n~}J|DA7HBl5BFN%aED|0*nLx08@;Ai5pxor zvrNux@_IosL&11G4zb1PH6<|(uN6Pwv{|#Y+f|x}x1t8uNBnnMe15G!W{5)F6sfw^ z*$|U&7Xj^8u2$tgC%YH_mE7cFE$Rk4ycZra<3A@UR~2Tp0B{FPD`@s|S=D%G8g*X0}77Q@v7irC@cGc+&Pc=#)KD_IN)sF zS7tH=Nd4#jdLF$M=Y|y=p0|SaXv}gM;-fYHrDVLh-7MfjqeW`3yoPtBlh2+c(oSpJnO`q^Y-<{&QR8c@oi%Y&!xR$!NueV_#baj{FE8% zraHfF6zsF#Q)b<*3%G>#8IwObgJ_Z#45X)GuJ-S(KcVa@R2Of4I$lz%#NPblOOFju znN91chFRy1!ilT08kE~;5ch-#wXk9pZk1Y@_KM91+LvaTKVOz>wvK(EYV?y;V1TdY z^&;)TE=|WSG(&LCJ-DZ8f)>JO695?nq>r_TDg2)JtXX)=Rxr@|rGTz$CNL}dJ#uir z?w#(4ZSqD8Z?gPx_-=HfQcMG@EK)da*A^YgV^<07b z=;j|d01rH-HCX&g#?jP#O&S9=b&$=4at7Sn8Nehc$Yp`qhmE*VbP5nZPxtz&jX(zO zsbAgV^R{A)=ES;LH^#IjkLdJKEsPMcxN;SPHq^ER6Jl#VFq`D82xmRldjGVeK7jsx z=aVZU%F!-E&_yyTzzRc`c1yg>nt$JA^rUfwU|dAupB_oYEx#SsSfh|c82R@5_E-jf4b}*oPoR(C-z!|P=?tzI_&-iD06@vwH>BDT9J@YRX z@S3WNS>pfSpCP}G?OynQ|Cc%vC06lEl6q>sOq%^qPG0+^|33QsFQq8Lb!<{|norJV zKSO?BmeRfU|NYmtId4eJM`&}f0yIGpoCuvU4<++e@iW?WdHXw zGr!M;OFCx$MOdK=MMMq?^N#8q^vkzkr-ip~I6qfBkPrKOMz+Y9ZFhGG0F*U8L`nvT z(ws~jmO?-p8U|ie)h~)OX9W+UUIj(9)D%jfR|U^NS7btep!n<(YG9lo&0e@>hxevT zvs*+Sj~f9Df8MNnAO6aN2c{>H?9kI=xN8l`foQf=T^X9m3#eI8_%XkONv{mq0Broi1hVml#}nk zP(@L8yebTR3nEB>)&>v{i7*5%ty}m5l$RdHlNfq2$P=Y+CtGyOm5CIme|RzS`p680 z#zarxsLHNpxDRbeA$oYF>Up~iT$)X1<`JM!wZP>6+a5Bla&@>u`2;D7^sUHf6M#`^ zA%kd%&LOwBi(^iNRCfRm8QvjBQH@*A@$XJD9fi~V@@HG@lQERy zQm-yitbHHQM5G|Ey`{ctiqpTRR@NF;{$JRlXQ5u1*a2FGL{Y`6%G8-QXV<|N`Q_5R z)*9NifV2`L>ct!J(MC0%#WXy4#Onm3z!)>D2!R8I_^P*LtdYbLE+IypHR5v^7wnJI1KuO| z`IQ*5?$)xL(SMmgR8U0_;Y#gQ@yql2@qSST`q}~$)}Wv!SJRDt#o?~^?8L-!4^Z-O zKMDVC8x^%Yr5o*EFl%|5;#J|Gy=@@6D>l3~v(Y|s@P5L+mmiTutW@IMAQ#RS$}5;Ya7f7R<%rDm&&!6W$VNwukJ+c@jr{b4U2u%-4!iWY1yQM4PYBf>2B0wYDW=9IAv(Z_;`g<)rD*=-ODfakzM?8 zZT-o)KbqcD7-XA`=!Dzljfvx`DDs?XkAvE0^f^JX(X4mn2R2mZ9b?AKhRWJ9eExNf zB!nnhqTz;}JTHW@YIWw^abtNA9m;zf-9kAapr24T4&i!@SZ_~^$!SH~Vb58l*hM4Y zPEnzJPkk{u<4!Q|5fvmYai`-XXgwElD7(k3^xAZ_0VnMkc%RW)!uwE$zJXnG>deM@ zBiFK%v4#W{B|IN6Pi8qyAA<;M5ad|?Khab*H3kgiKkJ|qiClm4#kX#y)w`mPo$_IN zaWga@c8i1d;5Td{>km@w;7rKLiF%!gy}y?8MH`raCvs%A3vD^f$tKWB{E|i&t=n1A z&x^fBQ0-YDKUHNvlrQPPbMeZrhfG|X5xuwV)FmxiHkzFV|ut$f71DNBLu)) z@76_~p>^}pZ=^i?Wy3=w+Zd&}Es)hV7TFyojEMXV?hmSqs!pIr;8p)f&br1Pn%y$d zm)UP%nIB_KShW%zc`l|OZ$8}1(5pX#&y&$k4SVYbYzPIQBB)7b5M^R66}<{I4e9#h zfL;)!)$r3&dX=#0lP_j60oHxqeJ4eikR)V)qz;$0dfn}LE?#@J<(@1({_u*A)C(3i zVY>XfFAy}>5y5&VCUUs?g!9!>ye0C?V;jq3g zd?91+QQDdHXIhUpxbU3q2r2&|IMTfLTg!In9`hA;js;wyhiHy5g+sG-9PLl1rZS=4 z6jD_&snxeDJ2c#}Se-(o8{Y=%pEFonBAs)V>BLN+(LQU`4rTpU*Ug-oI&Rp^e*_Hao@jxWI zZ9!PQ6nesJ1+@%nM?$?Bh&kAY_4|ivXYC8$OYDJL-n*~w#XUyI0eyCp`YvxlZozJe z$JSw{M)WDloWpW;WB}|SSGwrsAQcQPt>?4Ne52XAY-bnMP(wy^JUZ4H_?uUS?=09< z=A|=E&Q_>8cIIS+s3Q!+9(f?EfZf80$01wNE}81%y&4&AeRf9ILr~^bj*Uw#l_LyD3pE84kF!ev) zZ}whkwPdt0k|m~NSSe(POzp8GFXFrDDFT{`TBk8SN?6QhvTcKK5*gjT?V0Z{-ek|;oz1I(albT?0sY~-~S*vOmrbV;(j1rJXz zmA$>bnEBb;9P&Od7UM_vjZYpVYq^Vrul@FUtLHZu3mX5NEYKUc8OHd1TV`zL8NSeT zoe*Is#DLGSYCVTTCSGkX(-BaPtv9{CbxtMX{!q3l+#f@D`k8^m7}Z6Z<_g`vSwa+j zhY))tL7d^qh%Lc1^~odzNF)jo|MUQ=wDpnl^yq`1pU!_;N&9)bI2`&y-V%}m1nk6) z@{Gz>fgg1sy4;hu97~xb9?u{xC(e2Ma&KNmrtW@xNGf15ETlQ_WGezpkME73?F@>j z0}3#!@g*b_uC3@Q%|tJ3Aqx27?4)vS^W-|DRVOA@ZOMRUv{>_XjG_S}NAxNNN3jf4 zwz!~sIS#}>`vjUpTE(8P(`po&5%*EitmMTq(ot`Pe-p%L4IGOde~(4QCD|>Ll+Jy- zH5F>XY}x_yEP`aX6=QSr9(*!%X|5nMH=$(33JvmcU*X-DzA`9DyKXvuK+>3ud_qH> zQ>nlt7jM*>H4FYbfi*S%w^Oi^on|lfOXc;O(4kDw?HNre+Q$RSRG%`W75@z2+B`}b zuI+pDHotd#=Y|n&gBF9aU!>8D=tBU?_R^*rM{2gw@gW`k#qt;Su2h5lZsj3$jz$tO z^g*}3hd79idh_6q{u>ycde12h!^}#4(u z-d7$>SrO`#+k(wCWDTdiX8g4~?DDUd-~7)z$A-VNtxfhLGm5p%C3k(;^v)&sKaPpB zo>=tugCAkh-GCs4(h@$*_^~@Lm?`^@1MT`g4B-bx4}UCn+M4K}_Q^BsW7pK5uV?O0 zzLna$JgXDJD>5`VFSjn8Vmu$VuhSuNxPk9>}gjY|e|FVlX zf@xx@^&+!xF3)+DTO0#R$YfW{dfs;IVe+Lj?nhX~KLk4n-0Y4&{V|59TG^N*y3gk7 zv;Oi6AsfW0;X*Q+_%%HEiv)6I)q40}M#D?*#;j5hN^Zg+jXCIP%%`kvMJ21rYq)Xa zfOY!tn~wa=I}%4-Ai{20sbg@gCE~K0oLbP+)S$4Lzs@a^@)v0MVTIIEiFXj9Oc5Tn z`3-6ZszSC%K6qUBgXuF(Ft-co$tgvB%R*P+xrw*zbWDr6rCa7Sg-LL0uCI>-` zJp9G@SB-d)i};F4!PlSFo`r1L{h&Pj2Mc{#9%;--t8YFN!E{5b`f<~*bO)mEA-STW zTIA~Ss%NR_VQNk5M@i5^rwZOjM@u9><(WCFwy1I(wg z6^8zX1raCObAAP#XfG?pg)!V*+%GB34}d8aJLPw`5N!+iivvQu7Ma`;=S(y)PiX`R zkf`Q1A*a_*W@0kd$QuXGV5YMDKND+Oh93dzQ(cI>6!YKCM6XTzety9E*quP$FUoYe zAkC*u29~1>D>XemRco7yoaSA#I!Gyxkx^3ITZImt(4yT;tu|xZKC8(~D7`)*f^R%b zV$w>xKm1St%S>b%?4&)z`Wg{sMp}%n{Nn0;TMnw~T=iqwppvS$ANwHGXn|&zT+9hb zi|Y6&@Yy7MTGzr69ZgOq;ZJXE*(P*NBs%_Y?PU*h|5!rKKgN3bri|}Y%wm&x{Gxct zc^;*5Hr#1x7GelV5>abEU8c<zD8P{s^*R?Xz`4}6fU}i`QviTJ*hf?n4%k14G znE&JZM4RJ*83|o<>?f_Zt4^Fh^LNL;B^p`VEeh%G!sR130xE_72)5U>60vU4v$Qzd zSf+@&9I=a@yNgIH1ea>a+5%l0x!bJ})mg+{L9>>jRr=P)Fs`5g#aYbi7Z)aX#nXH| z)+QxR3MNnt35h+U$0mpXI|yk;8pYpwy{#{oBmKvxLEZ<*t#UEQv0nw!TRsrg)Rhpi zPX<-Pe^7Y@V|()mb?=#7Lky3IK&MWV>r0@)7f`YWIR&UqLgH|k{EF>$E6?2LOfI8z z?IaUyN%@9z(GJAoByfcS3=E5w;!yv(Pi>40-?O)(7zgSF#hv^{^h3~RkZ!ab^tH0u zJKDFEg{~Tg(p{15l zSDHtWg~$xV!|M3C_Bwl?>-Oo`_btzNU4!7--EMbT{Lg4@e?x}9DkSsi~y z$rKE92Ps+_)A1B&2D+m+TsCeYc}~D^f8WUNUZF6zhaZ?^reF{0x)Z0?#GH9?;*IefOi^&JDF6*SHMS zRglU38M=A=%&N6NKT++&gRdr8ssDbWGmt$@$_qNHKLQ_=u6k`S-usLGhj|Lh#bzjB zPLej?xJ*EYAGJ@^!w(#!y;^q@(?WVWBCgg#HTk{F>u9pCLJFDSQK&nYl=jOsK`=8*}{x{m+Z1s6on!REi%ZGRFbk()$(BI*aD4X6FocdC@A6b7h;#HDpyekUMs2JWY~1D{^Io>g-Bvk zVZsZuB9i`U;8j9Fl|O^_x4vTIN4=!kZ@Tex@zeIU_W)mG%AydQ4H)zLg9n3e;PZY# zM7fzIVB;4(9b0Vn2n@iKybl#v;9rGHOOW|cx{V6bkh-e~vKQWd5@nl;qXix;fmYcN z;9{cMda0#tzqYZW%tHzc7hAMw6~q)6=nm#r1r%p~_ZE^8Rl2N^%f#4pA|I)3qd5^5~?)ty{LMmB^^|Ve;0LrRv|g@aglr?+h?^t@pD)BPLqoB zXoRuiwnZfO2x-MA-LfM6L1Wdd4;57$^DOi0HDtg_^$G?i( z;n>1=x$c?>`;DvfP>XrJw$iyqn36uVkCr1~6)_O4xh!S%Y~Vp`o^!lxvBtn7q3s8_5#@?@{mIFbppqz0EPz9L^&a`!ueS^z;9-@JH!>J@l7)k! zfV@$H=dMp<+NnB=QaksfrABNMVujz$qC8_s`}rBsBJmo%qPwn}xqH6jjdnZhbL^FP zITel}3XJ>ol1=jCPc`Me6jmleoapd&7yw~M?-#4zc~u9}g^CeY^ovJW>?N8yicYx> z!K94$Ex2AvNAih;7vW-Gk+fNRQVG~f003CITbaFG*-(9kH+v-ze<`?n_b00;Lz z8c>Y&97&B6d4C)zsucoDAPy3h*})UTHdhib{CIXn>M^b}uw3$a0e%woCphV}zJ%fe zISIWA#*f_GQgcly@~FC?brnp$@!Zz$;N6!{3r%+Ruzku7$7F`RK^h$K8*V{{YRPWX z9BJ)u;Kmxo+`hp)fMhJ!RQNfMRi^e~!$Q+Wel8B0)0IZ9-aOg2=YM9 zXL=DquAP_TE#SKKM3cV2oE=XItd)dVMccL-s38rK#%S0LxzonWF3xJf#V^m^iXRmU-B+o_#~o^6D(BhjY7&)! zPxXzmoeqlB0I@BfZ~CBIPWZl9%)7QdrgVnG0{6_i`o#Md)(b3|%acCDLqJH&Cz;Wq zmFF211CCEeVwd$JRySCPyw`AVo-fIZqEZPN374v9H6{t~e9Bv${Ek!4@FzH7yV6W+2wA=W zHAZH(PK&KTerYV)LzgsL;uP$ORYx4705vh0rDBl+l6W~~B&j8K)LOOi^SLS+Bd^VC zbz|{H!aEW*d8JsgV~+_J`@M%gzh~iE89370nJk3Cr>I>Rg`w{uF<%fniosU2*YEw zCyLCf5zmBJ8?#lenQJD&HfEsmo5Sjg1_RV2rj19V$6l4i8O@4&w_?driF7NX9CKgS z4|~$=ThSa$ibVPIZ?B6I$6biu>)|3A9MC-%sPfEo!8oxKsgg#y7vX%IDzykiTuF)5 z9j$%Dy<}4Nf!PdI%lF=E4JKW_>2_8AmvQN%mIa#&Z=Z6op{!L(?vYMfOmtfd1Rxe< zJ*^Pgq^)Dp{+s@?$uVSEi^yqoiMTBjRo^&_HTX?K8Gzg72BJq9^w_aP$=kP)iz3eK zxi{)h=z&|e-=L}vv^X>UK76utAoi0^%!W5|ix>DRVTIc@NzprAd`JFtT;EdsBJfK3u0;$gPBdS zHQ%9WL1QnFX2;S2`aXD*Dt{X|hjy+>Q4p{;ma%@yl z6|_v+P=hisKtOlWN9Y;Os!*E5h+}61(PNwH6V#u~!>r^2EPK0rgs&zNB)Y}$0OY&s z+OE^wScUuc&8{Yv7Q(H4LLx|1h?u@qjnu-?%zm~-lZLl)PpZOrlc@f)K=4a#T&YJa zCp+U)&#!Z-5KT&6m>TI(u3T9T5G1bxM{06nbAjYD^LfUeK^$|EcIu0g0Q=o0X7PTK zQKT*{+!>g{%7?~*HOzKM%G{%TBX2U96Ti@|IRvnKnxAeEcNfcJiLjrr^mQUD6>bA>A&!@5YNIutJh#(9tc8|=b(KCFT(@#x&Vva%7VNZidQ(Q^Z z{!;r7D?e}P8yn*aL-iSx#*Ebl@b8J@=NiS`ApSGhq4hYQQ=Icgf-h7Z?(Ms2%Xg}> z0n{2RWmfeuY#hB0*~;tT3u{55J>z?^aYsM0CjVR# z{@d>SctIqW4!54A79E5%)8Cacj-p8mRFVk)On%-sXtd=>o;N7Z5B+&6Vlz}8l%b^I z!zOSW8g1;X@cuWwK3vXt_q$Y7&+Z4#6RCBd7S~bTF5Wxt)YK`g;QA9TmWfch zc(m8KByRNT=2tJVuVg7QRy(;ahK9xuTP8-gu*w%?lH+If7gC(A4|lsXy0T$+F5A`w z5F&uP|0swrhGasx`k3r)V#<_g@@B>Odz1ysi!xQ*L9T)8{=!O2Cxi#Yjmer6*DkVZ z0~*r^W5}u#MT?x9XK>yIYOB6?)%dR_9;jU5l!~b!$wnS3b<7WnEaL4A%r}lNXyoOs zK}uD=4}q>(NZCWmE16+onr*2cl*U!5JtHk(Cb4J?bp`@k*) z<7}KNr{+fz`73LJtnJ92NyQ)1PHcfjUdJ-GzziiXHt!ZC>LN`aiWHXkUPBJMDBLXL z5u=svfY}h<@%rhpAHr(np#;PFerTRvHBP_Il2hitM$VNeue~?M4e*8au`IV=L^C5F z#I+qc+UFmppm+h4u(14D8tal0INEdUW5lS7VKnIEt7Pa#Igwos*&m6IAb5*f`H-jw zC~^tK`N5PQH1+qdK?oz$k25A1Sc4w6PDZDf&2C8t%k(OngvIbm(u4{qoHT+$`>r7J zqVaP27&VuhD|O!$ck@z9*F2IDiAL%J2%ayyMR8}n|J+pkAvSUIO(8d2v$~gw)_<_F}nGhkTJ4@wB2a^~h6hM~f3?LKi9mLwuIZ`!4YohGryh zy@SdGpS!Lr*OhBp{W}!Ne$=!ydB0uoFwSX zFfnh9RKUrBx-7*~l)T_iP$#geYd8h39vO{Uvz-IQzbLVzSdb^DfjLG30+-C@D5O*~SZxG*UL_NGbpyLvGoxZu%CNx2nwQ#dr z{j07_9F3s8WcvL8AJz*oc{vrj#oe>d6#woKY9kLt-8;YnCfgiL*5THS2kmtnV{r#1 zpTwynh&iB*JdZgm-;_=ZJ^fxp4ZJ#f`_TC|oFdRXkcb`K!k=;i$~RjAxW zJPw>(SwX_mcAfT0dnMEAcmrcoQ@JTbB}GkNlkNkOL9%kBF7i#84l zs}mYaOI$beKa5|}cQtP%@-E4T%7@XpX=WE(As>5j?^M#|bD&^Rl$2e(8Uw?Xy-#PG zbaA;B6ca8?*w6l|-#w~0l19>+ttln!A*Y%-U{B%7THX|~OjytLX+t5=?qJdA=iOL4 z(9!b>!|P>3hu>wx4pxRpQHuC1%t<+7L@$f!kzFbcK?$W<}(i7-wBuP&)y`zqh9*lW#>gfR(VHJZc<&CW81vkhE3 zuc4taN!OJZ*{qMmJRK^4oSTN=dtRi%c%zevB3aS$TUi7~q){gQj9 z0K(R`ypQJBs5LS-)xs=gYL;Bd+iPTjVIVjUh{SVB{_;ZCJjjC>T-vkA4e?)$iz!G z)bHK`9j4>oj@a~Irl4#mLnASgT{US;e_=Ur{-L6`mR2Q#Tw!#Vp}Sh$S!1J%*uuNy zmsBqyxkElDGVzh~+390?-~-jk-0@-fQ%}XKt zBJt5SnA`44Ga2mxz@fvBy7aMhP${}^FlyTHEluRMUImp9V16MoBENXmFth>gTR(KV z`Oa=}hYq01 zoaCLUaO}cdmkv$=6nJwc3QugqZc{CP7Ohk;P-OblcY9_!-XpPeEF7n1fKM>F=~UE0 zJ;D@w7r~VcF^AK2^Lo}JcZx~D0JCYWnUE_KgxZ(o3!8gOsfo6j1BX)+1fwt}PDWMj zl}GbF--Iu1U7%tJ_7b!ppf7QgPjy>i&mktqx4YnFmx6%5?5&x|bR802)th0<9ctEx zT;p4bXWM_=`T-a|af=(zRJ7I)G5awH6rS|gxx*c912l1d%*durryG+s(+&Sr4k7C+9W6j1N1eXnZKaesOG)tK>M9Nm!P^t#~&sm{RfF z7ih+!kKHoq9}&;Dg==}J=mYche8PDo2KhpUC=Mdl-jT({zNWA1^+9{79@=IKle`^> z0-jd}hnT>l3bl5F#jbI8P&u%m2H!HL+Txz|5ctT`9Ou5}IK7o61=zle`3J0{2kX6@*b>A%Dw{$c;8B>R0oZIztY6sCd|NX{|m6IZ)oEfGHxf~ z72z(FM1%x82&}3aH+3|_=`RAiJ8?U>Hh(zDRq}vI(!tAS6>1A#E)$|vk)BF)p)pIQ zyHUcCJd%*?@x>amz@Gr0CSx2+CqMM{Y>l+NrQ_;OnVEfFnP#w$_L#&zqhAt$^w;j` zf_=8J?6FZ;wk8I539LDZObET##b@x&wU|+Lak2X>nukC<)2=ilZaa9(C1+T_Gru@x ziCW|4$AqQG>i516p4@4=bg0X@K#ohXcj`PeY3LGe|0jw7e88yQ9e|BFCBep9%#59y zrHAD^mCftM@+K2xm|0(po!WR~Q^+(sV(C;ggBPWWb`s}ewnlv{IaKI!d*&J%zl4@MLA4l#lF?g%1@HqMs zV5LsqKr=>p!+U^K_=Kz$Fk=)v9ez(fZl#p-15&L-NKIEy5Suz1lQe?*R_B7aM2|3k znKm{BDYex7+*LQ8-DXQ&kCC+yIH+Z3#1fdg7YK;7>5M0@M09+jd)kC2Q@C)@1E4Z} zI{Oz8eAqc&J`i>AtE)YcJnHa0sKauWhf)@FT~4)?{2}plVKFyWL*m9%hRFwl)1uf` zEQcGE|Ml|CnNMyjd5d~@EivgVs=6d>6nj(ifG}~p>n^PDuY9HFH6TD$z@AN0Ne@M^xdz!iD*MdN6Kp?7!Z zuk-Q6#bN}kZj>G^LUzVJ&s2hgJh$kpPTWmi1eoKp@FSGvhoCmp?kl(Lz$*`dSMInf zGxV44Jr2}6xbxSR120v9nA&2wJG?O8ZagLDh)O1Ce&iZq4nW$7BqQ#=F$3H#TWDpl z?X-Ma7Vl+(kyta4D$_{zofbDfuXb2$c5WF0D-NAyJ!4(mK`4fAwp zQB~1C78E2Bxf7?$b@=*)HN-pSG@^5;N4+l7;-~@B*EL`c;F%i^20#x&Q#$*h=VjsM zblCfHoBbDukvRO_`Bk9pXB3~wmkTzGIzV?B`P{uW`WER6$oJWPu>ZJa?eM)#@@vpU zod_!eHD;$QUL=;oF18PRSNNFscVyyFi^9J>Jka*AXBZ^_%c2VqX7i3W;+o=OQsb2q znF5Kp9Xs(9^`evFS#5WHuOAM4vs1028bce&OAYKge)Wfsa5S50kp7vgT;qAkeCAx$ zhdyv`n*-sKdu@aQ$MHF!`1G&dz+~iRsg@gzMB+W_r}?U{-=NB=5_RuTjEvJQWIz}| zqvXUgIJ#4~q?KJxaV~cBGIw){Yg*NS?YYOJ24*HRbJsnB$R=a0OS13EEmuEg{~e;lz6f;8Og~U-%nMtLuh{ELH^yNJ(~C#@ zaRLOrVpXaek2tNhk4#@29T~<2BsN>n)Vn}vKx=z)n9zk#E2DQW>zjgSuWuF0Bd@Of zditoTsK#{{Q5`s_{>~J6$#3!n3oT=ztTJBmm6Wn`N%fZ>OKd+0A@|uX?b)kZRabVM zZ#$FJR!96iM;a0_*S4fm+5Rn=v*!*=fu6`VAHoByI zJ9#&N8aIS^0br2j?u8ByJCRdi%TI%DRpmPro67eZ!VarQ$Nn86hFb*of}Ps{j1J0N za^?`Azp1R$Ab4x)pYdC{IkSwUHX}I)eP`3vg7kxeCTzUQp-w7~Tbi<#&pp`HM z4O)3_O+!)ruFh{lkLL%0>@7+t@w!7FZ82Q?bbc2uX#PS@7$HdfjG<<3UTRC#0sUua zuqJZF=*(K!;zN($*UlMSlOEARwIrq01po`dO+0N=*Pq|zM z>Co4dvfSFl=!A6qgyu6g4hAf<%5y!ch}-%rUuI&#DmD7unb=ZNeCw6TRiOgiB_6J{ z`E1$wDbv@X#~KAsyuL|z*V2bi+-E+tN<|u{+u$R@I34ou*E7-_`ilI-8BaoS z2T46=V#wAG&9&dXp-MK`63O|Lz_P5O6QxP#8~LJ~4J{G_J=zIhpt}=>`_|6kE(Dsc z5-#Lr&@UbAqgNyxp?Yw$TJAHE3A^iCX}7!%USJJzS5tcu&iNDN5(o`-QlL*!ljzQL zJ$XKw4nk?BbPq^wIULCsyo)ph+?jl(C2!?J6%pG_FHcDPY9H7Vjd$(|yqCu7V3t2{ zVXV72bR?dM|3ZCz%cjVKD#z{dR70vRPr^zkE>xI6-qcmbw71{|bM!>OOfeo$do`CA z(FilV@4xYSv{`1MEN`yx>ETI930D9GePvQywdFC^7O$sBC&m*5+jM*)Z&un6W=LHW zH(W-KLrzJhmP!M~7UvN3769j>>fC*S2gQjVP#iOpZPK zWYnWA%#TCwq^WgQ7Zh<2Dt4YgwR8KJKLii>p5OzC{{*P1jIpdb4M z$*yPuM@q(in{khOjlxP|vs%UyO)BJI(_f2=XwXVOi3htEN$F4%8VG@(ndGoy8s3z* zWfx#nOx9MY(r`lV`9pFM%LurEe`hu`EfB24TblpIeOnmZugTWI@FKob=2_>+h0FWC+ z+nYbJ7qc@Et3IFaUGRsoO8Yr9rR`<}-?R#w6#t5?G|u;Kth$|ZsIO7&wEZ`677?pU zI^V>Z4NAP)pZ9&jvhWmSwWYdxi>AIR#PIcAqD7cN0nwMk`9=;th|9Im^fL%s?E{h~ zIc-JU6Ag}xAX1(#)X!f?&=Ps;JDC0J!kp;5>y4-aNeY?K6vRapB6#L*_%@W}-o$ZZ5=|ah0%Jyq>L9s;))Tt^%-uO~|zj_eqfD zlRE|D*%%_(R3*k?==B|hFm+6erO+P6OEC(wlG`;C=&yVU4R>{X2+{h>&-jTB=}L*N z@5RzQc9-jq^dShGR(@c9WmLk{67<0AnEIipJ`tE%q4b&cl%(_YE1Oei)?AnkJ-S1f zRPhJ|;JNc{pi?rPms>E|wq@wTFa(XJ?|q3%RC@A@2WHFY;1zETDOOdpbnlBnXfyyu zV#v-eJdqsUbsPx7K@1a))KlG_zfWfhdJ0%?@&mJP07Rlr@6f)Sa53*tpc&0zd3OBx zErkT)U10&SAToy-C5>Ljl#=^UNKn_IaomR}%$zZ1%+KxpU4PuGQJaQ89;-aI^#|2$ zVev$oJAI3`5ZTH&{T)QZB{>&B63M*L3+DM|mX|IY`?ZfXc1AOv zNj36Ax|+FuSuUnP+1z0qdY|X0q>)5fZRhu72XyL;McGq6eJcLR@DmCT)5z;Ri0g26 z%tT)AL7Wv`_Tewze7gF$?3$`u`-8$|;!WFk+qiTYRnHSSBvqOa)=mMYpx*7%(-vlC z^_&cNUS6CGp_YR21CnNffp5ZAf+NY*wCM!z!04y0Gj{L2p8bObkkz0Zy^N>z%-?P) zI?|KPROHko(H*NNb4%Lssg6+6$DV4v*TNyX!Abon92x|7`>pYZ!jf+_%^t$~A8DWX z4{$&Se%Ur=zLawi%5~`xTC|9kHOsW`2j-CV?~hl{%*mMnT`!p9iZGRg=j_kTNs5|T ze}6hDJr2a_67hpK$05KIkU|)-k4h?BA`JXNd7rs^dyT0`1XA>f(;jPrm`F(>HILR~ z#@nv5wIt3kWAe{g0P>T&H6%4djXM)pZB6;R2xppS6 zfOiKi+A8ITOL;-}>tUcf;;DyJ4?btzVy|VgkBYwMMWMm_Lij($=&z!(cmW zp;gIcDn6Hsq1YmOb#b38Ka6?JI%f?UVVR`7K~f#N8@*0XScELrGaeX4qNNg=UVhuZ z6ud_P2%fllQV?TXHYHtEQOe{-F%066afH)Ong1aKOut%{uFBasg zj&pdALtsl9UjmU}QG?5K<6foanv!~q?Z#xV!;PE?fx34|J}UEp<%BFT9{1&Q2HiZP)b(=fInS_y{bxaQ1#bK5>2e1FQ+aNz1xq|{GK|4acf;g7 ziBR7yL8eNA?rs6JjU@#4IF-JN%|2}!V+@s){=_oLzCC3Jvv=F);iP+jS41KdDPH=X@#Gr%UnSs_Z;xtEut-lYvSk+`zE1&0h1ZOnG={@S4;CmLdU&u$uR67{xl5&RW6QXU?$|8-n27M_aW;6+)i^z zGX4+@iPkS-Ep;xPzQemK(E?^bMX}RT-=ExC@|c2Ol$|Jz{*Y0ZCZK zBV=>6F|kZYu{r9e?zoh_Ev;%F0BaHxCU~2Vw9p#gg1V$h?Da#w7$zYL!fr8>kFbaa z?gFMq)xC|SaEVCKPE@N{JnAz5CeQR`x@{Ss17+0Rf|~#cA+YpoV$$@(%1S#`KHZ@v z72-6t`V$uEeWBtWNJ0`2EYBiIQQ9Uw`dhD4X+Jo**cyrnj^r*%6gwiMe*vuOP2l*o z2d^$ziYhI&X=4uoxzcOx*Xp=`l#`k9g&>Op3il5Q9!K8ZytztFU1Sc-P)&{d!xNyV z=XxPNLr>ojX79It$l1yxst8nZ<>$q<=H^xXMG*b`;*qv?8df^~Og!XBbrjxwT{jDm zj;~q>`clS+N<8hk0MhmOWfKrOQ>^xHl_nUIx^w{OBovfH_>5b;auM>SPrcQ^*~RvzLX7?}icrrFl--(T} zq;waKBoOC`{IhqEKvVD-ZnE)edn-&@3CLH0YN`?0_>_>p#Et z9hQeL)?7Nt$g;wF-gyRItw? z@1o(Axk?Bv^ps=S287wA9#6$Z^8;HRXg6Xvt13nFEf-|Jm5C&(7g!%E4IntW0Iu?D zzU=c!2l)rQw;g8hcMSaSnU-0dQxi1bcE{-t#mwP z;Rt02sjq_JbqP_gvZtv@*yB5({$uP^qt~N1+nki6WF8j3EUB+Qk`UDj9F3nMa^mJU zr*c!dhO~B1v_HskPsl5T!BCM}1RUOkM@FS^T^%9h29Q3KC9Tqcq=!_-^0%s(+W@)Q z<4Gw`EN{~MG7!y*hT zMol_ECCKf~h^iqEm0$(3YR4i;gq^2k8KgP!*8Wq+HbIO6*D4pGcV$4s54I{C@dgWr zfo3B6ghGPA7?*A$A4zI&rnQJzpTz)Z1SsTAv?#l`K!Yi)R;(Gt;BypsxWYr54MkM9 zWalPJ379(tKi|PunfMg=Nq75w@91GI2WI$guOEc}ANqDu`w?P2iZs3%vPyd33mz~F zB`5CEdCC`(n>xzsWe8A@3ZS?DgnCbu6j!fU)+k7IO#oKpF2pi;yz^I+qtKs3nc80f z8<^XWB@Bm+gu`K<>uYZ9K9?7ni8f|UUvsPSzoEfor}=hLMA-Fw z5>n@3cJ}~GYa5NSzW}gO;@`*dz0xU-7;QyYJ7U8sQqo6*j`9YVOJTN4UX=osR5#Cd z@^>|d2(2btq~1aJ*1}lnM|VIBER#JsQ0`RDQS-rlfDR#NvWq&p0**)a zQK>ICgRBT*DHha-_v(kz0e0jN0J^yf7rD-Al+=n5?05n1T?M$r{R}0bAMn*zfoL5b zq-I-yPAr6(BY=K-c4i&-br2$+aqlQwS_8G4%Rna91QBSeqB!w|1&uB1 zi;Llh#eMXNQwsP!%}Bu{Gq|M6d2!JQM9vW{lNU$ZJej9ZFTlk1Z@; z-r@aCta21AFfu);p9xu?fmhO5ccNf4`CCLbjfs%eaTdm---DOksLDbX_f*A|u&+M* zEeIj73t*D%rYwD&}fn3v78k@HQ;0oFeiC{I@llpL^;eZB{C5v1f9Euo^4+D zGz2LNDD48WjSCIx)FpV*qr z6m!0gO^S-|aR&iM1z`850KegBb@3>(%$oI3dg&!3KG=_j2U8s8I7l$PN{qm-Oq8(6 zthD`(JRNvkI7&*5$BQ5>Zv{JK9^-IA2TW%9N&KnQyc2;EnU!^kf$5gs8D=VGyM-%2 zhm7iC{Ax2?&`MkaSJtRdB0&PUaXl!qKw+f9Uxe-M2fn+>H4n>j>)!41Zcb=?D(I(K zLAg;eLWM<}Ur@jtqxf6*M*xpbS;Y0-2s4RD4E6T~_W$iA^o-5&xHNwV6kNDDk_o$| z9U2dObV3;r)wdS%A?1&$VrMahnNWOJW;Rfp3|gxJ@#G8`Ob#7BLkJ~toNrNZ}m6{X(X{_y~_6SE6~p@wX95fXf3$^%?v3PgNrIjiJyTzyav7f zsFI@f<107(3KSTlF^Iim-0?<&B4YK>=B=c2^zR63J^w%i`dhf`KwL5^Ue7=L5!}O_ z!Q&)!wP4}7=Rx!%#}tQ-um|XJQhIC#L3G?C_8MYUuHPR-FkxwF^g|M;K0tiU=LY9lf?{{chQ@-g|IPgC1w&`fJwgVMCgi+r(yBR#ad z)PMh)O95fVUaw67E|io5MtJ!KzBgfqWByS1&25C-K?*LhzAC@_xruzQ`D`=oLhrcq zZ}=c8V_t#f4*ziSEU@Vz{M9sRT?{|FPqF#sy}uuw)>AKPVh%3=(TDtMb zr|aYfb>I#;-*r0<>n5Or&R}e175M*uBwGh3hA_7;Cr2J59RW^Gq?r;{*XPp<{ko?h zCIlxENeILK|KBGGLrMwn=UFYlExku_AgVb|EqKqcZB1^r-a7*I|qT z(I5iRH~;VUy+?pjrIm}^aC#Qucq!JE9;a?S!m<2rV5*RyEBy=oSYvz!&mqf`p+@_bk=BumD6C4*3& zYtZO1fnK}G=HKN}w6_w7uEN6Tqy)EN_xf#c`$I?Hhcx?dg6XfWg|kpJ)NLQ|#hl<) z0y?+iPhK*t2bA#Sw-Cz4z5X*e7A_gEE2+!bziHt|iHL5$1EUKnS(Lgb04HmVs6vAL ziN`+wxkVS%$6+1ESWqVYUrwmtI}EgCpG4|X!n-FCOqiwzsXzF_s3XvZwdnBv_gKAK zLy-3}^hE!?j+fPMqDef~T2{1LP|k@;tOhxoaX0C4-DVTeVK@EvN`nCcm((`w@(n)Z zFgS&zaEq{I5M+qIy_=iSnXntiQERn8eVFY3zgcR-Dd}znMUj9kg=5ND-xBQVF3z7?xN!znN@>l-K`vKwFS$ z^`0T19?dO%IG?Y>=Ju%pzahlsFeWVVA!s~uinfrgmZ8LIYJCsXa(KY{%OFuE@h4q> z_LiN9Y8zcA`_a6QOK`MQi$5LF_Y70M_zVX!7$Io36-~+8Xw{g;)RmYd&Oy zH_EW+!I9zmYSEqF64V*(@#=!@x@E4Ztcsd(GEzlEMmEtZm(E>kj#zR% z9KBPfW#HioG)Jb5q3Z%zs#Mn<|GW`{B%FVDVg2t!M#4L1MlRZcd-sMg2k%v7@?dLY zHfRwd$d9##*)yI|K!;>CtN?0^8S?KZ;akxUJ1-pk56w>=!#~8eU^#SnGj?3l;Z5$w zGi+g3U(7JJ()7zb461z5vV3g2bf;}KBluXc@f*;O6%jV0jC6}1mbQ{JH-5B>drbRt zSNO+j(!)zk@l~(Iq?#^aBO9Kx(9TX8DFteqoZ?yE1qNJ15*+iJv}5~WOU#7e?XOF| z__KiOQS4SQOyuomZ-~$3v-}$amsY}rBXmKYZMVl0mOl@^0Z#aw^7@vxVT?#oF$t4y z-a@`_XkAC(BllsZhU&V}HkuMzKi>?igux|zDl>EJTesQn@ z!#1WbBH;g)V-h0>Up`3>01oiHa4rKp1X;ujg7jRkTIj!~S%W7shZVtGkpx|de>dMt z4R-I%gUgu=a1sx~XAC?V_-3`-tya)CDy*L(*dcW^U~<_9&C ze&6rT9f`(u$@4m35A|PHF|MDci?_iWPTg3@m50B0Aq*#??j&c5^AP6G;Uv5hLNm66 zWdym{auhv>PEbT)I8(5_E>QK80Fs?{=h&Z}8AZh=|0(4?@a*^Dbx!x4C%Q{3Hb)rW z#G|j$A|8RkDeyQg1rV>KeFygD=A0+EumYSgCH0^EW%vn?dIF`}g%#J-jIT*|R+gRQZ1WO~&Hvl*8;t#Miv!A#7 z2+eX!o>F@g&|ZXsb-495*=`yba|R9RnB^%!`DSPs4n>IQ5+ADq!$ zcBehVcG+1OL^F{d?nO=S@%w^o&A9s1XO!#%{-O2Bdz?F*Ud2=pcRVP9XHQ)LEnBi#yr4yQo#+}<2U zbmbyqHiYN5Db-c*C~EdeZ`&+_uCgg30P<%eb*HVY8_w6bW`JHQEFx(nOVU#2p95Zk zilJsU-Y-(%qFKOB92NdFeHLzNqx!x$^k7l~UZZUsu#R=f2AN8ZgFc`ZYE~hSl#n2!KJ*r8P*A;#l1W0 z;EI6n0%?i8f2`I!VYp}kuJX#fV4<{dx$%jld*rE%9gev7J}1yCda;K9L~;>};;ub4 zUjc8vz?lq9nDy?-KR!$m9N56~GM(43ep3XvCkBHGv9P4t{d{0|E;89_y#v}P9Pj#M zwp|BKs9b{K6-%1$1*8z`w0iTp^|_dVE?Z%5UO7B@JA8w1D#)@>Wh*t2j_`t`wYylL^+9=GF~ey;K+ zbXxr4Vcgutb-N8kEx9c5`a}V-reoNg_pL3zKLDL<8;hv3V5bNfu(eK=>Y^mLvq0l}ny{`?s-cG?k@qO^w~jPemOrqe5n-b;{7aVqpc;YtL4 z%j>tn1p+F^4^_ubt^4|gkN;Xj(!&o-sELzP%M@1tQqt)!lpxsAc<%+VkHVkrIzou2 ze{u=i#jhsAD96t~a639tTGFK9{OMh^k54aov?uH5>!pqMC%iMJntDM(ISW%}+Q8+E zLf?c2?%PUL!qeb6Rp?4jsktt&Zd6@+OOr;yqt1HwU;ASli{{~xnpOia!Y z+alS2X@~lQpE6(M1Vn012%erS=Vg{n;SKYP+qPF5dh8NEe|)>^p-?Md1AP-Z$hVMF zWU@RyoEA8Rj?>jMo6?CC4=}igkikXIv@Zn2TO_@)yL1=pouBfUnt?*r?>mkclYjCL z7C;gvHtqYpY$b;TgkN;B$7{!OEv?M;^YCcWFEa3k3rn(S-B|mn<|8LLWW`>W9k|Dv zF@@V_-}qnIcOkDxKy%4=r?0VxvvAX78y7VtEGyi9_Vc}b12IBfz-qH~4i2KczF3Iz z)@^I-LqK}2q9}{X6+tEqU)>UDmrtUS(r>b%2mtH%Yh{yRPRL(G{Pe^=yOHl-h`WN7 zRO52{>^Yls>Y44ySt^l3LFeiZ3Ks-H`|cwkK6E?!w{m^h(&E#k$!HAA!Nn}4Xuhzb z{kgC;7nvRSxr0-0Ho5);*BDE%&DDy;sTyNPOg5Jdd*40toiAqHT4x_rJERn9bcAOQ zk94h7L&C^{CX0*cuj5@fK=5djNF7dOoT=8Wb@*KtF-Y=GYy|VdQl0 z&1b)XVAvjlVH9?$AH}-&S2gjnY;<&mT4Ui~$DbxYhcL0$7dqe>zi;F@-1O+uwmkh$ zFJAcxhTFW#J}C6#Z%vXNzQN&L);{mNGTLb%1X_b=NJ9Q9eFzGOd!VJ7f3-8@4H*pK z{=VluZib#=g}0CY4oKErSB2Fpm5c z`{@}o^NP)xhvpd6atuD{+r9Q$amJ&_qxP)i!a^JTIVwB^& zByEm_NShYfXYw)?dNDhCPV1f4xE4PeO3aJYfV1U4e{FgQ?%d@6)no>^@-k5SbyRhzNZf?|SB&#m6cG5>t9rW$yG{rdF# zX*wv&ErB2x?YJ}G)tmuKN#2q3*Zl-=+2<-UN_w*gG5Rh~|H&fa{TMMp;2|(q4@G1i z)_`=!R?`pVHy7tHeq$?}DzlQM5B+tS7uUk=C&-*^#YEVj%z=ktk%3Gs6p{d&hIr;V zTs@61*t;3bl!Q*)u9{0uZF2EHE1`+{pD!MOFYfsFiw`i82FqK8F}kD)4-2moTjs4b zkD}}-WE403Y{|bRBKp0wf?4nm~vJ1KUU)KS!e-0g#e$Xpt|v_D1<6sZ52(+4&LNQe?j{bD3cy$tjFVX zR-sj4HbKuQUx(_zAdlK~WGdf2ytmPSkuWXG(3g|*-ZgB66e+csVN#h*`Z9>`EsN%o z96L7db+WJ9b+jGU} zeI630#|vh@^9=pE!ml;XI^OY~MeN zKQ|<3QeS&8j^Q*jh#TcOjVgbqL6UgTEuXI3NqtgbPt-DyusBB&) zB0Y)4TiT~(ioTzAq>>YUo$I!(x7f5*fSyOJZy@Ba0w3*TNl`Y1^p@(Ya(a|B4h18E z`Qa-}f$N6Q(Q6eM!uNj+A?cwEBbWzp_5!=J)af<}CNPmo&ASB3kn8!HU+Bfj&Q1#q z+0sFpUY1*l=7HXfSL*K~%uCJpkivirv`>=H%W&pNdXq48w1E99fd z8(&Pozzkh}RYx@STjCq-aMS*N75}?zSMKjQ{9g9>faKr_TLnpW2zGw_JU3lgSwCz`uL$C_5E`(9#vk z@^$EI7-Wlh2!+HWBlk*^jVb>{7BP6u&T0DHw50v5{I+P>k(B=QB0N8q~Jo8B%>ZWx9^H?V9mFR%CP$rtbCfI@)GT~P(N z$(#SZ$(|x!)9*CaeGX{)>K6fa+8mBI%w1bgGNuUcO6KO;6YxKVC2t+mIT6NAeH_D~ zVU>~8$|gvD9i8#GIg$)H0mL+WE_J8yS{^RkPM8&put!+VRyba-k^H*5e#+; zj1OgLPC85yu!c>{6CR^2gIl+2&O8pu z8V5%TpM%VyF^FM^0s@rsQVb6Q4;I6Q@K{N}|m9BHF{}U!-1yx?gK4GHKwHIP4Rn6 zj_FVv0uFT+ojXN6`vteRk7@p%|J-q)ez=Un*!6_lE}hn@j5N1LtmEOl_VMuPHp6QB z^>)Id9Ju!?djJAo)jxqR6o7CcK>mc{0(*+r$C|_9Hg|5|QmU)Ww!K%9BE$&o7n?!+7{L#DdVQEtKQuLaWpOu~4@uBsHEXG18dQ0cKH0~G?kOH(x zJC|;SZ5^r-=+*j1gfra`0C&3=r~5(3tnQ~LHTz(>I(K876NX$hR(@COaoiSx-eE?=e7NEyKxGy{#bf5|lkWrpScheHzoXy+2LE*d z>WocH@ke+6-B^Ie-KB8#z0ERVjLXU0a<`(`{K}&Cy3&j^*N< z6P&Q*-JFWAq#bq*zH{x?vQ2)s21SlNFr<4M%xH%p!g3wqiw+C0D!Kr7&L>9mgc4p$ z5sol}!?!TkR-SrEDGG;rVa6Xpb9i{>I z&*uB(r_9_(hd|j>LN*`7TUdU{6dL9XAD!&ClUPsPd;eqeAkYz={(pSEcRba9|38k7 zoI}>JBjY$$RwN@bj&?i6>hZ}E)3!iO9+FUK9|5@%vp1x)BCx7=D;_)Q@lay z^A%kxYk7iSzbC8xP66rNBOd+kh?{ERVPb&PB71yt?g)y^c*2L0)vPLWdf`jrkxw>N z0{_-mXgyc}T!}KVi!4V;3s+Gw3ZeBo8TZb1l5J6TSHrxg>|HiKO;dY}ZWi25IwSOf zfc>Q8d8eC(57nm_=$#6QEVwp5V(UAk5eNuA)69G&z(`T@-;Rr)@+ao&=+oZ6<%kq{ zhi%>xpsk?$xi7|0b|GQ*jh3iM`TUn83~r_)TT9|T3#rI!Ov~5ebct+e9r5{%*gHx; z@ewx>%BZk+c@#NO+x~N+QeYIXQ;>(h;3rqD+lT99-aMX`S1c?)2@rRcaOlK2m%jeqPA~Pvmy|0;!&@cjtG5+5t z+**(FeJYO$X*yFR}_?YKPyKNn;NufWuuIB8iuKGS$LcHkZe&e0yE+ zPERj$UVcum&<*Jhgx`rjKrM66s?1)0^P%n2hX)QFKZyu-qHTDdYr_qycdICnd4G%B zNsh(k%zqy+wmh{Jx`t3*xD;gB+q<`PtfJF^pUN@hP)NMNPruyQcx;2#M(?*RPC$G6 zS2ZeX6Wg0+Qnxnx+EBh1PuFFcv#%fbn^15}B5Fz=87z3Ty0 z?Cda?l*nhW)V<0%G4_1}P9r;v6Zm&d+3QQ-DUgHU2Tz?p6hPbmDS(rLo`$?zAb3zAreLKyv@OYyPoa}kSBcT7)(n%nS zat9qTzALAPtl)wf(}d6!SG)nJCJ_!u7qGjLPlQ~4Rt(|TY0wpmr($q-D%4rOLE?MB z*AX*W*Ec+`Qywpw{XMA4OA$_i9lraZ40UiRyMTJ@LL8FeTMg0Xz3)Db{~b9cB7g`3 z_G;Dkc);fru?l!w07%RC-AORTrq46^e%!6sq)9bZYUV$3%yvW!*PaXfOJ zidt*B=T=_i>Qhjg>or_j5`N@(U6Zyc8J6ryBc{9QZ%GwFAxF#N?JrB!C z)4(Nv`a&Bp5y%M;cC}ry9-2Fu#CNb993Z^Dt6qNe^5p*g?6i6^Gv@?h;%5~o_ntTo z>>g7(aE6Y@H?ov2{?HP-YG9YQaLrxhF%t`=RZeayjp)hWr5Q)HOPgec8T^ja^BQV#i4@cJC6Bio+VWv8>C-0c755fSCRkJovI00K?m18>j3$!2PT<%H>;hE z^l?@t{)hspv7$&G`LND}TOpq~ow4{+%=D*R(2$*8?ITHD#^`~^_`YGLyyO?^R^`vI zVwZJ%G@mZ2s6?g`7)J^WidoTj`Wk$G5vpYFtZ7W1wos@Ph#MA#uU%Vu(?`P?Hy(QN z2!_P_Yv(K#TD$*V8VP?V1X_&nJ!a3H#&2;q#W~tY1!YvyMPN1Q9Wqr|)Sk*dC&}+E z5PKP3`^XPHwx)1>th0)j-m(>J18{frnF&k2ve)J8=zw1h(}_TcwecJj1Q5sPxmS||5~ zuWq!?Q_PX6aF_{c<&#**1&g;Y{e#QA!nDRyhF@Q!bVAls7ALMUX1_g)aaicR-B+E> zeVAXR1hU9$g4F9)_V(VH;3gVrq|Z(?;O07C)HY=*bfu>pAKz$z8E?B|^vbk4vt~(4 zS*B}F{pTkxej4NpG4lBXl-4RIJ0?E9&a`Uz{lfzpUQM~PHhepuf22%J2Y+-Aq>87G*L<7yi<@?}P_+*!J{iRK!@Ro7Uhy4gUTny9i-bH~^GBAFTUA}eEHEh z12{CQ2c;U1|3pePB&5s2-ppYBHmjP(l|7ZfQsT3)HUq!8M4WUB=M+|h>C3oMi)zA? zG$DNAL80}@khYB=IQ@RERC$N}*{=4R(-9iE6BT2l>U)PlV0-#g9fUM$HCMPxg#X&Q z{W5qHXj?k6m#!_p9dvoNs|q)SF8yU(MjO4M&K~!*eV|97@J+(Dnuu(b4~E3E!L5g| zJpHK=kxRwbW_Erf@#Cf8?A)2%z441}7GCf5 z=Rdff)mVKdZ_iBjg}8DbR8`PCb80kiT(Virkf3hTNq71z(-a==+Qk;A{pLkPX0Kg2%72*nq1 z&q9Pb)Y=YNIT^u`&7u!XEvlVeY& zmBjR>Sx!7&l5f}A=ky2fC`j3nDfldDuXyJlaY<3!som#n3(hQpbvL3K)^rZQ0(ksd8H zWY{h@B=!gB0As!)3{Qm=_&h}r^XI^4m*kxTGNMnYI6i{vx#V!w`PXFlU@_Rk1@P~E z-_Tt`ss_bm@d#Z2&WF^M!A5FvcfvT0?Hv4*H+p83QF$ z-e;w$RTsh5GXOExN})Txub#I*#}EKUhg43aja^!SUr@Nz3hF837XZU2{?Rg#M>kpZ zM~N)uH{#;yIl>d#$>vTcipi686Z^gu&+sLI&es0a{ge*Z45WxRX;WYt6Wg&UVf?nd zIB}F-Lyyh?;9La{?DwTk6}^aTfmg2|;>V$;OWWetzo~xfx~D^*8p|>__j}j@$2>n7 z7sNDjGa+*9!>8ADyt{vXo6HZLmVAo7oyp&c&8|h&puNqqb81_EVFNlWAiN4NV@Z>IN#*3gQ_#!lK z8R8+57qeu~#X$h>pNi@} zH|6I_jIrfg=fpa5*tjR%FK!fp+KuIQ9Eo>nh340(z8pJM*eTMf(%oIjZW>}CTf_s$y`IxxOU zV;!N$;U8I;)oWjF*f`pBnhj=#cdhPkvi0KSy`MRIgQraF{ zhFzMy;d4g*ywNgs4>)S8A&xdg!-ogwDoo0SneZiuM&>v_h8smgYYfO`MUnL7SykvJ z$7|0s+k96;7t@_*|wayEfx5wtmI1CTH#k2aaYO;?T>#%?!TZwS|~?}ffI!bLMs zZ**j8o_neF`hx|1%D&H?+?potGlbNDMTu-F@@d9I1%*>Q?57@>Yflteg8e_w9$>5D zNjoiGkw^NVK>7&HX7xkm?KxSvaJw4E)VoVB6ORn^RPbWzQvP1}59Y}m(54;a|GR>3 zRWK&71R=h+suprWj6tA(zoj^3zMUpf7?JB-d;LF(v%yF>TK|Ij{y?RlZ>)w-nY&#O zeVIJy1Skt}*!G=6$z;9mSx!8lm3Wql@9A`CX+h7|2QE1hH|?|l6Sy3;b42K50b z2VjnnUEV**`s0RTC`ir%Of%s(P+RKcaE|L7H1hkn%T*sHY{HNujMWp&4>-&bb39F$ zn#FC>&ShG?w#U=gxGx{P@s~>-)VYTj_Zk z;9nR&t92cjOj>WDQbJ6k+nr2CTdp=Ps!SVsu%@pbTW>UE5V}iRqz}FY5gcrOlXz(2 zK^R`-+UH0GMhEM!5zY;6#*eOb4CkxN|JY`OG%kM+fyYh1e|)Olt^JP{U@85($B+|D zT_+>GVk&|x`mKFKPD32#IS@fds_0p!NAra#inV9ly6EUo0pJd+va)V%07x_33gnVd zvw|sx0+@8c?{CZMCbYG#4y|n{1_39k`75-YgozA%7m%OAI(4_|*k9yB-Hi%u0cZ|fAAbXhQbi?Ar+mJ9rvgdZCq@}t zBV#H{!q3-f4S0;RbBN*uY*e+1064am!a22oHfBqlW!V$>YJ*ooTW9K-8%UC`@e$T& z{AnU#r4afK@pm&nRNVUcw=MxjNR8o4Rda{57=%Nh)vJ&=GWIX}ZAdXp=8h5yO&kxi zWScjNyyKEi8hg6n+Jve0v^gSW_xks@Ol`}G03$Vv;+O<37Ef4Xh7*wDt#G!#OsAJ2 zdkz~kA>b*go5T}l(fVyrysW98v#hiCT9kLXNSR zdzHTV-Di`da@NLt;!i%j$#n2CtzO+O6K(+PL|k$lL3h;Fy9EL7d_{U?5vVU9mLGIz zN+}B8C2i)pzu~fAf>(p5HdT@c07{FXkvCoYD%u^r2^EXB14pWw>5o{I2fcRqO*ekz zb`|kN09vCD4hxCQ?~supylPD7&a9~Wv3Ec^6QC$A4Y`OQvOaZBS1L)R{HD0b`br~4 z&+wJ&YAg__Z1>%72BL1PWbC$ReZg5;y;AGq&xy#D{R;RHiQ+MVE5q_nTpB*J4l6ZE zGEZzCD`!doW>Qz6XU&9}9+YkT5ra62HGraYsFLxI4BliZQRjfE&S?G8@{f&+V>K~n z7Ugh;(qLy#H?b{tJ zCa9=tfds?~`SLkWPtCF@EBR~Q*Krw9yi%aoY-Iw$+-_&&4p8+>D}mAj41L+kA|Seq zuWl%_FCt(GA80wGBp~SD!V4l!Z7zvoPC*4~KH&KeA?(N;5%m2XkyNN|al$W*Vc`}@ z;eqO&X_1>*yk)o31dsA%8PDbEHpl1FiESFvE#t*O}cb&-ypK`iAK(PeuqHZ z9>|S);BP+)fA$CM(Tq7b9zHd6c-<0_Z?6+8--j*FRd1r1f+?3DX@R*QOEdDihg0uO zF-?J<-?~wP{~UfK0gAHG)=aI}jxTUL!RExfM|F$B|Mb_D*6X-@wLW@tCG^n6&T-9K zyeG6)>P2QY^owA{uALIXK8%CyStDoZkyTkbm{jai_!hzAp|_*5MZrq;)Lia{(x&8Z zGpi6sFyA}yVc*|+1tkmV8=6rmjF{lmS7Z;X2j(xNPfD)tud#l-4b0S9mv-21CAr9? zL)s0O6RDFgju~bjmUY&0`-u&;$n@*i!sykV;h5AxyZ7dtXq-}EON z@Y1Ph=)RuXrE(hxi1}MS1|jD^Zw8_k2&Dqi>@E0@m?ms0=ijjx>8@#?BlfLAceM_U z51`ngg{tsL;CJq;*g>9Z(>?FHnf)Jk{eEo?i_bi;d}7-}!|^gw%tEU(0pr7M-?(k- zI?DUt)Y5Q#z#U?vP0Pl~`E+yU-^MnYvcBOS7G4&H{!LU+ptx4}bMV=W^aC*asW&DM+rsUq!>u3=`KB!zx*;q!)4@1>XogmbF~@A9$Ce! z+hHzga*yKXeFyNVvoBs>socCI9)*t~8r_vk1z6f(|KqfLyE^9WXx?4C$xgTK$W@ru^@<=A-zr+PHbU;E%T|0X6Lb$*KOACu$&}e7w$2uk}0c zn)9nv((M}WiNnb!w(o?(qi#u2B+Wn;1o6z zv@i#6+oT?KZ68ziFCzZ>QPbC@FMx?$0H@qNnDI0=M(X?u<$NaXPDJ-eu#(AoYP)AG zi2A<|;yWUV3hkr=Z;byHU;T4S!C-QEWn9c5Z1h`KoC!l0d#~ z`R>SVH&6uNpj-Oq0{{L~g+MW!6%OhrS&;b%@wV*~D~Hu{G>2bF3}JhBxq8}iuY3{v z05++0Vgp}ff`xt&j$BiFhD|&!gk_RyF4@!)aVeAV&J4BKF6Q zZ_M}1DNKQa@HF%^f~zS%0S~~rrsmy+(-t)(G+|Ek?;&V=oR{EssyD0YTn&Q9PxVGB$$*L)&MfGu_cSm?}~r$?!R0l3`8 ztXW?DcQ$ecF>2iPf7NdP2sC|VB5pf`*)+_hmxj}knXMjMn;lf}eyoZV99Srv;Bg~I zNi8#$Sf``A3!7UTKMJg|GrsvdWcUE zVM2%?L8Jadx_@fuv5nxW{y;md{F*C1CLS;HrtdrsOG3_}8wZ#_v`p|gz|aU1E&nku z+~T{;;pE!=>qP+oeeKC0O<+w|1;_BhF9h-TOmgiZRH>{fHAS$; z8rm8`=s9j8FgmhrMB1r$)Ph)f;GVd0LCXBgb4L|MK`6K@XLJ33zf>Uv3NFREXsWb# zm4=tyD?9ZlUBbReaj}ZHxy#jV1HzblFv!Pdc;Ip5?KetccJomjS}i{g%R-7DbN%l5 z)XqfhFGGosjf$S8OLMe&d2W1)feRx(bW!-98Dp}}1qy`I!fhJ=`#snh zQRqchb-xty z@$Z|d5CNd3K0JL*W2!&ug0;+AY&(B^ z)joU@J*A6%QDhxegkbGD37i5p(_3t&s~a#B(uE~wSwi>XrTz73G=bdQu6Bw_8?jTZY%ou8RR^8$44*=z<4%H;x>`v?-iuFB$B??e+ z{BG8u&fTJMo?C-u+KuNxy9FpY`_>lpA@i_rHB?nK<)C)pR=dx1#rW3WuYjLGg?@@?olo95sA`gZ{1k@ZehcxQ zHy`*WC~{jXH#c=|zw>kOsa@sdFGY^0V3B)3M98ZUP3g;uTCs^SE}qJ+Nr2&UJntjh zq8f0ULQb;yVdlw8L@40yz4)Cg2=XAcd;T64{ zo$L2Px&0QzN;bl_>FJQ(|V# zT0&E6WXtZqz{e3kJ+{7%Dgec-7_GJU!wcX#6qc&Kg(4gAo2o~CXI4o%|0e4}JL*l& z3GSf|bwAw@*x4s?_D< z{guDuFN3TnE)~u^0}ST|uZB8dWE47lQSi8#uPig&NXQkK&->gLQP#C_qEq*6?!KCBc;T4KC8)dJ{8L6Hgs$ORx}S20VyPL{K~t%>yZ-TB*smY@iVZ-H zeuQOWm4oaem(mk95FYsbWU`%JspNg*GpuP$H~uW-;zW$?nx4>82j}{FI3)4l0FB{) z5K!Y;nthla(Dypz-O$Y?xqxU*yT?6MeH@jLqt4_FDwX1PiWKNx)QjHcsQWSUIMI|d zUKVJQDo46mcu7SduHw{XuCxH%krR*p5qRMeD`F-+c9cb_A(_Ot6W!n4kA`u9^cF{x~aVA?OhLyu%$k(v%{g7e934 zbPJ+oC$?hXfhak#VI8lhfz{9O_8IcEIkcO=etT7>6s8vWu)Uy=fcbR3dnw0P$cyMYDSbPVVHVB_2-BGDfsftpJ5bSk9=Wo0ijI}kzZj) zwWaL&S8i!+D+fCtEV!b>rvzeaVx~PvT^!Q(<7a%`0ie5fA5h-)LI2-Avc^akmI-ep zALUumG0=>kYrRHU2|8*u!tvmzr^};W=99t+ydhs@Zk4?MoIRhe^w#)qWn!WHDpL1> z#hFU=`VUw6Dkcd=`!BL z{uTOzVG!;`0>crjV11Kw)(#BI6k_5Q9~y0ye#{d{1Ngv+=Ak4DXH(Jp*0_ zDcNMzt5=?7PT-c)w*L7JA~Dm#Wgy7d@#jI(lmdH&FU;w@hUu9l`vofNN|;X4Bk*4y zW?TS(=An&X6VJ>iL7jvYoOYbGVdMnzf~t=qpXVmV53a*(9Mm@@{nC=v(`TM@*avA$ z#1+Q3ti4(;IbuR;L z^j+WOq5_$76(Vv7t1pA{E_AjliA{w?0(p3j9KaG>POS;%5%D3(7f$=)Q+%m(m@xu0 zz6xs4>>lLUjpN6)areXu9m%Mv`S8jzTUl?|W28L)uEL45SKVuu{?@Y0R`}!)nP=Fo z)!L^JElV}i0)(1*g|oJ^AqAyERxYx&G8lrhU7&}3sVoMYoMkV4If(>~Q^k}UAb$w@ zuK^|ZfCBQZ_qpHWq%4ft1d8Zk7SUFVik9d1Q^mB;9V2hI85tjfE1C$;xX3i0PzeIu zU05>j0&k}Nj_i`OsUd-?A68SE8R}O|Q5qvAV_C#Jn+B?cZYcd8qx^v@<75HN{qC^x z9h>akuqfPIQtQ>Uk>+{J3Zek-bTtI;O6hulv783 z!x{M~MHSfGJ|wxLoooi-Vqs<|;`ijk9 zJQ|K6mWPAS7Bpbnd8gV#A;L#qh)NrWqK?xewkC2<1Z8GMhf^vZ18_41l`@46_GJ15 zO!Y}b9`zBzZiF;wAW7vzL_8r4?!y1+;Om$>`%+G%sN148mp!{p`av%NPdyQPhQHs< z1pljfrAut;c_+MbJz(2?Zd?J;Sd~6gs?UbsRq{EL*@yellQv9+tyE6_sc7@i*}pY$ z8O3xS#_p!_cO|E5OKBr?POvXPfWU`f4?;ZrAF>b;{?TC}??>>LC#D=qQMaaIGUU(V z*KLEy-jd0yLj(+og|*PP;3EAZL)vcho5hpOS1w&j^sS4W|KOW3JZpyEcw1ZVlmM+< z5A299f?+?b{UDz>@(!-bMu5So5T*60=rTBjO6TNq0JH>}wFk(i z5dRl!R*Iq2Zhuop5XP!kU)%jYheEq3bNO)$o^(y7UY_Cn&V7yBTH|ldH=TM-TgJP5 z?B+2K%U#HC(3B+%EF;^+i+OZy4GCQ!h&Od+!*&Ws8WGskzu|&@TlhV? z2z%UpE_O<^%!{3t|q^BfRYe;-(3@jTDoVw}{c?IufCWCKSW4&Z(wHuzukPbvL ztaBp4gJH12seD3LP}V*9Ar#CW!DN-$;RPtpAM>Mm$pB#=D^8Kyq*ra2rik~56A+f^ zkQ}{#eG5j{uXqZRcc6#)Nh$=;)5bVgb@?bI2W!z*;E3^QB}->?(DL3Mpmk`%dq!TB zl4}sdVF9tcu$BDsO#lRi_v1o@ph3d?RU^K#N3<@6S?RrKH_H9NsX1Xk+^5u7nfwBX zr{ydN;dO7gB8>r=yJam01qCps=6>yRy3_nN>K@TH~>$}g?=>G+d| z1NM4MFPLU6A=W_5sx%99;%1W}-%cojy3=Gcw%TN_>C$h}UsWJH(@u=Y9LE_=AEMVC zf-B;W2*QAS+_toN+ji@_^pnUGWZg}dGS8Uu&1=JN`V`9&4k=rL4f#vsF(#j{(~0HK z2(6u0k5-MAi$`*HpwG1w+t1xx!`yl8nh~+poT@XW1~7$^Oy)~(d!80@nZ_%1mw~QY zz`-I$uWsu=*)wRO%t0(X<-wFVEs0_jnroaTj?+e9aP(gUDY^g=W=R%L{{JJm-$ zMD5$Ug3?YSn3A(k(@#v<6YGu#ZX=aa2-c!yFbx;0KcaBuWI-~>P988F%U(bWG)hbg zO~2nbO8Br=%%Xbso36(1QrPSH&@~g>gHZ9n(I{r?EcM{q`^0{s9rt1y%;yxzy(&Lg z<=YKiSm@+2CUOAPGEr@g->TeEBLifnOp>JQ8m0ti!-RWuO;OO47n4L{Y#I;*QT6B7 zqe3ce8#L5;f?O!! zbSk$@4_iJK1&qM_r|jR994$?7P|8)?ogD7v&W}%zD853vwyo1HiO7Z6Nf#EWobc(9 zs;R3#0JT4G;Wr#C55v#%%QZuQAHYQiZAEjM_~Fa zoqXJb|G4$xLpwQx6nK@$NA~MCPfr{u z(&jmIrC9SdRk$~6=&ID&LY+j^)oRE`48~_*^ggR)Em%07p0|jzbd#N&-M>bM<7y_G zf4&`UAw?l|C{5Z ze=D(nS6qW`!npNwqTIQctcZ2#uK8n3%`rwvrZ#cRtO@XECo7jg+}dSAAv^hnJysOe z$A{MIw9}m#qPSY?_Lh(XdFgqF5jokPn@)x!(c!HDQX(U4GJ++kuLxZQ=Nehe zLikqJ_~R#IxrdOZ$dQqf^aeaBhrc=kwfUEb!F+(eMB37Hz75bhqOq&^v^LrQv3m#^E zG#`kqb<&09-t!=-%(EiXg>$&cVia#t_;+xfPzEZhup@Y0DUvBiInew5UE@X`h)r>g zmPEe>NXS+bd%bR>0N6bA zaPJV4Tgpl9o*J{1#?O#;c~aqNKK}wuQcCQg%A>qh7v;?it1?ed=`i*gEn0ft#FjR`Z>LB`91=yJW3<@M;{th zHn2h~gva>ZWh9{9S}y2UUNuwVhwiHoJ^gLpI?q+uHvQ!+XoyvR`hR>W6wSzY`DU|R zXCq9Czo$lVyP>cp24Hx>$kn${+pYx8C>@25u>`b#aR)P$5BdrQbRB=IzrfPUR!`Iq zo=a5tQQDh0l-7A?LDaW1=(Q+%aadp;l=*mKcSQHa*T;rSE?kMFa@w-9DTwx_SNd;;Kz_hooIyzd}+CV|^BK&h)-;sUaV4qTk{t zx3SRL>m5(%dwjwH2Io~?O41_Eg)=98=eV5))iN#H;UGo|*Lg*VX!+x#2Wt)UCbg8I zU!Cv0ZPHw^HTCDW)$+vOkpR*E^-=tjdv;D45&8E(M#8zB)tL*PG2(Ay_?Rv*rSG4a zN93VbLw_vZ*C$1cTpxb+gD-NGhCF8aVp=ZvLoH-=OPmRkYb z_Ik**Juu*hKDH9^(o;b9o4QomXdLxm1}fM=Rq6ggp%)or5FxYh$4tjfOeNc|;)WE& z-rs~FtQWGNy}SHyNs>gCA5!1 zzo;O}Y8)cv&Ygg%5nR(5Se{NT>LQtfRX|}YSr|!a_=%bJ5h4t>{9IAicq32x8U_jU zUvghpznp9i5d!-!8MbSD*PK3JX9CY@TBxHX(Lnvm=4SyKM&6TbtLL#T!;_<>4nf9% zj__ZA{tx6eNf2>0QDIy?u!~~qj9QgBQ&9iJXn`;C4$DJ+u^Kbh0i1zjkd55UgjsBh zj^ZeUSD#coNXk_Aqs`IK@p%A!sJM@4p*rdG$IV3l&diwt=F}rJLGte3ib2=W3s8md zXQbC@y^2avK&WohS!Pws$JR4He+^Xyf6kAd2ZL+i)V!PDOC(KlZ$NNYz9|hve1(T+ zhOC2*S3z%8B#hLuGq8LE$@1#GOeNjC3F@k$(=XHZe`{S#kt%d7eEziB??=d0ac+Mc zoJDW?E~8~v2?M{}BdBjtQ6D_}2WF#Npt5|_0`>b5VPtd3S0Vby_1t{a6$!5ALq~YO z5EN-8U@6Sn#LoWYhhUN!wW7ZK2Xv%sQ4{VVf-?~fb<~WP`NygMgtoIp{PTm5Ra4&n zv{w4*5)anvkPRYN(+XdR8Nj`-zRfG}h1lK<`UME#KXt}N{4pAwb z?L44?&Z%hKA3D9jRJO`xZvbn-6R@?LiupV0#DUqNcP46*FufRNxW=*wQQl{_%aDqrN*Oqn{6<*7ozk zVYU^~xr9DMC&AO)=Aytas8d z_Qu`Wq?Wggop1B~+@dQkJsXuuz?2;hI>DtaymtWUSB1GY@JKlJglHF}z@+d{J^TIR zk#rX`7GV}y_ZT1`@Q#ysj}3d$T`eTui&-@qg5G@D;Ds->E$vQ(CD2OZL->el^i8QV zqu-O+2xHD-w(0{459zsNJ4D{7H${vTo`_3`OyQ-oSA#y!d z-acj;>aDfoB>bhGPi5yPxak9?m)){SfAb{*{t z+PRr+`J2EU?S6u#dNt5b#3ZT%ZgUP8Mpd6))8^^GX6R8X=vyuE)8=s9r>lHV*Lt7w zu|EU5*1ilR6A4pKxH6jI+a1w{vFuEd7jHCo{_9qyELY4;SfTrxK041j3ST`ONl$o1 zwLzt!1t`X?gEYJZ;B#8~me6Gr5QyJ0KOCWyoG_hO+cLATT6_ft@b_x*;3(PJ${(Bd zjb49m<**x7xH$aubw2sBW`Fyo)(C1RDWO*z{^Y>hy9H?8Sx zh4@GSPHq*R8IV)x0Xid)nNO=Pxx?%mG zqtt~^r}>z3<&$V{($LX!$%yTRaWPZ_1~jQcH#NZ`x<5rx`sVbN5N>WNaIPd8{}e59 z-HN%1s`}cwS4u@bsYgfit-7rle{uPEyxU52a%Z}GP~Nk|U!M96T|0ZnV_t z8_jJVw3GVz{%Tx5qja$?UHSg-Wk1+;^c%vbz*+@AK;p!~(Pdoq9VW@Yh%t;Gkt)7S z$;g2Q(WM4dkDYJhr+MMQbUm|#W5LYzV4?LH@RMaI`Z=4Hgzgnq&_Gk=f=oCP>lohK z+)j~{RX=YEPzYeCXJgoj&KWACG{B*I;85bI+&%Gqyl|ai(Rovf_IA_3OZ!;dbe&I& zDkBNSw{tNC9PM9Il-(h2b>O}Up9ANi&i+Y#^i_>gkr*@Lt0&sE)#D>uue|`ex&`ub zU1!-PcrQr&zF!8#Kyt-Ly_=Y#Mjx)ZpZ*{oC>zhaO+ca*{LTT`BFzrqjswsc)_n47 zohk;#Q17EFsl2Gq3>Z)B5n$1)j_s>J;suM4pCY#zd*}|glk;xn_d$Vcfp3Axqta|k znC%CN^*sqx_e5#?ZSdDUIkqa(6!-LLUfx7koEe+F`|Yp9*<%IUtBq zz)#1g5V4VHjd#|QXoKGo%xz6#z?Zh}ZTL0&xCxu9K2-&?V&F=a1ayqI`MDjQ@9VKn z3Hb{7&v9N9HMj^?Bth{KBgGpu*wt?#Jn!YNBQr}ou+aFFYXWc?YqJGB z4}9yN*jgKd*}Y7d)ZAv#ZD=T4O5Vm3+P&>2=rw46ZLUm=Ni!>~%W+*) zLPl*W8O+(4h2t{{VKrgDt{l_CA`{jeQ;17TClabk#NX5>42UJRc6smaofL^0s z4mecClL5cE0EUWQD+eGh1EA0MuBp3ed_L&U>n@->+~&dLm=GLA6~#CA9a+$|36bu< z&^Xq0CO76TPqu2BRGC=$4ykOOvCmtmGBHw@x*H*)>*lt#E!ftvJ*G!QMy?Ix*s4MF zwT+}v9?dKRkHDV6G*~3R1onM)w|-)KtRBLnZ(chIVPdi35N_=oi}5C(TVL)dKVSAg=)E^de&2#`ju2B~3MrIgrnGm6_e8#W6pQ03qu}^6 zGk&dn^^u5LruH#kx|fhEa41!T>Gv9mgP9~6q}%p>obx679S^Y2s>xh!}=&Lb}fBE^6g1ozsn$(aA30LE&JfTp!d zsZ&15D{!c|V1rt~;Vr~_o+=p!3F581>rJ9=kCvQyf@rP+{;%(-Z;&@IsV#0*YG^^c zd&DWSFHABtUn8#;+f)F=LTM9DCz*GdTkUSY{AMP|>M@2tmbVsSHw?~D)itB3ylw4+ zR_#a&{Losf`@{Xr;#uJVtpW6^;8gW_jjM!eqIJhQ7Gknl#Vucn{N_(KD?yEXMyW-Y z@AJtvrH-V-S`>Z`B{pRL9mAt_Q z>6Nz?#{&ewk7s8*4dUBVN`nN5kb7hR$NfCW&DrNwkddFr05>=7`Gn%(CV9U?@uoUy z2;iUR)}jNPk?_~&L~|W{w-9w*nN2~$pBXsbug(+U_70Yx3k`A7HN`^#X1zIRJN%Yc zljxhsJy;zBoe`#N&4y0RZJ!2OZJ65rzz%wohcJ64h$}zu7kFPoy$BG^$?O4r*o7v9 zfIA(K%T&tm*e1VM<?GR!z|k1&`61hxsDK<&-%+uBk4xn^Y=%CvF7-L8bG#gi{u0muF|(rJ2TO)v&)G?=G_9i|zGIXP1#=vOb zkqK&>!`w$0) zd`SMuCyBELSpn0n7fXoP(2GxIAFaNMge*jBvSWQ^DOJk4rEg@uUtNPf^Cgt?UxuB> zhC;T#`mM{kal@yCf?u0NVNUgEI_p~18({esH{JkC(LAkk6oi?O#N$b&>x$&=zJ->G zm0ptLJ@|JDUKBh?67Db1rn7-)<4Q9+J$J6hFY;TD&oo^QxEl0p+V&f4>+O}UrYB&v z1koC+ssk@X2`6CF{9zt?=QNq{RECV_9;4v@J}W^g&YuESULB*gn$-X(M(Ct=35}01 zsj^MDx=qn7`kST@eX@(dR-#vlGI+iy9sd5TCe0+RU3WHo(i8|ZLBrqGW0CI#S1F7< zyx)S6Rdgyv$l}E|qx6R9b(R=CxE}F~B0}LAZj_k6Y0;>E(xTIsQOM8@gt6(|g|Z@I zLO&tdX5_XR6M@L1Lgt_3^l^K~ONh8Sv(TAk=oal;p)R90mejXu+MeiRs~E{KXrwSv z)O2gJuEcfoMx-w(ORs^?EBeDY!EbB5e>^AGDVKCG9*Pr#{SkgoRan!bzIxXaI1NBc??dJr4PjdpIwsqjC|59)G>jUx(} zlvX6mSLFx(zk}%=mEcOOM*!#T?GDTVkNB;SL!Y9!-=$b#c-5G$2ZRG5WPvGPJLnzu zZc^R$8vHH>%Z5A#tWR{6>ug8t%MA>#KI~f9cy#~yU_S?8G9X7J#?bc|BWud5_7N%v z-Dltvz1UP0^V|t=Td%)g5>r$_$-&7j`Cc1@UfKm*G_;*L?b$jPj?xEVM}wCD0V{h6 z>-YG(k6Ixju`v&T39?;9C861ZtZm3!`!`bmgYh(cidH!^4c1rLBvE`p)B?d}Qb@Lg zet%+QzkId`W(rvft(q)Y4X^bR=|E=t;rf(8Woif*S$g+*7ZriFH_+)5I;nMsTk8RU z7S>Ng0BJng&EtJHvXw1a1pDK9~^77b|wgtO=I=kLO_Hi&V30ZB0O^`Mhl_$5TDOgdN_^k zjiAVGE(s205p~!*_lTM|4w&tx22g!-yHg>B(bAs=i<4QOEcqM~u>UtlPl30U%= zJMhN5Ib+wvbxvhUaoF5ehw6a_q7oX;_|M_d3e?XzL}d+J!?DY9!DO6_WyoiB(+E*W zfIKdQbEibBMVpd_Q|_Y`GEi}vpXcDgS$eGG?y4xy^BuSVZ6(yRLqDxbEUm2ioP zKqK%4NKf$Dxr@zB|1!lMu@@eE=Ybk0Wq+mAa2lN0e9XvL`ltc>wIGbVvsxUZa zA`2^y`o>3Vny)~oXEQF|2&w95WH8pvrTZ_a1rBA_Q1yflunqE{8uN_TXO4Q?0IWk0 zpFl+o`_)x0+*?q5mxci`$DaXPt@s$x`sld`&T|qGJ(Y=94{D1(dLdXy-&rn?SI|iU zu@UT#D8Fi?l&6g0?|X|R%fTFSsxK@SE93$QadDbPX&C_Q`VY+S87@^qK)Ct^Bx${Q zDg4tbF87Isr&s2_!m7=iu#xC>b6WmK{4^ER2)lA(#hvcNBkUJEH6d8c_lVM^FE*jUrv(Y#>?qnpJ~l+^m?iN;z)rHfdBd9EuSh9xUV;Fi>p|AOvt zComoOz2~EO8vBF}=UXq{DtbQbizd`@#l49x5=qD$N)d-?t`{9!nMlB@kXP#F7@l3( zv7e&ipmoG`2+k=Yw^<522xYV$25_=j9};%^xv!m)MJEpuhbzG`QvPd>>jy+ znMf`m&$NuH-9ors2q$z{zYxRE6j7bRvgGPGq(tToUDdcHh$&$1I6R@&aR;>gKUB!m z4fK9JpHoR|PSRQ>@VARKIvypA^)vdvIKZcB7uDU?h?(*07C6h(6}QW&7~5X~V9DF`TAmuPoF7ci1INl!KK1l%&^zWv=`_r6ZLW7<>yR%Enw4)g0E z9ZF;~S5%|xbK+oA@I@|_pz?Jcf;V1#S84TazMcSjnq4c1`P38JQ*j*9Il_gYGwB9G z{+1gF{{bS{4y9FXJb-DNh-_nHi5pITGozjK>nv;>3A3LEfwG0GC<2Xoz$2)b_-RfszFE<%bUyX+m2kVs^Y z6e2~|eFt~jC_bf+ZdMuoK@FS*;o4EF^4aR$7Hw^3&fNJ_O4q++r9OT>#t2IU#u zo(!7bG8+uP?|ujttkDnaW|)Q3tM`N4!Id?bf?cjI?2Sf6@q>L5>(A7ZGbEyK19K`S z?Sk{LZvF2$9>+tru8{0l(H!u2C&|ARO&>bS7z51dx6rWm6;=Z7b2BOA{C)CKRfu|i z1N`dm5Y@beXdww5;AYj42)--=Z-LJKz4T3caQ6x7f&Ph0^xh|NXCkz{!HA&g6PYUX z^?hBQCVXPQzIDI8>7G)2QACVKZ1TK_1x-hR{-R-()lbr1(%?WyPs;fgk$m2huHa4}`*gd1^}VSQ^FMQ&f9$rxboGF@$wh917fqJD+ez zWxabSYY$NHj)|HoTK-UyjE}%$e|ygtwSI%+Orwv zK}=JvEy{%2zu!V4li$_)* zVVG&a3HYeTsjvkMGgMTk67vxtF&j2>MMJLYJKk|7bKDASnz0JXS%0JOegWZIS= zO7#F%WJR`Ty`_#JeYsx204i2v@I*o!oIaLn#C1#+v3}-+i^y2c*njeMie{3G2hT_>RhSvHW3d!Zh`eQ9H?$%p=XiH{ss<13EcD)r~8x zsfs;EE{vjSP3Z?U&6OCM3jp}z#86g}1RE<>?mUcXXyc_^11^97befeb9G9r!R46g4 zAV-9<<3Qhauf}?>o$Yni3a24NvAB%P>|Yqb18>^3z|8*F`>TlUPxIb_)z{q3&cG$_ z$-T_+OW5?TUfj{KFp&bjBB?q*vX|iz`>2ldexql9Hgbs|^y&Ar5xW<7KHu5jVzfsx z1`!90W^X9mL1eD@%iT)O1b8e1n@^ts!w3LB4p7- zKK>oOP#Ki&Y9A|sEwR#Z?WO6;qnFqEOZ#uWZ0MSw8A{*0-SDn2PnTvt zMoCRZPKVHS*aXEgr_aYjOYR?*^5P+(@F`S_Vzx%lSmKq${Q$O6DNJj_Q{CnmR*tM^ zq!~xYd3)oyHtOl)l@b|*td-`cL)$nq!u+2u5LVtO;mJTnoB>;j`3mBPi~Q;UC3Y&;gqgt zF&6@u(X#o9p4b26Gj{mj9t8xGh>tNfXocQl!>gPq@9q%V3uXeLDbX-KxiD!NmmXf& zbE^!E$BsXK6E6OD`o3<}lcKMYbA!cJJ*#ErChWJLeYikTjqLwU`kA0cpgKO_0_z`Jn+QVgQPj{mItMgygxZhhN^& zis%4qAoM_^(_Kx%!X_nKm$IGG7uc=W2w2?1yj{ek){D&BzBoBh%Xl&5|r2IF8 z>n0d-W0pcnS%`9~*!>uEAQjDrZTFCF`Dq!ERA!-dU};otVei?o;>!{2tgS$s8WX67 zj)_U248t*AqHjWr$+OEx1<=P=b$>o{vzde}WCz0Jtd3*hyw`f;*hr9PXq-ICN0wMm z)Fd3IkS|2~Z_HaoJX=Yr1jFiWUvgMVJ@3`3+Dkkv zJ{5DR0E$yDNUqrzihRT28OvZW@Fg*#wGml2q!q)Y)`dr3As-&+srd*qbJr~^h#iA9Sf zrBIn-nwS{c?sGEqO+>M)@2J=U36?!DG_!yXh}-5xG*x>aJ}5}XXX0|62*u^0i?-Qm zUN_1QRE*#D3suUMQ+s-*JQutg=jIq=pI4YSlI26EmaJH!db-=3s0gLJs>N|n%i0H6Rj(+$&xVqXlB$w99h=?j;uN}CwuJly(EJE>J!4$)<&Mgucg&aKiA))Y0FE^1iu9Hu9 zrMm*LjGi9D$xVih!_T?=i$JU7LABMzM{4O42KR%-UHaIozk<{%p&2oQ!i!+3RdMN< zeySQ~ zKqiLOn!lpw49od3C@k_OS7i6zBsYr86mas&@zMTbqOyc3AYQc#6(bRaHj_q4 zehcLfV{i9?^QrzRBfwin-#gWRy8JB6M-S^~dQ1_W@g5^zf{7h${1I^AXc01)bfkY% z9=i7Lz_*=&V=xna3-`Wbdkkz+T|p{P2C<}yEoN>U_x#&w?mlS+)GBX~X;0@kS7ev4T&JUKV8~5sDJXqj7(~xiEcC+#c6HFvM z$Mcq)8MKuo>H>>ss)T zD$aFDoI9S}yv<<7x|vWZILwzqcv1q-?8*akrRaeWK~hw#fxI&Fi8NXPPFR&asu0C! zkI-he!NW>gX6jd8v6)G>0_)3W<>g(?VN2+SD~OyA?m zfzUX5RO}mbEfCG(RbDEVf}M< zGHn)S9GAoCZ7a!t;i(b((=u*+sFPZSz=C<&ywb3{CjKe95|&cyL*1Vi&J|0v|AkvVsU8N1pgy!JIbiP1*`hY9;CI)p(jH zQ|QOny@8%;9P2(l=<^l4dQ}gV{tnyC+q8nnQz}}qu7M1r0nehHYjITl8MVctz9T!P zjW%#&V&LuVYf=r=j6qmS8q0(qKUj!pB9T9%1tYz6+^ku=`$w|jW&Kv9<1d5;%I48c z5H!?Ue%q~In91JA!q0v4U_Q3sR8;c9P5lBI*8Lvale;0e8vk?Dy{p=C zVkwfyXEsSpXeg{0=GJ4kKfM>VBp}HoTsvgv3lS^`$BfH0H%@%~v+fvD`0k7llF0QRm`ow)+83l#t-2#K;t618s4>S36hsAjtX(Ao2IZoK1Xd zzO)b^8C=oxi|QMI<2$D~SA_EY1z@iN3PL)L2->TBI4%mMkU@F+Cb`u|PRAitgzS@V zr;&@N!z14z; zeV)<@qCP^(WR=VVg@=g8H!Vki{U5R9*CK@i)2}oLGo%d6e(c*0Kg1~f% zFl$bun^yoo|E)K3jOAd3Eiz;sFJY83yLW%6Vj*KvcRPkSuKx~MP^dn zqsF{OoI_q#9oBE~S}^<$w%cPcwPuKTV2=xBin(j13!v$%K}rL@v->HPF_Pyza1l9H z<-8aob0DaV-e%=srq%T?TsUY`4rJEadctY#)DrmG7*Yn?UQn5O1Rw6MZoJ|{HqVYU z0SH@j#uP8P1MJ00XjbU>plF1lk3~4WfY)JSKjO!VNJ$sh)u@%_scV9$AI9j)x>-o8 z(Ki+ODXoRdz~r#fC9M-|%=a$p_rgji0HThfEZ&9Idvco^8dmQ;=jU*wMD<9*ns_p& z6No4g%p5|;++H798)*1jZYPV-1VC)lsn4WVZ-=;zI77oBV*Y9$r84f~Imn`~D2D_g zw>xR|B|+Ry#Qg*?Xb`;AEul%(6zhOTca8Qk(gE$(3C754eIDvq@4d@aLvqK$>8pTm zXHYahj3QXYPG7KYgXKx<4;%ixLBxIVF`_*1G0m7{5vY;XX!^X7k6{x80s!Ixec{A2 z(CP52Bf65s;>jrSt6tnp0=rp_nam#fwBa_70F-seJ~l+sCy$o42d|%lrWrasW0BPIqYc*uF6N(H@3f&Int~VSJ`cl#JSA&KB$A|KTl)b~s=zZ#1Nq3g^A+vr-Lt1{{O;CF7aZPS|4khH zkez?8&blP+z{b5&fTaiFx|=0is51Eh)WT4HcGG{V7Cx%-(BD+E|MQwCR6hf4)$_s$ zs8os|%5cq!LGP5cS{C%HRBsh}i;^@#CsPBwZo^9@(4Fa<+KnslAH`|iVqtHH5z%QbY4JMX>5H9<= z$B;?1==2FcSh!<+k~|}Rd5D$uYy9om>i=`B(JEvB6;?yd?)7!J0wVVagKM1yd~bJg zUq;Vf?G}C~Bd22d>ejrwyVoWFMN5s;8{ygI?>$gucHK=d0+>09xZAIsN@T@xF?HEg zz6d7GFL#c7gG+hjCHwKf0?Y>Jbe-W!@*jJQA3Ae;<0Kj>`X?^IZ<6wr}NQ+d95UOl^9U?jY#V2{BYLlN?&M+3VcO$)`pvbUh<}4Wl7QBwD zyQ^;-?*3Fr8Y~Yp*Swhff9}$<+~+ep8~4XxU#HFcF^Jo>&=;*(rnA%ii?p0bN0v~R zTh5A?(cMbaGqs0|n}TcCO06vbq4{}7fTeT!iAqG}O*_b%vXV=w*tn+2@Cd^UY72$y z4uY6A>Odg1G}QnBz+n+4x-zt4C z_RgUwKaONVW z5Z+S-NQ`gN;)sn z^95TD|Ina)cG`oF6mY4y7KJ$CV`xvCS@*_S)61Ejk??j?nCUTxRFXwm04wc%*XC#C z?r&d^3O!N$-4N1Lh~{q5g%p(txCKd82**JVib)4ZbLD{3jzdttb^)A=7wt8rHc1O* zA2rT0Agfd$7TC+Bc>jR@^?le&_#d9r)J!m#HT{LI^18r4fx$;FaL7FJdmca>5up2* zE&TqkQe;xJl>z2!&*^OaqtLQzYkuGB7bq^7LlCV**s}-x@~`CE0;kG-{7))CQx$zz zjp#ZaS?Bz_C4^+i4Vm*Mg?x`+0p-vEVOyH`FTJU7=;O}6oE=3I7xbq5-N+E1QSG6J zbd*;fa~!+)d0z^ss(r>pydlW>wz0BiwdR}qewWi1d>;3dLg6zo9?SEt5@6}?rJLN?m+;Fyy?`J& zK#TJ@l1aQD$}jC{s&N>5ZGl|Wcon0q^sgC#*Z2hiD&4je`)#84mB&qFMk7LJ@wGv# zcWDVFT>f6YVc`gt`rBv^1Zfuwgc(DPo4y&dA0XW>;l1YHfkPH@<3*`U9XnDe?f%I@ z+9s z&X)jZ*#+<(h`vb4_uol^Z?Kpi{%+jR*^-R*b3JUnnFpIq<&)jJi0jRKx?@Q7`m3Bj z7~@&+AkmWyyts-WkUo5L4FZR|a1`8ra~SWOzpeMLnA?vb9!DU4Ioq> zu`xmCw0J_(Mtj5V?*3$hy`P+i-d{n*7Gwvz2_e1yywPgcUywXP))%e_H(s^6HRr!r zPL#1gsy2%)&3?UzeV#I*G85H8>e|YQPxZW8Rg}0T(zC3K`GdJEbh3$9eORad5?Ub* ziAU${<9K4!Gl|S2Dg8OxEEzllCI7p++$wN&>DaO-sbcr#I`+!u6$H>4i!<~VO+GSQ zh4wToC)#tjXfF_=lmP4wF>mpk&3YIy){iZxq+!hW8v3Lvnv& zhbp3BAnO4vB(+bNhnp+k`_j3pVA6*weCa*to_RGRubv=BaIql-9^Co+W5)^3rPrHc zA4c!bfq?)2YSIrbp#AUQv?2L$hN70ebN~ML3xJQkLC2Sj8J5{u`~b6oitO$UA9jFG zx{kK>uR`?{UeMA>hn&b^m}#4QS_8!(I3Bq`Pq`zMZ3Zh~!3}5pt1UbPalK~_d%ZJ! zR3Hi|SIJXz*jU*Dh=?_D%^_*`=*|`3SqNz$eS+7peYTCi@sSg!q3`|w`>O!j){DHRECXE4>H zBZJ`2vITdQ$D`mV_hI-5s@IzKM!D1$Q1Z*1rbOiZeFAtYE(65!WE%qD+swpAhX1`r z=60l1vH9WPOo#iNnN(Mmph5eQh+zRg>f3b5S6gZK!G)msObSbaI!``lHpw5O58Odj zd83Bgw>p9W{;Q!CHk+|~XyWzuq0b|||Nh-4D5OhAr53Q+M#$7vO?{m9r=?k6Be3O; z5?W&JJ1|o!KfR$i9nl>k=*}yw^M=wNP+}3-xh)O@%6CjtP(QoLmxQW0jMu+hfW?Gg zPiG$e-=o0Ca3QS+t#ah$d2*t$oL$CGkz?iG;1tnHrq|HTA`$zZzX7rjGynS3cg9WK zGBEq^g7t8xZ+y3T{4Y-aue~;Ngj!MQKAc+*J31{h=z-b{C|u^ijKglSHM$a96y87_ zy&If=Qp73A#G_lDqFyKYzwQc;wt?>wRdTbuA_t8m(J>v)P}#ITAd1v{%SNUn5VoBF zY+nN`uFFPD_l4;gxH{T{!*RJVfJy)x+;oIa)-QSux;-{-{Tua1DV0SPAE!`4C_Zwn z)3P5F9|$f;lfj&jcuEnfkqi)Cs#N{&A`+O(ke6sU&?blx1Z)v(l*@S1&VsJMYGB4( zmG!XCm$&QruxU)SGBcq?TaoE&Gb^RaY`Qrh64$Px6~D>pqg}#+V_~^DtXcc>V`}E)^p!qQJuC!>)yv)i`mAy&tJxw& zmamqcdkrotX#u*RPj=%|=tnS+y+1Nx@C#G%oSrm+jOd>kT?k@~2yRu4E}b8?%ZyZ! z$1E8N&T%G=W8%I40D|XI0Hv!z^l8cYgv%P*!8&2}i7^TI9I)c2ws`8pE4{XSD4|g7 zR^U9$sfXc#(Vnx-FRZw++4BFUGd$W8d9yY5%j@NE0fJCc<7#sFV?{zPO#TZEkCEsja>*1D7n7~pe{ z`vUDIL&EY)-jvGPt9i-0huzlOpjYrW{M)LL!@%4Ths;-q%(!0dKQsu1S?U)9;ne>g zWdJHT8j|4a85#p!V{-Hjbj)d=saOE<`F~@%YX0K_ykSgVR3OmWyFl^eqCqH-TP+DD z$*mevi2$lZMk0D`0^!g&Zy2fo7o-nK&S$0H0As3B0B^;Xh-uUnfEN+ty8qwwLtqw# z!}EO}9ry<$LqM$679i=~h?S{7t|P*0IUv&RgTw%a!_heo|%w!ZuA3!lHa?<1# zIof_u7Fv~0{Aq_VTqkZN%w}OW3C9%yU>W^Ds${y+hEt}%r%x;FUxa|t1+Y|Q!SKV` zU$*WNQ2vopT8km(0EI$r8!VGf&Q-g@Un~KVL{%$rM;(5BALt6Cd$fo1?p6UAm*Atj zm$I&6Zji!V}>zOVu?l8KnC{#y1??-4m(-f=5^IN4s_S<`$wY=qtf2ERn~X?rsVj42s_YU@%hrXR`CX zg9JJTmS>M7H3oZNZL8n1rv&?9O89Na02J{QmvSp6Ek#m)sZDnBXLucQZV&;z>pgRo zw!WL~I3R7t{0E3~M5)rj15d8vmlL**f^zn_8aiG6R&gSF{N|2j*==c zFIV9f4+D62Sx)UGt5@@F7^FFURKLLYoAv^wGFO^N$bd3^)6d@p*C$)n5WcGYXH|ih z)=&l?{(-kPXh+7YKblS`&(ras%Ml5sF{jraO5^ahUn`1**$(2(X=#wWAf2c@C(H^?SwKo;jm9}aEr(%m6 z{YZ67j|51a?f`*|xi}L9a3V`tJZ2N=9zDwaFq~R{BS3b!j!B9;)MRucC`mNDS{W+Z zbx+*k7gi&cuCCBe^4KtUD?&}@^(%7YH3EVs=6Bq`8B)?gQw4j<7La)_C~gyj;&^bO zuBsrQw?LL>zvCM06v=LUpr&N$FL1H1&}aY>`h$MsIo^L)&;kd+yU1J4i;%pJtP|+r z6ZPi-ulZqBTb5XEn;xgY+6@lIsGh&cD&P44o~@|SDFJQmHElN1QzW240RDy_5WvxW2_XoJTt(Uob^H&F%Uf3^s= z&G5ebwxP~f9@yu_;N{Y@(V8mlk5Yy1^rQ4=I_onnuZiC*2I{Uo_GwAJ|K#-Hio5BKh=5%dJq%$4=nP`d3YayC5t${Sz#(zn9N;+~pRM+yFumdO4^=8cCodTc= z*5t5AOWnFK;&cuH_boBX_nEws7J#HAV%w2)!ZK>cRO}PK8FT8+R|IS6Esq0kz*m}+ zl}Dkq`#uP7qKauhkr&3wcdG0VuHE)Z`VO!AGMtu{KIw_*Cx+)KnbA61VHNN$Yw^AQ zD-$<|-&MpARKNvs(wKy%7{Z8Nb_PCBDVX?HEdu!KUhxqQri#|~UL{49h(Nl1?j^M` zC^tG|7=N*PNH0}#V(X&a=VyInvaD4Lk69h(*W zX+)nylY&kTa%Z*%L$TAIj=8bTJ2uEDB|Od-I(1`Tql~mse{0%gR?Hc!W!{G9TbBs{$K2l{W^~6RVV*DKV1%e*-&)>bl#O{!2nc@%$oZmIj5!AtzlJfd zI~!|kt-6u`y*7X9nLB@q5jGGPt_FHR=bxV&p9|2N@qfU^>Bwbk?8QC`4J1`8$|Rei z$#WD5tK#;SZ|4r<24kcufPPRTjCt9-V*#ana&h-N*dQ`PU^ZiUOD*3x&h_ypEJB2I zF*f}hoIXB8%Ac8IS&G=0%8WuM`JdM{AfqpjLs2pNrWf3`bVe8!J|?JhKL()_|Fpmx zQ?PXZsC=sQRfjj~0fkDTRC6#EIZWUWVGX0GfE`8erFZ-peZsGkjBu%I zw}Rpa?1|EU^_$Pkv3K7De(%}yrn<{!McBiyu3H}+Me3?E>+PdIZa6_BYC`%5xGIL{ zLmKg%$j>L%6u+Fq%aO=2gS-nX?XJz4;T`Q^hx|h0MZP-`-U)gPTr0=zn~Shdo}+(- z1o1tT!*bcbzJII|fQL_MFGvGR>S{ib;T$2K>}dt&2VR)*hN;w6Br0nDK$u2=(*6%Z z#i6UFA34rLf6RNX@W|6?aLK9Qd0y2t*ol}Y-W1R8uByyRMeRH^xxM*yF*!k``3X!G z-v7e+hUR2J+0z=ck;9g;pd6Cfecx9-;%3L$)~W%eNTD4?iulZCWSpBODP-XLv;H+GXA$BFq!m~3B3K}(?an$ zuBkI+VUHf>Q{(X13>9FOiVXJDXH;BUsY0d}O4=y^iM(@UYwf%6$tqt_7^x17VaMFv zOBxq(uZ*?q{kJA=Myi%cNl_bnhdvtye&v`v-O}u<1IH3#5+Z5jtoDZa!BH~L7t=3Q zx}9Vt6J`AXjPb3Xu)`gr9O`9%Nn+XFiEsor&&;}H!&O_Uo+OC#x}$2o5A!SH^|nZt z|Na{29Wq^V8_qn2&3UQ@`P!NHFj_Lw4!ETV)SJN$S?T$e$TrrDr$Jsf#?`d;*EY~O zLfxs|H8UYc{CNWmiWs^GLdcS{r&-GStRqkEfK7w4a~+7S=Yy#EQ46Q6^(|=H?#HYG z)LiXqGRTyP(BK$8TGy&FKfhs-y;OLldeYyB6_;DoC2p{HnPS8OjYp-kT_SzMWX@B9 zd)oVYpe&I>D(>b#J3a&47aG6NvMPXZtAa+#kaX3jqH@(kd_xS6U9XZLj%K@Eh!oJt z^=#&Mt;ZP`UuKlUY)?3f;#h?pdfP%Z-V7tOxs{=MH2yRult92n9y`BDvTz<$cAWX2nhm?&n(q=b zATgEq`mHX>#r^17bR`mKm%)`Oe(W9XmuLDH%rbtf#|Md5;qaTkRcH=h#!|<$4Vr@IDyI{2^1uDbwJ z&+9Dr5}4`9m)Tfxr#GAKN^np$ngD82dt#Z9w*!EG`fK;5_nK-Hb)eHH>H9X3C6~yT z)dLa)b>3hpl}GdOYaakh1hCe4wcFx8)3ge|)=XQtVxy;bU=Gxe{3=}9mvkLIJPB02 zdnqC#;y|QT?p=Zxl^oXI9i{63Rwa_;jS00v$8k~wGG8eGjF%vpUWnY0S*ON(CunFB zOCmjxv0IA5=|7q8j(?x3f6%vKRSu*5^*}uuaCmBa7(*~*m~|#qgW#hts}h!oWzz_ts+l%JtDe-Loi^q6lho@P#IlVe>2+vuwK#!+5&q*CkguHcekD*P9(L}Lkp3d z>~qsMB!m;aZ^1p2S+f9j27UW=tXbJ z{}`sn4`LFyS{)hpLRkg$e`{pT_7XIT<;4(I1YUcMjTh$!|omxYomL$7O8{_ zq9RJj4dUX60`~4 zXT9E_W`3zy1Oc4=*#&|L46*IUd1a0_ivYpfs@|y#Hd5AxZM;225v+X0YNQn?5H_#L zBe}><;$k#$p<3qr!{;C0-5j0oQQ#NL;PY$(3-^;oFYs|f6TV0AyTz#%Gr5q@jxn?9 zgJgV+I~mjxCD6_|#SGtzA?S8Pr<1A3>{4hw zN{N6gzRZw8JBd?TG6hs-^qw{;r`U(KNf+FJt-6&%39Qo-^~r5{=D44!cRN;sVTd*# z;G~|Oi<~vNBX7#%g{cydzH`VhjGAG!wh$B4cIH0PQi>_|N~o;u?|LK)6cuh6=5#si zw9ZzWt4+H*)aqm0Ro-~okBjwNF6(@et}t@`Y{&HPM-`C^dF~h&?X#{zO$F?ee_q`h z@gkNmg|^gzcGY9ltWYmE<)G zyAe&8rP&dmh>6Z=K%lj)`8g)D(-cdnFS$U{aN(Yt$Fm|dqy8FC$H^T-Ljyea2aWKX z(cUu)Jz1(gwu)=F;P!Yr+wceX%HjL6Brud7;CE0a2@8)YxxhBF{c8a~P#?K$!uE~B zkQnnT=m8tq9c)`=OfVa5OFC=^KSyOT3x*Hn@Azvwwl$85)tZyT>&Bj<-I%#|zgPOy z(?Q@mb$y$KsGWIHI0-4?bcr%Hi|IV)pB}{q;#ps5G{ImneH&^vI&2*J7L3TgG~?%H zvFe1p5vYF`OY~q}gX#KDiZWTo2oJnaXbvm>;fcF`5`-*pb`y6^&=Uz!O9nl9Z&m{Z z%Vv0IBJzTk!r%qPDqT}8$B-#qG|%vQedI#(U*#k9nx;JV4iZFP6%IcBE496vsNRu>$m>oJd>LZZOfTZ!M8ps*MNB`!Ayb~8aV zh^guYOGso(m#GA|CLu#w4r_UQ*1gxAdoLQlXbXv1ICchRGG)YsD|UXL>U{dabHK5O z6w1@mc{PlvXyjae#n3&c6h#P>IT6gtKT7+;447Ixf^8HDZKs+7ZgD|Tx}&M0%9F3_JwA7sezHE(&r7`=6l z7590=P{BqrzD2}u&52&Qto5{CRTlHyPn%gpuD~wD7#(olzK3;PO1v)3t%My{gk^iOc!!1zeAo3XiYsf#bJMxrhXl+R}a+#_To& z%z+-zbGrEm8Ia4#eugPfF|eXq=D^4}k#K4xRn* z7euw|Aza&-B%%ubR^&IfGd7P^R<$JrGh#QIToF1){xewD@YMX#F&3bg-1R*=t@cZf zNF?|g_=uOXovSYBtzhK6e3>Zo4Yg4>@BJD!4w&Sb>X$H~HXpF1QRk)4AXqMJq^>c0 zmuDh!eS%P_p63ebu>zPuY*YFLa@g2-f>95rg2s}gi!TCau0MiN-K}}+-5+KhER(n1 zbuwA)E>R{H%Zw*(SxUL~epf5=GZH#4g-6MLYh#HnLzsYRqv){Hcm7UH^piHg0K@^Xk% z>MYU;WfuX74V)6MC$-;OeFjwhi+zj5w{xkKNhQ~{*%HGP>=wbxEX}Rnk}eJv`z!$8 zZ8SgCSZOd6#i=^-MQm@X$vjD}Q+?1tCX>XS^v=XCFt~S zYAd0X36WbK7jJWLhmsAWRL|q1H=I6pUC4;{W|9s2{gTv>I6zduQ-zMT%`I)+f*$*!H*KwE)exA*#rsCsf7B zPvYZs?1>5ly5g-ro}p9@nJ%VX;QKD8)QSHa+X1RX<(yJdkdm58x9l8DFwll% z1V`-zi9slo`%Q$@5QI`l0jBaTS`N$@&iH_6m5H71cnz_)3waM5!Wdeyd{O8!(4su7 zP|(GEWy=X~{to*cy)0>@w`x?NK)K-=hX(q_EC&ZKPH?kjCf#ZxMbqBuF#?UJ;^vS*!7{? zgYewo43s16m<7`mhlFDjN25W~+maE3jwZUu@%{$;2$Lgh0*AHF%pyo!_{ywZ-3+zY zidZX)0>#I^I%2a+O@g~UY@v4sB%4c7^J|pt;aoUBphN zV{gtEhveh#&aB6Dq1u;zmurfW2IpB0ZXXMKsPq%rZva3r2vSuZ$*6-!^AT7CvMbu- znr%ms3Z(6Hpze?K(rbYV$APOE@MHyAsoG%zu;|l(_#wh~mh$O+bt|IW9Du26D9ce` zPYqtyl>8ciWLbGewlI-pIURq8H2PTJ@z@_YcvwrtXf&4#s`K=|c4O4tCaiQ<$^`*u zmHCP3zAt6R`u8IR0$KUH&nt@ZMpUZo38?K8L##8){fXDtM7QjY5#i_(u>GM2WEiM?D#ChhTMx1 z&n!n`f4Nr(1nUk)(?7)a8R5A@zrp>6hs%;$&vN=%S@qQeriur5tMX+d1?`YKf#!Mkw5~tQ-z>%V;HcoZ!>3k>E+B^m9>G`-Cf3u;l#qv z2y5;(dL1b9r7^sab zV7-->cqwvyfbmS%N8p}xN`U(uowvui0m(uPJ^b^_K_>AC^djR$S+^23lqzaVcwg!K zooc(p#@pYjlH=25AmFqe*-v;3W2xG2B%mIPV`hOKRRLLrf$ge4b-xsMmynshxW0KU zNIJcyVijwc#`E-EERwUPL!(u1@@eqRMmlj6B17rF z5;=5PGm)qmew@ve@Y2^7YA1+%8fBbPS@4_}unh`Y=M z{%WUH36MXSJCMIRBwnJ99PoDBhw9QHJ+nj)hYzpj0}iO1-dc35c*|aV*K?=fobuis z01A$<2E_nq(1P5P4?{bILKFlzuP8Nm!JJZLj{Qk5m+lQkoV2AkwX4{iwmIiLg()4s z?M_h+169&3Xa)VVMoK_HSY z2Z_fhVvg)p$V{I)ad#?o2j~L)4Ji_?R0m6L*~8$Z5GrY84q^m&g%hCR#o*ymb6bjD zLSI*_`b(&$8m02@SG#BPF{S^XrSy=JA!q09-`Km)Yv0coy%w@eT}(e0q=x_DiAXs924MZNnf0JOJoO4;Xg8dd%;E%h zG%-A-0>}U30t|ZM=?h`@cTeyJa*6ENg3(}S`5;VPOJ%L{+!g5}c|MHAEZ`Wk*voey zufUo)mEoUXLLVCDKNyldlt^HSErB%^TQi4cdeLxjc-+JeB8ZzCTR5G^Ao zF;VQldBbn{EeB|Q?AHKHXE({zlnuY5;U!a|E4t&GF$w!)&WKMCSqfnJlZMtZm)jdW zCq$=aMKy$=LZk|`dDl^MQ^26p?5`y_yWct9K7Gyfo%zRY_k$J=obbJr5H+p#`rJQ4 zr#iE#4A`qCO9EShpDJ`6O$_R)zZa{S7LPV__&DS& zUEJ@bnsTAb39Nf8hhX0!FVPO~Wdd5P^VGfD?smqwOYmCdG~nU3G3jcrc;E^+MVUCr zlG#3I#t{E}SpvX%1i>mNIvb}ixA~i7bQs1C+tq)#;MGzI=Whr=It0}Wm*-6Ub0%h} zEU1_FiohNa_JJlzV#sMuw{*btoKY!zaWyDm`=4I2dyug;^Px)a9`Zm^;XK8N=VVOJ z%IRz05Yr$RQe@`rfaR%!F2I&R2mvDK82{_vJ35UwW6|;czf;Z}iOmO339puu*Eq#; zmx;nb$nPYiysDmg^m0jILRiGXy8n6FP`6@=unXgtFMBhPASP6LAE01o$dU zE$@#{CI$((%sS+!{Xfk28>v1hn|%iB=o5QI*&lH6)$|5m&Cv#CPHTmC)`8a{i;pQ^rZMcCk%E+1%z3`_1GxU+e{R0mNN%^tlT*eigTiE|9UySj=;z z^J1dFf@4!|@VawpCzbb8hDXo0W|XQghr|EWhGY+e;FPYXFlpns)oJ2H9)#}!*Ng?& zxn2ey)t?sZTKuF8TXz;WgTJhs*F36h9T4Y!Cndn{BRiXu8C3!#1YJv=;|IP?;Ge|zpQa@}+|3sJ{_6&_=_+lpuzfAA*hMRjPpTEKyAKO%uaq+2uFq2ZrIDQbp~PFHzPLpFRQe>~@hmJ*?+?N-Fj%1Qy5T;w^PxU+Fv$>cg|D zvxF4v7!-8m1 zRg`%rYk%kX6DZvh^N!J-nt8h`AR=-HYDx<;NY}G2+YOa8=R5Va&o9&yk%b$Bc)}x~=ws`fDblBAjV(TvcPQ%McF{#;AAoZEAbk;NC~mqV z#CX7w+Yy~*Gf6iyMed9FNgPs1ho}Uk_43zn7XO+r>aQsu!rf2uTr|$%>Bt)cLJ_y= z5q@ZBa8QHbr#e3C>S%txDaWV-=fGOe#PiBkdDaG=Q}HC0Io1PTLr6fn83C6Z z8ZV=I|7wKB!>u!ky54!AIS=Ur5OpS1Wa7N3UDDemLuN0onALr{38P2&esrbhZh?=8~hCp_eX@L{aexlv&2nlr9e{hZ& zmjar4PzPb9R0#mK-SvNeJ62wV7Wf!XA(lT~+H!dbwGt)173{ep7i_L-Y-_m^7ij%BI1Y$NRxY*cnu3V3Q-Xh0p}U zGF_#zV#m3xKLKv#I9!%n4)UaD3M)IF*OmOC z7`t6-u>G5j4BO?vg-}r1b9xad8HxU3-zcB#6%bz&Ws3NFps#lpsQW3WhGzcFI@aQi zIwI-2T7;xE!2c~_*Hf+iHarY6JXG)p)!qSFP{*b zf8QccnIR6Met@UjC?M*BS%0#&o@(F0a2_OU*m0@wE*>f{U<)bP+`O~HW3b5*owQKr zepajP-6_wVRQmZxy70U9!SCXh$dE<3Y*JN>CgOf?#Vl1b&>$ScgQ&t^B#>d&gs6?j>d;=U>-i=Ox#2rU+sZCxN>5eRQ|N z?uARG5_!4tS5HXMXJhuem(*TSQxjNlyx;&RVOuyJ%WJZ7GCpVkjEF`*e}HlNN1_^3 z6VCHMnRai&G>m&sM)D^{THQZwgE??=<=;(+gE-x5o zmokiJ_g`VhQ(g*slg)6!Wxko8%2hAHpeBN+=ge_}2clJeeo%*oX;hV_~-WHfg|kDvi>oL8>mml}W^lLbp%; zvyw1HZP<}Of;g0ggCXX%_fhSH9PjI4IV^Zj|4YqJZ%5I)e^Z>oHf$M6g!Xh_d`!#R z(}qqgLil-Ksgxr;-;2&v-FF2%z7oiMHxBfZI?sw=G|O~@pP7e&cwpQ3I%0Jetiy{_ zA?CbDajAJL{}_{eCDyLgBeTli1KWkLK*I@_B-BD&VVf{=L6|+soZ5c2^VrVYovf^G zJb1Uj)LFzyUpaQZzpzteg!h+E?>QEPD2|CZMS%N++D(1&|59Hn4N8Fp$>$2ElIgX% zb<9TuUWLmd=^hzJ9-6&DTWebH@1sWeseS1y<%QdI2#Yi_UL}ns3P%@}P_?1J_YBc# z49SwP69=t6dZ*Ef3%DeHO)#g@gAUu6pm!oOj!2ckP8aQ@h+~`lni*g5$=9)VZP>BU zXJr~2f8%fHKrlXLKL|VDpJ~VLw{Il7aldn}_pIO2o5P2n<4O=B?+_`!7*1dY0m}G< zx|90hdpR`GovhK01b)*sy#i)2kBB6XOwAzSVEu>}+Eb3lmrjA5B5?prJ?%NtJmP3v z02Vz-Z%?bHO5HD$A&uA3@>aRZ5-PQX(LOC0bUfqa3VOB-ijN1D(fXcElpIw9{_0tT z6}LLg>yx*7e*Qo0eRnw3efWQQ$V#1KM;XT^N!fcGyU3vunGKs{W@aCImQhkhs1PzT zBO{6;Au^(D*?aW6KN?Rxzkh$%@1O7Yxw>3ESI+r--s4`c`@Uay-8nweO?;i1tGLZl zj%#hX_LGxTH864ZW9CuZ(QQz0M>(i(2u5?~NjOi6?O?fiPVkH|dz|Jbn4mI=`zL^n zNh5(%W@owR>?z#*{iwNQW+AEoV^!@KMkxQJHEJg~w1$`f$Xjk<{ z8;K1ixvNYM1$4#IfFwihzL$qgPsqVu=k8bum8K)+%I!AA z?~s0S3q!V-yAp*&T8CqK9HDLeXD`Zu2O=F;5)4OisErxTv@9cTQD?o;MiktF=pd~aDJ8p>&wopwkG-xjZgpmlXR9E9TZ{3$$%W8}f zh_7m(RnTQYs_a-IW0T;-Zg7FuJbUa_9ptvDub_(I|QulwRVa(1#(I7LIolhYz5|C7ueVPR9k9!oK=&)S}e=4&n8W(l7Q+r_JVxYsP3gzI(R7;yJz;lF>?dW*o@#l#+y1I*J zx(+wU?Lmih9;>Gr>`=2-e9FQfu_TB~vVf))XUj`?smiD`{&*@Iq~Gu;L1^7;nVA`| zIj%7ZLXB*=P$#kP6777|_kfQOx_xLEMU2iYm{DR>JhknauhdUr+n;(H+c36ILj91PoueZr+C4u;>$DyLr-ipG20UXm8hCwsj*t z(~~@&1f4RC9la>cSeo0B0-mk22+!#e_wfgrw2-EC?FEqYvytLuh0Zw&-!y<|j+q6G zk~^?95|UePD)jF--+K$8!YWJQc&Cn5F*N5K%5fx7e?xaPe5Q#aazu%B@a@~TJ>D7{ z&_7+nI8By7cF^kdx_75XDUQ=I@gl|-D~>W|TXzE0OLyQU6G31pSe2aB z9t`Dv45NB_A%0BJa{_m-eoIAGpqJI8-LrOOA%Hbf@swGUB;o0RQr&=xizh#LV$M7z zRITtDOQHOXZ)#$;FQX3FA*CX72{|E!^ap6B+;Ru`pcX{}ndO?_N*HmPAtd<-!)5wE zO>{n*A12opn5QVP0I~vCf%j4P^h;6FT?1|-6dpk9kU|o3>iAqfmwM8O@Z>?(mE(>7 z9F#(Z0eIyw-xSxY{H%SrAuK{)qZyO1#jv$$bVlO?51xBq6h_TeY-mBYOJjL1d}*<6 zKhI4h)K|iCP}L<(N@mDP-fN(;??KtFzuFjO%gAp zi{QEBfCH%Ym;1_i8u;0={Pv-JDG3%wleV?v?EYat`#8DS>MU+*Jj#$akiQpcEU^7< z}+vO15^}PM=ZoG3zM171U{2pL#Zr=381MI9(pY zWt2fmb_%bP(HIk{9DqBX9QwQ`_b5GopsIrU#ixQy6W8%pGP%bL(INAA!i9FNYpl}Y z45yykywUQt#=OAq=VnIaZ5#QP{Tf+L^ACJ&-xD zqkb3(xRMb0gtbvL>BD>?Ht*pku8qJ>VTK&5PL&010Vq>o`o+9NXjLWQ-y6V+`>>O3f9_$*L77)25m#+{faPdk8($dqCmN6$V_bH(XmY*;vahiuvpoFrNN^0P*5lT_&847Wp)4cv9s*l+!<$DU`5Ym@Hc&JY}2js@{J z)v>=_53;pi_9x-q5u&uWGz});(ub{RtIY=%puJFLP~g2iLABK%Lh5IgwMQv0t-bCaykqg>tIp}3Bf4H38=);?+ErtprnF8CEks)Ujg`L-nq z3w2^7U2NsMuVZAi8!HM_BW|^Ll1zXxJCQP2gc3$X?*tmxX`z05bTs|C*c?=$JGIL{ zx56sMsILMiuox?kwjq~|@8hx220^3MZGWQIXhL+C$zG2w4cP$pwA({L76D?|6b|D! zGIS(0HZqv&E#3>8u)fGYAS1x89ToB_OBYA#*l=zUFK0v&O}o)Fhy&i8lWgv>N4k28 z`PSD3e44{9Ai)-(eGrBq*#xXKl=&j0vez~5Lz7*B&omz|`wcXK>7EC8-KQpOl&@4? zpmHIL5>-!jVv)(jlG8tT9$fpRZzW_c*@^qpp^neNU^c!7lGRZX!g} zt`q*!|9ObF+4S1z6iFtAowe}HLGJT25V02?Gc1o!>S|0zd!qU+@RHaA>&q-1tS7W9 zLWv2OD+XeAl&zQ*7{d{qg^PW@NcLX5IBt*SlFAwOi1xQ%o7h|S3r1RGuLaR}JvCKK zkb#WtdGpB8W^rG@**CvX6|Ky?PEF2Mb~$g|*A>qFBRRi&=uZ$bJm>oLBv`k1nRVAV z+5&PkHpIsQGIU+IG;|e1EGPrwfaUzmRB!QP4W7kqRW7zkl3Ei8dj-L3@255n<5nH) zn|Pn^CeV{ABr0IRdQO{ALfe+jc%(V1N$g2fH`>=P$5uwaIqNFNV~(%Z+bmCzRv&XN z3Z?fjl=Dqubo`ry0hxjC(CaWd{nEZ?N{4)&qWwIUCZn6HSQwJ>_WVITF1t=00IBL$6BYnf&LG*F~ z>S?xt6B_j>OWkK{uhI%JT7I()-KJ!bG}8&M4g_SFcySUQ=*U7z-*cbjDP_AG6}m8j zv0`~PCpT9PJ#m-P3@(Ul`t@b_Rzd%%xFiM2W&@gdaMZ8EMon$8^hlz-O(xX{f1mIU zxXd3uMEQxw7~VT#y`XIX!(b0ewG=j!tKG3F3^7p5W3UX|vOSe) zAz{6khF)P^U|C`P@*>JfcsAeU*=^%6E%K#PCLzaFfd4O(>gya^U>kZeI|Xap_>hyv zj2f*zFIjejmGnEfgnZ}6g`!9<-+R%_RdiBr*nv^>7&qtXNMd{P|yN+!*0GU<@=@}y-p0_V$ocG5dqfov&zwOyfSBY|Y6HBUwrPbaHi5J>Z zph&Ow+ALrH{Bo++Nm^hly0_6|Uh*4JV2R0T9x`t>c87azk$8=@c!moIGsYb*BW&FP z0rr@MbHGawUeGRw)U>myBu6luJ;85jv-!;c!&LCTx65Gc(_sK3z}zE$q9wqE|D(V` zq@EB*6N{oi5iohLnU;J18hEoq$2Mp=k7RIW1k)t9l)Yr6=f^b&C9myK9F*~_>^pHtRBuC}zDm{u-s z1*p(<9`}#{c1#eyE-l8pG5K8H#fbopF1#u=wF~O~&@55f8a{U@7BA(;0|CjJNE6KE z?3lUOG`|&oB!k4g{TNdOUF>LE3b4GXj721SYGc@&HrQ(dIZnk^R z*{asLTT-;^#iW841C(O4W6;Z>RK`%AO_IUJPBhh5uZX!$T=1gQq+Yuc^(Ea11(n#E zhr_t%fgV&G%}vjtdoS@z18bT&N-hXcNy50x6*cXt&m$=nB2s?U0ss_&B!J6;<4*VuJQvg0|YmQb9Iq|)&sM-(qaX}(y*APwtjdn97k3=3$4UjTH-<)`$QR^Q>x^)H&}J5P z@xgm3O!VCstAh#D&7o&GtLe7m(P=+CRyb#rHj;Un)cftULcv^)a>)L<2{VXB z`EMPdoer~5gu=>t+Kz0z({n)7@6MsZ$;ikU@l+XQ=!tlBLku&2;Qh~x80s|jcTA1! z{h>kQ%aAE+2sr3-*b8aU4mip%+zeECiD$5CqelbS85+_qfNYz!)11FpAm2jo2@`M| zdk)z4I09r^;Z$sreh_nT7+w9K1nsS0!-fk_R-PA5MR^Y?O?703jm$KN)n_3&n5rNP z6~g!^r?h=KX^su#Y5)rvy&--+oOJ^@N7n|wzo9)QXUi00E;ecdrYvO|= z-A*k(q#ZAZMRFq9myi~8ps8;og(F|b$6i*(l}TzJVP#JFGDQ^AgD+fFqN=CJz!capNfZIDy z1=Xxd)*ZIAtY-Z*zXO@1X(NpAff`m`%6`I2^}GSxSl&jY3aUSfTxQ-x$`05RwPH1Y8Z0b}AKZ4OcR5GZz)^v6lCO8=B%ljQ z4Nn%Lf2K@LmzdNy2+uyr$2!Nt)b1zgw?2Y5N~$g0_IU=0o-*BJ{cAfWhU{q;K-oS< z7{0T;nefOOTVsNyN&5h;_h;3yX%7#k(ZrmrCTh5?i|g~uWr-YwhAbPXQW0O|LCXP8 zg~F5QV)H4s7L=vu;)K0SE2=#b&zY8wx&?`g8(bSKhtC4%3ozx3*4GTRd61k(x{b{4 z(8ZX%nU%7r)HKWhq`T=z6ke5_cKJZ>glhyFhKFWA-2ZV%XxIy$ti*MTI`?JuNysi& zI9nG@eh3Q-Jok(LK}i*H&{B^5cF?rbl^OBm^U7`oK|Tv1R;+dGJ*t5UW%I&L&{u}1 zlF4ljQw{em!{)ME9d(eRkhgeuU%r6HElS1n3u>4+=9p006_l`NSQLvH1qlpXp>R|n z#i(6V5t}^0dfk+9LQjT+UppeR@GdoVY)_TVr!oie#RB*u6Dfbk*4FEaeRt&f_rG&imU@+1WB4UR~q&CFG(+&c7}~ zA4@`#fnhg&7-jYOQ0-@^b#Wy?rR{Ba^!m}2dO@RXR+>k^i;*Wgp+!O=#N7TxDI6*6 zB$dG*gqgnsCf!1f*h)F4v~>r61xnetwxHwMx8DU=3{P#j8K4?FXkw(enAiRLfg{qq zt#WJE6`z1s?1B43E;p24#5l=xMaYIs55w5DgJYLGcaXA2(=BW7Q@A}79v{x07xxVr zL?>7Pg2KMuzu7_=TuGv`MCAvxs|%G6S6_2HwMjzKgT;}fttSm?2B4%@y`!V^hflVv z(@FO#0abn{Qosb{)#6-FftRJRgsgI<8E-Z=%U=JG+T6Ry`?dD+HBr#a}}0%EzH81q6Q$ zk;hW4zd9*!w4L}tbI}21&vjw89(3*sP$73Oa}>YL%FV=GYUx&C5Ht%|%niu6m?Dl& zHt&}x5*=7`Oehwp`E<=8BZtT(G5pSpnB0h4CP}^&&=v z>5#@qC|xXNE)VwsqAA99(RSILYFW!G8Pe#P;rESr3x#V#AF~?Q#r^&E4`ZS2%B%uU zw0TA=WW=B7dB{Ean+rU+r7>5+C-)<;pU)f&vEWXNJqEes1i!OJ^5cb`GYzPXGhE|v zh^-%U3SfNmE`dhIxx%HA%Z(79bB${{SGv9rJSx&r|NNc9zFji75W=!jCOq} zILQbW;^plsS|4#g@r%#Z{TNHtq{TWk0h)lA;5MDoICFRqCN@O%@Y@%%38f`iuA74e z5v$NIXbBFiS6drZ{e2M6HYigXy5}W7qr3m+GE8Kd?C8MnPamMhq~uF}fHL{SL~IRG z3Tb*Hg@k>!X>Ad6Hb^EH;l<7Sb}QT+Lzv!+50$zW$~@C3CSY-Jh83*y{e41 z?0P@lF{EB|6cOSd z>tw1qW9cezURS|LZvd3}?(2!deVhnuJJPqRbRm<{boBZ4qn1HfO0)ykmUm4Gn56T< zqAo6OkNXSE^Q2KaN8rzpg*s2%oso&10+WBuyU*$U>G$Fnz0x&rQWuvFifoS9t0cX? z(j-TCu|7SwG*aSF?k}D}EDJdTCGEAM4}#+6eFCq7xKY3{bnuhi)#^;DhS-)3uk93| z18OMO@%%V@U^Gl(Q?#$xdaRy=p$Qt+?&~^*<_Feq&M$|!MX1tZDKM6PF&dRB3`f$a zEuEx1VltpTPLn!E)nSIk-$dUa;h5nxFliJ)gF}`d51ZGJQtb?wQTiC^jB+CDbGL*; zvlx}eFWG`8 zlf#tft<65yXMc6J+5k6&H~UE4`f%R$@@xL|GPB&>0^VKigoVWhzB-g7q=b-3T0Jr2 zoP!EZiGm@B<*(CsgqW!X-l5}0#b!VENBKs7Y1n7n`7ugKNd5TP&`T&!6kd$BJvf_D z-?LZuctqqXnq4&vQlfPIZ@s$((~@DzG}B4h#B&K&yyw!2iQo6)7t&0e@^qd(-CJ`0 zqC+4;L3?}Pwz@8j0zELhY^t;IM;8o*-gE^#rMz4P%L=$mBr3`CrL5!V8wYK5sO>+_ zPLua!U0T$|4G3VX!j#p|?$P*qST~h`b*|r)BMlwZZ7ga~<*xWLry0_tM1?F#Jio$; zGug0Knnz%h2q6j5Cc)Wuc_GzJ;2TRe3mGexMboV|s2d&XX1_Gvo_9{$ zGXw3V`ds1ukTjMxm6I-<-E42I*$`Gzo0`EibO&1zo%hvx4^cyQ3yJE0r4b6Me@@?Z z!@*pm)mK+8ZNmVeBBUAV*b)8|eYNTrB6W-xbA-PV$$AG%Qq1Em1U5z(asPNZ*w(Y@ zZE$mJEUq#Pa$3nSkQzY0?PMbx0}s{CD-PGzTYCwnuZcNZ4f{eeOmdv1=$PRfmqF=& z;w(visa>GM+Xa5!0u|j)2$+P(zH&Y&1;`8wo)^Uo1ex4~lk|T&;%c{u){qhAz0huJ ze|Q^ZS()uy)>+{?i<{6jI+b>=1FBrZ&3a{88l$MFc~7wFyU7R4^T>HYzV9PcL)=c# zmnG2$Vp5lie58iKu6a%9mizgo2X-`LL{luSwlD+rSRF}BRQ55w1*YnN?=b7m78(_< zS>mx_ti83LL^sx`pPO8c)gt-?)D5mkfV&cHW!eeMgHHjtjWYa!xxt$F_J zqr_s1dGiO;jS+k@d6B<)A`v2fsO6y2d*B2F@(8<#Dc4h^gFyo2wJ_hrEa?dAZ7j<; z#(Lr%o(!`PI2y>Drk{N&Ko!eNqs?EdEQ{;FyOWC4OzEd3tJRWZy47-15yY0VC3ZD3 zsLnrv8YgI>7aq&nW4!~`6Jc%CB!Mhv0&d0fxZi%?c5+Xsx^}Q)C0C zW0+}U=M^Z6Z>xrdjm-pRSm!-&T#p~mJr$NH9-L1q%Kp?M=Fmj;=FEAKl(UcD0J-J# zi+?mW>`Ia>enS8V#0QmM9DU0Eq0kgwk9q^`e`zQK=^a?+-EZ z*kzntS7yeX-#TDRZMS03w#iMq!J=0$O2}ii$xayy$>TTz$`Ru97#LEC%xQ2)BWV|2 z=VgdcErNlx=jk^y;xr4Pn?&}CU~@hxE2+=WV`PlST5NA)-nD90g^g#5%%(xn$|>Ai zO1ar45^PO3&^bu$FYJRv?IUPbRJRPPOFe>R!uc*h?D`SLBN3kA zZiHv>`%Yr>SU7WmAbn<_G0*tfDP@iu4y@eNNSUA88to^mftp6z#m+%eGBqF~5aJn( z8uUk>m`9!DKim+-{3$o$6$2(#)mo9h**t(k8;8BCt(tZzj^brB;4wo)A5laEcnZ7<$pLK8(~4xe{kYu6Is=g= z*Ay602bt2|GhwEL{eQJ$p>Cet#NG zMUi$XmzWl>vtNsWR+@yY_a`KIuKLfVF~PMfCkpxc7b)&|R%IX*mTX<;+RBNBy9z{|2d|wQ@Mq`qUA2V(J9Pi zIKijw&DGM0_gPJzcPT{VJ-nzXPXR_GB?*1$hNsz;FlQSdi%Ymb{kLt2Aaw3cld4&J ztoB2A-{19z*MI*eC?;N$v0GQlkyed!uUp9XGT*|s&nSh_K38RBmLE=!^^`~ueTu2^ zkT(SzQ_$Z>FHj~eRkJB1C^IG#7||Vav983V{7xxxElDj;^?E^--muOzUN;RT)U@82 zyT*NI!JEtW&FX_|VmYwq!1Z8h`;pe7L;OOe2|nucDkLE2EBfb8@_%qDbsAgpgx)Ya z=vdJ*0HieVI^fDg9EA3{>gJfE+?D1lOFk+*;0Z`M^C zFDjsW(d~0!o(s-1o%a2A``H2iICpm*S)ACduGpQU zlv_fw5%G2Dos2wHvFA&&Vv?m7gtJB`fl|#{NUsK_>M>~f3$J=5TRiRB+R#rH-Cl$; zg^>U%O+1u4Zb$6lSp$n z0U-&BMecs)O_m%EZJ&EAs*`WaFF4;IO7`H$^p=_mS zoo?dNq#q7{p{9uKSkIBw-iXz6RE_t`+9G}UdG9%IBliB4C_@!o(Jn@lElBA9) zi<|^4GVkQn6Y8cqWGTu1cxvUZUU3~g6PD>hcI7hC5%HqEnm!5lE~{%%L^x$|B`H( zfvdrc;0q&zna1u`++Gt?z_n;Ys5ZfKpZdgCd7KsHJ<(}9=AvEKsR z`?DK#i!o{)&*Vz#*y%8O|JVwA;}9Sq{^|h41@#(63$eC_K1jW-6@`E0f?;~s9D za^sJZWh!v7t?wHgaL4=XjNx;1*l`T(ZsXM>6;DEYoRx z{}!uJ*!}+Su8bfrGD3@DkGS)wMw6O-`Fz!r5+A~a#=eQ>xTQz$VQ4RdsoG9Mv1WkU zOJmd5#ZXdEdh&%8?I~8AyO-5kjO^L?9j`^Iaw{ zE>&JN)}!gM1UIh5)(qdS%YeS)8uYy{Di!W~zd9l%ni0w$Zw=?=erTon2xdO_f*<2sNs8Cwd$4c>INM4xI3X` z+bj5*ovBl1E%A6F@_md~nB7d=k491c+M^eQut!vKQ^6X9YTIWxtf$R=x6bA*g&GWa zZoWDBHXQn`Hzi9y9Db3p_+FN7`=s=Ce4d8SLxD$Mjcs4=)Xc{>UThtCxQI(lxAz=j zj5yAHga@S_QI=mm`Dk$4XOf34kL_UWf^4wQfcM(Q`y1b>Q!cJ7*mR+ljj`-sH7VDZIYZ?DtTx!UYsdW7lH8(Pr z4|nO?sMhP!NuAD5bA{MbLxAQde`wW3$!U1aIX7|V7v@%?l@w|m1W9L*^mj8h< ze=(v$u6FgQTWa<5O)AqB_JJa{d_M)+cLxRgtCB*NkBin#d_zRY$#Gojl)4rtlxbga z0JxxOWv0(HvVZ2dCGL(@x!anK>O?-GzSlYus;NP}eaz&-J?>|{rWXB z!=R*w#-qOX#HoC!Vw(>CVGzd^_sZj#X>Fx6XxSrFn#Bow1>SwSxd|LBeTTTchN)8V z-#7BV_g<+xL9EV3q&hK?4!y$sK*v;;l3)0h6_>Qyv7^rDaFM{ERQZYFon?vMr>tgu zC6LbL8LnJxbbcQ9YgvRXTr8@*#;1D=G4ePAdI|*-1p=O%YFb>G=X-I9@!k^?8OSW= z>WvTijR4;0Pr}mn@bIrCUWyEHY!m0gInH#Rk@QM}vc4O#>{^)9<1RT}N|G*E;OZHo z>k_foG#n28=3v4yTt0g#H4Xo>A4b0#{pw{RHD~7e{^V3m_55P*w1^LIy7LZfjf#pAWGrdy?U>yj zm=*3yKER3_{FIzxIL;P@tz6Dce=BIKUtbr99=l65KTPN9!mrHrQ`Moy@!)r`J*i^W zjqcoJ(A(=P#oYo=H+FvgPbTp9H6aGD44BDP0$Ti&G>L`MrM=>5mkSfBj%td14iKBj zh-1)V{;I|Lb#JUd(eox1YQ5(thHHt5zfXP@h!UI3#$S1ji4?z<3}q?&6ZYHx7OM+T)w}iplr6gD^Gn0_|abLx%ZB z=TBe1o8HrZ|XXK&PGY5XZ3=uPiP&r1z1umcDI}TYx+y`%!*!43&U&D>9F`pfC zDX2M;G!}TB)n+Vey)!m?C1Po{^+CIyPimu@79(V8v(YSw`ICH^zC}|)&61fK)N5OI zXyXdrW40Ac@zsy6pU?$f9`zs1RVrs}w+sK7V*kDSH(~ex$-Y7l0vyDv_m8h3QL?e? z>(nzXskj#ZOn{=L^PZ0;_mnwY`UDL^M=l+vrw0o`TOUfpH*7fT4h)qlJW^H%qC5C( z+*zHU?EiXbEy)}MgKy{ftZOzt0M%mZF)k)4YVVQ>TFe3w;l-=U* z$>^6|Gfg*j*$^gHX_by9R3&<_xxVx`KXPr_TxGC!`XhSQ)4bj?YkBclZpshAW|1?A zCGg8oBe=bMT^@IV?~);*GM$AtP4072mqlxbiAg9f6hX#Yy8&3q&|0B06o1dIrKaq* zk?iZ24ovTq^2`Bz$S;+~c$fkin-@K!dJNF_(xWuxC!w~%7|S1o|COT%)v%KrV&%6kWY z-!&Ay4&wPTV&O+!FD<;0GNs#6d+m_L%OHH#z24;~T0ZWcS{!K3U)O@=co6c$(%@bB z;D>_?XP;}2QhsvbWO?h(ri$m#KWKYTHrZb%x|bl162*QxG{2ILJhsJvkqxjv%2 z$`iwmsf>qR8pH8{gjjxWi!>2vpxlaI51Qnd8(}uj&&fPv@nocy zm`!FO=BSWoFOGLjqbf|;2d8V{j2zxBmTP^ka% zK;-TtiVc5`IfYMkGTrO~?_PpsTCtgD)6OMZJ=Xb8-fEL2;_}mzPEO5STK(-HXTmn# zdUSZkAe<$~>$Wlmw$apgDWJVE0-f)9rCw$;-0Q~1aBp$<)mrV1s*MkUS&n=EU7Q^$ z$Q4Kb*Bh`m`$UhxKQOs-o3$q6i>=vq#(WC9Kgi7a;tzV^DgOOT3kgXquTIMYM)c3y zC3l1Ho{x;#`-exx)QvBA4EY*%yS$S}Cm5c)Cu~6a?+4Y8og~%kdQGHuB{$p|&2r|D zF9mcCN;@yjOc$us$EYaZ_3^$^V#D@(b%?R4B1SCE6I=LwCf~7pVR{7^%yts9&swm5 zRix2oFP=xIrO1en_4ieLw+{?4BkHwS0838z*#b@i!VLwJsjg|~V%N&_7kX9f>M3OifXn+8*ew0M7b+9C|U&r;LhhTMpasIWj@=;@% zl^buR;-qb#xjE1>@#|9yUfO5)?`{z4BS-BX20tJG#>kmu%aH}xJ?DU}xOW1YM)1DA z_^G_G9$QiUe@~3$*#+>Vuf8kX53z^_#}ofOz9r;RYeR@*VH@i9?YUuA+13KSyYk_T z4rBB$4SQ3re|Hc6`L&0rg6mhXWO2%pxSLKJ6X<*|enhGK+P_{nC##bd7lNqRZ)H+; z$s@YsSQ*RkqsRM#Q-t}3U$GS#sc0l9zq!}H!b1Vl_v;qQal)35r@#*jQ`<1PTSVZ8 zn?*@ucE+O`2fii?qZ2O15~<|-c-6B8>t1LW`29qZcy-vvN7tX(3;JcOTwn;<<9mQq zYDKTUxA-Fz)v$Rl-ockv3lHCQln{DgO8VCyU1kWcrZ z9mY~FT#K)M>ayC87N|U~d%5i{-a0?GD7Na~1LrOVebD(eX>AxnsZvLdy#z-nA;iH% zO4=>e8ZV`RhGdi3o`6$0z+dNW~W0P4-!i&~C z|8`-SOI?*N+`di(s3yXJJtPBOM0hF|9m2M#5idh_R4IMM@PqUz(A*THy4@wNwVQ;_Olzf}McbH7Nw6%k0o+>mO10o({^x z`4NA5-#$*s@~J=8lwAgEN+bGdt4%NjQ8Ek#S5MP2L9uJSj@FDs%Z)Lm%8Aodhx zIOI-M#6+9@0H-j=(Y`?Q0F#oJ_*MsH%|1NBUy4k6HJ&ktSoZT)f8yQ}PM5;nhut@Sh&zO$I< zz;kGbQT}#6z(y*-=ST}~eTN8T-THDMAsIQ;W~>AjchYZeOtE>dzs4&b2wBVW;gyOf z|5wOREXUD%|5*78STT@mh*#+zJ^(kXgeMFx=cDcb!wx-=v3a^Rg3zqK;SQiR48`mi1G?5(%AAT zTM>dlB3#^b=b}ZFbYu0>ox$+3&p}`bTMNhD3P|1hYjN+6fn};-*AR(h$+=8aaF{@C z=$;2=XS1fr*u7<(jXA{atw+zlssmtRd$53BI*-iAY1nBNuZw^afrtrzDF9Tx#b^*| zr(~rt%+5Ts2ma$uss$#Oo-F($l{(I=i`)H8pej zUoV1?WC`&Y^IL>>8pvWB?Z2KPID%G{j_#oA#xZAXscuJr=dmRDB^r#a#DAZ}15e7j z>>-uMlG8+V+^d*~$y>~9w#r~ua9Iu-|L|X57tM`l3fOu@{KglNdwj+WJ{J;pGAWZZ zmNR`!pWx+BHv;cGRp_meNvj+Zk73+Zh%pFJ(Fjp4z|4h7hhJCG`U;4LCZ54~fO-wU+ak>iLNF(mVIC5)&DC z+0CNf=pODr?i67xBA2VayN+h=H)up^1X&*QrIYzh4i$!!&roG&8U3 z)hsz$WLJ_>=wR3<9=xNjya>dR2*9P={ONHJl2C)Lq2Zj0A_ss?o9pp(G&rT^wc1wk z+v&_o(>;PtX+E2!`0bUccVB}3P;NKnoOk`_+#k#8BAE4dt*=^*^d68WR=Vr$USCUG z%JllsABqNK5{sxBMulA^aL(HI!(+DU@7uMDS6f>)4reNVoJiRD_!~&u-E=C%xyR>j z(UHcs7_;#m<(``^LTgFW6pY=wWbD@Oj7~60_A=z(J|Lbkgw^~V+9N0C+rI1ci6V}G zO@B%86^(iTukzC)7}+8vj}4D7=il+${!`W57lN(ph)=5`N3$1qzqc@?T${0H6R~aa zOYc0oSxX$OS=nub{yxuas2^_mr>X%*e)ojIO-u{ST`2LM55q$`M>YRxgcE>r1=mdL z&1I+r9k1Tvm`37--+Ph?Xuz!!p*Vv?7R&42dEb0rkPBcd=OfTjvNB@pGMoEFnq{`; z09f~UdR*tvSG_5B3~@iIcHNInX9I)M61&)x6_=fLbj{Y4m0QJMU$Ys_hkExHIREPg zfEGZ)Pxafvy9coHy2ND~zcwEQ9?pbow;`I&FrEne8>-lS&2a+|t-;%N(}9S2=s96O z6~eX8KYe+M4d!hI<*gXbhOT|#dR_UC^)CQI(XQKom?;qzSjAS#G_U)SGl-@4?gGek? z*K1pdNELxyh-U%lRr9#@=u49xAZV?&603jdGjNus(2k^Y=YM{t^wy z2CusS;$rut^|^nEftaMJdNQv9(MK85OG{hAl|}#pJAC zrZPev>rOa0V+qBh(;H z_svW8UkYCrdaLHBxsXMTzMWl+Fp&A{1>+&s&>fvTWo8Tb%+T^=N9y)b^1zPSVA*i7 z?IpbI_eG=J#>&5*Bxgd0Jj$L7@h?_#vI+$r=Ncpgsvx$s9ja0Rh4y-i*7yy0?dqg* zBoNZKl*cubSC}f+=VV1zzq(L_xy>IYHg-4GzJB2^y>ed@k)w0qX)V;r?6}o44${xp zk^7UM1~cjw?|$Tn=e7EH9*)6)uYU=XTt9NIxd1T+2YRi2##gP{Roy)3BewZSpDe1w zzU^*Tx0wH5caCJ~3|u z-59y|2K@Hp9#-Kg#44o&3^5GmqRh;jdiA7SPHyO+zeIK~K|g3c=k5yYBGOn1)$L3H zrHkI{<5U@3F`6>s!(}59Wh9D!DlNFD-w@Q!e&E(2BDEuzt4EXZT3%My{4C#Nj8@B^ zsJU!FTAY|mROqi0MUAI`Qg&TAl5!zhNPYlpr#BeF)oM||bDpTJ03-}!r>-d^{Izp? ze0R_Q&}!w9qiXuWeAd0+;F5l zjDVg4hYBt=y^Hg5$W8lxwg-W|{yo-H=OCuKP#bF`pvsVWobS9cgtX&lJ(eG{wTZEr z)%wMr>ni;Bw-JGrn}y@7Dw-XC)X@`6Vg(x;-@Phd*I+NG8Z6b2iR)Q$dvmVCv!Lm{-?xnV2 zs#>hAcP|WhT{!gDic#D-a1t4TNz;X#H0)lh6=?I+BlEQfuhtYEuGzM&Z;ZGAz~g3v zKv15|&K908kNdS%?tkv5t|rLm^VqA5$=9OegHt$bG^ft2k z-V(!ra5wf%qIRUP0ny*@kevwcU`Ethdh!9w#FTNAYR%SKn=59tl`r_+%FG4D=}zLD zbyedF8ru-n4*3^#cl}>mp#sNn#B^r+exQFwC;0?GD;L+8JT7ksmpdTw`(5!|a|zHD z2KEtph3sH_rbX{f=|@fffeP*JsmWmwY6q6(5uQN5jL)pN-nl6w(WQwD7q(9hDqZXz z0Gd_IwvDPgMmkF^sMddaK4TOz|M!j9Y5)RriJFCpjysT1-`A(&!1& z`z}Ycq|lI=hws|nz%RXRZEEIH*=ikpW-T)Ew*dek0McmAdy4lfmh6wk;g=p9yrT6_ zgwqqFBlD52&&>JG8`3z`5?zXNUTR0DZeH{lJxTWWwz9l~Fbk)m=OH_uD35dRuy}&v z;jc+Cw&^Pqgy8W3_xp!eASo45xcV_`)#BVA7Jpa&g!3S748;lkXs2csS%$|<-fl}= zG1sH0cf!Zq02fNAda|6Pk#IGl;C(8Ols>5Zjis(`@&8;76n6w1u281MtODf452T2n z>|(yIdg}X(ebc=kH;R7!ZdPh!+4?AepOZJ9*&5VGh?W>_-R4Ixjuy+j{o6|giL(U3 z$>eYSLMtMrs?OT6yg1f0-S28IJ;ykJa`+tRKPEjV*TpVLq*B^XD=398U+Tas9<-It z`ztO%e9&sJVav|z%Eq3K(N5FTALk>^S6O+o;useEncsL%ti4hx+++C!3idJQ@}6X8 z05nT4U8OB?xQoLo^Q23P~{0ai7o04BwFsN6kVlZ7-;@m z{%^|pz%|(@vg1FW;+H{Oz4dh%o-DqsqV5&j5wpRX;%-&%OMJlF)V9_S;xYZaTGIc1 zK{4F<50A#$`afM84k;M^R>4(LL5<1Giru%baH`ZUqQ~)VNW@p(KNTFJcuv3-Z;3Co zWHV2pnXj5XZD&5~rcyuoA&&9ohyOkz6CQDk*Btwd4cl@Wh8tB#P6z*OoK68^Cd5-s zX}I+z4$&PBFDYgW&RldSi;-D+fDc*0T3wlQ^`UbZ4#{m>_%lx3 z)vOJ0&S$yjTx%F(yzhuO+ll5FLn^NMKW-06C+KY5;tu}5$9cOxffSaa`5U~efH9NC$|uKR zEdj3?YjiO4fR($?zlhe4FVY2*tXrG*ke>ny6m0X1s>j7|D zptNrv6dDQncq@Ii3Hy83Q1rV_m&c`x@*S!kS`ig@{4=RVC}ykJPdyqpyabT+pUS|* z261L)qe+R?(r;v381j^CmR>6}^C5AnALhq)-9K{(X8w^Y^>l1Y{YBA6Sw2q3d@N{>LxL z9fUKJuAlwV>6f87$#CcIMR)Gzo63KJS%1rtG&MXERTHN}9xIV!ZS(h?J)?!JX6o1v zJooP}{mVJZEBF%~0bTK*G}52D`VPtDADovIFJ{S!D{uTa$+i1p%kVyDpMCrPzepK< zs2kb_wo$%vYe3`wzPA#fk|#6l4mPb|;nh!{{`+5fp~M3aZ=#=xls`Y~%LK~C9Y5Hd zL!_3{Df~PA_+u}#vk*<@O!ouP{QFDYx#5wl-dtIq===up9{%w86 zAHbIeuch48kM2}6y!0Qh(H-80SKk$mbvFU?=WV|q3}4DL?0Ve_ur23^|15G6u}T*G z|05P@4+<|UliL2{!9zd?+D-R;UEhCB8B~8Z97%TK;@?67cR(1t z{twUQO8&FgBq(mUQoOvQo`1_D2-ay3bYcEV+rN($Za^p;Y-p%>>fcfdK%fqY+i7z9 zzQ1n}nBgCw*#9o$_s0CcKaGZPyJvg$5Ynn)<#qq}WPZ7E|0^edtNQ;H_y38q@%^Bv X;=Oo!w%qtV@SmEJCN@vO#P9zAY}gb> diff --git a/tips/TIP-0047/assets/microtransactions_pt3_layer2.png b/tips/TIP-0047/assets/microtransactions_pt3_layer2.png deleted file mode 100644 index 67a46901dc89a453ddbd72cf8006a417f9097760..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 135355 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
      @GVI=78mTm?pJw;^-E|@&`a*Z@W2#uA( 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
      B*EQRjTbEL+idRQV9=N%hbD#_oNTh1~ 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 -discussions-to: TODO -status: Draft -type: Standards -layer: Core -created: 2023-05-12 -requires: TIP-20, TIP-21, TIP-22 and TIP-38 -replaces: TIP-19 ---- - -## Summary - -This document describes a `dust protection` concept, called `storage deposit` which was originally introduced in TIP-19. This concept creates a monetary incentive to keep the ledger state small. This is achieved by enforcing a minimum IOTA coin deposit in every output based on the actually used disc space of the output itself. - -This document minimally extends on TIP-19 by allowing for additional weights to be defined in other TIPs and no longer includes the deposit calculation for each individual output. Instead, each TIP defining outputs has to include the deposit calculation. - -## Motivation - -In a distributed ledger network, every participant, a so-called node, needs to keep track of the current ledger state. Since `chrysalis-pt2`, the IOTA ledger state is based on the UTXO model, where every node keeps track of all the currently unspent outputs. - -Misusage by honest users or intentionally bad behavior by malicious actors can lead to growing database and snapshot sizes and increasing computational costs (database lookups, balance calculations). Due to these increasing hardware requirements, the entry barrier to participate in the network becomes unaffordable and less nodes would operate the network. - -Especially in a fee-less system like IOTA, this is a serious issue, since an attacker can create a lot of damage with low effort. Other DLTs do not yet face this problem, as such an attack would be much more expensive due to the high transaction fees. -However, in order to solve scalability issues more and more transactions need to be handled. Therefore, other DLT projects will also eventually run into the same dust limitations. This document proposes to introduce `storage deposit` to address this. - -## Requirements - -- The maximum possible ledger database size must be limited to a reasonable and manageable size. -- The `dust protection` must not depend on a global shared state of the ledger, so that transaction validation can happen in parallel. -- The `dust protection` should work for outputs with arbitrary data and size. -- The ledger database size should be fairly allocated to users based on the scarce resource, IOTA coins. - -## Detailed Design - -A transaction validation rule is introduced which is exactly the same as the one defined in TIP-19, but stated here again for self-containment. - -Blocks including payloads, even transaction payloads, are considered to be pruned by the nodes, but unspent transaction outputs must be kept until they are spent. Therefore the `dust protection` is based on the unspent outputs only. - -**Every output created by a transaction needs to have at least a minimum amount of IOTA coins deposited in the output itself, otherwise the output is syntactically invalid.** - -min_deposit_of_output = ⌊v_byte_cost · v_byte⌋ -v_byte = ∑(weight𝑖 · byte_size𝑖) + offset - -where: -- v_byte_cost: costs in IOTA coins per virtual byte -- weight𝑖: factor of field 𝑖 that takes computational and storage costs into account -- byte_size𝑖: size of field 𝑖 in bytes -- offset: additional v_bytes that are caused by additional data that has to be stored in the database but is not part of the output itself - -| :warning: `min_deposit_of_output` is rounded down | -| ------------------------------------------------- | - -TIP-18 and its replacement TIPs introduce new output types that contain mandatory and optional fields with variable length. Each of these fields result in different computational and storage costs, which will be considered by the positive `weight_i`. The size of the field itself is expressed with `byte_size_i`. `offset` is used to take the overhead of the specific output itself into account. - -The `v_byte_cost` is a protocol value, which has to be defined based on reasonable calculations and estimates. - -**In simple words, the more data you write to the global ledger database, the more IOTA you need to deposit in the output.** -This is not a fee, because the deposited coins can be reclaimed by consuming the output in a new transaction. - -### How does it affect other parts of the protocol? - -The `dust protection` only affects "value-transactions". Since blocks containing other payloads are not stored in the ledger state and are subject to pruning, they cannot cause permanent "dust" and do not need to be considered for `dust protection`. -However, all output types like e.g. smart contract requests are affected and must comply with the `min_deposit_of_output` criteria. Therefore, these requests could get quite expensive for the user, but the same mechanism introduced for [Microtransactions on Layer 1](#Microtransactions-on-Layer-1) can be utilized for smart contract requests as well. - -### Byte cost calculations - -To limit the maximum database size, the total IOTA supply needs to be divided by the target database size in bytes to get the worst case scenario regarding the byte costs. - -However, in this scenario no outputs hold more IOTA coins than required for the `dust protection`. This does not represent the real distribution of funds over the UTXOs. We could assume that these output amounts follow Zipf's law. Unfortunately, fitting a Zipf distribution to the current ledger state will not match the future distribution of the funds for several reasons: - -- There is already another `dust protection` in place, which distorts the distribution. -- With new use cases enabled by the new `dust protection` (e.g. tokenization, storing arbitrary data in the ledger), the distribution will dramatically change. -- Fittings for other DLT projects do not match because there are transaction fees in place, which decrease the amount of dust outputs in the distribution. - -Another possibility would be to estimate how much percentage of the database will be used for outputs with minimum required deposit (`fund sparsity percentage`) in the future. The remaining IOTA coins can be ignored in that case to simplify the calculation. Since a fund sparsity percentage of less than 20% would already be bad for other upcoming protocol features like the mana calculation, we could take this value for our calculation instead of the worst case. - -### Weights for different outputs - -Output types contain several mandatory and optional fields. Every field itself creates individual computational and storage requirements for the node, which is considered by having different weights for every field. - -##### Field types - -The following table describes different field types in an output: - - - - - - - - - - - - - - - - - - - - -
      NameDescriptionWeightReasoning
      keyCreates a key lookup in the database.10.0Keys need to be stored in the LSM tree of the key-value database engine and need to be merged and leveled, which is computational-, memory- and read/write IO-wise a heavy task.
      dataPlain binary data on disk.1.0Data is stored as the value in the key-value database, and therefore only consumes disc space.
      - -TIPs that define new output types may define additional weights based on the storage and computational requirements that the affected fields induce for the node. However, the weights defined here should take precedence whenever possible and inform the newly defined weights. - -| :warning: Protocol parameters are not set yet | -| ---------------------------------------------- | - -Protocol parameters presented in this document are design parameters that will change in the future based on simulation results, benchmarking and security assumptions. The reader should not take these values as definitive. - -An example of such parameter for example is the `weight` assigned to different output field types. - -### Microtransactions - -#### Microtransactions on Layer 1 - -To enable microtransactions on Layer 1 and still satisfy the `min_deposit_of_output` requirement, a new mechanism called `conditional sending` is introduced with [TIP-38](../TIP-0038/tip-0038.md). - -![Microtransactions on Layer 1](assets/microtransactions_pt3_layer1.png) - -The preceding picture shows the process of the `conditional sending` mechanism. Alice uses the `Basic Output` ([TIP-41](../TIP-0041/tip-0041.md)) to send a microtransaction of 1 IOTA to Bob's `Address`. To fulfill the `min_deposit_of_output` requirement, the `Amount` is increased by `min_deposit_of_output` IOTA, which is 1 MIOTA in the above example. To prevent Bob from accessing these additional funds called the `storage deposit`, Alice adds the optional `Storage Deposit Return Unlock Condition` to the `Basic Output`. Now Bob can only consume the newly created output, if the unlocking transaction deposits the specified `Return Amount` IOTA coins, in this case 1 MIOTA, to the `Return Address` value defined by Alice. By consuming another UTXO and adding its amount to the received 1 IOTA, Bob takes care to create a valid output according to the dust protection rules. - -To prevent Bob from blocking access to the `storage deposit` forever, Alice specifies the additional `Expiration Unlock Condition` in the `Basic Output`. If Bob does not consume the output before the time window defined by Alice expires, Alice regains total control over the output. - -This means that there is no risk for Alice to lose the `storage deposit`, because either Bob needs to return the specified `Return Amount`, or the ownership of the created output switches back to Alice after the specified time-window has expired. - -This mechanism can also be used to transfer native tokens or on-chain requests to ISCP chains without losing control over the required `storage deposit`. - -#### Microtransactions on Layer 2 - -Another solution is to outsource microtransactions to Layer 2 applications like smart contracts. In Layer 2 there are no restrictions regarding the minimum balance of an output. - -![Microtransactions on Layer 2](assets/microtransactions_pt3_layer2.png) - -In this example, Alice sends funds to a smart contract chain on Layer 1 with an output that covers at least `min_deposit_of_output`. From this point on, Alice can send any number of off-chain requests to the smart contract chain, causing the smart contract to send microtransactions from Alice' on-chain account to Bob's on-chain account. Bob can now request his on-chain account balances to be withdrawn to his Layer 1 address. The last step can also be combined with the formerly introduced `conditional sending` mechanism, in case Bob wants to withdraw less than `min_deposit_of_output` IOTA coins or native assets. - -## Copyright - -Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). From 41743396f0a714e0fd19519a07d8898bf0766068 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 17 Oct 2023 12:33:11 +0100 Subject: [PATCH 51/92] Revert changes to README and TIP-19 --- README.md | 1 - tips/TIP-0019/tip-0019.md | 1 - 2 files changed, 2 deletions(-) diff --git a/README.md b/README.md index fd4f081c3..b1da09f1d 100644 --- a/README.md +++ b/README.md @@ -69,7 +69,6 @@ more improvements. Browse the [list of TIPs](#list-of-tips) below with the _Star | 34 | [Wotsicide (Stardust update)](tips/TIP-0034/tip-0034.md) | Define migration from legacy W-OTS addresses to post-Chrysalis networks. Replaces TIP-17. | Standards | Core | Proposed | **Stardust** | | 35 | [Local Snapshot File Format (Stardust Update)](tips/TIP-0035/tip-0035.md) | File format to export/import ledger state. Replaces TIP-9. | Standards | Interface | Proposed | **Stardust** | | 37 | [Dynamic Proof-of-Work](https://github.com/iotaledger/tips/pull/81) | Dynamically adapt the PoW difficulty | Standards | Core | Draft | **Stardust** | -| 47 | [Storage Deposit Dust Protection (IOTA 2.0)](tips/TIP-0047/tip-0047.md) | Prevent bloating the ledger size with dust outputs | Standards | Core | Draft | **IOTA 2.0** | ## Need help? diff --git a/tips/TIP-0019/tip-0019.md b/tips/TIP-0019/tip-0019.md index 91dfb1058..a63145875 100644 --- a/tips/TIP-0019/tip-0019.md +++ b/tips/TIP-0019/tip-0019.md @@ -10,7 +10,6 @@ layer: Core created: 2021-11-04 requires: TIP-18, TIP-20, TIP-21 and TIP-22 replaces: TIP-15 -superseded-by: TIP-47 --- ## Summary From 14127dfa5154ca2b453f7d40468ed1a84e4e707a Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Fri, 20 Oct 2023 17:49:35 +0800 Subject: [PATCH 52/92] Update to latest iota.go --- tips/TIPS-API/asyncapi3.yaml | 159 ++++++++++++------------------- tips/TIPS-API/openapi3-core.yaml | 22 +++-- 2 files changed, 76 insertions(+), 105 deletions(-) diff --git a/tips/TIPS-API/asyncapi3.yaml b/tips/TIPS-API/asyncapi3.yaml index 4669b8755..83ff59467 100644 --- a/tips/TIPS-API/asyncapi3.yaml +++ b/tips/TIPS-API/asyncapi3.yaml @@ -300,14 +300,21 @@ components: payload: type: object required: - - index - - rootsId + - protocolVersion + - slot - previousCommitmentId + - rootsId + - cumulativeWeight + - referenceManaCost properties: - index: - type: string + protocolVersion: + type: integer + description: The protocol version of the node. + example: 1 + slot: + type: integer description: The slot index of the commitment. - example: '200' + example: 200 previousCommitmentId: type: string description: The commitment identifier of the previous slot. @@ -324,6 +331,10 @@ components: It is just an indication of "committed into" this slot, and can not strictly be used for evaluating the switching of a chain. example: '78901' + referenceManaCost: + type: string + description: The reference mana cost of the slot. + example: '12345' CommitmentPayloadSerialized: contentType: application/vnd.iota.serializer-v1 @@ -404,15 +415,21 @@ components: example: failed blockFailureReason: type: integer - enum: [1,2,3,4,5,6] + enum: [1,2,3,4,5,6,7,8,9,10,11,255] description: | Values: * `1` - denotes that the block is too old to issue. * `2` - denotes that the block's parents are too old. * `3` - denotes that one of block's parents does not exist. * `4` - denotes that one of block's parents is invalid. - * `5` - denotes that the block is dropped due to congestion. - * `6` - denotes that the block is invalid. + * `5` - denotes that the issuer account could not be found. + * `6` - denotes that the block version is invalid to retrieve the corresponding protocol information. + * `7` - denotes that the Mana cost could not be calculated. + * `8` - denotes that the issuer account burned insufficient Mana for the block. + * `9` - denotes that the account is invalid, e.g. the account has negative Block Issuance Credits, or the account has expired. + * `10` - denotes that the signature is invalid. + * `11` - denotes that the block is dropped due to congestion. + * `255` - denotes that the block is invalid. txFailureReason: type: integer enum: [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,255] @@ -443,23 +460,6 @@ components: example: 1 schemas: - NativeToken: - description: A native token and its balance in the output. - properties: - tokenId: - type: string - description: >- - Hex-encoded identifier of the native token that equals the foundryId - of the controlling foundry. - example: >- - 0x08de3fa7acc30ec899bb797b1d80680690b54a1cdb78b2f7f50b1ad073e74c8cbd0100000000 - amount: - type: string - description: Amount of native tokens (up to uint256). Hex encoded number. - example: '0xc8' - required: - - tokenId - - amount Ed25519Address: description: The Ed25519 address. properties: @@ -554,11 +554,11 @@ components: - $ref: '#/components/schemas/AccountAddress' - $ref: '#/components/schemas/NFTAddress' amount: - type: integer + type: string description: >- Amount of IOTA tokens the consuming transaction should deposit to the address defined in Return Address. - example: 50 + example: "50" required: - type - returnAddress @@ -587,7 +587,7 @@ components: type: integer description: Set to value 2 to denote a Timelock Unlock Condition. example: 2 - slotIndex: + slot: type: integer description: >- The slot index until which the timelock applies (inclusive) @@ -595,7 +595,7 @@ components: exclusiveMinimum: 0 required: - type - - slotIndex + - slot ExpirationUnlockCondition: description: >- @@ -612,7 +612,7 @@ components: - $ref: '#/components/schemas/Ed25519Address' - $ref: '#/components/schemas/AccountAddress' - $ref: '#/components/schemas/NFTAddress' - slotIndex: + slot: type: integer description: >- The slot index at which the expiration happens. @@ -621,7 +621,7 @@ components: required: - type - returnAddress - - slotIndex + - slot StateControllerAddressUnlockCondition: description: Can be unlocked by unlocking the address. @@ -716,10 +716,10 @@ components: description: Set to value 5 to denote a Staking Feature. example: 5 stakedAmount: - type: integer + type: string description: The amount of IOTA coins that are locked and staked in the containing account. fixedCost: - type: integer + type: string description: Indicates when the BlockIssuerKeys are expired. startEpoch: type: integer @@ -800,20 +800,18 @@ components: properties: type: type: integer - description: Set to value 3 to denote a Basic Output. - example: 3 + description: Set to value 0 to denote a Basic Output. + example: 0 amount: type: string description: >- The amount of IOTA tokens to deposit with this BasicOutput output. Encoded as plain string. example: '100' - nativeTokens: - type: array - description: Native tokens held by the otuput. - items: - anyOf: - - $ref: '#/components/schemas/NativeToken' + mana: + type: string + description: The stored mana held by the output. + example: '3000' unlockConditions: type: array description: >- @@ -835,15 +833,10 @@ components: - $ref: '#/components/schemas/SenderFeature' - $ref: '#/components/schemas/MetadataFeature' - $ref: '#/components/schemas/TagFeature' - mana: - type: string - description: The stored mana held by the output. - example: '3000' required: - type - amount - mana - - unlockConditions AccountOutput: description: >- @@ -852,20 +845,18 @@ components: properties: type: type: integer - description: Set to value 4 to denote an Account Output. - example: 4 + description: Set to value 1 to denote an Account Output. + example: 1 amount: type: string description: >- The amount of IOTA tokens to deposit with this output. Encoded as plain string. example: '100' - nativeTokens: - type: array - description: Native tokens held by the otuput. - items: - anyOf: - - $ref: '#/components/schemas/NativeToken' + mana: + type: string + description: The stored mana held by the output. + example: '3000' accountId: type: string description: >- @@ -920,10 +911,6 @@ components: anyOf: - $ref: '#/components/schemas/IssuerFeature' - $ref: '#/components/schemas/MetadataFeature' - mana: - type: string - description: The stored mana held by the output. - example: '3000' required: - type - amount @@ -939,8 +926,8 @@ components: properties: type: type: integer - description: Set to value 7 to denote a Delegation Output. - example: 7 + description: Set to value 5 to denote a Delegation Output. + example: 5 amount: type: string description: >- @@ -955,21 +942,21 @@ components: description: >- The identifier for this delegation output. example: '0x1505ec099896ab05d9e08fbc7101ae4dff0093b3943b28f789ed2ca728bcc8d6' - validatorId: + validatorAddress: type: string description: >- The Account ID of the validator to which this output is delegating. example: '0x1505ec099896ab05d9e08fbc7101ae4dff0093b3943b28f789ed2ca728bcc8d6' startEpoch: - type: string + type: integer description: >- The index of the first epoch for which this output delegates. - example: '10' + example: 10 endEpoch: - type: string + type: integer description: >- The index of the last epoch for which this output delegates. - example: '12' + example: 12 unlockConditions: type: array description: >- @@ -983,7 +970,7 @@ components: - amount - delegatedAmount - delegationId - - validatorId + - validatorAddress - startEpoch - endEpoch @@ -1000,12 +987,6 @@ components: The amount of IOTA tokens to deposit with this output. Encoded as plain string. example: '100' - nativeTokens: - type: array - description: Native tokens held by the otuput. - items: - anyOf: - - $ref: '#/components/schemas/NativeToken' serialNumber: type: integer description: >- @@ -1063,12 +1044,10 @@ components: The amount of IOTA tokens to deposit with this output. Encoded as plain string. example: '100' - nativeTokens: - type: array - description: Native tokens held by the otuput. - items: - anyOf: - - $ref: '#/components/schemas/NativeToken' + mana: + type: string + description: The stored mana held by the output + example: '3000' nftId: type: string description: >- @@ -1108,10 +1087,6 @@ components: anyOf: - $ref: '#/components/schemas/IssuerFeature' - $ref: '#/components/schemas/MetadataFeature' - mana: - type: string - description: The stored mana held by the output - example: '3000' required: - type - amount @@ -1170,10 +1145,6 @@ components: type: boolean description: Whether the output is spent or not. example: true - spentSlot: - type: integer - description: The slot at which the output was spent. - example: 20 commitmentIdSpent: type: string description: The commitment ID of the slot at which this output was spent. @@ -1182,23 +1153,17 @@ components: type: string description: The transaction this output was spent with. example: '0xe526f8b1c856d4e844cc734bbe095429fb880ec4d93f3ccffe3b292a7de17be7' - includedSlot: - type: integer - description: The slot at which the output was included into the ledger. - example: 15 includedCommitmentId: type: string description: The commitment ID at which the output was included into the ledger. example: '0xe526f8b1c856d4e844cc734bbe095429fb880ec4d93f3ccffe3b292a7de17be7' - ledgerIndex: - type: integer - description: The current ledger index for which the request was made. - example: 25 + latestCommitmentId: + type: string + description: The current latest commitment id for which the request was made. + example: '0xe526f8b1c856d4e844cc734bbe095429fb880ec4d93f3ccffe3b292a7de17be7' required: - blockId - transactionId - outputIndex - isSpent - - includedSlot - - includedCommitmentId - - ledgerIndex + - latestCommitmentId diff --git a/tips/TIPS-API/openapi3-core.yaml b/tips/TIPS-API/openapi3-core.yaml index d6289c9b4..5b6fc18d9 100644 --- a/tips/TIPS-API/openapi3-core.yaml +++ b/tips/TIPS-API/openapi3-core.yaml @@ -1967,7 +1967,7 @@ components: - amount - delegatedAmount - delegationId - - validatorId + - validatorAddress - startEpoch - endEpoch @@ -3033,10 +3033,10 @@ components: Commitment: description: An object embedded to a block, containing a summary of a slot. properties: - version: + protocolVersion: type: integer description: The version of the protocol running. - index: + slot: type: integer description: The slot index of the commitment. previousCommitmentId: @@ -3122,15 +3122,21 @@ components: description: If 'pending', the block contains not yet included transaction. If 'confirmed' means transaction is confirmed with the first level of knowledge. If 'finalized' means transaction is included and cannot be reverted anymore. If 'failed' means transaction is not successfully issued due to failure reason. blockFailureReason: type: integer - enum: [1,2,3,4,5,6] - description: > + enum: [1,2,3,4,5,6,7,8,9,10,11,255] + description: | Values: * `1` - denotes that the block is too old to issue. - * `2` - denotes that one of block's parents is too old. + * `2` - denotes that the block's parents are too old. * `3` - denotes that one of block's parents does not exist. * `4` - denotes that one of block's parents is invalid. - * `5` - denotes that the block is dropped due to congestion. - * `6` - denotes that the block is invalid. + * `5` - denotes that the issuer account could not be found. + * `6` - denotes that the block version is invalid to retrieve the corresponding protocol information. + * `7` - denotes that the Mana cost could not be calculated. + * `8` - denotes that the issuer account burned insufficient Mana for the block. + * `9` - denotes that the account is invalid, e.g. the account has negative Block Issuance Credits, or the account has expired. + * `10` - denotes that the signature is invalid. + * `11` - denotes that the block is dropped due to congestion. + * `255` - denotes that the block is invalid. transactionFailureReason: type: integer enum: [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,255] From dbd418b980b5205b40d1e976e5a89bfdeef5dbd7 Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Sat, 21 Oct 2023 16:25:35 +0800 Subject: [PATCH 53/92] Add BlockFailure 12 --- tips/TIPS-API/asyncapi3.yaml | 3 ++- tips/TIPS-API/openapi3-core.yaml | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/tips/TIPS-API/asyncapi3.yaml b/tips/TIPS-API/asyncapi3.yaml index 83ff59467..8c4687003 100644 --- a/tips/TIPS-API/asyncapi3.yaml +++ b/tips/TIPS-API/asyncapi3.yaml @@ -415,7 +415,7 @@ components: example: failed blockFailureReason: type: integer - enum: [1,2,3,4,5,6,7,8,9,10,11,255] + enum: [1,2,3,4,5,6,7,8,9,10,11,12,255] description: | Values: * `1` - denotes that the block is too old to issue. @@ -429,6 +429,7 @@ components: * `9` - denotes that the account is invalid, e.g. the account has negative Block Issuance Credits, or the account has expired. * `10` - denotes that the signature is invalid. * `11` - denotes that the block is dropped due to congestion. + * `12` - denotes that the payload is invalid. * `255` - denotes that the block is invalid. txFailureReason: type: integer diff --git a/tips/TIPS-API/openapi3-core.yaml b/tips/TIPS-API/openapi3-core.yaml index 5b6fc18d9..3f49ae914 100644 --- a/tips/TIPS-API/openapi3-core.yaml +++ b/tips/TIPS-API/openapi3-core.yaml @@ -3122,7 +3122,7 @@ components: description: If 'pending', the block contains not yet included transaction. If 'confirmed' means transaction is confirmed with the first level of knowledge. If 'finalized' means transaction is included and cannot be reverted anymore. If 'failed' means transaction is not successfully issued due to failure reason. blockFailureReason: type: integer - enum: [1,2,3,4,5,6,7,8,9,10,11,255] + enum: [1,2,3,4,5,6,7,8,9,10,11,12,255] description: | Values: * `1` - denotes that the block is too old to issue. @@ -3136,6 +3136,7 @@ components: * `9` - denotes that the account is invalid, e.g. the account has negative Block Issuance Credits, or the account has expired. * `10` - denotes that the signature is invalid. * `11` - denotes that the block is dropped due to congestion. + * `12` - denotes that the payload is invalid. * `255` - denotes that the block is invalid. transactionFailureReason: type: integer From ee5eedd5f34e59140bc0a0fccc57b42c52293c41 Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Tue, 24 Oct 2023 17:06:55 +0800 Subject: [PATCH 54/92] Align and update to iota.go --- tips/TIPS-API/asyncapi3.yaml | 37 ++- tips/TIPS-API/openapi3-core.yaml | 406 +++++++++++++++++----------- tips/TIPS-API/openapi3-indexer.yaml | 78 +++--- 3 files changed, 319 insertions(+), 202 deletions(-) diff --git a/tips/TIPS-API/asyncapi3.yaml b/tips/TIPS-API/asyncapi3.yaml index 8c4687003..1cfdbe51f 100644 --- a/tips/TIPS-API/asyncapi3.yaml +++ b/tips/TIPS-API/asyncapi3.yaml @@ -337,7 +337,7 @@ components: example: '12345' CommitmentPayloadSerialized: - contentType: application/vnd.iota.serializer-v1 + contentType: application/vnd.iota.serializer-v2 description: The commitment in its serialized form. payload: type: string @@ -360,13 +360,14 @@ components: description: Hex encoded identifier of the slot commitment. example: '0x7a09324557e9200f39bf493fc8fd6ac43e9ca750c6f6d884cc72386ddcb7d695' Block: - contentType: application/vnd.iota.serializer-v1 + contentType: application/vnd.iota.serializer-v2 description: The block in its serialized binary form. payload: type: string format: binary example: >- 0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eb000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000020000016920b176f613ec7be59e68fc68f597eb3393af80f74c7c3db78198147d5f1f92640000000000000000018afe1f314622cc1ef52f16d619d1baccff81816b7e4e35fe268dc247b730acd65d5d2dd3f7df09000000000001000001f7868ab6bb55800b77b8b74191ad8285a9bf428ace579d541fda47661803ff44e0af5c34ad4edf475a01fb46e089a7afcab158b4a0133f32e889083e1c77eef65548933e0c6d2c3b0ac006cd77e77d778bf37b8d38d219fb62a9a2f718d4c9095100000000000000 + OutputPayload: contentType: application/json payload: @@ -382,6 +383,9 @@ components: - $ref: '#/components/schemas/FoundryOutput' - $ref: '#/components/schemas/NFTOutput' - $ref: '#/components/schemas/DelegationOutput' + outputIdProof: + oneOf: + - $ref: '#/components/schemas/OutputIdProof' BlockMetadata: contentType: application/json @@ -404,7 +408,7 @@ components: - finalized - rejected - failed - txState: + transactionState: type: string description: The inclusion state of the transaction. enum: @@ -431,7 +435,7 @@ components: * `11` - denotes that the block is dropped due to congestion. * `12` - denotes that the payload is invalid. * `255` - denotes that the block is invalid. - txFailureReason: + transactionFailureReason: type: integer enum: [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,255] description: | @@ -1094,6 +1098,31 @@ components: - nftId - mana + OutputIdProof: + description: The proof of the output identifier. + properties: + slot: + type: integer + description: The slot index of the output. + example: 20 + outputIndex: + type: integer + description: The index of the output. + example: 0 + transactionCommitment: + type: string + description: The commitment of the transaction that created the output. Hex-encoded with 0x prefix. + example: '0x897dr69bfa60c8cf80afd730741862d200405d5df7cabfe9b564361dce1f7036' + outputCommitmentProof: + type: string + description: The proof of the output commitment. Hex-encoded with 0x prefix. + example: '0xd3a0a0c76ab2d9b406a32c30c43e102fe0f39a12a3f6c1e3b19d239db2f18d75' + required: + - slot + - outputIndex + - transactionCommitment + - outputCommitmentProof + Ed25519Signature: description: Ed25519Signature defines an Ed25519 signature. properties: diff --git a/tips/TIPS-API/openapi3-core.yaml b/tips/TIPS-API/openapi3-core.yaml index 3f49ae914..77d5c0866 100644 --- a/tips/TIPS-API/openapi3-core.yaml +++ b/tips/TIPS-API/openapi3-core.yaml @@ -364,6 +364,14 @@ paths: summary: Return information that is used to attach a block in the network. description: >- Return information that is used to attach a block in the network, which includes parents, last finalized slot index and the latest commitment the node created. + parameters: + - in: query + name: slotIndex + schema: + type: integer + example: 1 + required: false + description: The slot index of the commitment and reference mana cost to query. responses: '200': description: "Successful operation." @@ -399,25 +407,20 @@ paths: - blocks summary: Submit a block. description: >- - Submit a block or a payload. This endpoint will return the identifier of the built block. `protocolVersion` is always required! + Submit a block or a payload. This endpoint will return the identifier of the built block. Only full block is accepted. requestBody: content: application/json: schema: $ref: '#/components/schemas/SubmitBlockRequest' examples: - Minimal block with Tagged Data Payload: - $ref: "#/components/examples/post-tagged-data-block-request-example-minimal" Full block with Tagged Data Payload: $ref: >- #/components/examples/post-tagged-data-block-request-example-full - Minimal Block with Transaction Payload: - $ref: >- - #/components/examples/post-transaction-block-request-example-minimal Full block with Transaction Payload: $ref: >- #/components/examples/post-transaction-block-request-example-full - application/vnd.iota.serializer-v1: + application/vnd.iota.serializer-v2: schema: type: string format: binary @@ -498,7 +501,7 @@ paths: Validation Block: $ref: >- #/components/examples/get-block-by-id-validation-response-example - application/vnd.iota.serializer-v1: + application/vnd.iota.serializer-v2: schema: type: string format: binary @@ -623,7 +626,7 @@ paths: examples: default: $ref: '#/components/examples/get-outputs-by-id-response-example' - application/vnd.iota.serializer-v1: + application/vnd.iota.serializer-v2: schema: type: string format: binary @@ -707,7 +710,58 @@ paths: application/json: schema: $ref: '#/components/schemas/InternalErrorResponse' - + '/api/core/v3/outputs/{outputId}/full': + get: + tags: + - UTXO + summary: Returns metadata about an output and the output structure by its identifier. + description: Returns the output structure and metadata by its identifier. + parameters: + - in: path + name: outputId + schema: + type: string + required: true + description: >- + Identifier of the output encoded in hex. An output is identified by + the concatenation of `transactionId+outputIndex` where `outputIndex` (u16) needs to be converted to little endian first. + Hex-encoded with 0x prefix. + example: "0xfa0de75d225cca2799395e5fc340702fc7eac821d2bdd79911126f131ae097a20100" + responses: + '200': + description: "Successful operation." + content: + application/json: + schema: + $ref: '#/components/schemas/OutputWithMetadataResponse' + examples: + unspent: + $ref: '#/components/examples/get-full-output-metadata-example' + '400': + description: "Unsuccessful operation: indicates that the provided data is invalid." + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + '403': + description: "Unsuccessful operation: indicates that the endpoint is not available for public use." + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenResponse' + '404': + description: "Unsuccessful operation: indicates that the requested data was not found." + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + '500': + description: "Unsuccessful operation: indicates that an unexpected, internal server error happened which prevented the node from fulfilling the request." + content: + application/json: + schema: + $ref: '#/components/schemas/InternalErrorResponse' + '/api/core/v3/transactions/{transactionId}/included-block': get: tags: @@ -732,7 +786,7 @@ paths: examples: default: $ref: '#/components/examples/get-block-by-id-transaction-response-example' - application/vnd.iota.serializer-v1: + application/vnd.iota.serializer-v2: schema: type: string format: binary @@ -844,7 +898,7 @@ paths: default: $ref: >- #/components/examples/get-commitment-response-example - application/vnd.iota.serializer-v1: + application/vnd.iota.serializer-v2: schema: type: string format: binary @@ -936,7 +990,7 @@ paths: - in: path name: index schema: - type: number + type: integer example: 154862 required: true description: Index of the commitment to look up. @@ -951,7 +1005,7 @@ paths: default: $ref: >- #/components/examples/get-commitment-response-example - application/vnd.iota.serializer-v1: + application/vnd.iota.serializer-v2: schema: type: string format: binary @@ -994,7 +1048,7 @@ paths: - in: path name: index schema: - type: number + type: integer example: 154862 required: true description: Index of the commitment to look up. @@ -1068,14 +1122,14 @@ components: version: 3 networkName: iota-core-testnet bech32Hrp: rms - rentParameters: + storageScoreParameters: storageCost: '500' - storageScoreFactorData: 1 - storageScoreOffsetOutput: '10' - storageScoreOffsetEd25519BlockIssuerKey: '100' - storageScoreOffsetStakingFeature: '100' - storageScoreOffsetDelegation: '100' - workScoreStructure: + factorData: 1 + offsetOutputOverhead: '10' + offsetEd25519BlockIssuerKey: '100' + offsetStakingFeature: '100' + storageScoreOffoffsetDelegationsetDelegation: '100' + workScoreParameters: dataByte: 0 block: 100 input: 20 @@ -1090,7 +1144,7 @@ components: genesisUnixTimestamp: "1692966168" slotDurationInSeconds: 10 slotsPerEpochExponent: 13 - manaStructure: + manaParameters: bitsCount: 63 generationRate: 1 generationRateExponent: 0 @@ -1122,7 +1176,6 @@ components: windowTargetRatio: 5 activationOffset: 7 rewardsParameters: - validatorBlocksPerSlot: 10 profitMarginExponent: 8 bootstrappinDuration: 1154 manaShareCoefficient: "2" @@ -1152,8 +1205,8 @@ components: - "0xf15b2ec698e396c9d2e69bc753246631aedebb657da09ba0e0c8d42518a1e8953e00000000000000" latestFinalizedSlot: 1422 commitment: - version: 3 - index: 1432 + protocolVersion: 3 + slot: 1432 previousCommitmentId: "0xbf07dc16986166953f5a72c19d78642aab6cbde63964a2369ec3d425144eb42b3800000000000000" rootsId: "0xa4dd36465af63d495d35a05f592d42a51511c153e1bae8fad00453c8cbb48727" cumulativeWeight: '45678' @@ -1192,59 +1245,6 @@ components: transactionState: "failed" transactionFailureReason: 2 - post-tagged-data-block-request-example-minimal: - value: - protocolVersion: 3 - block: - type: 0 - payload: - type: 5 - tag: "0x72616e646f6d207461673a206769746875622e636f6d" - data: "0x5468697320697320616e206578616d706c6520746578742077616c6c20776974682070726f746f636f6c20332e" - - post-transaction-block-request-example-minimal: - value: - protocolVersion: 3 - block: - type: 0 - payload: - type: 6 - transaction: - type: 1 - networkId: "1337133713371337" - creationSlot: 1692966292150937822 - contextInputs: - - type: 1 - commitmentId: "0x0e6c2998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a79" - inputs: - - type: 0 - transactionId: "0x0c78e998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a79" - transactionOutputIndex: 0 - - type: 0 - transactionId: "0x309b169bfa60c8cf80afd730741862d200405d5df7cabfe9b564361dce1f7036" - transactionOutputIndex: 0 - - type: 0 - transactionId: "0xc138ecdc882010245e9574fbc1f1f43cc7c182fa890e46e018365dd49de0f16e" - transactionOutputIndex: 0 - outputs: - - type: 0 - amount: "50000000" - unlockConditions: - - type: 0 - address: - type: 0 - pubKeyHash: "0xd49931814e6bfbb8e221f1b2936e206e5a6b6abeb9c070f8603814c525c9abe3" - unlocks: - - type: 0 - signature: - type: 0 - publicKey: "0x40d0c00fd629a5f528e4bcab4333926a90d06613a3f36a325defcdaf4c9e4092" - signature: "0xed4a63a3e1b22c85f9813b00a21c8576ed72c1f5bc939d01fcea7dcd678c2d0d8d80a2499965d8ce5574c9e92aa0d42b72b969bab3a2a35fe7dbc64659a0d703" - - type: 1 - reference: 0 - - type: 1 - reference: 0 - post-tagged-data-block-request-example-full: value: protocolVersion: 3 @@ -1261,10 +1261,10 @@ components: weakParents: [] shallowLikeParents: [] payload: - type: 5 + type: 0 tag: "0x4143544956495459" data: "" - maxBurnedMana: "0" + maxBurnedMana: "500" signature: type: 0 publicKey: "0x05c1de274451db8de8182d64c6ee0dca3ae0c9077e0b4330c976976171d79064" @@ -1274,7 +1274,7 @@ components: value: protocolVersion: 3 networkId: "0" - issuingTime: "2023-07-31T13:14:57.310104314Z" + issuingTime: "1692966293697706488" slotCommitmentId: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000" latestFinalizedSlot: 0 issuerId: "0x375358f92cc94750669598b0aaa55a6ff73310b90710e1fad524c0f911be0fea" @@ -1290,9 +1290,8 @@ components: - "0x0276d29ec6b3cbbf3ed6d1f01af8e29b9c6a9ee9c9375e8e5b5b5c5b5b5d45580000000000000000" - "0x70a5ce5d8fc3290a9885b1af5d8766d51db89a67a6a839f6d23a6cb8d6f3b6e30000000000000000" payload: - type: 6 + type: 1 transaction: - type: 1 networkId: "1337133713371337" creationSlot: 1649442459 contextInput: @@ -1310,7 +1309,7 @@ components: transactionOutputIndex: 0 allotments: - accountID: "0x030440433d7a726322151f735a6e72543e5b26142d68157d25746a6e45260f37" - value: "5285" + mana: "5285" capabilities: "" outputs: - type: 0 @@ -1331,7 +1330,7 @@ components: reference: 0 - type: 1 reference: 0 - maxBurnedMana: "105368" + maxBurnedMana: "105368" signature: type: 0 publicKey: "0x05c1de274451db8de8182d64c6ee0dca3ae0c9077e0b4330c976976171d79064" @@ -1339,7 +1338,7 @@ components: get-committee-example: value: - epochIndex: 10 + epoch: 10 totalStake: '900000000' totalValidatorStake: '60000000' committee: @@ -1356,41 +1355,44 @@ components: value: validators: - accountId: "0x309b169bfa60c8cf80afd730741862d200405d5df7cabfe9b564361dce1f7036" - stakingEndEpoch: 100 + stakingEpochEnd: 100 poolStake: '200000' validatorStake: '100000' fixedCost: '50000' active: false latestSupportedProtocolVersion: 3 + latestSupportedProtocolHash: "0x0c00425134785bf2dbe42e4ec7e288009ebdc38ced797beaa45d5213092021cb" - accountId: "0x897dr69bfa60c8cf80afd730741862d200405d5df7cabfe9b564361dce1f7036" - stakingEndEpoch: 10 + stakingEpochEnd: 10 poolStake: '205000' validatorStake: '90000' fixedCost: '52000' active: true latestSupportedProtocolVersion: 3 + latestSupportedProtocolHash: "0x0c00425134785bf2dbe42e4ec7e288009ebdc38ced797beaa45d5213092021cb" pageSize: 50 cursor: "" get-validator-example: value: accountId: "0x897dr69bfa60c8cf80afd730741862d200405d5df7cabfe9b564361dce1f7036" - stakingEndEpoch: 100 + stakingEpochEnd: 100 poolStake: '205000' validatorStake: '90000' fixedCost: '52000' active: true latestSupportedProtocolVersion: 3 + latestSupportedProtocolHash: "0x0c00425134785bf2dbe42e4ec7e288009ebdc38ced797beaa45d5213092021cb" get-mana-rewards-example: value: - startEpoch: 60 - endEpoch: 80 + epochStart: 60 + epochEnd: 80 rewards: '800000' get-congestion-estimate-response-example: value: - slotIndex: 20 + slot: 20 ready: true referenceManaCost: '50000' blockIssuanceCredits: '10000000' @@ -1455,7 +1457,7 @@ components: transactionOutputIndex: 0 allotments: - accountID: "0x030440433d7a726322151f735a6e72543e5b26142d68157d25746a6e45260f37" - value: "5285" + mana: "5285" capabilities: "" outputs: - type: 0 @@ -1497,10 +1499,10 @@ components: weakParents: [] shallowLikeParents: [] payload: - type: 5 + type: 0 tag: "0x4143544956495459" data: "" - maxBurnedMana: "0" + maxBurnedMana: "500" signature: type: 0 publicKey: "0x05c1de274451db8de8182d64c6ee0dca3ae0c9077e0b4330c976976171d79064" @@ -1530,14 +1532,21 @@ components: get-outputs-by-id-response-example: value: - type: 3 - amount: "1000" - unlockConditions: - - type: 0 - address: - type: 0 - pubKeyHash: "0x8eaf87ac1f52eb05f2c7c0c15502df990a228838dc37bd18de9503d69afd257d" - mana: "2000" + output: + type: 3 + amount: "1000" + unlockConditions: + - type: 0 + address: + type: 0 + pubKeyHash: "0x8eaf87ac1f52eb05f2c7c0c15502df990a228838dc37bd18de9503d69afd257d" + mana: "2000" + outputIdProof: + slot: 20 + outputIndex: 0 + transactionCommitment: "0x897dr69bfa60c8cf80afd730741862d200405d5df7cabfe9b564361dce1f7036" + outputCommitmentProof: "0xd3a0a0c76ab2d9b406a32c30c43e102fe0f39a12a3f6c1e3b19d239db2f18d75" + get-output-metadata-by-id-response-unspent-example: value: @@ -1548,6 +1557,32 @@ components: includedCommitmentId: "0x7c62d9b9ed3c1f3ef942a7ea17ec1270d77c109f0ba57b6c2d2b9e9fb3e69a3a" latestCommitmentId: "0x7c62d9b9ed3c1f3ef942a7ea17ec1270d77c109f0ba57b6c2d2b9e9fb3e69a3a" + get-full-output-metadata-example: + value: + output: + type: 3 + amount: "1000" + unlockConditions: + - type: 0 + address: + type: 0 + pubKeyHash: "0x8eaf87ac1f52eb05f2c7c0c15502df990a228838dc37bd18de9503d69afd257d" + mana: "2000" + outputIdProof: + slot: 20 + outputIndex: 0 + transactionCommitment: "0x897dr69bfa60c8cf80afd730741862d200405d5df7cabfe9b564361dce1f7036" + outputCommitmentProof: "0xd3a0a0c76ab2d9b406a32c30c43e102fe0f39a12a3f6c1e3b19d239db2f18d75" + metadata: + blockId: "0xd3a0a0c76ab2d9b406a32c30c43e102fe0f39a12a3f6c1e3b19d239db2f18d75" + transactionId: "0x1c52e8e630d1c6e45ab6f46c63d8d6cb02e6c2ed6e31b6c97d6f5c5f5a5d5c5b" + outputIndex: 3 + isSpent: true + commitmentIdSpent: "0x4b91c935926c77d0ac9b4a569c3eb3b0f0c9918f2d4f4d9bb1c7dfc19b41e4c2" + transactionIdSpent: "0x1ee46e19f4219ee65afc10227d0ca22753f76ef32d1e922e5cbe3fbc9b5a5298" + includedCommitmentId: "0x7c62d9b9ed3c1f3ef942a7ea17ec1270d77c109f0ba57b6c2d2b9e9fb3e69a3a" + latestCommitmentId: "0x7c62d9b9ed3c1f3ef942a7ea17ec1270d77c109f0ba57b6c2d2b9e9fb3e69a3a" + get-output-metadata-by-id-response-spent-example: value: blockId: "0xd3a0a0c76ab2d9b406a32c30c43e102fe0f39a12a3f6c1e3b19d239db2f18d75" @@ -1561,7 +1596,8 @@ components: get-commitment-response-example: value: - index: 986 + protocolVersion: 3 + slot: 986 previousCommitmentId: "0x8fb6cbb1ecf02c6b5a6a5a6a5f6c5a6a5f6c5a6a5a6a5a6a5f6c5a6a5a6a5f6c50000000000000000" rootsId: "0xa4dd36465af63d495d35a05f592d42a51511c153e1bae8fad00453c8cbb48727" cumulativeWeight: '78901' @@ -1572,7 +1608,7 @@ components: get-utxo-changes-response-example: value: - index: 789 + slot: 789 createdOutputs: - "0x1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2" - "0x3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4" @@ -1615,6 +1651,13 @@ components: - $ref: '#/components/schemas/Ed25519Signature' required: - protocolVersion + - networkId + - issuingTime + - slotCommitmentId + - latestFinalizedSlot + - issuerId + - block + - signature BasicBlock: description: A basic block is the object that can carry arbitrary payload, such as a tagged data payload ostringr a transaction. @@ -1766,7 +1809,7 @@ components: accountId: type: string description: The account ID to allot the mana to. - value: + mana: type: string description: The amount of mana to allot. @@ -1970,7 +2013,6 @@ components: - validatorAddress - startEpoch - endEpoch - FoundryOutput: description: Describes a foundry output that is controlled by an account. @@ -2429,6 +2471,7 @@ components: description: The optional data to attach. This may have a length of 0. Hex-encoded with 0x prefix. required: - type + - data ErrorResponse: description: The error format. @@ -2608,7 +2651,7 @@ components: - decimals - useMetricPrefix features: - description: The features that are supported by the node. For example, a node could support the feature, which would allow the BIC to be included by the node account. All features must be lowercase. + description: The features that are supported by the node. All features must be lowercase. type: array items: type: string @@ -2642,36 +2685,36 @@ components: bech32Hrp: type: string description: Tells whether the node supports mainnet or testnet addresses. Value `iota` indicates that the node supports mainnet addresses. Value `atoi` indicates that the node supports testnet addresses. - rentParameters: + storageScoreParameters: description: The rent structure according to TIP-19. properties: storageCost: description: Defines the number of IOTA tokens required per unit of storage score. type: string - storageScoreFactorData: + factorData: description: Defines the factor to be used for data only fields. type: integer - storageScoreOffsetOutput: + offsetOutputOverhead: description: Defines the offset to be used for key/lookup generating fields. type: string - storageScoreOffsetEd25519BlockIssuerKey: + offsetEd25519BlockIssuerKey: description: Defines the offset to be used for block issuer feature public keys. type: string - storageScoreOffsetStakingFeature: + offsetStakingFeature: description: Defines the offset to be used for staking feature. type: string - storageScoreOffsetDelegation: + offsetDelegation: description: Defines the offset to be used for delegation output. type: string required: - storageCost - - storageScoreFactorData - - storageScoreOffsetOutput - - storageScoreOffsetEd25519BlockIssuerKey - - storageScoreOffsetStakingFeature - - storageScoreOffsetDelegation - workScoreStructure: - description: Work structure lists the Work Score of each type, it is used to denote the computation costs of processing an object. + - factorData + - offsetOutputOverhead + - offsetEd25519BlockIssuerKey + - offsetStakingFeature + - offsetDelegation + workScoreParameters: + description: Work Score Parameters defines the work score parameters used by given node/network. properties: dataByte: description: DataByte accounts for the network traffic per byte. @@ -2726,7 +2769,7 @@ components: slotsPerEpochExponent: type: integer description: The number of slots in an epoch expressed as an exponent of 2. - manaStructure: + manaParameters: description: Mana Structure defines the parameters used by mana calculation. properties: bitsCount: @@ -2788,7 +2831,7 @@ components: description: Congestion Control Parameters defines the parameters used to calculate the Reference Mana Cost (RMC). properties: minReferenceManaCost: - description: RMCMin is the minimum value of the reference Mana cost. + description: Min Reference Mana Cost is the minimum value of the reference Mana cost. type: string increase: description: Increase is the increase step size of the reference Mana cost. @@ -2837,10 +2880,7 @@ components: - activationOffset rewardsParameters: description: Rewards Parameters defines the parameters that are used to calculate the rewards. - properties: - validatorBlocksPerSlot: - type: integer - description: The number of validation blocks that should be issued by a selected validator per slot during its epoch duties. + properties: profitMarginExponent: type: integer description: ProfitMarginExponent is used for shift operation for calculation of profit margin. @@ -2860,7 +2900,6 @@ components: type: integer description: PoolCoefficientExponent is the exponent used for shifting operation in the pool rewards calculations. required: - - validatorBlocksPerSlot - profitMarginExponent - bootstrappingDuration - manaShareCoefficient @@ -2872,20 +2911,14 @@ components: - networkName - bech32Hrp - tokenSupply - - rentParameters - - workScoreStructure + - storageScoreParameters + - workScoreParameters - genesisUnixTimestamp - slotDurationInSeconds - slotsPerEpochExponent - - manaBitsCount - - manaGenerationRate - - manaGenerationRateExponent - - manaDecayFactors - - manaDecayFactorsExponent - - manaDecayFactorEpochsSum - - manaDecayFactorEpochsSumExponent - stakingUnbondingPeriod - livenessThresholdLowerBound + - livenessThresholdUpperBound - minCommittableAge - maxCommittableAge - epochNearingThreshold @@ -2913,10 +2946,10 @@ components: ManaRewardsResponse: description: Returns the mana rewards of an account or delegation output. properties: - startEpoch: + epochStart: type: integer description: The starting epoch index for which the mana rewards are returned. - endEpoch: + epochEnd: type: integer description: The ending epoch index for which the mana rewards are returned, the decay is applied up to this point (inclusive). rewards: @@ -2926,7 +2959,7 @@ components: CommitteeResponse: description: Returns the validator information of the committee. properties: - epochIndex: + epoch: type: integer description: The epoch index of the committee. totalStake: @@ -2964,7 +2997,7 @@ components: accountId: type: string description: The account identifier of the validator - stakingEndEpoch: + stakingEpochEnd: type: integer description: The epoch index until which the validator registered to stake. poolStake: @@ -2982,6 +3015,18 @@ components: latestSupportedProtocolVersion: type: integer description: The latest protocol version the validator supported. + latestSupportedProtocolHash: + type: string + description: The latest protocol hash the validator supported. + required: + - accountId + - stakingEpochEnd + - poolStake + - validatorStake + - fixedCost + - active + - latestSupportedProtocolVersion + - latestSupportedProtocolHash IssuanceBlockHeaderResponse: description: Return information that is used to attach a block in the network. @@ -3010,7 +3055,7 @@ components: CongestionResponse: description: Provides the cost and readiness to issue estimates. properties: - slotIndex: + slot: type: integer description: The slot index for which the congestion estimate is provided. ready: @@ -3024,7 +3069,7 @@ components: type: string description: The Block Issuance Credits of the requested account. required: - - slotIndex + - slot - ready - referenceManaCost - blockIssuanceCredits @@ -3053,6 +3098,13 @@ components: referenceManaCost: type: string description: This field provides the Reference Mana Cost (RMC) to be used in the slot with index Index + Max Committable Age. + required: + - protocolVersion + - slot + - previousCommitmentId + - rootsId + - cumulativeWeight + - referenceManaCost SubmitBlockRequest: description: Submits a block to the node. @@ -3176,12 +3228,62 @@ components: OutputResponse: description: Returns an output. - anyOf: - - $ref: '#/components/schemas/BasicOutput' - - $ref: '#/components/schemas/AccountOutput' - - $ref: '#/components/schemas/FoundryOutput' - - $ref: '#/components/schemas/NFTOutput' - - $ref: '#/components/schemas/DelegationOutput' + properties: + output: + anyOf: + - $ref: '#/components/schemas/BasicOutput' + - $ref: '#/components/schemas/AccountOutput' + - $ref: '#/components/schemas/FoundryOutput' + - $ref: '#/components/schemas/NFTOutput' + - $ref: '#/components/schemas/DelegationOutput' + outputIdProof: + allOf: + - $ref: '#/components/schemas/OutputIdProof' + required: + - output + - outputIdProof + + OutputIdProof: + description: The proof of the output identifier. + properties: + slot: + type: integer + description: The slot index of the output. + outputIndex: + type: integer + description: The index of the output. + transactionCommitment: + type: string + description: The commitment of the transaction that created the output. Hex-encoded with 0x prefix. + outputCommitmentProof: + type: string + description: The proof of the output commitment. Hex-encoded with 0x prefix. + required: + - slot + - outputIndex + - transactionCommitment + - outputCommitmentProof + + OutputWithMetadataResponse: + description: Returns an output. + properties: + output: + anyOf: + - $ref: '#/components/schemas/BasicOutput' + - $ref: '#/components/schemas/AccountOutput' + - $ref: '#/components/schemas/FoundryOutput' + - $ref: '#/components/schemas/NFTOutput' + - $ref: '#/components/schemas/DelegationOutput' + outputIdProof: + allOf: + - $ref: '#/components/schemas/OutputIdProof' + metadata: + allOf: + - $ref: '#/components/schemas/OutputMetadataResponse' + required: + - output + - outputIdProof + - metadata OutputMetadataResponse: description: Returns metadata about an output. @@ -3220,7 +3322,7 @@ components: UTXOChangesResponse: description: Returns all UTXO changes of the given slot. properties: - index: + slot: type: integer description: The slot index of the given slot. createdOutputs: @@ -3236,6 +3338,6 @@ components: type: string description: Hex-encoded with 0x prefix. required: - - index + - slot - createdOutputs - consumedOutputs diff --git a/tips/TIPS-API/openapi3-indexer.yaml b/tips/TIPS-API/openapi3-indexer.yaml index 2c890de2f..d263de7b7 100644 --- a/tips/TIPS-API/openapi3-indexer.yaml +++ b/tips/TIPS-API/openapi3-indexer.yaml @@ -45,17 +45,11 @@ paths: example: true description: Filters outputs based on the presence of native tokens. - in: query - name: minNativeTokenCount - schema: - type: integer - example: 2 - description: Filters outputs that have at least a certain number of distinct native tokens. - - in: query - name: maxNativeTokenCount + name: nativeToken schema: type: integer example: 5 - description: Filters outputs that have at most a certain number of distinct native tokens. + description: Filters outputs that have a certain number of distinct native tokens. - in: query name: hasStorageDepositReturn schema: @@ -136,6 +130,12 @@ paths: type: integer example: 200 description: Return outputs that were created after a certain slot index. + - in: query + name: unlockableByAddress + schema: + type: string + example: iota1qrhacyfwlcnzkvzteumekfkrrwks98mpdm37cj4xx3drvmjvnep6xqgyzyx + description: The address unlock related query parameters. - in: query name: pageSize schema: @@ -216,24 +216,6 @@ paths: type: string example: iota1qrhacyfwlcnzkvzteumekfkrrwks98mpdm37cj4xx3drvmjvnep6xqgyzyx description: Filters outputs based on bech32-encoded sender address. - - in: query - name: hasNativeTokens - schema: - type: boolean - example: true - description: Filters outputs based on the presence of native tokens. - - in: query - name: minNativeTokenCount - schema: - type: integer - example: 2 - description: Filters outputs that have at least a certain number of distinct native tokens. - - in: query - name: maxNativeTokenCount - schema: - type: integer - example: 5 - description: Filters outputs that have at most a certain number of distinct native tokens. - in: query name: createdBefore schema: @@ -246,6 +228,12 @@ paths: type: integer example: 200 description: Return outputs that were created after a certain slot index. + - in: query + name: unlockableByAddress + schema: + type: string + example: iota1qrhacyfwlcnzkvzteumekfkrrwks98mpdm37cj4xx3drvmjvnep6xqgyzyx + description: The address unlock related query parameters. - in: query name: pageSize schema: @@ -359,7 +347,7 @@ paths: example: iota1qrhacyfwlcnzkvzteumekfkrrwks98mpdm37cj4xx3drvmjvnep6xqgyzyx description: The Bech32-encoded address that should be searched for in the Address Unlock Condition of outputs. - in: query - name: validatorId + name: validator schema: type: string example: "0xf532a53545103276b46876c473846d98648ee418468bce76df4868648dd73e5d" @@ -445,17 +433,11 @@ paths: example: true description: Filters outputs based on the presence of native tokens. - in: query - name: minNativeTokenCount - schema: - type: integer - example: 2 - description: Filters outputs that have at least a certain number of distinct native tokens. - - in: query - name: maxNativeTokenCount + name: nativeToken schema: type: integer example: 5 - description: Filters outputs that have at most a certain number of distinct native tokens. + description: Filters outputs that have a certain number of distinct native tokens. - in: query name: createdBefore schema: @@ -599,17 +581,11 @@ paths: example: true description: Filters outputs based on the presence of native tokens. - in: query - name: minNativeTokenCount - schema: - type: integer - example: 2 - description: Filters outputs that have at least a certain number of distinct native tokens. - - in: query - name: maxNativeTokenCount + name: nativeToken schema: type: integer example: 5 - description: Filters outputs that have at most a certain number of distinct native tokens. + description: Filters outputs that have a certain number of distinct native tokens. - in: query name: hasStorageDepositReturn schema: @@ -684,6 +660,12 @@ paths: type: integer example: 200 description: Return outputs that were created after a certain slot index. + - in: query + name: unlockableByAddress + schema: + type: string + example: iota1qrhacyfwlcnzkvzteumekfkrrwks98mpdm37cj4xx3drvmjvnep6xqgyzyx + description: The address unlock related query parameters. - in: query name: pageSize schema: @@ -879,9 +861,12 @@ components: OutputsResponse: description: Returns a list of Output IDs. properties: - ledgerIndex: + committedSlot: type: integer - description: The current ledger index for which the request was made. + description: The committed slot at which these outputs where available at. + pageSize: + type: integer + description: The maximum amount of items returned in one call. If there are more items, a cursor to the next page is returned too. cursor: type: string description: The cursor to use for getting the next page of results. @@ -892,6 +877,7 @@ components: items: type: string required: - - ledgerIndex + - committedSlot + - pageSize - items From bda3636b69b9f1a1b5d877b8ef7f83e2ad6d367d Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 24 Oct 2023 11:24:03 +0100 Subject: [PATCH 55/92] Rename to TIP-0048 --- tips/{TIPS-API => TIP-0048}/asyncapi3.yaml | 0 tips/{TIPS-API => TIP-0048}/openapi3-core.yaml | 0 tips/{TIPS-API => TIP-0048}/openapi3-indexer.yaml | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename tips/{TIPS-API => TIP-0048}/asyncapi3.yaml (100%) rename tips/{TIPS-API => TIP-0048}/openapi3-core.yaml (100%) rename tips/{TIPS-API => TIP-0048}/openapi3-indexer.yaml (100%) diff --git a/tips/TIPS-API/asyncapi3.yaml b/tips/TIP-0048/asyncapi3.yaml similarity index 100% rename from tips/TIPS-API/asyncapi3.yaml rename to tips/TIP-0048/asyncapi3.yaml diff --git a/tips/TIPS-API/openapi3-core.yaml b/tips/TIP-0048/openapi3-core.yaml similarity index 100% rename from tips/TIPS-API/openapi3-core.yaml rename to tips/TIP-0048/openapi3-core.yaml diff --git a/tips/TIPS-API/openapi3-indexer.yaml b/tips/TIP-0048/openapi3-indexer.yaml similarity index 100% rename from tips/TIPS-API/openapi3-indexer.yaml rename to tips/TIP-0048/openapi3-indexer.yaml From 7793a69025f091cdbfb5b858ac7fd384e64b2fee Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Thu, 26 Oct 2023 10:03:20 +0800 Subject: [PATCH 56/92] Add `outputs/` and `delegation/{delegationId}` endpoints --- tips/TIP-0048/openapi3-indexer.yaml | 136 ++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) diff --git a/tips/TIP-0048/openapi3-indexer.yaml b/tips/TIP-0048/openapi3-indexer.yaml index d263de7b7..44b800fc4 100644 --- a/tips/TIP-0048/openapi3-indexer.yaml +++ b/tips/TIP-0048/openapi3-indexer.yaml @@ -25,6 +25,92 @@ tags: - name: nft outputs description: Query NFT Outputs. paths: + /api/indexer/v2/outputs: + get: + tags: + - basic outputs + summary: Returns all types of outputs filtered based on parameters. + description: Returns basic, foundry, account, delegation and nft outputs filtered based on parameters. + parameters: + - in: query + name: hasNativeTokens + schema: + type: boolean + example: true + description: Filters outputs based on the presence of native tokens. + - in: query + name: nativeToken + schema: + type: integer + example: 5 + description: Filters outputs that have a certain number of distinct native tokens. + - in: query + name: createdBefore + schema: + type: integer + example: 200 + description: Return outputs that were created before a certain slot index. + - in: query + name: createdAfter + schema: + type: integer + example: 200 + description: Return outputs that were created after a certain slot index. + - in: query + name: unlockableByAddress + schema: + type: string + example: iota1qrhacyfwlcnzkvzteumekfkrrwks98mpdm37cj4xx3drvmjvnep6xqgyzyx + description: The address unlock related query parameters. + - in: query + name: pageSize + schema: + type: integer + example: 10 + description: The maximum amount of items returned in one call. If there are more items, a cursor to the next page is returned too. + The parameter is ignored when pageSize is defined via the cursor parameter. + - in: query + name: cursor + schema: + type: string + example: 0c78e998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a790200.10 + description: Starts the search from the cursor (createdSlotIndex+outputId.pageSize). + responses: + '200': + description: "Successful operation." + content: + application/json: + schema: + $ref: '#/components/schemas/OutputsResponse' + examples: + Query results in 3 outputs: + $ref: >- + #/components/examples/get-outputs-response-three-example + No matching Output IDs found: + $ref: >- + #/components/examples/get-outputs-empty-response-example + Paging - more items found than it can fit on single page: + $ref: >- + #/components/examples/get-outputs-pagesize2-response-example + '400': + description: "Unsuccessful operation: indicates that the provided data is invalid." + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + '403': + description: "Unsuccessful operation: indicates that the endpoint is not available for public use." + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenResponse' + '500': + description: "Unsuccessful operation: indicates that an unexpected, internal server error happened which prevented the node from fulfilling the request." + content: + application/json: + schema: + $ref: '#/components/schemas/InternalErrorResponse' + /api/indexer/v2/outputs/basic: get: tags: @@ -413,6 +499,56 @@ paths: schema: $ref: '#/components/schemas/InternalErrorResponse' + /api/indexer/v2/outputs/delegation/{delegationId}: + get: + tags: + - delegation outputs + summary: Returns the delegations for the delegationId. + description: Returns the delegations for the delegationId. + parameters: + - in: path + name: delegationId + schema: + type: string + example: "0x1505ec099896ab05d9e08fbc7101ae4dff0093b3943b28f789ed2ca728bcc8d6" + description: Unique identifier of the delegationId. + required: true + responses: + '200': + description: "Successful operation." + content: + application/json: + schema: + $ref: '#/components/schemas/OutputsResponse' + examples: + Query results in single output: + $ref: >- + #/components/examples/get-outputs-response-single-example + '400': + description: "Unsuccessful operation: indicates that the provided data is invalid." + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + '403': + description: "Unsuccessful operation: indicates that the endpoint is not available for public use." + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenResponse' + '404': + description: "Unsuccessful operation: indicates that the requested data was not found." + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + '500': + description: "Unsuccessful operation: indicates that an unexpected, internal server error happened which prevented the node from fulfilling the request." + content: + application/json: + schema: + $ref: '#/components/schemas/InternalErrorResponse' + /api/indexer/v2/outputs/foundry: get: tags: From 6d60b98992436244d70aea44a8c543bb212e0f99 Mon Sep 17 00:00:00 2001 From: Alexander Sporn Date: Thu, 26 Oct 2023 18:00:17 +0200 Subject: [PATCH 57/92] Added tx capabilties failure reasons --- tips/TIP-0048/openapi3-core.yaml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/tips/TIP-0048/openapi3-core.yaml b/tips/TIP-0048/openapi3-core.yaml index 77d5c0866..45b683df5 100644 --- a/tips/TIP-0048/openapi3-core.yaml +++ b/tips/TIP-0048/openapi3-core.yaml @@ -3192,7 +3192,7 @@ components: * `255` - denotes that the block is invalid. transactionFailureReason: type: integer - enum: [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,255] + enum: [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,255] description: > Values: * `1` - denotes that the referenced UTXO was already spent. @@ -3215,6 +3215,12 @@ components: * `18` - denotes that Staking Feature is not provided in account output when claiming rewards. * `19` - denotes that fail to claim staking reward. * `20` - denotes that fail to claim delegation reward. + * `21` - denotes that the burning of native tokens was not allowed in the transaction capabilities. + * `22` - denotes that the burning of mana was not allowed in the transaction capabilities. + * `23` - denotes that the destruction of accounts was not allowed in the transaction capabilities. + * `24` - denotes that the destruction of anchors was not allowed in the transaction capabilities. + * `25` - denotes that the destruction of foundries was not allowed in the transaction capabilities. + * `26` - denotes that the destruction of nfts was not allowed in the transaction capabilities. * `255` - denotes that the semantic validation failed. required: - blockId From b4f52966ecb5c92188be64758bd7f3f49dc6d6b0 Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Fri, 27 Oct 2023 20:52:48 +0800 Subject: [PATCH 58/92] Add outputs tag --- tips/TIP-0048/openapi3-indexer.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tips/TIP-0048/openapi3-indexer.yaml b/tips/TIP-0048/openapi3-indexer.yaml index 44b800fc4..fb59a388b 100644 --- a/tips/TIP-0048/openapi3-indexer.yaml +++ b/tips/TIP-0048/openapi3-indexer.yaml @@ -14,6 +14,8 @@ externalDocs: servers: - url: 'http://127.0.0.1:14265' tags: + - name: outputs + description: Query all types of Outputs. - name: basic outputs description: Query Basic Outputs. - name: account outputs @@ -28,7 +30,7 @@ paths: /api/indexer/v2/outputs: get: tags: - - basic outputs + - outputs summary: Returns all types of outputs filtered based on parameters. description: Returns basic, foundry, account, delegation and nft outputs filtered based on parameters. parameters: From 6c14c72a446ff05079ee120b579d14c42dd9d2fa Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Fri, 27 Oct 2023 20:55:14 +0800 Subject: [PATCH 59/92] Align transactionFailureReason in event API --- tips/TIP-0048/asyncapi3.yaml | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/tips/TIP-0048/asyncapi3.yaml b/tips/TIP-0048/asyncapi3.yaml index 1cfdbe51f..dd8ed99ec 100644 --- a/tips/TIP-0048/asyncapi3.yaml +++ b/tips/TIP-0048/asyncapi3.yaml @@ -437,30 +437,35 @@ components: * `255` - denotes that the block is invalid. transactionFailureReason: type: integer - enum: [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,255] + enum: [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,255] description: | Values: * `1` - denotes that the referenced UTXO was already spent. * `2` - denotes that the transaction is conflicting with another transaction. Conflicting specifically means a double spend situation that both transaction pass all validation rules, eventually losing one(s) should have this reason. * `3` - denotes that the referenced UTXO is invalid. * `4` - denotes that the transaction is invalid. - * `5` - denotes that the sum of the inputs and output values does not match. + * `5` - denotes that the sum of the inputs and output base token amount does not match. * `6` - denotes that the unlock block signature is invalid. * `7` - denotes that the configured timelock is not yet expired. * `8` - denotes that the given native tokens are invalid. * `9` - denotes that the return amount in a transaction is not fulfilled by the output side. * `10` - denotes that the input unlock is invalid. - * `11` - denotes that the inputs commitment is invalid. - * `12` - denotes that an output contains a Sender with an ident (address) which is not unlocked. - * `13` - denotes that the chain state transition is invalid. - * `14` - denotes that the referenced input is created after transaction issuing time. - * `15` - denotes that the mana amount is invalid. - * `16` - denotes that the Block Issuance Credits amount is invalid. - * `17` - denotes that Reward Input is invalid. - * `18` - denotes that Commitment Input is invalid. - * `19` - denotes that Staking Feature is not provided in account output when claiming rewards. - * `20` - denotes that fail to claim staking reward. - * `21` - denotes that fail to claim delegation reward. + * `11` - denotes that an output contains a Sender with an ident (address) which is not unlocked. + * `12` - denotes that the chain state transition is invalid. + * `13` - denotes that the referenced input is created after transaction issuing time. + * `14` - denotes that the mana amount is invalid. + * `15` - denotes that the Block Issuance Credits Input is invalid. + * `16` - denotes that Reward Context Input is invalid. + * `17` - denotes that Commitment Context Input is invalid. + * `18` - denotes that Staking Feature is not provided in account output when claiming rewards. + * `19` - denotes that fail to claim staking reward. + * `20` - denotes that fail to claim delegation reward. + * `21` - denotes that the burning of native tokens was not allowed in the transaction capabilities. + * `22` - denotes that the burning of mana was not allowed in the transaction capabilities. + * `23` - denotes that the destruction of accounts was not allowed in the transaction capabilities. + * `24` - denotes that the destruction of anchors was not allowed in the transaction capabilities. + * `25` - denotes that the destruction of foundries was not allowed in the transaction capabilities. + * `26` - denotes that the destruction of nfts was not allowed in the transaction capabilities. * `255` - denotes that the semantic validation failed. example: 1 From b5ea3a1a4ff8ce86c016ccf952090602855b5f06 Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Mon, 30 Oct 2023 20:36:56 +0800 Subject: [PATCH 60/92] Update nativeToken type --- tips/TIP-0048/openapi3-indexer.yaml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/tips/TIP-0048/openapi3-indexer.yaml b/tips/TIP-0048/openapi3-indexer.yaml index fb59a388b..85aff15bc 100644 --- a/tips/TIP-0048/openapi3-indexer.yaml +++ b/tips/TIP-0048/openapi3-indexer.yaml @@ -43,9 +43,9 @@ paths: - in: query name: nativeToken schema: - type: integer - example: 5 - description: Filters outputs that have a certain number of distinct native tokens. + type: string + example: "0x4e16190b6f3076120c685b1d554d28443b12203e5b424d4e366230623b7b165a222250175d29" + description: Filters outputs that have the given native token ID. - in: query name: createdBefore schema: @@ -135,9 +135,9 @@ paths: - in: query name: nativeToken schema: - type: integer - example: 5 - description: Filters outputs that have a certain number of distinct native tokens. + type: string + example: "0x4e16190b6f3076120c685b1d554d28443b12203e5b424d4e366230623b7b165a222250175d29" + description: Filters outputs that have the given native token ID. - in: query name: hasStorageDepositReturn schema: @@ -573,9 +573,9 @@ paths: - in: query name: nativeToken schema: - type: integer - example: 5 - description: Filters outputs that have a certain number of distinct native tokens. + type: string + example: "0x4e16190b6f3076120c685b1d554d28443b12203e5b424d4e366230623b7b165a222250175d29" + description: Filters outputs that have the given native token ID. - in: query name: createdBefore schema: @@ -721,9 +721,9 @@ paths: - in: query name: nativeToken schema: - type: integer - example: 5 - description: Filters outputs that have a certain number of distinct native tokens. + type: string + example: "0x4e16190b6f3076120c685b1d554d28443b12203e5b424d4e366230623b7b165a222250175d29" + description: Filters outputs that have the given native token ID. - in: query name: hasStorageDepositReturn schema: From 973334ae4657974dff08385d2cb912e945736a37 Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Mon, 30 Oct 2023 20:39:34 +0800 Subject: [PATCH 61/92] Align: accountAddress -> account --- tips/TIP-0048/openapi3-indexer.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0048/openapi3-indexer.yaml b/tips/TIP-0048/openapi3-indexer.yaml index 85aff15bc..510228ff6 100644 --- a/tips/TIP-0048/openapi3-indexer.yaml +++ b/tips/TIP-0048/openapi3-indexer.yaml @@ -559,7 +559,7 @@ paths: description: Returns foundry outputs filtered based on parameters. parameters: - in: query - name: accountAddress + name: account schema: type: string example: iota1prlgpsht03ekmghhex8v7y67a835uns8dtlxu807hj0v279c74kj76j6rev From 0e8b2178eefe14f7d591e6b9272c55a842d0aaa3 Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Thu, 2 Nov 2023 10:03:37 +0800 Subject: [PATCH 62/92] Align contextInput(s) --- tips/TIP-0048/openapi3-core.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tips/TIP-0048/openapi3-core.yaml b/tips/TIP-0048/openapi3-core.yaml index 45b683df5..6cd58227c 100644 --- a/tips/TIP-0048/openapi3-core.yaml +++ b/tips/TIP-0048/openapi3-core.yaml @@ -1294,7 +1294,7 @@ components: transaction: networkId: "1337133713371337" creationSlot: 1649442459 - contextInput: + contextInputs: - type: 0 commitmentId: "0x0e6c2998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a79" inputs: @@ -2726,7 +2726,7 @@ components: description: Input accounts for loading the UTXO from the database and performing the mana calculations. type: integer contextInput: - description: ContextInput accounts for loading and checking the context input. + description: contextInput accounts for loading and checking the context input. type: integer output: description: Output accounts for storing the UTXO in the database. @@ -2750,7 +2750,7 @@ components: - dataByte - block - input - - contextInput + - contextInputs - output - nativeToken - staking From bd3b4db47b1b99cfdb9d95e524300e390e8b65b8 Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Thu, 2 Nov 2023 14:19:05 +0800 Subject: [PATCH 63/92] Add anchor output and update to latest changes --- tips/TIP-0048/asyncapi3.yaml | 99 ++++++++-- tips/TIP-0048/openapi3-core.yaml | 275 +++++++++++++++------------- tips/TIP-0048/openapi3-indexer.yaml | 158 +++++++++++++++- 3 files changed, 383 insertions(+), 149 deletions(-) diff --git a/tips/TIP-0048/asyncapi3.yaml b/tips/TIP-0048/asyncapi3.yaml index dd8ed99ec..9a8644b20 100644 --- a/tips/TIP-0048/asyncapi3.yaml +++ b/tips/TIP-0048/asyncapi3.yaml @@ -203,6 +203,23 @@ channels: description: Publishes the newly created account output of an account chain. message: $ref: '#/components/messages/OutputPayload' + + 'outputs/anchor/{anchorId}': + parameters: + anchorId: + description: The unique identifier of the anchor output. Hex encoded with 0x prefix. + schema: + type: string + examples: + - '0x1505ec099896ab05d9e08fbc7101ae4dff0093b3943b28f789ed2ca728bcc8d6' + subscribe: + tags: + - name: outputs + operationId: anchorOutputByAnchorId + description: Publishes the newly created anchor output. + message: + $ref: '#/components/messages/OutputPayload' + 'outputs/nft/{nftId}': parameters: nftId: @@ -380,6 +397,7 @@ components: anyOf: - $ref: '#/components/schemas/BasicOutput' - $ref: '#/components/schemas/AccountOutput' + - $ref: '#/components/schemas/AnchorOutput' - $ref: '#/components/schemas/FoundryOutput' - $ref: '#/components/schemas/NFTOutput' - $ref: '#/components/schemas/DelegationOutput' @@ -874,18 +892,6 @@ components: Output ID that created it. Account Address = Account Address Type || Account ID example: '0x1505ec099896ab05d9e08fbc7101ae4dff0093b3943b28f789ed2ca728bcc8d6' - stateIndex: - type: integer - description: >- - A counter that must increase by 1 every time the account is state - transitioned. - example: 1337 - stateMetadata: - type: string - description: >- - Hex-encoded metadata that can only be changed by the state - controller. - example: '0x7665727920696d706f7274616e74207374617465206d65746164617461' foundryCounter: type: integer description: >- @@ -898,8 +904,7 @@ components: transaction. items: anyOf: - - $ref: '#/components/schemas/StateControllerAddressUnlockCondition' - - $ref: '#/components/schemas/GovernorAddressUnlockCondition' + - $ref: '#/components/schemas/AddressUnlockCondition' features: type: array description: >- @@ -925,10 +930,74 @@ components: - type - amount - accountId - - stateIndex - foundryCounter - mana + AnchorOutput: + description: >- + Describes an anchor output. + properties: + type: + type: integer + description: Set to value 2 to denote an Anchor Output. + example: 1 + amount: + type: string + description: >- + The amount of IOTA tokens to deposit with this output. Encoded as + plain string. + example: '100' + mana: + type: string + description: The stored mana held by the output. + example: '3000' + anchorId: + type: string + description: The identifier of the anchor. + example: '0x1505ec099896ab05d9e08fbc7101ae4dff0093b3943b28f789ed2ca728bcc8d6' + stateIndex: + type: integer + description: A counter that must increase by 1 every time the account is state transitioned. + example: 3 + stateMetadata: + type: string + description: Hex-encoded metadata with 0x prefix that can only be changed by the state controller. + example: '0x7665727920696d706f7274616e74207374617465206d65746164617461' + unlockConditions: + type: array + description: >- + Unlock condtions that define how the output can be unlocked in a + transaction. + items: + anyOf: + - $ref: '#/components/schemas/StateControllerAddressUnlockCondition' + - $ref: '#/components/schemas/GovernorAddressUnlockCondition' + features: + type: array + description: >- + Features that add utility to the output but do not impose unlocking + conditions. + items: + anyOf: + - $ref: '#/components/schemas/SenderFeature' + - $ref: '#/components/schemas/MetadataFeature' + immutableFeatures: + type: array + description: >- + Immutable features that add utility to the output but do not impose + unlocking conditions. These blocks need to be kept in future + transitions of the UTXO state machine. + items: + anyOf: + - $ref: '#/components/schemas/IssuerFeature' + - $ref: '#/components/schemas/MetadataFeature' + required: + - type + - amount + - anchorId + - stateIndex + - mana + DelegationOutput: description: >- Describes an delegation output in the ledger that can be controlled by the diff --git a/tips/TIP-0048/openapi3-core.yaml b/tips/TIP-0048/openapi3-core.yaml index 6cd58227c..400277442 100644 --- a/tips/TIP-0048/openapi3-core.yaml +++ b/tips/TIP-0048/openapi3-core.yaml @@ -48,7 +48,7 @@ paths: '500': description: "Unsuccessful operation: indicates that an unexpected, internal server error happened which prevented the node from fulfilling the request." '503': - description: "Unsuccessful operation: indicates that the node isn´t healthy." + description: "Unsuccessful operation: indicates that the node isn't healthy." /api/routes: get: @@ -1140,10 +1140,6 @@ components: blockIssuer: 100 allotment: 100 signatureEd25519: 200 - tokenSupply: "2779530283277761" - genesisUnixTimestamp: "1692966168" - slotDurationInSeconds: 10 - slotsPerEpochExponent: 13 manaParameters: bitsCount: 63 generationRate: 1 @@ -1154,6 +1150,10 @@ components: decayFactorsExponent: 0 decayFactorEpochsSum: 0 decayFactorEpochsSumExponent: 0 + tokenSupply: "2779530283277761" + genesisUnixTimestamp: "1692966168" + slotDurationInSeconds: 10 + slotsPerEpochExponent: 13 stakingUnbondingPeriod: 10 validationBlocksPerSlot: 10 punishmentEpochs: 10 @@ -1247,13 +1247,14 @@ components: post-tagged-data-block-request-example-full: value: - protocolVersion: 3 - networkId: "0" - issuingTime: "1692966293697706488" - slotCommitmentId: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000" - latestFinalizedSlot: 0 - issuerId: "0x375358f92cc94750669598b0aaa55a6ff73310b90710e1fad524c0f911be0fea" - block: + header: + protocolVersion: 3 + networkId: "0" + issuingTime: "1692966293697706488" + slotCommitmentId: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000" + latestFinalizedSlot: 0 + issuerId: "0x375358f92cc94750669598b0aaa55a6ff73310b90710e1fad524c0f911be0fea" + body: type: 0 strongParents: - "0x2de585533d9c9684747e49f70e5e620a4e6c3fd1c7d8b73520c198c7def29a050200000000000000" @@ -1272,13 +1273,14 @@ components: post-transaction-block-request-example-full: value: - protocolVersion: 3 - networkId: "0" - issuingTime: "1692966293697706488" - slotCommitmentId: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000" - latestFinalizedSlot: 0 - issuerId: "0x375358f92cc94750669598b0aaa55a6ff73310b90710e1fad524c0f911be0fea" - block: + header: + protocolVersion: 3 + networkId: "0" + issuingTime: "1692966293697706488" + slotCommitmentId: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000" + latestFinalizedSlot: 0 + issuerId: "0x375358f92cc94750669598b0aaa55a6ff73310b90710e1fad524c0f911be0fea" + body: type: 0 strongParents: - "0x8d6f3b6e3a63ce388d2eb8c927c5b9ba328b0e427ae727d8b3dddc429f6fb24a0000000000000000" @@ -1399,13 +1401,14 @@ components: get-block-by-id-empty-response-example: value: - protocolVersion: 3 - networkId: "0" - issuingTime: "1692966346513784862" - slotCommitmentId: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000" - latestFinalizedSlot: 0 - issuerId: "0x375358f92cc94750669598b0aaa55a6ff73310b90710e1fad524c0f911be0fea" - block: + header: + protocolVersion: 3 + networkId: "0" + issuingTime: "1692966346513784862" + slotCommitmentId: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000" + latestFinalizedSlot: 0 + issuerId: "0x375358f92cc94750669598b0aaa55a6ff73310b90710e1fad524c0f911be0fea" + body: type: 0 strongParents: - "0x2de585533d9c9684747e49f70e5e620a4e6c3fd1c7d8b73520c198c7def29a050200000000000000" @@ -1420,13 +1423,14 @@ components: get-block-by-id-transaction-response-example: value: - protocolVersion: 3 - networkId: "0" - issuingTime: "1692966346513784862" - slotCommitmentId: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000" - latestFinalizedSlot: 0 - issuerId: "0x375358f92cc94750669598b0aaa55a6ff73310b90710e1fad524c0f911be0fea" - block: + header: + protocolVersion: 3 + networkId: "0" + issuingTime: "1692966346513784862" + slotCommitmentId: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000" + latestFinalizedSlot: 0 + issuerId: "0x375358f92cc94750669598b0aaa55a6ff73310b90710e1fad524c0f911be0fea" + body: type: 0 strongParents: - "0x8d6f3b6e3a63ce388d2eb8c927c5b9ba328b0e427ae727d8b3dddc429f6fb24a0000000000000000" @@ -1485,13 +1489,14 @@ components: get-block-by-id-tagged-data-response-example: value: - protocolVersion: 3 - networkId: "0" - issuingTime: "1692966346513784862" - slotCommitmentId: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000" - latestFinalizedSlot: 0 - issuerId: "0x375358f92cc94750669598b0aaa55a6ff73310b90710e1fad524c0f911be0fea" - block: + header: + protocolVersion: 3 + networkId: "0" + issuingTime: "1692966346513784862" + slotCommitmentId: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000" + latestFinalizedSlot: 0 + issuerId: "0x375358f92cc94750669598b0aaa55a6ff73310b90710e1fad524c0f911be0fea" + body: type: 0 strongParents: - "0x2de585533d9c9684747e49f70e5e620a4e6c3fd1c7d8b73520c198c7def29a050200000000000000" @@ -1510,13 +1515,14 @@ components: get-block-by-id-validation-response-example: value: - protocolVersion: 3 - networkId: "0" - issuingTime: "1692966346513784862" - slotCommitmentId: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000" - latestFinalizedSlot: 0 - issuerId: "0x375358f92cc94750669598b0aaa55a6ff73310b90710e1fad524c0f911be0fea" - block: + header: + protocolVersion: 3 + networkId: "0" + issuingTime: "1692966346513784862" + slotCommitmentId: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000" + latestFinalizedSlot: 0 + issuerId: "0x375358f92cc94750669598b0aaa55a6ff73310b90710e1fad524c0f911be0fea" + body: type: 1 strongParents: - "0x2de585533d9c9684747e49f70e5e620a4e6c3fd1c7d8b73520c198c7def29a050200000000000000" @@ -1621,25 +1627,34 @@ components: Block: description: A block is the object nodes gossip around in the network. It always references other blocks that are known as parents. It is stored as a vertex on the tangle data structure that the nodes maintain. A block can have a maximum size of 32Kb. properties: - protocolVersion: - type: number - description: Protocol version identifier. It also tells which protocol rules apply to the block. - networkId: - type: string - description: Network version identifier. It also tells which network the node is running. - issuingTime: - type: string - description: The timestamp of issuing this block, a uint64 string. - slotCommitmentId: - type: string - description: The slot commitment ID contains in this block. - latestFinalizedSlot: - type: integer - description: The latest finalized slot of issuing node. - issuerId: - type: string - description: The identifier of the issuer. - block: + header: + properties: + protocolVersion: + type: number + description: Protocol version identifier. It also tells which protocol rules apply to the block. + networkId: + type: string + description: Network version identifier. It also tells which network the node is running. + issuingTime: + type: string + description: The timestamp of issuing this block, a uint64 string. + slotCommitmentId: + type: string + description: The slot commitment ID contains in this block. + latestFinalizedSlot: + type: integer + description: The latest finalized slot of issuing node. + issuerId: + type: string + description: The identifier of the issuer. + required: + - protocolVersion + - networkId + - issuingTime + - slotCommitmentId + - latestFinalizedSlot + - issuerId + body: description: The block content. oneOf: - $ref: '#/components/schemas/BasicBlock' @@ -1650,13 +1665,8 @@ components: oneOf: - $ref: '#/components/schemas/Ed25519Signature' required: - - protocolVersion - - networkId - - issuingTime - - slotCommitmentId - - latestFinalizedSlot - - issuerId - - block + - header + - body - signature BasicBlock: @@ -1791,6 +1801,7 @@ components: anyOf: - $ref: '#/components/schemas/BasicOutput' - $ref: '#/components/schemas/AccountOutput' + - $ref: '#/components/schemas/AnchorOutput' - $ref: '#/components/schemas/FoundryOutput' - $ref: '#/components/schemas/NFTOutput' - $ref: '#/components/schemas/DelegationOutput' @@ -1919,15 +1930,60 @@ components: accountId: type: string description: The identifier of the account. + foundryCounter: + type: integer + description: A counter that denotes the number of foundries created by this account. + unlockConditions: + type: array + description: Unlock conditions that define how the output can be unlocked in a transaction. + items: + anyOf: + - $ref: '#/components/schemas/AddressUnlockCondition' + features: + type: array + description: Features that add utility to the output but do not impose unlocking conditions. + items: + anyOf: + - $ref: '#/components/schemas/SenderFeature' + - $ref: '#/components/schemas/MetadataFeature' + - $ref: '#/components/schemas/BlockIssuerFeature' + - $ref: '#/components/schemas/StakingFeature' + immutableFeatures: + type: array + description: Immutable features that add utility to the output but do not impose unlocking conditions. + These features need to be kept in future transitions of the UTXO state machine. + items: + anyOf: + - $ref: '#/components/schemas/IssuerFeature' + - $ref: '#/components/schemas/MetadataFeature' + required: + - type + - amount + - accountId + - foundryCounter + - mana + + AnchorOutput: + description: Describes an anchor output. + properties: + type: + type: integer + description: Set to value 2 to denote an Anchor Output. + amount: + type: string + description: The amount of IOTA tokens to deposit with this output. Plain string encoded number. + mana: + type: string + description: The stored mana held by the output. + anchorId: + type: string + description: The identifier of the anchor. stateIndex: type: integer description: A counter that must increase by 1 every time the account is state transitioned. stateMetadata: type: string description: Hex-encoded metadata with 0x prefix that can only be changed by the state controller. - foundryCounter: - type: integer - description: A counter that denotes the number of foundries created by this account. unlockConditions: type: array description: Unlock conditions that define how the output can be unlocked in a transaction. @@ -1941,9 +1997,7 @@ components: items: anyOf: - $ref: '#/components/schemas/SenderFeature' - - $ref: '#/components/schemas/MetadataFeature' - - $ref: '#/components/schemas/BlockIssuerFeature' - - $ref: '#/components/schemas/StakingFeature' + - $ref: '#/components/schemas/MetadataFeature' immutableFeatures: type: array description: Immutable features that add utility to the output but do not impose unlocking conditions. @@ -1955,9 +2009,8 @@ components: required: - type - amount - - accountId + - anchorId - stateIndex - - foundryCounter - mana DelegationOutput: @@ -2750,25 +2803,13 @@ components: - dataByte - block - input - - contextInputs + - contextInput - output - nativeToken - staking - blockIssuer - allotment - signatureEd25519 - tokenSupply: - type: string - description: Current supply of base token. Plain string encoded number. - genesisUnixTimestamp: - type: string - description: The genesis timestamp at which the slots start to count. - slotDurationInSeconds: - type: integer - description: The duration of a slot, in seconds. - slotsPerEpochExponent: - type: integer - description: The number of slots in an epoch expressed as an exponent of 2. manaParameters: description: Mana Structure defines the parameters used by mana calculation. properties: @@ -2803,6 +2844,18 @@ components: - decayFactorsExponent - decayFactorEpochsSum - decayFactorEpochsSumExponent + tokenSupply: + type: string + description: Current supply of base token. Plain string encoded number. + genesisUnixTimestamp: + type: string + description: The genesis timestamp at which the slots start to count. + slotDurationInSeconds: + type: integer + description: The duration of a slot, in seconds. + slotsPerEpochExponent: + type: integer + description: The number of slots in an epoch expressed as an exponent of 2. stakingUnbondingPeriod: type: integer description: The unbonding period in epochs before an account can stop staking. @@ -3109,36 +3162,8 @@ components: SubmitBlockRequest: description: Submits a block to the node. properties: - protocolVersion: - type: number - description: Protocol version identifier. It also tells which protocol rules apply to the block. - networkId: - type: string - description: Network version identifier. It also tells which network the node is running. - issuingTime: - type: string - description: The timestamp of issuing this block. - slotCommitmentId: - type: string - description: The slot commitment contains in this block. - latestFinalizedSlot: - type: integer - description: The latest finalized slot of issuing node. - issuerId: - type: string - description: The identifier of the issuer. - block: - description: The block content. - oneOf: - - $ref: '#/components/schemas/BasicBlock' - - $ref: '#/components/schemas/ValidationBlock' - signature: - type: object - description: The signature of entire block, signed by the issuer. - oneOf: - - $ref: '#/components/schemas/Ed25519Signature' - required: - - protocolVersion + allOf: + $ref: '#/components/schemas/Block' SubmitBlockResponse: description: Returns the block identifier of the submitted block. @@ -3239,6 +3264,7 @@ components: anyOf: - $ref: '#/components/schemas/BasicOutput' - $ref: '#/components/schemas/AccountOutput' + - $ref: '#/components/schemas/AnchorOutput' - $ref: '#/components/schemas/FoundryOutput' - $ref: '#/components/schemas/NFTOutput' - $ref: '#/components/schemas/DelegationOutput' @@ -3277,6 +3303,7 @@ components: anyOf: - $ref: '#/components/schemas/BasicOutput' - $ref: '#/components/schemas/AccountOutput' + - $ref: '#/components/schemas/AnchorOutput' - $ref: '#/components/schemas/FoundryOutput' - $ref: '#/components/schemas/NFTOutput' - $ref: '#/components/schemas/DelegationOutput' diff --git a/tips/TIP-0048/openapi3-indexer.yaml b/tips/TIP-0048/openapi3-indexer.yaml index 510228ff6..e68d4df65 100644 --- a/tips/TIP-0048/openapi3-indexer.yaml +++ b/tips/TIP-0048/openapi3-indexer.yaml @@ -20,6 +20,8 @@ tags: description: Query Basic Outputs. - name: account outputs description: Query Account Outputs. + - name: anchor outputs + description: Query Anchor Outputs. - name: delegation outputs description: Query Delegation Outputs. - name: foundry outputs @@ -281,17 +283,141 @@ paths: description: Returns account outputs filtered based on parameters. parameters: - in: query - name: stateController + name: issuer schema: type: string example: iota1qrhacyfwlcnzkvzteumekfkrrwks98mpdm37cj4xx3drvmjvnep6xqgyzyx - description: Filter outputs based on bech32-encoded state controller address. + description: Filters outputs based on bech32-encoded issuer address. - in: query - name: governor + name: sender schema: type: string example: iota1qrhacyfwlcnzkvzteumekfkrrwks98mpdm37cj4xx3drvmjvnep6xqgyzyx - description: Filter outputs based on bech32-encoded governor (governance controller) address. + description: Filters outputs based on bech32-encoded sender address. + - in: query + name: createdBefore + schema: + type: integer + example: 200 + description: Return outputs that were created before a certain slot index. + - in: query + name: createdAfter + schema: + type: integer + example: 200 + description: Return outputs that were created after a certain slot index. + - in: query + name: address + schema: + type: string + example: iota1qrhacyfwlcnzkvzteumekfkrrwks98mpdm37cj4xx3drvmjvnep6xqgyzyx + description: The Bech32-encoded address that should be searched for in the Address Unlock Condition of outputs. + - in: query + name: pageSize + schema: + type: integer + example: 10 + description: The maximum amount of items returned in one call. If there are more items, a cursor to the next page is returned too. + The parameter is ignored when pageSize is defined via the cursor parameter. + - in: query + name: cursor + schema: + type: string + example: 0c78e998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a790200.10 + description: Starts the search from the cursor (createdSlotIndex+outputId.pageSize). + responses: + '200': + description: "Successful operation." + content: + application/json: + schema: + $ref: '#/components/schemas/OutputsResponse' + examples: + Query results in 3 outputs: + $ref: >- + #/components/examples/get-outputs-response-three-example + No matching Output IDs found: + $ref: >- + #/components/examples/get-outputs-empty-response-example + Paging - more items found than it can fit on single page: + $ref: >- + #/components/examples/get-outputs-pagesize2-response-example + '400': + description: "Unsuccessful operation: indicates that the provided data is invalid." + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + '403': + description: "Unsuccessful operation: indicates that the endpoint is not available for public use." + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenResponse' + '500': + description: "Unsuccessful operation: indicates that an unexpected, internal server error happened which prevented the node from fulfilling the request." + content: + application/json: + schema: + $ref: '#/components/schemas/InternalErrorResponse' + + /api/indexer/v2/outputs/account/{accountId}: + get: + tags: + - account outputs + summary: Returns the Output ID of the current unspent account output for accountId. + description: Returns the Output ID of the current unspent account output for accountId. + parameters: + - in: path + name: accountId + schema: + type: string + example: "0x1505ec099896ab05d9e08fbc7101ae4dff0093b3943b28f789ed2ca728bcc8d6" + description: Unique identifier of the account. + required: true + responses: + '200': + description: "Successful operation." + content: + application/json: + schema: + $ref: '#/components/schemas/OutputsResponse' + examples: + Query results in single output: + $ref: >- + #/components/examples/get-outputs-response-single-example + '400': + description: "Unsuccessful operation: indicates that the provided data is invalid." + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + '403': + description: "Unsuccessful operation: indicates that the endpoint is not available for public use." + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenResponse' + '404': + description: "Unsuccessful operation: indicates that the requested data was not found." + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + '500': + description: "Unsuccessful operation: indicates that an unexpected, internal server error happened which prevented the node from fulfilling the request." + content: + application/json: + schema: + $ref: '#/components/schemas/InternalErrorResponse' + + /api/indexer/v2/outputs/anchor: + get: + tags: + - anchor outputs + summary: Returns anchor outputs filtered based on parameters. + description: Returns anchor outputs filtered based on parameters. + parameters: - in: query name: issuer schema: @@ -322,6 +448,18 @@ paths: type: string example: iota1qrhacyfwlcnzkvzteumekfkrrwks98mpdm37cj4xx3drvmjvnep6xqgyzyx description: The address unlock related query parameters. + - in: query + name: stateController + schema: + type: string + example: iota1qrhacyfwlcnzkvzteumekfkrrwks98mpdm37cj4xx3drvmjvnep6xqgyzyx + description: Filter outputs based on bech32-encoded state controller address. + - in: query + name: governor + schema: + type: string + example: iota1qrhacyfwlcnzkvzteumekfkrrwks98mpdm37cj4xx3drvmjvnep6xqgyzyx + description: Filter outputs based on bech32-encoded governor (governance controller) address. - in: query name: pageSize schema: @@ -371,19 +509,19 @@ paths: schema: $ref: '#/components/schemas/InternalErrorResponse' - /api/indexer/v2/outputs/account/{accountId}: + /api/indexer/v2/outputs/anchor/{accountId}: get: tags: - - account outputs - summary: Returns the Output ID of the current unspent account output for accountId. - description: Returns the Output ID of the current unspent account output for accountId. + - anchor outputs + summary: Returns the Output of the given anchor ID. + description: Returns the Output of the given anchorID. parameters: - in: path - name: accountId + name: anchorId schema: type: string example: "0x1505ec099896ab05d9e08fbc7101ae4dff0093b3943b28f789ed2ca728bcc8d6" - description: Unique identifier of the account. + description: Unique identifier of the anchor output. required: true responses: '200': From e3882fa2d45306c5a61cb8d15f1b6246d635d6fc Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Mon, 6 Nov 2023 09:54:33 +0800 Subject: [PATCH 64/92] Fix error in indexer --- tips/TIP-0048/openapi3-indexer.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0048/openapi3-indexer.yaml b/tips/TIP-0048/openapi3-indexer.yaml index e68d4df65..5499f6df8 100644 --- a/tips/TIP-0048/openapi3-indexer.yaml +++ b/tips/TIP-0048/openapi3-indexer.yaml @@ -509,7 +509,7 @@ paths: schema: $ref: '#/components/schemas/InternalErrorResponse' - /api/indexer/v2/outputs/anchor/{accountId}: + /api/indexer/v2/outputs/anchor/{anchorId}: get: tags: - anchor outputs From 0ad7cf8d937860a1f5ec15154192304717f3f6cb Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Fri, 10 Nov 2023 15:58:45 +0800 Subject: [PATCH 65/92] Resove comments --- tips/TIP-0048/openapi3-core.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0048/openapi3-core.yaml b/tips/TIP-0048/openapi3-core.yaml index 400277442..fd8f84246 100644 --- a/tips/TIP-0048/openapi3-core.yaml +++ b/tips/TIP-0048/openapi3-core.yaml @@ -168,7 +168,7 @@ paths: type: string example: "0xf532a53545103276b46876c473846d98648ee418468bce76df4868648dd73e5d" required: true - description: Identifier of the account or delegation output. + description: Output ID of an account or delegation output. responses: '200': description: "Successful operation." From 68de21b4a705885161a70f24c5afc651e6a15904 Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Mon, 13 Nov 2023 16:12:26 +0800 Subject: [PATCH 66/92] Add NativeTokenFeature --- tips/TIP-0048/asyncapi3.yaml | 21 +++++++++++++++++++++ tips/TIP-0048/openapi3-core.yaml | 19 +++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/tips/TIP-0048/asyncapi3.yaml b/tips/TIP-0048/asyncapi3.yaml index 9a8644b20..856bd3cba 100644 --- a/tips/TIP-0048/asyncapi3.yaml +++ b/tips/TIP-0048/asyncapi3.yaml @@ -778,6 +778,25 @@ components: required: - type - data + NativeTokenFeature: + description: Defines a native token which represents a token that resides natively on the ledger. + properties: + type: + type: integer + description: Set to value 5 to denote a Native Token Feature. + example: 5 + id: + type: string + description: The ID of the native token. + example: "0x082d3860307d320f3a167a225b031b6b043941562b0c18797938584f603f69425375617a4900" + amount: + type: string + description: The amount of native token. + example: "200000000" + required: + - type + - id + - amount TagFeature: description: >- Defines an indexation tag to which the output can be indexed by @@ -861,6 +880,7 @@ components: - $ref: '#/components/schemas/SenderFeature' - $ref: '#/components/schemas/MetadataFeature' - $ref: '#/components/schemas/TagFeature' + - $ref: '#/components/schemas/NativeTokenFeature' required: - type - amount @@ -1096,6 +1116,7 @@ components: items: anyOf: - $ref: '#/components/schemas/MetadataFeature' + - $ref: '#/components/schemas/NativeTokenFeature' immutableFeatures: type: array description: >- diff --git a/tips/TIP-0048/openapi3-core.yaml b/tips/TIP-0048/openapi3-core.yaml index fd8f84246..a061c1944 100644 --- a/tips/TIP-0048/openapi3-core.yaml +++ b/tips/TIP-0048/openapi3-core.yaml @@ -1910,6 +1910,7 @@ components: - $ref: '#/components/schemas/SenderFeature' - $ref: '#/components/schemas/MetadataFeature' - $ref: '#/components/schemas/TagFeature' + - $ref: '#/components/schemas/NativeTokenFeature' required: - type - amount @@ -2097,6 +2098,7 @@ components: items: anyOf: - $ref: '#/components/schemas/MetadataFeature' + - $ref: '#/components/schemas/NativeTokenFeature' immutableFeatures: type: array description: Immutable features that add utility to the output but do not impose unlocking conditions. @@ -2419,6 +2421,23 @@ components: - type - tag + NativeTokenFeature: + description: Defines a native token which represents a token that resides natively on the ledger. + properties: + type: + type: integer + description: Set to value 5 to denote a Native Token Feature. + id: + type: string + description: The ID of the native token. + amount: + type: string + description: The amount of native token. + required: + - type + - id + - amount + SimpleTokenScheme: description: Defines the simple supply control scheme of native tokens. Tokens can be minted by the foundry without additional restrictions as long as maximum supply is requested and circulating supply is not negative. properties: From 6473e61db8f8c59d602a08b532b8e2d588e7eac5 Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Tue, 14 Nov 2023 14:16:21 +0800 Subject: [PATCH 67/92] Update description and example of NativeTokenFeature amount --- tips/TIP-0048/asyncapi3.yaml | 4 ++-- tips/TIP-0048/openapi3-core.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tips/TIP-0048/asyncapi3.yaml b/tips/TIP-0048/asyncapi3.yaml index 856bd3cba..42d59d1d1 100644 --- a/tips/TIP-0048/asyncapi3.yaml +++ b/tips/TIP-0048/asyncapi3.yaml @@ -791,8 +791,8 @@ components: example: "0x082d3860307d320f3a167a225b031b6b043941562b0c18797938584f603f69425375617a4900" amount: type: string - description: The amount of native token. - example: "200000000" + description: The amount of native token. Hex-encoded number with 0x prefix. + example: "0x3e8" required: - type - id diff --git a/tips/TIP-0048/openapi3-core.yaml b/tips/TIP-0048/openapi3-core.yaml index a061c1944..e7eb69491 100644 --- a/tips/TIP-0048/openapi3-core.yaml +++ b/tips/TIP-0048/openapi3-core.yaml @@ -2432,7 +2432,7 @@ components: description: The ID of the native token. amount: type: string - description: The amount of native token. + description: The amount of native token. Hex-encoded number with 0x prefix. required: - type - id From 698f288a27da604dad09602dbbd0b7e42ae288e3 Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Tue, 14 Nov 2023 14:31:48 +0800 Subject: [PATCH 68/92] Add StateMetadataFeature and update type number --- tips/TIP-0048/asyncapi3.yaml | 30 ++++++++++++++++++++++++------ tips/TIP-0048/openapi3-core.yaml | 21 ++++++++++++++++++++- 2 files changed, 44 insertions(+), 7 deletions(-) diff --git a/tips/TIP-0048/asyncapi3.yaml b/tips/TIP-0048/asyncapi3.yaml index 42d59d1d1..c0108b77f 100644 --- a/tips/TIP-0048/asyncapi3.yaml +++ b/tips/TIP-0048/asyncapi3.yaml @@ -720,8 +720,8 @@ components: properties: type: type: integer - description: Set to value 4 to denote a Block Issuer Feature. - example: 4 + description: Set to value 6 to denote a Block Issuer Feature. + example: 6 blockIssuerKeys: type: array description: The keys allowed to issue blocks from an account with a BlockIssuerFeature. @@ -741,8 +741,8 @@ components: properties: type: type: integer - description: Set to value 5 to denote a Staking Feature. - example: 5 + description: Set to value 7 to denote a Staking Feature. + example: 7 stakedAmount: type: string description: The amount of IOTA coins that are locked and staked in the containing account. @@ -778,6 +778,23 @@ components: required: - type - data + StateMetadataFeature: + description: >- + Defines a map of key-value pairs. The keys must consist of ASCII characters only and the values are arbitrary byte slices. + properties: + type: + type: integer + description: Set to value 3 to denote a State Metadata Feature. + example: 3 + entries: + type: string + description: Hex-encoded binary data. + example: + - 'did:iota': '0x68656c6c6f206469676974616c206175746f6e6f6d79' + - 'hello': '0x776f726c64' + required: + - type + - entries NativeTokenFeature: description: Defines a native token which represents a token that resides natively on the ledger. properties: @@ -804,8 +821,8 @@ components: properties: type: type: integer - description: Set to value 3 to denote a Tag Feature. - example: 3 + description: Set to value 4 to denote a Tag Feature. + example: 4 tag: type: string description: Hex-encoded binary indexation tag. @@ -1001,6 +1018,7 @@ components: anyOf: - $ref: '#/components/schemas/SenderFeature' - $ref: '#/components/schemas/MetadataFeature' + - $ref: '#/components/schemas/StateMetadataFeature' immutableFeatures: type: array description: >- diff --git a/tips/TIP-0048/openapi3-core.yaml b/tips/TIP-0048/openapi3-core.yaml index e7eb69491..dcc3dbdd8 100644 --- a/tips/TIP-0048/openapi3-core.yaml +++ b/tips/TIP-0048/openapi3-core.yaml @@ -1998,7 +1998,8 @@ components: items: anyOf: - $ref: '#/components/schemas/SenderFeature' - - $ref: '#/components/schemas/MetadataFeature' + - $ref: '#/components/schemas/MetadataFeature' + - $ref: '#/components/schemas/StateMetadataFeature' immutableFeatures: type: array description: Immutable features that add utility to the output but do not impose unlocking conditions. @@ -2408,6 +2409,24 @@ components: - type - data + StateMetadataFeature: + description: >- + Defines a map of key-value pairs. The keys must consist of ASCII characters only and the values are arbitrary byte slices. + properties: + type: + type: integer + description: Set to value 3 to denote a State Metadata Feature. + example: 3 + entries: + type: string + description: Hex-encoded binary data. + example: + - 'did:iota': '0x68656c6c6f206469676974616c206175746f6e6f6d79' + - 'hello': '0x776f726c64' + required: + - type + - entries + TagFeature: description: Defines an indexation tag to which the output can be indexed by additional node plugins. properties: From 02e9c4884a2c6f572953e8582504e476f5e5cd82 Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Tue, 14 Nov 2023 20:45:48 +0800 Subject: [PATCH 69/92] Add slot index query to rewards api --- tips/TIP-0048/openapi3-core.yaml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tips/TIP-0048/openapi3-core.yaml b/tips/TIP-0048/openapi3-core.yaml index dcc3dbdd8..ab3da00a4 100644 --- a/tips/TIP-0048/openapi3-core.yaml +++ b/tips/TIP-0048/openapi3-core.yaml @@ -169,6 +169,12 @@ paths: example: "0xf532a53545103276b46876c473846d98648ee418468bce76df4868648dd73e5d" required: true description: Output ID of an account or delegation output. + - in: query + name: slotIndex + schema: + type: integer + example: 50 + description: A client can specify a slot index explicitly, which should be equal to the slot it uses as the commitment input for the claiming transaction. This parameter is only recommended to be provided when requesting rewards for a Delegation Output in delegating state (i.e. when Delegation ID is zeroed). responses: '200': description: "Successful operation." From 107c6f5397d218740fbe639c1b11df8e6eae4066 Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Mon, 20 Nov 2023 16:33:54 +0800 Subject: [PATCH 70/92] Update descriptions and examples --- tips/TIP-0048/openapi3-core.yaml | 22 +++++++++++----------- tips/TIP-0048/openapi3-indexer.yaml | 10 +++++----- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/tips/TIP-0048/openapi3-core.yaml b/tips/TIP-0048/openapi3-core.yaml index ab3da00a4..65cba3e7f 100644 --- a/tips/TIP-0048/openapi3-core.yaml +++ b/tips/TIP-0048/openapi3-core.yaml @@ -1643,7 +1643,7 @@ components: description: Network version identifier. It also tells which network the node is running. issuingTime: type: string - description: The timestamp of issuing this block, a uint64 string. + description: The timestamp of issuing this block, a uint64 string in nanosecond-precision. slotCommitmentId: type: string description: The slot commitment ID contains in this block. @@ -2347,8 +2347,8 @@ components: properties: type: type: integer - description: Set to value 4 to denote a Block Issuer Feature. - example: 4 + description: Set to value 6 to denote a Block Issuer Feature. + example: 6 blockIssuerKeys: type: array description: The keys allowed to issue blocks from an account with a BlockIssuerFeature. @@ -2381,8 +2381,8 @@ components: properties: type: type: string - description: Set to value 5 to denote a Staking Feature. - example: 5 + description: Set to value 7 to denote a Staking Feature. + example: 7 stakedAmount: type: string description: The amount of IOTA coins that are locked and staked in the containing account. @@ -2438,7 +2438,7 @@ components: properties: type: type: integer - description: Set to value 3 to denote a Tag Feature. + description: Set to value 4 to denote a Tag Feature. tag: type: string description: Hex-encoded binary indexation tag with 0x prefix. @@ -2659,16 +2659,16 @@ components: type: boolean description: Tells whether the node is healthy or not. acceptedTangleTime: - description: A notion of time that is anchored to the latest accepted block. + description: A notion of time that is anchored to the latest accepted block. It's in nanosecond-precision. type: string relativeAcceptedTangleTime: - description: The time after Accepted Tangle Time has advanced with the system clock. + description: The time after Accepted Tangle Time has advanced with the system clock. It's in nanosecond-precision. type: string confirmedTangleTime: - description: A notion of time that is anchored to the latest confirmed block. + description: A notion of time that is anchored to the latest confirmed block. It's in nanosecond-precision. type: string relativeConfirmedTangleTime: - description: The time after Confirmed Tangle Time has advanced with the system clock. + description: The time after Confirmed Tangle Time has advanced with the system clock. It's in nanosecond-precision. type: string latestCommitmentId: type: string @@ -2893,7 +2893,7 @@ components: description: Current supply of base token. Plain string encoded number. genesisUnixTimestamp: type: string - description: The genesis timestamp at which the slots start to count. + description: The genesis timestamp at which the slots start to count. It's in second-precision. slotDurationInSeconds: type: integer description: The duration of a slot, in seconds. diff --git a/tips/TIP-0048/openapi3-indexer.yaml b/tips/TIP-0048/openapi3-indexer.yaml index 5499f6df8..5da13b488 100644 --- a/tips/TIP-0048/openapi3-indexer.yaml +++ b/tips/TIP-0048/openapi3-indexer.yaml @@ -1044,24 +1044,24 @@ components: examples: get-outputs-response-three-example: value: - ledgerIndex: 101 + committedSlot: 101 items: - "0x0c78e998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a790000" - "0x0c78e998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a790100" - "0x0c78e998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a790200" get-outputs-response-single-example: value: - ledgerIndex: 101 + committedSlot: 101 items: - "0x0c78e998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a790000" get-outputs-empty-response-example: value: - ledgerIndex: 101 + committedSlot: 101 items: - get-outputs-pagesize2-response-example: value: - ledgerIndex: 101 + committedSlot: 101 cursor: 61fa44a14d35ce14b9d0e7ee6ac9af70c0af156be269f69348be6d6f83c80a3a8a44ce440000.2 items: - "0x0c78e998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a790000" @@ -1139,7 +1139,7 @@ components: properties: committedSlot: type: integer - description: The committed slot at which these outputs where available at. + description: The committed slot at which these outputs were available at. pageSize: type: integer description: The maximum amount of items returned in one call. If there are more items, a cursor to the next page is returned too. From 4a0d03ec18e1af2afe6fa7ec16178bb3e99cd764 Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Wed, 22 Nov 2023 21:27:16 +0800 Subject: [PATCH 71/92] Resolve comments --- tips/TIP-0048/asyncapi3.yaml | 2 +- tips/TIP-0048/openapi3-core.yaml | 129 ++++++++++++++++++++++++++++--- 2 files changed, 119 insertions(+), 12 deletions(-) diff --git a/tips/TIP-0048/asyncapi3.yaml b/tips/TIP-0048/asyncapi3.yaml index c0108b77f..bf5811624 100644 --- a/tips/TIP-0048/asyncapi3.yaml +++ b/tips/TIP-0048/asyncapi3.yaml @@ -375,7 +375,7 @@ components: commitmentId: type: string description: Hex encoded identifier of the slot commitment. - example: '0x7a09324557e9200f39bf493fc8fd6ac43e9ca750c6f6d884cc72386ddcb7d695' + example: '0x507d5c7d7105022b661e2c755173785f11707b7a6b3369111d000d1f145e652d5f436f26' Block: contentType: application/vnd.iota.serializer-v2 description: The block in its serialized binary form. diff --git a/tips/TIP-0048/openapi3-core.yaml b/tips/TIP-0048/openapi3-core.yaml index 65cba3e7f..8196b245e 100644 --- a/tips/TIP-0048/openapi3-core.yaml +++ b/tips/TIP-0048/openapi3-core.yaml @@ -604,6 +604,61 @@ paths: application/json: schema: $ref: '#/components/schemas/ServiceUnavailableResponse' + '/api/core/v3/blocks/{blockId}/full': + get: + tags: + - blocks + summary: Find the metadata of a given block. + description: >- + Find the metadata of a given block. + parameters: + - in: path + name: blockId + schema: + type: string + example: "0x2de585533d9c9684747e49f70e5e620a4e6c3fd1c7d8b73520c198c7def29a050200000000000000" + required: true + description: Identifier of the block. + responses: + '200': + description: "Successful operation." + content: + application/json: + schema: + $ref: '#/components/schemas/BlockFullResponse' + examples: + default: + $ref: '#/components/examples/get-block-by-id-response-example-new-transaction' + '400': + description: "Unsuccessful operation: indicates that the provided data is invalid." + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + '403': + description: "Unsuccessful operation: indicates that the endpoint is not available for public use." + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenResponse' + '404': + description: "Unsuccessful operation: indicates that the requested data was not found." + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + '500': + description: "Unsuccessful operation: indicates that an unexpected, internal server error happened which prevented the node from fulfilling the request." + content: + application/json: + schema: + $ref: '#/components/schemas/InternalErrorResponse' + '503': + description: "Unsuccessful operation: indicates that the node is not synced." + content: + application/json: + schema: + $ref: '#/components/schemas/ServiceUnavailableResponse' '/api/core/v3/outputs/{outputId}': get: @@ -1157,6 +1212,7 @@ components: decayFactorEpochsSum: 0 decayFactorEpochsSumExponent: 0 tokenSupply: "2779530283277761" + genesisSlot: 5 genesisUnixTimestamp: "1692966168" slotDurationInSeconds: 10 slotsPerEpochExponent: 13 @@ -1177,7 +1233,7 @@ components: schedulerRate: 100000 maxBufferSize: 3276800 maxValidationBufferSize: 100 - versionSignaling: + versionSignalingParameters: windowSize: 7 windowTargetRatio: 5 activationOffset: 7 @@ -1188,13 +1244,13 @@ components: decayBalancingConstantExponent: 8 decayBalancingConstant: "1" poolCoefficientExponent: 31 + targetCommitteeSize: 32 baseToken: name: "Shimmer" tickerSymbol: "SMR" unit: "SMR" decimals: 6 subunit: "glow" - useMetricPrefix: false features: - [] @@ -1222,6 +1278,36 @@ components: value: blockId: "0xb173e2d2b6f72600f00da84492ddb6eadee703dc39fb846725828059272093fb3b00000000000000" + get-full-block-by-id-response-example: + value: + block: + header: + protocolVersion: 3 + networkId: "0" + issuingTime: "1692966346513784862" + slotCommitmentId: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000" + latestFinalizedSlot: 0 + issuerId: "0x375358f92cc94750669598b0aaa55a6ff73310b90710e1fad524c0f911be0fea" + body: + type: 0 + strongParents: + - "0x2de585533d9c9684747e49f70e5e620a4e6c3fd1c7d8b73520c198c7def29a050200000000000000" + - "0x5853745388056fb59c193dc6fe6f8c3f76bf8d82a42ed340eba621a9f5bb79790200000000000000" + weakParents: [] + shallowLikeParents: [] + payload: + type: 0 + tag: "0x4143544956495459" + data: "" + maxBurnedMana: "500" + signature: + type: 0 + publicKey: "0x05c1de274451db8de8182d64c6ee0dca3ae0c9077e0b4330c976976171d79064" + signature: "0xae8a0ad932ff958576bcd787fd578dfb740b8a319d63595a3af7307f56f0afcbc6187d67eee20026aa39b6ba62c93d1a6e27111607b1b1d8f2206889284e9408" + metadata: + blockId: "0x8e7c2d36c236f7d44f26cf8c70b3d99e18e7d7390b32c9637c08c086d9475e6a" + blockState: "confirmed" + get-block-by-id-response-example-new-transaction: value: blockId: "0x8e7c2d36c236f7d44f26cf8c70b3d99e18e7d7390b32c9637c08c086d9475e6a" @@ -1304,7 +1390,7 @@ components: creationSlot: 1649442459 contextInputs: - type: 0 - commitmentId: "0x0e6c2998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a79" + commitmentId: "0x507d5c7d7105022b661e2c755173785f11707b7a6b3369111d000d1f145e652d5f436f26" inputs: - type: 0 transactionId: "0x0c78e998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a79" @@ -1454,7 +1540,7 @@ components: creationSlot: 1649442459 contextInputs: - type: 1 - commitmentId: "0x0e6c2998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a79" + commitmentId: "0x507d5c7d7105022b661e2c755173785f11707b7a6b3369111d000d1f145e652d5f436f26" inputs: - type: 0 transactionId: "0x0c78e998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a79" @@ -2737,16 +2823,12 @@ components: description: The name of the smallest possible denomination of the primary unit. subunit * 10^decimals = unit decimals: type: integer - description: Number of decimals the primary unit is divisible up to. - useMetricPrefix: - type: boolean - description: Whether to use metric prefixes for displaying unit. + description: Number of decimals the primary unit is divisible up to. required: - name - tickerSymbol - unit - decimals - - useMetricPrefix features: description: The features that are supported by the node. All features must be lowercase. type: array @@ -2891,6 +2973,9 @@ components: tokenSupply: type: string description: Current supply of base token. Plain string encoded number. + genesisSlot: + type: integer + description: The slot index of the genesis. genesisUnixTimestamp: type: string description: The genesis timestamp at which the slots start to count. It's in second-precision. @@ -2959,7 +3044,7 @@ components: - decreaseThreshold - schedulerRate - maxBufferSize - versionSignaling: + versionSignalingParameters: description: The version signaling parameters. properties: windowSize: @@ -3003,6 +3088,9 @@ components: - decayBalancingConstantExponent - decayBalancingConstant - poolCoefficientExponent + targetCommitteeSize: + type: integer + description: The target size of the committee. required: - version - networkName @@ -3010,17 +3098,23 @@ components: - tokenSupply - storageScoreParameters - workScoreParameters + - manaParameters + - genesisSlot - genesisUnixTimestamp - slotDurationInSeconds - slotsPerEpochExponent - stakingUnbondingPeriod + - validationBlocksPerSlot + - punishmentEpochs - livenessThresholdLowerBound - livenessThresholdUpperBound - minCommittableAge - maxCommittableAge - epochNearingThreshold - congestionControlParameters - - versionSignaling + - versionSignalingParameters + - rewardsParameters + - targetCommitteeSize required: - startEpoch - parameters @@ -3218,6 +3312,19 @@ components: required: - blockId + BlockFullResponse: + description: Returns the metadata of a given block. + properties: + block: + $ref: '#/components/schemas/Block' + description: The requested block structure. + metadata: + $ref: '#/components/schemas/BlockMetadataResponse' + description: The metadata of the requested block. + required: + - block + - metadata + BlockMetadataResponse: description: Returns the metadata of a given block. properties: From 0e1dd9ac0a0ef3ec891ed5a3ebf8f9e5602e7f1b Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Wed, 22 Nov 2023 21:51:51 +0800 Subject: [PATCH 72/92] Update to latest API --- tips/TIP-0048/asyncapi3.yaml | 7 +----- tips/TIP-0048/openapi3-core.yaml | 42 +++++++++++++++----------------- 2 files changed, 20 insertions(+), 29 deletions(-) diff --git a/tips/TIP-0048/asyncapi3.yaml b/tips/TIP-0048/asyncapi3.yaml index bf5811624..091112821 100644 --- a/tips/TIP-0048/asyncapi3.yaml +++ b/tips/TIP-0048/asyncapi3.yaml @@ -996,10 +996,6 @@ components: type: integer description: A counter that must increase by 1 every time the account is state transitioned. example: 3 - stateMetadata: - type: string - description: Hex-encoded metadata with 0x prefix that can only be changed by the state controller. - example: '0x7665727920696d706f7274616e74207374617465206d65746164617461' unlockConditions: type: array description: >- @@ -1016,7 +1012,6 @@ components: conditions. items: anyOf: - - $ref: '#/components/schemas/SenderFeature' - $ref: '#/components/schemas/MetadataFeature' - $ref: '#/components/schemas/StateMetadataFeature' immutableFeatures: @@ -1062,7 +1057,7 @@ components: validatorAddress: type: string description: >- - The Account ID of the validator to which this output is delegating. + The Account Address of the validator to which this output is delegating. example: '0x1505ec099896ab05d9e08fbc7101ae4dff0093b3943b28f789ed2ca728bcc8d6' startEpoch: type: integer diff --git a/tips/TIP-0048/openapi3-core.yaml b/tips/TIP-0048/openapi3-core.yaml index 8196b245e..805548b6b 100644 --- a/tips/TIP-0048/openapi3-core.yaml +++ b/tips/TIP-0048/openapi3-core.yaml @@ -101,7 +101,7 @@ paths: schema: $ref: '#/components/schemas/InternalErrorResponse' - '/api/core/v3/accounts/{accountId}/congestion': + '/api/core/v3/accounts/{bech32Address}/congestion': get: tags: - accounts @@ -110,12 +110,12 @@ paths: Check the readiness of the node to issue a new block, the reference mana cost based on the rate setter and current network congestion, and the block issuance credits of the requested account. parameters: - in: path - name: accountId + name: bech32Address schema: type: string - example: "0xf532a53545103276b46876c473846d98648ee418468bce76df4868648dd73e5d" + example: "rms1pqm4xk8e9ny5w5rxjkvtp249tfhlwvcshyr3pc0665jvp7g3hc875k538hl" required: true - description: Identifier of the account. + description: The Account Address in bech32. responses: '200': description: "Successful operation." @@ -315,19 +315,19 @@ paths: schema: $ref: '#/components/schemas/ServiceUnavailableResponse' - /api/core/v3/validators/{accountId}: + /api/core/v3/validators/{bech32Address}: get: tags: - validators summary: Return information about a validator. parameters: - in: path - name: accountId + name: bech32Address schema: type: string - example: "0xf532a53545103276b46876c473846d98648ee418468bce76df4868648dd73e5d" + example: "rms1pqm4xk8e9ny5w5rxjkvtp249tfhlwvcshyr3pc0665jvp7g3hc875k538hl" required: true - description: Identifier of the account. + description: The Account Address of the account. responses: '200': description: "Successful operation." @@ -1436,11 +1436,11 @@ components: totalStake: '900000000' totalValidatorStake: '60000000' committee: - - accountId: "0x309b169bfa60c8cf80afd730741862d200405d5df7cabfe9b564361dce1f7036" + - address: "rms1pqm4xk8e9ny5w5rxjkvtp249tfhlwvcshyr3pc0665jvp7g3hc875k538hl" poolStake: '200000' validatorStake: '100000' fixedCost: '50000' - - accountId: "0x897dr69bfa60c8cf80afd730741862d200405d5df7cabfe9b564361dce1f7036" + - address: "rms1pp4wuuz0y42caz48vv876qfpmffswsvg40zz8v79sy8cp0jfxm4kunflcgt" poolStake: '205000' validatorStake: '90000' fixedCost: '52000' @@ -1448,7 +1448,7 @@ components: get-validators-example: value: validators: - - accountId: "0x309b169bfa60c8cf80afd730741862d200405d5df7cabfe9b564361dce1f7036" + - address: "rms1pp4wuuz0y42caz48vv876qfpmffswsvg40zz8v79sy8cp0jfxm4kunflcgt" stakingEpochEnd: 100 poolStake: '200000' validatorStake: '100000' @@ -1456,7 +1456,7 @@ components: active: false latestSupportedProtocolVersion: 3 latestSupportedProtocolHash: "0x0c00425134785bf2dbe42e4ec7e288009ebdc38ced797beaa45d5213092021cb" - - accountId: "0x897dr69bfa60c8cf80afd730741862d200405d5df7cabfe9b564361dce1f7036" + - address: "rms1pqm4xk8e9ny5w5rxjkvtp249tfhlwvcshyr3pc0665jvp7g3hc875k538hl" stakingEpochEnd: 10 poolStake: '205000' validatorStake: '90000' @@ -1469,7 +1469,7 @@ components: get-validator-example: value: - accountId: "0x897dr69bfa60c8cf80afd730741862d200405d5df7cabfe9b564361dce1f7036" + address: "rms1pqm4xk8e9ny5w5rxjkvtp249tfhlwvcshyr3pc0665jvp7g3hc875k538hl" stakingEpochEnd: 100 poolStake: '205000' validatorStake: '90000' @@ -2074,9 +2074,6 @@ components: stateIndex: type: integer description: A counter that must increase by 1 every time the account is state transitioned. - stateMetadata: - type: string - description: Hex-encoded metadata with 0x prefix that can only be changed by the state controller. unlockConditions: type: array description: Unlock conditions that define how the output can be unlocked in a transaction. @@ -2089,7 +2086,6 @@ components: description: Features that add utility to the output but do not impose unlocking conditions. items: anyOf: - - $ref: '#/components/schemas/SenderFeature' - $ref: '#/components/schemas/MetadataFeature' - $ref: '#/components/schemas/StateMetadataFeature' immutableFeatures: @@ -2132,7 +2128,7 @@ components: validatorAddress: type: string description: >- - The Account ID of the validator to which this output is delegating. + The Account Address of the validator to which this output is delegating. example: '0x1505ec099896ab05d9e08fbc7101ae4dff0093b3943b28f789ed2ca728bcc8d6' startEpoch: type: integer @@ -3169,9 +3165,9 @@ components: CommitteeMember: description: Returns information of a committee member. properties: - accountId: + address: type: string - description: The account identifier of the validator + description: The account address of the validator. poolStake: type: string description: The total stake of the pool, including delegators. @@ -3185,9 +3181,9 @@ components: Validator: description: Returns information of a validator. properties: - accountId: + address: type: string - description: The account identifier of the validator + description: The account address of the validator. stakingEpochEnd: type: integer description: The epoch index until which the validator registered to stake. @@ -3210,7 +3206,7 @@ components: type: string description: The latest protocol hash the validator supported. required: - - accountId + - address - stakingEpochEnd - poolStake - validatorStake From da069b45d33114026b1e7b8b7c6f331faee3f169 Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Thu, 23 Nov 2023 13:52:02 +0800 Subject: [PATCH 73/92] Remove omitempty fields in examples --- tips/TIP-0048/openapi3-core.yaml | 3 --- 1 file changed, 3 deletions(-) diff --git a/tips/TIP-0048/openapi3-core.yaml b/tips/TIP-0048/openapi3-core.yaml index 805548b6b..3e9b444dc 100644 --- a/tips/TIP-0048/openapi3-core.yaml +++ b/tips/TIP-0048/openapi3-core.yaml @@ -1404,7 +1404,6 @@ components: allotments: - accountID: "0x030440433d7a726322151f735a6e72543e5b26142d68157d25746a6e45260f37" mana: "5285" - capabilities: "" outputs: - type: 0 amount: "50000000" @@ -1465,7 +1464,6 @@ components: latestSupportedProtocolVersion: 3 latestSupportedProtocolHash: "0x0c00425134785bf2dbe42e4ec7e288009ebdc38ced797beaa45d5213092021cb" pageSize: 50 - cursor: "" get-validator-example: value: @@ -1554,7 +1552,6 @@ components: allotments: - accountID: "0x030440433d7a726322151f735a6e72543e5b26142d68157d25746a6e45260f37" mana: "5285" - capabilities: "" outputs: - type: 0 amount: "50000000" From 5c18cb5798ff1c4d0ee277ec7f7c515dc6d310b1 Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Mon, 27 Nov 2023 16:33:13 +0800 Subject: [PATCH 74/92] Fix typo --- tips/TIP-0048/asyncapi3.yaml | 12 ++++++------ tips/TIP-0048/openapi3-core.yaml | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/tips/TIP-0048/asyncapi3.yaml b/tips/TIP-0048/asyncapi3.yaml index 091112821..c6e56ed6e 100644 --- a/tips/TIP-0048/asyncapi3.yaml +++ b/tips/TIP-0048/asyncapi3.yaml @@ -879,7 +879,7 @@ components: unlockConditions: type: array description: >- - Unlock condtions that define how the output can be unlocked in a + Unlock conditions that define how the output can be unlocked in a transaction. items: anyOf: @@ -937,7 +937,7 @@ components: unlockConditions: type: array description: >- - Unlock condtions that define how the output can be unlocked in a + Unlock conditions that define how the output can be unlocked in a transaction. items: anyOf: @@ -999,7 +999,7 @@ components: unlockConditions: type: array description: >- - Unlock condtions that define how the output can be unlocked in a + Unlock conditions that define how the output can be unlocked in a transaction. items: anyOf: @@ -1072,7 +1072,7 @@ components: unlockConditions: type: array description: >- - Unlock condtions that define how the output can be unlocked in a + Unlock conditions that define how the output can be unlocked in a transaction. items: anyOf: @@ -1116,7 +1116,7 @@ components: unlockConditions: type: array description: >- - Unlock condtions that define how the output can be unlocked in a + Unlock conditions that define how the output can be unlocked in a transaction. items: anyOf: @@ -1170,7 +1170,7 @@ components: unlockConditions: type: array description: >- - Unlock condtions that define how the output can be unlocked in a + Unlock conditions that define how the output can be unlocked in a transaction. items: anyOf: diff --git a/tips/TIP-0048/openapi3-core.yaml b/tips/TIP-0048/openapi3-core.yaml index 3e9b444dc..673a8ff9e 100644 --- a/tips/TIP-0048/openapi3-core.yaml +++ b/tips/TIP-0048/openapi3-core.yaml @@ -1759,7 +1759,7 @@ components: - signature BasicBlock: - description: A basic block is the object that can carry arbitrary payload, such as a tagged data payload ostringr a transaction. + description: A basic block is the object that can carry arbitrary payload, such as a tagged data payload or a transaction. properties: type: type: integer @@ -2140,7 +2140,7 @@ components: unlockConditions: type: array description: >- - Unlock condtions that define how the output can be unlocked in a + Unlock conditions that define how the output can be unlocked in a transaction. items: anyOf: From 4e250d7cccd8ff219a63ccbb96e42c336b79e5a7 Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Thu, 30 Nov 2023 16:29:10 +0800 Subject: [PATCH 75/92] Resolve comments --- tips/TIP-0048/openapi3-core.yaml | 478 ++++++++++++++++++------------- 1 file changed, 281 insertions(+), 197 deletions(-) diff --git a/tips/TIP-0048/openapi3-core.yaml b/tips/TIP-0048/openapi3-core.yaml index 673a8ff9e..bfc78c9a4 100644 --- a/tips/TIP-0048/openapi3-core.yaml +++ b/tips/TIP-0048/openapi3-core.yaml @@ -628,7 +628,7 @@ paths: $ref: '#/components/schemas/BlockFullResponse' examples: default: - $ref: '#/components/examples/get-block-by-id-response-example-new-transaction' + $ref: '#/components/examples/get-full-block-by-id-tagged-data-response-example' '400': description: "Unsuccessful operation: indicates that the provided data is invalid." content: @@ -796,7 +796,7 @@ paths: schema: $ref: '#/components/schemas/OutputWithMetadataResponse' examples: - unspent: + spent: $ref: '#/components/examples/get-full-output-metadata-example' '400': description: "Unsuccessful operation: indicates that the provided data is invalid." @@ -1167,7 +1167,7 @@ components: relativeAcceptedTangleTime: '1692966173856059205' confirmedTangleTime: '1692966168000000000' relativeConfirmedTangleTime: '1692966173855931045' - latestCommitmentID: "0x8fb6cbb1ecf02c6b5a6a5a6a5f6c5a6a5f6c5a6a5a6a5a6a5f6c5a6a5a6a5f6c50000000000000000" + latestCommitmentId: "0x8fb6cbb1ecf02c6b5a6a5a6a5f6c5a6a5f6c5a6a5a6a5a6a5f6c5a6a5a6a5f6c50000000000000000" latestFinalizedSlot: 100 latestAcceptedBlockSlot: 100 latestConfirmedBlockSlot: 95 @@ -1189,7 +1189,7 @@ components: offsetOutputOverhead: '10' offsetEd25519BlockIssuerKey: '100' offsetStakingFeature: '100' - storageScoreOffoffsetDelegationsetDelegation: '100' + offsetDelegation: '100' workScoreParameters: dataByte: 0 block: 100 @@ -1239,7 +1239,7 @@ components: activationOffset: 7 rewardsParameters: profitMarginExponent: 8 - bootstrappinDuration: 1154 + bootstrappingDuration: 1154 manaShareCoefficient: "2" decayBalancingConstantExponent: 8 decayBalancingConstant: "1" @@ -1257,82 +1257,52 @@ components: get-buildingBlock-response-example: value: strongParents: - - "0x4f746934d0075179a37ca3e807b7e793ec4ec9189ba31c9ad092d7497b01118c1000000000000000" - - "0x59daaaba1cd10cd268966376e17710d100c90826fe258753d461acac99b7e3341500000000000000" + - "0x0482f0eba39a23c9a13072c93d828b55543132c47f5f57514d9e55535e9d4f4f35000000" + - "0xae7c4f55a6db8bf4841e4a38f06d32ab9bd88b927a6ba0bc19bcb19c625ff8b63c000000" weakParents: - - "0xebb058f1f1c8f1ac6508465deeee1dd090396f9e6e2b5c103eef5583f20a0c133a00000000000000" - - "0xb173e2d2b6f72600f00da84492ddb6eadee703dc39fb846725828059272093fb3b00000000000000" + - "0x67e57f7446b5a6f152afabb17c6077c26512278a275310a7ff2fa513f4e0b7383d000000" + - "0x2e65c319e9a2c4a6ff7195f9a1ed896c43d0dded1b906979316d502b158965c23d000000" shallowLikeParents: - - "0xdbf86c778d69f413296c2d4d3086d76c74bf4d719e6e95c03a3d9a955ed39bcf3e00000000000000" - - "0xf15b2ec698e396c9d2e69bc753246631aedebb657da09ba0e0c8d42518a1e8953e00000000000000" + - "0xe5fe5231630afaaba609af76787ff1ec9c6088dd17e9cf922152b3facd7bd5883e000000" + - "0xed4b771b5413f5118dd80021ca07fb727e4c54eec9d28d6566c28cc81e7d267c3f000000" latestFinalizedSlot: 1422 commitment: protocolVersion: 3 slot: 1432 - previousCommitmentId: "0xbf07dc16986166953f5a72c19d78642aab6cbde63964a2369ec3d425144eb42b3800000000000000" - rootsId: "0xa4dd36465af63d495d35a05f592d42a51511c153e1bae8fad00453c8cbb48727" + previousCommitmentId: "0xc0300d55fe2cdc93191e52685da009f53d40883ae111291e550eed4e7eb7752746010000" + rootsId: "0x6a8f424929e1f08d87a204efc8a60499b789465aaa28178b77debe75cc2915d3" cumulativeWeight: '45678' referenceManaCost: '12345' post-blocks-response-example: value: - blockId: "0xb173e2d2b6f72600f00da84492ddb6eadee703dc39fb846725828059272093fb3b00000000000000" - - get-full-block-by-id-response-example: - value: - block: - header: - protocolVersion: 3 - networkId: "0" - issuingTime: "1692966346513784862" - slotCommitmentId: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000" - latestFinalizedSlot: 0 - issuerId: "0x375358f92cc94750669598b0aaa55a6ff73310b90710e1fad524c0f911be0fea" - body: - type: 0 - strongParents: - - "0x2de585533d9c9684747e49f70e5e620a4e6c3fd1c7d8b73520c198c7def29a050200000000000000" - - "0x5853745388056fb59c193dc6fe6f8c3f76bf8d82a42ed340eba621a9f5bb79790200000000000000" - weakParents: [] - shallowLikeParents: [] - payload: - type: 0 - tag: "0x4143544956495459" - data: "" - maxBurnedMana: "500" - signature: - type: 0 - publicKey: "0x05c1de274451db8de8182d64c6ee0dca3ae0c9077e0b4330c976976171d79064" - signature: "0xae8a0ad932ff958576bcd787fd578dfb740b8a319d63595a3af7307f56f0afcbc6187d67eee20026aa39b6ba62c93d1a6e27111607b1b1d8f2206889284e9408" - metadata: - blockId: "0x8e7c2d36c236f7d44f26cf8c70b3d99e18e7d7390b32c9637c08c086d9475e6a" - blockState: "confirmed" + blockId: "0x0482f0eba39a23c9a13072c93d828b55543132c47f5f57514d9e55535e9d4f4f35000000" get-block-by-id-response-example-new-transaction: value: - blockId: "0x8e7c2d36c236f7d44f26cf8c70b3d99e18e7d7390b32c9637c08c086d9475e6a" + blockId: "0x0482f0eba39a23c9a13072c93d828b55543132c47f5f57514d9e55535e9d4f4f35000000" blockState: "pending" transactionState: "pending" get-block-by-id-response-example-new: value: - blockId: "0x8e7c2d36c236f7d44f26cf8c70b3d99e18e7d7390b32c9637c08c086d9475e6a" + blockId: "0x0482f0eba39a23c9a13072c93d828b55543132c47f5f57514d9e55535e9d4f4f35000000" blockState: "pending" get-block-by-id-response-example-confirmed-transaction: value: - blockId: "0x8e7c2d36c236f7d44f26cf8c70b3d99e18e7d7390b32c9637c08c086d9475e6a" + blockId: "0xf7ac0552041789a3931ae76eafa47df063632cddd3f8b11bd0bfffba1bc8c46800000000" blockState: "confirmed" transactionState: "confirmed" get-block-by-id-response-example-confirmed: value: - blockId: "0x8e7c2d36c236f7d44f26cf8c70b3d99e18e7d7390b32c9637c08c086d9475e6a" + blockId: "0x3848a6d17070830206e5032fbce2ae3939e60eec0816546e074316b1f66977d04d010000" blockState: "confirmed" get-block-by-id-response-example-conflicting-transaction: value: - blockId: "0x8e7c2d36c236f7d44f26cf8c70b3d99e18e7d7390b32c9637c08c086d9475e6a" + blockId: "0x3848a6d17070830206e5032fbce2ae3939e60eec0816546e074316b1f66977d04d010000" blockState: "confirmed" transactionState: "failed" transactionFailureReason: 2 @@ -1342,92 +1312,99 @@ components: header: protocolVersion: 3 networkId: "0" - issuingTime: "1692966293697706488" - slotCommitmentId: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000" + issuingTime: "1695275834000000000" + slotCommitmentId: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd700000000" latestFinalizedSlot: 0 - issuerId: "0x375358f92cc94750669598b0aaa55a6ff73310b90710e1fad524c0f911be0fea" + issuerId: "0x1d0140675f050c4d6e1018510a103d2f4c134a31463965775f7d284959045100" body: type: 0 strongParents: - - "0x2de585533d9c9684747e49f70e5e620a4e6c3fd1c7d8b73520c198c7def29a050200000000000000" - - "0x5853745388056fb59c193dc6fe6f8c3f76bf8d82a42ed340eba621a9f5bb79790200000000000000" + - "0x087a2734114e6c041e423a310d7c2039302825484b6c326a560c3a6e281d274a3d18110e" weakParents: [] shallowLikeParents: [] payload: type: 0 - tag: "0x4143544956495459" - data: "" - maxBurnedMana: "500" + tag: "0x746167" + data: "0x175d051d3873347d3b2617773240644f780f683064094a0c0b4d1a0c621f0160572c324d371a792536786a2719307b590b5f6d585e3a28740a42080942607a131a5e68242735131920230f72513d01694a54507c340e7817514457462a19213c7270212732506a10097a3e36732c011c6f513202360660240d597d7076014750600c27072540123b7b49137409282d48577a0247125a1c6c13456c2d350a6a224a35" + maxBurnedMana: "100" signature: type: 0 - publicKey: "0x05c1de274451db8de8182d64c6ee0dca3ae0c9077e0b4330c976976171d79064" - signature: "0xae8a0ad932ff958576bcd787fd578dfb740b8a319d63595a3af7307f56f0afcbc6187d67eee20026aa39b6ba62c93d1a6e27111607b1b1d8f2206889284e9408" + publicKey: "0x1a382c2224662059334e1d6e076b3a490b594c31332e3d652d402f5139263e56" + signature: "0x15216f030f65647910225f736f627d12600607064d7305235c3818700d01633e5d625e11497a3e514e6f5a0e6a51091e475c604125360813067c740346320520" post-transaction-block-request-example-full: value: header: protocolVersion: 3 networkId: "0" - issuingTime: "1692966293697706488" - slotCommitmentId: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000" + issuingTime: "1695275834000000000" + slotCommitmentId: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd700000000" latestFinalizedSlot: 0 - issuerId: "0x375358f92cc94750669598b0aaa55a6ff73310b90710e1fad524c0f911be0fea" + issuerId: "0x65767c660e6c324c377e164f3f3c2a267515573d6c53300753532e1c384f521f" body: type: 0 strongParents: - - "0x8d6f3b6e3a63ce388d2eb8c927c5b9ba328b0e427ae727d8b3dddc429f6fb24a0000000000000000" - - "0x408a53af982c49d1398ab5c5b5f5b390d4c4da7da48b61bb9ba7f97c1e8dd7f60000000000000000" - weakParents: - - "0xe8a904ce3ee081f20a68bb38b2d406cfd138775ba52ea555d93a4e4d4b0ad8440000000000000000" - - "0xbce912a0f383cd07660d3c08f3d3f3c7fb9de31e2cc1b93d4c29332ef693ba0c0000000000000000" - shallowLikeParents: - - "0x0276d29ec6b3cbbf3ed6d1f01af8e29b9c6a9ee9c9375e8e5b5b5c5b5b5d45580000000000000000" - - "0x70a5ce5d8fc3290a9885b1af5d8766d51db89a67a6a839f6d23a6cb8d6f3b6e30000000000000000" + - "0x140615473c0b60295c5a25005079200d4f442d146d64040440215d175502070273570c41" + - "0x1676520722326709496b63473b675056311c14246a1f015830381e55045d793c6d4f6f74" + - "0x1d2e710f056f16013d76491d25694124066212550d5a42305e504e5135452b2935595d3d" + - "0x225654001b334b3b55537e45214054721d04190807391d21522a4e780f2a7a7279727810" + - "0x40034a2739225358130f741f4455356b524c333c4a0775673f511b1e1262721a20464240" + - "0x48770460472b4b6e146f5135460e2b31361a34235668153e01161a07136d5f345101463b" + - "0x4a36305a1d393c151e072e75777d436f7733646d0a007e5b45416a09777d4b425c1f2f64" + weakParents: [] + shallowLikeParents: [] payload: type: 1 transaction: - networkId: "1337133713371337" - creationSlot: 1649442459 - contextInputs: - - type: 0 - commitmentId: "0x507d5c7d7105022b661e2c755173785f11707b7a6b3369111d000d1f145e652d5f436f26" + networkId: "14147312347886322761" + creationSlot: 0 + contextInputs: [] inputs: - type: 0 - transactionId: "0x0c78e998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a79" - transactionOutputIndex: 0 - - type: 0 - transactionId: "0x309b169bfa60c8cf80afd730741862d200405d5df7cabfe9b564361dce1f7036" - transactionOutputIndex: 0 + transactionId: "0x130c2227193b1b53471f57121a6f5b69096657364d4f7122244c7c6435655c2f592b7e60" + transactionOutputIndex: 7 - type: 0 - transactionId: "0xc138ecdc882010245e9574fbc1f1f43cc7c182fa890e46e018365dd49de0f16e" - transactionOutputIndex: 0 + transactionId: "0x163443007c67496a1e676d516b4f46394c06673539016279137556061778072865324235" + transactionOutputIndex: 110 allotments: - - accountID: "0x030440433d7a726322151f735a6e72543e5b26142d68157d25746a6e45260f37" - mana: "5285" + - accountId: "0x7905041c4e6a193b26355b15331a5d6c723314703603720a011a613a12147e62" + mana: "1538" + capabilities: "" outputs: - type: 0 - amount: "50000000" - mana: "6802" + amount: "9544" + mana: "0" + unlockConditions: + - type: 0 + address: + type: 0 + pubKeyHash: "0x2176036e36344e09491f523e010763316a790f673d0520282c5130232e0e6e45" + features: [] + - type: 0 + amount: "9151" + mana: "0" unlockConditions: - type: 0 address: type: 0 - pubKeyHash: "0xd49931814e6bfbb8e221f1b2936e206e5a6b6abeb9c070f8603814c525c9abe3" + pubKeyHash: "0x16435722263d2c227371171b0e722f08025f25484a494259660c16051a090f35" + features: [] unlocks: - type: 0 signature: type: 0 - publicKey: "0x40d0c00fd629a5f528e4bcab4333926a90d06613a3f36a325defcdaf4c9e4092" - signature: "0xed4a63a3e1b22c85f9813b00a21c8576ed72c1f5bc939d01fcea7dcd678c2d0d8d80a2499965d8ce5574c9e92aa0d42b72b969bab3a2a35fe7dbc64659a0d703" - - type: 1 - reference: 0 - - type: 1 - reference: 0 - maxBurnedMana: "105368" + publicKey: "0x6d6364560d7e61654c4a4c30796e3e447e3c2b1d4c40671d651c6963086c3c23" + signature: "0x58682c5e5d4076434a280733442a7b1737461357256849022d76744a5c357e1a080b347c757543112c52326849322e621c0b532800154d201f39345e225a0a69" + - type: 0 + signature: + type: 0 + publicKey: "0x3902310d7643157b0b21443d446e26514f07541a060839273b2900553c057e4a" + signature: "0x75247e514b07576c7556454b295b2e1e39681a521b387347132c05160d2504022d3f0c70651b4e173e68045b47275c02357921700c187c355c784e2807585056" + maxBurnedMana: "100" signature: type: 0 - publicKey: "0x05c1de274451db8de8182d64c6ee0dca3ae0c9077e0b4330c976976171d79064" - signature: "0xae8a0ad932ff958576bcd787fd578dfb740b8a319d63595a3af7307f56f0afcbc6187d67eee20026aa39b6ba62c93d1a6e27111607b1b1d8f2206889284e9408" + publicKey: "0x6c7d5c3b573a39062b064a7c4927162a18296b2a7a026365054871563f5a2e1d" + signature: "0x25393e6d79557407472216133c5c685f3b46316f5932434f3d463a282f575e73227b72122b797d570e3a23143b6531542c2c1d280519213e111736014707036b" get-committee-example: value: @@ -1494,136 +1471,170 @@ components: header: protocolVersion: 3 networkId: "0" - issuingTime: "1692966346513784862" - slotCommitmentId: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000" + issuingTime: "1695275834000000000" + slotCommitmentId: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd700000000" latestFinalizedSlot: 0 - issuerId: "0x375358f92cc94750669598b0aaa55a6ff73310b90710e1fad524c0f911be0fea" + issuerId: "0x2c2f5d78353a5b196739067e0d343a5c4a746b2655151d1370632743590b0907" body: type: 0 strongParents: - - "0x2de585533d9c9684747e49f70e5e620a4e6c3fd1c7d8b73520c198c7def29a050200000000000000" - - "0x5853745388056fb59c193dc6fe6f8c3f76bf8d82a42ed340eba621a9f5bb79790200000000000000" + - "0x0262440c401f7c38017069352072443d13467a240f440b285a2c1f445d5d157032043e2d" + - "0x0e124e700030096f6d21496466770f28495541227d287246532812383a027a1b73355757" + - "0x67230f6c676d604e163668142a4e59155b2e723a035c130a0131082345763a7d5f500454" weakParents: [] shallowLikeParents: [] - maxBurnedMana: "0" + maxBurnedMana: "100" signature: type: 0 - publicKey: "0x05c1de274451db8de8182d64c6ee0dca3ae0c9077e0b4330c976976171d79064" - signature: "0xae8a0ad932ff958576bcd787fd578dfb740b8a319d63595a3af7307f56f0afcbc6187d67eee20026aa39b6ba62c93d1a6e27111607b1b1d8f2206889284e9408" + publicKey: "0x3a56300f6f4d301a727b206148471c1373092359391a74375c53764b141a6c2d" + signature: "0x460e3b225308117a522a2e5a6a3e4928031a40726d54292103447658685f38624d11535a23687a77083a195c5f510502111a6a7051776f3327190c1613401e5e" get-block-by-id-transaction-response-example: value: header: protocolVersion: 3 networkId: "0" - issuingTime: "1692966346513784862" - slotCommitmentId: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000" + issuingTime: "1695275834000000000" + slotCommitmentId: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd700000000" latestFinalizedSlot: 0 - issuerId: "0x375358f92cc94750669598b0aaa55a6ff73310b90710e1fad524c0f911be0fea" + issuerId: "0x2f67061e353b5763494b251a1c603c4b0f2b23784d1a2b112f39712a7e190577" body: type: 0 strongParents: - - "0x8d6f3b6e3a63ce388d2eb8c927c5b9ba328b0e427ae727d8b3dddc429f6fb24a0000000000000000" - - "0x408a53af982c49d1398ab5c5b5f5b390d4c4da7da48b61bb9ba7f97c1e8dd7f60000000000000000" - weakParents: - - "0xe8a904ce3ee081f20a68bb38b2d406cfd138775ba52ea555d93a4e4d4b0ad8440000000000000000" - - "0xbce912a0f383cd07660d3c08f3d3f3c7fb9de31e2cc1b93d4c29332ef693ba0c0000000000000000" - shallowLikeParents: - - "0x0276d29ec6b3cbbf3ed6d1f01af8e29b9c6a9ee9c9375e8e5b5b5c5b5b5d45580000000000000000" - - "0x70a5ce5d8fc3290a9885b1af5d8766d51db89a67a6a839f6d23a6cb8d6f3b6e30000000000000000" + - "0x2d5e2221447d1c104d153d4426474c565d145037245234790228543e2c654748460e391b" + - "0x4a14252a34665d7b316420697e772b76547036017e487d1e1e4b2c6e0c5920415d327e0c" + - "0x523d1d0030435d69736d6a5f68625f647e5310076f605520295b042c64296253486c745d" + weakParents: [] + shallowLikeParents: [] payload: type: 1 transaction: - networkId: "1337133713371337" - creationSlot: 1649442459 - contextInputs: - - type: 1 - commitmentId: "0x507d5c7d7105022b661e2c755173785f11707b7a6b3369111d000d1f145e652d5f436f26" + networkId: "14147312347886322761" + creationSlot: 0 + contextInputs: [] inputs: - type: 0 - transactionId: "0x0c78e998f5177834ecb3bae1596d5056af76e487386eecb19727465b4be86a79" - transactionOutputIndex: 0 + transactionId: "0x6c766054650a712a16787501546000205331190e33013825226b0c2f612f7911114f754c" + transactionOutputIndex: 82 - type: 0 - transactionId: "0x309b169bfa60c8cf80afd730741862d200405d5df7cabfe9b564361dce1f7036" - transactionOutputIndex: 0 - - type: 0 - transactionId: "0xc138ecdc882010245e9574fbc1f1f43cc7c182fa890e46e018365dd49de0f16e" - transactionOutputIndex: 0 + transactionId: "0x3b33480f1f77043e12443a50191c0c2061494740747e44057d05794129670b7846314857" + transactionOutputIndex: 22 allotments: - - accountID: "0x030440433d7a726322151f735a6e72543e5b26142d68157d25746a6e45260f37" - mana: "5285" + - accountId: "0x7373587a141f4d5a5b262b185234760d50411c326f05300c2874716d24770b64" + mana: "3334" + capabilities: "" outputs: - type: 0 - amount: "50000000" + amount: "9315" + mana: "0" + unlockConditions: + - type: 0 + address: + type: 0 + pubKeyHash: "0x50783863416b5750544c6f1f165d664c224b4d51506e631e3c221602085e2d59" + features: [] + - type: 0 + amount: "4909" + mana: "0" unlockConditions: - type: 0 address: type: 0 - pubKeyHash: "0xd49931814e6bfbb8e221f1b2936e206e5a6b6abeb9c070f8603814c525c9abe3" + pubKeyHash: "0x271f4e2330314b16747d674c3b6646761a5716180526305253136207255d3854" + features: [] unlocks: - type: 0 signature: type: 0 - publicKey: "0x40d0c00fd629a5f528e4bcab4333926a90d06613a3f36a325defcdaf4c9e4092" - signature: "0xed4a63a3e1b22c85f9813b00a21c8576ed72c1f5bc939d01fcea7dcd678c2d0d8d80a2499965d8ce5574c9e92aa0d42b72b969bab3a2a35fe7dbc64659a0d703" - - type: 1 - reference: 0 - - type: 1 - reference: 0 - maxBurnedMana: "105368" + publicKey: "0x18703b62523674525b10272408452a57083f4d116e0b4d706a59402040143922" + signature: "0x0f15013f08694a7c24350053077709177d626b664b4739384f68487449764c295223313b5361495d783c016c4c7b5a6f1b0c442c564b73500054120272703704" + - type: 0 + signature: + type: 0 + publicKey: "0x2556253d420e31611e16592938517a325e46220d39533d0e4f7335202f68672b" + signature: "0x3f172a67240f3e161357595d2e11007c0e5e7a4c48713a0e28113775271a1733621a5f2d151a20196a2f78383c4a397e045c3d023e4f680b43561b494b744c5b" + maxBurnedMana: "100" signature: type: 0 - publicKey: "0x05c1de274451db8de8182d64c6ee0dca3ae0c9077e0b4330c976976171d79064" - signature: "0xae8a0ad932ff958576bcd787fd578dfb740b8a319d63595a3af7307f56f0afcbc6187d67eee20026aa39b6ba62c93d1a6e27111607b1b1d8f2206889284e9408" + publicKey: "0x0d58682550071056456c6b7b634607036564050f3a15513d495a725a5b345f7c" + signature: "0x685c44265d4a6f2a5653710c6f4a41296b377b44753353082d4619610c2d5e6374153239372b436773354a6421632e3d646f7b1736637321037a0f671f3b3878" + + get-full-block-by-id-tagged-data-response-example: + value: + block: + header: + protocolVersion: 3 + networkId: "0" + issuingTime: "1695275834000000000" + slotCommitmentId: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd700000000" + latestFinalizedSlot: 0 + issuerId: "0x1d0140675f050c4d6e1018510a103d2f4c134a31463965775f7d284959045100" + body: + type: 0 + strongParents: + - "0x087a2734114e6c041e423a310d7c2039302825484b6c326a560c3a6e281d274a3d18110e" + weakParents: [] + shallowLikeParents: [] + payload: + type: 0 + tag: "0x746167" + data: "0x175d051d3873347d3b2617773240644f780f683064094a0c0b4d1a0c621f0160572c324d371a792536786a2719307b590b5f6d585e3a28740a42080942607a131a5e68242735131920230f72513d01694a54507c340e7817514457462a19213c7270212732506a10097a3e36732c011c6f513202360660240d597d7076014750600c27072540123b7b49137409282d48577a0247125a1c6c13456c2d350a6a224a35" + maxBurnedMana: "100" + signature: + type: 0 + publicKey: "0x1a382c2224662059334e1d6e076b3a490b594c31332e3d652d402f5139263e56" + signature: "0x15216f030f65647910225f736f627d12600607064d7305235c3818700d01633e5d625e11497a3e514e6f5a0e6a51091e475c604125360813067c740346320520" + metadata: + blockId: "0x3848a6d17070830206e5032fbce2ae3939e60eec0816546e074316b1f66977d04d010000" + blockState: "confirmed" get-block-by-id-tagged-data-response-example: value: header: protocolVersion: 3 networkId: "0" - issuingTime: "1692966346513784862" - slotCommitmentId: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000" + issuingTime: "1695275834000000000" + slotCommitmentId: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd700000000" latestFinalizedSlot: 0 - issuerId: "0x375358f92cc94750669598b0aaa55a6ff73310b90710e1fad524c0f911be0fea" + issuerId: "0x1d0140675f050c4d6e1018510a103d2f4c134a31463965775f7d284959045100" body: type: 0 strongParents: - - "0x2de585533d9c9684747e49f70e5e620a4e6c3fd1c7d8b73520c198c7def29a050200000000000000" - - "0x5853745388056fb59c193dc6fe6f8c3f76bf8d82a42ed340eba621a9f5bb79790200000000000000" + - "0x087a2734114e6c041e423a310d7c2039302825484b6c326a560c3a6e281d274a3d18110e" weakParents: [] shallowLikeParents: [] payload: type: 0 - tag: "0x4143544956495459" - data: "" - maxBurnedMana: "500" + tag: "0x746167" + data: "0x175d051d3873347d3b2617773240644f780f683064094a0c0b4d1a0c621f0160572c324d371a792536786a2719307b590b5f6d585e3a28740a42080942607a131a5e68242735131920230f72513d01694a54507c340e7817514457462a19213c7270212732506a10097a3e36732c011c6f513202360660240d597d7076014750600c27072540123b7b49137409282d48577a0247125a1c6c13456c2d350a6a224a35" + maxBurnedMana: "100" signature: type: 0 - publicKey: "0x05c1de274451db8de8182d64c6ee0dca3ae0c9077e0b4330c976976171d79064" - signature: "0xae8a0ad932ff958576bcd787fd578dfb740b8a319d63595a3af7307f56f0afcbc6187d67eee20026aa39b6ba62c93d1a6e27111607b1b1d8f2206889284e9408" + publicKey: "0x1a382c2224662059334e1d6e076b3a490b594c31332e3d652d402f5139263e56" + signature: "0x15216f030f65647910225f736f627d12600607064d7305235c3818700d01633e5d625e11497a3e514e6f5a0e6a51091e475c604125360813067c740346320520" get-block-by-id-validation-response-example: value: header: protocolVersion: 3 networkId: "0" - issuingTime: "1692966346513784862" - slotCommitmentId: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd70000000000000000" + issuingTime: "1695275834000000000" + slotCommitmentId: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd700000000" latestFinalizedSlot: 0 - issuerId: "0x375358f92cc94750669598b0aaa55a6ff73310b90710e1fad524c0f911be0fea" + issuerId: "0x5201107e2f0b5d3432100560291216613b07725f06001a6a10317d320c767424" body: type: 1 strongParents: - - "0x2de585533d9c9684747e49f70e5e620a4e6c3fd1c7d8b73520c198c7def29a050200000000000000" - - "0x5853745388056fb59c193dc6fe6f8c3f76bf8d82a42ed340eba621a9f5bb79790200000000000000" + - "0x07772a2f00585b53650c71223c77621e466210097a1177534f54633a4e77657d175d185f" + - "0x3962007c6c75357d356b15125579770c653f7a55571816701a7c6766347a347b05497402" weakParents: [] shallowLikeParents: [] - highestSupportedVersion: 3 - protocolParametersHash: "0x69449327e1973152a1d2fdff1c8f27428fc52e4f1cf0bb8006eae397714e1968" + highestSupportedVersion: 4 + protocolParametersHash: "0x8f2857e188708fc896dab7fc60196d2f728d6229b20bcd726a60ad5c52a5368b" signature: type: 0 - publicKey: "0x05c1de274451db8de8182d64c6ee0dca3ae0c9077e0b4330c976976171d79064" - signature: "0xae8a0ad932ff958576bcd787fd578dfb740b8a319d63595a3af7307f56f0afcbc6187d67eee20026aa39b6ba62c93d1a6e27111607b1b1d8f2206889284e9408" + publicKey: "0x2a31120a501c0d522d2f76514b4a3b5e415b022356264b4c332a507b431c1965" + signature: "0x25600518034504557a011174413d0054601730066c221879477b06482966783f340a6d650f48552f4947640d661c54320c790b04716b262d1a74456f7d0b2551" get-outputs-by-id-response-example: value: @@ -1637,20 +1648,37 @@ components: pubKeyHash: "0x8eaf87ac1f52eb05f2c7c0c15502df990a228838dc37bd18de9503d69afd257d" mana: "2000" outputIdProof: - slot: 20 - outputIndex: 0 - transactionCommitment: "0x897dr69bfa60c8cf80afd730741862d200405d5df7cabfe9b564361dce1f7036" - outputCommitmentProof: "0xd3a0a0c76ab2d9b406a32c30c43e102fe0f39a12a3f6c1e3b19d239db2f18d75" + slot: 429632486 + outputIndex: 2 + transactionCommitment: "0x46934d8c62df21e94553f6686a7f9368d9ab4159bcb96f598a94883a866467da" + outputCommitmentProof: + type: 0 + l: + type: 0 + l: + type: 1 + hash: "0x193a27f187c46a386f0e2a25a884351692b7378aae5e7dd78433f2be85106219" + r: + type: 0 + l: + type: 2 + hash: "0x19e4cdd6b17223a935883ddbb80ee6d239a48ea214c29b8b593cc7b3152d15aa" + r: + type: 1 + hash: "0xf1faa521d1b1e85393efd63a6ed1f33bb851bfc90a681e011989d9c6056948cc" + r: + type: 1 + hash: "0xe9cef2152da49d2a78a490bb7e42c6bcd1c96b41ebe156ba90a5b22cb78e3229" get-output-metadata-by-id-response-unspent-example: value: - blockId: "0xd3a0a0c76ab2d9b406a32c30c43e102fe0f39a12a3f6c1e3b19d239db2f18d75" - transactionId: "0x1c52e8e630d1c6e45ab6f46c63d8d6cb02e6c2ed6e31b6c97d6f5c5f5a5d5c5b" + blockId: "0xae7c4f55a6db8bf4841e4a38f06d32ab9bd88b927a6ba0bc19bcb19c625ff8b63c000000" + transactionId: "0xf7e39da700ca56698a953983ba2146c0ef6cb4a1b68ea3f1b806b52e038a84b55a000000" outputIndex: 3 isSpent: false - includedCommitmentId: "0x7c62d9b9ed3c1f3ef942a7ea17ec1270d77c109f0ba57b6c2d2b9e9fb3e69a3a" - latestCommitmentId: "0x7c62d9b9ed3c1f3ef942a7ea17ec1270d77c109f0ba57b6c2d2b9e9fb3e69a3a" + includedCommitmentId: "0x8ec992b2eb422292d2a3a1d4ddc330edb67eeb98eb93cd4c73a026adae3ceb5478010000" + latestCommitmentId: "0xd91549dbf441da4c7e50063b58c05d5b2bfb1d33b346a2f9a18220ce6207f7a289010000" get-full-output-metadata-example: value: @@ -1664,37 +1692,39 @@ components: pubKeyHash: "0x8eaf87ac1f52eb05f2c7c0c15502df990a228838dc37bd18de9503d69afd257d" mana: "2000" outputIdProof: - slot: 20 + slot: 1893592032 outputIndex: 0 - transactionCommitment: "0x897dr69bfa60c8cf80afd730741862d200405d5df7cabfe9b564361dce1f7036" - outputCommitmentProof: "0xd3a0a0c76ab2d9b406a32c30c43e102fe0f39a12a3f6c1e3b19d239db2f18d75" + transactionCommitment: "0xa0687905318860e64db6932d8423bf7a4418627baee62be8089d5f48aaa1af3a" + outputCommitmentProof: + type: 2 + hash: "0x7f9289b104a55e6fb93d60d70f6e85c9706c761b05ccc034f76b465837ca6070" metadata: - blockId: "0xd3a0a0c76ab2d9b406a32c30c43e102fe0f39a12a3f6c1e3b19d239db2f18d75" - transactionId: "0x1c52e8e630d1c6e45ab6f46c63d8d6cb02e6c2ed6e31b6c97d6f5c5f5a5d5c5b" - outputIndex: 3 + blockId: "0xd91549dbf441da4c7e50063b58c05d5b2bfb1d33b346a2f9a18220ce6207f7a289010000" + transactionId: "0xf7e39da700ca56698a953983ba2146c0ef6cb4a1b68ea3f1b806b52e038a84b55a000000" + outputIndex: 0 isSpent: true - commitmentIdSpent: "0x4b91c935926c77d0ac9b4a569c3eb3b0f0c9918f2d4f4d9bb1c7dfc19b41e4c2" - transactionIdSpent: "0x1ee46e19f4219ee65afc10227d0ca22753f76ef32d1e922e5cbe3fbc9b5a5298" - includedCommitmentId: "0x7c62d9b9ed3c1f3ef942a7ea17ec1270d77c109f0ba57b6c2d2b9e9fb3e69a3a" - latestCommitmentId: "0x7c62d9b9ed3c1f3ef942a7ea17ec1270d77c109f0ba57b6c2d2b9e9fb3e69a3a" + commitmentIdSpent: "0xf79e019ddf8d1ab063604e92494a893a6925f7cb40b288b6e50953bc2acfa6598a010000" + transactionIdSpent: "0x43c800f00cc4dbccc496b26ceeab1e00b0ccb1031ccfbe3db95f72a1c36b27a28b010000" + includedCommitmentId: "0x8ec992b2eb422292d2a3a1d4ddc330edb67eeb98eb93cd4c73a026adae3ceb5478010000" + latestCommitmentId: "0xd91549dbf441da4c7e50063b58c05d5b2bfb1d33b346a2f9a18220ce6207f7a289010000" get-output-metadata-by-id-response-spent-example: value: - blockId: "0xd3a0a0c76ab2d9b406a32c30c43e102fe0f39a12a3f6c1e3b19d239db2f18d75" - transactionId: "0x1c52e8e630d1c6e45ab6f46c63d8d6cb02e6c2ed6e31b6c97d6f5c5f5a5d5c5b" + blockId: "0xae7c4f55a6db8bf4841e4a38f06d32ab9bd88b927a6ba0bc19bcb19c625ff8b63c000000" + transactionId: "0xf7e39da700ca56698a953983ba2146c0ef6cb4a1b68ea3f1b806b52e038a84b55a000000" outputIndex: 3 isSpent: true - commitmentIdSpent: "0x4b91c935926c77d0ac9b4a569c3eb3b0f0c9918f2d4f4d9bb1c7dfc19b41e4c2" - transactionIdSpent: "0x1ee46e19f4219ee65afc10227d0ca22753f76ef32d1e922e5cbe3fbc9b5a5298" - includedCommitmentId: "0x7c62d9b9ed3c1f3ef942a7ea17ec1270d77c109f0ba57b6c2d2b9e9fb3e69a3a" - latestCommitmentId: "0x7c62d9b9ed3c1f3ef942a7ea17ec1270d77c109f0ba57b6c2d2b9e9fb3e69a3a" + commitmentIdSpent: "0xf79e019ddf8d1ab063604e92494a893a6925f7cb40b288b6e50953bc2acfa6598a010000" + transactionIdSpent: "0x43c800f00cc4dbccc496b26ceeab1e00b0ccb1031ccfbe3db95f72a1c36b27a28b010000" + includedCommitmentId: "0x8ec992b2eb422292d2a3a1d4ddc330edb67eeb98eb93cd4c73a026adae3ceb5478010000" + latestCommitmentId: "0xd91549dbf441da4c7e50063b58c05d5b2bfb1d33b346a2f9a18220ce6207f7a289010000" get-commitment-response-example: value: protocolVersion: 3 slot: 986 - previousCommitmentId: "0x8fb6cbb1ecf02c6b5a6a5a6a5f6c5a6a5f6c5a6a5a6a5a6a5f6c5a6a5a6a5f6c50000000000000000" - rootsId: "0xa4dd36465af63d495d35a05f592d42a51511c153e1bae8fad00453c8cbb48727" + previousCommitmentId: "0xd91549dbf441da4c7e50063b58c05d5b2bfb1d33b346a2f9a18220ce6207f7a289010000" + rootsId: "0x6a8f424929e1f08d87a204efc8a60499b789465aaa28178b77debe75cc2915d3" cumulativeWeight: '78901' referenceManaCost: '600' @@ -1703,13 +1733,13 @@ components: get-utxo-changes-response-example: value: - slot: 789 + commitmentId: "0x3b264c038283c30094e0cb5d22eaa52c9959bfda084ace3980b30d4be588fa0012000000" createdOutputs: - - "0x1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2" - - "0x3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4" + - "0x2628fd7c1ad5dd635fa76c6f4c2272fbdb658cc3437dbed07f9984580b227b63f0a3e4d40000" + - "0xfa3d71ea93849b317c2b29c928b726b6d3bd2131c7ad560c9e28952f117fd50c35d6e0890000" consumedOutputs: - - "0x5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6" - - "0x7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7" + - "0xfa3d71ea93849b317c2b29c928b726b6d3bd2131c7ad560c9e28952f117fd50c35d6e0890100" + - "0x9c40a07de878863fbda03caeb68875254c49199e6b55740f78a4bab3686f89957b1249130000" schemas: @@ -3306,7 +3336,7 @@ components: - blockId BlockFullResponse: - description: Returns the metadata of a given block. + description: Returns the block structure and the metadata of a given block. properties: block: $ref: '#/components/schemas/Block' @@ -3427,19 +3457,73 @@ components: description: The slot index of the output. outputIndex: type: integer - description: The index of the output. + description: The index of the output within the corresponding transaction. transactionCommitment: type: string description: The commitment of the transaction that created the output. Hex-encoded with 0x prefix. outputCommitmentProof: - type: string description: The proof of the output commitment. Hex-encoded with 0x prefix. + anyOf: + - $ref: '#/components/schemas/HashableNode' + - $ref: '#/components/schemas/LeafHash' + - $ref: '#/components/schemas/ValueHash' required: - slot - outputIndex - transactionCommitment - outputCommitmentProof + HashableNode: + description: Node contains the hashes of the left and right children of a node in the tree. + properties: + type: + type: integer + description: Set to value 0 to denote a Hashable Node. + node: + properties: + l: + description: The left node. Hex-encoded with 0x prefix. + anyOf: + - $ref: '#/components/schemas/HashableNode' + - $ref: '#/components/schemas/LeafHash' + - $ref: '#/components/schemas/ValueHash' + r: + description: The right node. Hex-encoded with 0x prefix. + anyOf: + - $ref: '#/components/schemas/HashableNode' + - $ref: '#/components/schemas/LeafHash' + - $ref: '#/components/schemas/ValueHash' + required: + - type + - node + + LeafHash: + description: Leaf Hash contains the hash of a leaf in the tree. + properties: + type: + type: integer + description: Set to value 1 to denote a Leaf Hash. + hash: + type: string + description: The hash of a leaf in the tree. Hex-encoded with 0x prefix. + required: + - type + - hash + + ValueHash: + description: Value Hash contains the hash of the value for which the proof is being computed. + properties: + type: + type: integer + description: Set to value 2 to denote a Value Hash. + hash: + type: string + description: the hash of the value for which the proof is being computed. Hex-encoded with 0x prefix. + required: + - type + - hash + + OutputWithMetadataResponse: description: Returns an output. properties: @@ -3473,7 +3557,7 @@ components: description: The identifier of the transaction. Hex-encoded with 0x prefix. outputIndex: type: integer - description: The index of the output. + description: The index of the output within the corresponding transaction. isSpent: type: boolean description: Tells if the output is spent in a confirmed transaction or not. @@ -3499,9 +3583,9 @@ components: UTXOChangesResponse: description: Returns all UTXO changes of the given slot. properties: - slot: - type: integer - description: The slot index of the given slot. + commitmentId: + type: string + description: The commitment ID of the requested slot that contains the changes. Hex-encoded with 0x prefix. createdOutputs: description: The created outputs of the given slot. type: array From 367c2fe458c77048eea3694c4028b97d868b4b9f Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Wed, 6 Dec 2023 15:18:42 +0800 Subject: [PATCH 76/92] Resolve comments --- tips/TIP-0048/asyncapi3.yaml | 21 ++- tips/TIP-0048/openapi3-core.yaml | 278 +++++++++++++++++-------------- 2 files changed, 163 insertions(+), 136 deletions(-) diff --git a/tips/TIP-0048/asyncapi3.yaml b/tips/TIP-0048/asyncapi3.yaml index c6e56ed6e..3c89fb32e 100644 --- a/tips/TIP-0048/asyncapi3.yaml +++ b/tips/TIP-0048/asyncapi3.yaml @@ -360,7 +360,7 @@ components: type: string format: binary example: >- - 070000000a1a0000977c626276b19ef8b3c445709f2f0f2ccc4abb98d97617f421f240c0d1ee066d4306e67a0321889ef8ec89b7eff1378049e058f0fa87a78c2452ae72631a5a99d913d1cbb3525b8faa1800e28dfcb28154bcba10154c39ef87ceda793cb44f58ae1549c88ea13fe4a9695bb6f0aba6cb756522209e5066a96039ae12b398b975693bdc21e222997c86ff9bfc5844f0372d58ff6fa510688e53c181bbdf4db41f9b627540a70e5751c026e543b2e8ab2eb06099daa1d1e5df47778f7787faab45cdf12fe3a80000000300d85e5b1590d898d1e0cdebb2e3b5337c8b76270142663d78811683ba47c17c989ad7a8f0ff2c6438bf435786d4a5b0125a5caf7367061b49a739389d5ebea234c0466c86f88a3f8add03bff04c2e34b214683f2f6983641e1d1185da7e2c3e0200d9922819a39e94ddf3907f4b9c8df93f39f026244fcb609205b9a879022599f218be2536d8b7b8547faa3dbdfe98339ebe9e2b2417a8a03eee02b2a8312b9e026dd0a33261a58a240cd0a1b06cdf1775d98d316f162d3eec402f4bf08bea2a0700f9d9656a60049083eef61487632187b351294c1fa23d118060d813db6d03e8b6ca8180d435708e826bc2042ccd667babb59c5cc461ff29dba966359fcd6fc511cdfdf10d6576f36ac2a6e5cb691e13968c13947ffbd9239939d3802b2fbe0f06 + 0x0312000000075b05e0a8fd4b9c7e7bc165b62c48945292f7d76d23f76525f886c416dc0e364089b57c32ddb8c614ed1d2c844401d2a5325b4d153c7f94464bbda3a8d14289b203f96759000000000000009000000000000000 CommitmentInfoResponse: contentType: application/json payload: @@ -383,7 +383,7 @@ components: type: string format: binary example: >- - 0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eb000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000020000016920b176f613ec7be59e68fc68f597eb3393af80f74c7c3db78198147d5f1f92640000000000000000018afe1f314622cc1ef52f16d619d1baccff81816b7e4e35fe268dc247b730acd65d5d2dd3f7df09000000000001000001f7868ab6bb55800b77b8b74191ad8285a9bf428ace579d541fda47661803ff44e0af5c34ad4edf475a01fb46e089a7afcab158b4a0133f32e889083e1c77eef65548933e0c6d2c3b0ac006cd77e77d778bf37b8d38d219fb62a9a2f718d4c9095100000000000000 + 03490443ee9f5955c4bb2ab676df2c9e1796f8ae1c96f769d56d883bdf3dbed2261413a0ae8e281d17822be093cb3ddcdf202a60b2f4010000a371f6fb9f7d201d80bdd55fe7d1d64e713066e1bca1a6e6f5bd0120473530790006002d31ee96475d45115d600bc9321a36a067e0e8c46d0e910deeaf3a96a7893eec906b2402b9d83256d47058ecd186e2349cce2846a07454470e4d921b3dbc5c58ef781af5b06a8b12382bac13c80a7d809b86211818b9f1b59a6a7f59ada12c6708a37d3ad0d39a31e9786067f086718e65229cf610927fd0bbac8d26a9c38d4829d1151023e7f2b09cc2a04adb0888b89b9cc4b217f3b6f7161a15e3a772a8b465e130d1aa8fe62f97e47a7cb17663f6b496a7e29fd91b415db4664ddbd31b9f48f7f8f853fc83996907efe6358cca1061c9903925dda200001800000000037461670f000000d7377ed316f02780a8a7e4b1f69e2aa70200000000000000d62233f3240753d4f14a1cff3e6a6c126dc85854e34f5754babcf229f02707ce2958bd23a1c2ccf10123456d33211b98b751f99b791eb6d9737bc0dfd7f0ac09532599c32757ad2fd4bd906bd9ea2bf4c8f3682c015cf9068c914d1cb04ad80b OutputPayload: contentType: application/json @@ -771,13 +771,16 @@ components: type: integer description: Set to value 2 to denote a Metadata Feature. example: 2 - data: - type: string - description: Hex-encoded binary data. - example: '0xfa0de75d225cca2799395e5fc340702fc7eac8' + entries: + type: object + additionalProperties: + type: string + example: + - 'did:iota': '0x68656c6c6f206469676974616c206175746f6e6f6d79' + - 'hello': '0x776f726c64' required: - type - - data + - entries StateMetadataFeature: description: >- Defines a map of key-value pairs. The keys must consist of ASCII characters only and the values are arbitrary byte slices. @@ -787,7 +790,9 @@ components: description: Set to value 3 to denote a State Metadata Feature. example: 3 entries: - type: string + type: object + additionalProperties: + type: string description: Hex-encoded binary data. example: - 'did:iota': '0x68656c6c6f206469676974616c206175746f6e6f6d79' diff --git a/tips/TIP-0048/openapi3-core.yaml b/tips/TIP-0048/openapi3-core.yaml index bfc78c9a4..9bb0ae753 100644 --- a/tips/TIP-0048/openapi3-core.yaml +++ b/tips/TIP-0048/openapi3-core.yaml @@ -1159,79 +1159,79 @@ components: - "debug/v2" get-info-response-example: value: - name: Example Node - version: 1.0.0 + name: test + version: 2.0.0 status: - isHealthy: true - acceptedTangleTime: '1692966168000000000' - relativeAcceptedTangleTime: '1692966173856059205' - confirmedTangleTime: '1692966168000000000' - relativeConfirmedTangleTime: '1692966173855931045' - latestCommitmentId: "0x8fb6cbb1ecf02c6b5a6a5a6a5f6c5a6a5f6c5a6a5a6a5a6a5f6c5a6a5a6a5f6c50000000000000000" - latestFinalizedSlot: 100 - latestAcceptedBlockSlot: 100 - latestConfirmedBlockSlot: 95 - pruningEpoch: 20 + isHealthy: false + acceptedTangleTime: "1690879505000000000" + relativeAcceptedTangleTime: "1690879505000000000" + confirmedTangleTime: "1690879505000000000" + relativeConfirmedTangleTime: "1690879505000000000" + latestCommitmentId: "0xf35c9c906190e9fb02b7969ea69567e5a4bbfdbcc389f93e2b5d0c105e03979aed5b248e" + latestFinalizedSlot: 1 + latestAcceptedBlockSlot: 2 + latestConfirmedBlockSlot: 3 + pruningEpoch: 4 metrics: - blocksPerSecond: '1.5E+00' - confirmedBlocksPerSecond: '1.5E+00' - confirmationRate: '1E+02' + blocksPerSecond: "1.1E+00" + confirmedBlocksPerSecond: "2.2E+00" + confirmationRate: "3.3E+00" protocolParameters: - - startEpoch: 1 + - startEpoch: 0 parameters: type: 0 version: 3 - networkName: iota-core-testnet - bech32Hrp: rms + networkName: TestJungle + bech32Hrp: tgl storageScoreParameters: - storageCost: '500' - factorData: 1 - offsetOutputOverhead: '10' - offsetEd25519BlockIssuerKey: '100' - offsetStakingFeature: '100' - offsetDelegation: '100' + storageCost: "0" + factorData: 0 + offsetOutputOverhead: "0" + offsetEd25519BlockIssuerKey: "0" + offsetStakingFeature: "0" + offsetDelegation: "0" workScoreParameters: dataByte: 0 - block: 100 - input: 20 - contextInput: 20 - output: 20 - nativeToken: 20 - staking: 100 - blockIssuer: 100 - allotment: 100 - signatureEd25519: 200 + block: 1 + input: 0 + contextInput: 0 + output: 0 + nativeToken: 0 + staking: 0 + blockIssuer: 0 + allotment: 0 + signatureEd25519: 0 manaParameters: bitsCount: 63 generationRate: 1 - generationRateExponent: 0 + generationRateExponent: 17 decayFactors: - - 10 - - 20 - decayFactorsExponent: 0 - decayFactorEpochsSum: 0 - decayFactorEpochsSumExponent: 0 + - 10 + - 20 + decayFactorsExponent: 32 + decayFactorEpochsSum: 2420916375 + decayFactorEpochsSumExponent: 21 tokenSupply: "2779530283277761" - genesisSlot: 5 - genesisUnixTimestamp: "1692966168" + genesisSlot: 0 + genesisUnixTimestamp: "1695275822" slotDurationInSeconds: 10 slotsPerEpochExponent: 13 stakingUnbondingPeriod: 10 validationBlocksPerSlot: 10 punishmentEpochs: 10 - livenessThresholdLowerBound: 5 - livenessThresholdUpperBound: 10 + livenessThresholdLowerBound: 15 + livenessThresholdUpperBound: 30 minCommittableAge: 10 maxCommittableAge: 20 - epochNearingThreshold: 30 + epochNearingThreshold: 24 congestionControlParameters: - minReferenceManaCost: '500' - increase: '500' - decrease: '500' + minReferenceManaCost: "1" + increase: "0" + decrease: "0" increaseThreshold: 800000 decreaseThreshold: 500000 schedulerRate: 100000 - maxBufferSize: 3276800 + maxBufferSize: 1000 maxValidationBufferSize: 100 versionSignalingParameters: windowSize: 7 @@ -1243,16 +1243,16 @@ components: manaShareCoefficient: "2" decayBalancingConstantExponent: 8 decayBalancingConstant: "1" - poolCoefficientExponent: 31 + poolCoefficientExponent: 11 targetCommitteeSize: 32 baseToken: - name: "Shimmer" - tickerSymbol: "SMR" - unit: "SMR" + name: Shimmer + tickerSymbol: SMR + unit: SMR + subunit: glow decimals: 6 - subunit: "glow" features: - - [] + - test get-buildingBlock-response-example: value: @@ -1425,7 +1425,7 @@ components: value: validators: - address: "rms1pp4wuuz0y42caz48vv876qfpmffswsvg40zz8v79sy8cp0jfxm4kunflcgt" - stakingEpochEnd: 100 + stakingEndEpoch: 100 poolStake: '200000' validatorStake: '100000' fixedCost: '50000' @@ -1433,7 +1433,7 @@ components: latestSupportedProtocolVersion: 3 latestSupportedProtocolHash: "0x0c00425134785bf2dbe42e4ec7e288009ebdc38ced797beaa45d5213092021cb" - address: "rms1pqm4xk8e9ny5w5rxjkvtp249tfhlwvcshyr3pc0665jvp7g3hc875k538hl" - stakingEpochEnd: 10 + stakingEndEpoch: 10 poolStake: '205000' validatorStake: '90000' fixedCost: '52000' @@ -1445,7 +1445,7 @@ components: get-validator-example: value: address: "rms1pqm4xk8e9ny5w5rxjkvtp249tfhlwvcshyr3pc0665jvp7g3hc875k538hl" - stakingEpochEnd: 100 + stakingEndEpoch: 100 poolStake: '205000' validatorStake: '90000' fixedCost: '52000' @@ -1455,8 +1455,8 @@ components: get-mana-rewards-example: value: - epochStart: 60 - epochEnd: 80 + startEpoch: 60 + endEpoch: 80 rewards: '800000' get-congestion-estimate-response-example: @@ -1673,12 +1673,13 @@ components: get-output-metadata-by-id-response-unspent-example: value: - blockId: "0xae7c4f55a6db8bf4841e4a38f06d32ab9bd88b927a6ba0bc19bcb19c625ff8b63c000000" - transactionId: "0xf7e39da700ca56698a953983ba2146c0ef6cb4a1b68ea3f1b806b52e038a84b55a000000" - outputIndex: 3 - isSpent: false - includedCommitmentId: "0x8ec992b2eb422292d2a3a1d4ddc330edb67eeb98eb93cd4c73a026adae3ceb5478010000" - latestCommitmentId: "0xd91549dbf441da4c7e50063b58c05d5b2bfb1d33b346a2f9a18220ce6207f7a289010000" + outputId: "0x3477de28a45c565eed3603ab9e90ce0f0d38e8860a3c5ff64ccc70252aab7c9d000000004600" + blockId: "0x1aaaa9ad9c15c6cd601a5aa5bd61b85428263978a26343949dad9ff89635e7104f1f271b" + included: + slot: 5 + transactionId: "0xfdd9e96bac5e4f029b3261c00cd3c74fb4c389184a2018c979d4f31fc1ef53c99add5c74" + commitmentId: "0xd20959ac38938fddee472bbfd47644da3087a39499cd04e86c9c70fa9c8c0516a81b8aea" + latestCommitmentId: "0xba4456279dce23cfca37938685c039ea7c72001c1cd8becf72b195a8727cdfd07949d697" get-full-output-metadata-example: value: @@ -1699,25 +1700,31 @@ components: type: 2 hash: "0x7f9289b104a55e6fb93d60d70f6e85c9706c761b05ccc034f76b465837ca6070" metadata: - blockId: "0xd91549dbf441da4c7e50063b58c05d5b2bfb1d33b346a2f9a18220ce6207f7a289010000" - transactionId: "0xf7e39da700ca56698a953983ba2146c0ef6cb4a1b68ea3f1b806b52e038a84b55a000000" - outputIndex: 0 - isSpent: true - commitmentIdSpent: "0xf79e019ddf8d1ab063604e92494a893a6925f7cb40b288b6e50953bc2acfa6598a010000" - transactionIdSpent: "0x43c800f00cc4dbccc496b26ceeab1e00b0ccb1031ccfbe3db95f72a1c36b27a28b010000" - includedCommitmentId: "0x8ec992b2eb422292d2a3a1d4ddc330edb67eeb98eb93cd4c73a026adae3ceb5478010000" - latestCommitmentId: "0xd91549dbf441da4c7e50063b58c05d5b2bfb1d33b346a2f9a18220ce6207f7a289010000" + outputId: "0x3130f21c723fa597805763739f3a2a40b674af6b4071ef0494331b644a7e4d52000000001300" + blockId: "0x19e589687082d8f535779df3244908ad6a7b380906fb7ae24efb5fad8a5cfb92a8f8d9a3" + included: + slot: 5 + transactionId: "0x3e766157614a3a0e13dbb937b5fb1ef5d1555479c19df80445d03a6710f39d75668bd326" + commitmentId: "0x7387ebe23a3ac1732fcdb6cef77fc003e1fa6e2dad89dd664df249d6aa2dbdc157dec2c6" + spent: + slot: 8 + transactionId: "0x3896f1ede7cbdacbbb4b17f13e953ad45ce0969ea34cc766b5dafe2a15b3e46f998ef4e5" + commitmentId: "0x26fa9fcbddcf944ced3fd16a73d9c8b2b49dc54dba7629b02da69f7e01249063e7398b2c" + latestCommitmentId: "0x42a88617c2c4ba2b58f82c8b85524720cdbe3642401e7c613f215658d617c569d1219909" get-output-metadata-by-id-response-spent-example: value: - blockId: "0xae7c4f55a6db8bf4841e4a38f06d32ab9bd88b927a6ba0bc19bcb19c625ff8b63c000000" - transactionId: "0xf7e39da700ca56698a953983ba2146c0ef6cb4a1b68ea3f1b806b52e038a84b55a000000" - outputIndex: 3 - isSpent: true - commitmentIdSpent: "0xf79e019ddf8d1ab063604e92494a893a6925f7cb40b288b6e50953bc2acfa6598a010000" - transactionIdSpent: "0x43c800f00cc4dbccc496b26ceeab1e00b0ccb1031ccfbe3db95f72a1c36b27a28b010000" - includedCommitmentId: "0x8ec992b2eb422292d2a3a1d4ddc330edb67eeb98eb93cd4c73a026adae3ceb5478010000" - latestCommitmentId: "0xd91549dbf441da4c7e50063b58c05d5b2bfb1d33b346a2f9a18220ce6207f7a289010000" + outputId: "0x3130f21c723fa597805763739f3a2a40b674af6b4071ef0494331b644a7e4d52000000001300" + blockId: "0x19e589687082d8f535779df3244908ad6a7b380906fb7ae24efb5fad8a5cfb92a8f8d9a3" + included: + slot: 5 + transactionId: "0x3e766157614a3a0e13dbb937b5fb1ef5d1555479c19df80445d03a6710f39d75668bd326" + commitmentId: "0x7387ebe23a3ac1732fcdb6cef77fc003e1fa6e2dad89dd664df249d6aa2dbdc157dec2c6" + spent: + slot: 8 + transactionId: "0x3896f1ede7cbdacbbb4b17f13e953ad45ce0969ea34cc766b5dafe2a15b3e46f998ef4e5" + commitmentId: "0x26fa9fcbddcf944ced3fd16a73d9c8b2b49dc54dba7629b02da69f7e01249063e7398b2c" + latestCommitmentId: "0x42a88617c2c4ba2b58f82c8b85524720cdbe3642401e7c613f215658d617c569d1219909" get-commitment-response-example: value: @@ -1729,7 +1736,7 @@ components: referenceManaCost: '600' get-commitment-response-binary-example: - value: "070000000a1a0000977c626276b19ef8b3c445709f2f0f2ccc4abb98d97617f421f240c0d1ee066d4306e67a0321889ef8ec89b7eff1378049e058f0fa87a78c2452ae72631a5a99d913d1cbb3525b8faa1800e28dfcb28154bcba10154c39ef87ceda793cb44f58ae1549c88ea13fe4a9695bb6f0aba6cb756522209e5066a96039ae12b398b975693bdc21e222997c86ff9bfc5844f0372d58ff6fa510688e53c181bbdf4db41f9b627540a70e5751c026e543b2e8ab2eb06099daa1d1e5df47778f7787faab45cdf12fe3a80000000300d85e5b1590d898d1e0cdebb2e3b5337c8b76270142663d78811683ba47c17c989ad7a8f0ff2c6438bf435786d4a5b0125a5caf7367061b49a739389d5ebea234c0466c86f88a3f8add03bff04c2e34b214683f2f6983641e1d1185da7e2c3e0200d9922819a39e94ddf3907f4b9c8df93f39f026244fcb609205b9a879022599f218be2536d8b7b8547faa3dbdfe98339ebe9e2b2417a8a03eee02b2a8312b9e026dd0a33261a58a240cd0a1b06cdf1775d98d316f162d3eec402f4bf08bea2a0700f9d9656a60049083eef61487632187b351294c1fa23d118060d813db6d03e8b6ca8180d435708e826bc2042ccd667babb59c5cc461ff29dba966359fcd6fc511cdfdf10d6576f36ac2a6e5cb691e13968c13947ffbd9239939d3802b2fbe0f06" + value: "0312000000075b05e0a8fd4b9c7e7bc165b62c48945292f7d76d23f76525f886c416dc0e364089b57c32ddb8c614ed1d2c844401d2a5325b4d153c7f94464bbda3a8d14289b203f96759000000000000009000000000000000" get-utxo-changes-response-example: value: @@ -2517,24 +2524,29 @@ components: type: type: integer description: Set to value 2 to denote a Metadata Feature. - data: - type: string - description: Hex-encoded binary data with 0x prefix. + entries: + type: object + additionalProperties: + type: string + example: + - 'did:iota': '0x68656c6c6f206469676974616c206175746f6e6f6d79' + - 'hello': '0x776f726c64' required: - type - - data + - entries StateMetadataFeature: description: >- - Defines a map of key-value pairs. The keys must consist of ASCII characters only and the values are arbitrary byte slices. + Defines a map of key-value pairs. The keys must consist of ASCII characters only and the values are arbitrary byte slices (encoded in Hex). properties: type: type: integer description: Set to value 3 to denote a State Metadata Feature. example: 3 entries: - type: string - description: Hex-encoded binary data. + type: object + additionalProperties: + type: string example: - 'did:iota': '0x68656c6c6f206469676974616c206175746f6e6f6d79' - 'hello': '0x776f726c64' @@ -3160,10 +3172,10 @@ components: ManaRewardsResponse: description: Returns the mana rewards of an account or delegation output. properties: - epochStart: + startEpoch: type: integer description: The starting epoch index for which the mana rewards are returned. - epochEnd: + endEpoch: type: integer description: The ending epoch index for which the mana rewards are returned, the decay is applied up to this point (inclusive). rewards: @@ -3211,7 +3223,7 @@ components: address: type: string description: The account address of the validator. - stakingEpochEnd: + stakingEndEpoch: type: integer description: The epoch index until which the validator registered to stake. poolStake: @@ -3234,7 +3246,7 @@ components: description: The latest protocol hash the validator supported. required: - address - - stakingEpochEnd + - stakingEndEpoch - poolStake - validatorStake - fixedCost @@ -3479,20 +3491,18 @@ components: type: type: integer description: Set to value 0 to denote a Hashable Node. - node: - properties: - l: - description: The left node. Hex-encoded with 0x prefix. - anyOf: - - $ref: '#/components/schemas/HashableNode' - - $ref: '#/components/schemas/LeafHash' - - $ref: '#/components/schemas/ValueHash' - r: - description: The right node. Hex-encoded with 0x prefix. - anyOf: - - $ref: '#/components/schemas/HashableNode' - - $ref: '#/components/schemas/LeafHash' - - $ref: '#/components/schemas/ValueHash' + l: + description: The left node. Hex-encoded with 0x prefix. + anyOf: + - $ref: '#/components/schemas/HashableNode' + - $ref: '#/components/schemas/LeafHash' + - $ref: '#/components/schemas/ValueHash' + r: + description: The right node. Hex-encoded with 0x prefix. + anyOf: + - $ref: '#/components/schemas/HashableNode' + - $ref: '#/components/schemas/LeafHash' + - $ref: '#/components/schemas/ValueHash' required: - type - node @@ -3549,35 +3559,47 @@ components: OutputMetadataResponse: description: Returns metadata about an output. properties: + outputId: + type: string + description: The output identifier of requested output. Hex-encoded with 0x prefix. blockId: type: string description: The block identifier that references the output. Hex-encoded with 0x prefix. - transactionId: - type: string - description: The identifier of the transaction. Hex-encoded with 0x prefix. - outputIndex: - type: integer - description: The index of the output within the corresponding transaction. - isSpent: - type: boolean - description: Tells if the output is spent in a confirmed transaction or not. - commitmentIdSpent: - type: string - description: The commitment ID of the slot at which this output was spent. - transactionIdSpent: - type: string - description: The transaction this output was spent with. Hex-encoded with 0x prefix. - includedCommitmentId: - type: string - description: The commitment ID at which the output was included into the ledger. + included: + properties: + slot: + type: integer + description: The slot index in which the output is included. + transactionId: + type: string + description: The identifier of the transaction. Hex-encoded with 0x prefix. + commitmentId: + type: string + description: The commitment ID at which the output was included into the ledger. + required: + - slot + - transactionId + spent: + properties: + slot: + type: integer + description: The slot index in which the output is spent. + transactionId: + type: string + description: The transaction ID that spent the output. Hex-encoded with 0x prefix. + commitmentId: + type: string + description: The commitment ID that includes the spending of the ouptut. + required: + - slot + - transactionId latestCommitmentId: type: string description: The current latest commitment id for which the request was made. required: + - outputId - blockId - - transactionId - - outputIndex - - isSpent + - included - latestCommitmentId UTXOChangesResponse: From 72d54a5ecfc9c15702949a10faf884a9d215e3ea Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Fri, 8 Dec 2023 20:25:22 +0800 Subject: [PATCH 77/92] Update to latest iota.go --- tips/TIP-0048/openapi3-core.yaml | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/tips/TIP-0048/openapi3-core.yaml b/tips/TIP-0048/openapi3-core.yaml index 9bb0ae753..da8e5aed8 100644 --- a/tips/TIP-0048/openapi3-core.yaml +++ b/tips/TIP-0048/openapi3-core.yaml @@ -1211,6 +1211,7 @@ components: decayFactorsExponent: 32 decayFactorEpochsSum: 2420916375 decayFactorEpochsSumExponent: 21 + annualDecayFactorPercentage: 50 tokenSupply: "2779530283277761" genesisSlot: 0 genesisUnixTimestamp: "1695275822" @@ -1245,6 +1246,7 @@ components: decayBalancingConstant: "1" poolCoefficientExponent: 11 targetCommitteeSize: 32 + chainSwitchingTreshold: 2 baseToken: name: Shimmer tickerSymbol: SMR @@ -1265,8 +1267,9 @@ components: shallowLikeParents: - "0xe5fe5231630afaaba609af76787ff1ec9c6088dd17e9cf922152b3facd7bd5883e000000" - "0xed4b771b5413f5118dd80021ca07fb727e4c54eec9d28d6566c28cc81e7d267c3f000000" + latestParentBlockIssuingTime: "1690879505000000000" latestFinalizedSlot: 1422 - commitment: + latestCommitment: protocolVersion: 3 slot: 1432 previousCommitmentId: "0xc0300d55fe2cdc93191e52685da009f53d40883ae111291e550eed4e7eb7752746010000" @@ -2997,6 +3000,9 @@ components: decayFactorEpochsSumExponent: type: integer description: The scaling of DecayFactorEpochsSum expressed as an exponent of 2. + annualDecayFactorPercentage: + type: integer + description: the decay factor for 1 year. required: - bitsCount - generationRate @@ -3005,6 +3011,7 @@ components: - decayFactorsExponent - decayFactorEpochsSum - decayFactorEpochsSumExponent + - annualDecayFactorPercentage tokenSupply: type: string description: Current supply of base token. Plain string encoded number. @@ -3126,6 +3133,9 @@ components: targetCommitteeSize: type: integer description: The target size of the committee. + chainSwitchingTreshold: + type: integer + description: The number of heavier slots that a chain needs to be ahead of the current chain to be considered for switching. required: - version - networkName @@ -3150,6 +3160,7 @@ components: - versionSignalingParameters - rewardsParameters - targetCommitteeSize + - chainSwitchingTreshold required: - startEpoch - parameters @@ -3272,10 +3283,13 @@ components: items: type: string description: The block identifiers that can be used to a attach a block to. Hex-encoded with 0x prefix. + latestParentBlockIssuingTime: + type: string + description: The latest issuing time of the returned parents. latestFinalizedSlot: type: integer description: The latest finalized slot index. - commitment: + latestCommitment: $ref: '#/components/schemas/Commitment' CongestionResponse: From 5944680c4ccc328ef48c35037ffec89e3b99bd8d Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Sat, 9 Dec 2023 15:24:51 +0800 Subject: [PATCH 78/92] Update metadata endpoints --- tips/TIP-0048/openapi3-core.yaml | 104 +++++++++++++++++++++++++++---- 1 file changed, 91 insertions(+), 13 deletions(-) diff --git a/tips/TIP-0048/openapi3-core.yaml b/tips/TIP-0048/openapi3-core.yaml index da8e5aed8..be81d0a61 100644 --- a/tips/TIP-0048/openapi3-core.yaml +++ b/tips/TIP-0048/openapi3-core.yaml @@ -933,7 +933,63 @@ paths: application/json: schema: $ref: '#/components/schemas/ServiceUnavailableResponse' - + + '/api/core/v3/transactions/{transactionId}/metadata': + get: + tags: + - UTXO + summary: Find the metadata of the earliest block containing the transaction that was confirmed. + description: >- + Find the metadata of the earliest block containing the transaction that was confirmed. + parameters: + - in: path + name: transactionId + schema: + type: string + example: "0xaf7579fb57746219561072c2cc0e4d0fbb8d493d075bd21bf25ae81a450c11ef" + required: true + description: Identifier of the transaction to look up. + responses: + '200': + description: "Successful operation." + content: + application/json: + schema: + $ref: '#/components/schemas/TransactionMetadataResponse' + examples: + default: + $ref: '#/components/examples/get-transaction-metadata-by-id-response-example' + '400': + description: "Unsuccessful operation: indicates that the provided data is invalid." + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + '403': + description: "Unsuccessful operation: indicates that the endpoint is not available for public use." + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenResponse' + '404': + description: "Unsuccessful operation: indicates that the requested data was not found." + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + '500': + description: "Unsuccessful operation: indicates that an unexpected, internal server error happened which prevented the node from fulfilling the request." + content: + application/json: + schema: + $ref: '#/components/schemas/InternalErrorResponse' + '503': + description: "Unsuccessful operation: indicates that the node is not synced." + content: + application/json: + schema: + $ref: '#/components/schemas/ServiceUnavailableResponse' + '/api/core/v3/commitments/{commitmentId}': get: tags: @@ -1296,6 +1352,13 @@ components: value: blockId: "0xf7ac0552041789a3931ae76eafa47df063632cddd3f8b11bd0bfffba1bc8c46800000000" blockState: "confirmed" + transactionMetadata: + transactionId: "0x72f0dfa9ad116ade8bdac8ef291ed2fb8065c6c75d5d3666e8b2053696c94a9e00001000" + transactionState: "confirmed" + + get-transaction-metadata-by-id-response-example: + value: + transactionId: "0x72f0dfa9ad116ade8bdac8ef291ed2fb8065c6c75d5d3666e8b2053696c94a9e00001000" transactionState: "confirmed" get-block-by-id-response-example-confirmed: @@ -1307,8 +1370,10 @@ components: value: blockId: "0x3848a6d17070830206e5032fbce2ae3939e60eec0816546e074316b1f66977d04d010000" blockState: "confirmed" - transactionState: "failed" - transactionFailureReason: 2 + transactionMetadata: + transactionId: "0x72f0dfa9ad116ade8bdac8ef291ed2fb8065c6c75d5d3666e8b2053696c94a9e00001000" + transactionState: "failed" + transactionFailureReason: 2 post-tagged-data-block-request-example-full: value: @@ -3389,14 +3454,6 @@ components: - rejected - failed description: If `pending`, the block is stored but not confirmed. If `confirmed`, the block is confirmed with the first level of knowledge. If `finalized`, the block is included and cannot be reverted anymore. If `rejected`, the block is rejected by the node, and user should reissue payload if it contains one. If `failed`, the block is not successfully issued due to failure reason. - transactionState: - type: string - enum: - - pending - - confirmed - - finalized - - failed - description: If 'pending', the block contains not yet included transaction. If 'confirmed' means transaction is confirmed with the first level of knowledge. If 'finalized' means transaction is included and cannot be reverted anymore. If 'failed' means transaction is not successfully issued due to failure reason. blockFailureReason: type: integer enum: [1,2,3,4,5,6,7,8,9,10,11,12,255] @@ -3415,6 +3472,27 @@ components: * `11` - denotes that the block is dropped due to congestion. * `12` - denotes that the payload is invalid. * `255` - denotes that the block is invalid. + transactionMetadata: + description: The metadata of the transactions in the block. + $ref: '#/components/schemas/TransactionMetadataResponse' + required: + - blockId + - blockState + + TransactionMetadataResponse: + description: Returns the metadata of a given block. + properties: + transactionId: + type: string + description: The identifier of the block. Hex-encoded with 0x prefix. + transactionState: + type: string + enum: + - pending + - confirmed + - finalized + - failed + description: If 'pending', the block contains not yet included transaction. If 'confirmed' means transaction is confirmed with the first level of knowledge. If 'finalized' means transaction is included and cannot be reverted anymore. If 'failed' means transaction is not successfully issued due to failure reason. transactionFailureReason: type: integer enum: [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,255] @@ -3448,8 +3526,8 @@ components: * `26` - denotes that the destruction of nfts was not allowed in the transaction capabilities. * `255` - denotes that the semantic validation failed. required: - - blockId - - blockState + - transactionId + - transactionState BlockResponse: description: Returns a given block. From dd80d193741d56e515469df79db85a0719e23750 Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Mon, 8 Jan 2024 15:55:59 +0800 Subject: [PATCH 79/92] Update and resolve comments --- tips/TIP-0048/openapi3-core.yaml | 153 ++++++++++++++++++++++++++----- 1 file changed, 131 insertions(+), 22 deletions(-) diff --git a/tips/TIP-0048/openapi3-core.yaml b/tips/TIP-0048/openapi3-core.yaml index be81d0a61..16cb847cd 100644 --- a/tips/TIP-0048/openapi3-core.yaml +++ b/tips/TIP-0048/openapi3-core.yaml @@ -155,12 +155,9 @@ paths: get: tags: - rewards - summary: Returns the totally available Mana rewards of an account or delegation output decayed up to endEpoch index provided in the response. + summary: Returns all the available Mana rewards of an account or delegation output in the returned range of epochs. description: >- - Returns the totally available Mana rewards of an account or delegation output up until the current epoch index. - Note that rewards for an epoch only become available at the beginning of the next epoch. - If the end epoch of a staking feature is equal or greater than the current epoch, the rewards response will not include the potential future rewards for those epochs. - startEpoch and endEpoch indicates the actual range for which reward value is returned and decayed for. + Returns all the available Mana rewards of an account or delegation output in the returned range of epochs. Note that rewards for an epoch only become available when the last slot of an epoch is committed. If the end epoch of a staking feature is equal or greater than the current epoch, the rewards response will thus not include the potential future rewards for those epochs. startEpoch and endEpoch indicate the actual epoch range in which rewards are available. Callers that use this API to build a transaction are highly advised to set the slot index parameter explicitly. The returned startEpoch can be used to check the first epoch for which rewards are available. Together with the retention period of rewards, applications can warn users to claim their rewards before their oldest rewards are beyond the retention period. parameters: - in: path name: outputId @@ -174,7 +171,7 @@ paths: schema: type: integer example: 50 - description: A client can specify a slot index explicitly, which should be equal to the slot it uses as the commitment input for the claiming transaction. This parameter is only recommended to be provided when requesting rewards for a Delegation Output in delegating state (i.e. when Delegation ID is zeroed). + description: A client can specify a slot index explicitly, which should be equal to the slot it uses as the commitment input for the claiming transaction to ensure the node calculates the rewards identically as during transaction execution. Rewards are decayed up to the epoch corresponding to the given slotIndex + MinCommittableAge. For a Delegation Output in delegating state (i.e. when Delegation ID is zeroed), that epoch - 1 is also used as the last epoch for which rewards are fetched. Callers that do not build transactions with the returned values may omit this value in which case it defaults to the latest committed slot, which is good enough to, e.g. display estimated rewards to users. responses: '200': description: "Successful operation." @@ -938,9 +935,9 @@ paths: get: tags: - UTXO - summary: Find the metadata of the earliest block containing the transaction that was confirmed. + summary: Find the metadata of the transaction. description: >- - Find the metadata of the earliest block containing the transaction that was confirmed. + Find the metadata of the transaction. parameters: - in: path name: transactionId @@ -1097,6 +1094,56 @@ paths: application/json: schema: $ref: '#/components/schemas/InternalErrorResponse' + '/api/core/v3/commitments/{commitmentId}/utxo-changes/full': + get: + tags: + - commitments + summary: Get all UTXO changes of a given slot by commitment ID. + description: Get all UTXO changes of a given slot by Commitment ID. + parameters: + - in: path + name: commitmentId + schema: + type: string + example: "0x7a09324557e9200f39bf493fc8fd6ac43e9ca750c6f6d884cc72386ddcb7d695" + required: true + description: Commitment ID of the commitment to look up. + responses: + '200': + description: "Successful operation." + content: + application/json: + schema: + $ref: '#/components/schemas/UTXOChangesFullResponse' + examples: + default: + $ref: >- + #/components/examples/get-utxo-changes-full-response-example + '400': + description: "Unsuccessful operation: indicates that the provided data is invalid." + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + '403': + description: "Unsuccessful operation: indicates that the endpoint is not available for public use." + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenResponse' + '404': + description: "Unsuccessful operation: indicates that the requested data was not found." + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + '500': + description: "Unsuccessful operation: indicates that an unexpected, internal server error happened which prevented the node from fulfilling the request." + content: + application/json: + schema: + $ref: '#/components/schemas/InternalErrorResponse' + '/api/core/v3/commitments/by-index/{index}': get: tags: @@ -1302,7 +1349,7 @@ components: decayBalancingConstant: "1" poolCoefficientExponent: 11 targetCommitteeSize: 32 - chainSwitchingTreshold: 2 + chainSwitchingThreshold: 2 baseToken: name: Shimmer tickerSymbol: SMR @@ -1491,7 +1538,7 @@ components: get-validators-example: value: - validators: + stakers: - address: "rms1pp4wuuz0y42caz48vv876qfpmffswsvg40zz8v79sy8cp0jfxm4kunflcgt" stakingEndEpoch: 100 poolStake: '200000' @@ -1526,6 +1573,7 @@ components: startEpoch: 60 endEpoch: 80 rewards: '800000' + latestCommittedEpochPoolRewards: '0' get-congestion-estimate-response-example: value: @@ -1707,7 +1755,7 @@ components: get-outputs-by-id-response-example: value: output: - type: 3 + type: 0 amount: "1000" unlockConditions: - type: 0 @@ -1752,7 +1800,7 @@ components: get-full-output-metadata-example: value: output: - type: 3 + type: 0 amount: "1000" unlockConditions: - type: 0 @@ -1816,6 +1864,22 @@ components: - "0xfa3d71ea93849b317c2b29c928b726b6d3bd2131c7ad560c9e28952f117fd50c35d6e0890100" - "0x9c40a07de878863fbda03caeb68875254c49199e6b55740f78a4bab3686f89957b1249130000" + get-utxo-changes-full-response-example: + value: + commitmentId: "0x7387ebe23a3ac1732fcdb6cef77fc003e1fa6e2dad89dd664df249d6aa2dbdc157dec2c6" + createdOutputs: + - outputId: "0x3130f21c723fa597805763739f3a2a40b674af6b4071ef0494331b644a7e4d52000000001300" + output: + type: 0 + amount: "1000" + unlockConditions: + - type: 0 + address: + type: 0 + pubKeyHash: "0x8eaf87ac1f52eb05f2c7c0c15502df990a228838dc37bd18de9503d69afd257d" + mana: "2000" + consumedOutputs: [] + schemas: Block: @@ -2968,7 +3032,7 @@ components: type: string description: Tells whether the node supports mainnet or testnet addresses. Value `iota` indicates that the node supports mainnet addresses. Value `atoi` indicates that the node supports testnet addresses. storageScoreParameters: - description: The rent structure according to TIP-19. + description: The storage score structure according to TIP-47. properties: storageCost: description: Defines the number of IOTA tokens required per unit of storage score. @@ -3198,7 +3262,7 @@ components: targetCommitteeSize: type: integer description: The target size of the committee. - chainSwitchingTreshold: + chainSwitchingThreshold: type: integer description: The number of heavier slots that a chain needs to be ahead of the current chain to be considered for switching. required: @@ -3225,22 +3289,22 @@ components: - versionSignalingParameters - rewardsParameters - targetCommitteeSize - - chainSwitchingTreshold + - chainSwitchingThreshold required: - startEpoch - parameters ValidatorsResponse: - description: Returns a paginated list of all registered validators ready for the next epoch and indicates if they were active recently (are eligible for committee selection). + description: Returns a paginated list of all registered stakers ready for the next epoch and indicates if they were active recently (are eligible for committee selection). properties: - validators: + stakers: type: array items: oneOf: - $ref: '#/components/schemas/Validator' pageSize: type: integer - description: The number of validators returned per one API request with pagination. + description: The number of stakers returned per one API request with pagination. cursor: type: string description: The cursor that needs to be provided as cursor query parameter to request the next page. Cursor is absent if the last page is returned. @@ -3256,7 +3320,10 @@ components: description: The ending epoch index for which the mana rewards are returned, the decay is applied up to this point (inclusive). rewards: type: string - description: The amount of totally available rewards the requested output may claim. + description: The amount of totally available rewards the requested output may claim. + latestCommittedEpochPoolRewards: + type: string + description: The rewards of the latest committed epoch of the staking pool to which this validator or delegator belongs. The ratio of this value and the maximally possible rewards for the latest committed epoch can be used to determine how well the validator of this staking pool performed in that epoch. Note that if the pool was not part of the committee in the latest committed epoch, this value is 0. CommitteeResponse: description: Returns the validator information of the committee. @@ -3480,19 +3547,20 @@ components: - blockState TransactionMetadataResponse: - description: Returns the metadata of a given block. + description: Returns the metadata of a given transaction. properties: transactionId: type: string - description: The identifier of the block. Hex-encoded with 0x prefix. + description: The identifier of the transaction. Hex-encoded with 0x prefix. transactionState: type: string enum: - pending + - accepted - confirmed - finalized - failed - description: If 'pending', the block contains not yet included transaction. If 'confirmed' means transaction is confirmed with the first level of knowledge. If 'finalized' means transaction is included and cannot be reverted anymore. If 'failed' means transaction is not successfully issued due to failure reason. + description: If 'pending', the transaction is not included yet. If 'accepted', the transaction is included. If 'confirmed' means transaction is included and its included block is confirmed. If 'finalized' means transaction is included, its included block is finalized and cannot be reverted anymore. If 'failed' means transaction is not successfully issued due to failure reason. transactionFailureReason: type: integer enum: [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,255] @@ -3716,3 +3784,44 @@ components: - slot - createdOutputs - consumedOutputs + + UTXOChangesFullResponse: + description: Returns all UTXO changes of the given slot. + properties: + commitmentId: + type: string + description: The commitment ID of the requested slot that contains the changes. Hex-encoded with 0x prefix. + createdOutputs: + description: The created outputs of the given slot. + type: array + items: + oneOf: + - $ref: '#/components/schemas/OutputWithId' + consumedOutputs: + description: The consumed outputs of the given slot. + type: array + items: + oneOf: + - $ref: '#/components/schemas/OutputWithId' + required: + - slot + - createdOutputs + - consumedOutputs + + OutputWithId: + description: Returns an output with its identifier. + properties: + outputId: + type: string + description: The output identifier of requested output. Hex-encoded with 0x prefix. + output: + anyOf: + - $ref: '#/components/schemas/BasicOutput' + - $ref: '#/components/schemas/AccountOutput' + - $ref: '#/components/schemas/AnchorOutput' + - $ref: '#/components/schemas/FoundryOutput' + - $ref: '#/components/schemas/NFTOutput' + - $ref: '#/components/schemas/DelegationOutput' + required: + - output + - outputId From 508f479404359ff5d6999d2143bf7504e14f8201 Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Mon, 8 Jan 2024 16:32:54 +0800 Subject: [PATCH 80/92] Update block examples --- tips/TIP-0048/openapi3-core.yaml | 312 ++++++++++++------------------- 1 file changed, 119 insertions(+), 193 deletions(-) diff --git a/tips/TIP-0048/openapi3-core.yaml b/tips/TIP-0048/openapi3-core.yaml index 16cb847cd..173aa0d83 100644 --- a/tips/TIP-0048/openapi3-core.yaml +++ b/tips/TIP-0048/openapi3-core.yaml @@ -419,10 +419,10 @@ paths: examples: Full block with Tagged Data Payload: $ref: >- - #/components/examples/post-tagged-data-block-request-example-full + #/components/examples/tagged-data-block-example Full block with Transaction Payload: $ref: >- - #/components/examples/post-transaction-block-request-example-full + #/components/examples/transaction-block-example application/vnd.iota.serializer-v2: schema: type: string @@ -497,10 +497,10 @@ paths: #/components/examples/get-block-by-id-empty-response-example Basic Block - Transaction Payload: $ref: >- - #/components/examples/get-block-by-id-transaction-response-example + #/components/examples/transaction-block-example Basic Block - Tagged Data Payload: $ref: >- - #/components/examples/get-block-by-id-tagged-data-response-example + #/components/examples/tagged-data-block-example Validation Block: $ref: >- #/components/examples/get-block-by-id-validation-response-example @@ -843,7 +843,7 @@ paths: $ref: '#/components/schemas/BlockResponse' examples: default: - $ref: '#/components/examples/get-block-by-id-transaction-response-example' + $ref: '#/components/examples/transaction-block-example' application/vnd.iota.serializer-v2: schema: type: string @@ -1422,104 +1422,117 @@ components: transactionState: "failed" transactionFailureReason: 2 - post-tagged-data-block-request-example-full: + tagged-data-block-example: value: header: protocolVersion: 3 - networkId: "0" - issuingTime: "1695275834000000000" - slotCommitmentId: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd700000000" - latestFinalizedSlot: 0 - issuerId: "0x1d0140675f050c4d6e1018510a103d2f4c134a31463965775f7d284959045100" + networkId: "8342982141227064571" + issuingTime: "1695275852000000000" + slotCommitmentId: "0x3a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d70767ea58d2a" + latestFinalizedSlot: 500 + issuerId: "0x17432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a" body: type: 0 strongParents: - - "0x087a2734114e6c041e423a310d7c2039302825484b6c326a560c3a6e281d274a3d18110e" - weakParents: [] - shallowLikeParents: [] + - "0x27e0461873f37040c9e59c35ad8a106fa1b94f5ec9ef89499b31904f9a3de59be58dd44a" + - "0x714821f8f257e0a502b71ac7ee57530bb9dc29fe12ff3936f925b835a297680400b76948" + - "0x9951e512546cd9c9fbdab348b6cba91a601a29b50854e55a6e14f6803ca1d81ac7eff5ce" + - "0xaaa7bacf26f1aa4754d42edeab45d6169ea723b7fdf0f6ff3b6ebe90d09dbff6bc553936" + - "0xba75a143de4ac932986fbe7b1d78f639bc6ee8aee10d510d41572851530be884778052aa" + - "0xea5315941f4337752905599710b55e64018c71f4d8f299d0636d50484d05e6ac5667b503" payload: type: 0 tag: "0x746167" - data: "0x175d051d3873347d3b2617773240644f780f683064094a0c0b4d1a0c621f0160572c324d371a792536786a2719307b590b5f6d585e3a28740a42080942607a131a5e68242735131920230f72513d01694a54507c340e7817514457462a19213c7270212732506a10097a3e36732c011c6f513202360660240d597d7076014750600c27072540123b7b49137409282d48577a0247125a1c6c13456c2d350a6a224a35" - maxBurnedMana: "100" + data: "0x6c754128356c071e5549764a48427b" + maxBurnedMana: "864" signature: type: 0 - publicKey: "0x1a382c2224662059334e1d6e076b3a490b594c31332e3d652d402f5139263e56" - signature: "0x15216f030f65647910225f736f627d12600607064d7305235c3818700d01633e5d625e11497a3e514e6f5a0e6a51091e475c604125360813067c740346320520" + publicKey: "0x2daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac" + signature: "0xc2982c2476379db0c8d39a204801163fc05dc1c7aa7df537e6041f91491943ab1de29a2dfe6076588c53b8d2ccf5eabe49f2cb64198303682859fd0c58348b0d" - post-transaction-block-request-example-full: + transaction-block-example: value: header: protocolVersion: 3 - networkId: "0" - issuingTime: "1695275834000000000" - slotCommitmentId: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd700000000" - latestFinalizedSlot: 0 - issuerId: "0x65767c660e6c324c377e164f3f3c2a267515573d6c53300753532e1c384f521f" + networkId: "8342982141227064571" + issuingTime: "1695275852000000000" + slotCommitmentId: "0x3a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d70767ea58d2a" + latestFinalizedSlot: 500 + issuerId: "0x17432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a" body: type: 0 strongParents: - - "0x140615473c0b60295c5a25005079200d4f442d146d64040440215d175502070273570c41" - - "0x1676520722326709496b63473b675056311c14246a1f015830381e55045d793c6d4f6f74" - - "0x1d2e710f056f16013d76491d25694124066212550d5a42305e504e5135452b2935595d3d" - - "0x225654001b334b3b55537e45214054721d04190807391d21522a4e780f2a7a7279727810" - - "0x40034a2739225358130f741f4455356b524c333c4a0775673f511b1e1262721a20464240" - - "0x48770460472b4b6e146f5135460e2b31361a34235668153e01161a07136d5f345101463b" - - "0x4a36305a1d393c151e072e75777d436f7733646d0a007e5b45416a09777d4b425c1f2f64" - weakParents: [] - shallowLikeParents: [] + - "0x27e0461873f37040c9e59c35ad8a106fa1b94f5ec9ef89499b31904f9a3de59be58dd44a" + - "0x714821f8f257e0a502b71ac7ee57530bb9dc29fe12ff3936f925b835a297680400b76948" + - "0x9951e512546cd9c9fbdab348b6cba91a601a29b50854e55a6e14f6803ca1d81ac7eff5ce" + - "0xaaa7bacf26f1aa4754d42edeab45d6169ea723b7fdf0f6ff3b6ebe90d09dbff6bc553936" + - "0xba75a143de4ac932986fbe7b1d78f639bc6ee8aee10d510d41572851530be884778052aa" + - "0xea5315941f4337752905599710b55e64018c71f4d8f299d0636d50484d05e6ac5667b503" payload: type: 1 transaction: - networkId: "14147312347886322761" - creationSlot: 0 - contextInputs: [] + networkId: "8342982141227064571" + creationSlot: 1048576 + contextInputs: + - type: 0 + commitmentId: "0x3a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d70767ea58d2a" + - type: 1 + accountId: "0x17432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a" + - type: 2 + index: 0 inputs: - type: 0 - transactionId: "0x130c2227193b1b53471f57121a6f5b69096657364d4f7122244c7c6435655c2f592b7e60" - transactionOutputIndex: 7 + transactionId: "0xf09d3cd648a7246c7c1b2ba2f9182465ae5742b78c592392b4b455ab8ed7195200000000" + transactionOutputIndex: 0 - type: 0 - transactionId: "0x163443007c67496a1e676d516b4f46394c06673539016279137556061778072865324235" - transactionOutputIndex: 110 + transactionId: "0xd2c5ccba12b6fad51652131289867492799c9fc5710244418aa6e955f8fa826100000000" + transactionOutputIndex: 0 allotments: - - accountId: "0x7905041c4e6a193b26355b15331a5d6c723314703603720a011a613a12147e62" - mana: "1538" - capabilities: "" + - accountId: "0x7e0d0a5848362b23120f55115b096774036d7610137a631413221f5573344507" + mana: "2285" + - accountId: "0x476820096e7038107d071a4e473f1e295f346e2d0824263e5e3e7d004f6b6915" + mana: "2189" + capabilities: "0x01" outputs: - type: 0 - amount: "9544" + amount: "100000" mana: "0" unlockConditions: - type: 0 address: type: 0 - pubKeyHash: "0x2176036e36344e09491f523e010763316a790f673d0520282c5130232e0e6e45" - features: [] - - type: 0 - amount: "9151" - mana: "0" + pubKeyHash: "0xed1484f4d1f7d8c037087fed661dd92faccae1eed3c01182d6fdd6828cea144a" + features: + - type: 5 + id: "0x086372557616532f714f104e5f44297b7a286d077956291a6d4f59081f484463712a64300c00" + amount: "0x14be8149371263f4" + - type: 1 + amount: "100000" + mana: "5000" + accountId: "0x0000000000000000000000000000000000000000000000000000000000000000" + foundryCounter: 0 unlockConditions: - type: 0 address: type: 0 - pubKeyHash: "0x16435722263d2c227371171b0e722f08025f25484a494259660c16051a090f35" - features: [] + pubKeyHash: "0xed1484f4d1f7d8c037087fed661dd92faccae1eed3c01182d6fdd6828cea144a" + features: + - type: 3 + entries: + hello: "0x776f726c64" unlocks: - type: 0 signature: type: 0 - publicKey: "0x6d6364560d7e61654c4a4c30796e3e447e3c2b1d4c40671d651c6963086c3c23" - signature: "0x58682c5e5d4076434a280733442a7b1737461357256849022d76744a5c357e1a080b347c757543112c52326849322e621c0b532800154d201f39345e225a0a69" - - type: 0 - signature: - type: 0 - publicKey: "0x3902310d7643157b0b21443d446e26514f07541a060839273b2900553c057e4a" - signature: "0x75247e514b07576c7556454b295b2e1e39681a521b387347132c05160d2504022d3f0c70651b4e173e68045b47275c02357921700c187c355c784e2807585056" - maxBurnedMana: "100" + publicKey: "0x2daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac" + signature: "0x469a3426bf88a8ed1a0346892a519e5b56cd8f686b1ce9b904898a62b25a8f96124f4ad3db9b6241fee5be98d067d083e91b2c4ce96e91fb8bc0871443764f00" + - type: 1 + reference: 0 + maxBurnedMana: "864" signature: type: 0 - publicKey: "0x6c7d5c3b573a39062b064a7c4927162a18296b2a7a026365054871563f5a2e1d" - signature: "0x25393e6d79557407472216133c5c685f3b46316f5932434f3d463a282f575e73227b72122b797d570e3a23143b6531542c2c1d280519213e111736014707036b" + publicKey: "0x2daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac" + signature: "0x0893932c1ed4bd75caed5349dfaa963f2ec34e9bac79e6a860c2aa253a3cd6d6d2e9e5165b21b6b424a7a6262febd669852b5e1a352a93fef3e62e403d5ca002" get-committee-example: value: @@ -1586,171 +1599,84 @@ components: value: header: protocolVersion: 3 - networkId: "0" - issuingTime: "1695275834000000000" - slotCommitmentId: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd700000000" - latestFinalizedSlot: 0 - issuerId: "0x2c2f5d78353a5b196739067e0d343a5c4a746b2655151d1370632743590b0907" + networkId: "8342982141227064571" + issuingTime: "1695275852000000000" + slotCommitmentId: "0x3a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d70767ea58d2a" + latestFinalizedSlot: 500 + issuerId: "0x17432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a" body: type: 0 strongParents: - - "0x0262440c401f7c38017069352072443d13467a240f440b285a2c1f445d5d157032043e2d" - - "0x0e124e700030096f6d21496466770f28495541227d287246532812383a027a1b73355757" - - "0x67230f6c676d604e163668142a4e59155b2e723a035c130a0131082345763a7d5f500454" - weakParents: [] - shallowLikeParents: [] - maxBurnedMana: "100" + - "0x27e0461873f37040c9e59c35ad8a106fa1b94f5ec9ef89499b31904f9a3de59be58dd44a" + - "0x714821f8f257e0a502b71ac7ee57530bb9dc29fe12ff3936f925b835a297680400b76948" + - "0x9951e512546cd9c9fbdab348b6cba91a601a29b50854e55a6e14f6803ca1d81ac7eff5ce" + - "0xaaa7bacf26f1aa4754d42edeab45d6169ea723b7fdf0f6ff3b6ebe90d09dbff6bc553936" + - "0xba75a143de4ac932986fbe7b1d78f639bc6ee8aee10d510d41572851530be884778052aa" + - "0xea5315941f4337752905599710b55e64018c71f4d8f299d0636d50484d05e6ac5667b503" + maxBurnedMana: "864" signature: type: 0 - publicKey: "0x3a56300f6f4d301a727b206148471c1373092359391a74375c53764b141a6c2d" - signature: "0x460e3b225308117a522a2e5a6a3e4928031a40726d54292103447658685f38624d11535a23687a77083a195c5f510502111a6a7051776f3327190c1613401e5e" + publicKey: "0x2daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac" + signature: "0x74e57aa62358bb91ee931c05337a3af2e624fa9b20b04fcb4e15da0a9a4b4281a50ef6384ab7977179d16bd326cebb714c4653e1711447f18cefe1066aa1610d" - get-block-by-id-transaction-response-example: - value: - header: - protocolVersion: 3 - networkId: "0" - issuingTime: "1695275834000000000" - slotCommitmentId: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd700000000" - latestFinalizedSlot: 0 - issuerId: "0x2f67061e353b5763494b251a1c603c4b0f2b23784d1a2b112f39712a7e190577" - body: - type: 0 - strongParents: - - "0x2d5e2221447d1c104d153d4426474c565d145037245234790228543e2c654748460e391b" - - "0x4a14252a34665d7b316420697e772b76547036017e487d1e1e4b2c6e0c5920415d327e0c" - - "0x523d1d0030435d69736d6a5f68625f647e5310076f605520295b042c64296253486c745d" - weakParents: [] - shallowLikeParents: [] - payload: - type: 1 - transaction: - networkId: "14147312347886322761" - creationSlot: 0 - contextInputs: [] - inputs: - - type: 0 - transactionId: "0x6c766054650a712a16787501546000205331190e33013825226b0c2f612f7911114f754c" - transactionOutputIndex: 82 - - type: 0 - transactionId: "0x3b33480f1f77043e12443a50191c0c2061494740747e44057d05794129670b7846314857" - transactionOutputIndex: 22 - allotments: - - accountId: "0x7373587a141f4d5a5b262b185234760d50411c326f05300c2874716d24770b64" - mana: "3334" - capabilities: "" - outputs: - - type: 0 - amount: "9315" - mana: "0" - unlockConditions: - - type: 0 - address: - type: 0 - pubKeyHash: "0x50783863416b5750544c6f1f165d664c224b4d51506e631e3c221602085e2d59" - features: [] - - type: 0 - amount: "4909" - mana: "0" - unlockConditions: - - type: 0 - address: - type: 0 - pubKeyHash: "0x271f4e2330314b16747d674c3b6646761a5716180526305253136207255d3854" - features: [] - unlocks: - - type: 0 - signature: - type: 0 - publicKey: "0x18703b62523674525b10272408452a57083f4d116e0b4d706a59402040143922" - signature: "0x0f15013f08694a7c24350053077709177d626b664b4739384f68487449764c295223313b5361495d783c016c4c7b5a6f1b0c442c564b73500054120272703704" - - type: 0 - signature: - type: 0 - publicKey: "0x2556253d420e31611e16592938517a325e46220d39533d0e4f7335202f68672b" - signature: "0x3f172a67240f3e161357595d2e11007c0e5e7a4c48713a0e28113775271a1733621a5f2d151a20196a2f78383c4a397e045c3d023e4f680b43561b494b744c5b" - maxBurnedMana: "100" - signature: - type: 0 - publicKey: "0x0d58682550071056456c6b7b634607036564050f3a15513d495a725a5b345f7c" - signature: "0x685c44265d4a6f2a5653710c6f4a41296b377b44753353082d4619610c2d5e6374153239372b436773354a6421632e3d646f7b1736637321037a0f671f3b3878" get-full-block-by-id-tagged-data-response-example: value: block: header: protocolVersion: 3 - networkId: "0" - issuingTime: "1695275834000000000" - slotCommitmentId: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd700000000" - latestFinalizedSlot: 0 - issuerId: "0x1d0140675f050c4d6e1018510a103d2f4c134a31463965775f7d284959045100" + networkId: "8342982141227064571" + issuingTime: "1695275852000000000" + slotCommitmentId: "0x3a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d70767ea58d2a" + latestFinalizedSlot: 500 + issuerId: "0x17432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a" body: type: 0 strongParents: - - "0x087a2734114e6c041e423a310d7c2039302825484b6c326a560c3a6e281d274a3d18110e" - weakParents: [] - shallowLikeParents: [] + - "0x27e0461873f37040c9e59c35ad8a106fa1b94f5ec9ef89499b31904f9a3de59be58dd44a" + - "0x714821f8f257e0a502b71ac7ee57530bb9dc29fe12ff3936f925b835a297680400b76948" + - "0x9951e512546cd9c9fbdab348b6cba91a601a29b50854e55a6e14f6803ca1d81ac7eff5ce" + - "0xaaa7bacf26f1aa4754d42edeab45d6169ea723b7fdf0f6ff3b6ebe90d09dbff6bc553936" + - "0xba75a143de4ac932986fbe7b1d78f639bc6ee8aee10d510d41572851530be884778052aa" + - "0xea5315941f4337752905599710b55e64018c71f4d8f299d0636d50484d05e6ac5667b503" payload: type: 0 tag: "0x746167" - data: "0x175d051d3873347d3b2617773240644f780f683064094a0c0b4d1a0c621f0160572c324d371a792536786a2719307b590b5f6d585e3a28740a42080942607a131a5e68242735131920230f72513d01694a54507c340e7817514457462a19213c7270212732506a10097a3e36732c011c6f513202360660240d597d7076014750600c27072540123b7b49137409282d48577a0247125a1c6c13456c2d350a6a224a35" - maxBurnedMana: "100" + data: "0x6c754128356c071e5549764a48427b" + maxBurnedMana: "864" signature: type: 0 - publicKey: "0x1a382c2224662059334e1d6e076b3a490b594c31332e3d652d402f5139263e56" - signature: "0x15216f030f65647910225f736f627d12600607064d7305235c3818700d01633e5d625e11497a3e514e6f5a0e6a51091e475c604125360813067c740346320520" + publicKey: "0x2daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac" + signature: "0xc2982c2476379db0c8d39a204801163fc05dc1c7aa7df537e6041f91491943ab1de29a2dfe6076588c53b8d2ccf5eabe49f2cb64198303682859fd0c58348b0d" metadata: - blockId: "0x3848a6d17070830206e5032fbce2ae3939e60eec0816546e074316b1f66977d04d010000" + blockId: "0x1d5f495c0f4b883cf2c79cafd382c73484c65651099329e3b0b4c969c35d620004000000" blockState: "confirmed" - get-block-by-id-tagged-data-response-example: - value: - header: - protocolVersion: 3 - networkId: "0" - issuingTime: "1695275834000000000" - slotCommitmentId: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd700000000" - latestFinalizedSlot: 0 - issuerId: "0x1d0140675f050c4d6e1018510a103d2f4c134a31463965775f7d284959045100" - body: - type: 0 - strongParents: - - "0x087a2734114e6c041e423a310d7c2039302825484b6c326a560c3a6e281d274a3d18110e" - weakParents: [] - shallowLikeParents: [] - payload: - type: 0 - tag: "0x746167" - data: "0x175d051d3873347d3b2617773240644f780f683064094a0c0b4d1a0c621f0160572c324d371a792536786a2719307b590b5f6d585e3a28740a42080942607a131a5e68242735131920230f72513d01694a54507c340e7817514457462a19213c7270212732506a10097a3e36732c011c6f513202360660240d597d7076014750600c27072540123b7b49137409282d48577a0247125a1c6c13456c2d350a6a224a35" - maxBurnedMana: "100" - signature: - type: 0 - publicKey: "0x1a382c2224662059334e1d6e076b3a490b594c31332e3d652d402f5139263e56" - signature: "0x15216f030f65647910225f736f627d12600607064d7305235c3818700d01633e5d625e11497a3e514e6f5a0e6a51091e475c604125360813067c740346320520" get-block-by-id-validation-response-example: value: header: protocolVersion: 3 - networkId: "0" - issuingTime: "1695275834000000000" - slotCommitmentId: "0x8633b2eb1845fdecf12ee6c5e789c3cf1f0d0bbb3cee65cb5fb2757e995b5cd700000000" - latestFinalizedSlot: 0 - issuerId: "0x5201107e2f0b5d3432100560291216613b07725f06001a6a10317d320c767424" + networkId: "8342982141227064571" + issuingTime: "1695275852000000000" + slotCommitmentId: "0x3a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d70767ea58d2a" + latestFinalizedSlot: 500 + issuerId: "0x17432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a" body: type: 1 strongParents: - - "0x07772a2f00585b53650c71223c77621e466210097a1177534f54633a4e77657d175d185f" - - "0x3962007c6c75357d356b15125579770c653f7a55571816701a7c6766347a347b05497402" - weakParents: [] - shallowLikeParents: [] - highestSupportedVersion: 4 - protocolParametersHash: "0x8f2857e188708fc896dab7fc60196d2f728d6229b20bcd726a60ad5c52a5368b" + - "0x27e0461873f37040c9e59c35ad8a106fa1b94f5ec9ef89499b31904f9a3de59be58dd44a" + - "0x714821f8f257e0a502b71ac7ee57530bb9dc29fe12ff3936f925b835a297680400b76948" + - "0x9951e512546cd9c9fbdab348b6cba91a601a29b50854e55a6e14f6803ca1d81ac7eff5ce" + - "0xaaa7bacf26f1aa4754d42edeab45d6169ea723b7fdf0f6ff3b6ebe90d09dbff6bc553936" + - "0xba75a143de4ac932986fbe7b1d78f639bc6ee8aee10d510d41572851530be884778052aa" + - "0xea5315941f4337752905599710b55e64018c71f4d8f299d0636d50484d05e6ac5667b503" + highestSupportedVersion: 3 + protocolParametersHash: "0x0c0a5be47669365426b3e34ecd68f8fe6c70656a54139a1e1cd6fd779bfb476f" signature: type: 0 - publicKey: "0x2a31120a501c0d522d2f76514b4a3b5e415b022356264b4c332a507b431c1965" - signature: "0x25600518034504557a011174413d0054601730066c221879477b06482966783f340a6d650f48552f4947640d661c54320c790b04716b262d1a74456f7d0b2551" + publicKey: "0x2daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac" + signature: "0x3b6185bb5757d5e7fd576eeedf0c765c44cbcfe148261b8558a942867528f2cfe5a39a6ecd7bf7e82e134867a75df05385624be8c4102b3b77b397163459460b" get-outputs-by-id-response-example: value: From 154e564b4a047f67c4b918acb4d4945661a42fe8 Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Tue, 9 Jan 2024 20:19:12 +0800 Subject: [PATCH 81/92] Make the description more clear in TransactionMetadataResponse --- tips/TIP-0048/openapi3-core.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0048/openapi3-core.yaml b/tips/TIP-0048/openapi3-core.yaml index 173aa0d83..e0d986dda 100644 --- a/tips/TIP-0048/openapi3-core.yaml +++ b/tips/TIP-0048/openapi3-core.yaml @@ -3486,7 +3486,7 @@ components: - confirmed - finalized - failed - description: If 'pending', the transaction is not included yet. If 'accepted', the transaction is included. If 'confirmed' means transaction is included and its included block is confirmed. If 'finalized' means transaction is included, its included block is finalized and cannot be reverted anymore. If 'failed' means transaction is not successfully issued due to failure reason. + description: If 'pending', the transaction is not included yet. If 'accepted', the transaction is included. If 'confirmed' means transaction is included and its included block is confirmed. If 'finalized' means transaction is included, its included block is finalized and cannot be reverted anymore. If 'failed' means transaction is not successfully issued due to the transaction failure reason. transactionFailureReason: type: integer enum: [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,255] From 24e6a29c5408fa552d88abb275b32fa4dabc3973 Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Tue, 9 Jan 2024 21:24:05 +0800 Subject: [PATCH 82/92] Add commitments/by-index/{index}/utxo-changes/full --- tips/TIP-0048/openapi3-core.yaml | 51 +++++++++++++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/tips/TIP-0048/openapi3-core.yaml b/tips/TIP-0048/openapi3-core.yaml index e0d986dda..9ea3cc246 100644 --- a/tips/TIP-0048/openapi3-core.yaml +++ b/tips/TIP-0048/openapi3-core.yaml @@ -1251,7 +1251,56 @@ paths: application/json: schema: $ref: '#/components/schemas/InternalErrorResponse' - + '/api/core/v3/commitments/by-index/{index}/utxo-changes/full': + get: + tags: + - commitments + summary: Get all UTXO changes of a given slot index. + description: Get all UTXO changes of a given slot index. + parameters: + - in: path + name: index + schema: + type: integer + example: 154862 + required: true + description: Index of the commitment to look up. + responses: + '200': + description: "Successful operation." + content: + application/json: + schema: + $ref: '#/components/schemas/UTXOChangesFullResponse' + examples: + default: + $ref: >- + #/components/examples/get-utxo-changes-full-response-example + '400': + description: "Unsuccessful operation: indicates that the provided data is invalid." + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + '403': + description: "Unsuccessful operation: indicates that the endpoint is not available for public use." + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenResponse' + '404': + description: "Unsuccessful operation: indicates that the requested data was not found." + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + '500': + description: "Unsuccessful operation: indicates that an unexpected, internal server error happened which prevented the node from fulfilling the request." + content: + application/json: + schema: + $ref: '#/components/schemas/InternalErrorResponse' + components: examples: get-routes-response-example: From 5c6be02335f486626f3640f1b84348faf14352b2 Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Wed, 10 Jan 2024 11:41:44 +0800 Subject: [PATCH 83/92] Rename endpoint commitment/by-index/ -> commitment/by-slot --- tips/TIP-0048/openapi3-core.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tips/TIP-0048/openapi3-core.yaml b/tips/TIP-0048/openapi3-core.yaml index 9ea3cc246..279ccb1a4 100644 --- a/tips/TIP-0048/openapi3-core.yaml +++ b/tips/TIP-0048/openapi3-core.yaml @@ -1144,7 +1144,7 @@ paths: schema: $ref: '#/components/schemas/InternalErrorResponse' - '/api/core/v3/commitments/by-index/{index}': + '/api/core/v3/commitments/by-slot/{slot}': get: tags: - commitments @@ -1202,7 +1202,7 @@ paths: application/json: schema: $ref: '#/components/schemas/InternalErrorResponse' - '/api/core/v3/commitments/by-index/{index}/utxo-changes': + '/api/core/v3/commitments/by-slot/{slot}/utxo-changes': get: tags: - commitments @@ -1251,7 +1251,7 @@ paths: application/json: schema: $ref: '#/components/schemas/InternalErrorResponse' - '/api/core/v3/commitments/by-index/{index}/utxo-changes/full': + '/api/core/v3/commitments/by-slot/{slot}/utxo-changes/full': get: tags: - commitments From 1fc52e5cc0c17a82ea762a5de7018ce3780f4588 Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Wed, 10 Jan 2024 12:14:04 +0800 Subject: [PATCH 84/92] Fix description of tx 'failed' state --- tips/TIP-0048/openapi3-core.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0048/openapi3-core.yaml b/tips/TIP-0048/openapi3-core.yaml index 279ccb1a4..f1279f4a2 100644 --- a/tips/TIP-0048/openapi3-core.yaml +++ b/tips/TIP-0048/openapi3-core.yaml @@ -3535,7 +3535,7 @@ components: - confirmed - finalized - failed - description: If 'pending', the transaction is not included yet. If 'accepted', the transaction is included. If 'confirmed' means transaction is included and its included block is confirmed. If 'finalized' means transaction is included, its included block is finalized and cannot be reverted anymore. If 'failed' means transaction is not successfully issued due to the transaction failure reason. + description: If 'pending', the transaction is not included yet. If 'accepted', the transaction is included. If 'confirmed' means transaction is included and its included block is confirmed. If 'finalized' means transaction is included, its included block is finalized and cannot be reverted anymore. If 'failed' means transaction is issued but failed due to the transaction failure reason. transactionFailureReason: type: integer enum: [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,255] From fa98424578d3c8c68e4b14f723255b13f48896d9 Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Thu, 11 Jan 2024 13:59:09 +0800 Subject: [PATCH 85/92] Fix swagger error --- tips/TIP-0048/openapi3-core.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tips/TIP-0048/openapi3-core.yaml b/tips/TIP-0048/openapi3-core.yaml index f1279f4a2..168d7c506 100644 --- a/tips/TIP-0048/openapi3-core.yaml +++ b/tips/TIP-0048/openapi3-core.yaml @@ -1152,7 +1152,7 @@ paths: description: Look up a commitment by a given commitment index. parameters: - in: path - name: index + name: slot schema: type: integer example: 154862 @@ -1210,7 +1210,7 @@ paths: description: Get all UTXO changes of a given slot by commitment index. parameters: - in: path - name: index + name: slot schema: type: integer example: 154862 @@ -1259,7 +1259,7 @@ paths: description: Get all UTXO changes of a given slot index. parameters: - in: path - name: index + name: slot schema: type: integer example: 154862 From aa001fc1dffa5bf65260711507311a364158ef36 Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Thu, 11 Jan 2024 14:06:49 +0800 Subject: [PATCH 86/92] Make staker and validator description more clear * staker: registered validator * validator: committee member --- tips/TIP-0048/openapi3-core.yaml | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/tips/TIP-0048/openapi3-core.yaml b/tips/TIP-0048/openapi3-core.yaml index 168d7c506..e0983d6dd 100644 --- a/tips/TIP-0048/openapi3-core.yaml +++ b/tips/TIP-0048/openapi3-core.yaml @@ -261,7 +261,7 @@ paths: get: tags: - validators - summary: Returns information of all registered validators and if they are active, ordered by their holding stake. + summary: Returns information of all stakers (registered validators) and if they are active, ordered by their holding stake. parameters: - in: query name: pageSize @@ -269,7 +269,7 @@ paths: type: integer example: 1 required: false - description: The page number of validators. + description: The page number of stakers. - in: query name: cursor schema: @@ -316,7 +316,7 @@ paths: get: tags: - validators - summary: Return information about a validator. + summary: Return information about a staker (registered validator). parameters: - in: path name: bech32Address @@ -324,7 +324,7 @@ paths: type: string example: "rms1pqm4xk8e9ny5w5rxjkvtp249tfhlwvcshyr3pc0665jvp7g3hc875k538hl" required: true - description: The Account Address of the account. + description: The Account Address of the staker. responses: '200': description: "Successful operation." @@ -3270,7 +3270,7 @@ components: - parameters ValidatorsResponse: - description: Returns a paginated list of all registered stakers ready for the next epoch and indicates if they were active recently (are eligible for committee selection). + description: Returns a paginated list of all stakers (registered validators) ready for the next epoch and indicates if they were active recently (are eligible for committee selection). properties: stakers: type: array @@ -3320,7 +3320,7 @@ components: - $ref: '#/components/schemas/CommitteeMember' CommitteeMember: - description: Returns information of a committee member. + description: Returns information of a validator (committee member). properties: address: type: string @@ -3336,32 +3336,32 @@ components: description: The fixed cost of the validator, which it receives as part of its Mana rewards. Validator: - description: Returns information of a validator. + description: Returns information of a staker (registered validator). properties: address: type: string - description: The account address of the validator. + description: The account address of the staker. stakingEndEpoch: type: integer - description: The epoch index until which the validator registered to stake. + description: The epoch index until which the staker registered to stake. poolStake: type: string description: The total stake of the pool, including delegators. validatorStake: type: string - description: The stake of a validator. + description: The stake of a staker. fixedCost: type: string - description: The fixed cost of the validator, which it receives as part of its Mana rewards. + description: The fixed cost of the staker, which it receives as part of its Mana rewards. active: type: boolean - description: Shows whether validator was active recently. + description: Shows whether staker was active recently. latestSupportedProtocolVersion: type: integer - description: The latest protocol version the validator supported. + description: The latest protocol version the staker supported. latestSupportedProtocolHash: type: string - description: The latest protocol hash the validator supported. + description: The latest protocol hash the staker supported. required: - address - stakingEndEpoch From 00968e00c2937cedf8a22703e603e65a7b58a1ba Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Thu, 11 Jan 2024 17:07:33 +0800 Subject: [PATCH 87/92] Add retention period to reward params --- tips/TIP-0048/openapi3-core.yaml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tips/TIP-0048/openapi3-core.yaml b/tips/TIP-0048/openapi3-core.yaml index e0983d6dd..6cfb9e415 100644 --- a/tips/TIP-0048/openapi3-core.yaml +++ b/tips/TIP-0048/openapi3-core.yaml @@ -1397,6 +1397,7 @@ components: decayBalancingConstantExponent: 8 decayBalancingConstant: "1" poolCoefficientExponent: 11 + retentionPeriod: 684 targetCommitteeSize: 32 chainSwitchingThreshold: 2 baseToken: @@ -3227,6 +3228,9 @@ components: poolCoefficientExponent: type: integer description: PoolCoefficientExponent is the exponent used for shifting operation in the pool rewards calculations. + retentionPeriod: + type: integer + description: The number of epochs for which rewards are retained. required: - profitMarginExponent - bootstrappingDuration @@ -3234,6 +3238,7 @@ components: - decayBalancingConstantExponent - decayBalancingConstant - poolCoefficientExponent + - retentionPeriod targetCommitteeSize: type: integer description: The target size of the committee. From d84b946028414e64f9467cb7f08b841f41a26e6d Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Mon, 22 Jan 2024 14:41:07 +0800 Subject: [PATCH 88/92] Resolve comments --- tips/TIP-0048/openapi3-core.yaml | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/tips/TIP-0048/openapi3-core.yaml b/tips/TIP-0048/openapi3-core.yaml index 6cfb9e415..0a568559f 100644 --- a/tips/TIP-0048/openapi3-core.yaml +++ b/tips/TIP-0048/openapi3-core.yaml @@ -167,11 +167,11 @@ paths: required: true description: Output ID of an account or delegation output. - in: query - name: slotIndex + name: slot schema: type: integer example: 50 - description: A client can specify a slot index explicitly, which should be equal to the slot it uses as the commitment input for the claiming transaction to ensure the node calculates the rewards identically as during transaction execution. Rewards are decayed up to the epoch corresponding to the given slotIndex + MinCommittableAge. For a Delegation Output in delegating state (i.e. when Delegation ID is zeroed), that epoch - 1 is also used as the last epoch for which rewards are fetched. Callers that do not build transactions with the returned values may omit this value in which case it defaults to the latest committed slot, which is good enough to, e.g. display estimated rewards to users. + description: A client can specify a slot index explicitly, which should be equal to the slot it uses as the commitment input for the claiming transaction to ensure the node calculates the rewards identically as during transaction execution. Rewards are decayed up to the epoch corresponding to the given slot + MinCommittableAge. For a Delegation Output in delegating state (i.e. when Delegation ID is zeroed), that epoch - 1 is also used as the last epoch for which rewards are fetched. Callers that do not build transactions with the returned values may omit this value in which case it defaults to the latest committed slot, which is good enough to, e.g. display estimated rewards to users. responses: '200': description: "Successful operation." @@ -367,14 +367,6 @@ paths: summary: Return information that is used to attach a block in the network. description: >- Return information that is used to attach a block in the network, which includes parents, last finalized slot index and the latest commitment the node created. - parameters: - - in: query - name: slotIndex - schema: - type: integer - example: 1 - required: false - description: The slot index of the commitment and reference mana cost to query. responses: '200': description: "Successful operation." @@ -1438,7 +1430,9 @@ components: value: blockId: "0x0482f0eba39a23c9a13072c93d828b55543132c47f5f57514d9e55535e9d4f4f35000000" blockState: "pending" - transactionState: "pending" + transactionMetadata: + transactionId: "0x72f0dfa9ad116ade8bdac8ef291ed2fb8065c6c75d5d3666e8b2053696c94a9e00001000" + transactionState: "pending" get-block-by-id-response-example-new: value: @@ -2482,7 +2476,7 @@ components: type: type: integer description: Set to value 2 to denote a Timelock Unlock Condition. - slotIndex: + slot: type: integer description: The slot index until which the timelock applies (inclusive). required: @@ -2499,7 +2493,7 @@ components: - $ref: '#/components/schemas/Ed25519Address' - $ref: '#/components/schemas/AccountAddress' - $ref: '#/components/schemas/NFTAddress' - slotIndex: + slot: type: integer description: The slot index at which the expiration happens. required: @@ -3729,7 +3723,7 @@ components: description: The transaction ID that spent the output. Hex-encoded with 0x prefix. commitmentId: type: string - description: The commitment ID that includes the spending of the ouptut. + description: The commitment ID that includes the spending of the output. required: - slot - transactionId From 790752bad822aa09b433970bf6fedc5c225c827d Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Thu, 25 Jan 2024 15:45:20 +0800 Subject: [PATCH 89/92] Fix indent --- tips/TIP-0048/openapi3-core.yaml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/tips/TIP-0048/openapi3-core.yaml b/tips/TIP-0048/openapi3-core.yaml index 0a568559f..d4beac8a2 100644 --- a/tips/TIP-0048/openapi3-core.yaml +++ b/tips/TIP-0048/openapi3-core.yaml @@ -1840,14 +1840,14 @@ components: createdOutputs: - outputId: "0x3130f21c723fa597805763739f3a2a40b674af6b4071ef0494331b644a7e4d52000000001300" output: - type: 0 - amount: "1000" - unlockConditions: - - type: 0 - address: - type: 0 - pubKeyHash: "0x8eaf87ac1f52eb05f2c7c0c15502df990a228838dc37bd18de9503d69afd257d" - mana: "2000" + type: 0 + amount: "1000" + unlockConditions: + - type: 0 + address: + type: 0 + pubKeyHash: "0x8eaf87ac1f52eb05f2c7c0c15502df990a228838dc37bd18de9503d69afd257d" + mana: "2000" consumedOutputs: [] schemas: From e097437e011335a00812760135ef775fc101125e Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Thu, 25 Jan 2024 16:36:38 +0800 Subject: [PATCH 90/92] Fix invalid feature for account output --- tips/TIP-0048/openapi3-core.yaml | 34 +++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/tips/TIP-0048/openapi3-core.yaml b/tips/TIP-0048/openapi3-core.yaml index d4beac8a2..5a0628ca1 100644 --- a/tips/TIP-0048/openapi3-core.yaml +++ b/tips/TIP-0048/openapi3-core.yaml @@ -1499,9 +1499,9 @@ components: header: protocolVersion: 3 networkId: "8342982141227064571" - issuingTime: "1695275852000000000" - slotCommitmentId: "0x3a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d70767ea58d2a" - latestFinalizedSlot: 500 + issuingTime: "1695275942000000000" + slotCommitmentId: "0x3a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d707601000000" + latestFinalizedSlot: 0 issuerId: "0x17432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a" body: type: 0 @@ -1516,10 +1516,10 @@ components: type: 1 transaction: networkId: "8342982141227064571" - creationSlot: 1048576 + creationSlot: 11 contextInputs: - type: 0 - commitmentId: "0x3a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d70767ea58d2a" + commitmentId: "0x3a1e3b617060146e0362361a4b752833186108395f3b2b3d3e6c655e287d707601000000" - type: 1 accountId: "0x17432c5a7a672503480241125e3952414a7a320441080c624c264b004e09614a" - type: 2 @@ -1532,10 +1532,10 @@ components: transactionId: "0xd2c5ccba12b6fad51652131289867492799c9fc5710244418aa6e955f8fa826100000000" transactionOutputIndex: 0 allotments: - - accountId: "0x7e0d0a5848362b23120f55115b096774036d7610137a631413221f5573344507" - mana: "2285" - accountId: "0x476820096e7038107d071a4e473f1e295f346e2d0824263e5e3e7d004f6b6915" mana: "2189" + - accountId: "0x7e0d0a5848362b23120f55115b096774036d7610137a631413221f5573344507" + mana: "2285" capabilities: "0x01" outputs: - type: 0 @@ -1561,23 +1561,35 @@ components: type: 0 pubKeyHash: "0xed1484f4d1f7d8c037087fed661dd92faccae1eed3c01182d6fdd6828cea144a" features: - - type: 3 + - type: 2 entries: hello: "0x776f726c64" + - type: 6 + expirySlot: 4294967295 + blockIssuerKeys: + - type: 0 + publicKey: "0x9e05a32eafedefd40298e24ad4f8c334580187f7e9afbd9da13b5ba4007dd1b5" + - type: 0 + publicKey: "0xa504844f7a0df2c5101d31696593b309040f8660d41035aba508f24c00668b21" + - type: 7 + stakedAmount: "10000" + fixedCost: "400" + startEpoch: 0 + endEpoch: 4294967295 unlocks: - type: 0 signature: type: 0 publicKey: "0x2daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac" - signature: "0x469a3426bf88a8ed1a0346892a519e5b56cd8f686b1ce9b904898a62b25a8f96124f4ad3db9b6241fee5be98d067d083e91b2c4ce96e91fb8bc0871443764f00" + signature: "0x9178a608cc0c6c703a41f5bad71e9e80bf9e580f26587df36379d12416c65a85974fafcd22b14d4a7853cc3d15b414e8bf37003dc77725d1d2c9b40d42a13501" - type: 1 reference: 0 maxBurnedMana: "864" signature: type: 0 publicKey: "0x2daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac" - signature: "0x0893932c1ed4bd75caed5349dfaa963f2ec34e9bac79e6a860c2aa253a3cd6d6d2e9e5165b21b6b424a7a6262febd669852b5e1a352a93fef3e62e403d5ca002" - + signature: "0x14718f345117d3f29d8e917ca4f8f758159914f45ef5c0d2cfd46c375edcab125ab4c08c59eb8b6d8e8ef2b7a4de92805bae45612277048bdb101ceed96b880c" + get-committee-example: value: epoch: 10 From 6cd560663fa5eb000bda2520606aed3918127761 Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Thu, 25 Jan 2024 17:27:55 +0800 Subject: [PATCH 91/92] Remove features from info endpoint --- tips/TIP-0048/openapi3-core.yaml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/tips/TIP-0048/openapi3-core.yaml b/tips/TIP-0048/openapi3-core.yaml index 5a0628ca1..fe781c340 100644 --- a/tips/TIP-0048/openapi3-core.yaml +++ b/tips/TIP-0048/openapi3-core.yaml @@ -1398,8 +1398,6 @@ components: unit: SMR subunit: glow decimals: 6 - features: - - test get-buildingBlock-response-example: value: @@ -2978,11 +2976,6 @@ components: - tickerSymbol - unit - decimals - features: - description: The features that are supported by the node. All features must be lowercase. - type: array - items: - type: string required: - name - version @@ -2990,7 +2983,6 @@ components: - metrics - protocolParameters - baseToken - - features ProtocolParameters: description: Protocol parameters. From 77a2c44330ecdc3c93bc7b23614704fa180749ac Mon Sep 17 00:00:00 2001 From: jkrvivian Date: Thu, 29 Feb 2024 16:19:47 +0800 Subject: [PATCH 92/92] Resolve comments --- tips/TIP-0048/openapi3-core.yaml | 94 ++++++++++++++++---------------- 1 file changed, 47 insertions(+), 47 deletions(-) diff --git a/tips/TIP-0048/openapi3-core.yaml b/tips/TIP-0048/openapi3-core.yaml index fe781c340..3f5b10689 100644 --- a/tips/TIP-0048/openapi3-core.yaml +++ b/tips/TIP-0048/openapi3-core.yaml @@ -1325,26 +1325,26 @@ components: parameters: type: 0 version: 3 - networkName: TestJungle - bech32Hrp: tgl + networkName: testnet + bech32Hrp: rms storageScoreParameters: - storageCost: "0" - factorData: 0 - offsetOutputOverhead: "0" - offsetEd25519BlockIssuerKey: "0" - offsetStakingFeature: "0" - offsetDelegation: "0" + storageCost: "100" + factorData: 1 + offsetOutputOverhead: "10" + offsetEd25519BlockIssuerKey: "100" + offsetStakingFeature: "100" + offsetDelegation: "100" workScoreParameters: - dataByte: 0 - block: 1 - input: 0 - contextInput: 0 - output: 0 - nativeToken: 0 - staking: 0 - blockIssuer: 0 - allotment: 0 - signatureEd25519: 0 + dataByte: 1 + block: 2 + input: 3 + contextInput: 4 + output: 5 + nativeToken: 6 + staking: 7 + blockIssuer: 8 + allotment: 9 + signatureEd25519: 10 manaParameters: bitsCount: 63 generationRate: 1 @@ -1353,10 +1353,10 @@ components: - 10 - 20 decayFactorsExponent: 32 - decayFactorEpochsSum: 2420916375 + decayFactorEpochsSum: 2262417561 decayFactorEpochsSumExponent: 21 - annualDecayFactorPercentage: 50 - tokenSupply: "2779530283277761" + annualDecayFactorPercentage: 70 + tokenSupply: "1813620509061365" genesisSlot: 0 genesisUnixTimestamp: "1695275822" slotDurationInSeconds: 10 @@ -1368,7 +1368,7 @@ components: livenessThresholdUpperBound: 30 minCommittableAge: 10 maxCommittableAge: 20 - epochNearingThreshold: 24 + epochNearingThreshold: 60 congestionControlParameters: minReferenceManaCost: "1" increase: "0" @@ -1384,14 +1384,14 @@ components: activationOffset: 7 rewardsParameters: profitMarginExponent: 8 - bootstrappingDuration: 1154 - manaShareCoefficient: "2" - decayBalancingConstantExponent: 8 - decayBalancingConstant: "1" + bootstrappingDuration: 1079 + rewardToGenerationRatio: 5 + initialTargetRewardsRate: "10" + finalTargetRewardsRate: "20" poolCoefficientExponent: 11 - retentionPeriod: 684 + retentionPeriod: 384 targetCommitteeSize: 32 - chainSwitchingThreshold: 2 + chainSwitchingThreshold: 3 baseToken: name: Shimmer tickerSymbol: SMR @@ -1405,8 +1405,8 @@ components: - "0x0482f0eba39a23c9a13072c93d828b55543132c47f5f57514d9e55535e9d4f4f35000000" - "0xae7c4f55a6db8bf4841e4a38f06d32ab9bd88b927a6ba0bc19bcb19c625ff8b63c000000" weakParents: - - "0x67e57f7446b5a6f152afabb17c6077c26512278a275310a7ff2fa513f4e0b7383d000000" - "0x2e65c319e9a2c4a6ff7195f9a1ed896c43d0dded1b906979316d502b158965c23d000000" + - "0x67e57f7446b5a6f152afabb17c6077c26512278a275310a7ff2fa513f4e0b7383d000000" shallowLikeParents: - "0xe5fe5231630afaaba609af76787ff1ec9c6088dd17e9cf922152b3facd7bd5883e000000" - "0xed4b771b5413f5118dd80021ca07fb727e4c54eec9d28d6566c28cc81e7d267c3f000000" @@ -1566,9 +1566,9 @@ components: expirySlot: 4294967295 blockIssuerKeys: - type: 0 - publicKey: "0x9e05a32eafedefd40298e24ad4f8c334580187f7e9afbd9da13b5ba4007dd1b5" + pubKeyHash: "0x295409de79016133647d4078cb01618a4ba018eb74ff613138d8ff8dc05de73c" - type: 0 - publicKey: "0xa504844f7a0df2c5101d31696593b309040f8660d41035aba508f24c00668b21" + pubKeyHash: "0x868f4c6ef7b5b1d55838cbfb8ae4f3a9776c53cdd3e3d33000094d72acab5a2f" - type: 7 stakedAmount: "10000" fixedCost: "400" @@ -1579,14 +1579,14 @@ components: signature: type: 0 publicKey: "0x2daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac" - signature: "0x9178a608cc0c6c703a41f5bad71e9e80bf9e580f26587df36379d12416c65a85974fafcd22b14d4a7853cc3d15b414e8bf37003dc77725d1d2c9b40d42a13501" + signature: "0x5bb409d59e01d2ea9f1a1fb67feb681d0d3ecb05787cadad2f89fdf13ef7ff03ad5cebf28df5dddd8510992596d98b133f86e14f76824e6ccc369a8f5df44806" - type: 1 reference: 0 maxBurnedMana: "864" signature: type: 0 publicKey: "0x2daefbcbadd044da470acd2f7fcf6fcb04b873cc801e7ee408018e1dfa0257ac" - signature: "0x14718f345117d3f29d8e917ca4f8f758159914f45ef5c0d2cfd46c375edcab125ab4c08c59eb8b6d8e8ef2b7a4de92805bae45612277048bdb101ceed96b880c" + signature: "0xb4300837bafda6e0e590124b367a1beb87abd9afbde50bc2afe5e335c7118c13ba59ba58d082eb329c84f527a536bf2c1943b3bcf0444d770dcf7b05f135f50a" get-committee-example: value: @@ -1605,7 +1605,7 @@ components: get-validators-example: value: - stakers: + validators: - address: "rms1pp4wuuz0y42caz48vv876qfpmffswsvg40zz8v79sy8cp0jfxm4kunflcgt" stakingEndEpoch: 100 poolStake: '200000' @@ -3214,15 +3214,15 @@ components: bootstrappingDuration: type: integer description: The length in epochs of the bootstrapping phase. - manaShareCoefficient: - type: string - description: The coefficient used for calculation of initial rewards. - decayBalancingConstantExponent: + rewardToGenerationRatio: type: integer - description: DecayBalancingConstantExponent is the exponent used for calculation of the initial reward. - decayBalancingConstant: + description: RewardToGenerationRatio is the ratio of the final rewards rate to the generation rate of Mana. + initialTargetRewardsRate: + type: string + description: InitialTargetRewardsRate is the rate of Mana rewards at the start of the bootstrapping phase. + finalTargetRewardsRate: type: string - description: An integer approximation calculated based on chosen DecayBalancingConstantExponent. + description: FinalTargetRewardsRate is the rate of Mana rewards after the bootstrapping phase. poolCoefficientExponent: type: integer description: PoolCoefficientExponent is the exponent used for shifting operation in the pool rewards calculations. @@ -3232,9 +3232,9 @@ components: required: - profitMarginExponent - bootstrappingDuration - - manaShareCoefficient - - decayBalancingConstantExponent - - decayBalancingConstant + - rewardToGenerationRatio + - initialTargetRewardsRate + - finalTargetRewardsRate - poolCoefficientExponent - retentionPeriod targetCommitteeSize: @@ -3273,16 +3273,16 @@ components: - parameters ValidatorsResponse: - description: Returns a paginated list of all stakers (registered validators) ready for the next epoch and indicates if they were active recently (are eligible for committee selection). + description: Returns a paginated list of all registered validators ready for the next epoch and indicates if they were active recently (are eligible for committee selection). properties: - stakers: + validators: type: array items: oneOf: - $ref: '#/components/schemas/Validator' pageSize: type: integer - description: The number of stakers returned per one API request with pagination. + description: The number of registerd validators returned per one API request with pagination. cursor: type: string description: The cursor that needs to be provided as cursor query parameter to request the next page. Cursor is absent if the last page is returned.