From 13a22802ab8c50c938c437ea22bd2020071b18ec Mon Sep 17 00:00:00 2001 From: Alex Aunter Date: Wed, 24 Aug 2022 01:35:45 +0400 Subject: [PATCH 01/29] feat: disallow removing last remaining draft operator id --- res/ft_lockup.wasm | Bin 336163 -> 336263 bytes src/lib.rs | 4 ++++ tests/deposit_whitelist.rs | 9 +++++---- tests/draft.rs | 5 ++++- 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/res/ft_lockup.wasm b/res/ft_lockup.wasm index be61ecb4f356d995591f9139163821d1b25db932..26f62d7548c0882fe50ef53ebea8cfd4281501e4 100755 GIT binary patch delta 17971 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 delta 17691 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 hvRyF^wt>S?PGe! = e.get_deposit_whitelist(); - assert_eq!(res, vec![] as Vec); + assert_eq!(res, vec![users.charlie.account_id()] as Vec); // draft operator role is still present let res: Vec = e.get_draft_operators_whitelist(); assert_eq!(res, vec![users.eve.account_id(), e.owner.account_id()]); From c0953db86c23174385cf7e8d6d1099156a8f2d7c Mon Sep 17 00:00:00 2001 From: Alex Aunter Date: Sun, 3 Jul 2022 15:05:12 +0400 Subject: [PATCH 02/29] feat: preserve start checkpoint on terminate --- res/ft_lockup.wasm | Bin 336263 -> 336349 bytes src/draft.rs.bak | 33 + src/internal.rs.bak | 61 ++ src/lib.rs.2.bak | 240 +++++++ src/lib.rs.bak | 299 +++++++++ src/lockup.rs.bak | 9 + src/schedule.rs | 13 +- tests/main.rs.bak | 1503 +++++++++++++++++++++++++++++++++++++++++++ tests/terminate.rs | 19 +- 9 files changed, 2171 insertions(+), 6 deletions(-) create mode 100644 src/draft.rs.bak create mode 100644 src/internal.rs.bak create mode 100644 src/lib.rs.2.bak create mode 100644 src/lib.rs.bak create mode 100644 src/lockup.rs.bak create mode 100644 tests/main.rs.bak diff --git a/res/ft_lockup.wasm b/res/ft_lockup.wasm index 26f62d7548c0882fe50ef53ebea8cfd4281501e4..225a3226ea003b8e23ee6f626d649748e4e6affa 100755 GIT binary patch delta 23979 zcmc(Hd3+Vc^6%*-WQUW5B^x=1O;!oWq9B9;MG+KGc0@n~A?%9+$~6JPA_NE=paKL4 ziij8>nCPG)1PRI#A;@CXC_#hdB1llwu*v)OoHNNJ!2R9ddw)Fqob*(6b#--hRdsbw zj|&cj{%{~P z^X9oJOI)EX+J)X(fPrbuemMbH|6m)~mAYPR(TW|(q!#J^5b?1NYvj{c-&JJwwUn(& z50_PEHh-;Tjl$X;-ddpz{jOEeR)gZm95==6qYBr=Ls9USg3?`$JHO1XxdInAbbZp< z-lz0eU^}yC18thEkyv;Mkdv#&1mlqfF#pb6VLJ1+?rJ=;w(e^8qrt*ovpHC2HcQoH z*6#9v7rU0(^~nfdcHTAYIj8%t_nuF)AwsaLq<4fH!!ti}4S&vIC1ORcUe9_ORKQyp z{r7n9mBvI_x^yk;R|kDe>ND~lT+&>R_U&TDd#}`$$hFEvHriWc;R%_piTyf@j6K=( z!gN`~RoL6t(+9@Ei+9iun`BK_O#c^Pgs$ZNt9j~nS}tU5`gW#_s(vX~%}QGbQ^u3H zP<58|75z)&HC@XFMDx_uu8aZA;2%E@C<)0uk81n3?%72PrWLr(4RqZH-z4*cK^y#8 zwyXE3H(7@3`%z9j-yW64@?0OhJOh{}qZQ`q(c|#^iF(c~7+saILf5ZjoUFtZ7}uw6 zva%}s9mBj?Lmuh$aiFMGM`E^RLvD-E(p-sg19-v)*N<@yp1fhj*fnUncC3>pY;=7# zb|Oo2H5=zd2R+A)Ld8epP_f4K?YLn;wHxo`*&AI|&ZF+ z=qteJD~Sx^HWRwnEm>EAxR0B-mxVY118C^Vo$z$s;?0Wodyi9WO#!6Ug8GtKoR)1s zg|0^@)~kN6niAJ56GuT~1rwc6%s&&m*SHr|!sg7OlfDu#`DW7+0z*x|6KYPgj5$qr z?Vr7Xm1K6C^O+Y<+VApNIEELVcRjYKy=%upyTW8I9LDl9oo_l-eCo33u;HUmv&*i* zi=$YvYv$s9%6?8P?&5vvkg}3$uK2}afo*NPlTwon{+sL4lD5KBE+)0Y-{>W=2#l^_ zOU9|<*piK^`NXA3Q2ec>4H_((2Q@f(fbiEYCmN4hlv4z7f9*>*2*=kpxt?4W7gBNp z^>NK?Hti0ZTt_;pXeF+L%f_IO=E+aqvvyIkyEe=fxco6+qrK5;(DK1|(ffhhq2-_4 z6TfOjN=Q)>dbh8eo1lW8!%y?ouDLq7qG3$KT!-0Mh~cA_TmMggXoyvm^g>G zLm(=bxTdar%=O}`5Z95F4cQ^rA1mvlUD&E_EZ;R^RYxfItyN7}sq5IPxvjI0pf@d2 zD?Y7y-9OvtRWq@r6|f5xq{V2vUGrDhd)cJPx6)wLzFOiE#mi%V2*$qJDPv3~rV4Ow z%vq0X2Y@EWN>e7mAy*Kkhg_?m6A9`fR~~(dv8AN!Ww%`Y*YxDcYg}8`IN*PW*Zc{K z+P8K&PkP_=?7A*2J#+QC80MF{Uzt&T4Yrq;8p~2$_Vv|W?bp|Hjlb$!<9*bX4L>7M zQATQ)GDolfms*su@Cpfg3wS$*<+?h&{YaU~bFEgKw%IWGT-Tzv`|+e)*H3RhX|#Dy z8RD7E-}2Oxu3hiAYA$?F>92u3LCvj`Ic&;ZlFqsYZ&}8+xqjW!o+q7jHGFr8Z^_s0 z{x`e!zS|z+-*`7p`js40$RI88c;dGBuJ6YKYFGAf5uH~p3yD{4Wy5-&G%S2lv;wao1O8yS3O z*nu@gw%oEO$=T(7~~4^GL8u%y4BKspnd9q}n|y zlT_tH_o!IuZWVF#UaeA9WnI_sqt8I0nY)hm<1j*>V~g1(*UDq#@yw6E6mqvDIj)(< zC)}&A4_r5oH)oeJo8%>9E?s-Rev<8Td7bQrtgPqBiNZHwg_@d3ZFA`E)v!5yM& zAT#2}walKy+a){Yx_#*zb}IAq<*6Lj)~!Ti*IkQC7U8+Z)d$)2%*U?=N?6`=e}*x( zXVn|5jVt@_2VE!r+UDgC^D{Z+*H%-?S;hA(~i2Fvtj1$s*#_K4sqAJKS! zR?BQqLz?N}vpH_`^3}%}s)5#XGZ0cBtEdcaI9ag7ikxMCK-~0q4sVvhh-KoQ1 zr!=uHtKYCt(Kx*w0a}5rYoL$6mi&&IfQDL*(b&}FkF=*Qi>#jU1uE5g(au&43aqNh zSG5efT$eeU6}TA%NPq1+&m$I~e9t2mpEI6EEIy~GeLdEkmFi>bv8moroL<<3JyU!W8h zXzQFHox*{HRV&b6Z_8G~LUemOHiofNRMMVRr)BNgFm_7Eb0p@P0z0xU>^k-C$X){U zQAf6iUDv0^GMH8geX6lAfTuOqlJS(!D5xC^)uXzwIaSymJ*^vi2qvtb>dsCuwvV>|AP&xcIg{6JD$}~%O>p_ z3w4&Q21)s<)>OZ_0;T5DQ`gwT`t4q93S-4I=~;+fte<|C-4@u;ob1QOvQmoe&&KnF zJ^GIREReBd`kn!7ujIvh=vi)WDgDnL!TPK6yAiCBVfYTc-b?J3z;KII3w`MvV{c?FQcno&=M)Km#VRPHZc!nZ)8? zvvM+f4aoS(tSOM`lUZGsrRPm%e+EFUU%bJZuuJs&8*CCp7!l9v@YGebAf63nX>=i; z&ErX{XhH(3jpaNDf{1}_n*ybva05~VdQ%mG;0nU=)GsY zqR6I#IjkGB-C!=utx>W^sngdXG<%$Vk!R0%UH3_3p)AC7sol!8+;d8^*RV*v`#kmq z0*W5IfE9VOJ@ofdNWOm9;=6bV&7vU{YpNVK&>YjIPZA*4dj~(q|rF z-2zY^IKx(Ok#i!Os#e1W>(y^r2!h|DZ@~&0+xZ>B$v!&!9d=Hi>(1}lwGbHPxvQ+Y z-sB4Vko%erw3+^Wl@aPp{|uljzq8(M|BU;8b4?wtc_Ym4uVnW`tz1seROOGcYZMg3 zo6^3jJlFHA@26r?x2cZz}dR z!go|3^|Zt-)F^_#)WjoDr*eUwR|2`yjfGe_RlYF`s6AV#Fp@jz+X!A0LHlY1cS4gP zkzidw&qVT<|9e)6+Z3xuc+xhCh~kG3-51v8jUaE;+I*%5qQKg`s=lu_Z_dC!;ZG4s z$d~50pQGq~2d@)aaU*Th5}1}t=N!CcK*BkU(sKl*M?3jm9zTuocx3rL_BHNRm#ZN& z=+z;*1wzLToQBkL$j-L5!pB`Gq*oi>5QS)?6y6zmeS)JcS6Y^85+&TgfddugaAtO$ zrxa`k^G!aS#aDZyZbE|Iz8?Qu_^mvk)E|XxU4OJ8-!5t;?YEF?8K0}_x~L}Blq1US zr(N#S6|~+8TG5qxc+&jxw*M<)-M1M(%R9N{GFL3ANywxmH8F*Tr1d;lbL}#ffZ;Wa z;VABfnd8FJ&12xu)`%%8WtjqH#rC1m88QiH3RFRX5*s;Cn0S z4(aKA1hCX7;V*RL9(p?R?g89PEAzw*V4s&wM7H_cT?mvs=#RqAVl z|M5J9(Qu;Lh8vY|H$393G>^7-;!jjF&u)x`Iy;5ZUzA}Ksqt`@PHid?MW znIZO~sidH6nx*mQc*1%*p>YR|>&!z)c1CZ*YQC(AhQy0$<; z=r*r6N7h@akL<&rXBf%neffS~yi?6J%b>OWcptyLM#~sbQ)xdwazuer?&EgaujTv#Da_7+}19%&xBv%I@AuU`-I|uWc)MOxk#J|i&fbBI1wW(WZ z#XufgFE14`l%HfuB(mz*td4*b!Z=;bOLg-J7{nhbx3xU#If&PReM}jIiOQgpV2aG( z&p~`Oilo5?v|}*8hD7P@=K&Sc!RPt&b@Miq_lF?|sPm16+^3EjH8=Vzq{oKv$$kY} zK#27v>0R14geReWj~94!W6$#Hz{IV=;sNbEibv1#IvPs~R@di&Dc-hvh-h1{WSi>l zZ;vgQ=~u4eZ7wO~+LTtElEav!y(!FxwhiU}ywI>}C&dosuTtbt9!uAT@@8x^)fvXW zw%X}G!}tVcR&-VEk7Dw;7cG2|Kcz4wT}5^M-!Jkw?lE5)Ka$V%_G})=IfIAlY!vsy zE`tJI=F@{yjBQ1mGSmGniyloD9rUkX=7WUAVv~8f#Zu?7{0nH@cN`xD9n!>cJd3C9 zqWa@`uGLgCe&>;T%?W%4hXEx|;-h(zZfwb@>SSIQTVws9$$Sv=HC?b+Up<9SQZ6uj z8XP-(n&H@Z?(as`(oam|sc;pVFrByLvp=P`rt=v9BWCby1^zIDA5!JJGkISmnYU;1 zSol?k*Z42Idb#tJ52aXt_+NYqM|SmoJfDSqS;GWA65BL=>1;ki1%TfZ`4sO`&nBmE z9uKE^^LQWZwdnhK`~nCL%;)Q{gBiMj*R1X_h%{`=ltrvWscogj3n0WH{pbQdNnjiM z=wiMUThosyH;MOEW!)uw1QMbJOL#jKlnyLGSSdUG!ppfbz30x>yKQ>;!1yJ%jUc+^(d7vMH`auKdqj0ro_&VN@eMO7b@z(4+%3g;I^=Hao z2NQ#qI;A3!+VT-z9>K$m04zLHU%E!4^rs{{!*D+rDp4+Hu41wE8eCgQG@o)6h3;uCO)5)IS01n-8?c^}@2aj!wquJVKA&!fSDB*V$(r{Z*kvqkD|F=~%_Gn4N^u{{ez%+qgY-G7KWh8SHz7UlA^>tnvsI^>?8 z@I_W3e*T2x4Y3)&X6)ge6|naL57STYfnz(r$yQ6F^{fM@L^uYlqMb8pyr}U--jI6j zgSUP|AML{mbxubJ_(xc~^~>SI@28j9Iedq%&$AlHSpC&Q z{5J**A9)12D%C$cQc+jMR&&_*hKQvRU-2YsKi9wF3oKm_x(L@dA5)X>iGm3)avy4) z2OBR(NLri6#{hAqtEi!epWuslgeOXsAJT9ft1+B0!zcEg%-6RG;7GWO0U=aj<07{$uX&q(v9!=sJoC`3i$ZDkOP0}>*mhrpvE9(+uYA4qH6p&&M7yPL zyMmDHXTnL@H2Qbm(W(SE#ukf+i;d(+tEHBcLpWxisO+IB?vi9TvmIN49^#U|>I z-lD2_PMtK*t0vkr-_&#!8ho{MI&2pkaqcuGNW?OpdWg0Ki?cX>SQH{gVXeCwA}+Gs zdO@ftVh*!W(qS|<&tx=K+&;8aXWQDO|cuKyJ!Le(j-f3%ncmb0QEdcM9V zTI7q+^8BQsnQ7(F*1BRe&eDSFiMNqF(1#C*O%^eSHWWFq6TMzzv6S-_$0)0*ctn*~ znu-nVw!XBPz=2vhqA?M6@nG&zdtO-BW=@% zwHGrOUwDwddsN(r@Z^z5Y{1KYT_wYKE~yfy<Mmuzl$Xc9n^ zMY$bC26DlF#fsLL(ac!!Ix9;^a=yEq^$)0bkIKA)bVzX);oVzah;yHeP1>Oc%9iZt|D z(TgXg)2?SRhC@{IIne<&*7rH_fqG5j(_j3A^ySz7;tli^Hvsc+n$iY{%`|ABXy=Mr z?^7$q;Ac*Nd5W`jyK#7xypys9iho%qt=%9oxO={5nu?A2IX?%oV5eVdVC!pXUnmL9 zyHfdzzgAsK*rBi{ZL)&22eHF193;jeWqW$CC`+jez1%7FDU@0%%^WOZ;}dqO=H@QT z^yRH8Jd|~1?!9&!SaV3_$9GoR{pw^)Gta_IVb9+So60$(w$F=rw(zbEqUS*P-W$Xe zV}l5bd3cEE%F`Fp)ghuL{c}S2(8eLciFmPphVitmiF2RE{$)@m*I)w|J`mWuCDbXq1JLNRTb_yWm#`($y`I@Izs zBZs=X1n#4d-%8QO;=bKhiZhk_qF(Qa9{RFXqMz#Um(?&n_ASjx5hqaeStDAaSg;1` z!i|sCiksFI#@e4fRm`_^v@unDTRwC8?DgVhkD^0#Y!_H5m8)JZmW3Qzo-3xJ@cIf~U_jyY(^p~`p1T|qD@;_$F)_q^ z9(^30X3>|&MST>PkBgciSru-9d0~^3MeXxMG>yv>J)U2JtfwMl`c?7>qw1Cu z#K@;-PK&T=hYg&s8+R(1w)K*IS?TKDvL+JWTD@g+3OOTU%htECXOLxN(55qx@(!Io zBWC&jkGl{f%hOQ$Nrf=8GWQ38!}7iaIEUd@F{zZ-sXb z`TQKz71!LR&Zr<8j;XTrknaSs``y2#;_t=C`&H_T3xtc~$~rmDib3WjsE6Ixw3=d= z3s2F~vtlT2v(uHc;x;=&mkUK?)eEQ9qqIk*~`r#+>FikioeAyP7aZW_G zzGcvP^tJE|8rezR@xeK?IwSOnYr_LDgi7oVpA%{9D8>CG8nBzR{3r30hj}L3P0N24 z4?StT1;FdiHr#mPoz#EoP`^+e>YMLkaBnif-c}emb&(Xu`we-Kn*wi6+wdX^C=yY% zuDM?qhay2W5^KCIRg}e~6^R<*#=8YKcjIM39f8*m#tQ_RTqN2ByWc(F){wd-7Y~t& z>9Zm+7!f<{yuiIb{i*ZV-^FkJS&iQF{t@Rn4Ydjwz?CpC%gPw9$`~#FF3cj;4_?u_ zxqC9d9lrEjvDoV4-Z!i*(#5}pU|4Y1Toetc*+nGtyLCL@X2`_ok{F11arKgT*}N`S z%WV+>7-2Szy)5Do8P8l6by3{7ENY_&`%ToYS$GwF$Kkz#=0DBBx<}wW1D~c9(lft_ zRyY)$`@&RZQpHR2U~T^X4%`^NBPKhg_7)8&L7MRmEhxd( z;2SzvBI@F8kz&`88eYY{t&!$&29!lZ|yDI12$0RJ#cd)m;b9G^vo8nt9g6q%A4+F_iIX*f5%R?fM)-J z)Ym8+6m?D1uXMpcx-S^?yM~0HU7lr+<4Y15!>9vr~ec^cPPK>%JyeUJqhazvzIqwm43iPw?%uN~DqPm%YnJI< z!sSY3i1`unb*QILB#iW;ek4*xu;Hn1senDD zAg!5}INQo0?YiO{g$1K)ZP@}UpHW-(N9TFvP-wBDF^@9fg(qxUkv=|JUgWXaikTLs z6;xmvguC{a42-#wHU?&;fid$|h1smHt|NyAqSwEg%l`3&w^cvZCM8yk_Kt$I@QRD3 zBd~07HKWkI>6-mdbn(bURJzvSetW(O#)(5qa?=w$I zVyf+K;qLCDePzJ_S58tMEyI{vyNkx%D!xKS^xuro|9@tE_oQJhHASo_P+hA{+-LOE zpp_iJHzZO*D;dvI6N$B!^Zkm|Vxc*;q(psrYXnlnfM46lx-C3zr_xD>m*Mn2D7_cH z>kLqzIJrZFk4i;7;ele?;&x=JiWLY0fez{LX~UBPaHSr(sEQIml|>2ltfGV}%_tFo zC{YDbBA`6xxTA#XzD_{JC=n0=7gJwPAua0`;jF6KIszPYr!DSpB6Ng5j0-7<79Adz zkFlVODqW9j&TP&gEb3LXLR#^Nd<_m9*iPy#&8Ts!f_o;-QHrUjWvJ4OB@Q3AU;ouk z9$*bjzb>jk!W}iVYX-*cq~tt~OHIkWSuMR*2U&%Ox)*)ZR((`nnWwjmmEL|KId`lR zSp}RM-8NdP>a~bUF`+zhH)W}HAM?tNw}hO#n}yx4 znWfcTG>(Y7THQM&DY}aOeV-Wjz<Z5y58O;=Th~Wr2Z(y1WvGh&S7FvF(>MY# zkDHB|H5IKeS=6aJ@(eg)PIoy_Ic9VZ`M!d4d&s#8?)|iE3L~cYr)A&1D-8x_60I1x zF{U8dhP^tqd?WiaEu`GNEmo|pRg1M&AM078XAnIz==3x4DZY3aIeSWtst3!Vl`;;m zUNV9&GwN&7BfVr>Y=I{Cl8vigF-{S@;fy$0D5m#%$$r*DgdP-r|B4_Xkgiu9uXGKBl)8T3vq zXZ0ZIEF;dL#)D)kUzkbllVu0mI!M-_rOEPnefnTIj`6EIX!hGke{Vf6AHY!S4Uvu5 z5qf5bd>FTT77RgB%k$RKlEKKM3MqW3%;j_D(Pn^IzmQ=-1-FrYr}mU zHm#MqFpV$a>4gz83m1wg^d&jGqACv=A0C*h-1L%swd{imqvK2NPXh3jY)cw4QvOu2 zHfg(3qWXrmr9N+z+$ItBW5!~6ID}8BSIXu%-uz^&Y#dUst4yY+%6Qq9mu#mKzoDMz>C()o@DMRF5?vF-=Csuk&E-P8ks7uPyR`K>+P|PxX_#O)x-cw%7wI z;;Q%z%2FHXuO0S)fv64e*FJTF0e=447Eeue)Bs%P0sWmaKET&sn{TPcXIod#xjR+V z-uMK|1J(ps#a}z-0RsSf`D+I~pf5nA)t`DmKY&O+FD{>-EK-#|wd(T#CjqnY|_D1ai z^C|aLS(p7mB`Ca?97jVfjN+%t>ePI?^x<2MyKTMKbnHMrpoHmY8|Z0!P=R&9*giu> z&_0mkPKtW=_480%GeAFlb7^!oCr|A(>+s|}nmt{HQ_mUb;q5%S`l<}~t>Pj2jAqRM z*PE1v!h4xj;fQ zeThCdUcN0Ih2~d~-zvKO?!;F!u`9pTyCzC6j*VlF`Eo=nGvICh-a?HD7I7*UGLW9+ zzU-^C9R26{2)TGe6tPgg8f|hYvT`URzNTj^lL)EtmosAv4{{g8|m*S$&1W4 z?FXe4Gjy74bLh}gnO_!|lYXFW%j7bIQoNXwUvlr+Dks$ZjZ<#Dj!ResfdLYD@6h2=eU}^oh=$WCsH*8kQ?(%CyDZ$5*dU*V+~FH#Ov`ev5F@u@&km@-j-CsQ=IS&W zG(|LPqx_U#E28CZ$r!{ubx5wvefD{^e8nK_nV2`v)2=kxjz(;fEh%b~^kdto;U?Lh ze|%mYDa7~(l#w2xG*saDyFk^SH5$eQs!ycd%&(l^@9Nd32K7plVg5d4={gJ1{TXcwSNc4K6$i!iwvb%@5rx*n+;a}+u9(nSg~h7H=YwFIxLGv1t{sX1^K#1=i${U4hob=9yUf zcB?$?YofDs{XJQm2OR&EF`Jfyxci$Sd>*lm4nHd`BMvo%23N-s#4gGJDp zzINMlfFH##2){G*WQH6JyV#t8U<32Wkl(W%w0oC~W*aGA6+5VO7sB*LJ@Nz8u`_yU zru3H1!`FpuX^LERVUQtu0 zjA%Y}#ORSPy)tg(gHxv3vV-lmYG4|UUnHgNl@IuusQOg6S2k}E8e+FKM6HQdgY>n) zI25y0x5CtEpB(zgG&G9>dO6BRtkrl9w7~f8xT0b+%AFM8(;%XMALJyREAQtr%JRe!LR=0$|mtIaHnhmpl0iLb&^8nYk)KABA3k$po&uXThndq1{ za?1EI6KM12u*=Jo^SO*gArHv5t$WpUThrwlc3Uur8{wzi!-SQ<4*ZmzzA|mhIAx=0 zH0c1&ANNqw0r1PGbTA6a2O~QOm4C(JmrvIY$gx2$*RtDc0gOkfs+Z}La^QBj-j#b$ zdNX#FPJJP}vsiL`i9CE7_4-mif$sxSzLd}L>XCH$OIbT8CeqC#4DFT1V<_?vHZn2v z*dh6xZ!&7T7}&H!@YYL|b4WJv^NF$>GZ`I4*AK~-AZ~gXex67#9hSHSPg#Jty*6Dw zEb(zZH9dmf6X^LP2-UkN<%oPBsHnEx77D(lC=p9+1(bIL2jUG#9z{1#Qp2NiL5n>Y zwLdD=T(rc`gn!0!V+&k_XXTiCsPL$4!kSV*uEZz)daqmzgw3HDU*Uvx4&{9%A7~a? z$8HR>KFX?SGsj`K`Jv3lPfbmqiPMIUbBq`_e9U-9AF6i@vW^C+n!VS|CiMI<1Rb*_ zp-QP}4kZDNe$tOY7jvlS7)BC9KF8%lWwiB~&4?3osK;^HCEjGw0cfRr6CPLz9#jb) zSqYvBSb2llekNcw7!!W268r|>8i=uF1j~Rh1RzJAjCPvs2Np>;vS73RXTT~#neZwmGtCEOzUGb?Ibd` zrc`)Rz8iL_p?gwxpu|vYHz(U|Xl`3UX{Y4Qp!7y|+p_>q;isZ~It@FGKueA7hX3?M zsY0j&rLvqJdckSgzlv{ijNRq{oS{Ej0GmZ(G42Nh;Nli;|0<=;KgigD2`$}rx#&@M z-x~+G`yLHgjrUcQ%BWvMsoc`6H`^^ndlhSTq4YudG0G~6jvoC{KGEn9Ko0OhtbhC= z_sXDxukx3e88%x9>Xki~Qu>c_0h_P4IxAo1C{xeLliYXD!)~d*rWr-@UDio=oRkFL<;HvcDxd9b;=2Q{RudC`6|j~6T)vEO|++3O>k58ag9b_l5NYl z`2(%|%H-Asuo~nw%DyBY@-xxr7zJIDwW#`K8LXMe2Qa19w!;7$Z9QFP1AfB7`y0S& zt{}o?I71etx{JKa^5^kc6O~=zUl+Hjv~x@vK4Hv=u_Iq{44>w(*&YTSve_O%DNvg9 zPd(+vo8>A*kGjzb$&s)*}UFgdQk7gDL$6}hawX^_fSm0}0u z*XuF2k=BGUD_`tIvP3osN(8z(z%?kFpuDMfD#7{_pQ%EYS+rvA`vj=&zbEJ^8zAKCsnN^= zTkAgqt+igk*7}W=+AA3K!DSs>G6kT`rLuXMT<=$Ew;iyGh^AbnmHNE_*jm5cWb2W8 zCtz!RR3-ijb|TFx>)`uJ3=|B4vijso3|0WPcF-5J%BD?$Q}C=(V-s#!iGM3YK%}@P zf%0mrW;tMM2Z@ygm|sZ%6&I}?K3=KACyWlu`&$Hh{I6jvB9!Zx0;xKctC{d@Jgc?P zgx{*v!RAUGd|avi(@OOpVF2;g5$~=vq8|ZU>kBK@?|?AMK}>;E{I$}*SgFIKmH2(d z;H6d-AFjke!A?sDcPcSpl{$FEY)_kSVh5Z{3Af}36h*hN$E&;ye@2~d%PyVm&)RMM z(MKYFYBe~r{KAf0n@?TauhDaH~j~h`eB;&j~vm$REe^}&iI+IGLo(q zxE@CIfP%?>N5=Lx$;MO~*eSr)sV}Mo{|vabh3%haJ*C}|?SsuR{R9$^%$M)T2kV&l z5s<=-ckALsz;0cv>fp7(HwH%$F=)DDRgu>dz6pTTR$&LVVqWT?Y7+B`cbdl)w^5^l zstNytXBAY>kez$23$EVZy?~jkr>#GI#=Tkw^#NY3zb5{%)xztE_>YkV`T}caOc|Bn zG{Dwua3x^nF(&;Iz}|pog1g$0%mu8<=_pmK7=u!&bvQ~a6}A^pslU#WfzV8z#G zEOn^i)vD6R-({XNN{Sxey@tUxTGOaA|3BbyF&HB#)hgjgR0V@kN>kk1|;$uCp z>Gg7uiGC4=p>nCF`hZ$q)mXfVe+aIoOvHrS0j_U>V*wlNJmM;?s!^Ksn=5snRtf$G zu$mQ<-Us}U({NiWDh`7Yw4z?&UTue)hkAjiR--fF<7lpwZNhng)nu9M>Uii)cmsy1 zRxvBAA`5y8_qu|7EI-1lKbxh;M0$;7L8iNwV5_K1?53U`<%Mq@XHlnUujWX&CPjO- zRe4vm*RmGZrn)CA6NGBnFky2UG2tz!gOs)`8jY7Z+OSvb#gJq8|?1{Nrp|(GTfc{pNVFed!K+h!;z8wW`uDAn)?wcw01= z4z4Aouc_ka#n!vFhBft0NCn=0$+fvfu*_NB(&FXOFdJEWvfZei!y$dglhd zjBRoCYS9x_5f>>mOvpaQUtg&0Df})2Vr?KNx%FskO5EnH`F(u69?I_8-+`Hh(R5t-{(J z-dceT^BT~Sor>bbJU7La6N;jdhaz)}f)ZQ}JG{d3TovD{@A{~N{l)wrfbGC~SF~xi z2I7W-oLp54j4BIY{vEi&bl|Ps&8V{0?q+w@7{Xt(IamiaN42Ea?D&`$%S-R{T(~d$ z%r&f!)BV?b{l{5gA&3Hd$Y6TS3xh&x{LuVEb)SUu1S46cqeA6`GQLq z>X`{^;@Nws`iMZu}p(P}^M-f47TTBhsD0N3B(8>R0XxY3^_yLyfJCr?~Y&4$XV z{yx|;pZeSut|hzfkJ-=CT>D;mjU~Doz3K#I_gBZG{*kJuUwX9?V_B{r#yVN9t77bn zwTqOt*&i5c&+79Cr;h_g^;!}`N@K`)*MivoykLXtn^*@g+OTrmT6BG9oRb%9bbT^z z5{q{=8SlgdJ;skg!-4T=SmQcBei%?~CpdZXCRe3cr|ZoL)9PGWU1qLsPO0X4u2ul% z3NYp>Tx}3XPwZMJcU>9c7v01?EyM-uK>V01XJYr-*(r+nqQ_d6tO2A|hb$9Wtd?v* zS*|B1)v5BRmR#42Nn;?gOOu?C%wLnbR(%vz!PfMllTQlRLX+w76+=ve6l#C>8~dB! zIy`qV%T4bx?-MUxnC0?WGL~mucRjPToomk$yTW8G8OAcwo&R(ychzy}al?4Kvy-kt zZ`EMguGw$(RcdtRt&ZL~*-B$7yW-vot=QVepH_0R!LU$w%N!MSHZ z8r#HX(;l!XwWOnhmh1X##aPVIEb+NVwk}O{w}!eZzWt1^(ckDb@a;hl(feVv?6*I9 zB!1P(HNi&`)b6dDAFsTj!%y?o@?1~5BB4#gT*vXZVN%0LV+OP^`;En*gEPbSM#Vb3 z9Rlt;*EKEa8Melik<^y$bp4W47rjDPbzvE#HauyBmi?ug z^YC0_PR+#Tm%-l11C17?t#K_{UFQ{(Cc{dDHT!DU4E{aZ2OsUL?Jt9=0Gu0h*<aPlyI=q6-cSUd1WLbL4CxPOUJObHERyCLRY`FJ$TU?*Uq&LnBVcWze1l5z4JCN ze%IA|T}QS)ef7F1=2x7hl&G!-&C6XM0}}g&Dl8R$+xVs}P)!lqrSw-f{6mFhgkB+` zUIAO9K=RbqHYFO)wd%22ilO1DuBBW1^1{zu-)?=*=(9`d-MN(Wy!Z>(-fgaGH&oEl z>e=JfRyvu(rmUmz8`q%iE7(%k58K=E!Y^F)cP#VG{lY!}0@uME?N~zkpF3iuU+yV| z4AicjN}rhevmdr_xPA(YiOP7HqgeLQL;>E4KT#YuIrtA^wzu4{dEGaA98qm{?{Y)9 zMrXHnWgM>z-cnI}VAOs=tJjdByQsjkc~o@1L_ zUT3=?L+f#NlJGT?yanmU&aL)C+mI`f$l>0+vLDose>;~KrMM1!djUoI%B!6@cILwM zr#Q=^v;-MaTgx)c+o|38+G5@g?hu_SGQ(5krT4h8TeAJG`-NYz{pnx+IE_Qmx)f>b zyz8x^rKnfE-8A655%s<8+n~sF`z~*hKJRv}fD-okHI%XStKMYMuB_jiy3YKT;fB() ze*cgu3BB>hOnCS7pZ|OdX7$0FEZv)B>MeX&8^P~>Kok5~b+(8W`LhYmyB{cRt7PA4 z7>f+>@`s=2O>8^4COg5`FQSkDwo~;w7{KbXMf$Y>wu1A_0~8-Bs_08Av-&}7E~Pu! zQkG2ZYq7Brj4*(B3FP=NH;KJru%a56kq z1e*h%DuT^^YFCFfWBK~HI&7LZ#HANBV$U*`qStG}h6t8Ie$81e+7ZP@uv8uOZv-!V zpKi9q!VBNm-)O}?W9$fNt(hY%-$(?deX$Z>MO%k>=@brRu3D!4Mr)P?&Cu;_*;vN* zQ&Brsg;umWSX1U^peZbirNo{rgkHMCn&|g?vZ;(^)8yXZ zK3o5?H@h#`9y;5Xjbr%~(~nKy1t05s`mu_P?a?#)vx5?3Zw$uL!}b_z=T|B>oCyrM z<xxGDld#=4GevE=ygW1VuAHKUu7Y@@Eg7LtL%<| z=o*h_{aCKPU_7h9P`)*R)#dCM?VZG`JC_)ThJezkWrz3*jtY*-T9VP?Lsz-BzfSv6M4 zj2uRSmq>Hwu>s!e7b%Klx-^e5jXE{}K4Nu|g5Sl&KzSMJiJg@sKU?D8nw5c`Q z)UF%*OLNz<2)*koJZqrl}pV# zL0?ZShOsodv<6-!i}+eL)YoJ*RgYcE4#E)i1{>Hde_pha!gjGbkYda(Hrmf5E8ec} z*~OBBYMD~vm`b~3gx7@66$_q&>wHGef3T|hqD&?QFIq=muQ5j3dx#A#nKYBCWnuX# z`jRZRTj^c&r>uiF%h6|_U|j-GetM3r7?9Tc7vM`a(d7#`Gi}kG z7ulU)Kht)uUDP9QvBTWgL@c21Z!;=2&}%=lm)!;$`+v(eb=c;uP``7D?)|!xNH0|4 z&#*iS4CIaJP$iz@sp}b)d4FUeIvOr{SIbeyc@_4Bwnpt%G*SkE;~nA@g9Cz+teI&v^(3VK{y}P$ivXnr3}5S7;0|`(^Bb*gSQAMD8Sl0cTjqylON>0`!E)Vtlr1IR*9{a zaNrW8Iu>PXEz};cXkOo8>wru>-qD&X=?VAd;MxZ_CyK=G$SKDa*LEvgr)47}u!k!Up6Ml|?_yo3-X2$Sl zh|}9+ka`rnL&szIi+-gcj2?TMztK2VU0T+HXIH7P4MxV(6h^}(Ycw|+VVJ1m`ZSGB zJBMqB{w{gXwB-8)`Swb$e$%4AJ@n zed=?(vj~4U@j}k(U^wh$P+nI)3kh7eZt!*)^kFyt8H%{>ydIF-yYuGNRv5!JvnQww z18Xkar>3b*!}f_*dhHkZ9%G`jJ-83Ade@+>=dfvaas72?v7!V!w|jA9#rgW87x~K! zOT79LKg_e=SH{E=>EpiGgpKzW07aP})SLvRuB=2O9eOxp*00%Nl4G|}| zq$OV+AEMm|)skbhaNO(xYXInuYBpWz$6rK37u}zCMKP~Ge>TLt05`VBegBsd!(g*MuBsISb0GPJkP26N4Z&RvRX*78t zuLYHG4aB}A(jD|fK2UWKU(J&@s*6+yz|({H9gK72Wi)2dcP~R$Y1DDB0gWEar}$-V zSK1S$6(aTx<_RF0FoZ`o@Wf09q`o#Ddlb!|MAZ{BUqw7Y$b1=?Z2Djbf1+CMyBNj( zyJt7eyegICP~L{l4dpR3XDA;Cer{`+I*o=63 z&Pf@;aX0jV{_6-H$DuwmM)Q?81o({MNSgLglUMkxYIlu&jxN!rQwH47txZL*@WH~O zM2WmqiD=|FeiU3a9M8wl%JFgY8mDn(18^vV2HUU}9-;`hF-Zy*-P!;8#AP&t~!00JeXP zX8~M2n`bNRiP`)m*sbGr^vTzUz0SYmRZ1dq_(+)6yUTc6X3{pTl;sR^ zuHdtHK?c3E0-`ARka{Na2hiZ2Z}VHou%2GYt5xx+SQ#Gn)A*I(0cXyYe3`Fl)!BLn z7sp-65{h5NGjM!rvl@w3@U2`JeLI_Sj@W5i6Wi@vJ!B34r=>-fv{2ewo`iv)eTTQf zNj&ZyUIQ}Q@D5+c)>4~wys`H-<3X7Z#jN91Y2G^CknN`3>v*fskBkOih^T(7eUZ|9 zxIVb!PwCz|KBl_oIt0x{cn)Wtq!t~()3*rfw4U3k;W}OkJFU!RtU7+S0 zcw;=IqoEskQ!H)y1|zl{+`vDAgl2E#u_dZme2Ahx<4q}i6CYJ#KgEaie{SN788$3% zGfz<_a$pPJi{jO-yax;?V=EtE^{E9VJ{9Aw(0RDtVLPwRt+R~U$;mPS75&05Qo%01 z4UtY==h5t#-efmFS7w|cDadadrSV=CYb-PU$~69xWg`7{ znz0hXN+#&v?c;bZnnpGEV>xM*yC2I*(;XlD{c?0HC$bC&Fy)$b?nA!Py1XkF`IEHg zBmRQjG~;5mwe}nHsNhX(`nFBHIYoZMM^evcMGYE~%>C%=kNJ)g7qu>vcTm8UfAdiN zZYHdo>D1&VujX4pJFL=C&5OF<G&l+;UVOluX#7?8o&6O$14d!;V0->mvQ!VYyB0s!dIdED~N2z z^gplgh%y`MxXvg2-G*+v&Ied0@%fJ9JpnWHZTPpLS32~nt4F0m;UPNTAKnR;FO? zYUTffsRwat_$NPXoyoNK%2ewf?_im(jM2Y-udLCZzvp&e!|yBiW!QT)s_}ro<2L## zbn*et<7ouT5BVTMJZp7kMHa2qXK^u9TKOrcAWmQh-}4ruP}qG$dlWr<#90)zeZ@k* z?++_ut*4F*`+UVxoZP6rpLkK7;FA2rL0sM*(_gG4aNthScUBhdm~TR=>fx&;P@!FH z!d*{7pon3-_!ylG5|?o=w>wyjL3{}b5jWWy{XvMh#vEp+LiJSCyaUlpY;iV;YGP|i zPLZO&UrofSoFXn%RHqi9qMN%uA9f|e#46r0;Mw$k4KbFT*F$TH5OovVG*V2)ESn;+nhgDNq{tT`rCCUQGlNQ@&ufcUai!I= zj@XLifbt&`n=PErt1pfy)#=<&Ea&{^lk`<%(MFX)O~gj_wZ6BBxXmo-O@2vkmZIy; zM3}l%`XWlWR5_-F2*>kkeO@cEQm`z&N*gf&X_-F1op_D$8%OB=lj2YFRN}zQy zhe~cxFRBoWQ%O*Ju^ZN!)m~Ju=DEAYi!XnAXyQSWM7P?DG~{~8F`^YV`CN>6gOwy4 zDKtXx7AB*vGx<&QgwzEGc_&QPDQKMXCg++!>C;kc4pNQb+KP>ADV7cqtZagttmUWBuS z6#Kk*9oXy7W5hpB>V3M3PlaU{*I0J3Q4i5i(5l{|Cog`F{@ojVW>EJ&;wkFZM+E4r z`-mOtIZ69|;#=e>&i>*}CH?-8{s(lfzes`Se|vzaLaz@HZT-wEfHk{~E2g47baR0C zhh={z4-|vCW_WfayUdQ{8`!#9{86<}rjRpstKF-j6{xaw_Y7=PO`WF1cr#s2_JSsD za;M9gs_scu3s6_-a-PEF)BA%&OkBa9ER1KKhfLF6qr64Q+~z51r-3zfr1a9wO1s(c zOy)h7$^B=K!mj6>(S(;p9KW%PCJx~>8(PkCo(tJWpXKiEq60&aWX03O!J-pSSVE4T zxKTLNQ~J=CgM|}2_xoVclwV$~8X~CU5Yewx-Du)C@deEoDvp-~FvkQj4S;@P7|h=^ z%~EH?%?pEF)PAy6U&2dTl;ViMbBzUHrFtRT~_Vp=6 z&lWooXjBHKBLiE+*e+V|hS=-9%Xm+~pO&9M3LQ5`R6qkH5JH6~xUar-j(E}<;!5)y zjE=-CMsFD>o@bAqbM)N*H**r^+^Sbt0`DGaDtFE?tHPS5nn~aPQ#@7@g~2nD)|&Lh zQqdH8_R3PRqEv(Q2TR3Qo-DPh{$qkjRZlzLSuQT3n7Kkcj^f=F;waMoDT(5q^;}$< zz@*SzmpF*X`*f0swz!74Byr9vB;00&>9bdfEh;`m5Y&c!NEvIy85B#`iWVq7Su0-S z7e1#-ABlGQ)OW-ot2S6?{Np__f_APKb*$?|-dB@$q>3k~@dh!^IyH_p5wv)>*i17v zie1nNip?V0`;eg;J`}fCT;L0H6en$I)jn~TE^HMY@w}&I zN|{9tP7%W`c4N^MI-4R^Sea1kC#=7l{>3)IJW{W&7j72`DzlxvQ|v|2XqV`L;*DKm zA*9aU6<7a*3>H0V`5##)RV&xA^5@ljrK?uA2*cAvfhs%h6|GeH`d*bk=>zwPIF$un zNEbK$W@TUP7pp8vG~)x6E$!3`4j_7f_k|h8N?LzttYq z!#!B-PsFRd=(xV@6DUVX(w2MNs^+Hh7aXVO4q->~DB+NJ9|<2G>C~rDSz-w4#&ex3 zS>n;pb@Zx-#a=&=d^(FJZ;&Do#CQ~cofKhoB}WWEz1>OiFE{FS6tho> zl_o*G(_*k$-*_66Cei)VqHYgQgu(+;geKhKsfzLX@-lT@XTIU(g>zO?8H}RYSq7tM zc2f6T5$P}S_$}LLyiB8WMW4{SWhhm%8*`bao)PnD=^4>2IHL@W8ZCpqKOIHMe?Y7U6iiWFd{Me*vk772+B$Y>sbi=E7CD(~@-#nT&Kh-r9odg}|g zh!m=Q7HLVrLVEkGs1NCXbXL^yF5as;tf%W|#bDL;OrF>fn!i{fF>)Y+I?^_$dZ*YS zwDa_5p6JC^QMWHe!|091^H23U5m?Gtt^{XgNqSh?Wsv#0$@V8wK~MQo$qb^*3=%WE z&`UO>F6Tr{NtoSy4oOcUeRU3txJ>?Ei8<^WTJn{#q|C37j%QMne9?>-@70Ioi$J^; zPLt1zS}0uS#V{0i&WjGgTdqK6vCVAi1`IqyR!Mr73xe3+y?;wJFNx8A*Qg)9BwQRX zu2bL3Vqlm@ot|)TmG3mhT5p`iba=q%x^g_2zP>Cv1r&KOXxu`>E{mo#xIlc?=)jjC z)B^2$)NZP$j%qvIvg6t@qtUaSIn@1%s3GotnYH>gsKvw{GK@A{5q7+1wC9S5Xm!aT z_6Yih0?O=%k7qy1jrrh;NM`R*^0%TMyGW5LeYyIrX!_7J-qiIfa*#E2?5cP?E>qq5 zYYamgHU6~vUp)@UayPgi=HR8vczbJM;GjY3!9aa}#M8BwSG2nhvk*NhLcyeZ02`s~ zFq&6KmYwH*5FLW5N5FP903J*<#UmrG#dTAUj37@ITMJ!`2NrHFjK>wV#Ivd$k0@xz zHPJT6Xm{d8CDkPktY_0N*Tf(Miyqen-Zj+Yuj6PNx8$mlocWS!1-vO$1_QVp28K}{ z<5eD`#XW?%`K{Xc8lKTTS?(TR`sWR?)5ln^_UBc-&G!O9D4tH=6!mE2O`MI^=&0Xk z$T?3I!uuuBV?T;l%s2C@yEQNXD@>-%KZ;nm>wup`Z4^;IiJI;r#Hj=Z5=Le#6{WZ(G~B>GdrLH} z7k}3(JE86M(h|#|BDG9fdkcr%``5{FTePpFUYf-XY(>1_s}+1ljv~>KpZ<>a-WDNM zPJf5-I#;y$D>wb%ftccy+B{lbgd9nyPm07-DDD+udD#?sTXf|~g+_k}CGEDTQZ=dY z;qIUQNGpm&6aHNh`TdLx66JG0iT^fbE%(}kbiekH za0fY>5kwcciyCzHS5c=NvCU2F|C{K>i~rCE{Dy;Sjg&vJ294W~DW?;rwv%a&DKHm^ zIhEf2T|{8SJ*vp3&r$S9yr(*Zn;je~UY4r8DWd;m8f9qo=({4G1(z`__jvm8KSc9K zwot`;A{rO}&)gGp__cZZzwRL{1mBsb;*J@x)hpr)$nU<0;0G2`vlLlPefYr-FQf;v za9|sLA6Hu2^j3d~-x*6?)kMBht#Fa*U-D4~yssJ~^Mm&!a?UK>$t7~7EJ7Jc*M;oi zd&!86+);rNzrwB4OHu|Sw2qb16NkbAHRi;N_4u|za|hRp9~%3C%xTPArMRP(%LW1!ymmIK@^)yUx^ z15t0`Bk{s5&GC_gLahN1?}-%{>%iM)i>b&*h6TIdd6V|b^Pv*hU8W`LHGJhfj`u5* z{pD|rCF)dBzRN_;lEc*hJgZ3~DueF@G_$f?<<{0W-GzhRv&#nM^w6WUH=y6RRrd>& zNUbkWK#+`~H9h1|grN6=uzn*1)uG>lWD%~g{v9me=16j9SCySn9Ih&>qR6i*^Bid_ zR0PUW0f6CFN$sNNMOcR~Ua*MQbE?TTtfgVKPWXIhB^9EuxA^d(lJt@`=H;)&FF-%E zGG`_AUh9MTYRq_A6Dn&y^NY%85Z}}*f4m*bP^BjfCHkO;w;Hpwm(k>q9c;a8RSqv1 z>CaHvivPBpnup17Z};#?)F({V;eRaGXNSoorCgOFS=hq)_6 zmOvrdipIR6fxyn-jYEBFq`b*vlIN;HL$yp*mar9wclmP+j2Sf>0&~Zh*tATAS)k|C zl0z$E*2Yn?UtHFGHIKDRt`(y#RFD={Hb6QmmIPAMqdc0f$^S$bhwMb9g7y9PZ%^XWiK8OMv~Q|nf8kzcl9ym;Aa zzJ9C~JRy<*XKPuzxyR~MF6r=sd4}W5H?I!fOLjN|)E8537vQ7PQ`7usw8nFA44ctf z)+liU6_JH1H=s(>4FtdqRDc@@DDMW;JhcK!-9YFQZa2{L3F%apKkW(m3=2GQ4vUR# z#%#_&c%}--rLx<|*I|tv+e*EK=>jg5v9&_O0_$jrM%**A5FfXZHf|?BW#Oig9w|e@ z9aXhF-R~*+JP&clT~o(=R34Y6zZxUG{en{-ST~>oI_;- zE`xnoxAIlH7GBPlOOtDpm+F6`7Flr?SMhMS(7)?u>GcqeBmALWk9H-BuB=`DjcWF%*?P=q_J+>5j3vW`3*2a$`&ml9i%qPAx-OV2Ns!+M^Zw zr;4gtT?C+^FTmX;l7A0qGTi$4mR^r+%`wZ^246gcD&htiKHAzG)sfg`x*aX9;x*4I3!e^BenU zN}_y9Z#PJO!@SSzQGI>f-yJ_b7%9+uG;pwNz}}?=gXI%=ujrG($Sn~xn+`?lgjb4( z${g|S!o#kp-c_m9Fgb%4Eu_?8a*U^RP|M+RCZ1uvHypyOY(5hc>J^-Vwe;->IkL9r zl#Y{C$%*_~b$6?c2s&}hxxavw8Dfe@HlK=cDIlQbS zcN$+OcqIANC^@s_y9;CT9QS7f`tZ?6eaki#x|{G}Z43S5G4fpr=RIbe>@RliK1{u? z5IZ3ZDQFfDRVJ}XV%YBk^+!MLdPE{v9O{U`H@%}V~mAA-uy6hHr?_0Dx z@rJll1_b(RH$7k=K)b(|?*W4VLax~s;!5~X%FClVN^#55$D^IHq!R`*b(ZPG01>+lFj!S>dlHtC%IWVRNV-Z zzBTH8J|2pq(=_fiOf#RBzlLcx`fyQet`dhd${Cd9z_K@P^aw{q#8>gA%Ev(anw z84GiRXQS7C0~4Wog;4x#If)mYeAGW3a8h+l((z9RtW%!^U791i@{odaz?P)QAvl2) zouhVfay0zF<~UgmA6|VJC$~yR)(O?!sa?xg9n9!#V(;YZa~4Q1j>Fo#MRH`zWP=)~ zi;EU&b@Yu@$&GuY>h_OXLz! z@-2?XJ(_GBA-Kl|bZe>f(!WcP*O_m;`g#*=dmLrSWXe%ir>ZMtR*5q%yhH^n)d zDkW`{wM&i2csbf?M0f*R8PQi8WsOP+MpqT>@F7+b@lCQj*y_1SMpY^u6`!r7((+BR zYNgWW0l*!heVgRRuz`umvYq!8V`p$SkMJSyZ^XG6@z56 zfPhLRsHHSyvusDs&9Vi3zFGS5cdt{-R`i0Ud3qhVZv1l@^jESB_4g}5AEFnw$adoN z^~0{7FIF{L>EkUJ;rw-)lq{nvs_&ZJ^L}Tcf%7uaMaEQZdGU3%^-=WRR_W)xSj8v= zP_>SVa9$?yitj93sIQ*gL$9HxDOmkhqnDR^_3xy}jL0Gb6QL#i8{?IjP_lwlXs0RL zWMjXy8*cF04cf6yejR6ax})$VolL5-*#Ats;QL37kY^pYt_{ZooAz3)!`8JT?r5}R zUk`V8Zs-9!jOAPvU=pHAhG;Lu+EwOe|I2CBO7F(MkG`yJSrs z@cs{s*|hlhESrA{RZEpO14Aa-Z7gZ83#*c0~b(-y3klj`pBRi?yA=#|C47S_q12oaKQ1`XKs;!C@rbUP3&^Dvctp?C@ zQMR!*qh8ShH$dImy#dwCk|RTl(JdTJ)k5sH_EvIwCrdW-HJNEdUu4OyfoY)XV4-S8 zO%KZ+aRF8AwoVpwThy&{Yvtg9fYqet=z~xXu)s?04huXS^_muV1nQBcaGY&)If9XZ zt+E>jxLRok+f3A>@ar;h=J2UwhfkbtX`6w%wQoW>_;tWmX5LV0(#kTx9MqLgnydQ< z>UAveo2cUh`I7c|s9Wjd0oS#(C(_M-$!6>%g?%bxPz?N3whoP|=GK;zRqeJQ5UcG~ z3V)K`{ZxiO6^~|rfG`gm6xOD6Z|2z1vy|Sg_q3@+s9jQRBZrS4KVtaEannGMLHvkp z9hdTz7Q0P(!zF!fRN(Q%2l^2zT6 zQuv}8)bRvjY;Br%0$dHFeJ5l)_BQ==LOvFFq^8{#f)VmjDtTp6z0c+2tO5=E9MjaN zH$Rt)o0~#g2!a;)nebKA8(QFNs5e$HMd!#yEPzJj$c}7;zC8yEVI%0&NnDqXpn9h; zak0~GEYqu&-Bt;GM$nK`xVvphucI~YIbhY!4m4XGcAFpI_wZ93jGr`e+>FVNiIb)~ z#!Q+qanuM;JE2X9$%NlQ-HBhfzoGvTZEE(>uT363a{A~|j_ISPP8d6p9H(U{IBk0x zLa@`2)AI2^bI7{PX84>DwB@wy7-yoN0$OdG2@fa-4=e|dE(cEotd!F1KO3;pX%l|E z9Q-EWs_@Vy1S^0r7@(QCGO~m(0{UsoINQpNv%>>B#!Q_w!7*y;@G;XJrD|n2TvI|F zcWLr+0)31<^GH1(u(A}h{VD@%%DPO%cOWoeYIp|PH9{Y92I(T3P8-icPwLQ#vq%gB zC^}E>2+gVQ-umSzu|V6!DRvvW+osZQdGh_hga&q7Z-9CDh2fV#2fmae9kUwR4MS~( zQaNcGN~Ma8Q7WlW+Bq4f_c1vfCWMCF(0L!65Kd{$F3i-Dfv<8)!cL`L&E0 zFsy~!i^M+Z<|D4Zn~&!JtHt+4sVrt7O63d8cC+6&^jDtkZInJJ*P^VT=xF6PvU7u- z06D;>O>MSsQCA^Bd2(fpQLou-xxgt4$R~bTE@or&rI+O^9Ochfj) zxq~_Mnb+l~JkSAVRIKcZpDG>n{0+IHK|at_qSSVYUjOGutvOIINj)2u7^Qh{NP~JRx9))JMK88)SQV#=cPBrp$?(8#Xa=?6Hk~ND(ac-W`Z=`ymRwQSR6S*(N`xvK ziF(G97C~*51xC@pBH1W#6woS(nvJp%%8UByB80cV8_(K}D3FO#S>!qT>9!o&YkDWU zvDg2?u&SF0pN7#WowLHVEO1dd`r9T<8-JF~;(R*0Q@(lVqC%zm&%_NxU8RF2JQ{Vi zWD|}p*FL>m`|NVhP(vn~j__mAd^Rmtlu4{33e|wi^{uq(e~fvr*S5_ zpNaM){t9*~G7tO{1~s}_U~Bs)ptZIu*xJ6STz>_lJ*Z@YLX!dd^DcJTocFzQ{dNOZ zUeRp7TW;Pz0bAR5o5Oneejl*4y+*n573_pREScb9xd9Xmf|B;cas#XcY@OgG&?;>= z8D4|B%GgY}MY-`?8Vtsj5-8KQN|pn*POzXH1B=QrpnRis!e`4(*x8t{biSpa$3InD z7NLy5EZ6>Vx%LBCK%8~O8Rb^=4Pa|~LAmxlU`82; z$&m8MR{9a;Cj7kIcqbXG)GFfRas#k(6U;FC)1UWn%1)(o#d0Kyw)b(W zEFX$D(CYiLV}~L{=6;xC0e&hXn()|i@C3k5S=y(f-oSt<{4Y5M@BGjE3rB%n^u=Ft zWOGv_N((#SXTnNJI$7X4SkYq&rZEp>OfQpcY`KNy0k&@awQ}%Pz^yF9{%W?e24Hw~su>AbmHkjEXVC?vlB9vCmpl_sCwYGAA`=01ajG^?|oW6Yd z7kV3+DN4xLR@`52=H<0I0RLXV(Lk@op)JR_+uNd4>~uh>*u6+&g1lbA_iU$vyx!sr zX+jmR_iKe9ZBbG01FTT#Q2aReVwR&+LbyAY8ddeG*WpI2-PRwl@|f!2W5TNeE8&{( zhH~xO0jqIu#FDG3SNjer;HE3!36PAEf!R-aW|bhAu&dm->j0~y8{-65^BU7UZmiwb z1Mpk$9V!X8!cGfJW;?xG&8yMyfbnkaJci+vwwkc=DlIMW8Nf?3|x_j)DJM2~21@Y8v6ykG-rfitrl80!{PGo#Ixpi#o6Ag|9nbrqz*N z&5&Rnjr3}*@~lX&70vUexi>5w!>KS~!e-bo;q7Pxm$oE2=, +} + +impl DraftGroup { + pub fn new() -> Self { + Self { + total_amount: 0, + funded: false, + draft_indices: HashSet::new(), + } + } + + pub fn assert_can_add_draft(&self) { + assert!(!self.funded, "cannot add draft, group already funded"); + } +} diff --git a/src/internal.rs.bak b/src/internal.rs.bak new file mode 100644 index 0000000..b677825 --- /dev/null +++ b/src/internal.rs.bak @@ -0,0 +1,61 @@ +use crate::*; + +impl Contract { + pub(crate) fn assert_deposit_whitelist(&self, account_id: &AccountId) { + assert!( + self.deposit_whitelist.contains(account_id), + "Not in deposit whitelist" + ); + } + + pub(crate) fn internal_add_lockup(&mut self, lockup: &Lockup) -> LockupIndex { + let index = self.lockups.len() as LockupIndex; + self.lockups.push(lockup); + let mut indices = self + .account_lockups + .get(lockup.account_id.as_ref()) + .unwrap_or_default(); + indices.insert(index); + self.internal_save_account_lockups(lockup.account_id.as_ref(), indices); + index + } + + pub(crate) fn internal_save_account_lockups( + &mut self, + account_id: &AccountId, + indices: HashSet, + ) { + if indices.is_empty() { + self.account_lockups.remove(account_id); + } else { + self.account_lockups.insert(account_id, &indices); + } + } + + pub(crate) fn internal_get_account_lockups( + &self, + account_id: &AccountId, + ) -> Vec<(LockupIndex, Lockup)> { + let lockup_ids = self.account_lockups.get(account_id).unwrap_or_default(); + self.internal_get_account_lockups_by_id(&account_id, &lockup_ids).into_iter().collect() + } + + pub(crate) fn internal_get_account_lockups_by_id( + &self, + account_id: &AccountId, + lockup_ids: &HashSet, + ) -> HashMap { + let account_lockup_ids = self.account_lockups.get(account_id).unwrap_or_default(); + + lockup_ids.iter().map(|&x| x).map(|lockup_index| { + assert!( + account_lockup_ids.contains(&lockup_index), + "lockup not found for account: {}", + lockup_index, + ); + let lockup = self.lockups.get(lockup_index as _).unwrap(); + (lockup_index.clone(), lockup) + }) + .collect() + } +} diff --git a/src/lib.rs.2.bak b/src/lib.rs.2.bak new file mode 100644 index 0000000..876d3fb --- /dev/null +++ b/src/lib.rs.2.bak @@ -0,0 +1,240 @@ +use std::convert::TryInto; + +use near_contract_standards::fungible_token::core_impl::ext_fungible_token; +use near_contract_standards::fungible_token::receiver::FungibleTokenReceiver; +use near_sdk::borsh::maybestd::collections::HashSet; +use near_sdk::borsh::{self, BorshDeserialize, BorshSerialize}; +use near_sdk::collections::{LookupMap, UnorderedSet, Vector}; +use near_sdk::json_types::{Base58CryptoHash, ValidAccountId, WrappedBalance, U128}; +use near_sdk::serde::{Deserialize, Serialize}; +use near_sdk::{ + assert_one_yocto, env, ext_contract, is_promise_success, log, near_bindgen, serde_json, + AccountId, Balance, BorshStorageKey, CryptoHash, Gas, PanicOnDefault, PromiseOrValue, + Timestamp, +}; + +pub mod callbacks; +pub mod draft; +pub mod ft_token_receiver; +pub mod internal; +pub mod lockup; +pub mod schedule; +pub mod termination; +pub mod util; +pub mod view; + +use crate::draft::*; +use crate::lockup::*; +use crate::schedule::*; +use crate::termination::*; +use crate::util::*; + +near_sdk::setup_alloc!(); + +pub type TimestampSec = u32; +pub type TokenAccountId = AccountId; + +const GAS_FOR_FT_TRANSFER: Gas = 15_000_000_000_000; +const GAS_FOR_AFTER_FT_TRANSFER: Gas = 20_000_000_000_000; + +const ONE_YOCTO: Balance = 1; +const NO_DEPOSIT: Balance = 0; + +uint::construct_uint! { + pub struct U256(4); +} + +#[ext_contract(ext_self)] +pub trait SelfCallbacks { + fn after_ft_transfer( + &mut self, + account_id: AccountId, + lockup_claims: Vec, + ) -> WrappedBalance; + + fn after_lockup_termination( + &mut self, + account_id: AccountId, + amount: WrappedBalance, + ) -> WrappedBalance; +} + +#[near_bindgen] +#[derive(BorshDeserialize, BorshSerialize, PanicOnDefault)] +pub struct Contract { + pub token_account_id: TokenAccountId, + + pub lockups: Vector, + + pub account_lockups: LookupMap>, + + /// Account IDs that can create new lockups. + pub deposit_whitelist: UnorderedSet, + + pub drafts: Vector, + pub draft_groups: Vector, +} + +#[derive(BorshStorageKey, BorshSerialize)] +pub(crate) enum StorageKey { + Lockups, + AccountLockups, + DepositWhitelist, + Drafts, + DraftGroups, +} + +#[near_bindgen] +impl Contract { + #[init] + pub fn new(token_account_id: ValidAccountId, deposit_whitelist: Vec) -> Self { + let mut deposit_whitelist_set = UnorderedSet::new(StorageKey::DepositWhitelist); + deposit_whitelist_set.extend(deposit_whitelist.into_iter().map(|a| a.into())); + Self { + lockups: Vector::new(StorageKey::Lockups), + account_lockups: LookupMap::new(StorageKey::AccountLockups), + token_account_id: token_account_id.into(), + deposit_whitelist: deposit_whitelist_set, + drafts: Vector::new(StorageKey::Drafts), + draft_groups: Vector::new(StorageKey::DraftGroups), + } + } + + pub fn claim(&mut self) -> PromiseOrValue { + let account_id = env::predecessor_account_id(); + let lockups = self.internal_get_account_lockups(&account_id); + + if lockups.is_empty() { + return PromiseOrValue::Value(0.into()); + } + + let mut lockup_claims = vec![]; + let mut total_unclaimed_balance = 0; + for (lockup_index, mut lockup) in lockups { + let lockup_claim = lockup.claim(lockup_index); + if lockup_claim.unclaimed_balance.0 > 0 { + log!( + "Claiming {} form lockup #{}", + lockup_claim.unclaimed_balance.0, + lockup_index + ); + total_unclaimed_balance += lockup_claim.unclaimed_balance.0; + self.lockups.replace(lockup_index as _, &lockup); + lockup_claims.push(lockup_claim); + } + } + log!("Total claim {}", total_unclaimed_balance); + + if total_unclaimed_balance > 0 { + ext_fungible_token::ft_transfer( + account_id.clone(), + total_unclaimed_balance.into(), + Some(format!( + "Claiming unlocked {} balance from {}", + total_unclaimed_balance, + env::current_account_id() + )), + &self.token_account_id, + ONE_YOCTO, + GAS_FOR_FT_TRANSFER, + ) + .then(ext_self::after_ft_transfer( + account_id, + lockup_claims, + &env::current_account_id(), + NO_DEPOSIT, + GAS_FOR_AFTER_FT_TRANSFER, + )) + .into() + } else { + PromiseOrValue::Value(0.into()) + } + } + + pub fn terminate( + &mut self, + lockup_index: LockupIndex, + hashed_schedule: Option, + ) -> PromiseOrValue { + let account_id = env::predecessor_account_id(); + let mut lockup = self + .lockups + .get(lockup_index as _) + .expect("Lockup not found"); + let unvested_balance = lockup.terminate(&account_id, hashed_schedule); + self.lockups.replace(lockup_index as _, &lockup); + + // no need to store empty lockup + if lockup.schedule.total_balance() == 0 { + let lockup_account_id: AccountId = lockup.account_id.into(); + let mut indices = self + .account_lockups + .get(&lockup_account_id) + .unwrap_or_default(); + indices.remove(&lockup_index); + self.internal_save_account_lockups(&lockup_account_id, indices); + } + + if unvested_balance > 0 { + ext_fungible_token::ft_transfer( + account_id.clone(), + unvested_balance.into(), + Some(format!("Terminated lockup #{}", lockup_index)), + &self.token_account_id, + ONE_YOCTO, + GAS_FOR_FT_TRANSFER, + ) + .then(ext_self::after_lockup_termination( + account_id, + unvested_balance.into(), + &env::current_account_id(), + NO_DEPOSIT, + GAS_FOR_AFTER_FT_TRANSFER, + )) + .into() + } else { + PromiseOrValue::Value(0.into()) + } + } + + #[payable] + pub fn add_to_deposit_whitelist(&mut self, account_id: ValidAccountId) { + assert_one_yocto(); + self.assert_deposit_whitelist(&env::predecessor_account_id()); + self.deposit_whitelist.insert(account_id.as_ref()); + } + + #[payable] + pub fn remove_from_deposit_whitelist(&mut self, account_id: ValidAccountId) { + assert_one_yocto(); + self.assert_deposit_whitelist(&env::predecessor_account_id()); + self.deposit_whitelist.remove(account_id.as_ref()); + } + + pub fn new_draft_group(&mut self) -> DraftGroupIndex { + self.draft_groups.push(&DraftGroup::new()); + (self.draft_groups.len() - 1).try_into().unwrap() + } + + pub fn new_draft(&mut self, draft: Draft) -> DraftIndex { + // draft is valid + let amount = draft.lockup.schedule.total_balance(); + draft.lockup.assert_new_valid(amount); + let index: DraftIndex = self.drafts.len().try_into().unwrap(); + self.drafts.push(&draft); + + // draft group exists + // TODO: add check that group is not yet funded + let draft_group_id: u64 = draft.draft_group_id.into(); + let mut draft_group = self + .draft_groups + .get(draft_group_id) + .expect("draft group not found"); + draft_group.assert_can_add_draft(); + draft_group.total_amount += amount; + draft_group.draft_indices.insert(index); + self.draft_groups.replace(draft_group_id, &draft_group); + + index + } +} diff --git a/src/lib.rs.bak b/src/lib.rs.bak new file mode 100644 index 0000000..992eba8 --- /dev/null +++ b/src/lib.rs.bak @@ -0,0 +1,299 @@ +use std::convert::TryInto; + +use near_contract_standards::fungible_token::core_impl::ext_fungible_token; +use near_contract_standards::fungible_token::receiver::FungibleTokenReceiver; +use near_sdk::borsh::maybestd::collections::HashSet; +use near_sdk::borsh::{self, BorshDeserialize, BorshSerialize}; +use near_sdk::collections::{LookupMap, UnorderedMap, UnorderedSet, Vector}; +use near_sdk::json_types::{Base58CryptoHash, ValidAccountId, WrappedBalance, U128}; +use near_sdk::serde::{Deserialize, Serialize}; +use near_sdk::{ + assert_one_yocto, env, ext_contract, is_promise_success, log, near_bindgen, serde_json, + AccountId, Balance, BorshStorageKey, CryptoHash, Gas, PanicOnDefault, PromiseOrValue, + Timestamp, +}; + +pub mod callbacks; +pub mod draft; +pub mod ft_token_receiver; +pub mod internal; +pub mod lockup; +pub mod schedule; +pub mod termination; +pub mod util; +pub mod view; + +use crate::draft::*; +use crate::lockup::*; +use crate::schedule::*; +use crate::termination::*; +use crate::util::*; + +near_sdk::setup_alloc!(); + +pub type TimestampSec = u32; +pub type TokenAccountId = AccountId; + +const GAS_FOR_FT_TRANSFER: Gas = 15_000_000_000_000; +const GAS_FOR_AFTER_FT_TRANSFER: Gas = 20_000_000_000_000; + +const ONE_YOCTO: Balance = 1; +const NO_DEPOSIT: Balance = 0; + +uint::construct_uint! { + pub struct U256(4); +} + +#[ext_contract(ext_self)] +pub trait SelfCallbacks { + fn after_ft_transfer( + &mut self, + account_id: AccountId, + lockup_claims: Vec, + ) -> WrappedBalance; + + fn after_lockup_termination( + &mut self, + account_id: AccountId, + amount: WrappedBalance, + ) -> WrappedBalance; +} + +#[near_bindgen] +#[derive(BorshDeserialize, BorshSerialize, PanicOnDefault)] +pub struct Contract { + pub token_account_id: TokenAccountId, + + pub lockups: Vector, + + pub account_lockups: LookupMap>, + + /// Account IDs that can create new lockups. + pub deposit_whitelist: UnorderedSet, + + pub next_draft_id: DraftIndex, + pub drafts: LookupMap, + pub next_draft_group_id: DraftGroupIndex, + pub draft_groups: UnorderedMap, +} + +#[derive(BorshStorageKey, BorshSerialize)] +pub(crate) enum StorageKey { + Lockups, + AccountLockups, + DepositWhitelist, + Drafts, + DraftGroups, +} + +#[near_bindgen] +impl Contract { + #[init] + pub fn new(token_account_id: ValidAccountId, deposit_whitelist: Vec) -> Self { + let mut deposit_whitelist_set = UnorderedSet::new(StorageKey::DepositWhitelist); + deposit_whitelist_set.extend(deposit_whitelist.into_iter().map(|a| a.into())); + Self { + lockups: Vector::new(StorageKey::Lockups), + account_lockups: LookupMap::new(StorageKey::AccountLockups), + token_account_id: token_account_id.into(), + deposit_whitelist: deposit_whitelist_set, + next_draft_id: 0, + drafts: LookupMap::new(StorageKey::Drafts), + next_draft_group_id: 0, + draft_groups: UnorderedMap::new(StorageKey::DraftGroups), + } + } + + pub fn claim(&mut self) -> PromiseOrValue { + let account_id = env::predecessor_account_id(); + let lockups = self.internal_get_account_lockups(&account_id); + + if lockups.is_empty() { + return PromiseOrValue::Value(0.into()); + } + + let mut lockup_claims = vec![]; + let mut total_unclaimed_balance = 0; + for (lockup_index, mut lockup) in lockups { + let lockup_claim = lockup.claim(lockup_index); + if lockup_claim.unclaimed_balance.0 > 0 { + log!( + "Claiming {} form lockup #{}", + lockup_claim.unclaimed_balance.0, + lockup_index + ); + total_unclaimed_balance += lockup_claim.unclaimed_balance.0; + self.lockups.replace(lockup_index as _, &lockup); + lockup_claims.push(lockup_claim); + } + } + log!("Total claim {}", total_unclaimed_balance); + + if total_unclaimed_balance > 0 { + ext_fungible_token::ft_transfer( + account_id.clone(), + total_unclaimed_balance.into(), + Some(format!( + "Claiming unlocked {} balance from {}", + total_unclaimed_balance, + env::current_account_id() + )), + &self.token_account_id, + ONE_YOCTO, + GAS_FOR_FT_TRANSFER, + ) + .then(ext_self::after_ft_transfer( + account_id, + lockup_claims, + &env::current_account_id(), + NO_DEPOSIT, + GAS_FOR_AFTER_FT_TRANSFER, + )) + .into() + } else { + PromiseOrValue::Value(0.into()) + } + } + + pub fn terminate( + &mut self, + lockup_index: LockupIndex, + hashed_schedule: Option, + ) -> PromiseOrValue { + self.assert_deposit_whitelist(&env::predecessor_account_id()); + let mut lockup = self + .lockups + .get(lockup_index as _) + .expect("Lockup not found"); + let (unvested_balance, beneficiary_id) = lockup.terminate(hashed_schedule); + self.lockups.replace(lockup_index as _, &lockup); + + // no need to store empty lockup + if lockup.schedule.total_balance() == 0 { + let lockup_account_id: AccountId = lockup.account_id.into(); + let mut indices = self + .account_lockups + .get(&lockup_account_id) + .unwrap_or_default(); + indices.remove(&lockup_index); + self.internal_save_account_lockups(&lockup_account_id, indices); + } + + if unvested_balance > 0 { + ext_fungible_token::ft_transfer( + beneficiary_id.clone().into(), + unvested_balance.into(), + Some(format!("Terminated lockup #{}", lockup_index)), + &self.token_account_id, + ONE_YOCTO, + GAS_FOR_FT_TRANSFER, + ) + .then(ext_self::after_lockup_termination( + beneficiary_id.clone().into(), + unvested_balance.into(), + &env::current_account_id(), + NO_DEPOSIT, + GAS_FOR_AFTER_FT_TRANSFER, + )) + .into() + } else { + PromiseOrValue::Value(0.into()) + } + } + + #[payable] + pub fn add_to_deposit_whitelist(&mut self, account_id: ValidAccountId) { + assert_one_yocto(); + self.assert_deposit_whitelist(&env::predecessor_account_id()); + self.deposit_whitelist.insert(account_id.as_ref()); + } + + #[payable] + pub fn remove_from_deposit_whitelist(&mut self, account_id: ValidAccountId) { + assert_one_yocto(); + self.assert_deposit_whitelist(&env::predecessor_account_id()); + self.deposit_whitelist.remove(account_id.as_ref()); + } + + pub fn create_draft_group(&mut self) -> DraftGroupIndex { + self.assert_deposit_whitelist(&env::predecessor_account_id()); + + let index = self.next_draft_group_id; + self.next_draft_group_id += 1; + assert!(self.draft_groups.insert(&index, &DraftGroup::new()).is_none(), "Invariant"); + + index + } + + pub fn create_draft(&mut self, draft: Draft) -> DraftIndex { + self.assert_deposit_whitelist(&env::predecessor_account_id()); + draft.assert_new_valid(&env::predecessor_account_id().try_into().unwrap()); + let mut draft_group = self + .draft_groups + .get(draft.draft_group_id as _) + .expect("draft group not found"); + draft_group.assert_can_add_draft(); + + let index = self.next_draft_id; + self.next_draft_id += 1; + assert!(self.drafts.insert(&index, &draft).is_none(), "Invariant"); + + draft_group.total_amount += draft.total_balance(); + draft_group.draft_indices.insert(index); + self.draft_groups + .replace(draft.draft_group_id as _, &draft_group); + + index + } + + pub fn create_drafts(&mut self, drafts: Vec) -> Vec { + drafts + .into_iter() + .map(|draft| self.create_draft(draft)) + .collect() + } + + pub fn convert_draft(&mut self, draft_id: DraftIndex) -> LockupIndex { + let draft = self.drafts.remove(&draft_id).expect("draft not found"); + let mut draft_group = self + .draft_groups + .get(draft.draft_group_id as _) + .expect("draft group not found"); + draft_group.assert_can_convert(); + + // remove draft from indices and total amount + assert!(draft_group.draft_indices.remove(&draft_id), "Invariant"); + let amount = draft.total_balance(); + assert!(draft_group.total_amount >= amount, "Invariant"); + draft_group.total_amount -= amount; + + if draft_group.draft_indices.is_empty() { + self.draft_groups + .remove(draft.draft_group_id as _); + } else { + self.draft_groups + .replace(draft.draft_group_id as _, &draft_group); + } + + let lockup = draft + .lockup_create + .into_lockup(&draft_group.beneficiary_id.unwrap()); + + let index = self.internal_add_lockup(&lockup); + log!( + "Created new lockup for {} with index {} from draft {}", + lockup.account_id.as_ref(), + index, + draft_id, + ); + + index + } + + pub fn convert_drafts(&mut self, draft_ids: Vec) -> Vec { + draft_ids + .into_iter() + .map(|draft_id| self.convert_draft(draft_id)) + .collect() + } +} diff --git a/src/lockup.rs.bak b/src/lockup.rs.bak new file mode 100644 index 0000000..557a131 --- /dev/null +++ b/src/lockup.rs.bak @@ -0,0 +1,9 @@ +#[derive(BorshDeserialize, BorshSerialize, Deserialize, Serialize)] +#[serde(crate = "near_sdk::serde")] +#[cfg_attr(not(target_arch = "wasm32"), derive(Debug, PartialEq, Clone))] +pub struct LockupCreate { + pub account_id: ValidAccountId, + pub schedule: Schedule, + pub vesting_schedule: Option, +} + diff --git a/src/schedule.rs b/src/schedule.rs index 8a176b8..542e076 100644 --- a/src/schedule.rs +++ b/src/schedule.rs @@ -16,19 +16,23 @@ pub struct Checkpoint { pub struct Schedule(pub Vec); impl Schedule { - pub fn new_unlocked(total_balance: Balance) -> Self { + pub fn new_unlocked_from(total_balance: Balance, start_timestamp: TimestampSec) -> Self { Self(vec![ Checkpoint { - timestamp: 0, + timestamp: start_timestamp, balance: 0, }, Checkpoint { - timestamp: 1, + timestamp: start_timestamp + 1, balance: total_balance, }, ]) } + pub fn new_unlocked(total_balance: Balance) -> Self { + Self::new_unlocked_from(total_balance, 0) + } + pub fn assert_valid(&self, total_balance: Balance) { assert!(self.0.len() >= 2, "At least two checkpoints is required"); assert_eq!( @@ -111,7 +115,8 @@ impl Schedule { /// Assumes new_total_balance is not greater than the current total balance. pub fn terminate(&mut self, new_total_balance: Balance) { if new_total_balance == 0 { - self.0 = Self::new_unlocked(0).0; + // preserve start timestamp for transparency + self.0 = Self::new_unlocked_from(0, self.0[0].timestamp).0; return; } assert!( diff --git a/tests/main.rs.bak b/tests/main.rs.bak new file mode 100644 index 0000000..96bef86 --- /dev/null +++ b/tests/main.rs.bak @@ -0,0 +1,1503 @@ +mod setup; + +use crate::setup::*; +use ft_lockup::lockup::Lockup; +use ft_lockup::schedule::{Checkpoint, Schedule}; +use ft_lockup::termination::{HashOrSchedule, TerminationConfig}; +use near_sdk::json_types::WrappedBalance; + +const ONE_DAY_SEC: TimestampSec = 24 * 60 * 60; +const ONE_YEAR_SEC: TimestampSec = 365 * ONE_DAY_SEC; + +const GENESIS_TIMESTAMP_SEC: TimestampSec = 1_600_000_000; + +#[test] +fn test_init_env() { + let e = Env::init(None); + let _users = Users::init(&e); +} + +#[test] +fn test_lockup_claim_logic() { + let e = Env::init(None); + let users = Users::init(&e); + let amount = d(10000, TOKEN_DECIMALS); + e.set_time_sec(GENESIS_TIMESTAMP_SEC); + let lockups = e.get_account_lockups(&users.alice); + assert!(lockups.is_empty()); + let lockup = Lockup { + account_id: users.alice.valid_account_id(), + schedule: Schedule(vec![ + Checkpoint { + timestamp: GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC - 1, + balance: 0, + }, + Checkpoint { + timestamp: GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC, + balance: amount, + }, + ]), + claimed_balance: 0, + termination_config: None, + }; + let balance: WrappedBalance = e.add_lockup(&e.owner, amount, &lockup).unwrap_json(); + assert_eq!(balance.0, amount); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups.len(), 1); + assert_eq!(lockups[0].1.total_balance, amount); + assert_eq!(lockups[0].1.claimed_balance, 0); + assert_eq!(lockups[0].1.unclaimed_balance, 0); + + // Claim attempt before unlock. + let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); + assert_eq!(res.0, 0); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups[0].1.claimed_balance, 0); + + // Set time to the first checkpoint. + e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC - 1); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups[0].1.claimed_balance, 0); + assert_eq!(lockups[0].1.unclaimed_balance, 0); + + // Set time to the second checkpoint. + e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups[0].1.claimed_balance, 0); + assert_eq!(lockups[0].1.unclaimed_balance, amount); + + // Attempt to claim. No storage deposit for Alice. + let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); + assert_eq!(res.0, 0); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups[0].1.claimed_balance, 0); + assert_eq!(lockups[0].1.unclaimed_balance, amount); + + ft_storage_deposit(&users.alice, TOKEN_ID, &users.alice.account_id); + + let balance = e.ft_balance_of(&users.alice); + assert_eq!(balance, 0); + + // Claim tokens. + let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); + assert_eq!(res.0, amount); + // User's lockups should be empty, since fully claimed. + let lockups = e.get_account_lockups(&users.alice); + assert!(lockups.is_empty()); + + // Manually checking the lockup by index + let lockup = e.get_lockup(0); + assert_eq!(lockup.claimed_balance, amount); + assert_eq!(lockup.unclaimed_balance, 0); + + let balance = e.ft_balance_of(&users.alice); + assert_eq!(balance, amount); +} + +#[test] +fn test_lockup_linear() { + let e = Env::init(None); + let users = Users::init(&e); + let amount = d(60000, TOKEN_DECIMALS); + e.set_time_sec(GENESIS_TIMESTAMP_SEC); + let lockups = e.get_account_lockups(&users.alice); + assert!(lockups.is_empty()); + let lockup = Lockup { + account_id: users.alice.valid_account_id(), + schedule: Schedule(vec![ + Checkpoint { + timestamp: GENESIS_TIMESTAMP_SEC, + balance: 0, + }, + Checkpoint { + timestamp: GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC, + balance: amount, + }, + ]), + claimed_balance: 0, + termination_config: None, + }; + let balance: WrappedBalance = e.add_lockup(&e.owner, amount, &lockup).unwrap_json(); + assert_eq!(balance.0, amount); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups.len(), 1); + assert_eq!(lockups[0].1.total_balance, amount); + assert_eq!(lockups[0].1.claimed_balance, 0); + assert_eq!(lockups[0].1.unclaimed_balance, 0); + + // 1/3 unlock + e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC / 3); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups[0].1.total_balance, amount); + assert_eq!(lockups[0].1.claimed_balance, 0); + assert_eq!(lockups[0].1.unclaimed_balance, amount / 3); + + // Claim tokens + ft_storage_deposit(&users.alice, TOKEN_ID, &users.alice.account_id); + let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); + assert_eq!(res.0, amount / 3); + let balance = e.ft_balance_of(&users.alice); + assert_eq!(balance, amount / 3); + + // Check lockup after claim + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups[0].1.total_balance, amount); + assert_eq!(lockups[0].1.claimed_balance, amount / 3); + assert_eq!(lockups[0].1.unclaimed_balance, 0); + + // 1/2 unlock + e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC / 2); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups[0].1.total_balance, amount); + assert_eq!(lockups[0].1.claimed_balance, amount / 3); + assert_eq!(lockups[0].1.unclaimed_balance, amount / 6); + + // Remove storage from token to verify claim refund. + // Note, this burns `amount / 3` tokens. + storage_force_unregister(&users.alice, TOKEN_ID); + let balance = e.ft_balance_of(&users.alice); + assert_eq!(balance, 0); + + // Trying to claim, should fail and refund the amount back to the lockup + let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); + assert_eq!(res.0, 0); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups[0].1.total_balance, amount); + assert_eq!(lockups[0].1.claimed_balance, amount / 3); + assert_eq!(lockups[0].1.unclaimed_balance, amount / 6); + + // Claim again but with storage deposit + ft_storage_deposit(&users.alice, TOKEN_ID, &users.alice.account_id); + let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); + assert_eq!(res.0, amount / 6); + let balance = e.ft_balance_of(&users.alice); + assert_eq!(balance, amount / 6); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups[0].1.total_balance, amount); + assert_eq!(lockups[0].1.claimed_balance, amount / 2); + assert_eq!(lockups[0].1.unclaimed_balance, 0); + + // 2/3 unlock + e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 2 / 3); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups[0].1.claimed_balance, amount / 2); + assert_eq!(lockups[0].1.unclaimed_balance, amount / 6); + + // Claim tokens + let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); + assert_eq!(res.0, amount / 6); + let balance = e.ft_balance_of(&users.alice); + assert_eq!(balance, amount / 3); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups[0].1.claimed_balance, amount * 2 / 3); + assert_eq!(lockups[0].1.unclaimed_balance, 0); + + // Claim again with no unclaimed_balance + let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); + assert_eq!(res.0, 0); + let balance = e.ft_balance_of(&users.alice); + assert_eq!(balance, amount / 3); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups[0].1.claimed_balance, amount * 2 / 3); + assert_eq!(lockups[0].1.unclaimed_balance, 0); + + // full unlock + e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups[0].1.claimed_balance, amount * 2 / 3); + assert_eq!(lockups[0].1.unclaimed_balance, amount / 3); + + // Final claim + let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); + assert_eq!(res.0, amount / 3); + let balance = e.ft_balance_of(&users.alice); + assert_eq!(balance, amount * 2 / 3); + + // User's lockups should be empty, since fully claimed. + let lockups = e.get_account_lockups(&users.alice); + assert!(lockups.is_empty()); + + // Manually checking the lockup by index + let lockup = e.get_lockup(0); + assert_eq!(lockup.claimed_balance, amount); + assert_eq!(lockup.unclaimed_balance, 0); +} + +#[test] +fn test_lockup_cliff_amazon() { + let e = Env::init(None); + let users = Users::init(&e); + let amount = d(60000, TOKEN_DECIMALS); + e.set_time_sec(GENESIS_TIMESTAMP_SEC); + let lockups = e.get_account_lockups(&users.alice); + assert!(lockups.is_empty()); + let lockup = Lockup { + account_id: users.alice.valid_account_id(), + schedule: Schedule(vec![ + Checkpoint { + timestamp: GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC - 1, + balance: 0, + }, + Checkpoint { + timestamp: GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC, + balance: amount / 10, + }, + Checkpoint { + timestamp: GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 2, + balance: 3 * amount / 10, + }, + Checkpoint { + timestamp: GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 3, + balance: 6 * amount / 10, + }, + Checkpoint { + timestamp: GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 4, + balance: amount, + }, + ]), + claimed_balance: 0, + termination_config: None, + }; + let balance: WrappedBalance = e.add_lockup(&e.owner, amount, &lockup).unwrap_json(); + assert_eq!(balance.0, amount); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups.len(), 1); + assert_eq!(lockups[0].1.total_balance, amount); + assert_eq!(lockups[0].1.claimed_balance, 0); + assert_eq!(lockups[0].1.unclaimed_balance, 0); + + // 1/12 time. pre-cliff unlock + e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC / 3); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups[0].1.total_balance, amount); + assert_eq!(lockups[0].1.claimed_balance, 0); + assert_eq!(lockups[0].1.unclaimed_balance, 0); + + // 1/4 time. cliff unlock + e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups[0].1.total_balance, amount); + assert_eq!(lockups[0].1.claimed_balance, 0); + assert_eq!(lockups[0].1.unclaimed_balance, amount / 10); + + // 3/8 time. cliff unlock + 1/2 of 2nd year. + e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC + ONE_YEAR_SEC / 2); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups[0].1.unclaimed_balance, 2 * amount / 10); + + // 1/2 time. + e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 2); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups[0].1.unclaimed_balance, 3 * amount / 10); + + // 1/2 + 1/12 time. + e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 2 + ONE_YEAR_SEC / 3); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups[0].1.unclaimed_balance, 4 * amount / 10); + + // 1/2 + 2/12 time. + e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 2 + ONE_YEAR_SEC * 2 / 3); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups[0].1.unclaimed_balance, 5 * amount / 10); + + // 3/4 time. + e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 3); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups[0].1.unclaimed_balance, 6 * amount / 10); + + // 7/8 time. + e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 3 + ONE_YEAR_SEC / 2); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups[0].1.unclaimed_balance, 8 * amount / 10); + + // full unlock. + e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 4); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups[0].1.unclaimed_balance, amount); + + // after unlock. + e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 5); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups[0].1.unclaimed_balance, amount); + + // attempt to claim without storage. + let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); + assert_eq!(res.0, 0); + let balance = e.ft_balance_of(&users.alice); + assert_eq!(balance, 0); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups[0].1.unclaimed_balance, amount); + + // Claim tokens + ft_storage_deposit(&users.alice, TOKEN_ID, &users.alice.account_id); + let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); + assert_eq!(res.0, amount); + let balance = e.ft_balance_of(&users.alice); + assert_eq!(balance, amount); + + // Check lockup after claim + let lockups = e.get_account_lockups(&users.alice); + assert!(lockups.is_empty()); + let lockup = e.get_lockup(0); + assert_eq!(lockup.claimed_balance, amount); + assert_eq!(lockup.unclaimed_balance, 0); +} + +#[test] +fn test_lockup_terminate_no_vesting_schedule() { + let e = Env::init(None); + let users = Users::init(&e); + let amount = d(60000, TOKEN_DECIMALS); + e.set_time_sec(GENESIS_TIMESTAMP_SEC); + let lockups = e.get_account_lockups(&users.alice); + assert!(lockups.is_empty()); + let lockup = Lockup { + account_id: users.alice.valid_account_id(), + schedule: Schedule(vec![ + Checkpoint { + timestamp: GENESIS_TIMESTAMP_SEC, + balance: 0, + }, + Checkpoint { + timestamp: GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC, + balance: amount, + }, + ]), + claimed_balance: 0, + termination_config: Some(TerminationConfig { + terminator_id: users.eve.valid_account_id(), + vesting_schedule: None, + }), + }; + + let balance: WrappedBalance = e.add_lockup(&e.owner, amount, &lockup).unwrap_json(); + assert_eq!(balance.0, amount); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups.len(), 1); + assert_eq!(lockups[0].1.total_balance, amount); + assert_eq!(lockups[0].1.claimed_balance, 0); + assert_eq!(lockups[0].1.unclaimed_balance, 0); + + // 1/3 unlock + e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC / 3); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups[0].1.total_balance, amount); + assert_eq!(lockups[0].1.claimed_balance, 0); + assert_eq!(lockups[0].1.unclaimed_balance, amount / 3); + + // Claim tokens + ft_storage_deposit(&users.alice, TOKEN_ID, &users.alice.account_id); + let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); + assert_eq!(res.0, amount / 3); + let balance = e.ft_balance_of(&users.alice); + assert_eq!(balance, amount / 3); + + // Check lockup after claim + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups[0].1.total_balance, amount); + assert_eq!(lockups[0].1.claimed_balance, amount / 3); + assert_eq!(lockups[0].1.unclaimed_balance, 0); + + // 1/2 unlock + e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC / 2); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups[0].1.total_balance, amount); + assert_eq!(lockups[0].1.claimed_balance, amount / 3); + assert_eq!(lockups[0].1.unclaimed_balance, amount / 6); + + let lockup_index = lockups[0].0; + + // TERMINATE + ft_storage_deposit(&users.eve, TOKEN_ID, &users.eve.account_id); + let res: WrappedBalance = e.terminate(&users.eve, lockup_index).unwrap_json(); + assert_eq!(res.0, amount / 2); + + let terminator_balance = e.ft_balance_of(&users.eve); + assert_eq!(terminator_balance, amount / 2); + + // full unlock 2 / 3 period after termination before initial timestamp + e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 2 / 3); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups[0].1.claimed_balance, amount / 3); + assert_eq!(lockups[0].1.unclaimed_balance, amount / 6); + + // Final claim + let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); + assert_eq!(res.0, amount / 6); + let balance = e.ft_balance_of(&users.alice); + assert_eq!(balance, amount / 2); + + // User's lockups should be empty, since fully claimed. + let lockups = e.get_account_lockups(&users.alice); + assert!(lockups.is_empty()); + + // Manually checking the lockup by index + let lockup = e.get_lockup(0); + assert_eq!(lockup.claimed_balance, amount / 2); + assert_eq!(lockup.unclaimed_balance, 0); +} + +#[test] +fn test_lockup_terminate_no_termination_config() { + let e = Env::init(None); + let users = Users::init(&e); + let amount = d(60000, TOKEN_DECIMALS); + e.set_time_sec(GENESIS_TIMESTAMP_SEC); + let lockups = e.get_account_lockups(&users.alice); + assert!(lockups.is_empty()); + let lockup = Lockup { + account_id: users.alice.valid_account_id(), + schedule: Schedule(vec![ + Checkpoint { + timestamp: GENESIS_TIMESTAMP_SEC, + balance: 0, + }, + Checkpoint { + timestamp: GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC, + balance: amount, + }, + ]), + claimed_balance: 0, + termination_config: None, + }; + + let balance: WrappedBalance = e.add_lockup(&e.owner, amount, &lockup).unwrap_json(); + assert_eq!(balance.0, amount); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups.len(), 1); + let lockup_index = lockups[0].0; + assert_eq!(lockups[0].1.total_balance, amount); + assert_eq!(lockups[0].1.claimed_balance, 0); + assert_eq!(lockups[0].1.unclaimed_balance, 0); + + // TERMINATE + ft_storage_deposit(&users.eve, TOKEN_ID, &users.eve.account_id); + let res = e.terminate(&users.eve, lockup_index); + assert!(!res.is_ok()); + assert!(format!("{:?}", res.status()).contains("No termination config")); +} + +#[test] +fn test_lockup_terminate_wrong_terminator() { + let e = Env::init(None); + let users = Users::init(&e); + let amount = d(60000, TOKEN_DECIMALS); + e.set_time_sec(GENESIS_TIMESTAMP_SEC); + let lockups = e.get_account_lockups(&users.alice); + assert!(lockups.is_empty()); + let lockup = Lockup { + account_id: users.alice.valid_account_id(), + schedule: Schedule(vec![ + Checkpoint { + timestamp: GENESIS_TIMESTAMP_SEC, + balance: 0, + }, + Checkpoint { + timestamp: GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC, + balance: amount, + }, + ]), + claimed_balance: 0, + termination_config: Some(TerminationConfig { + terminator_id: users.eve.valid_account_id(), + vesting_schedule: None, + }), + }; + + let balance: WrappedBalance = e.add_lockup(&e.owner, amount, &lockup).unwrap_json(); + assert_eq!(balance.0, amount); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups.len(), 1); + let lockup_index = lockups[0].0; + assert_eq!(lockups[0].1.total_balance, amount); + assert_eq!(lockups[0].1.claimed_balance, 0); + assert_eq!(lockups[0].1.unclaimed_balance, 0); + + // TERMINATE + ft_storage_deposit(&users.dude, TOKEN_ID, &users.dude.account_id); + let res = e.terminate(&users.dude, lockup_index); + assert!(!res.is_ok()); + assert!(format!("{:?}", res.status()).contains("Unauthorized")); +} + +#[test] +fn test_lockup_terminate_no_storage() { + let e = Env::init(None); + let users = Users::init(&e); + let amount = d(60000, TOKEN_DECIMALS); + e.set_time_sec(GENESIS_TIMESTAMP_SEC); + let lockups = e.get_account_lockups(&users.alice); + assert!(lockups.is_empty()); + let lockup = Lockup { + account_id: users.alice.valid_account_id(), + schedule: Schedule(vec![ + Checkpoint { + timestamp: GENESIS_TIMESTAMP_SEC, + balance: 0, + }, + Checkpoint { + timestamp: GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC, + balance: amount, + }, + ]), + claimed_balance: 0, + termination_config: Some(TerminationConfig { + terminator_id: users.eve.valid_account_id(), + vesting_schedule: None, + }), + }; + + let balance: WrappedBalance = e.add_lockup(&e.owner, amount, &lockup).unwrap_json(); + assert_eq!(balance.0, amount); + let lockups = e.get_account_lockups(&users.alice); + let lockup_index = lockups[0].0; + + // 1/3 unlock, terminate + e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC / 3); + // Claim tokens + // TERMINATE, without deposit must create unlocked lockup for terminator + let res: WrappedBalance = e.terminate(&users.eve, lockup_index).unwrap_json(); + assert_eq!(res.0, 0); + + ft_storage_deposit(&users.eve, TOKEN_ID, &users.eve.account_id); + let terminator_balance = e.ft_balance_of(&users.eve); + assert_eq!(terminator_balance, 0); + + { + let lockups = e.get_account_lockups(&users.eve); + assert_eq!(lockups.len(), 1); + assert_eq!(lockups[0].1.claimed_balance, 0); + assert_eq!(lockups[0].1.unclaimed_balance, amount * 2 / 3); + let terminator_lockup_index = lockups[0].0; + + // Claim from lockup refund + let res: WrappedBalance = e.claim(&users.eve).unwrap_json(); + assert_eq!(res.0, amount * 2 / 3); + let balance = e.ft_balance_of(&users.eve); + assert_eq!(balance, amount * 2 / 3); + + // Terminator's lockups should be empty, since fully claimed. + let lockups = e.get_account_lockups(&users.eve); + assert!(lockups.is_empty()); + + // Manually checking the terminator's lockup by index + let lockup = e.get_lockup(terminator_lockup_index); + assert_eq!(lockup.claimed_balance, amount * 2 / 3); + assert_eq!(lockup.unclaimed_balance, 0); + } + + { + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups.len(), 1); + assert_eq!(lockups[0].1.claimed_balance, 0); + assert_eq!(lockups[0].1.unclaimed_balance, amount / 3); + + // Claim by user + ft_storage_deposit(&users.alice, TOKEN_ID, &users.alice.account_id); + let balance = e.ft_balance_of(&users.alice); + assert_eq!(balance, 0); + + let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); + assert_eq!(res.0, amount / 3); + let balance = e.ft_balance_of(&users.alice); + assert_eq!(balance, amount / 3); + + // User's lockups should be empty, since fully claimed. + let lockups = e.get_account_lockups(&users.alice); + assert!(lockups.is_empty()); + + // Manually checking the terminator's lockup by index + let lockup = e.get_lockup(lockup_index); + assert_eq!(lockup.claimed_balance, amount / 3); + assert_eq!(lockup.unclaimed_balance, 0); + } +} + +fn lockup_vesting_schedule(amount: u128) -> (Schedule, Schedule) { + let lockup_schedule = Schedule(vec![ + Checkpoint { + timestamp: GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 2, + balance: 0, + }, + Checkpoint { + timestamp: GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 4, + balance: amount * 3 / 4, + }, + Checkpoint { + timestamp: GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 4 + 1, + balance: amount, + }, + ]); + let vesting_schedule = Schedule(vec![ + Checkpoint { + timestamp: GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC - 1, + balance: 0, + }, + Checkpoint { + timestamp: GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC, + balance: amount / 4, + }, + Checkpoint { + timestamp: GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 4, + balance: amount, + }, + ]); + (lockup_schedule, vesting_schedule) +} + +#[test] +fn test_lockup_terminate_custom_vesting_hash() { + let e = Env::init(None); + let users = Users::init(&e); + let amount = d(60000, TOKEN_DECIMALS); + e.set_time_sec(GENESIS_TIMESTAMP_SEC); + let lockups = e.get_account_lockups(&users.alice); + assert!(lockups.is_empty()); + + let (lockup_schedule, vesting_schedule) = lockup_vesting_schedule(amount); + let vesting_hash = e.hash_schedule(&vesting_schedule); + let lockup = Lockup { + account_id: users.alice.valid_account_id(), + schedule: lockup_schedule, + claimed_balance: 0, + termination_config: Some(TerminationConfig { + terminator_id: users.eve.valid_account_id(), + vesting_schedule: Some(HashOrSchedule::Hash(vesting_hash)), + }), + }; + + let balance: WrappedBalance = e.add_lockup(&e.owner, amount, &lockup).unwrap_json(); + assert_eq!(balance.0, amount); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups.len(), 1); + let lockup_index = lockups[0].0; + + // 1Y, 1 / 4 vested, 0 unlocked + e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups[0].1.total_balance, amount); + assert_eq!(lockups[0].1.claimed_balance, 0); + assert_eq!(lockups[0].1.unclaimed_balance, 0); + + // TERMINATE + ft_storage_deposit(&users.eve, TOKEN_ID, &users.eve.account_id); + let res: WrappedBalance = e + .terminate_with_schedule(&users.eve, lockup_index, vesting_schedule) + .unwrap_json(); + assert_eq!(res.0, amount * 3 / 4); + let terminator_balance = e.ft_balance_of(&users.eve); + assert_eq!(terminator_balance, amount * 3 / 4); + + // Checking lockup + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups[0].1.total_balance, amount / 4); + assert_eq!(lockups[0].1.claimed_balance, 0); + assert_eq!(lockups[0].1.unclaimed_balance, 0); + + // Rewind to 2Y + Y * 2 / 3, 1/4 of original unlock, full vested unlock + e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 2 + ONE_YEAR_SEC * 2 / 3); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups[0].1.total_balance, amount / 4); + assert_eq!(lockups[0].1.claimed_balance, 0); + assert_eq!(lockups[0].1.unclaimed_balance, amount / 4); + + // claiming + ft_storage_deposit(&users.alice, TOKEN_ID, &users.alice.account_id); + let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); + assert_eq!(res.0, amount / 4); + + // Checking lockups + let lockups = e.get_account_lockups(&users.alice); + assert!(lockups.is_empty()); + + // User lockups are empty + let lockup = e.get_lockup(lockup_index); + assert_eq!(lockup.total_balance, amount / 4); + assert_eq!(lockup.claimed_balance, amount / 4); + assert_eq!(lockup.unclaimed_balance, 0); +} + +#[test] +fn test_lockup_terminate_custom_vesting_invalid_hash() { + let e = Env::init(None); + let users = Users::init(&e); + let amount = d(60000, TOKEN_DECIMALS); + e.set_time_sec(GENESIS_TIMESTAMP_SEC); + let lockups = e.get_account_lockups(&users.alice); + assert!(lockups.is_empty()); + + let (lockup_schedule, vesting_schedule) = lockup_vesting_schedule(amount); + let vesting_hash = e.hash_schedule(&vesting_schedule); + let lockup = Lockup { + account_id: users.alice.valid_account_id(), + schedule: lockup_schedule, + claimed_balance: 0, + termination_config: Some(TerminationConfig { + terminator_id: users.eve.valid_account_id(), + vesting_schedule: Some(HashOrSchedule::Hash(vesting_hash)), + }), + }; + + let balance: WrappedBalance = e.add_lockup(&e.owner, amount, &lockup).unwrap_json(); + assert_eq!(balance.0, amount); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups.len(), 1); + let lockup_index = lockups[0].0; + + // 1Y, 1 / 4 vested, 0 unlocked + e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups[0].1.total_balance, amount); + assert_eq!(lockups[0].1.claimed_balance, 0); + assert_eq!(lockups[0].1.unclaimed_balance, 0); + + // TERMINATE + let fake_schedule = Schedule(vec![ + Checkpoint { + timestamp: GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 2, + balance: 0, + }, + Checkpoint { + timestamp: GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 4, + balance: amount, + }, + ]); + ft_storage_deposit(&users.eve, TOKEN_ID, &users.eve.account_id); + let res = e.terminate_with_schedule(&users.eve, lockup_index, fake_schedule); + assert!(!res.is_ok()); + assert!(format!("{:?}", res.status()).contains("The revealed schedule hash doesn't match")); +} + +#[test] +fn test_lockup_terminate_custom_vesting_incompatible_vesting_schedule_by_hash() { + let e = Env::init(None); + let users = Users::init(&e); + let amount = d(60000, TOKEN_DECIMALS); + e.set_time_sec(GENESIS_TIMESTAMP_SEC); + let lockups = e.get_account_lockups(&users.alice); + assert!(lockups.is_empty()); + + let (lockup_schedule, _vesting_schedule) = lockup_vesting_schedule(amount); + let incompatible_vesting_schedule = Schedule(vec![ + Checkpoint { + timestamp: GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 4, + balance: 0, + }, + Checkpoint { + timestamp: GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 4 + 1, + balance: amount, + }, + ]); + let incompatible_vesting_hash = e.hash_schedule(&incompatible_vesting_schedule); + let lockup = Lockup { + account_id: users.alice.valid_account_id(), + schedule: lockup_schedule, + claimed_balance: 0, + termination_config: Some(TerminationConfig { + terminator_id: users.eve.valid_account_id(), + vesting_schedule: Some(HashOrSchedule::Hash(incompatible_vesting_hash)), + }), + }; + + let balance: WrappedBalance = e.add_lockup(&e.owner, amount, &lockup).unwrap_json(); + assert_eq!(balance.0, amount); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups.len(), 1); + let lockup_index = lockups[0].0; + + // 1Y, 1 / 4 vested, 0 unlocked + e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups[0].1.total_balance, amount); + assert_eq!(lockups[0].1.claimed_balance, 0); + assert_eq!(lockups[0].1.unclaimed_balance, 0); + + // TERMINATE + ft_storage_deposit(&users.eve, TOKEN_ID, &users.eve.account_id); + let res = e.terminate_with_schedule(&users.eve, lockup_index, incompatible_vesting_schedule); + assert!(!res.is_ok()); + assert!(format!("{:?}", res.status()).contains("The lockup schedule is ahead of")); +} + +#[test] +fn test_validate_schedule() { + let e = Env::init(None); + let users = Users::init(&e); + let amount = d(60000, TOKEN_DECIMALS); + e.set_time_sec(GENESIS_TIMESTAMP_SEC); + let lockups = e.get_account_lockups(&users.alice); + assert!(lockups.is_empty()); + + let (lockup_schedule, vesting_schedule) = lockup_vesting_schedule(amount); + + let res = e.validate_schedule(&lockup_schedule, amount.into(), Some(&vesting_schedule)); + assert!(res.is_ok()); + + let incompatible_vesting_schedule = Schedule(vec![ + Checkpoint { + timestamp: GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 4, + balance: 0, + }, + Checkpoint { + timestamp: GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 4 + 1, + balance: amount, + }, + ]); + let res = e.validate_schedule( + &lockup_schedule, + amount.into(), + Some(&incompatible_vesting_schedule), + ); + assert!(!res.is_ok()); + assert!(format!("{:?}", res.unwrap_err()).contains("The lockup schedule is ahead of")); +} + +#[test] +fn test_lockup_terminate_custom_vesting_terminate_before_cliff() { + let e = Env::init(None); + let users = Users::init(&e); + let amount = d(60000, TOKEN_DECIMALS); + e.set_time_sec(GENESIS_TIMESTAMP_SEC); + let lockups = e.get_account_lockups(&users.alice); + assert!(lockups.is_empty()); + + let (lockup_schedule, vesting_schedule) = lockup_vesting_schedule(amount); + let lockup = Lockup { + account_id: users.alice.valid_account_id(), + schedule: lockup_schedule, + claimed_balance: 0, + termination_config: Some(TerminationConfig { + terminator_id: users.eve.valid_account_id(), + vesting_schedule: Some(HashOrSchedule::Schedule(vesting_schedule)), + }), + }; + + let balance: WrappedBalance = e.add_lockup(&e.owner, amount, &lockup).unwrap_json(); + assert_eq!(balance.0, amount); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups.len(), 1); + let lockup_index = lockups[0].0; + + // 1Y - 1 before cliff termination + e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC - 1); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups[0].1.total_balance, amount); + assert_eq!(lockups[0].1.claimed_balance, 0); + assert_eq!(lockups[0].1.unclaimed_balance, 0); + + // TERMINATE + ft_storage_deposit(&users.eve, TOKEN_ID, &users.eve.account_id); + let res: WrappedBalance = e.terminate(&users.eve, lockup_index).unwrap_json(); + assert_eq!(res.0, amount); + + let terminator_balance = e.ft_balance_of(&users.eve); + assert_eq!(terminator_balance, amount); + + // Checking lockup + + // after ALL the schedules have finished + + let lockups = e.get_account_lockups(&users.alice); + assert!(lockups.is_empty()); + + let lockup = e.get_lockup(lockup_index); + assert_eq!(lockup.total_balance, 0); + assert_eq!(lockup.claimed_balance, 0); + assert_eq!(lockup.unclaimed_balance, 0); + + // Trying to claim + ft_storage_deposit(&users.alice, TOKEN_ID, &users.alice.account_id); + let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); + assert_eq!(res.0, 0); + + let balance = e.ft_balance_of(&users.alice); + assert_eq!(balance, 0); +} + +#[test] +fn test_lockup_terminate_custom_vesting_before_release() { + let e = Env::init(None); + let users = Users::init(&e); + let amount = d(60000, TOKEN_DECIMALS); + e.set_time_sec(GENESIS_TIMESTAMP_SEC); + let lockups = e.get_account_lockups(&users.alice); + assert!(lockups.is_empty()); + + let (lockup_schedule, vesting_schedule) = lockup_vesting_schedule(amount); + let lockup = Lockup { + account_id: users.alice.valid_account_id(), + schedule: lockup_schedule, + claimed_balance: 0, + termination_config: Some(TerminationConfig { + terminator_id: users.eve.valid_account_id(), + vesting_schedule: Some(HashOrSchedule::Schedule(vesting_schedule)), + }), + }; + + let balance: WrappedBalance = e.add_lockup(&e.owner, amount, &lockup).unwrap_json(); + assert_eq!(balance.0, amount); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups.len(), 1); + let lockup_index = lockups[0].0; + + // 1Y, 1 / 4 vested, 0 unlocked + e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups[0].1.total_balance, amount); + assert_eq!(lockups[0].1.claimed_balance, 0); + assert_eq!(lockups[0].1.unclaimed_balance, 0); + + // TERMINATE + ft_storage_deposit(&users.eve, TOKEN_ID, &users.eve.account_id); + let res: WrappedBalance = e.terminate(&users.eve, lockup_index).unwrap_json(); + assert_eq!(res.0, amount * 3 / 4); + let terminator_balance = e.ft_balance_of(&users.eve); + assert_eq!(terminator_balance, amount * 3 / 4); + + // Checking lockup + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups[0].1.total_balance, amount / 4); + assert_eq!(lockups[0].1.claimed_balance, 0); + assert_eq!(lockups[0].1.unclaimed_balance, 0); + + // Trying to claim + ft_storage_deposit(&users.alice, TOKEN_ID, &users.alice.account_id); + let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); + assert_eq!(res.0, 0); + + // Rewind to 2Y + Y/3, 1/8 of original should be unlocked + e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 2 + ONE_YEAR_SEC / 3); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups[0].1.total_balance, amount / 4); + assert_eq!(lockups[0].1.claimed_balance, 0); + assert_eq!(lockups[0].1.unclaimed_balance, amount / 8); + + // claiming + let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); + assert_eq!(res.0, amount / 8); + + // Rewind to 2Y + Y * 2 / 3, 1/4 of original unlock, full vested unlock + e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 2 + ONE_YEAR_SEC * 2 / 3); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups[0].1.total_balance, amount / 4); + assert_eq!(lockups[0].1.claimed_balance, amount / 8); + assert_eq!(lockups[0].1.unclaimed_balance, amount / 8); + + // claiming + let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); + assert_eq!(res.0, amount / 8); + + // Checking lockups + let lockups = e.get_account_lockups(&users.alice); + assert!(lockups.is_empty()); + + // User lockups are empty + let lockup = e.get_lockup(lockup_index); + assert_eq!(lockup.total_balance, amount / 4); + assert_eq!(lockup.claimed_balance, amount / 4); + assert_eq!(lockup.unclaimed_balance, 0); +} + +#[test] +fn test_lockup_terminate_custom_vesting_during_release() { + let e = Env::init(None); + let users = Users::init(&e); + let amount = d(60000, TOKEN_DECIMALS); + e.set_time_sec(GENESIS_TIMESTAMP_SEC); + let lockups = e.get_account_lockups(&users.alice); + assert!(lockups.is_empty()); + + let (lockup_schedule, vesting_schedule) = lockup_vesting_schedule(amount); + let lockup = Lockup { + account_id: users.alice.valid_account_id(), + schedule: lockup_schedule, + claimed_balance: 0, + termination_config: Some(TerminationConfig { + terminator_id: users.eve.valid_account_id(), + vesting_schedule: Some(HashOrSchedule::Schedule(vesting_schedule)), + }), + }; + + let balance: WrappedBalance = e.add_lockup(&e.owner, amount, &lockup).unwrap_json(); + assert_eq!(balance.0, amount); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups.len(), 1); + let lockup_index = lockups[0].0; + + // 2Y + Y / 3, 1/8 unlocked + e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 2 + ONE_YEAR_SEC / 3); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups[0].1.total_balance, amount); + assert_eq!(lockups[0].1.claimed_balance, 0); + assert_eq!(lockups[0].1.unclaimed_balance, amount / 8); + + // Trying to claim + ft_storage_deposit(&users.alice, TOKEN_ID, &users.alice.account_id); + let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); + assert_eq!(res.0, amount / 8); + + // TERMINATE, 2Y + Y / 2, 5/8 unlocked + e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 2 + ONE_YEAR_SEC / 2); + ft_storage_deposit(&users.eve, TOKEN_ID, &users.eve.account_id); + let res: WrappedBalance = e.terminate(&users.eve, lockup_index).unwrap_json(); + assert_eq!(res.0, amount * 3 / 8); + let terminator_balance = e.ft_balance_of(&users.eve); + assert_eq!(terminator_balance, amount * 3 / 8); + + // Checking lockup + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups[0].1.total_balance, amount * 5 / 8); + assert_eq!(lockups[0].1.claimed_balance, amount / 8); + assert_eq!(lockups[0].1.unclaimed_balance, amount / 16); + + // Rewind to 2Y + Y*2/3, 1/4 of original should be unlocked + e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 2 + ONE_YEAR_SEC * 2 / 3); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups[0].1.total_balance, amount * 5 / 8); + assert_eq!(lockups[0].1.claimed_balance, amount / 8); + assert_eq!(lockups[0].1.unclaimed_balance, amount / 8); + + // claiming + let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); + assert_eq!(res.0, amount / 8); + + // Rewind to 3Y + Y * 2 / 3, 5/8 of original unlock, full vested unlock + e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 3 + ONE_YEAR_SEC * 2 / 3); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups[0].1.total_balance, amount * 5 / 8); + assert_eq!(lockups[0].1.claimed_balance, amount * 2 / 8); + assert_eq!(lockups[0].1.unclaimed_balance, amount * 3 / 8); + + // claiming + let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); + assert_eq!(res.0, amount * 3 / 8); + + // Checking lockups + let lockups = e.get_account_lockups(&users.alice); + assert!(lockups.is_empty()); + + // User lockups are empty + let lockup = e.get_lockup(lockup_index); + assert_eq!(lockup.total_balance, amount * 5 / 8); + assert_eq!(lockup.claimed_balance, amount * 5 / 8); + assert_eq!(lockup.unclaimed_balance, 0); +} + +#[test] +fn test_lockup_terminate_custom_vesting_during_lockup_cliff() { + let e = Env::init(None); + let users = Users::init(&e); + let amount = d(60000, TOKEN_DECIMALS); + e.set_time_sec(GENESIS_TIMESTAMP_SEC); + let lockups = e.get_account_lockups(&users.alice); + assert!(lockups.is_empty()); + + let (lockup_schedule, vesting_schedule) = lockup_vesting_schedule(amount); + let lockup = Lockup { + account_id: users.alice.valid_account_id(), + schedule: lockup_schedule, + claimed_balance: 0, + termination_config: Some(TerminationConfig { + terminator_id: users.eve.valid_account_id(), + vesting_schedule: Some(HashOrSchedule::Schedule(vesting_schedule)), + }), + }; + + let balance: WrappedBalance = e.add_lockup(&e.owner, amount, &lockup).unwrap_json(); + assert_eq!(balance.0, amount); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups.len(), 1); + let lockup_index = lockups[0].0; + + // 2Y + Y * 2 / 3, 1/8 unlocked + e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 2 + ONE_YEAR_SEC * 2 / 3); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups[0].1.total_balance, amount); + assert_eq!(lockups[0].1.claimed_balance, 0); + assert_eq!(lockups[0].1.unclaimed_balance, amount / 4); + + // Trying to claim + ft_storage_deposit(&users.alice, TOKEN_ID, &users.alice.account_id); + let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); + assert_eq!(res.0, amount / 4); + + // TERMINATE, 3Y + Y / 3, 5/6 unlocked + e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 3 + ONE_YEAR_SEC / 3); + ft_storage_deposit(&users.eve, TOKEN_ID, &users.eve.account_id); + let res: WrappedBalance = e.terminate(&users.eve, lockup_index).unwrap_json(); + assert_eq!(res.0, amount / 6); + let terminator_balance = e.ft_balance_of(&users.eve); + assert_eq!(terminator_balance, amount / 6); + + // Checking lockup + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups[0].1.total_balance, amount * 5 / 6); + assert_eq!(lockups[0].1.claimed_balance, amount / 4); + assert_eq!(lockups[0].1.unclaimed_balance, amount / 4); + + // claiming + let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); + assert_eq!(res.0, amount / 4); + + // Rewind to 4Y + e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 4); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups[0].1.total_balance, amount * 5 / 6); + assert_eq!(lockups[0].1.claimed_balance, amount * 1 / 2); + assert_eq!(lockups[0].1.unclaimed_balance, amount * 1 / 4); + + // Rewind to 4Y + 1, full unlock including part of cliff + e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 4 + 1); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups[0].1.total_balance, amount * 5 / 6); + assert_eq!(lockups[0].1.claimed_balance, amount * 1 / 2); + assert_eq!(lockups[0].1.unclaimed_balance, amount * 1 / 3); + + // claiming + let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); + assert_eq!(res.0, amount * 1 / 3); + + // Checking lockups + let lockups = e.get_account_lockups(&users.alice); + assert!(lockups.is_empty()); + + // User lockups are empty + let lockup = e.get_lockup(lockup_index); + assert_eq!(lockup.total_balance, amount * 5 / 6); + assert_eq!(lockup.claimed_balance, amount * 5 / 6); + assert_eq!(lockup.unclaimed_balance, 0); +} + +#[test] +fn test_lockup_terminate_custom_vesting_after_vesting_finished() { + let e = Env::init(None); + let users = Users::init(&e); + let amount = d(60000, TOKEN_DECIMALS); + e.set_time_sec(GENESIS_TIMESTAMP_SEC); + let lockups = e.get_account_lockups(&users.alice); + assert!(lockups.is_empty()); + + let (lockup_schedule, vesting_schedule) = lockup_vesting_schedule(amount); + let lockup = Lockup { + account_id: users.alice.valid_account_id(), + schedule: lockup_schedule, + claimed_balance: 0, + termination_config: Some(TerminationConfig { + terminator_id: users.eve.valid_account_id(), + vesting_schedule: Some(HashOrSchedule::Schedule(vesting_schedule)), + }), + }; + + let balance: WrappedBalance = e.add_lockup(&e.owner, amount, &lockup).unwrap_json(); + assert_eq!(balance.0, amount); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups.len(), 1); + let lockup_index = lockups[0].0; + + // 2Y + Y * 2 / 3, 1/8 unlocked + e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 2 + ONE_YEAR_SEC * 2 / 3); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups[0].1.total_balance, amount); + assert_eq!(lockups[0].1.claimed_balance, 0); + assert_eq!(lockups[0].1.unclaimed_balance, amount / 4); + + // Trying to claim + ft_storage_deposit(&users.alice, TOKEN_ID, &users.alice.account_id); + let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); + assert_eq!(res.0, amount / 4); + + // TERMINATE, 4Y, fully vested + e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 4); + ft_storage_deposit(&users.eve, TOKEN_ID, &users.eve.account_id); + let res: WrappedBalance = e.terminate(&users.eve, lockup_index).unwrap_json(); + assert_eq!(res.0, 0); + let terminator_balance = e.ft_balance_of(&users.eve); + assert_eq!(terminator_balance, 0); + + // Checking lockup + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups[0].1.total_balance, amount); + assert_eq!(lockups[0].1.claimed_balance, amount / 4); + assert_eq!(lockups[0].1.unclaimed_balance, amount / 2); + + // claiming + let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); + assert_eq!(res.0, amount / 2); + + // Rewind to 4Y + 1, full unlock including part of cliff + e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 4 + 1); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups[0].1.total_balance, amount); + assert_eq!(lockups[0].1.claimed_balance, amount * 3 / 4); + assert_eq!(lockups[0].1.unclaimed_balance, amount * 1 / 4); + + // Claiming + let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); + assert_eq!(res.0, amount * 1 / 4); + + // Checking lockups + let lockups = e.get_account_lockups(&users.alice); + assert!(lockups.is_empty()); + + // Checking by index + let lockup = e.get_lockup(lockup_index); + assert_eq!(lockup.total_balance, amount); + assert_eq!(lockup.claimed_balance, amount); + assert_eq!(lockup.unclaimed_balance, 0); +} + +#[test] +fn test_deposit_whitelist_get() { + let e = Env::init(None); + let users = Users::init(&e); + let amount = d(1, TOKEN_DECIMALS); + e.set_time_sec(GENESIS_TIMESTAMP_SEC); + let lockups = e.get_account_lockups(&users.alice); + assert!(lockups.is_empty()); + + // deposit whitelist has owner by default + let deposit_whitelist = e.get_deposit_whitelist(); + assert_eq!(deposit_whitelist, vec![e.owner.account_id.clone()]); + + // user from whitelist can create lockups + let lockup = Lockup { + account_id: users.alice.valid_account_id(), + schedule: Schedule(vec![ + Checkpoint { + timestamp: 0, + balance: 0, + }, + Checkpoint { + timestamp: 1, + balance: amount, + }, + ]), + claimed_balance: 0, + termination_config: None, + }; + let balance: WrappedBalance = e.add_lockup(&e.owner, amount, &lockup).unwrap_json(); + assert_eq!(balance.0, amount); + let lockups = e.get_account_lockups(&users.alice); + // not increased + assert_eq!(lockups.len(), 1); + + // user from whitelist can add other users + let res = e.add_to_deposit_whitelist(&e.owner, &users.eve.valid_account_id()); + assert!(res.is_ok()); + + let deposit_whitelist = e.get_deposit_whitelist(); + assert_eq!( + deposit_whitelist, + vec![e.owner.account_id.clone(), users.eve.account_id.clone()] + ); + + // user from whiltelist can remove other users + let res = e.remove_from_deposit_whitelist(&users.eve, &e.owner.valid_account_id()); + assert!(res.is_ok()); + + let deposit_whitelist = e.get_deposit_whitelist(); + assert_eq!(deposit_whitelist, vec![users.eve.account_id.clone()]); + + // user not from whitelist cannot add users + let res = e.add_to_deposit_whitelist(&e.owner, &users.dude.valid_account_id()); + assert!(!res.is_ok()); + assert!(format!("{:?}", res.status()).contains("Not in deposit whitelist")); + + // user not from whitelist cannot remove users + let res = e.remove_from_deposit_whitelist(&e.owner, &users.eve.valid_account_id()); + assert!(!res.is_ok()); + assert!(format!("{:?}", res.status()).contains("Not in deposit whitelist")); + + // user not in whitelist cannot create lockups + let res = e.add_lockup(&e.owner, amount, &lockup); + let balance: WrappedBalance = res.unwrap_json(); + assert_eq!(balance.0, 0); + assert!(res.logs()[0].contains("Refund")); + let lockups = e.get_account_lockups(&users.alice); + // not increased + assert_eq!(lockups.len(), 1); + + // user from whiltelist can remove itself from the list, even if it's the last user + let res = e.remove_from_deposit_whitelist(&users.eve, &users.eve.valid_account_id()); + assert!(res.is_ok()); + let deposit_whitelist = e.get_deposit_whitelist(); + assert!(deposit_whitelist.is_empty()); +} + +#[test] +fn test_get_lockups() { + let e = Env::init(None); + let users = Users::init(&e); + let amount = d(1, TOKEN_DECIMALS); + e.set_time_sec(GENESIS_TIMESTAMP_SEC); + let lockups = e.get_account_lockups(&users.alice); + assert!(lockups.is_empty()); + + // create some lockups + for user in vec![&users.alice, &users.bob, &users.charlie] { + let balance: WrappedBalance = e + .add_lockup( + &e.owner, + amount, + &Lockup::new_unlocked(user.account_id().clone(), amount), + ) + .unwrap_json(); + assert_eq!(balance.0, amount); + } + + // get_num_lockups + let num_lockups = e.get_num_lockups(); + assert_eq!(num_lockups, 3); + + // get_lockups by indices + let res = e.get_lockups(&vec![2, 0]); + assert_eq!(res.len(), 2); + assert_eq!(res[0].1.account_id, users.charlie.valid_account_id()); + assert_eq!(res[1].1.account_id, users.alice.valid_account_id()); + + // get_lockups_paged from to + let res = e.get_lockups_paged(Some(1), Some(2)); + assert_eq!(res.len(), 1); + assert_eq!(res[0].1.account_id, users.bob.valid_account_id()); + + // get_lockups_paged from + let res = e.get_lockups_paged(Some(1), None); + assert_eq!(res.len(), 2); + assert_eq!(res[0].1.account_id, users.bob.valid_account_id()); + assert_eq!(res[1].1.account_id, users.charlie.valid_account_id()); + + // get_lockups_paged to + let res = e.get_lockups_paged(None, Some(2)); + assert_eq!(res.len(), 2); + assert_eq!(res[0].1.account_id, users.alice.valid_account_id()); + assert_eq!(res[1].1.account_id, users.bob.valid_account_id()); + + // get_lockups_paged all + let res = e.get_lockups_paged(None, None); + assert_eq!(res.len(), 3); + assert_eq!(res[0].1.account_id, users.alice.valid_account_id()); + assert_eq!(res[1].1.account_id, users.bob.valid_account_id()); + assert_eq!(res[2].1.account_id, users.charlie.valid_account_id()); +} + +#[test] +fn test_get_token_account_id() { + let e = Env::init(None); + + let result = e.get_token_account_id(); + assert_eq!(result, e.token.valid_account_id()); +} + +#[test] +fn test_new_draft_group() { + let e = Env::init(None); + let users = Users::init(&e); + e.set_time_sec(GENESIS_TIMESTAMP_SEC); + + let res = e.new_draft_group(&users.alice); + assert!(!res.is_ok()); + println!("{:#?}", res); + + let index: DraftGroupIndex = e.new_draft_group(&e.owner).unwrap_json(); + assert_eq!(index, 0); + let index: DraftGroupIndex = e.new_draft_group(&e.owner).unwrap_json(); + assert_eq!(index, 1); + let index: DraftGroupIndex = e.new_draft_group(&e.owner).unwrap_json(); + assert_eq!(index, 2); +} + +// #[test] +// fn test_view_draft_groups() { +// let e = Env::init(None); +// e.set_time_sec(GENESIS_TIMESTAMP_SEC); + +// e.new_draft_group(&e.owner); +// e.new_draft_group(&e.owner); +// e.new_draft_group(&e.owner); + +// let result = e.get_draft_group(2); +// assert!(result.is_some()); +// assert_eq!(result.unwrap().num_drafts, 0); +// let result = e.get_draft_group(3); +// assert!(result.is_none()); + +// let result = e.get_draft_groups_paged(None, None); +// assert_eq!(result.len(), 3); +// assert_eq!(result[0].0, 0); +// assert_eq!(result[1].0, 1); +// assert_eq!(result[2].0, 2); + +// let result = e.get_draft_groups_paged(Some(1), Some(2)); +// assert_eq!(result.len(), 1); +// assert_eq!(result[0].0, 1); +// assert_eq!(result[0].1.num_drafts, 0); +// } + +// #[test] +// fn test_new_draft() { +// let e = Env::init(None); +// let users = Users::init(&e); +// e.set_time_sec(GENESIS_TIMESTAMP_SEC); + +// let amount = d(60000, TOKEN_DECIMALS); +// let lockup = Lockup::new_unlocked(users.alice.account_id, amount); +// let draft_group_id = 0; +// let draft = Draft { draft_group_id, lockup }; + +// let res = e.new_draft(&e.owner, &draft); +// assert!(!res.is_ok()); +// assert!(format!("{:?}", res.status()).contains("draft group not found")); + +// e.new_draft_group(&e.owner); + +// // create draft 0 +// let res = e.new_draft(&e.owner, &draft); +// assert!(res.is_ok()); +// let res: DraftGroupIndex = res.unwrap_json(); +// assert_eq!(res, 0); + +// // create draft 1 +// let res = e.new_draft(&e.owner, &draft); +// assert!(res.is_ok()); +// let res: DraftGroupIndex = res.unwrap_json(); +// assert_eq!(res, 1); + +// // check draft group +// let res = e.get_draft_group(0).unwrap(); +// assert_eq!(res.num_drafts, 2); +// assert_eq!(res.total_amount, amount * 2); +// } + +// #[test] +// fn test_fund_draft_group() { +// let e = Env::init(None); +// let users = Users::init(&e); +// e.set_time_sec(GENESIS_TIMESTAMP_SEC); + +// let amount = d(60000, TOKEN_DECIMALS); +// let lockup = Lockup::new_unlocked(users.alice.account_id, amount); +// let draft_group_id = 0; +// let draft = Draft { draft_group_id, lockup }; + +// e.new_draft_group(&e.owner); + +// // create draft 0 +// let res = e.new_draft(&e.owner, &draft); +// assert!(res.is_ok()); +// // create draft 1 +// let res = e.new_draft(&e.owner, &draft); +// assert!(res.is_ok()); + +// // fund draft group +// let res: WrappedBalance = e.fund_draft_group(&e.owner, amount * 2, 0).unwrap_json(); +// assert_eq!(res.0, amount * 2); + +// let res = e.get_draft_group(0).unwrap(); +// assert_eq!(res.funded, true, "expected draft group to be funded"); + +// // fund again, should fail +// let res = e.fund_draft_group(&e.owner, amount * 2, 0); +// assert!(res.logs()[0].contains("Refund")); +// let res: WrappedBalance = res.unwrap_json(); +// assert_eq!(res.0, 0); +// } diff --git a/tests/terminate.rs b/tests/terminate.rs index 65f6d14..287dab0 100644 --- a/tests/terminate.rs +++ b/tests/terminate.rs @@ -403,7 +403,7 @@ fn test_lockup_terminate_custom_vesting_terminate_before_cliff() { let (lockup_schedule, vesting_schedule) = lockup_vesting_schedule(amount); let lockup_create = LockupCreate { account_id: users.alice.valid_account_id(), - schedule: lockup_schedule, + schedule: lockup_schedule.clone(), vesting_schedule: Some(VestingConditions::Schedule(vesting_schedule)), }; @@ -416,7 +416,8 @@ fn test_lockup_terminate_custom_vesting_terminate_before_cliff() { let lockup_index = lockups[0].0; // 1Y - 1 before cliff termination - e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC - 1); + let termination_timestamp: TimestampSec = GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC - 1; + e.set_time_sec(termination_timestamp); let lockups = e.get_account_lockups(&users.alice); assert_eq!(lockups[0].1.total_balance, amount); assert_eq!(lockups[0].1.claimed_balance, 0); @@ -441,6 +442,20 @@ fn test_lockup_terminate_custom_vesting_terminate_before_cliff() { assert_eq!(lockup.claimed_balance, 0); assert_eq!(lockup.unclaimed_balance, 0); + println!("{:#?}", lockup); + assert_eq!( + lockup.schedule.0.len(), + 2, + "expected terminated schedule to have two checkpoints" + ); + // starting checkpoint is preserved + assert_eq!(lockup.schedule.0[0].balance, 0); + assert_eq!( + lockup.schedule.0[0].timestamp, // trimmed schedule + lockup_schedule.0[0].timestamp, // original schedule + "expected terminate schedule start to be preserved" + ); + // Trying to claim let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); assert_eq!(res.0, 0); From 927d61cd314d8ac208d9c420fc67962b20e34bbc Mon Sep 17 00:00:00 2001 From: Alex Aunter Date: Sun, 3 Jul 2022 16:30:17 +0400 Subject: [PATCH 03/29] feat: preserve finish termination timestamp --- res/ft_lockup.wasm | Bin 336349 -> 336397 bytes src/schedule.rs | 36 +++++++++++++---- src/termination.rs | 3 +- tests/setup.rs | 8 ++++ tests/terminate.rs | 95 +++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 134 insertions(+), 8 deletions(-) diff --git a/res/ft_lockup.wasm b/res/ft_lockup.wasm index 225a3226ea003b8e23ee6f626d649748e4e6affa..95169da673c10b3e8c4d7199e4ffa084ebf620a9 100755 GIT binary patch delta 38331 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 impl Schedule { - pub fn new_unlocked_from(total_balance: Balance, start_timestamp: TimestampSec) -> Self { + pub fn new_zero_balance_from_to( + start_timestamp: TimestampSec, + finish_timestamp: TimestampSec, + ) -> Self { + assert!(finish_timestamp > start_timestamp, "Invariant"); + Self(vec![ Checkpoint { timestamp: start_timestamp, balance: 0, }, Checkpoint { - timestamp: start_timestamp + 1, - balance: total_balance, + timestamp: finish_timestamp, + balance: 0, }, ]) } pub fn new_unlocked(total_balance: Balance) -> Self { - Self::new_unlocked_from(total_balance, 0) + Self(vec![ + Checkpoint { + timestamp: 0, + balance: 0, + }, + Checkpoint { + timestamp: 1, + balance: total_balance, + }, + ]) } pub fn assert_valid(&self, total_balance: Balance) { @@ -113,10 +127,18 @@ impl Schedule { /// Terminates the lockup schedule earlier. /// Assumes new_total_balance is not greater than the current total balance. - pub fn terminate(&mut self, new_total_balance: Balance) { + pub fn terminate(&mut self, new_total_balance: Balance, finish_timestamp: TimestampSec) { if new_total_balance == 0 { - // preserve start timestamp for transparency - self.0 = Self::new_unlocked_from(0, self.0[0].timestamp).0; + // finish_timestamp is a hint, only used for fully unvested schedules + // can be overwritten to preserve schedule invariants + // used to preserve part of the schedule before the termination happens + let start_timestamp = self.0[0].timestamp; + let finish_timestamp = if finish_timestamp > start_timestamp { + finish_timestamp + } else { + start_timestamp + 1 + }; + self.0 = Self::new_zero_balance_from_to(start_timestamp, finish_timestamp).0; return; } assert!( diff --git a/src/termination.rs b/src/termination.rs index 624d847..d638dd9 100644 --- a/src/termination.rs +++ b/src/termination.rs @@ -52,7 +52,8 @@ impl Lockup { .unlocked_balance(termination_timestamp); let unvested_balance = total_balance - vested_balance; if unvested_balance > 0 { - self.schedule.terminate(vested_balance); + self.schedule + .terminate(vested_balance, termination_timestamp); } (unvested_balance, termination_config.beneficiary_id.into()) } diff --git a/tests/setup.rs b/tests/setup.rs index 147ab9b..604743e 100644 --- a/tests/setup.rs +++ b/tests/setup.rs @@ -61,6 +61,10 @@ pub struct Users { pub fn lockup_vesting_schedule(amount: u128) -> (Schedule, Schedule) { let lockup_schedule = Schedule(vec![ + Checkpoint { + timestamp: GENESIS_TIMESTAMP_SEC, + balance: 0, + }, Checkpoint { timestamp: GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 2, balance: 0, @@ -75,6 +79,10 @@ pub fn lockup_vesting_schedule(amount: u128) -> (Schedule, Schedule) { }, ]); let vesting_schedule = Schedule(vec![ + Checkpoint { + timestamp: GENESIS_TIMESTAMP_SEC, + balance: 0, + }, Checkpoint { timestamp: GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC - 1, balance: 0, diff --git a/tests/terminate.rs b/tests/terminate.rs index 287dab0..902254b 100644 --- a/tests/terminate.rs +++ b/tests/terminate.rs @@ -386,6 +386,93 @@ fn test_lockup_terminate_custom_vesting_incompatible_vesting_schedule_by_hash() assert!(format!("{:?}", res.status()).contains("The lockup schedule is ahead of")); } +#[test] +fn test_lockup_terminate_custom_vesting_terminate_before_schedule_start() { + let e = Env::init(None); + let users = Users::init(&e); + let amount = d(60000, TOKEN_DECIMALS); + e.set_time_sec(GENESIS_TIMESTAMP_SEC); + let lockups = e.get_account_lockups(&users.alice); + assert!(lockups.is_empty()); + + let res = e.add_to_deposit_whitelist(&e.owner, &users.eve.valid_account_id()); + assert!(res.is_ok()); + ft_storage_deposit(&e.owner, TOKEN_ID, &users.eve.account_id); + e.ft_transfer(&e.owner, amount, &users.eve); + + let (lockup_schedule, vesting_schedule) = lockup_vesting_schedule(amount); + let lockup_create = LockupCreate { + account_id: users.alice.valid_account_id(), + schedule: lockup_schedule.clone(), + vesting_schedule: Some(VestingConditions::Schedule(vesting_schedule)), + }; + + e.set_time_sec(GENESIS_TIMESTAMP_SEC - ONE_YEAR_SEC); + let balance: WrappedBalance = e + .add_lockup(&users.eve, amount, &lockup_create) + .unwrap_json(); + assert_eq!(balance.0, amount); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups.len(), 1); + let lockup_index = lockups[0].0; + + // 1 second before lockup schedule start + let termination_timestamp: TimestampSec = GENESIS_TIMESTAMP_SEC - 1; + e.set_time_sec(termination_timestamp); + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups[0].1.total_balance, amount); + assert_eq!(lockups[0].1.claimed_balance, 0); + assert_eq!(lockups[0].1.unclaimed_balance, 0); + + // TERMINATE + let res: WrappedBalance = e.terminate(&users.eve, lockup_index).unwrap_json(); + assert_eq!(res.0, amount); + + let terminator_balance = e.ft_balance_of(&users.eve); + assert_eq!(terminator_balance, amount); + + // Checking lockup + + // after ALL the schedules have finished + + let lockups = e.get_account_lockups(&users.alice); + assert!(lockups.is_empty()); + + let lockup = e.get_lockup(lockup_index); + assert_eq!(lockup.total_balance, 0); + assert_eq!(lockup.claimed_balance, 0); + assert_eq!(lockup.unclaimed_balance, 0); + + println!("{:#?}", lockup); + assert_eq!( + lockup.schedule.0.len(), + 2, + "expected terminated schedule to have two checkpoints" + ); + // starting checkpoint is preserved + assert_eq!(lockup.schedule.0[0].balance, 0); + assert_eq!( + lockup.schedule.0[0].timestamp, // trimmed schedule + lockup_schedule.0[0].timestamp, // original schedule + "expected terminate schedule start to be preserved" + ); + // finish checkpoint is termination timestamp + assert_eq!(lockup.schedule.0[1].balance, 0); + assert_eq!( + lockup.schedule.0[1].timestamp, // trimmed schedule + lockup_schedule.0[0].timestamp + 1, // right after schedule start + "expected terminate schedule finish right after start" + ); + + e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 4); + // Trying to claim + let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); + assert_eq!(res.0, 0); + + let balance = e.ft_balance_of(&users.alice); + assert_eq!(balance, 0); +} + #[test] fn test_lockup_terminate_custom_vesting_terminate_before_cliff() { let e = Env::init(None); @@ -455,7 +542,15 @@ fn test_lockup_terminate_custom_vesting_terminate_before_cliff() { lockup_schedule.0[0].timestamp, // original schedule "expected terminate schedule start to be preserved" ); + // finish checkpoint is termination timestamp + assert_eq!(lockup.schedule.0[1].balance, 0); + assert_eq!( + lockup.schedule.0[1].timestamp, // trimmed schedule + termination_timestamp, + "expected terminate schedule finish to be at termination timestamp" + ); + e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 4); // Trying to claim let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); assert_eq!(res.0, 0); From 6c64df5e3cdf8954bc31e9e51d3a2afdc2ef8a5e Mon Sep 17 00:00:00 2001 From: Alex Aunter Date: Sun, 3 Jul 2022 18:53:44 +0400 Subject: [PATCH 04/29] feat: create unlocked now lockup wnen terminate transfer fails --- src/callbacks.rs | 2 +- src/lockup.rs | 12 +++++- src/schedule.rs | 11 +++-- tests/terminate.rs | 65 ++++++++++++++++++++++++++---- tests/terminate_in_future.rs | 78 ++++++++++++++++++++++++++++++++++++ 5 files changed, 154 insertions(+), 14 deletions(-) diff --git a/src/callbacks.rs b/src/callbacks.rs index 3a1067e..b622517 100644 --- a/src/callbacks.rs +++ b/src/callbacks.rs @@ -79,7 +79,7 @@ impl SelfCallbacks for Contract { if !promise_success { log!("Lockup termination transfer has failed."); // There is no internal balance, so instead we create a new lockup. - let lockup = Lockup::new_unlocked(account_id, amount.0); + let lockup = Lockup::new_unlocked_since(account_id, amount.0, current_timestamp_sec()); let lockup_index = self.internal_add_lockup(&lockup); log!( "Generated a new lockup #{} as a refund of {} for account {}", diff --git a/src/lockup.rs b/src/lockup.rs index eb0843f..bf8932c 100644 --- a/src/lockup.rs +++ b/src/lockup.rs @@ -27,15 +27,23 @@ pub struct Lockup { } impl Lockup { - pub fn new_unlocked(account_id: AccountId, total_balance: Balance) -> Self { + pub fn new_unlocked_since( + account_id: AccountId, + total_balance: Balance, + timestamp: TimestampSec, + ) -> Self { Self { account_id: account_id.try_into().unwrap(), - schedule: Schedule::new_unlocked(total_balance), + schedule: Schedule::new_unlocked_since(total_balance, timestamp), claimed_balance: 0, termination_config: None, } } + pub fn new_unlocked(account_id: AccountId, total_balance: Balance) -> Self { + Self::new_unlocked_since(account_id, total_balance, 1) + } + pub fn claim(&mut self, index: LockupIndex, claim_amount: Balance) -> LockupClaim { let unlocked_balance = self.schedule.unlocked_balance(current_timestamp_sec()); let balance_claimed_new = self diff --git a/src/schedule.rs b/src/schedule.rs index bfe21a8..e8e8abb 100644 --- a/src/schedule.rs +++ b/src/schedule.rs @@ -34,19 +34,24 @@ impl Schedule { ]) } - pub fn new_unlocked(total_balance: Balance) -> Self { + pub fn new_unlocked_since(total_balance: Balance, timestamp: TimestampSec) -> Self { + assert!(timestamp > 0, "Invariant"); Self(vec![ Checkpoint { - timestamp: 0, + timestamp: timestamp - 1, balance: 0, }, Checkpoint { - timestamp: 1, + timestamp: timestamp, balance: total_balance, }, ]) } + pub fn new_unlocked(total_balance: Balance) -> Self { + Self::new_unlocked_since(total_balance, 1) + } + pub fn assert_valid(&self, total_balance: Balance) { assert!(self.0.len() >= 2, "At least two checkpoints is required"); assert_eq!( diff --git a/tests/terminate.rs b/tests/terminate.rs index 902254b..7844bfc 100644 --- a/tests/terminate.rs +++ b/tests/terminate.rs @@ -81,29 +81,78 @@ fn test_terminate_basic_payer_logic() { let res = e.terminate(&e.owner, lockup_index); assert!(!res.is_ok()); assert!(format!("{:?}", res.status()).contains("No termination config")); +} + +fn test_terminate_when_payer_doesnt_have_storage_deposit() { + let e = Env::init(None); + let users = Users::init(&e); + let amount = d(60000, TOKEN_DECIMALS); + e.set_time_sec(GENESIS_TIMESTAMP_SEC); + let lockups = e.get_account_lockups(&users.alice); + assert!(lockups.is_empty()); + + // adding another owner + let res = e.add_to_deposit_whitelist(&e.owner, &users.eve.valid_account_id()); + assert!(res.is_ok()); + ft_storage_deposit(&e.owner, TOKEN_ID, &users.eve.account_id); + e.ft_transfer(&e.owner, amount, &users.eve); + + let schedule = Schedule(vec![ + Checkpoint { + timestamp: GENESIS_TIMESTAMP_SEC, + balance: 0, + }, + Checkpoint { + timestamp: GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC, + balance: amount, + }, + ]); let lockup_create = LockupCreate { - account_id: users.bob.valid_account_id(), + account_id: users.alice.valid_account_id(), schedule: schedule.clone(), vesting_schedule: Some(VestingConditions::Schedule(schedule.clone())), }; - // creating lockup for user without storage deposit - let res = e.add_lockup(&e.owner, amount, &lockup_create); + + // create lockup succeeds + let res = e.add_lockup(&users.eve, amount, &lockup_create); let balance: WrappedBalance = res.unwrap_json(); assert_eq!(balance.0, amount); - let lockups = e.get_account_lockups(&users.bob); + + let lockups = e.get_account_lockups(&users.alice); assert_eq!(lockups.len(), 1); let lockup_index = lockups[0].0; - storage_force_unregister(&e.owner, TOKEN_ID); + storage_force_unregister(&users.eve, TOKEN_ID); + // terminate with no storage deposit creates unlocked lockup - let res: WrappedBalance = e.terminate(&e.owner, lockup_index).unwrap_json(); + let termination_timestamp: TimestampSec = GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC / 3; + e.set_time_sec(termination_timestamp); + let res: WrappedBalance = e.terminate(&users.eve, lockup_index).unwrap_json(); assert_eq!(res.0, 0); - let lockups = e.get_account_lockups(&e.owner); + let lockups= e.get_account_lockups(&users.eve); assert_eq!(lockups.len(), 1); - assert_eq!(lockups[0].1.unclaimed_balance, amount); + let lockup = &lockups[0].1; + assert_eq!(lockup.unclaimed_balance, amount * 2 / 3); + assert_eq!(lockup.total_balance, amount * 2 / 3); let balance = e.ft_balance_of(&users.alice); assert_eq!(balance, 0); + + // checking schedule, must be unlocked since the moment of termination + // starting checkpoint is preserved + assert_eq!(lockup.schedule.0[0].balance, 0); + assert_eq!( + lockup.schedule.0[0].timestamp, + termination_timestamp - 1, + "expected refund finish first timestamp one second before the termination" + ); + // finish checkpoint is termination timestamp + assert_eq!(lockup.schedule.0[1].balance, amount / 3); + assert_eq!( + lockup.schedule.0[1].timestamp, // trimmed schedule + termination_timestamp, + "expected refund finish to be at termination timestamp" + ); } #[test] diff --git a/tests/terminate_in_future.rs b/tests/terminate_in_future.rs index 37f986f..83e7ff4 100644 --- a/tests/terminate_in_future.rs +++ b/tests/terminate_in_future.rs @@ -85,3 +85,81 @@ fn test_lockup_terminate_with_timestamp_in_future() { assert_eq!(lockup.claimed_balance, amount / 2); assert_eq!(lockup.unclaimed_balance, 0); } + +#[test] +fn test_lockup_terminate_with_timestamp_in_future_no_storage_deposit() { + let e = Env::init(None); + let users = Users::init(&e); + let amount = d(60000, TOKEN_DECIMALS); + e.set_time_sec(GENESIS_TIMESTAMP_SEC); + let lockups = e.get_account_lockups(&users.alice); + assert!(lockups.is_empty()); + + // adding another owner + let res = e.add_to_deposit_whitelist(&e.owner, &users.eve.valid_account_id()); + assert!(res.is_ok()); + ft_storage_deposit(&e.owner, TOKEN_ID, &users.eve.account_id); + e.ft_transfer(&e.owner, amount, &users.eve); + + let schedule = Schedule(vec![ + Checkpoint { + timestamp: GENESIS_TIMESTAMP_SEC, + balance: 0, + }, + Checkpoint { + timestamp: GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC, + balance: amount, + }, + ]); + + let lockup_create = LockupCreate { + account_id: users.alice.valid_account_id(), + schedule: schedule.clone(), + vesting_schedule: Some(VestingConditions::Schedule(schedule.clone())), + }; + + // create lockup succeeds + let res = e.add_lockup(&users.eve, amount, &lockup_create); + let balance: WrappedBalance = res.unwrap_json(); + assert_eq!(balance.0, amount); + + let lockups = e.get_account_lockups(&users.alice); + assert_eq!(lockups.len(), 1); + let lockup_index = lockups[0].0; + + storage_force_unregister(&users.eve, TOKEN_ID); + + // terminate with no storage deposit creates unlocked lockup + let termination_call_timestamp = GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 1 / 3; + let termination_effective_timestamp = GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 2 / 3; + e.set_time_sec(termination_call_timestamp); + let res: WrappedBalance = e.terminate_with_timestamp( + &users.eve, + lockup_index, + termination_effective_timestamp + ).unwrap_json(); + assert_eq!(res.0, 0); + let lockups = e.get_account_lockups(&users.eve); + assert_eq!(lockups.len(), 1); + let lockup = &lockups[0].1; + assert_eq!(lockup.unclaimed_balance, amount / 3); + assert_eq!(lockup.total_balance, amount / 3); + let balance = e.ft_balance_of(&users.alice); + assert_eq!(balance, 0); + + // checking schedule, must be unlocked since the moment of termination + // starting checkpoint is preserved + assert_eq!(lockup.schedule.0[0].balance, 0); + assert_eq!( + lockup.schedule.0[0].timestamp, + termination_call_timestamp - 1, + "expected refund finish first timestamp one second before the termination" + ); + // finish checkpoint is termination timestamp + assert_eq!(lockup.schedule.0[1].balance, amount / 3); + assert_eq!( + lockup.schedule.0[1].timestamp, // trimmed schedule + termination_call_timestamp, + "expected refund finish to be at termination timestamp" + ); +} From d9aae1d3c775ff44ed76ddfab9b29f2d71ddac0e Mon Sep 17 00:00:00 2001 From: Alex Aunter Date: Sat, 16 Jul 2022 15:55:01 +0400 Subject: [PATCH 05/29] refactor: remove unused function from the wasm binary --- res/ft_lockup.wasm | Bin 336397 -> 336439 bytes src/schedule.rs | 1 + 2 files changed, 1 insertion(+) diff --git a/res/ft_lockup.wasm b/res/ft_lockup.wasm index 95169da673c10b3e8c4d7199e4ffa084ebf620a9..693831626e0bc3eea3b65ae9ae6677246babb7ee 100755 GIT binary patch delta 23702 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 Itd-UNAER}?5dZ)H delta 23490 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 ht+1MA6OKT+ng Self { Self::new_unlocked_since(total_balance, 1) } From 0e6f6b5ce7d38602de0e5999005697d20df13c68 Mon Sep 17 00:00:00 2001 From: Alex Aunter Date: Sat, 16 Jul 2022 16:14:01 +0400 Subject: [PATCH 06/29] fix: typo --- tests/terminate.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/terminate.rs b/tests/terminate.rs index 7844bfc..2ea25cb 100644 --- a/tests/terminate.rs +++ b/tests/terminate.rs @@ -83,6 +83,7 @@ fn test_terminate_basic_payer_logic() { assert!(format!("{:?}", res.status()).contains("No termination config")); } +#[test] fn test_terminate_when_payer_doesnt_have_storage_deposit() { let e = Env::init(None); let users = Users::init(&e); @@ -147,7 +148,7 @@ fn test_terminate_when_payer_doesnt_have_storage_deposit() { "expected refund finish first timestamp one second before the termination" ); // finish checkpoint is termination timestamp - assert_eq!(lockup.schedule.0[1].balance, amount / 3); + assert_eq!(lockup.schedule.0[1].balance, amount * 2 / 3); assert_eq!( lockup.schedule.0[1].timestamp, // trimmed schedule termination_timestamp, From 2f1662c886c7ab67d930c878f6d74cea40babd47 Mon Sep 17 00:00:00 2001 From: Alex Aunter Date: Wed, 24 Aug 2022 19:46:34 +0400 Subject: [PATCH 07/29] style: cargo fmt --- tests/terminate.rs | 2 +- tests/terminate_in_future.rs | 8 +++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/tests/terminate.rs b/tests/terminate.rs index 2ea25cb..7524454 100644 --- a/tests/terminate.rs +++ b/tests/terminate.rs @@ -131,7 +131,7 @@ fn test_terminate_when_payer_doesnt_have_storage_deposit() { e.set_time_sec(termination_timestamp); let res: WrappedBalance = e.terminate(&users.eve, lockup_index).unwrap_json(); assert_eq!(res.0, 0); - let lockups= e.get_account_lockups(&users.eve); + let lockups = e.get_account_lockups(&users.eve); assert_eq!(lockups.len(), 1); let lockup = &lockups[0].1; assert_eq!(lockup.unclaimed_balance, amount * 2 / 3); diff --git a/tests/terminate_in_future.rs b/tests/terminate_in_future.rs index 83e7ff4..af5a1f0 100644 --- a/tests/terminate_in_future.rs +++ b/tests/terminate_in_future.rs @@ -133,11 +133,9 @@ fn test_lockup_terminate_with_timestamp_in_future_no_storage_deposit() { let termination_call_timestamp = GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 1 / 3; let termination_effective_timestamp = GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 2 / 3; e.set_time_sec(termination_call_timestamp); - let res: WrappedBalance = e.terminate_with_timestamp( - &users.eve, - lockup_index, - termination_effective_timestamp - ).unwrap_json(); + let res: WrappedBalance = e + .terminate_with_timestamp(&users.eve, lockup_index, termination_effective_timestamp) + .unwrap_json(); assert_eq!(res.0, 0); let lockups = e.get_account_lockups(&users.eve); assert_eq!(lockups.len(), 1); From a465bcd405dd235cd84fe06aac3487e8929c77d4 Mon Sep 17 00:00:00 2001 From: Alex Aunter Date: Sun, 3 Jul 2022 23:52:17 +0400 Subject: [PATCH 08/29] feat: add option to try converting drafts when funding group --- res/ft_lockup.wasm | Bin 336439 -> 338241 bytes src/ft_token_receiver.rs | 12 ++++++ src/lib.rs | 3 ++ tests/draft.rs | 82 +++++++++++++++++++++++++++++++++++++++ tests/setup.rs | 27 +++++++++++-- 5 files changed, 120 insertions(+), 4 deletions(-) diff --git a/res/ft_lockup.wasm b/res/ft_lockup.wasm index 693831626e0bc3eea3b65ae9ae6677246babb7ee..b024dee1406f7d4ce486dbfae48cd0f1cab3c5e2 100755 GIT binary patch delta 65637 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 oP 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 z z1@rK}Qrpn>HY?QDJQ)K32cK+dkhebsBiOXfoJHlLR_Uomfd0}`!!UzKpBl{AQLT0R z>VC&`hJocdnm?kwo3n9R-Hxr-JRV zUi`#nEvRdXcD3^>jx=`x&AL#1d?K}&F2Ca6N=VF|S|i7T0#osWrAtunVb2klw+Zz&LIBlX5h z$^}4;}zg|~|6cFTCExSsT_IbC#{##a~1*CwYrb-1td$N1Qh{*@2 z-G)%JAl1^P%5sd7fb*leC;6HJd5f0cy(T~Qqjs))Rd!1Ye12!rl?#|JlUXGPaKi1*0VbOe2<9u9plLPv= z9Q2XjriY6~enQ;{g1)Hwq$(vo7Uhrb2|Z}8HuuHee9367#*3l(hk0DeH+*f3gs5*_#PyZQq-Zv(+en9`82?*9^~+CHz7q=o*%0Du052D>Jp` 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 C1alMs diff --git a/src/ft_token_receiver.rs b/src/ft_token_receiver.rs index 467d364..fe44072 100644 --- a/src/ft_token_receiver.rs +++ b/src/ft_token_receiver.rs @@ -4,6 +4,8 @@ use crate::*; #[serde(crate = "near_sdk::serde")] pub struct DraftGroupFunding { pub draft_group_id: DraftGroupIndex, + // use remaining gas to try converting drafts + pub try_convert: Option, } #[derive(Serialize, Deserialize)] @@ -55,6 +57,16 @@ impl FungibleTokenReceiver for Contract { draft_group.fund(&sender_id); self.draft_groups.insert(&draft_group_id as _, &draft_group); log!("Funded draft group {}", draft_group_id); + + if funding.try_convert.unwrap_or(false) { + // Using remaining gas to try convert drafts, not waiting for results + ext_self::convert_drafts( + draft_group.draft_indices.into_iter().collect(), + &env::current_account_id(), + NO_DEPOSIT, + env::prepaid_gas() - GAS_FT_ON_TRANSFER, + ); + } } } diff --git a/src/lib.rs b/src/lib.rs index 6285e03..9cfbbbc 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -36,6 +36,7 @@ pub type TokenAccountId = AccountId; const GAS_FOR_FT_TRANSFER: Gas = 15_000_000_000_000; const GAS_FOR_AFTER_FT_TRANSFER: Gas = 20_000_000_000_000; +const GAS_FT_ON_TRANSFER: Gas = 10_000_000_000_000; const ONE_YOCTO: Balance = 1; const NO_DEPOSIT: Balance = 0; @@ -57,6 +58,8 @@ pub trait SelfCallbacks { account_id: AccountId, amount: WrappedBalance, ) -> WrappedBalance; + + fn convert_drafts(&mut self, draft_ids: Vec) -> Vec; } #[near_bindgen] diff --git a/tests/draft.rs b/tests/draft.rs index cea78e8..31115c9 100644 --- a/tests/draft.rs +++ b/tests/draft.rs @@ -222,6 +222,88 @@ fn test_fund_draft_group() { assert!(format!("{:?}", res.status()).contains("group already funded")); } +#[test] +fn test_fund_draft_group_with_convert() { + let e = Env::init(None); + let users = Users::init(&e); + e.set_time_sec(GENESIS_TIMESTAMP_SEC); + + let amount = d(60000, TOKEN_DECIMALS); + let draft_group_id = 0; + let draft = Draft { + draft_group_id, + lockup_create: LockupCreate::new_unlocked(users.alice.valid_account_id(), amount), + }; + + e.create_draft_group(&e.owner); + + // create draft 0 + let res = e.create_draft(&e.owner, &draft); + assert!(res.is_ok()); + + // fund draft group + let res = e.fund_draft_group_with_convert(&e.owner, amount, 0); + let balance: WrappedBalance = res.unwrap_json(); + assert_eq!(balance.0, amount); + + let res = e.get_draft_group(0); + assert!(res.is_none(), "expected draft group to be removed"); + + // draft should have been converted to lockup + let res = e.get_lockups_paged(None, None); + assert_eq!(res.len(), 1); + // draft should have been converted to lockup + let res = e.get_draft(0); + assert!(res.is_none(), "expected draft to be converted"); + let res = e.get_draft_groups_paged(None, None); + assert_eq!(res.len(), 0, "expected draft group to be removed"); +} + +#[test] +fn test_fund_draft_group_with_convert_too_big_group() { + let e = Env::init(None); + let users = Users::init(&e); + e.set_time_sec(GENESIS_TIMESTAMP_SEC); + + let amount = d(600, TOKEN_DECIMALS); + let draft_group_id = 0; + let draft = Draft { + draft_group_id, + lockup_create: LockupCreate::new_unlocked(users.alice.valid_account_id(), amount), + }; + + e.create_draft_group(&e.owner); + + let n_drafts = 200; + // intentionally create too big draft group to convert with restricted gas + let drafts: Vec = iter::repeat(draft).take(n_drafts).collect(); + + // create draft 0 + let res = e.create_drafts(&e.owner, &drafts); + assert!(res.is_ok()); + + // fund draft group + let res = e.fund_draft_group_with_convert(&e.owner, amount * (n_drafts as Balance), 0); + let balance: WrappedBalance = res.unwrap_json(); + // draft group has been converted since ft_transfer_call succeeds + assert_eq!(balance.0, amount * (n_drafts as Balance)); + + // but the draft group tried to be converted and failed + let res = e.get_draft_group(0); + assert!(res.is_some(), "expected draft group to not be removed"); + let res: DraftGroupView = res.unwrap(); + assert!(res.funded, "expected draft group to be funded"); + + // lockups should not have been created + let res = e.get_lockups_paged(None, None); + assert_eq!(res.len(), 0); + // draft should not have been converted to lockup + let res = e.get_draft(0); + assert!(res.is_some(), "expected draft not to be converted"); + let res = e.get_draft_groups_paged(None, None); + assert_eq!(res.len(), 1, "expected draft group not to be removed"); +} + #[test] fn test_convert_draft() { let e = Env::init(None); diff --git a/tests/setup.rs b/tests/setup.rs index 604743e..16d89d8 100644 --- a/tests/setup.rs +++ b/tests/setup.rs @@ -1,5 +1,7 @@ #![allow(dead_code)] +pub use std::iter; + use near_contract_standards::fungible_token::metadata::{FungibleTokenMetadata, FT_METADATA_SPEC}; pub use near_sdk::json_types::{Base58CryptoHash, ValidAccountId, WrappedBalance}; use near_sdk::serde_json::json; @@ -14,7 +16,7 @@ use ft_lockup::ft_token_receiver::DraftGroupFunding; pub use ft_lockup::lockup::{Lockup, LockupCreate, LockupIndex}; pub use ft_lockup::schedule::{Checkpoint, Schedule}; pub use ft_lockup::termination::{TerminationConfig, VestingConditions}; -use ft_lockup::view::{DraftGroupView, DraftView, LockupView}; +pub use ft_lockup::view::{DraftGroupView, DraftView, LockupView}; pub use ft_lockup::{ContractContract as FtLockupContract, TimestampSec}; near_sdk_sim::lazy_static_include::lazy_static_include_bytes! { @@ -36,6 +38,7 @@ pub const DRAFT_OPERATOR_ID: &str = "draft_operator.near"; pub const T_GAS: Gas = 10u64.pow(12); pub const DEFAULT_GAS: Gas = 15 * T_GAS; pub const MAX_GAS: Gas = 300 * T_GAS; +pub const FT_TRANSFER_CALL_GAS: Gas = 60 * T_GAS; pub const CLAIM_GAS: Gas = 100 * T_GAS; pub const TERMINATE_GAS: Gas = 100 * T_GAS; @@ -265,7 +268,7 @@ impl Env { }) .to_string() .into_bytes(), - MAX_GAS, + FT_TRANSFER_CALL_GAS, 1, ) } @@ -285,7 +288,23 @@ impl Env { amount: Balance, draft_group_id: DraftGroupIndex, ) -> ExecutionResult { - let funding = DraftGroupFunding { draft_group_id }; + let funding = DraftGroupFunding { + draft_group_id, + try_convert: None, + }; + self.ft_transfer_call(user, amount, &serde_json::to_string(&funding).unwrap()) + } + + pub fn fund_draft_group_with_convert( + &self, + user: &UserAccount, + amount: Balance, + draft_group_id: DraftGroupIndex, + ) -> ExecutionResult { + let funding = DraftGroupFunding { + draft_group_id, + try_convert: Some(true), + }; self.ft_transfer_call(user, amount, &serde_json::to_string(&funding).unwrap()) } @@ -446,7 +465,7 @@ impl Env { pub fn create_drafts(&self, user: &UserAccount, drafts: &Vec) -> ExecutionResult { user.function_call( self.contract.contract.create_drafts(drafts.clone()), - DEFAULT_GAS, + MAX_GAS, 0, ) } From f3bc23cd1f1581cfb1a90aa81c83ca1df878b5fb Mon Sep 17 00:00:00 2001 From: Alex Aunter Date: Sat, 16 Jul 2022 16:57:24 +0400 Subject: [PATCH 09/29] feat: add min remaining gas threshold --- res/ft_lockup.wasm | Bin 338241 -> 338218 bytes src/ft_token_receiver.rs | 16 ++++++++++------ src/lib.rs | 1 + 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/res/ft_lockup.wasm b/res/ft_lockup.wasm index b024dee1406f7d4ce486dbfae48cd0f1cab3c5e2..e7518ace398afd612ead2132e27864d61cef0aee 100755 GIT binary patch delta 20878 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 delta 20777 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

N_n#A}tVITaLh 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 VV*uAwFd232L!B0S1$Zk9|3Cg2?DhZv diff --git a/src/ft_token_receiver.rs b/src/ft_token_receiver.rs index fe44072..b783191 100644 --- a/src/ft_token_receiver.rs +++ b/src/ft_token_receiver.rs @@ -60,12 +60,16 @@ impl FungibleTokenReceiver for Contract { if funding.try_convert.unwrap_or(false) { // Using remaining gas to try convert drafts, not waiting for results - ext_self::convert_drafts( - draft_group.draft_indices.into_iter().collect(), - &env::current_account_id(), - NO_DEPOSIT, - env::prepaid_gas() - GAS_FT_ON_TRANSFER, - ); + if let Some(remaining_gas) = env::prepaid_gas().checked_sub(GAS_FT_ON_TRANSFER) { + if remaining_gas > GAS_MIN_FOR_CONVERT { + ext_self::convert_drafts( + draft_group.draft_indices.into_iter().collect(), + &env::current_account_id(), + NO_DEPOSIT, + remaining_gas, + ); + } + } } } } diff --git a/src/lib.rs b/src/lib.rs index 9cfbbbc..d9f9ebe 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -37,6 +37,7 @@ pub type TokenAccountId = AccountId; const GAS_FOR_FT_TRANSFER: Gas = 15_000_000_000_000; const GAS_FOR_AFTER_FT_TRANSFER: Gas = 20_000_000_000_000; const GAS_FT_ON_TRANSFER: Gas = 10_000_000_000_000; +const GAS_MIN_FOR_CONVERT: Gas = 15_000_000_000_000; const ONE_YOCTO: Balance = 1; const NO_DEPOSIT: Balance = 0; From ce26971b99d73f9809df542c69a4389f28888055 Mon Sep 17 00:00:00 2001 From: Alex Aunter Date: Wed, 24 Aug 2022 02:03:36 +0400 Subject: [PATCH 10/29] style: cargo fmt --- src/ft_token_receiver.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ft_token_receiver.rs b/src/ft_token_receiver.rs index b783191..799238a 100644 --- a/src/ft_token_receiver.rs +++ b/src/ft_token_receiver.rs @@ -60,7 +60,8 @@ impl FungibleTokenReceiver for Contract { if funding.try_convert.unwrap_or(false) { // Using remaining gas to try convert drafts, not waiting for results - if let Some(remaining_gas) = env::prepaid_gas().checked_sub(GAS_FT_ON_TRANSFER) { + if let Some(remaining_gas) = env::prepaid_gas().checked_sub(GAS_FT_ON_TRANSFER) + { if remaining_gas > GAS_MIN_FOR_CONVERT { ext_self::convert_drafts( draft_group.draft_indices.into_iter().collect(), From 75c24ea87e6a5bf3194a0f6a92cb311babfef0c2 Mon Sep 17 00:00:00 2001 From: Alex Aunter Date: Wed, 24 Aug 2022 02:11:22 +0400 Subject: [PATCH 11/29] feat: update remaining gas calculation logic --- src/ft_token_receiver.rs | 3 ++- src/lib.rs | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/ft_token_receiver.rs b/src/ft_token_receiver.rs index 799238a..969327d 100644 --- a/src/ft_token_receiver.rs +++ b/src/ft_token_receiver.rs @@ -60,7 +60,8 @@ impl FungibleTokenReceiver for Contract { if funding.try_convert.unwrap_or(false) { // Using remaining gas to try convert drafts, not waiting for results - if let Some(remaining_gas) = env::prepaid_gas().checked_sub(GAS_FT_ON_TRANSFER) + if let Some(remaining_gas) = + env::prepaid_gas().checked_sub(env::used_gas() + GAS_EXT_CALL_COST) { if remaining_gas > GAS_MIN_FOR_CONVERT { ext_self::convert_drafts( diff --git a/src/lib.rs b/src/lib.rs index d9f9ebe..73ba3a6 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -36,7 +36,7 @@ pub type TokenAccountId = AccountId; const GAS_FOR_FT_TRANSFER: Gas = 15_000_000_000_000; const GAS_FOR_AFTER_FT_TRANSFER: Gas = 20_000_000_000_000; -const GAS_FT_ON_TRANSFER: Gas = 10_000_000_000_000; +const GAS_EXT_CALL_COST: Gas = 5_000_000_000_000; const GAS_MIN_FOR_CONVERT: Gas = 15_000_000_000_000; const ONE_YOCTO: Balance = 1; From 5353ed987234bd009c19a078ca44272b3209b761 Mon Sep 17 00:00:00 2001 From: Alex Aunter Date: Wed, 24 Aug 2022 23:24:42 +0400 Subject: [PATCH 12/29] fix: fix failing tests due to too low offset --- res/ft_lockup.wasm | Bin 338218 -> 338428 bytes src/lib.rs | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/res/ft_lockup.wasm b/res/ft_lockup.wasm index e7518ace398afd612ead2132e27864d61cef0aee..a33d97680cf08be0685febde18444f3a778e3211 100755 GIT binary patch delta 27723 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 delta 27093 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 diff --git a/src/lib.rs b/src/lib.rs index 73ba3a6..e79bcd1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -36,7 +36,7 @@ pub type TokenAccountId = AccountId; const GAS_FOR_FT_TRANSFER: Gas = 15_000_000_000_000; const GAS_FOR_AFTER_FT_TRANSFER: Gas = 20_000_000_000_000; -const GAS_EXT_CALL_COST: Gas = 5_000_000_000_000; +const GAS_EXT_CALL_COST: Gas = 10_000_000_000_000; const GAS_MIN_FOR_CONVERT: Gas = 15_000_000_000_000; const ONE_YOCTO: Balance = 1; From 2318196fce3603f0071ca8bdc99f23ae4400df6f Mon Sep 17 00:00:00 2001 From: Alex Aunter Date: Sun, 28 Aug 2022 10:30:18 +0400 Subject: [PATCH 13/29] refactor: remove bak backup files --- src/draft.rs.bak | 33 - src/internal.rs.bak | 61 -- src/lib.rs.2.bak | 240 ------- src/lib.rs.bak | 299 --------- src/lockup.rs.bak | 9 - tests/main.rs.bak | 1503 ------------------------------------------- 6 files changed, 2145 deletions(-) delete mode 100644 src/draft.rs.bak delete mode 100644 src/internal.rs.bak delete mode 100644 src/lib.rs.2.bak delete mode 100644 src/lib.rs.bak delete mode 100644 src/lockup.rs.bak delete mode 100644 tests/main.rs.bak diff --git a/src/draft.rs.bak b/src/draft.rs.bak deleted file mode 100644 index da51559..0000000 --- a/src/draft.rs.bak +++ /dev/null @@ -1,33 +0,0 @@ -use crate::*; - -pub type DraftGroupIndex = u32; -pub type DraftIndex = u32; - -#[derive(BorshDeserialize, BorshSerialize, Serialize, Deserialize)] -#[cfg_attr(not(target_arch = "wasm32"), derive(Clone))] -#[serde(crate = "near_sdk::serde")] -pub struct Draft { - pub draft_group_id: DraftGroupIndex, - pub lockup: Lockup, -} - -#[derive(BorshDeserialize, BorshSerialize)] -pub struct DraftGroup { - pub total_amount: Balance, - pub funded: bool, - pub draft_indices: HashSet, -} - -impl DraftGroup { - pub fn new() -> Self { - Self { - total_amount: 0, - funded: false, - draft_indices: HashSet::new(), - } - } - - pub fn assert_can_add_draft(&self) { - assert!(!self.funded, "cannot add draft, group already funded"); - } -} diff --git a/src/internal.rs.bak b/src/internal.rs.bak deleted file mode 100644 index b677825..0000000 --- a/src/internal.rs.bak +++ /dev/null @@ -1,61 +0,0 @@ -use crate::*; - -impl Contract { - pub(crate) fn assert_deposit_whitelist(&self, account_id: &AccountId) { - assert!( - self.deposit_whitelist.contains(account_id), - "Not in deposit whitelist" - ); - } - - pub(crate) fn internal_add_lockup(&mut self, lockup: &Lockup) -> LockupIndex { - let index = self.lockups.len() as LockupIndex; - self.lockups.push(lockup); - let mut indices = self - .account_lockups - .get(lockup.account_id.as_ref()) - .unwrap_or_default(); - indices.insert(index); - self.internal_save_account_lockups(lockup.account_id.as_ref(), indices); - index - } - - pub(crate) fn internal_save_account_lockups( - &mut self, - account_id: &AccountId, - indices: HashSet, - ) { - if indices.is_empty() { - self.account_lockups.remove(account_id); - } else { - self.account_lockups.insert(account_id, &indices); - } - } - - pub(crate) fn internal_get_account_lockups( - &self, - account_id: &AccountId, - ) -> Vec<(LockupIndex, Lockup)> { - let lockup_ids = self.account_lockups.get(account_id).unwrap_or_default(); - self.internal_get_account_lockups_by_id(&account_id, &lockup_ids).into_iter().collect() - } - - pub(crate) fn internal_get_account_lockups_by_id( - &self, - account_id: &AccountId, - lockup_ids: &HashSet, - ) -> HashMap { - let account_lockup_ids = self.account_lockups.get(account_id).unwrap_or_default(); - - lockup_ids.iter().map(|&x| x).map(|lockup_index| { - assert!( - account_lockup_ids.contains(&lockup_index), - "lockup not found for account: {}", - lockup_index, - ); - let lockup = self.lockups.get(lockup_index as _).unwrap(); - (lockup_index.clone(), lockup) - }) - .collect() - } -} diff --git a/src/lib.rs.2.bak b/src/lib.rs.2.bak deleted file mode 100644 index 876d3fb..0000000 --- a/src/lib.rs.2.bak +++ /dev/null @@ -1,240 +0,0 @@ -use std::convert::TryInto; - -use near_contract_standards::fungible_token::core_impl::ext_fungible_token; -use near_contract_standards::fungible_token::receiver::FungibleTokenReceiver; -use near_sdk::borsh::maybestd::collections::HashSet; -use near_sdk::borsh::{self, BorshDeserialize, BorshSerialize}; -use near_sdk::collections::{LookupMap, UnorderedSet, Vector}; -use near_sdk::json_types::{Base58CryptoHash, ValidAccountId, WrappedBalance, U128}; -use near_sdk::serde::{Deserialize, Serialize}; -use near_sdk::{ - assert_one_yocto, env, ext_contract, is_promise_success, log, near_bindgen, serde_json, - AccountId, Balance, BorshStorageKey, CryptoHash, Gas, PanicOnDefault, PromiseOrValue, - Timestamp, -}; - -pub mod callbacks; -pub mod draft; -pub mod ft_token_receiver; -pub mod internal; -pub mod lockup; -pub mod schedule; -pub mod termination; -pub mod util; -pub mod view; - -use crate::draft::*; -use crate::lockup::*; -use crate::schedule::*; -use crate::termination::*; -use crate::util::*; - -near_sdk::setup_alloc!(); - -pub type TimestampSec = u32; -pub type TokenAccountId = AccountId; - -const GAS_FOR_FT_TRANSFER: Gas = 15_000_000_000_000; -const GAS_FOR_AFTER_FT_TRANSFER: Gas = 20_000_000_000_000; - -const ONE_YOCTO: Balance = 1; -const NO_DEPOSIT: Balance = 0; - -uint::construct_uint! { - pub struct U256(4); -} - -#[ext_contract(ext_self)] -pub trait SelfCallbacks { - fn after_ft_transfer( - &mut self, - account_id: AccountId, - lockup_claims: Vec, - ) -> WrappedBalance; - - fn after_lockup_termination( - &mut self, - account_id: AccountId, - amount: WrappedBalance, - ) -> WrappedBalance; -} - -#[near_bindgen] -#[derive(BorshDeserialize, BorshSerialize, PanicOnDefault)] -pub struct Contract { - pub token_account_id: TokenAccountId, - - pub lockups: Vector, - - pub account_lockups: LookupMap>, - - /// Account IDs that can create new lockups. - pub deposit_whitelist: UnorderedSet, - - pub drafts: Vector, - pub draft_groups: Vector, -} - -#[derive(BorshStorageKey, BorshSerialize)] -pub(crate) enum StorageKey { - Lockups, - AccountLockups, - DepositWhitelist, - Drafts, - DraftGroups, -} - -#[near_bindgen] -impl Contract { - #[init] - pub fn new(token_account_id: ValidAccountId, deposit_whitelist: Vec) -> Self { - let mut deposit_whitelist_set = UnorderedSet::new(StorageKey::DepositWhitelist); - deposit_whitelist_set.extend(deposit_whitelist.into_iter().map(|a| a.into())); - Self { - lockups: Vector::new(StorageKey::Lockups), - account_lockups: LookupMap::new(StorageKey::AccountLockups), - token_account_id: token_account_id.into(), - deposit_whitelist: deposit_whitelist_set, - drafts: Vector::new(StorageKey::Drafts), - draft_groups: Vector::new(StorageKey::DraftGroups), - } - } - - pub fn claim(&mut self) -> PromiseOrValue { - let account_id = env::predecessor_account_id(); - let lockups = self.internal_get_account_lockups(&account_id); - - if lockups.is_empty() { - return PromiseOrValue::Value(0.into()); - } - - let mut lockup_claims = vec![]; - let mut total_unclaimed_balance = 0; - for (lockup_index, mut lockup) in lockups { - let lockup_claim = lockup.claim(lockup_index); - if lockup_claim.unclaimed_balance.0 > 0 { - log!( - "Claiming {} form lockup #{}", - lockup_claim.unclaimed_balance.0, - lockup_index - ); - total_unclaimed_balance += lockup_claim.unclaimed_balance.0; - self.lockups.replace(lockup_index as _, &lockup); - lockup_claims.push(lockup_claim); - } - } - log!("Total claim {}", total_unclaimed_balance); - - if total_unclaimed_balance > 0 { - ext_fungible_token::ft_transfer( - account_id.clone(), - total_unclaimed_balance.into(), - Some(format!( - "Claiming unlocked {} balance from {}", - total_unclaimed_balance, - env::current_account_id() - )), - &self.token_account_id, - ONE_YOCTO, - GAS_FOR_FT_TRANSFER, - ) - .then(ext_self::after_ft_transfer( - account_id, - lockup_claims, - &env::current_account_id(), - NO_DEPOSIT, - GAS_FOR_AFTER_FT_TRANSFER, - )) - .into() - } else { - PromiseOrValue::Value(0.into()) - } - } - - pub fn terminate( - &mut self, - lockup_index: LockupIndex, - hashed_schedule: Option, - ) -> PromiseOrValue { - let account_id = env::predecessor_account_id(); - let mut lockup = self - .lockups - .get(lockup_index as _) - .expect("Lockup not found"); - let unvested_balance = lockup.terminate(&account_id, hashed_schedule); - self.lockups.replace(lockup_index as _, &lockup); - - // no need to store empty lockup - if lockup.schedule.total_balance() == 0 { - let lockup_account_id: AccountId = lockup.account_id.into(); - let mut indices = self - .account_lockups - .get(&lockup_account_id) - .unwrap_or_default(); - indices.remove(&lockup_index); - self.internal_save_account_lockups(&lockup_account_id, indices); - } - - if unvested_balance > 0 { - ext_fungible_token::ft_transfer( - account_id.clone(), - unvested_balance.into(), - Some(format!("Terminated lockup #{}", lockup_index)), - &self.token_account_id, - ONE_YOCTO, - GAS_FOR_FT_TRANSFER, - ) - .then(ext_self::after_lockup_termination( - account_id, - unvested_balance.into(), - &env::current_account_id(), - NO_DEPOSIT, - GAS_FOR_AFTER_FT_TRANSFER, - )) - .into() - } else { - PromiseOrValue::Value(0.into()) - } - } - - #[payable] - pub fn add_to_deposit_whitelist(&mut self, account_id: ValidAccountId) { - assert_one_yocto(); - self.assert_deposit_whitelist(&env::predecessor_account_id()); - self.deposit_whitelist.insert(account_id.as_ref()); - } - - #[payable] - pub fn remove_from_deposit_whitelist(&mut self, account_id: ValidAccountId) { - assert_one_yocto(); - self.assert_deposit_whitelist(&env::predecessor_account_id()); - self.deposit_whitelist.remove(account_id.as_ref()); - } - - pub fn new_draft_group(&mut self) -> DraftGroupIndex { - self.draft_groups.push(&DraftGroup::new()); - (self.draft_groups.len() - 1).try_into().unwrap() - } - - pub fn new_draft(&mut self, draft: Draft) -> DraftIndex { - // draft is valid - let amount = draft.lockup.schedule.total_balance(); - draft.lockup.assert_new_valid(amount); - let index: DraftIndex = self.drafts.len().try_into().unwrap(); - self.drafts.push(&draft); - - // draft group exists - // TODO: add check that group is not yet funded - let draft_group_id: u64 = draft.draft_group_id.into(); - let mut draft_group = self - .draft_groups - .get(draft_group_id) - .expect("draft group not found"); - draft_group.assert_can_add_draft(); - draft_group.total_amount += amount; - draft_group.draft_indices.insert(index); - self.draft_groups.replace(draft_group_id, &draft_group); - - index - } -} diff --git a/src/lib.rs.bak b/src/lib.rs.bak deleted file mode 100644 index 992eba8..0000000 --- a/src/lib.rs.bak +++ /dev/null @@ -1,299 +0,0 @@ -use std::convert::TryInto; - -use near_contract_standards::fungible_token::core_impl::ext_fungible_token; -use near_contract_standards::fungible_token::receiver::FungibleTokenReceiver; -use near_sdk::borsh::maybestd::collections::HashSet; -use near_sdk::borsh::{self, BorshDeserialize, BorshSerialize}; -use near_sdk::collections::{LookupMap, UnorderedMap, UnorderedSet, Vector}; -use near_sdk::json_types::{Base58CryptoHash, ValidAccountId, WrappedBalance, U128}; -use near_sdk::serde::{Deserialize, Serialize}; -use near_sdk::{ - assert_one_yocto, env, ext_contract, is_promise_success, log, near_bindgen, serde_json, - AccountId, Balance, BorshStorageKey, CryptoHash, Gas, PanicOnDefault, PromiseOrValue, - Timestamp, -}; - -pub mod callbacks; -pub mod draft; -pub mod ft_token_receiver; -pub mod internal; -pub mod lockup; -pub mod schedule; -pub mod termination; -pub mod util; -pub mod view; - -use crate::draft::*; -use crate::lockup::*; -use crate::schedule::*; -use crate::termination::*; -use crate::util::*; - -near_sdk::setup_alloc!(); - -pub type TimestampSec = u32; -pub type TokenAccountId = AccountId; - -const GAS_FOR_FT_TRANSFER: Gas = 15_000_000_000_000; -const GAS_FOR_AFTER_FT_TRANSFER: Gas = 20_000_000_000_000; - -const ONE_YOCTO: Balance = 1; -const NO_DEPOSIT: Balance = 0; - -uint::construct_uint! { - pub struct U256(4); -} - -#[ext_contract(ext_self)] -pub trait SelfCallbacks { - fn after_ft_transfer( - &mut self, - account_id: AccountId, - lockup_claims: Vec, - ) -> WrappedBalance; - - fn after_lockup_termination( - &mut self, - account_id: AccountId, - amount: WrappedBalance, - ) -> WrappedBalance; -} - -#[near_bindgen] -#[derive(BorshDeserialize, BorshSerialize, PanicOnDefault)] -pub struct Contract { - pub token_account_id: TokenAccountId, - - pub lockups: Vector, - - pub account_lockups: LookupMap>, - - /// Account IDs that can create new lockups. - pub deposit_whitelist: UnorderedSet, - - pub next_draft_id: DraftIndex, - pub drafts: LookupMap, - pub next_draft_group_id: DraftGroupIndex, - pub draft_groups: UnorderedMap, -} - -#[derive(BorshStorageKey, BorshSerialize)] -pub(crate) enum StorageKey { - Lockups, - AccountLockups, - DepositWhitelist, - Drafts, - DraftGroups, -} - -#[near_bindgen] -impl Contract { - #[init] - pub fn new(token_account_id: ValidAccountId, deposit_whitelist: Vec) -> Self { - let mut deposit_whitelist_set = UnorderedSet::new(StorageKey::DepositWhitelist); - deposit_whitelist_set.extend(deposit_whitelist.into_iter().map(|a| a.into())); - Self { - lockups: Vector::new(StorageKey::Lockups), - account_lockups: LookupMap::new(StorageKey::AccountLockups), - token_account_id: token_account_id.into(), - deposit_whitelist: deposit_whitelist_set, - next_draft_id: 0, - drafts: LookupMap::new(StorageKey::Drafts), - next_draft_group_id: 0, - draft_groups: UnorderedMap::new(StorageKey::DraftGroups), - } - } - - pub fn claim(&mut self) -> PromiseOrValue { - let account_id = env::predecessor_account_id(); - let lockups = self.internal_get_account_lockups(&account_id); - - if lockups.is_empty() { - return PromiseOrValue::Value(0.into()); - } - - let mut lockup_claims = vec![]; - let mut total_unclaimed_balance = 0; - for (lockup_index, mut lockup) in lockups { - let lockup_claim = lockup.claim(lockup_index); - if lockup_claim.unclaimed_balance.0 > 0 { - log!( - "Claiming {} form lockup #{}", - lockup_claim.unclaimed_balance.0, - lockup_index - ); - total_unclaimed_balance += lockup_claim.unclaimed_balance.0; - self.lockups.replace(lockup_index as _, &lockup); - lockup_claims.push(lockup_claim); - } - } - log!("Total claim {}", total_unclaimed_balance); - - if total_unclaimed_balance > 0 { - ext_fungible_token::ft_transfer( - account_id.clone(), - total_unclaimed_balance.into(), - Some(format!( - "Claiming unlocked {} balance from {}", - total_unclaimed_balance, - env::current_account_id() - )), - &self.token_account_id, - ONE_YOCTO, - GAS_FOR_FT_TRANSFER, - ) - .then(ext_self::after_ft_transfer( - account_id, - lockup_claims, - &env::current_account_id(), - NO_DEPOSIT, - GAS_FOR_AFTER_FT_TRANSFER, - )) - .into() - } else { - PromiseOrValue::Value(0.into()) - } - } - - pub fn terminate( - &mut self, - lockup_index: LockupIndex, - hashed_schedule: Option, - ) -> PromiseOrValue { - self.assert_deposit_whitelist(&env::predecessor_account_id()); - let mut lockup = self - .lockups - .get(lockup_index as _) - .expect("Lockup not found"); - let (unvested_balance, beneficiary_id) = lockup.terminate(hashed_schedule); - self.lockups.replace(lockup_index as _, &lockup); - - // no need to store empty lockup - if lockup.schedule.total_balance() == 0 { - let lockup_account_id: AccountId = lockup.account_id.into(); - let mut indices = self - .account_lockups - .get(&lockup_account_id) - .unwrap_or_default(); - indices.remove(&lockup_index); - self.internal_save_account_lockups(&lockup_account_id, indices); - } - - if unvested_balance > 0 { - ext_fungible_token::ft_transfer( - beneficiary_id.clone().into(), - unvested_balance.into(), - Some(format!("Terminated lockup #{}", lockup_index)), - &self.token_account_id, - ONE_YOCTO, - GAS_FOR_FT_TRANSFER, - ) - .then(ext_self::after_lockup_termination( - beneficiary_id.clone().into(), - unvested_balance.into(), - &env::current_account_id(), - NO_DEPOSIT, - GAS_FOR_AFTER_FT_TRANSFER, - )) - .into() - } else { - PromiseOrValue::Value(0.into()) - } - } - - #[payable] - pub fn add_to_deposit_whitelist(&mut self, account_id: ValidAccountId) { - assert_one_yocto(); - self.assert_deposit_whitelist(&env::predecessor_account_id()); - self.deposit_whitelist.insert(account_id.as_ref()); - } - - #[payable] - pub fn remove_from_deposit_whitelist(&mut self, account_id: ValidAccountId) { - assert_one_yocto(); - self.assert_deposit_whitelist(&env::predecessor_account_id()); - self.deposit_whitelist.remove(account_id.as_ref()); - } - - pub fn create_draft_group(&mut self) -> DraftGroupIndex { - self.assert_deposit_whitelist(&env::predecessor_account_id()); - - let index = self.next_draft_group_id; - self.next_draft_group_id += 1; - assert!(self.draft_groups.insert(&index, &DraftGroup::new()).is_none(), "Invariant"); - - index - } - - pub fn create_draft(&mut self, draft: Draft) -> DraftIndex { - self.assert_deposit_whitelist(&env::predecessor_account_id()); - draft.assert_new_valid(&env::predecessor_account_id().try_into().unwrap()); - let mut draft_group = self - .draft_groups - .get(draft.draft_group_id as _) - .expect("draft group not found"); - draft_group.assert_can_add_draft(); - - let index = self.next_draft_id; - self.next_draft_id += 1; - assert!(self.drafts.insert(&index, &draft).is_none(), "Invariant"); - - draft_group.total_amount += draft.total_balance(); - draft_group.draft_indices.insert(index); - self.draft_groups - .replace(draft.draft_group_id as _, &draft_group); - - index - } - - pub fn create_drafts(&mut self, drafts: Vec) -> Vec { - drafts - .into_iter() - .map(|draft| self.create_draft(draft)) - .collect() - } - - pub fn convert_draft(&mut self, draft_id: DraftIndex) -> LockupIndex { - let draft = self.drafts.remove(&draft_id).expect("draft not found"); - let mut draft_group = self - .draft_groups - .get(draft.draft_group_id as _) - .expect("draft group not found"); - draft_group.assert_can_convert(); - - // remove draft from indices and total amount - assert!(draft_group.draft_indices.remove(&draft_id), "Invariant"); - let amount = draft.total_balance(); - assert!(draft_group.total_amount >= amount, "Invariant"); - draft_group.total_amount -= amount; - - if draft_group.draft_indices.is_empty() { - self.draft_groups - .remove(draft.draft_group_id as _); - } else { - self.draft_groups - .replace(draft.draft_group_id as _, &draft_group); - } - - let lockup = draft - .lockup_create - .into_lockup(&draft_group.beneficiary_id.unwrap()); - - let index = self.internal_add_lockup(&lockup); - log!( - "Created new lockup for {} with index {} from draft {}", - lockup.account_id.as_ref(), - index, - draft_id, - ); - - index - } - - pub fn convert_drafts(&mut self, draft_ids: Vec) -> Vec { - draft_ids - .into_iter() - .map(|draft_id| self.convert_draft(draft_id)) - .collect() - } -} diff --git a/src/lockup.rs.bak b/src/lockup.rs.bak deleted file mode 100644 index 557a131..0000000 --- a/src/lockup.rs.bak +++ /dev/null @@ -1,9 +0,0 @@ -#[derive(BorshDeserialize, BorshSerialize, Deserialize, Serialize)] -#[serde(crate = "near_sdk::serde")] -#[cfg_attr(not(target_arch = "wasm32"), derive(Debug, PartialEq, Clone))] -pub struct LockupCreate { - pub account_id: ValidAccountId, - pub schedule: Schedule, - pub vesting_schedule: Option, -} - diff --git a/tests/main.rs.bak b/tests/main.rs.bak deleted file mode 100644 index 96bef86..0000000 --- a/tests/main.rs.bak +++ /dev/null @@ -1,1503 +0,0 @@ -mod setup; - -use crate::setup::*; -use ft_lockup::lockup::Lockup; -use ft_lockup::schedule::{Checkpoint, Schedule}; -use ft_lockup::termination::{HashOrSchedule, TerminationConfig}; -use near_sdk::json_types::WrappedBalance; - -const ONE_DAY_SEC: TimestampSec = 24 * 60 * 60; -const ONE_YEAR_SEC: TimestampSec = 365 * ONE_DAY_SEC; - -const GENESIS_TIMESTAMP_SEC: TimestampSec = 1_600_000_000; - -#[test] -fn test_init_env() { - let e = Env::init(None); - let _users = Users::init(&e); -} - -#[test] -fn test_lockup_claim_logic() { - let e = Env::init(None); - let users = Users::init(&e); - let amount = d(10000, TOKEN_DECIMALS); - e.set_time_sec(GENESIS_TIMESTAMP_SEC); - let lockups = e.get_account_lockups(&users.alice); - assert!(lockups.is_empty()); - let lockup = Lockup { - account_id: users.alice.valid_account_id(), - schedule: Schedule(vec![ - Checkpoint { - timestamp: GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC - 1, - balance: 0, - }, - Checkpoint { - timestamp: GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC, - balance: amount, - }, - ]), - claimed_balance: 0, - termination_config: None, - }; - let balance: WrappedBalance = e.add_lockup(&e.owner, amount, &lockup).unwrap_json(); - assert_eq!(balance.0, amount); - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups.len(), 1); - assert_eq!(lockups[0].1.total_balance, amount); - assert_eq!(lockups[0].1.claimed_balance, 0); - assert_eq!(lockups[0].1.unclaimed_balance, 0); - - // Claim attempt before unlock. - let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); - assert_eq!(res.0, 0); - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups[0].1.claimed_balance, 0); - - // Set time to the first checkpoint. - e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC - 1); - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups[0].1.claimed_balance, 0); - assert_eq!(lockups[0].1.unclaimed_balance, 0); - - // Set time to the second checkpoint. - e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC); - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups[0].1.claimed_balance, 0); - assert_eq!(lockups[0].1.unclaimed_balance, amount); - - // Attempt to claim. No storage deposit for Alice. - let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); - assert_eq!(res.0, 0); - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups[0].1.claimed_balance, 0); - assert_eq!(lockups[0].1.unclaimed_balance, amount); - - ft_storage_deposit(&users.alice, TOKEN_ID, &users.alice.account_id); - - let balance = e.ft_balance_of(&users.alice); - assert_eq!(balance, 0); - - // Claim tokens. - let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); - assert_eq!(res.0, amount); - // User's lockups should be empty, since fully claimed. - let lockups = e.get_account_lockups(&users.alice); - assert!(lockups.is_empty()); - - // Manually checking the lockup by index - let lockup = e.get_lockup(0); - assert_eq!(lockup.claimed_balance, amount); - assert_eq!(lockup.unclaimed_balance, 0); - - let balance = e.ft_balance_of(&users.alice); - assert_eq!(balance, amount); -} - -#[test] -fn test_lockup_linear() { - let e = Env::init(None); - let users = Users::init(&e); - let amount = d(60000, TOKEN_DECIMALS); - e.set_time_sec(GENESIS_TIMESTAMP_SEC); - let lockups = e.get_account_lockups(&users.alice); - assert!(lockups.is_empty()); - let lockup = Lockup { - account_id: users.alice.valid_account_id(), - schedule: Schedule(vec![ - Checkpoint { - timestamp: GENESIS_TIMESTAMP_SEC, - balance: 0, - }, - Checkpoint { - timestamp: GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC, - balance: amount, - }, - ]), - claimed_balance: 0, - termination_config: None, - }; - let balance: WrappedBalance = e.add_lockup(&e.owner, amount, &lockup).unwrap_json(); - assert_eq!(balance.0, amount); - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups.len(), 1); - assert_eq!(lockups[0].1.total_balance, amount); - assert_eq!(lockups[0].1.claimed_balance, 0); - assert_eq!(lockups[0].1.unclaimed_balance, 0); - - // 1/3 unlock - e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC / 3); - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups[0].1.total_balance, amount); - assert_eq!(lockups[0].1.claimed_balance, 0); - assert_eq!(lockups[0].1.unclaimed_balance, amount / 3); - - // Claim tokens - ft_storage_deposit(&users.alice, TOKEN_ID, &users.alice.account_id); - let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); - assert_eq!(res.0, amount / 3); - let balance = e.ft_balance_of(&users.alice); - assert_eq!(balance, amount / 3); - - // Check lockup after claim - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups[0].1.total_balance, amount); - assert_eq!(lockups[0].1.claimed_balance, amount / 3); - assert_eq!(lockups[0].1.unclaimed_balance, 0); - - // 1/2 unlock - e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC / 2); - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups[0].1.total_balance, amount); - assert_eq!(lockups[0].1.claimed_balance, amount / 3); - assert_eq!(lockups[0].1.unclaimed_balance, amount / 6); - - // Remove storage from token to verify claim refund. - // Note, this burns `amount / 3` tokens. - storage_force_unregister(&users.alice, TOKEN_ID); - let balance = e.ft_balance_of(&users.alice); - assert_eq!(balance, 0); - - // Trying to claim, should fail and refund the amount back to the lockup - let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); - assert_eq!(res.0, 0); - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups[0].1.total_balance, amount); - assert_eq!(lockups[0].1.claimed_balance, amount / 3); - assert_eq!(lockups[0].1.unclaimed_balance, amount / 6); - - // Claim again but with storage deposit - ft_storage_deposit(&users.alice, TOKEN_ID, &users.alice.account_id); - let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); - assert_eq!(res.0, amount / 6); - let balance = e.ft_balance_of(&users.alice); - assert_eq!(balance, amount / 6); - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups[0].1.total_balance, amount); - assert_eq!(lockups[0].1.claimed_balance, amount / 2); - assert_eq!(lockups[0].1.unclaimed_balance, 0); - - // 2/3 unlock - e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 2 / 3); - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups[0].1.claimed_balance, amount / 2); - assert_eq!(lockups[0].1.unclaimed_balance, amount / 6); - - // Claim tokens - let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); - assert_eq!(res.0, amount / 6); - let balance = e.ft_balance_of(&users.alice); - assert_eq!(balance, amount / 3); - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups[0].1.claimed_balance, amount * 2 / 3); - assert_eq!(lockups[0].1.unclaimed_balance, 0); - - // Claim again with no unclaimed_balance - let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); - assert_eq!(res.0, 0); - let balance = e.ft_balance_of(&users.alice); - assert_eq!(balance, amount / 3); - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups[0].1.claimed_balance, amount * 2 / 3); - assert_eq!(lockups[0].1.unclaimed_balance, 0); - - // full unlock - e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC); - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups[0].1.claimed_balance, amount * 2 / 3); - assert_eq!(lockups[0].1.unclaimed_balance, amount / 3); - - // Final claim - let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); - assert_eq!(res.0, amount / 3); - let balance = e.ft_balance_of(&users.alice); - assert_eq!(balance, amount * 2 / 3); - - // User's lockups should be empty, since fully claimed. - let lockups = e.get_account_lockups(&users.alice); - assert!(lockups.is_empty()); - - // Manually checking the lockup by index - let lockup = e.get_lockup(0); - assert_eq!(lockup.claimed_balance, amount); - assert_eq!(lockup.unclaimed_balance, 0); -} - -#[test] -fn test_lockup_cliff_amazon() { - let e = Env::init(None); - let users = Users::init(&e); - let amount = d(60000, TOKEN_DECIMALS); - e.set_time_sec(GENESIS_TIMESTAMP_SEC); - let lockups = e.get_account_lockups(&users.alice); - assert!(lockups.is_empty()); - let lockup = Lockup { - account_id: users.alice.valid_account_id(), - schedule: Schedule(vec![ - Checkpoint { - timestamp: GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC - 1, - balance: 0, - }, - Checkpoint { - timestamp: GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC, - balance: amount / 10, - }, - Checkpoint { - timestamp: GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 2, - balance: 3 * amount / 10, - }, - Checkpoint { - timestamp: GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 3, - balance: 6 * amount / 10, - }, - Checkpoint { - timestamp: GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 4, - balance: amount, - }, - ]), - claimed_balance: 0, - termination_config: None, - }; - let balance: WrappedBalance = e.add_lockup(&e.owner, amount, &lockup).unwrap_json(); - assert_eq!(balance.0, amount); - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups.len(), 1); - assert_eq!(lockups[0].1.total_balance, amount); - assert_eq!(lockups[0].1.claimed_balance, 0); - assert_eq!(lockups[0].1.unclaimed_balance, 0); - - // 1/12 time. pre-cliff unlock - e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC / 3); - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups[0].1.total_balance, amount); - assert_eq!(lockups[0].1.claimed_balance, 0); - assert_eq!(lockups[0].1.unclaimed_balance, 0); - - // 1/4 time. cliff unlock - e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC); - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups[0].1.total_balance, amount); - assert_eq!(lockups[0].1.claimed_balance, 0); - assert_eq!(lockups[0].1.unclaimed_balance, amount / 10); - - // 3/8 time. cliff unlock + 1/2 of 2nd year. - e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC + ONE_YEAR_SEC / 2); - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups[0].1.unclaimed_balance, 2 * amount / 10); - - // 1/2 time. - e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 2); - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups[0].1.unclaimed_balance, 3 * amount / 10); - - // 1/2 + 1/12 time. - e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 2 + ONE_YEAR_SEC / 3); - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups[0].1.unclaimed_balance, 4 * amount / 10); - - // 1/2 + 2/12 time. - e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 2 + ONE_YEAR_SEC * 2 / 3); - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups[0].1.unclaimed_balance, 5 * amount / 10); - - // 3/4 time. - e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 3); - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups[0].1.unclaimed_balance, 6 * amount / 10); - - // 7/8 time. - e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 3 + ONE_YEAR_SEC / 2); - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups[0].1.unclaimed_balance, 8 * amount / 10); - - // full unlock. - e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 4); - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups[0].1.unclaimed_balance, amount); - - // after unlock. - e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 5); - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups[0].1.unclaimed_balance, amount); - - // attempt to claim without storage. - let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); - assert_eq!(res.0, 0); - let balance = e.ft_balance_of(&users.alice); - assert_eq!(balance, 0); - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups[0].1.unclaimed_balance, amount); - - // Claim tokens - ft_storage_deposit(&users.alice, TOKEN_ID, &users.alice.account_id); - let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); - assert_eq!(res.0, amount); - let balance = e.ft_balance_of(&users.alice); - assert_eq!(balance, amount); - - // Check lockup after claim - let lockups = e.get_account_lockups(&users.alice); - assert!(lockups.is_empty()); - let lockup = e.get_lockup(0); - assert_eq!(lockup.claimed_balance, amount); - assert_eq!(lockup.unclaimed_balance, 0); -} - -#[test] -fn test_lockup_terminate_no_vesting_schedule() { - let e = Env::init(None); - let users = Users::init(&e); - let amount = d(60000, TOKEN_DECIMALS); - e.set_time_sec(GENESIS_TIMESTAMP_SEC); - let lockups = e.get_account_lockups(&users.alice); - assert!(lockups.is_empty()); - let lockup = Lockup { - account_id: users.alice.valid_account_id(), - schedule: Schedule(vec![ - Checkpoint { - timestamp: GENESIS_TIMESTAMP_SEC, - balance: 0, - }, - Checkpoint { - timestamp: GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC, - balance: amount, - }, - ]), - claimed_balance: 0, - termination_config: Some(TerminationConfig { - terminator_id: users.eve.valid_account_id(), - vesting_schedule: None, - }), - }; - - let balance: WrappedBalance = e.add_lockup(&e.owner, amount, &lockup).unwrap_json(); - assert_eq!(balance.0, amount); - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups.len(), 1); - assert_eq!(lockups[0].1.total_balance, amount); - assert_eq!(lockups[0].1.claimed_balance, 0); - assert_eq!(lockups[0].1.unclaimed_balance, 0); - - // 1/3 unlock - e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC / 3); - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups[0].1.total_balance, amount); - assert_eq!(lockups[0].1.claimed_balance, 0); - assert_eq!(lockups[0].1.unclaimed_balance, amount / 3); - - // Claim tokens - ft_storage_deposit(&users.alice, TOKEN_ID, &users.alice.account_id); - let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); - assert_eq!(res.0, amount / 3); - let balance = e.ft_balance_of(&users.alice); - assert_eq!(balance, amount / 3); - - // Check lockup after claim - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups[0].1.total_balance, amount); - assert_eq!(lockups[0].1.claimed_balance, amount / 3); - assert_eq!(lockups[0].1.unclaimed_balance, 0); - - // 1/2 unlock - e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC / 2); - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups[0].1.total_balance, amount); - assert_eq!(lockups[0].1.claimed_balance, amount / 3); - assert_eq!(lockups[0].1.unclaimed_balance, amount / 6); - - let lockup_index = lockups[0].0; - - // TERMINATE - ft_storage_deposit(&users.eve, TOKEN_ID, &users.eve.account_id); - let res: WrappedBalance = e.terminate(&users.eve, lockup_index).unwrap_json(); - assert_eq!(res.0, amount / 2); - - let terminator_balance = e.ft_balance_of(&users.eve); - assert_eq!(terminator_balance, amount / 2); - - // full unlock 2 / 3 period after termination before initial timestamp - e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 2 / 3); - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups[0].1.claimed_balance, amount / 3); - assert_eq!(lockups[0].1.unclaimed_balance, amount / 6); - - // Final claim - let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); - assert_eq!(res.0, amount / 6); - let balance = e.ft_balance_of(&users.alice); - assert_eq!(balance, amount / 2); - - // User's lockups should be empty, since fully claimed. - let lockups = e.get_account_lockups(&users.alice); - assert!(lockups.is_empty()); - - // Manually checking the lockup by index - let lockup = e.get_lockup(0); - assert_eq!(lockup.claimed_balance, amount / 2); - assert_eq!(lockup.unclaimed_balance, 0); -} - -#[test] -fn test_lockup_terminate_no_termination_config() { - let e = Env::init(None); - let users = Users::init(&e); - let amount = d(60000, TOKEN_DECIMALS); - e.set_time_sec(GENESIS_TIMESTAMP_SEC); - let lockups = e.get_account_lockups(&users.alice); - assert!(lockups.is_empty()); - let lockup = Lockup { - account_id: users.alice.valid_account_id(), - schedule: Schedule(vec![ - Checkpoint { - timestamp: GENESIS_TIMESTAMP_SEC, - balance: 0, - }, - Checkpoint { - timestamp: GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC, - balance: amount, - }, - ]), - claimed_balance: 0, - termination_config: None, - }; - - let balance: WrappedBalance = e.add_lockup(&e.owner, amount, &lockup).unwrap_json(); - assert_eq!(balance.0, amount); - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups.len(), 1); - let lockup_index = lockups[0].0; - assert_eq!(lockups[0].1.total_balance, amount); - assert_eq!(lockups[0].1.claimed_balance, 0); - assert_eq!(lockups[0].1.unclaimed_balance, 0); - - // TERMINATE - ft_storage_deposit(&users.eve, TOKEN_ID, &users.eve.account_id); - let res = e.terminate(&users.eve, lockup_index); - assert!(!res.is_ok()); - assert!(format!("{:?}", res.status()).contains("No termination config")); -} - -#[test] -fn test_lockup_terminate_wrong_terminator() { - let e = Env::init(None); - let users = Users::init(&e); - let amount = d(60000, TOKEN_DECIMALS); - e.set_time_sec(GENESIS_TIMESTAMP_SEC); - let lockups = e.get_account_lockups(&users.alice); - assert!(lockups.is_empty()); - let lockup = Lockup { - account_id: users.alice.valid_account_id(), - schedule: Schedule(vec![ - Checkpoint { - timestamp: GENESIS_TIMESTAMP_SEC, - balance: 0, - }, - Checkpoint { - timestamp: GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC, - balance: amount, - }, - ]), - claimed_balance: 0, - termination_config: Some(TerminationConfig { - terminator_id: users.eve.valid_account_id(), - vesting_schedule: None, - }), - }; - - let balance: WrappedBalance = e.add_lockup(&e.owner, amount, &lockup).unwrap_json(); - assert_eq!(balance.0, amount); - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups.len(), 1); - let lockup_index = lockups[0].0; - assert_eq!(lockups[0].1.total_balance, amount); - assert_eq!(lockups[0].1.claimed_balance, 0); - assert_eq!(lockups[0].1.unclaimed_balance, 0); - - // TERMINATE - ft_storage_deposit(&users.dude, TOKEN_ID, &users.dude.account_id); - let res = e.terminate(&users.dude, lockup_index); - assert!(!res.is_ok()); - assert!(format!("{:?}", res.status()).contains("Unauthorized")); -} - -#[test] -fn test_lockup_terminate_no_storage() { - let e = Env::init(None); - let users = Users::init(&e); - let amount = d(60000, TOKEN_DECIMALS); - e.set_time_sec(GENESIS_TIMESTAMP_SEC); - let lockups = e.get_account_lockups(&users.alice); - assert!(lockups.is_empty()); - let lockup = Lockup { - account_id: users.alice.valid_account_id(), - schedule: Schedule(vec![ - Checkpoint { - timestamp: GENESIS_TIMESTAMP_SEC, - balance: 0, - }, - Checkpoint { - timestamp: GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC, - balance: amount, - }, - ]), - claimed_balance: 0, - termination_config: Some(TerminationConfig { - terminator_id: users.eve.valid_account_id(), - vesting_schedule: None, - }), - }; - - let balance: WrappedBalance = e.add_lockup(&e.owner, amount, &lockup).unwrap_json(); - assert_eq!(balance.0, amount); - let lockups = e.get_account_lockups(&users.alice); - let lockup_index = lockups[0].0; - - // 1/3 unlock, terminate - e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC / 3); - // Claim tokens - // TERMINATE, without deposit must create unlocked lockup for terminator - let res: WrappedBalance = e.terminate(&users.eve, lockup_index).unwrap_json(); - assert_eq!(res.0, 0); - - ft_storage_deposit(&users.eve, TOKEN_ID, &users.eve.account_id); - let terminator_balance = e.ft_balance_of(&users.eve); - assert_eq!(terminator_balance, 0); - - { - let lockups = e.get_account_lockups(&users.eve); - assert_eq!(lockups.len(), 1); - assert_eq!(lockups[0].1.claimed_balance, 0); - assert_eq!(lockups[0].1.unclaimed_balance, amount * 2 / 3); - let terminator_lockup_index = lockups[0].0; - - // Claim from lockup refund - let res: WrappedBalance = e.claim(&users.eve).unwrap_json(); - assert_eq!(res.0, amount * 2 / 3); - let balance = e.ft_balance_of(&users.eve); - assert_eq!(balance, amount * 2 / 3); - - // Terminator's lockups should be empty, since fully claimed. - let lockups = e.get_account_lockups(&users.eve); - assert!(lockups.is_empty()); - - // Manually checking the terminator's lockup by index - let lockup = e.get_lockup(terminator_lockup_index); - assert_eq!(lockup.claimed_balance, amount * 2 / 3); - assert_eq!(lockup.unclaimed_balance, 0); - } - - { - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups.len(), 1); - assert_eq!(lockups[0].1.claimed_balance, 0); - assert_eq!(lockups[0].1.unclaimed_balance, amount / 3); - - // Claim by user - ft_storage_deposit(&users.alice, TOKEN_ID, &users.alice.account_id); - let balance = e.ft_balance_of(&users.alice); - assert_eq!(balance, 0); - - let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); - assert_eq!(res.0, amount / 3); - let balance = e.ft_balance_of(&users.alice); - assert_eq!(balance, amount / 3); - - // User's lockups should be empty, since fully claimed. - let lockups = e.get_account_lockups(&users.alice); - assert!(lockups.is_empty()); - - // Manually checking the terminator's lockup by index - let lockup = e.get_lockup(lockup_index); - assert_eq!(lockup.claimed_balance, amount / 3); - assert_eq!(lockup.unclaimed_balance, 0); - } -} - -fn lockup_vesting_schedule(amount: u128) -> (Schedule, Schedule) { - let lockup_schedule = Schedule(vec![ - Checkpoint { - timestamp: GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 2, - balance: 0, - }, - Checkpoint { - timestamp: GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 4, - balance: amount * 3 / 4, - }, - Checkpoint { - timestamp: GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 4 + 1, - balance: amount, - }, - ]); - let vesting_schedule = Schedule(vec![ - Checkpoint { - timestamp: GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC - 1, - balance: 0, - }, - Checkpoint { - timestamp: GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC, - balance: amount / 4, - }, - Checkpoint { - timestamp: GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 4, - balance: amount, - }, - ]); - (lockup_schedule, vesting_schedule) -} - -#[test] -fn test_lockup_terminate_custom_vesting_hash() { - let e = Env::init(None); - let users = Users::init(&e); - let amount = d(60000, TOKEN_DECIMALS); - e.set_time_sec(GENESIS_TIMESTAMP_SEC); - let lockups = e.get_account_lockups(&users.alice); - assert!(lockups.is_empty()); - - let (lockup_schedule, vesting_schedule) = lockup_vesting_schedule(amount); - let vesting_hash = e.hash_schedule(&vesting_schedule); - let lockup = Lockup { - account_id: users.alice.valid_account_id(), - schedule: lockup_schedule, - claimed_balance: 0, - termination_config: Some(TerminationConfig { - terminator_id: users.eve.valid_account_id(), - vesting_schedule: Some(HashOrSchedule::Hash(vesting_hash)), - }), - }; - - let balance: WrappedBalance = e.add_lockup(&e.owner, amount, &lockup).unwrap_json(); - assert_eq!(balance.0, amount); - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups.len(), 1); - let lockup_index = lockups[0].0; - - // 1Y, 1 / 4 vested, 0 unlocked - e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC); - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups[0].1.total_balance, amount); - assert_eq!(lockups[0].1.claimed_balance, 0); - assert_eq!(lockups[0].1.unclaimed_balance, 0); - - // TERMINATE - ft_storage_deposit(&users.eve, TOKEN_ID, &users.eve.account_id); - let res: WrappedBalance = e - .terminate_with_schedule(&users.eve, lockup_index, vesting_schedule) - .unwrap_json(); - assert_eq!(res.0, amount * 3 / 4); - let terminator_balance = e.ft_balance_of(&users.eve); - assert_eq!(terminator_balance, amount * 3 / 4); - - // Checking lockup - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups[0].1.total_balance, amount / 4); - assert_eq!(lockups[0].1.claimed_balance, 0); - assert_eq!(lockups[0].1.unclaimed_balance, 0); - - // Rewind to 2Y + Y * 2 / 3, 1/4 of original unlock, full vested unlock - e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 2 + ONE_YEAR_SEC * 2 / 3); - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups[0].1.total_balance, amount / 4); - assert_eq!(lockups[0].1.claimed_balance, 0); - assert_eq!(lockups[0].1.unclaimed_balance, amount / 4); - - // claiming - ft_storage_deposit(&users.alice, TOKEN_ID, &users.alice.account_id); - let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); - assert_eq!(res.0, amount / 4); - - // Checking lockups - let lockups = e.get_account_lockups(&users.alice); - assert!(lockups.is_empty()); - - // User lockups are empty - let lockup = e.get_lockup(lockup_index); - assert_eq!(lockup.total_balance, amount / 4); - assert_eq!(lockup.claimed_balance, amount / 4); - assert_eq!(lockup.unclaimed_balance, 0); -} - -#[test] -fn test_lockup_terminate_custom_vesting_invalid_hash() { - let e = Env::init(None); - let users = Users::init(&e); - let amount = d(60000, TOKEN_DECIMALS); - e.set_time_sec(GENESIS_TIMESTAMP_SEC); - let lockups = e.get_account_lockups(&users.alice); - assert!(lockups.is_empty()); - - let (lockup_schedule, vesting_schedule) = lockup_vesting_schedule(amount); - let vesting_hash = e.hash_schedule(&vesting_schedule); - let lockup = Lockup { - account_id: users.alice.valid_account_id(), - schedule: lockup_schedule, - claimed_balance: 0, - termination_config: Some(TerminationConfig { - terminator_id: users.eve.valid_account_id(), - vesting_schedule: Some(HashOrSchedule::Hash(vesting_hash)), - }), - }; - - let balance: WrappedBalance = e.add_lockup(&e.owner, amount, &lockup).unwrap_json(); - assert_eq!(balance.0, amount); - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups.len(), 1); - let lockup_index = lockups[0].0; - - // 1Y, 1 / 4 vested, 0 unlocked - e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC); - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups[0].1.total_balance, amount); - assert_eq!(lockups[0].1.claimed_balance, 0); - assert_eq!(lockups[0].1.unclaimed_balance, 0); - - // TERMINATE - let fake_schedule = Schedule(vec![ - Checkpoint { - timestamp: GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 2, - balance: 0, - }, - Checkpoint { - timestamp: GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 4, - balance: amount, - }, - ]); - ft_storage_deposit(&users.eve, TOKEN_ID, &users.eve.account_id); - let res = e.terminate_with_schedule(&users.eve, lockup_index, fake_schedule); - assert!(!res.is_ok()); - assert!(format!("{:?}", res.status()).contains("The revealed schedule hash doesn't match")); -} - -#[test] -fn test_lockup_terminate_custom_vesting_incompatible_vesting_schedule_by_hash() { - let e = Env::init(None); - let users = Users::init(&e); - let amount = d(60000, TOKEN_DECIMALS); - e.set_time_sec(GENESIS_TIMESTAMP_SEC); - let lockups = e.get_account_lockups(&users.alice); - assert!(lockups.is_empty()); - - let (lockup_schedule, _vesting_schedule) = lockup_vesting_schedule(amount); - let incompatible_vesting_schedule = Schedule(vec![ - Checkpoint { - timestamp: GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 4, - balance: 0, - }, - Checkpoint { - timestamp: GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 4 + 1, - balance: amount, - }, - ]); - let incompatible_vesting_hash = e.hash_schedule(&incompatible_vesting_schedule); - let lockup = Lockup { - account_id: users.alice.valid_account_id(), - schedule: lockup_schedule, - claimed_balance: 0, - termination_config: Some(TerminationConfig { - terminator_id: users.eve.valid_account_id(), - vesting_schedule: Some(HashOrSchedule::Hash(incompatible_vesting_hash)), - }), - }; - - let balance: WrappedBalance = e.add_lockup(&e.owner, amount, &lockup).unwrap_json(); - assert_eq!(balance.0, amount); - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups.len(), 1); - let lockup_index = lockups[0].0; - - // 1Y, 1 / 4 vested, 0 unlocked - e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC); - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups[0].1.total_balance, amount); - assert_eq!(lockups[0].1.claimed_balance, 0); - assert_eq!(lockups[0].1.unclaimed_balance, 0); - - // TERMINATE - ft_storage_deposit(&users.eve, TOKEN_ID, &users.eve.account_id); - let res = e.terminate_with_schedule(&users.eve, lockup_index, incompatible_vesting_schedule); - assert!(!res.is_ok()); - assert!(format!("{:?}", res.status()).contains("The lockup schedule is ahead of")); -} - -#[test] -fn test_validate_schedule() { - let e = Env::init(None); - let users = Users::init(&e); - let amount = d(60000, TOKEN_DECIMALS); - e.set_time_sec(GENESIS_TIMESTAMP_SEC); - let lockups = e.get_account_lockups(&users.alice); - assert!(lockups.is_empty()); - - let (lockup_schedule, vesting_schedule) = lockup_vesting_schedule(amount); - - let res = e.validate_schedule(&lockup_schedule, amount.into(), Some(&vesting_schedule)); - assert!(res.is_ok()); - - let incompatible_vesting_schedule = Schedule(vec![ - Checkpoint { - timestamp: GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 4, - balance: 0, - }, - Checkpoint { - timestamp: GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 4 + 1, - balance: amount, - }, - ]); - let res = e.validate_schedule( - &lockup_schedule, - amount.into(), - Some(&incompatible_vesting_schedule), - ); - assert!(!res.is_ok()); - assert!(format!("{:?}", res.unwrap_err()).contains("The lockup schedule is ahead of")); -} - -#[test] -fn test_lockup_terminate_custom_vesting_terminate_before_cliff() { - let e = Env::init(None); - let users = Users::init(&e); - let amount = d(60000, TOKEN_DECIMALS); - e.set_time_sec(GENESIS_TIMESTAMP_SEC); - let lockups = e.get_account_lockups(&users.alice); - assert!(lockups.is_empty()); - - let (lockup_schedule, vesting_schedule) = lockup_vesting_schedule(amount); - let lockup = Lockup { - account_id: users.alice.valid_account_id(), - schedule: lockup_schedule, - claimed_balance: 0, - termination_config: Some(TerminationConfig { - terminator_id: users.eve.valid_account_id(), - vesting_schedule: Some(HashOrSchedule::Schedule(vesting_schedule)), - }), - }; - - let balance: WrappedBalance = e.add_lockup(&e.owner, amount, &lockup).unwrap_json(); - assert_eq!(balance.0, amount); - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups.len(), 1); - let lockup_index = lockups[0].0; - - // 1Y - 1 before cliff termination - e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC - 1); - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups[0].1.total_balance, amount); - assert_eq!(lockups[0].1.claimed_balance, 0); - assert_eq!(lockups[0].1.unclaimed_balance, 0); - - // TERMINATE - ft_storage_deposit(&users.eve, TOKEN_ID, &users.eve.account_id); - let res: WrappedBalance = e.terminate(&users.eve, lockup_index).unwrap_json(); - assert_eq!(res.0, amount); - - let terminator_balance = e.ft_balance_of(&users.eve); - assert_eq!(terminator_balance, amount); - - // Checking lockup - - // after ALL the schedules have finished - - let lockups = e.get_account_lockups(&users.alice); - assert!(lockups.is_empty()); - - let lockup = e.get_lockup(lockup_index); - assert_eq!(lockup.total_balance, 0); - assert_eq!(lockup.claimed_balance, 0); - assert_eq!(lockup.unclaimed_balance, 0); - - // Trying to claim - ft_storage_deposit(&users.alice, TOKEN_ID, &users.alice.account_id); - let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); - assert_eq!(res.0, 0); - - let balance = e.ft_balance_of(&users.alice); - assert_eq!(balance, 0); -} - -#[test] -fn test_lockup_terminate_custom_vesting_before_release() { - let e = Env::init(None); - let users = Users::init(&e); - let amount = d(60000, TOKEN_DECIMALS); - e.set_time_sec(GENESIS_TIMESTAMP_SEC); - let lockups = e.get_account_lockups(&users.alice); - assert!(lockups.is_empty()); - - let (lockup_schedule, vesting_schedule) = lockup_vesting_schedule(amount); - let lockup = Lockup { - account_id: users.alice.valid_account_id(), - schedule: lockup_schedule, - claimed_balance: 0, - termination_config: Some(TerminationConfig { - terminator_id: users.eve.valid_account_id(), - vesting_schedule: Some(HashOrSchedule::Schedule(vesting_schedule)), - }), - }; - - let balance: WrappedBalance = e.add_lockup(&e.owner, amount, &lockup).unwrap_json(); - assert_eq!(balance.0, amount); - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups.len(), 1); - let lockup_index = lockups[0].0; - - // 1Y, 1 / 4 vested, 0 unlocked - e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC); - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups[0].1.total_balance, amount); - assert_eq!(lockups[0].1.claimed_balance, 0); - assert_eq!(lockups[0].1.unclaimed_balance, 0); - - // TERMINATE - ft_storage_deposit(&users.eve, TOKEN_ID, &users.eve.account_id); - let res: WrappedBalance = e.terminate(&users.eve, lockup_index).unwrap_json(); - assert_eq!(res.0, amount * 3 / 4); - let terminator_balance = e.ft_balance_of(&users.eve); - assert_eq!(terminator_balance, amount * 3 / 4); - - // Checking lockup - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups[0].1.total_balance, amount / 4); - assert_eq!(lockups[0].1.claimed_balance, 0); - assert_eq!(lockups[0].1.unclaimed_balance, 0); - - // Trying to claim - ft_storage_deposit(&users.alice, TOKEN_ID, &users.alice.account_id); - let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); - assert_eq!(res.0, 0); - - // Rewind to 2Y + Y/3, 1/8 of original should be unlocked - e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 2 + ONE_YEAR_SEC / 3); - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups[0].1.total_balance, amount / 4); - assert_eq!(lockups[0].1.claimed_balance, 0); - assert_eq!(lockups[0].1.unclaimed_balance, amount / 8); - - // claiming - let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); - assert_eq!(res.0, amount / 8); - - // Rewind to 2Y + Y * 2 / 3, 1/4 of original unlock, full vested unlock - e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 2 + ONE_YEAR_SEC * 2 / 3); - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups[0].1.total_balance, amount / 4); - assert_eq!(lockups[0].1.claimed_balance, amount / 8); - assert_eq!(lockups[0].1.unclaimed_balance, amount / 8); - - // claiming - let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); - assert_eq!(res.0, amount / 8); - - // Checking lockups - let lockups = e.get_account_lockups(&users.alice); - assert!(lockups.is_empty()); - - // User lockups are empty - let lockup = e.get_lockup(lockup_index); - assert_eq!(lockup.total_balance, amount / 4); - assert_eq!(lockup.claimed_balance, amount / 4); - assert_eq!(lockup.unclaimed_balance, 0); -} - -#[test] -fn test_lockup_terminate_custom_vesting_during_release() { - let e = Env::init(None); - let users = Users::init(&e); - let amount = d(60000, TOKEN_DECIMALS); - e.set_time_sec(GENESIS_TIMESTAMP_SEC); - let lockups = e.get_account_lockups(&users.alice); - assert!(lockups.is_empty()); - - let (lockup_schedule, vesting_schedule) = lockup_vesting_schedule(amount); - let lockup = Lockup { - account_id: users.alice.valid_account_id(), - schedule: lockup_schedule, - claimed_balance: 0, - termination_config: Some(TerminationConfig { - terminator_id: users.eve.valid_account_id(), - vesting_schedule: Some(HashOrSchedule::Schedule(vesting_schedule)), - }), - }; - - let balance: WrappedBalance = e.add_lockup(&e.owner, amount, &lockup).unwrap_json(); - assert_eq!(balance.0, amount); - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups.len(), 1); - let lockup_index = lockups[0].0; - - // 2Y + Y / 3, 1/8 unlocked - e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 2 + ONE_YEAR_SEC / 3); - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups[0].1.total_balance, amount); - assert_eq!(lockups[0].1.claimed_balance, 0); - assert_eq!(lockups[0].1.unclaimed_balance, amount / 8); - - // Trying to claim - ft_storage_deposit(&users.alice, TOKEN_ID, &users.alice.account_id); - let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); - assert_eq!(res.0, amount / 8); - - // TERMINATE, 2Y + Y / 2, 5/8 unlocked - e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 2 + ONE_YEAR_SEC / 2); - ft_storage_deposit(&users.eve, TOKEN_ID, &users.eve.account_id); - let res: WrappedBalance = e.terminate(&users.eve, lockup_index).unwrap_json(); - assert_eq!(res.0, amount * 3 / 8); - let terminator_balance = e.ft_balance_of(&users.eve); - assert_eq!(terminator_balance, amount * 3 / 8); - - // Checking lockup - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups[0].1.total_balance, amount * 5 / 8); - assert_eq!(lockups[0].1.claimed_balance, amount / 8); - assert_eq!(lockups[0].1.unclaimed_balance, amount / 16); - - // Rewind to 2Y + Y*2/3, 1/4 of original should be unlocked - e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 2 + ONE_YEAR_SEC * 2 / 3); - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups[0].1.total_balance, amount * 5 / 8); - assert_eq!(lockups[0].1.claimed_balance, amount / 8); - assert_eq!(lockups[0].1.unclaimed_balance, amount / 8); - - // claiming - let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); - assert_eq!(res.0, amount / 8); - - // Rewind to 3Y + Y * 2 / 3, 5/8 of original unlock, full vested unlock - e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 3 + ONE_YEAR_SEC * 2 / 3); - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups[0].1.total_balance, amount * 5 / 8); - assert_eq!(lockups[0].1.claimed_balance, amount * 2 / 8); - assert_eq!(lockups[0].1.unclaimed_balance, amount * 3 / 8); - - // claiming - let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); - assert_eq!(res.0, amount * 3 / 8); - - // Checking lockups - let lockups = e.get_account_lockups(&users.alice); - assert!(lockups.is_empty()); - - // User lockups are empty - let lockup = e.get_lockup(lockup_index); - assert_eq!(lockup.total_balance, amount * 5 / 8); - assert_eq!(lockup.claimed_balance, amount * 5 / 8); - assert_eq!(lockup.unclaimed_balance, 0); -} - -#[test] -fn test_lockup_terminate_custom_vesting_during_lockup_cliff() { - let e = Env::init(None); - let users = Users::init(&e); - let amount = d(60000, TOKEN_DECIMALS); - e.set_time_sec(GENESIS_TIMESTAMP_SEC); - let lockups = e.get_account_lockups(&users.alice); - assert!(lockups.is_empty()); - - let (lockup_schedule, vesting_schedule) = lockup_vesting_schedule(amount); - let lockup = Lockup { - account_id: users.alice.valid_account_id(), - schedule: lockup_schedule, - claimed_balance: 0, - termination_config: Some(TerminationConfig { - terminator_id: users.eve.valid_account_id(), - vesting_schedule: Some(HashOrSchedule::Schedule(vesting_schedule)), - }), - }; - - let balance: WrappedBalance = e.add_lockup(&e.owner, amount, &lockup).unwrap_json(); - assert_eq!(balance.0, amount); - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups.len(), 1); - let lockup_index = lockups[0].0; - - // 2Y + Y * 2 / 3, 1/8 unlocked - e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 2 + ONE_YEAR_SEC * 2 / 3); - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups[0].1.total_balance, amount); - assert_eq!(lockups[0].1.claimed_balance, 0); - assert_eq!(lockups[0].1.unclaimed_balance, amount / 4); - - // Trying to claim - ft_storage_deposit(&users.alice, TOKEN_ID, &users.alice.account_id); - let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); - assert_eq!(res.0, amount / 4); - - // TERMINATE, 3Y + Y / 3, 5/6 unlocked - e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 3 + ONE_YEAR_SEC / 3); - ft_storage_deposit(&users.eve, TOKEN_ID, &users.eve.account_id); - let res: WrappedBalance = e.terminate(&users.eve, lockup_index).unwrap_json(); - assert_eq!(res.0, amount / 6); - let terminator_balance = e.ft_balance_of(&users.eve); - assert_eq!(terminator_balance, amount / 6); - - // Checking lockup - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups[0].1.total_balance, amount * 5 / 6); - assert_eq!(lockups[0].1.claimed_balance, amount / 4); - assert_eq!(lockups[0].1.unclaimed_balance, amount / 4); - - // claiming - let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); - assert_eq!(res.0, amount / 4); - - // Rewind to 4Y - e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 4); - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups[0].1.total_balance, amount * 5 / 6); - assert_eq!(lockups[0].1.claimed_balance, amount * 1 / 2); - assert_eq!(lockups[0].1.unclaimed_balance, amount * 1 / 4); - - // Rewind to 4Y + 1, full unlock including part of cliff - e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 4 + 1); - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups[0].1.total_balance, amount * 5 / 6); - assert_eq!(lockups[0].1.claimed_balance, amount * 1 / 2); - assert_eq!(lockups[0].1.unclaimed_balance, amount * 1 / 3); - - // claiming - let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); - assert_eq!(res.0, amount * 1 / 3); - - // Checking lockups - let lockups = e.get_account_lockups(&users.alice); - assert!(lockups.is_empty()); - - // User lockups are empty - let lockup = e.get_lockup(lockup_index); - assert_eq!(lockup.total_balance, amount * 5 / 6); - assert_eq!(lockup.claimed_balance, amount * 5 / 6); - assert_eq!(lockup.unclaimed_balance, 0); -} - -#[test] -fn test_lockup_terminate_custom_vesting_after_vesting_finished() { - let e = Env::init(None); - let users = Users::init(&e); - let amount = d(60000, TOKEN_DECIMALS); - e.set_time_sec(GENESIS_TIMESTAMP_SEC); - let lockups = e.get_account_lockups(&users.alice); - assert!(lockups.is_empty()); - - let (lockup_schedule, vesting_schedule) = lockup_vesting_schedule(amount); - let lockup = Lockup { - account_id: users.alice.valid_account_id(), - schedule: lockup_schedule, - claimed_balance: 0, - termination_config: Some(TerminationConfig { - terminator_id: users.eve.valid_account_id(), - vesting_schedule: Some(HashOrSchedule::Schedule(vesting_schedule)), - }), - }; - - let balance: WrappedBalance = e.add_lockup(&e.owner, amount, &lockup).unwrap_json(); - assert_eq!(balance.0, amount); - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups.len(), 1); - let lockup_index = lockups[0].0; - - // 2Y + Y * 2 / 3, 1/8 unlocked - e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 2 + ONE_YEAR_SEC * 2 / 3); - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups[0].1.total_balance, amount); - assert_eq!(lockups[0].1.claimed_balance, 0); - assert_eq!(lockups[0].1.unclaimed_balance, amount / 4); - - // Trying to claim - ft_storage_deposit(&users.alice, TOKEN_ID, &users.alice.account_id); - let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); - assert_eq!(res.0, amount / 4); - - // TERMINATE, 4Y, fully vested - e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 4); - ft_storage_deposit(&users.eve, TOKEN_ID, &users.eve.account_id); - let res: WrappedBalance = e.terminate(&users.eve, lockup_index).unwrap_json(); - assert_eq!(res.0, 0); - let terminator_balance = e.ft_balance_of(&users.eve); - assert_eq!(terminator_balance, 0); - - // Checking lockup - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups[0].1.total_balance, amount); - assert_eq!(lockups[0].1.claimed_balance, amount / 4); - assert_eq!(lockups[0].1.unclaimed_balance, amount / 2); - - // claiming - let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); - assert_eq!(res.0, amount / 2); - - // Rewind to 4Y + 1, full unlock including part of cliff - e.set_time_sec(GENESIS_TIMESTAMP_SEC + ONE_YEAR_SEC * 4 + 1); - let lockups = e.get_account_lockups(&users.alice); - assert_eq!(lockups[0].1.total_balance, amount); - assert_eq!(lockups[0].1.claimed_balance, amount * 3 / 4); - assert_eq!(lockups[0].1.unclaimed_balance, amount * 1 / 4); - - // Claiming - let res: WrappedBalance = e.claim(&users.alice).unwrap_json(); - assert_eq!(res.0, amount * 1 / 4); - - // Checking lockups - let lockups = e.get_account_lockups(&users.alice); - assert!(lockups.is_empty()); - - // Checking by index - let lockup = e.get_lockup(lockup_index); - assert_eq!(lockup.total_balance, amount); - assert_eq!(lockup.claimed_balance, amount); - assert_eq!(lockup.unclaimed_balance, 0); -} - -#[test] -fn test_deposit_whitelist_get() { - let e = Env::init(None); - let users = Users::init(&e); - let amount = d(1, TOKEN_DECIMALS); - e.set_time_sec(GENESIS_TIMESTAMP_SEC); - let lockups = e.get_account_lockups(&users.alice); - assert!(lockups.is_empty()); - - // deposit whitelist has owner by default - let deposit_whitelist = e.get_deposit_whitelist(); - assert_eq!(deposit_whitelist, vec![e.owner.account_id.clone()]); - - // user from whitelist can create lockups - let lockup = Lockup { - account_id: users.alice.valid_account_id(), - schedule: Schedule(vec![ - Checkpoint { - timestamp: 0, - balance: 0, - }, - Checkpoint { - timestamp: 1, - balance: amount, - }, - ]), - claimed_balance: 0, - termination_config: None, - }; - let balance: WrappedBalance = e.add_lockup(&e.owner, amount, &lockup).unwrap_json(); - assert_eq!(balance.0, amount); - let lockups = e.get_account_lockups(&users.alice); - // not increased - assert_eq!(lockups.len(), 1); - - // user from whitelist can add other users - let res = e.add_to_deposit_whitelist(&e.owner, &users.eve.valid_account_id()); - assert!(res.is_ok()); - - let deposit_whitelist = e.get_deposit_whitelist(); - assert_eq!( - deposit_whitelist, - vec![e.owner.account_id.clone(), users.eve.account_id.clone()] - ); - - // user from whiltelist can remove other users - let res = e.remove_from_deposit_whitelist(&users.eve, &e.owner.valid_account_id()); - assert!(res.is_ok()); - - let deposit_whitelist = e.get_deposit_whitelist(); - assert_eq!(deposit_whitelist, vec![users.eve.account_id.clone()]); - - // user not from whitelist cannot add users - let res = e.add_to_deposit_whitelist(&e.owner, &users.dude.valid_account_id()); - assert!(!res.is_ok()); - assert!(format!("{:?}", res.status()).contains("Not in deposit whitelist")); - - // user not from whitelist cannot remove users - let res = e.remove_from_deposit_whitelist(&e.owner, &users.eve.valid_account_id()); - assert!(!res.is_ok()); - assert!(format!("{:?}", res.status()).contains("Not in deposit whitelist")); - - // user not in whitelist cannot create lockups - let res = e.add_lockup(&e.owner, amount, &lockup); - let balance: WrappedBalance = res.unwrap_json(); - assert_eq!(balance.0, 0); - assert!(res.logs()[0].contains("Refund")); - let lockups = e.get_account_lockups(&users.alice); - // not increased - assert_eq!(lockups.len(), 1); - - // user from whiltelist can remove itself from the list, even if it's the last user - let res = e.remove_from_deposit_whitelist(&users.eve, &users.eve.valid_account_id()); - assert!(res.is_ok()); - let deposit_whitelist = e.get_deposit_whitelist(); - assert!(deposit_whitelist.is_empty()); -} - -#[test] -fn test_get_lockups() { - let e = Env::init(None); - let users = Users::init(&e); - let amount = d(1, TOKEN_DECIMALS); - e.set_time_sec(GENESIS_TIMESTAMP_SEC); - let lockups = e.get_account_lockups(&users.alice); - assert!(lockups.is_empty()); - - // create some lockups - for user in vec![&users.alice, &users.bob, &users.charlie] { - let balance: WrappedBalance = e - .add_lockup( - &e.owner, - amount, - &Lockup::new_unlocked(user.account_id().clone(), amount), - ) - .unwrap_json(); - assert_eq!(balance.0, amount); - } - - // get_num_lockups - let num_lockups = e.get_num_lockups(); - assert_eq!(num_lockups, 3); - - // get_lockups by indices - let res = e.get_lockups(&vec![2, 0]); - assert_eq!(res.len(), 2); - assert_eq!(res[0].1.account_id, users.charlie.valid_account_id()); - assert_eq!(res[1].1.account_id, users.alice.valid_account_id()); - - // get_lockups_paged from to - let res = e.get_lockups_paged(Some(1), Some(2)); - assert_eq!(res.len(), 1); - assert_eq!(res[0].1.account_id, users.bob.valid_account_id()); - - // get_lockups_paged from - let res = e.get_lockups_paged(Some(1), None); - assert_eq!(res.len(), 2); - assert_eq!(res[0].1.account_id, users.bob.valid_account_id()); - assert_eq!(res[1].1.account_id, users.charlie.valid_account_id()); - - // get_lockups_paged to - let res = e.get_lockups_paged(None, Some(2)); - assert_eq!(res.len(), 2); - assert_eq!(res[0].1.account_id, users.alice.valid_account_id()); - assert_eq!(res[1].1.account_id, users.bob.valid_account_id()); - - // get_lockups_paged all - let res = e.get_lockups_paged(None, None); - assert_eq!(res.len(), 3); - assert_eq!(res[0].1.account_id, users.alice.valid_account_id()); - assert_eq!(res[1].1.account_id, users.bob.valid_account_id()); - assert_eq!(res[2].1.account_id, users.charlie.valid_account_id()); -} - -#[test] -fn test_get_token_account_id() { - let e = Env::init(None); - - let result = e.get_token_account_id(); - assert_eq!(result, e.token.valid_account_id()); -} - -#[test] -fn test_new_draft_group() { - let e = Env::init(None); - let users = Users::init(&e); - e.set_time_sec(GENESIS_TIMESTAMP_SEC); - - let res = e.new_draft_group(&users.alice); - assert!(!res.is_ok()); - println!("{:#?}", res); - - let index: DraftGroupIndex = e.new_draft_group(&e.owner).unwrap_json(); - assert_eq!(index, 0); - let index: DraftGroupIndex = e.new_draft_group(&e.owner).unwrap_json(); - assert_eq!(index, 1); - let index: DraftGroupIndex = e.new_draft_group(&e.owner).unwrap_json(); - assert_eq!(index, 2); -} - -// #[test] -// fn test_view_draft_groups() { -// let e = Env::init(None); -// e.set_time_sec(GENESIS_TIMESTAMP_SEC); - -// e.new_draft_group(&e.owner); -// e.new_draft_group(&e.owner); -// e.new_draft_group(&e.owner); - -// let result = e.get_draft_group(2); -// assert!(result.is_some()); -// assert_eq!(result.unwrap().num_drafts, 0); -// let result = e.get_draft_group(3); -// assert!(result.is_none()); - -// let result = e.get_draft_groups_paged(None, None); -// assert_eq!(result.len(), 3); -// assert_eq!(result[0].0, 0); -// assert_eq!(result[1].0, 1); -// assert_eq!(result[2].0, 2); - -// let result = e.get_draft_groups_paged(Some(1), Some(2)); -// assert_eq!(result.len(), 1); -// assert_eq!(result[0].0, 1); -// assert_eq!(result[0].1.num_drafts, 0); -// } - -// #[test] -// fn test_new_draft() { -// let e = Env::init(None); -// let users = Users::init(&e); -// e.set_time_sec(GENESIS_TIMESTAMP_SEC); - -// let amount = d(60000, TOKEN_DECIMALS); -// let lockup = Lockup::new_unlocked(users.alice.account_id, amount); -// let draft_group_id = 0; -// let draft = Draft { draft_group_id, lockup }; - -// let res = e.new_draft(&e.owner, &draft); -// assert!(!res.is_ok()); -// assert!(format!("{:?}", res.status()).contains("draft group not found")); - -// e.new_draft_group(&e.owner); - -// // create draft 0 -// let res = e.new_draft(&e.owner, &draft); -// assert!(res.is_ok()); -// let res: DraftGroupIndex = res.unwrap_json(); -// assert_eq!(res, 0); - -// // create draft 1 -// let res = e.new_draft(&e.owner, &draft); -// assert!(res.is_ok()); -// let res: DraftGroupIndex = res.unwrap_json(); -// assert_eq!(res, 1); - -// // check draft group -// let res = e.get_draft_group(0).unwrap(); -// assert_eq!(res.num_drafts, 2); -// assert_eq!(res.total_amount, amount * 2); -// } - -// #[test] -// fn test_fund_draft_group() { -// let e = Env::init(None); -// let users = Users::init(&e); -// e.set_time_sec(GENESIS_TIMESTAMP_SEC); - -// let amount = d(60000, TOKEN_DECIMALS); -// let lockup = Lockup::new_unlocked(users.alice.account_id, amount); -// let draft_group_id = 0; -// let draft = Draft { draft_group_id, lockup }; - -// e.new_draft_group(&e.owner); - -// // create draft 0 -// let res = e.new_draft(&e.owner, &draft); -// assert!(res.is_ok()); -// // create draft 1 -// let res = e.new_draft(&e.owner, &draft); -// assert!(res.is_ok()); - -// // fund draft group -// let res: WrappedBalance = e.fund_draft_group(&e.owner, amount * 2, 0).unwrap_json(); -// assert_eq!(res.0, amount * 2); - -// let res = e.get_draft_group(0).unwrap(); -// assert_eq!(res.funded, true, "expected draft group to be funded"); - -// // fund again, should fail -// let res = e.fund_draft_group(&e.owner, amount * 2, 0); -// assert!(res.logs()[0].contains("Refund")); -// let res: WrappedBalance = res.unwrap_json(); -// assert_eq!(res.0, 0); -// } From 4c03d849a0055d87295ff8e2658db7e694a2adb6 Mon Sep 17 00:00:00 2001 From: Alex Aunter Date: Sun, 31 Jul 2022 17:36:55 +0400 Subject: [PATCH 14/29] feat: expose package version --- res/ft_lockup.wasm | Bin 338428 -> 338713 bytes src/lib.rs | 2 ++ src/view.rs | 4 ++++ tests/setup.rs | 6 ++++++ tests/view.rs | 8 ++++++++ 5 files changed, 20 insertions(+) diff --git a/res/ft_lockup.wasm b/res/ft_lockup.wasm index a33d97680cf08be0685febde18444f3a778e3211..d589687a55fda16845eb886f68a6be39b8f68e2c 100755 GIT binary patch delta 10467 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 delta 10395 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 xfNS~g^Q>mOlKCCQW=|LPi- String { + VERSION.into() + } } diff --git a/tests/setup.rs b/tests/setup.rs index 16d89d8..31c4561 100644 --- a/tests/setup.rs +++ b/tests/setup.rs @@ -570,6 +570,12 @@ impl Env { .unwrap_json() } + pub fn get_version(&self) -> String { + self.near + .view_method_call(self.contract.contract.get_version()) + .unwrap_json() + } + pub fn get_next_draft_group_id(&self) -> DraftGroupIndex { self.near .view_method_call(self.contract.contract.get_next_draft_group_id()) diff --git a/tests/view.rs b/tests/view.rs index e847951..80f33ab 100644 --- a/tests/view.rs +++ b/tests/view.rs @@ -113,3 +113,11 @@ fn test_get_token_account_id() { let result = e.get_token_account_id(); assert_eq!(result, e.token.valid_account_id()); } + +#[test] +fn test_get_version() { + let e = Env::init(None); + + let result = e.get_version(); + assert_eq!(result, env!("CARGO_PKG_VERSION").to_string()); +} From 93bfb56b3f15037faa7384b2f5bcbcfc28b7a9ec Mon Sep 17 00:00:00 2001 From: Alex Aunter Date: Sun, 31 Jul 2022 21:58:54 +0400 Subject: [PATCH 15/29] feat: add new lockup contract event --- res/ft_lockup.wasm | Bin 338713 -> 339500 bytes src/event.rs | 88 +++++++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 6 ++++ 3 files changed, 94 insertions(+) create mode 100644 src/event.rs diff --git a/res/ft_lockup.wasm b/res/ft_lockup.wasm index d589687a55fda16845eb886f68a6be39b8f68e2c..da13643eadbb2bf0199e14e2213fbae5d765cae8 100755 GIT binary patch delta 27487 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 delta 26511 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 V2uEr#>~Cd#$!6f!A#YmI{|BA%8_56w diff --git a/src/event.rs b/src/event.rs new file mode 100644 index 0000000..aabcc68 --- /dev/null +++ b/src/event.rs @@ -0,0 +1,88 @@ +use crate::*; + +/// Events to be generated by the contract according to NEP-297 + +#[derive(Serialize, Debug)] +#[serde(crate = "near_sdk::serde")] +pub struct FtLockupNew { + pub token_account_id: AccountId, +} + +#[derive(Serialize, Debug)] +#[serde(crate = "near_sdk::serde")] +#[serde(tag = "event", content = "data")] +#[serde(rename_all = "snake_case")] +pub(crate) enum EventKind { + FtLockupNew(FtLockupNew), +} + +#[derive(Serialize, Debug)] +#[serde(crate = "near_sdk::serde")] +#[serde(rename_all = "snake_case")] +pub(crate) struct NearEvent { + standard: String, + version: String, + #[serde(flatten)] + event_kind: EventKind, +} + +impl From for NearEvent { + fn from(event_kind: EventKind) -> Self { + Self { + standard: PACKAGE_NAME.into(), + version: VERSION.into(), + event_kind, + } + } +} + +impl NearEvent { + fn to_json_string(&self) -> String { + serde_json::to_string(self).unwrap() + } + + fn to_json_event_string(&self) -> String { + format!("EVENT_JSON:{}", self.to_json_string()) + } + + pub(crate) fn emit(self) { + log!("{}", &self.to_json_event_string()); + } +} + +pub(crate) fn emit(event_kind: EventKind) { + NearEvent::from(event_kind).emit(); +} + +#[cfg(test)] +mod tests { + use super::*; + use near_sdk::serde_json::json; + use near_sdk::test_utils::VMContextBuilder; + use near_sdk::{test_utils, testing_env, MockedBlockchain, VMContext}; + + pub fn get_context() -> VMContext { + VMContextBuilder::new().is_view(true).build() + } + + #[test] + fn test_ft_lockup_init() { + testing_env!(get_context()); + + let token_account_id = "token.near".into(); + emit(EventKind::FtLockupNew(FtLockupNew { token_account_id })); + assert_eq!( + test_utils::get_logs()[0], + format!( + r"EVENT_JSON:{}", + json!({ + "standard": PACKAGE_NAME, + "version": VERSION, + "event": "ft_lockup_new", + "data": { "token_account_id": "token.near" }, + }) + .to_string(), + ) + ); + } +} diff --git a/src/lib.rs b/src/lib.rs index 3c04f42..ae5225a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -15,6 +15,7 @@ use near_sdk::{ pub mod callbacks; pub mod draft; +pub mod event; pub mod ft_token_receiver; pub mod internal; pub mod lockup; @@ -24,6 +25,7 @@ pub mod util; pub mod view; use crate::draft::*; +use crate::event::*; use crate::lockup::*; use crate::schedule::*; use crate::termination::*; @@ -34,6 +36,7 @@ near_sdk::setup_alloc!(); pub type TimestampSec = u32; pub type TokenAccountId = AccountId; +pub const PACKAGE_NAME: &str = env!("CARGO_PKG_NAME"); pub const VERSION: &str = env!("CARGO_PKG_VERSION"); const GAS_FOR_FT_TRANSFER: Gas = 15_000_000_000_000; @@ -118,6 +121,9 @@ impl Contract { .into_iter() .map(|a| a.into()), ); + event::emit(event::EventKind::FtLockupNew(FtLockupNew { + token_account_id: token_account_id.clone().into(), + })); Self { lockups: Vector::new(StorageKey::Lockups), account_lockups: LookupMap::new(StorageKey::AccountLockups), From 173291543b3b6bb8c718f074c0c0671b2b78e8b2 Mon Sep 17 00:00:00 2001 From: Alex Aunter Date: Sun, 31 Jul 2022 22:56:31 +0400 Subject: [PATCH 16/29] feat: add add_to_deposit_whitelist event --- res/ft_lockup.wasm | Bin 339500 -> 340989 bytes src/event.rs | 28 ++++++++++++++++++++++++++++ src/lib.rs | 12 +++++++++--- 3 files changed, 37 insertions(+), 3 deletions(-) diff --git a/res/ft_lockup.wasm b/res/ft_lockup.wasm index da13643eadbb2bf0199e14e2213fbae5d765cae8..46633124b1ea826105bf8a0a78ba5c910cf1bbd5 100755 GIT binary patch delta 98410 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 (&?dEZ883 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 oWp^;cx{9Pg$ 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 diff --git a/src/event.rs b/src/event.rs index aabcc68..48e4be6 100644 --- a/src/event.rs +++ b/src/event.rs @@ -8,12 +8,19 @@ pub struct FtLockupNew { pub token_account_id: AccountId, } +#[derive(Serialize, Debug)] +#[serde(crate = "near_sdk::serde")] +pub struct FtLockupAddToDepositWhitelist { + pub account_ids: Vec, +} + #[derive(Serialize, Debug)] #[serde(crate = "near_sdk::serde")] #[serde(tag = "event", content = "data")] #[serde(rename_all = "snake_case")] pub(crate) enum EventKind { FtLockupNew(FtLockupNew), + FtLockupAddToDepositWhitelist(FtLockupAddToDepositWhitelist), } #[derive(Serialize, Debug)] @@ -85,4 +92,25 @@ mod tests { ) ); } + + #[test] + fn test_ft_lockup_add_to_deposit_whitelist() { + testing_env!(get_context()); + + let account_ids: Vec = vec!["alice.near", "bob.near"].iter().map(|&x| x.into()).collect(); + emit(EventKind::FtLockupAddToDepositWhitelist(FtLockupAddToDepositWhitelist { account_ids})); + assert_eq!( + test_utils::get_logs()[0], + format!( + r"EVENT_JSON:{}", + json!({ + "standard": PACKAGE_NAME, + "version": VERSION, + "event": "ft_lockup_add_to_deposit_whitelist", + "data": { "account_ids": ["alice.near", "bob.near"] }, + }) + .to_string(), + ) + ); + } } diff --git a/src/lib.rs b/src/lib.rs index ae5225a..fc18a32 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -112,7 +112,7 @@ impl Contract { draft_operators_whitelist: Option>, ) -> Self { let mut deposit_whitelist_set = UnorderedSet::new(StorageKey::DepositWhitelist); - deposit_whitelist_set.extend(deposit_whitelist.into_iter().map(|a| a.into())); + deposit_whitelist_set.extend(deposit_whitelist.clone().into_iter().map(|a| a.into())); let mut draft_operators_whitelist_set = UnorderedSet::new(StorageKey::DraftOperatorsWhitelist); draft_operators_whitelist_set.extend( @@ -121,9 +121,12 @@ impl Contract { .into_iter() .map(|a| a.into()), ); - event::emit(event::EventKind::FtLockupNew(FtLockupNew { + emit(EventKind::FtLockupNew(FtLockupNew { token_account_id: token_account_id.clone().into(), })); + emit(EventKind::FtLockupAddToDepositWhitelist(FtLockupAddToDepositWhitelist { + account_ids: deposit_whitelist.into_iter().map(|x| x.into()).collect(), + })); Self { lockups: Vector::new(StorageKey::Lockups), account_lockups: LookupMap::new(StorageKey::AccountLockups), @@ -304,9 +307,12 @@ impl Contract { } else { vec![account_id.expect("expected either account_id or account_ids")] }; - for account_id in account_ids { + for account_id in &account_ids { self.deposit_whitelist.insert(account_id.as_ref()); } + emit(EventKind::FtLockupAddToDepositWhitelist(FtLockupAddToDepositWhitelist { + account_ids: account_ids.into_iter().map(|x| x.into()).collect(), + })); } // preserving both options for API compatibility From f797dc403a11ec0c919e4a4b5bb8b86faa22b2b6 Mon Sep 17 00:00:00 2001 From: Alex Aunter Date: Sun, 31 Jul 2022 22:57:17 +0400 Subject: [PATCH 17/29] style: cargo fmt --- src/event.rs | 9 +++++++-- src/lib.rs | 16 ++++++++++------ 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/event.rs b/src/event.rs index 48e4be6..2f9f83f 100644 --- a/src/event.rs +++ b/src/event.rs @@ -97,8 +97,13 @@ mod tests { fn test_ft_lockup_add_to_deposit_whitelist() { testing_env!(get_context()); - let account_ids: Vec = vec!["alice.near", "bob.near"].iter().map(|&x| x.into()).collect(); - emit(EventKind::FtLockupAddToDepositWhitelist(FtLockupAddToDepositWhitelist { account_ids})); + let account_ids: Vec = vec!["alice.near", "bob.near"] + .iter() + .map(|&x| x.into()) + .collect(); + emit(EventKind::FtLockupAddToDepositWhitelist( + FtLockupAddToDepositWhitelist { account_ids }, + )); assert_eq!( test_utils::get_logs()[0], format!( diff --git a/src/lib.rs b/src/lib.rs index fc18a32..a9dadd9 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -124,9 +124,11 @@ impl Contract { emit(EventKind::FtLockupNew(FtLockupNew { token_account_id: token_account_id.clone().into(), })); - emit(EventKind::FtLockupAddToDepositWhitelist(FtLockupAddToDepositWhitelist { - account_ids: deposit_whitelist.into_iter().map(|x| x.into()).collect(), - })); + emit(EventKind::FtLockupAddToDepositWhitelist( + FtLockupAddToDepositWhitelist { + account_ids: deposit_whitelist.into_iter().map(|x| x.into()).collect(), + }, + )); Self { lockups: Vector::new(StorageKey::Lockups), account_lockups: LookupMap::new(StorageKey::AccountLockups), @@ -310,9 +312,11 @@ impl Contract { for account_id in &account_ids { self.deposit_whitelist.insert(account_id.as_ref()); } - emit(EventKind::FtLockupAddToDepositWhitelist(FtLockupAddToDepositWhitelist { - account_ids: account_ids.into_iter().map(|x| x.into()).collect(), - })); + emit(EventKind::FtLockupAddToDepositWhitelist( + FtLockupAddToDepositWhitelist { + account_ids: account_ids.into_iter().map(|x| x.into()).collect(), + }, + )); } // preserving both options for API compatibility From 9468c9e7310d672834bb7488795fede1ad7dfb33 Mon Sep 17 00:00:00 2001 From: Alex Aunter Date: Sun, 31 Jul 2022 23:21:28 +0400 Subject: [PATCH 18/29] feat: add add_to_draft_operators_whitelist event --- res/ft_lockup.wasm | Bin 340989 -> 342093 bytes src/event.rs | 33 +++++++++++++++++++++++++++++++++ src/lib.rs | 17 ++++++++++++++++- 3 files changed, 49 insertions(+), 1 deletion(-) diff --git a/res/ft_lockup.wasm b/res/ft_lockup.wasm index 46633124b1ea826105bf8a0a78ba5c910cf1bbd5..817a8e66628bb77774cdcf75e68fed662836971c 100755 GIT binary patch delta 57120 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 delta 55979 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 OZ(pB-o(I;_bN?Tzpgc|h diff --git a/src/event.rs b/src/event.rs index 2f9f83f..1757db1 100644 --- a/src/event.rs +++ b/src/event.rs @@ -14,6 +14,12 @@ pub struct FtLockupAddToDepositWhitelist { pub account_ids: Vec, } +#[derive(Serialize, Debug)] +#[serde(crate = "near_sdk::serde")] +pub struct FtLockupAddToDraftOperatorsWhitelist { + pub account_ids: Vec, +} + #[derive(Serialize, Debug)] #[serde(crate = "near_sdk::serde")] #[serde(tag = "event", content = "data")] @@ -21,6 +27,7 @@ pub struct FtLockupAddToDepositWhitelist { pub(crate) enum EventKind { FtLockupNew(FtLockupNew), FtLockupAddToDepositWhitelist(FtLockupAddToDepositWhitelist), + FtLockupAddToDraftOperatorsWhitelist(FtLockupAddToDraftOperatorsWhitelist), } #[derive(Serialize, Debug)] @@ -118,4 +125,30 @@ mod tests { ) ); } + + #[test] + fn test_ft_lockup_add_to_draft_operators_whitelist() { + testing_env!(get_context()); + + let account_ids: Vec = vec!["alice.near", "bob.near"] + .iter() + .map(|&x| x.into()) + .collect(); + emit(EventKind::FtLockupAddToDraftOperatorsWhitelist( + FtLockupAddToDraftOperatorsWhitelist { account_ids }, + )); + assert_eq!( + test_utils::get_logs()[0], + format!( + r"EVENT_JSON:{}", + json!({ + "standard": PACKAGE_NAME, + "version": VERSION, + "event": "ft_lockup_add_to_draft_operators_whitelist", + "data": { "account_ids": ["alice.near", "bob.near"] }, + }) + .to_string(), + ) + ); + } } diff --git a/src/lib.rs b/src/lib.rs index a9dadd9..b550f3d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -117,6 +117,7 @@ impl Contract { UnorderedSet::new(StorageKey::DraftOperatorsWhitelist); draft_operators_whitelist_set.extend( draft_operators_whitelist + .clone() .unwrap_or(vec![]) .into_iter() .map(|a| a.into()), @@ -129,6 +130,15 @@ impl Contract { account_ids: deposit_whitelist.into_iter().map(|x| x.into()).collect(), }, )); + emit(EventKind::FtLockupAddToDraftOperatorsWhitelist( + FtLockupAddToDraftOperatorsWhitelist { + account_ids: draft_operators_whitelist + .unwrap_or(vec![]) + .into_iter() + .map(|x| x.into()) + .collect(), + }, + )); Self { lockups: Vector::new(StorageKey::Lockups), account_lockups: LookupMap::new(StorageKey::AccountLockups), @@ -346,9 +356,14 @@ impl Contract { pub fn add_to_draft_operators_whitelist(&mut self, account_ids: Vec) { assert_one_yocto(); self.assert_deposit_whitelist(&env::predecessor_account_id()); - for account_id in account_ids { + for account_id in &account_ids { self.draft_operators_whitelist.insert(account_id.as_ref()); } + emit(EventKind::FtLockupAddToDraftOperatorsWhitelist( + FtLockupAddToDraftOperatorsWhitelist { + account_ids: account_ids.into_iter().map(|x| x.into()).collect(), + }, + )); } #[payable] From d2631a24ac1987412bf58681b1bf8f7a99da1279 Mon Sep 17 00:00:00 2001 From: Alex Aunter Date: Sun, 31 Jul 2022 23:48:51 +0400 Subject: [PATCH 19/29] feat: add remove_from_deposit_whitelist event --- res/ft_lockup.wasm | Bin 342093 -> 342470 bytes src/event.rs | 33 +++++++++++++++++++++++++++++++++ src/lib.rs | 9 +++++++-- 3 files changed, 40 insertions(+), 2 deletions(-) diff --git a/res/ft_lockup.wasm b/res/ft_lockup.wasm index 817a8e66628bb77774cdcf75e68fed662836971c..c8f68a203e0177c53855c33b3d7e7792f251d3b9 100755 GIT binary patch delta 21241 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, } +#[derive(Serialize, Debug)] +#[serde(crate = "near_sdk::serde")] +pub struct FtLockupRemoveFromDepositWhitelist { + pub account_ids: Vec, +} + #[derive(Serialize, Debug)] #[serde(crate = "near_sdk::serde")] pub struct FtLockupAddToDraftOperatorsWhitelist { @@ -27,6 +33,7 @@ pub struct FtLockupAddToDraftOperatorsWhitelist { pub(crate) enum EventKind { FtLockupNew(FtLockupNew), FtLockupAddToDepositWhitelist(FtLockupAddToDepositWhitelist), + FtLockupRemoveFromDepositWhitelist(FtLockupRemoveFromDepositWhitelist), FtLockupAddToDraftOperatorsWhitelist(FtLockupAddToDraftOperatorsWhitelist), } @@ -126,6 +133,32 @@ mod tests { ); } + #[test] + fn test_ft_lockup_remove_from_deposit_whitelist() { + testing_env!(get_context()); + + let account_ids: Vec = vec!["alice.near", "bob.near"] + .iter() + .map(|&x| x.into()) + .collect(); + emit(EventKind::FtLockupRemoveFromDepositWhitelist( + FtLockupRemoveFromDepositWhitelist { account_ids }, + )); + assert_eq!( + test_utils::get_logs()[0], + format!( + r"EVENT_JSON:{}", + json!({ + "standard": PACKAGE_NAME, + "version": VERSION, + "event": "ft_lockup_remove_from_deposit_whitelist", + "data": { "account_ids": ["alice.near", "bob.near"] }, + }) + .to_string(), + ) + ); + } + #[test] fn test_ft_lockup_add_to_draft_operators_whitelist() { testing_env!(get_context()); diff --git a/src/lib.rs b/src/lib.rs index b550f3d..1ab6def 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -343,13 +343,18 @@ impl Contract { } else { vec![account_id.expect("expected either account_id or account_ids")] }; - for account_id in account_ids { - self.deposit_whitelist.remove(&account_id.into()); + for account_id in &account_ids { + self.deposit_whitelist.remove(&account_id.to_string()); } assert!( !self.deposit_whitelist.is_empty(), "cannot remove all accounts from deposit whitelist", ); + emit(EventKind::FtLockupRemoveFromDepositWhitelist( + FtLockupRemoveFromDepositWhitelist { + account_ids: account_ids.into_iter().map(|x| x.into()).collect(), + }, + )); } #[payable] From 404bd5d12cebee856bb90feb16f4cc33522f21fc Mon Sep 17 00:00:00 2001 From: Alex Aunter Date: Sun, 31 Jul 2022 23:59:06 +0400 Subject: [PATCH 20/29] feat: add remove_from_draft_operators_whitelist event --- res/ft_lockup.wasm | Bin 342470 -> 342844 bytes src/event.rs | 33 +++++++++++++++++++++++++++++++++ src/lib.rs | 7 ++++++- 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/res/ft_lockup.wasm b/res/ft_lockup.wasm index c8f68a203e0177c53855c33b3d7e7792f251d3b9..808665e15ab9955ae49a6782598875336e63d99b 100755 GIT binary patch delta 21403 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 diff --git a/src/event.rs b/src/event.rs index 41458d3..3fe725b 100644 --- a/src/event.rs +++ b/src/event.rs @@ -26,6 +26,12 @@ pub struct FtLockupAddToDraftOperatorsWhitelist { pub account_ids: Vec, } +#[derive(Serialize, Debug)] +#[serde(crate = "near_sdk::serde")] +pub struct FtLockupRemoveFromDraftOperatorsWhitelist { + pub account_ids: Vec, +} + #[derive(Serialize, Debug)] #[serde(crate = "near_sdk::serde")] #[serde(tag = "event", content = "data")] @@ -35,6 +41,7 @@ pub(crate) enum EventKind { FtLockupAddToDepositWhitelist(FtLockupAddToDepositWhitelist), FtLockupRemoveFromDepositWhitelist(FtLockupRemoveFromDepositWhitelist), FtLockupAddToDraftOperatorsWhitelist(FtLockupAddToDraftOperatorsWhitelist), + FtLockupRemoveFromDraftOperatorsWhitelist(FtLockupRemoveFromDraftOperatorsWhitelist), } #[derive(Serialize, Debug)] @@ -184,4 +191,30 @@ mod tests { ) ); } + + #[test] + fn test_ft_lockup_remove_from_draft_operators_whitelist() { + testing_env!(get_context()); + + let account_ids: Vec = vec!["alice.near", "bob.near"] + .iter() + .map(|&x| x.into()) + .collect(); + emit(EventKind::FtLockupRemoveFromDraftOperatorsWhitelist( + FtLockupRemoveFromDraftOperatorsWhitelist { account_ids }, + )); + assert_eq!( + test_utils::get_logs()[0], + format!( + r"EVENT_JSON:{}", + json!({ + "standard": PACKAGE_NAME, + "version": VERSION, + "event": "ft_lockup_remove_from_draft_operators_whitelist", + "data": { "account_ids": ["alice.near", "bob.near"] }, + }) + .to_string(), + ) + ); + } } diff --git a/src/lib.rs b/src/lib.rs index 1ab6def..f02383a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -375,9 +375,14 @@ impl Contract { pub fn remove_from_draft_operators_whitelist(&mut self, account_ids: Vec) { assert_one_yocto(); self.assert_deposit_whitelist(&env::predecessor_account_id()); - for account_id in account_ids { + for account_id in &account_ids { self.draft_operators_whitelist.remove(account_id.as_ref()); } + emit(EventKind::FtLockupRemoveFromDraftOperatorsWhitelist( + FtLockupRemoveFromDraftOperatorsWhitelist { + account_ids: account_ids.into_iter().map(|x| x.into()).collect(), + }, + )); } pub fn create_draft_group(&mut self) -> DraftGroupIndex { From 8c99426b4b12342f6b6f16584a28d420110ecddf Mon Sep 17 00:00:00 2001 From: Alex Aunter Date: Mon, 1 Aug 2022 02:02:25 +0400 Subject: [PATCH 21/29] feat: add create_lockup event --- res/ft_lockup.wasm | Bin 342844 -> 344100 bytes src/event.rs | 67 +++++++++++++++++++++++++++++++++++++++ src/ft_token_receiver.rs | 2 ++ src/lib.rs | 12 +++---- 4 files changed, 75 insertions(+), 6 deletions(-) diff --git a/res/ft_lockup.wasm b/res/ft_lockup.wasm index 808665e15ab9955ae49a6782598875336e63d99b..ca4a658a304cf4020c19c7e01eca2a9b2a49078d 100755 GIT binary patch delta 56835 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 z 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 delta 55557 zcmdqKd3Y2>*EgK1n#m+2fo91931kwsu!SJ2fRbht1VOkJ6;MDyAhNn3t_ctzC_sN>eSil z)Tx@4Y2iD6t(J4bm0RGN#2Cx%6P(Q4yZA2d6fB@}V0Dqo^t3c@KuBtUo_S@j`82jv zs3YETM#;TjJEBqpRyZp@`Rt&vV+K9@^pG*nJUQ&?fVIwQ!-qXP=-IJP4I49P$P-VD zeQwONgGLSw*y^lG>2}Jfu}?hp+_+}~a-9_@+58OH<_szQdM4lqhJh6Z??;gmXb*toIJjC^*`^CLz+J8aa*XPynnGvo0ehSgs)MCq?XG*B!M>b;y(TtP)n@|snb?>x?CEDl zjvW*5e(v+3U0LV994tU*Av<~dY_UD-UwD86jH*1HK7Oej7q#-uy=ej3@o8yk z0RbVpcOJg<82$WwBeBXDes#XFq)MHHEGiS{a);`t1GIl&nTCXBRUtqoR5dBT-m4)c@ zaz|D@#8{TmJbXCIFcyU;vdrAW;Y%5N!$^r-lXx^8ZMuc7rMLx#OMim2Rc2xW*Wy_i z(^t;(qL<$WXbX)FQEk`}V`5Yzw#`@>^-$>5bLeC%?r?K`o8hWHh85;cs6L6iW=;Xv zkXAA?-4T&nEoKX2lZ=Bkdj#*?L<6p&O*U%Os>iYoy;dUIX^g8i#V_Z2t=HM4+>F>% z#?p+SxFoj8xHGOM%QPN}Yrr<;PKv89f^Gb!=WeNU(aGMFC9gW_8s3H-*u1Tc#&9;- z7~7;7{w`}W2!C1P{cLh>-^6+je(5#i#XGuTHs8PFg@!w})4(dY1N5X6Z5|DpC%ZX5 z+ox#r=@Y{bz|i*XHJ)tlt}uTplJI$QuaVjOk?3uEsdhya&kwMwBQq#PFWzl9TDW62 zQE@_`8|Y~g5UTy1hJ+B5`FgLB+@iJ*Uddi#bc@=NHu%Cl1UDFPuK}(!*0gBM_86z| zH!qj9>?-bf%bK%<6gSiNGc|J~Xy(RgE3B+cGc|!yleAUF3vI@*w{wfzq&R`W|J>bD zu<6DOJt=$+&6DaA(=yEWy-ezjd3f&E`Z&%O84q-B47!=rdGCN9*VEk9)fa5QQ@cSe zfzoppQ>x~6=|ur4x>tRzRV7YNHcL!8P9+*yB~GuRuWU-wtPl+rJ2Q&~FSMU|b=`~HgvQQS%kyA=X-rCH@D{F0Lo39E)h#uf(9ofss$(`JF zsbD|k#^0O4?$}108Rygk;sWuX100yksa-P>2NviO#=#H3El}r(cW6Hvr+dV*>ABZ? z+`-rnM$`Lx1zVWXe#xD7UoFng8moFY4moE+a67cKxu<)7=U^v|@ejtCfBDMY#<+*v zR?ikq%&Ga?`d0pSqx0V!<#4omq@rt;nP@RABmIdDrivkum9T57l6A=;Hvpd)h$Xf z#te@%u0C0-={!mziVe~h(6Hm2JXtH#M6ub#BGrVU507@G5l5n@PYh3H^Nf|lx3xDb zIJ$(PVZ9I)9D0!&j&HyN;~dndhvP%hr%=_W5^KPXM#mf5N7Sh9Yt;oHQ8cas)zEC? z;)rNhk=1C($Ycw>KtUi%x~XK^vN9N`V`9J^??7t~)mo-1k!egDIk~hYC+dSOfkCsr z5toADEjNePDdpkPme6}hbd=00+foa&r6j+Wa;%mimlkIz4rKwzJKr*==!H?yuA}Nb z(^xd>fzqNxFa;)LlNycS(SU4{hS6yB-E5ALGCHYF@frej&XTpo3-P5#p)NFloA(QnsWTJBe4essw`Re62mw+XA*w%oU$Z|Go`WI+&*&AsqaSH^ykODphr z_Pf#Nm6hy6u^PBZ<_f%zx1--+*N$-0`-?XbR+i7x-Ab+M;QkvUByn+4y*eJ5Vne>im(~Tc5sR0jtmwJAWm7B z&+)i#Q3HBRTogl(Hy3qcdB*39+Om8jd~sb~@`=%YaW__IOkI38FaFdxu(%<=_NnpX z;>j(&$IvL23dM!gxV;9jQ?Hdt&7dzmNzXIZzFjBPE>q}V2ICLb_p5GOLIK?j*5{Q; z2}GKi@~x#lLs2H(zl?4}&o2X=#|4w=6aoS?dMv5IzBHa(@Fij#o1f1%Ud(E530X$61}h)3U<)iEdm;;p!xFMTW;FqQ#V*^+78qxj&2e4b0E*Rq zH(pqNw`*Ru`M!Jk0od{BD_XIc#(OK8R674YQFUGY6g{;Y#&0Xy^7L$DSz>bV^vqx-CW{Zt=+b8jPQ)Jc@M}qNy zCojZ8MWqldH6rtNq1?xLD3=@Y?hvYE3i=pSd~e5xzVBdT*LziwcJjUT5t%e5&^#wI zP!R1Zl`&`M0R{oJi!{K-T`e&oU+-$irWmoi2l`P)`tEUTjq%IwhuK=A*Pf5rI-`!a z8K%CUcXDZ|+_T=t7_yT0AuIRkeQg;Qt{dN92r}%pKgo4;Gm*n)BXxhP(mKZO{k5@( zKDWQ8Yp0dp@<1z~Xw-q1fZ*Z-L($582k-K$VH|ug+}34WE!j>}O_2Ow2b+R+n|v@4 ze^-CtW=o6@KIjbI4b8uU73FrwAH`f(Y4#zJw;pN`Ih`;P@4)KTrTf;7K<`h7`m=Q7 zzQeKMi$6qZy*UgDkb8mpDEiQtbhv9Jvo6-wCY>6e9F9kw-w$`-e@`~r9{CO*b&rn4 z2qI5AyXAOmEs)mkjZ<{2V8{)y&A4{Fwb7%1vOAn;tvPPao_3Z`}u72~C^4prDrCE^@d0m*T%vT*s= zXja{Lxu^}3#ydrg*zVl3MIPekx6btd-+ps$9?O$oO=1zbnP2BJc1mi|tgrFrHxt>G z+)Cfx$^6FG=R&04_{LvIirA;0mh3H~&Bac5fBE9uY+r7T@781OnS0>-yLfDo(*ALJ`dNQ* zZ>P>P;x0$It`E^R?MwQx1-VAa5t`CLKRwAlGYQ6_?rsN*|`D2nU%YR8=*Nr2;jHqF`oV2YLf-z!F>l*D-#~JLzu!+_YF_KZYRWG=vtXm=A5HnLDe_e(y8{MO&L3UaJI1en+~Y@%UH^Q99hO_1 z>`}~Pr9k#bX`UP($P$fN*Av-Mv%rCJ3mi8-|Eno0$gOarKLg_p`@1v$jcBu~vHR~y ztYAKLg6k3yy|#V+*Q^zrENd{pUK*SC9@@Rs9>L=*4++vAI34$!D_Ptnd4w>Scbgl!03OIF-|s*ePWJe*KJ19 zhrQ!@KagR{4--MxlZmmcxu-aYjbq4pqynqV*%valKC3V1hO(<{yPO`z#-j_rhq2mW z`5r&g@HD8%is3AkRVuU2wbNBrMQs+%URXfKG~O`{<~Zd0T$K~1&5|jvhGP(73W?=)qPvw1Qq zi4A1y<#S2wB1`uSYQ`QDEM4wy!O~F_k9aw(C7b7S&^kbLmK8IH%ONuy)jaX7;NN6B zH+OeoauljV9(wzgs6zV}=sWO7> z3`)~-JuTa_?-|=D=Q z=)R0dl#P?Ye}BpslUa0lnH&p!OeS@Le%X`E>ajiY+hmZ>4wWstuXRj&bxK?nx7N{}u_n$%no*(rhOE<( z&5E(*tI1^|G!)rd$z;^jUYEx^GC$cY|L({lF{sE+taGVcmP0$SQEZDm*@?xlh4OMI z*3c);H_N!r>;VjLLT7dt2Dq&=TLf~wzYD92$Am7d5gyCCu;!S@Pr9%UAnb^)?B3dT zr^*TnnlW1e%<@d>iYegd-<6y10iFLOL%Ts-{v;c91M_W{LEYI)EYp+To!!gvd7=l{ zD3DYmo1V9d$Znbv5dH%-BZ_M49#AJ zFzqAqLxC=t?o-xs^8FCOdGh`H*+D#@eD;HfW0njTw|fK@B!Al)1}Xqs-~$8z%HP*w7;%WZ(iEZ z{K8-5+hrHawBOmCa>auRQEB}!d%NWi{a8X+fzra3R+sS)fup{poG6*{5Yx(Ld!|3c z9uko3U-gF^NKZG8{t_kQ2C#>MtvxSotDH1|MX-6=!DY2ET9NV`CO`Xsv(LaFj_)(i@_({QMm*W{POSvQEddLsa5rc50HMk%Eom>5x> z!y{NP9{D3pZY3D7FkdzG5l3=TW;$3b808ja{-lf>#m+={)xKBto16eLd^9_z47uhq zVhsBam?C8i(}*cv8poajQ(PDa=~bu@Z%=*Xc<|EKvekIj_@{@ zRR?I{)tA{upte|jn#;o51zJv)`@(WMRmz|39=nEFooiw#*LDYJ=8nZ|0v zQkgZ4?a}PA%JH4E3R~av8pvtWS)%KD231Ux?@ed1yvQR@PiOsH7R$=B(^*W=o7Df1 z+1xmr6E3w_htmjZ+(fR-U;`p89fD<*hCOa;oM-pQh#Aby=F8SI*lM;xo|(a_Lu*}G z!kWmsud&2nJ76MD4t$N(nN@M9ZZ z47awnP%Bxhz^9m;>W>fxIyX+DIkUfwB6`T=psY)Wcxs{F-bvkB#vATr-ai zb!BfNv~TuQna{2<^fE-U4|(=p`IUrJTPLe7U`a3%J1;qYQw4d#!KM5MhYY`-NmV9>+ z?0#!A3l=~2E@=xx?TOP$$DtRPo0ZbNn87)#J~Cy;#q8lb=Tb?~I!&NnsNz`mgN!If zKr<*0`|7X+>!=+e><8I1mn}b9%$l&bRNv~Vcm_m8Dukae_1OxT z^Xp~Jm8@2schndG|9)!ZVaOn1g6b0HuzIyt4qC~EVz~QPvf;I@y)3`zB7y)$D-Ac2 zy;gyfXM6r!#X?B(y4J8Rki7S;0hE<;>l&DgvpuKRu>Wv&%9FGnvV#2~@7(~)^AFE+ z8(1z2TSce=ZZvm*_OWcaku{B8NlESiou$MD(2l*^NgKWt1Ck+AH?p{jwoJ$Nxc2vC zxoIPN7=B3^w23vcsLxrJ`W(b7PCe7yHkJK05%rlnr1IrWY*2_zeT&!cm7(uq49jKX z&8!C=6F0NOJJ%`Hsp(@xK5(njBPiaf-9%jR*fs-s#Rr-pT1MPY5%QPKta%$XlPYQk zJ8OZOVxStt$4paM@ve@kFUJSDUH!sbAe0g)6ox1Qj~txCns+yg6J4no1zKyqL0B?b z&@7C02UFuC>^>pfh`uM%pCtOzM$46_bAbHy(zONDk|&#QVeKnzvqq=Dklx+G+PM{x zfr3lt+MIl|Z(#Y)wy+mrO+B!c)s|zouzUY|jk8^#iCCa!`%otaV zci5oYK}D5uw=EoTYZnMra_k;m$XTQY&GSO+i< z$%H*}OrDYn3-g!<@cO>Xl45pPfPfbmE=0=0+%s{&Wwzv9sOnYH^Dan#jTAdr!{j|y zc_I!JA54EnSn-E=9Ty)|CjO90mz5Bscd*9QeDrIYN&?2%8*<|g78Pv`jA#|$CeoiI z`a`r@v;&601{wbzYs~h_-tU1{{ks#O?Uf7P`zKmOpb%v3TKUU+Y{u>8G;=4b2NABQ zVbA}F8rJM$2do_yNGBMSaSU7O%5cq)Q+BfpFesnegGKv(xo!^|jCD^1FB^`>(_XO6 z`|<}b%!mClZZ8`cV~I1}HspvH^y_NVCtJR?mo;u-j#|kdKVl|ao2o{;4Wr6Ox3Rji z);@L*!Z)7W$2!JXW)m5p+7ViQhvK(_$ZgNK4r=*hG+nRbwEV25Pm58xYH zBcJ~O&b}q`*avWUO_4mGrT7_p&*j5$y+(eNk2zcFseA}NHfZ%4hn3mc{V+?Xwfga6 zEE@Fk-7(DJayjfc=rUi<#iOg^j6i;@+{u}9cP~q9*a5Nv02`5=Aa!Q>B32z{A!IcJJrx9rpd3U$DnX6%PG^ zx#>CW3-(M!3xu1mfsW1fxK6XF9Nz3V&amdLtWzKW=+zI-u*Uq;ba^(EH4hmKQN)#* zQYgp&f-QjizhV>X6%xI*;_Z>eTJbiaVWhi0Q{ti2iSxO<{1vNNRV9NqnQre;eJ%$V z!4cA`h(-G4+B;S%H?gt_O*M_G0ooUGX%Reo>JcxWI?GbA-v0h9zUjm~R|6K(IBBIy+G*MOdo~8x&ix*a@j5a+oB+po}b_7aRd6rF#W{RIRXR}=y-T)}=vp?stS zoLDGll_-3zEn)FBN|69Rt3rZlA8KUlIQ9H6P)glfR%}{Ihi9%IRodC37bfT|voeM)H?ovj1-o z2R?sd^fkChl|M1%|E??116QJh$ptQ6#q;JLY%!CM3PdcPm9GlET>f&Mt%9dt10Q8)H=T|oE46=Peg+#pGNHxjpYG2{Nlw z+oSaaP0$R2k=F0h$Os~qjR8!I6*xo18SuHA= zc1?a+mEVaN7%iL+s`v|m#exDG!f^P=*Q@fo%dJ!$R#-_jj^J@sH>^xu`Eocv@()#i z@~_&xOjVO+_f%jawYFMb!wz{Wp4CzBkZd{2y->Ts+7&8@?}QZnU6th2uE@J0`HS^d zsE}@2;9N%~Dg$4yzCoo@KyPSDe1LXc?yAWnE5!4PPG4E!QBrESyq!*uNz=y@Z{2eZeGzrG=rEJ zHSI^z|lBVtI5+EAp7b;xuVLq(K0z0>nQj9h9Yy14}rPkW?XTP0`KEQ&fCxx* z=&333PJQPZO8%Y5g8XQdezZ(dZ+Mch7Sd0x^%X=lWsl=fofBp`;`^!E`O*S$PJF}F z<8TMb!uq@!c7G})@V2~Yo$Q*xdujR9LA{QCNpEo@*qZEOt0tA&jWFgT&(WhAYXjT`VgUD;|l8FEwu9?iDNj0U_dR%!1y;KLjJ zYfzWg%O(wYoSe{*M^(D2FlmK+uMqMpu!YQP$g^Nh{MCpz2s^LhW_Qt4f!BU)2zzdM zBi`T2hS#iqW8R*@=zO$_BSxk*;gikxn$n%f9em|fIjD&vvO3)SOfP%h#!Qm^68RmW z-mif~>lC1zm&hN)cG`D|{2M$9n(_Rx-vY-pEM)CEC`NhNj zw4Zh|%%1;A_Pn;damcZ$=t4XeF4{5Ak+!@aqHjF$?Rg*8(Cnh+Xw)6}S2iU_b-E69 z&uZ9{dl$!9vcsNl?*>8kD_i{bW4sltH=RZua}zE~YkNi~^Zzhl!Lv{2P8L-jCJ8Ck z%Va`g`^Ml2?Zn^wf5kL-_I2gw#fY-V%FHAr#Fa$?`VSfLK5{gBR{rPZ?71TJG%bss zDy8TlSp`4GDK*8K)#wd5ya#``Z`n$SiuzZ5`loX8>7HQLLvnLZo&@nx)RWh=&OE7b zdedIjbNtSi!JQI{)eL!AASod`VW36pUTYtx&3(LCqECssQ#uA{=B^HDROn#%iApzi z)uifvR^LrK6hhaH3JXS3t*r*1UjHboka=ag_;aO!h^Ht};Sils|65 z3aIEihwRsjH>hZz5mI}LY4VL;yam7XmVCb#ZyNslDFStnY!ieJpQa;Hx>ugOpGV2q z-aPgn_kq&gAk&vAX?ED(YG5GMvAuBdZjqGw|&XT zqlAm{hyU=ta3>`{z+&IqVHFgD8{erBYdncjAN_Z{Rod>C*;SE@cV-8 zLR)2{{?J`B%%mCeuNG7dW)# zzPZ&-%2h*or=h2bOJL?|>!zbHTzELEoWP4IH4c6$J++nj;ikj)$SLvVTw8-Ot;__< zxukM9I2)mxl2>nkkM4TiI4KHfQZa+=|z{ zv~j9uDyOPCp)He!^O`pw63j9^uxfBv4EPQS3Ur2+C(*iDB2%t>k~it&J0%!YDrOki zz+`Wqm@(_9{bQAbKVTIz4#E-zi-=M< zvaL>u5xkovlW~sJ>@f_`5_4nPMph`yQQ*v9CZ}04dD;lx0mA3t2!6Mhbt1(f+ zMVT_1_khgVKH5)uV{;8`#mh+VlF|GFNbkHc5K(7jv$4EMS>Y$28p|6a)(bhcPBUsDe3p-`o~{%{E1w|$T*<$NrXX+S+5arZ{TtZ( zeV)G$iSyg@yuP2brs4afb&HAoSxD=36M47F%ZPwrMr3b+6xHj)wZLEC9TGAu@x0by zBhO1`SG8Z13x!T+fOLYi6>{VYd_GH)f4{&xV)LQni+n&;({ll0EOHP@7CQhm=S4oK zJc*s5ie;8cY)tb>+3qFYuu`U4B?jwx<|@(i>`S~AhY7af75=gn70kib52I?{%4+neU?DN`0*pa=5h!z-t;jbvaIO6ZJuB zEwb?L#`qS~6Xx3jCr?JP1$EHoVS)&$Mbk{{bQY`hy0HmL1Zoj^k>5t1`N4{yc&;bO3-sCjIK zMiJ3ce^i(+Dyy$n+#85D0NNjziWeXQf4zYz+HSJFXb=g2s6u+^btMO=iXmqDN;q1` ziq$jxLoKPEDugzGiDIW}Yb~cOz}EZ{KK)wxno3)3q{1dvkQ<1#yd&!a(CoILvCS2r z=P7^`^{(fbuOLM~$Y=Z@+kmP6@lL?yw}ab}_Rk;~U5Mx*EEGHG1(Kb7H~7~;6gyjs zVwc$rvdDR2UWiiBnjv}iPact)LzB<{%X~!MG#}<1C|qHdta%}`gxaI0g*Zgl!Eu8q z5N8T`ZfNjv!8(hpfd6#LIz-6KDLfDqDCfK+qGZmLn`!Oj6#h^}KS}^q$hh%vf^>RW zRE^vpNKRKMsqqhne5`$P(u3e!Rl33OFS1 zh%gp7%p5O$TA1-61mboj=>;ev;!C%y6)#Zp0cjMBPXs>Th@)&ggU7&z=sttDsYwF8 z>{u;4&|oBcmsf*0qn6P7FUs`Z>Y}grR>!FKf#vnS7!*Q-F?(-H+JEl7n^!=uU8L^N z^LDSHy9M&m*LbJu)T2BK5e0=QXq6t3W5(2BIEL< z(-f8fJ!*PDwb$|94MorqOQC?r8i=AmtacRAv8`y589oyfMC>*CP==z!0SU;&&I6i* z+%q%f@z;6az1>=iHpqja;{$^JY6T>Ck&Zs%FQr^GO&o>JZ_7Swgd0W!R_sptOEwS|-U<_pMr_JtlU-=G6uW>dK{+{q;s(X6C1_?h z(6siK*|7wk;fMnq@(3u)D-ZLirT80P1*k~IS1MUwUV;Xq-$_qQT^>Qju<#c(wNFev zqxyK0DWf!gp(zs0xzv=MLR3l<0Ud}@EhDQ;=Gf_ z8(%6KsIAk^c&1IaM|8YC&z`ToM(2-1TKLoahcNl|kU9ay8;DREI(&_17snrRGJ_HGML3;^wYJzy)*FWv`1_v+qO1{uqk51Ll#)tVvBjWj7d<0c5~c8E2_Lg%D@S!L-jc6o=i*(qyrpj~ z1@hObN#9W^@d$RYI&CRGH1y-NG+X3Eno~8kP7HC2)t!gth@hEWfL-pb4q%)aN`* zUPbDUQcpASrN*GXAo0xZtFP-Mi!t*qvnZk)N~mv8Y?tUs_l}XB%ahRv=26>21VJL2 zS}lTzR;Nka3{*|5@dznqGY7`7-o}#e@K7R=cv&6ajjKc)aoVY_A0jCX3p9(cg=db- zT@lB$oX@7jL1yWWwgH4Jy;ydb!^eft{1;F1Vga^8?wG@CR8J=!#>Gq&?`5A;r5Ma~ z`2(^WtRszrY_)Iicf8e3w-2wbmq~N6O{X5=@`<^8VrrIUfim58GH2-%=nel{rHiQ_8x6G8=LgJRHF#`+A&9AA?~yIW(B@C4XxD)ZF8O`nJ{+k}wN zbI|5TvX;RU9<+@fugg5W&fti(&lr{q(#Py3NJ2XZUMsY$Q?INzkJmKuf-GJTP!jD2^VR5|qZ~{d|fjmvxZCmQOz0_h3NSj=GWcTT5?_okg=6J^!Is#53 zepbNI3@YLs+ye<OqWb<0nkK${I z&-J5FTeS9}rgBuuDZi9Fm2$c?1(Jd9r^!G^6O_k=*w~V83NMNVY&k`~2~a|O1?8?wIi=zBMPfxz`^Z_o^FG3S9w*wT?MTv1btSPxqw zQVRSoFbW~^X*#l%Nrd_L6#?;Js(g!hrnk4Gsp0_KpM@=R8Mc5&j3WC*F$AF6lde_{ z#J-;q`-TubBtW>Df}13Tt@dCXs#K=4XOvVY(PgflK$7U4B41^6qnlZB_5z-eY8q8! z|0y|6C;)MnfF^u?B?k56cornA+)6+O%FwFqH9`>8J0ECTT}8NPrfXOrdWhp`YU@?c z-T_qF7rt18t(Kd`%8ZYz0;3A$0R)RxG!8>cc6*E0OdxKBo$JIp4~spg+tpn;qgjcGt>)8rd(@xlGeZ3ewHWgE>$S@lhRCdKhIy{0zAU7$`gS*xeY%X4`325ZVuT6Vgvv{uR9i=edBBV0~i z#9xfDFCwvJd6)2Z1NkoWR=xiTRL!O&r+afg|>CqbK zl%<32H0=_78xe>psEP23Ar>HM)x-dDaVm*UWjAbt|9#9Y}0vlK{HMod{Sh>Y`{y0rV`gTbHiU^Bi)>QXZRH=tLg+ zg}*o|58Ib(o6NNoDK;}tFH}u^PY5D0Oryt|%`sI4wxJBRK+rVg@YMACvF|~WYo3$b zSXf~?DKgG#f!3arER<(BAu+X7)48WEH#P_7V^Pe6T6WWftNQ30-Uw4$tR50RcbdJ@ zZ$ll0JH57^*3l}x-%K6N38JzS2oIP@vn|cHL1VAEeY^4S;%>>}wXL00YbmN?QZoH^ zcro&7rbyKwzu*&s8jIGm%$tg3rDeQH9d({Lgy_Y(C)t7pGm7h86PElT3%jWWR<%@A z!}UBHm+|Jb!D6n|(wwF1LGpINKjJ7&p<>D|BkE8KH{S}enATP{^C}E$KNFGwAy3Ub zu%R8Zu$u)2v7PI+ za@@oi;bdK^ZG+Gb4(tV&k5f^|_Jz@)G{Zt4hHPD&0QhLv_IE+M*{_z~(lb!ha;GUA z+3zOS2MmI1wzJ>_wKC7=(W|sAy z6O>X1jhQ#RC2z~RR7!zx8BU&rF9#S@*72cpo)rzL3 zJy$!x!EZT)U5D&aIg28g6;ZTyZp|d718XKTU1?-R1=PuHih}Lfi2SAAG~Ds5 zU!|uVimj(-QECl@#rdUf5sY~juHokxPQAUdj^|gPb0dD%mUj%MJcsDgm#aJyh6ykb6y>P&4Jw_aZUdytEn9ds z$#Qs?D9ge_2Au}BuQHkI!B2d|$QN^Xtt4yJjS@Jh>HC=xQ)T#mX$0q7%?=drmiamS zt}2^|@p0EI%S z%W~>A4X9_$^5PE)5t3LSYi#Ass@V}4If7&wGW2cx z$PZfwbxL8IsS-Fy=ByNZc<`2uu#p_eB|+ZQyIB9A;w`A}zGSrj5- zZn_l8+!s~(pL!bY<%?Mrb8k!i*ox|!mL)&i$LpK;xlrEd^ObR1ATatLD~bpiyPtO~ z58co2=k@;;deH4#(KBd=h>?N2cr*E4E}sc7ako}wr&RTQ8HeEBPhwT2iWlMg`1&OR){Wylx2H^^ha z7l^0)QWm|9prK1&aP1~x7krv8!jWdV>Px;61o4y<)#J+EHE3&y0^(T0eLRzCSt3?u zpW#}pUDlpy<*!tGhg5#Q=ZiC@nmAmf)Wr8iWw?_@;8PQ^D@3%s=Pa)X?i{pAM9R@; zaW?D?IpZvdWtQA^mbdlCJUa(HxLih^<6ZyH@HO|GQmPZbhJEy<9C)6`N5L7$ZWsI} z6VGEQ{52Iy3@Z~BC*^rWrG6#%pU3Zyl*#c#eZzZGKy zHYx6-yJ3qj@bNd@OKF9x0)Zd|FP07a>2kRZz!PJ7yZCHLbady;UDJgGHh8jT~Tu1WnLGDDT^=j zdR5b{#a)K7W{7O3%D5~1zW>4_kee}b%@rPA9zT~Ao^@rvD?IAo!2D0izlXW0?%hdePRMzjwSwHa#rd9K} z{PQPXZM#&g$Q6aUKWtM zYm@x>H{ONakau3gfyf*=>lz>J&*n*ol>Hp@JAb%5>HXU8IQ~$c$fP4gwry=vqyMQP zSf@YyuGHv>TnNao|KLNRF}wYFi!Pn`r_!Yh{=7w(p8V6)r6>RT2VLsW_bG114bG%X z)y3fzthxOj+pWVjIhuw)!1MBRAvE~60aOTY-E3yf$T zh+}N(=mD0^`}fIQAsQk={)`YhTP@uVK)m5O=n%CS+WE#Q9!<3Gk@LG7v|NCv_Q`R9 z;_mV!fS)0DB2disqY0WH;zkm7H6?5-qeb-Gd$v^=O;S=_WR z_4KVQ$}A6lt|Df)oU9xQFsh?y>kexIy3z@M>ge`@pzMkv6W%wk^i&n)tQb@r5fwV= z38^O3+VqcbI7qT&bcFC_$mgAb1ci5Iat(23d6n2}tbd@2NXt-w8CmcHzuJ?N6s z%SxumVO#kV{({kREHsD_ZGsMvx(&%@#*i7+<>VMq1Gi8KFvSCBrCHEW96D5%#IA5}IBhO`XeIKmIt(*aqxmZ)9z0|nU4Luyk7)>_CIP)pRs z?OKy+iRzV3?kA~G&v)E+T`e({j+-aNiU;Vx^|V;w<<^-_Tmqo4#rXbCm;K_!>1yV_ zk5G4Os~r96VcE5|7+lpn1FF(chtw=?XsRueDw{rIGedL3)h++1Ejr)^)wXp+(`M$~ zWRT&i)tu6T=%TGkV%KsEoVFFLoie;{_=5))fH>FIMd z+Q-+^6@dMd(9wX9Z9zON)$ytvUmM5xb+^1&UpyL*i$wJdP_LE}M|YgUSxd(TLakS% zhRN{>qH3z!(TWB^W!>tc(*SKXjm|7+X6WZtb3aTr)4>!-C(jtJ&; z4L~7-cunVV73rDA5s8Is;I6Sa&1#8$3`ET--I$SyEef-<`&B#UW}fD*gkT7jtG!Mw z;0`W0^#Jd>OllxvQt_5d9?jX5N!O*StN6mSKUFvBUJFEfpjj=xa({$Gs7=85Dyo$A zQMJFjio0r`Xl$(Gw4sBpyKv&p)5@>VMwFBCUZKwiHXKjHz&LW0Y>9 zRHSQa!=V+Y`z;XVla3olDS+oHWoI4r(ryC6Vuikh7)xyq340S_G0NII4)gHt4r#?_ z(o>DS70{>Nu^engaXpm2AMdGrf%!3$9NC$8CyNh%Nd}vHguqY{8ii*cHx^lwO8U&) zDlq$P?mUEA0d}C81m2lk_Cfl~bh;#%&=RaJd<}3{XvGN)EmWlIKspretI~+RUZio)A|J^}I5^e)~wbv)ZZYG}AV-R)PRU*C7XYV$x-CW8tn|o@5U) zPpY}M;flB(O+;i3+vLC=5JWv9yX~{<+4AKkA|EQWOCnV0Zn-;AG%UNAl)ofGQWa57 zovJv4bn_7^IiRUXV&~+{rntSa>@u{dspv+_&<1yiQCdV{MRjAr<@RD|ApUX)b!i+R$%b z=wlhwLiEQ%^@$c@QLqhgvvjo-BZ4!IQJ3S))0THsgd-dGHe2J{?8$2>&T=eb7q$_5 zU<35OQzTX^4g3f4O%otnF1}N&@m>D-f$Z5peJA&}70==aFIu$| z3G6#LsGax%7c94HFAjt*v)tG?BMFz@-6Bc0zY7}p56?q)i4b;6cF)v5Ea<=$u3jv$ zs+Zsk!8Fzv4&LMU#q2LH_KuvsFX~kS_gd$u^64DaMcig8Q6uE z!ygpm;P5GYP~3%9BKkofESC556D@ej2lADEq7AND-QG{!iPVyQV!FK%1mpr8*6nw& z?E~?nzH;tEV&h%bW(Rf^agVLJn}=Xj0V(*GX;Z3H>z6H1yc%r_zWlIQ0e6u5 z5rH3X^7MNI%Xr{$bbk?pAD4KozqqG~?IOvhsVm*-@j8jT^Rd%oIg!$!A5O{}{Y8h) zY57#tvXS&m`qDK$OQl{SeSnpzeZx&onX>kJ_3A^Zl%_CQ?B7nPS7^rHS zV%hSC0pgQJc^hCo>$UVkdfF<$cSD3gfQxS45K+8AULGhOuVP;w!L9Ub8|34UifOIO zNj$6nw5SN&5 zxa|h)QWVkcSLy?qK2+RM$Mi=dkO`NH+rjXmW+bTHhi~NPL&ZJpQ&0Rbv4#}F;o%|+ zEc(=lG7^FCZcBs>Bg9LP2$x>xZh6m0QQumRz|R^$`hX_wFVCcrq5!|aE&Dzt>Q+iu zluA40m_@icr#&TJan0LAr1iV3FbWQr74nWzVgkRKE!U3{!yquU(O}bUve#&F0zaEn zYmB%QHq)Z_0)>Xiu_6}Btkz>iP27b1;8^tOm^?XFq@Z&9aS#QQ1^YemG}v#IeCuhklJDPWUi)P}&YO>`8|i+haGCausBLUa z4C2=}%lDrVuaw7~*VMW;t&}@~6maM0XGQBCUW*?K%J5^6O0BDB93p(!=GA_}jvlUG zQdqKi_qs|=)U)N4XR*p$D#M=>T@$V7kSr$~<_}@xZBx-&C(MHwl=ruZe%UW~oToYPbc0eoAqq z`{sZHb?%3jrC=&3|3h-n>tdkWu4Kyvwck`)>SH<&A;`Npvbdihsh$* zPyf?^ZEn9jTRd%gfO=Q4FQ1B{R#8a%OZJ-rC&>!=;uNg>iVn%xIbx)YNf*cYvMI7C z9b54e=ZdCb*n`f;R-@YK|3ltARYbv}dT6R>1v6{bRMGZ-F&BkU0RJDJh1JaS`5WXx zL#T*37aL~(-q# zmS4OnC`5ubT%+yOQimt3Ivu`Nn7m6R9G-Rolj_ya@T%*J%t8k}$Fod_=dR_-+C8(p zjBcZz+SFcag=h_G$Np-#%v>nKd?c^-Y-xml$;}JJCm`P;E5#jz-A#)?NlF+Wep5>x>-yw(_w5{|9N_TaebSEWUnPDO!~0FwoQ$chOFo1T{l3 zKEuN|Iq;p%S|zr_vDjs`XzaGt+9{KiEmdV(vHK6pIjcpzV4s~Wy{koJHQTJF2~>On z!$!KXn;wouXC0_liulwsjuV$8VI>%`M#M*!!xJ)jCN3%;Jd-=*SBFH^SlVf_Rg3C0 zZOZsm%Q3p5uZG;aM$pgAja@5V;-5o`KFq7VxlX)t)1vUTbr@&xGG%Bw5mVHCgP043 zIlVz7-({y-yXn>%k!&w3LczS@f+tgCc6;+2qg`jKd?Z`6$4?!+nJp#-=c!@h$|eu) z-g}Q(=utr?9l-AL>+fJ8Jz4(pj%e53E>aflJoO(ncd@x&KGf4YJB7CrhY;X+L_++{Em`IMcvr45s#SnUx zv{x~Nb^+VQp<@Or|5J$=!uoRXagi1L#tGt23x&<`^E14H?0P~hEgN7+vLs9Xc0%p^ zlF$#t<*N={5;ol{npI7k23`kjj9A~MoS)a^5wA#U;gc9;SLS5mfNBxCW|6y}2+3C> zL^h}-DoV#$Ud7MaB2?PE^Wt8S@K19QFTJg~Qx@$NQN9T&SCD|Rd&(E~i9wi^&-SU^ z$G-31qIsvkPny>{*#SY4aKL}}(e2xPOrXIvwvT{Vi(WhWNfEicbO6fOhGb6g=>4gFq`6p$_NzpjcUL2NW5rZ|<7cavTW@4|CBDx%+e)XhiSe{nbtqbcESzkQq zN7iN(Oj;R-Pt1qPRr<|`ikKh!=oVr&J}OJhEk5=q<^&%xClN8XxD7FrWtp#>snZ%mit&LUoBx~#m_@gI5atoSk5I!l7z<2ikf)=$f1)Om#EEc1*#FWL&Y z5qiJth?hq%h#=h2Iq6+TZF%hi*6QhUY_XVw2fHXn;W6f-cm@ym_Xw!`{i4`lCe^?% z6G4Hg^tpD@vG2vB_IsC07|1rc@{*{VYPng|FFmV^3~&t`0)+Lev&k)b&UCxFowuY= znT*Vv%al!_GHc6}!G5ik@~sJ3R{25PSH19-LT1XhvifB)MIQV?^sKs|Od0CX0-1SP z+#&Xz^2)J$91*h8PKQg59_GCus9xjr1@zTUJ5L3))inLu8abra z|I^r&07g+P?Va5kLb6HN%|QquWS4LULIU9y$RIqP0xEL&5Je+Iu5bqr6gN@ChzOAY zg^CJ@0#6VSbbTrseCV&J2+w$cfDsS^A_N5$<@mpv*$$J1cMNp8zpCo$p6=@Eo}Sqm zO5on7T!WpL9%nuUYsBXfPN9LzxpTFv6}mjH+SRn~ve!k!`N#RmYHazJ^YLoe^T}_{ z6(S7HYp$&w*r=3y-o`(8#c9_d=h=m258awnQ!{t$#f2g-4{e}oOF83bJZJH^`E8y^ zi?*nYADc)+F#`8bq$GSAa@)_YNufQV0nRfO9QXxSZrBQ1UO-8_;}_RxT+OvRgY6pZ z2cE%FYZ({&sUe>{<4V+)1?j9SP96qN`W5>~4|BI)U3Y2^muZ;|c=NBW*6|M?MnjBm z=a649p;8zFTe$jH*Aw*~lUr3y2#dUEEGbHO?r*LO@wH7Iv!}6)dz^D+@CU!U@~_4X zg8Qx$ZFT-n*NFI#sde!=WkatG&i5l8f8KRx^scW^3;BMI(^y%S^=VViIPZ#Ly5RZ% zUpd}!!PO{J-K{X2ZQVBzSG^~Fh!33N_fe?5Ja6>PH|2b45zL|OR%*b#FS_C)jz|W> z!@DlH>c_rgf>3LJ#DR;hk;^WjP z`OHCRlaGgy+6MKABwlx&rcq)_mE^G0S4*;qxf+MSiIaSzMqT4g0sImbKNfc44W#&W z-bsE|qh9bq-)hv*HE$1w%qFT2M^n!UE1MT=;iS3FK-CY@vg%{9b&QrqEedcL1(qI8 z(ZeZ5;0nqPDF>g#u(XHvW?zluES=Uwm}X+^4SuH+Y0kx9Y#tsmYp?)_%G4a0ne?^jHdn= zJs(C>pQH`P!0LyWJHpf>a1TevtyA6D!2TGDcOLwaJH?=6=Fu_K1JTMDN_Va~$qz(R z&scmX9Y4swF(wM#b><}hUo>5tapvUJ)P<<>7>2{RbjdXpx7}al;#kVmKIDzDQ2imF zjHP??H%e_hAtw&?E1iZ#3e6an-5MFjQYlAmzvICY)FdqH27JlOBwdk}chsXYIJA)- zdccZ&{D+5{h0VEySNj_CxPzBgLJISBD*xi8aaP(06PEV?L-@5g8lde9Uc%>KG0YHUP!z7p5c(Cy5HS1dAbZ=p@zG?}rrnNGR)1!naHE={2NJuI_U zr}Li%%~fQAhZ1O}mRxJ#*@s#1p8AyWANc%M5@k87e&7>HXtnLZu??t`7G3cu{6uIv z=e!0KABXzNm~s2D@)5teq=diUKuKla4T;2Zq&k_(F+esoq}JM_!F>(sHx2Dm(TK)0 z`}A>9RT)|tXtKt_m|130cS@T%+>4!Mc^OH;dsFEq&9!{)HlAALN(~-uOpjiMJkLir z;-QOuKA8G!_V_6@cQuW$X4ZAlj9y}8;hFHuvM+__+hj#~z63l>pj9%RVr2zOl6J!L9#z3lo6$_CRut^ll77{k z)pLWrTGK!cjs9c?jc~1dVjC|wpf%>mHWVMb>U$|8ddi7s%Y7ZFUxQLv&5Up3a2W3e2H-v|p3-sS3A9oUbf5~q$;EwD z%tCmhp@@1y_5m5)s9YE<%pumW5{>ResY#V{AmNwy6~)SzE4~wGRLgUdm-vD?3q6)32^n<@4Z)HuF6;R;gR~ zk51H7+Y?OdOp7%*^4GgyEUn?}t~5jYdvJAEc#FWki{d958HXR1GYd^(#_uMzlX0dN z_0>xvi?=^KVwYVc$Y^V9uSKo=Q)E+(qVtHAUYzbS{AzoZn%Z0jf6|@eV@gE`Z_kwW zSjBnWsej@cGhfJ7R6gF;ol>tN-LST_)7Xuds+v`QDR|R0bl90&G+Qc}Y%G&lRmbq+ z-#U|`Rtv2`sW49@GJR9v4;|H^$8rEJJ_+n~S z5Xxa*U9RnalMBeBr&#GW|8IgJxrlH%-<3sN>EEx+r6~234|bcaQxxoc1HGb!)?KRI zuB_aZMRX6Z7;yMX?3x;iYPBn5tXzRw%fA2R4Bh`-^_885xnEVWc7d4NWn9&dhdvm z)&6LCVU^`=>dGp-#?zz@pk)G?Ox$UC(L*r(>OYid;6 zslK}Q@ww*~+N!ls<8zfc!-w1uCgu9Z7LyVhYrJhZ<(T`g!C!}y?o6n)NP%LkVoQVd zZlj2(aCGlrzQLcq|pe_?M5x7&^dzj-_=#YsS%Rptj?2ZLx<( zjHh8kE6mJlOctxoh-Hteckv zm(Iir{VJbODz!e3XMI9xdFZQ47apLFF*Tp4lAjHgO)X5|!4J|D*ZU>g$_5Rs&-)&v z9$Y*NW$fa&W|6<1`8o?M4LdpI+W2K|IE&;d1Mt{cS;B)KqQQ-JbQP1X{A{~=h<60UxT=GIdWQOXYo@Ej%2zrmTzD+6?Wgx_|$JTRup5mRw)I6bhr$}UA^@M7k*dSmXXFWpgx!c277@8Zq z$$a0#H2uHioww1<8${l|S}0#|!EBo4!aNmIf(vSEOUC)pMxL|@mpGvvnU9!DsCE3l zEy!-2aIAI0pK?VBJ*t}*6x?nuwND5wgK^TbttNY}RU3K6T)Y^%dLzF&7hBF*b17SG zbJ)bzap7Ea^A=t|mlnj^+Q4!!N42u*HyZM|C+Lt>@%q70^XLVw=67=Dhvm86eCmc; zUq2rO?w`%QHc}IQX+8~6osoqKtzmruO^aV^tzL6bQwWPSZQ;2K=#z*wyQP&Hl%4t{ zk*AhYPkecCV<`;?JbMImKYk|Ur)aO+m>Ys#K#$w_{RfL12M9~43PBN$bsJyVxG`?y z;}DDiH`;ByZNca$xAAg_lL!vrvmxmAQ$XG)Jjcey+f+{|QVY6`She9gpQ?6J@ z*W$^)24z$bQEqGe@r4I|-YOf?l8vxKr>h&`9k-(01; ztv!dbS4M=n_f@;lHX-+ZX$dv0Z;m8)0$i2cRYN1nYr?C7U74-iypjt z89hg7m7hta{Ko8kBE8+Z_%IZ8QLxDhs^i4&VyhQvR8F}m+{jpUz$PraFym#3Y7#?h zK0}Fa50<|Or>#}+@2lt@pCTW&Yp4-Eb09eXC93PhgwLz#WAtj?8nbf|CGsxiE*7CA-700&mKOy7EbXyo_bbG z<~1|OXQh+4at3bXyzwe_eWUN8u`wkj&||&<4Jx?!9?IsMUZEzD%PXx`Q*&ylUAFT} zuh287eeOEyQB%cvJZByDOTLqnN#xk|urh1bRV2*2KO@t~SE*}wJ-UE?>Q!tD{lwR8 zpe1-XyK)1qc2+&Ye=Z?RUmGdUS$UB4P1sYk+&MP1CT^kz%A3#T=Qq({@Gjp7ye-Pw z=gu%r9O8Rl!!m0NpMMSGd?SzC45b4$lUH_hHdFi1%^1A8&8TbMjCo-*CDosO2xo83 z3G$L8hgdK^Tf(1irZ@1h?MJrIGq!xzO`JBbV;_4T_kSI`F5CIg>ofsdpf|pOVRQM0 zB;$r;PVk)|E!0qZ+=i5|1mX^4nQQwYYfN#@Th!Be{)ja)o_GtkQN$bGqV^G`<~=qi zUwE6612PH2KP@zAGAqdqF9Ft_8$UJ<4No^m8dhCvYGl&J8$~u5hmnAvO<67v-xiSj zQ(-R8T(a3+9`5489|>^f7kEC79Y3WnFdjUBe_{M*}<)!}lXQ2D8?P}$K$ z!+KEI<(r0(Iee6FeTSN(Rf^xCGUu72Jn22ka(ip;JQeext<)VKcYRW#r`dQHmiot5 zii-Gql~`&${(LL8Ze#d8@MG|cxzHV}9aSOEx)uHY>bn%>{Hn^lZHRSmG9L#41__s@yJg1On@^JGeSF*U$5cyn{RH~achqK>9;d|esC|Bt*OZ|oS&{NCUUyjPH=GzfD zHypcM&W>`F^QN$~-58%Ch5uylHmdTK9+wknWUQ08#zB>vRKIcfI48eP8Iikw6e+kd z9{4^TxJzYPbi$rV3Du_lXW3O()o|uVe)6B6nyQU*kKMRT>6u}Tt!`8i>k`q z_&-pUhVojnin>ct`Hc_g%bH4U2`>7O8aumxj+YiVjH04)hkN@;4I9Mfq2X^P0`96sk(5KEF#pSxZytiXAau2$$?t|VZt|Lk z@UKDWVL_AM6X{+yoQt$!!@ZHd)`t5y9K#%2CVL!1LF|M|HAk#)E^rgzzP1d1L3+}R zf`SL~e1$Wn6y*CR-|d?|Zf3r(y~EMZCimB1%nk}V1J{8j=PKcPg#HL}NaY703`9`v zaRbsfBFG{9n-B&Gz#;f%guw_(ehAXTZt<8jX$Y?k--$Hx@U@>|OMMux_zV;0Fy8YS zeXC{i>pOAZFpa;ID3j0b#E44cy~ihY;>UPzt+5SPDl86Nm6eBPf1Sh_7&T2Kgo`m#d8=ivnR2!a#^mH38M0$n|--GnMHhdq__uKGH zl<#=JMtBhESvLF-(jp^=)VK(t7(ouf4HmO)p-+P4@= zS?vE7Gh-GH{Fd59J{TuYZ^04bnJ^k0`4OP_$SnT;TWaA=j<-rk0!d0p=Hz|Y2}$OG z`>1oP2f=MA)R2_8JyR-#bAc0u&+GTmnCyKZrvjcsEZ$OO%SAfIhNZq%w!Zsmg10ci z<46H%0b+5S$-Hep+(a^;+m8yjO!VO0+d>_B0Jl751B&xgy2TmUb<2phW3g#buH?nO zr8yNAd-mC|*t4{);?G1n?J^FS_G}jrd$+fV*srvvQXu9claRtZ53I!VFT?rCO6r{aPLgFM!x6_puoZ$R7|#1EaceJ{&q>sh6TgRX_Ti4- zQ)h3V1|Ek8GBRKELg>S@zNZQPFFx>&d>0|)+6*6jdV=K&SC8+_4igm>RRE3q&xEMM=8bIr?JNoZzJdO<43W2 zn*y?!!DGDjCk5qxbDuQ-N2Ddi82(PP;y(PC~e z#cj4nQ1}qit!?-)(rpCutmAMNg}nASUF+Q8=aa{2B_<#9-~~U@qe85If+k5k=L9v6 zo1N}4o9Ri!v5*7(-4oQ%`A$0T1wXJ0bg_ejHGGdF3iv|=sgmUweUl~^`tF`QW76my zevAJac+$WMzmBvYVSwpKuavK=In46&@0*f8sxW^v%yZhrag#Xk6D3P!pZN*99ZPxZ zPt+k!>C8nQaZzA9Pg3uIqTdd>biKkQVfgVdyeJH>1eQ^&@~;7wF`)3;FuWePzQfV5 zM&Ml#>=pQw_n)Msn)-bRcCJldMVP*?LfCirw8;~Fqo?KFUFfSZL71YryoBaftm}E6R}(@;QRot%O|&yAl4y7f!<+2ult~n#<8C-1lc%ot)L$vZSA(39aRL zV7kW?`HJ;lsKZdZ!Y{zKbcm4oZ(Zfs$_q z6g3SIPPFECf1$gQzs~TO{%SE|nU(HDEW>CXcRfR2v^s#KI>qmh9yK;^S{`h38q$?E z-uK+`ET#Jof}~c_GC&U_{9vOU3EqE}lJwMF+14ChjW`bcqX=?Hb5#Y`{{i>v{JlNz z_>(dtTXwKKYZuneQ?KFWfZ`8!^st&R?N+M^*8ofBzkyh4{1#$y$cnG>eS-Wldz?lr zRXvBej>z%T=c!+-x;Y-Kda&5ebU1n=EiN=4LHtw})`wZ3NsYU3b<;5ECyn_NzRMZ z2Ma^C}N*Zv5wU3)&Tj2e}HDzLO@4(m~RFMp0N{0$52kvLn z_BF8d4GM)C=b7I8hg)wiab~oB(8!r8mV`6zV;M&`-;}&b<3>$@i_Rl*;q4ssI$bcpqvdo5G)?CQ?y5ZeqjLVe+RH=9fHryZo_# zwHDP6BTF)Z9Ex@;(lVPVoR74$l)~e~_=REo`xT$Ndi8c~?ag)yEIY0a!>4(%SMTpR z)7x6Q{055tm$o36vJt0uh_NgDnTtVk9=?v>h|}k!{sJjE&@JW+ zaK=Oy&f?+m`UHQ$0FSv(aS&yRSPsl(7~*VnTX(_yL%f~_+tw5GF@XU$TONEUM5UJ$ zE&!J9QFsb4YFUFv0?U~w{#alc3kpvJ7V|!fpzQBgq<=&B9YLJUA83eE3A(PG=hF## zf31LfBlOMjq7p%DDG0=^AXAlS|?wG`CkUkGe3U?_A+H>(OSMOxPN z3b!})2QCwG!fGfU&VGhYV0!_x!zwT*tO7c)jC)m}VDUx@uayd+{2GExTlNfs?HT%p zwMf6P3eSZuw@sg5aWbkvDa+0;1`fzlLJ6!4D_~Vv0sjc&za7SZ0~NNn*qgxi7CR8e zuhg)qWEXf9m60K>DkRgHUEy6}1%48y@UyT2KMu<;*l*K+No!HN04=P58A<^g4fRjF zF6fs-BEp{moSLGKN>v_a5XjPD($fhdf>4K_OVQK(5w@H+3oC2|)Pwh@=+_#hAm0M^ zYy??~C_F9pK)+An}o#RbX*mmCsB;!hNUn}2GgXQV38%{WtO z`e>Wz0PdKo_sdoyGJ<-GhR~1}1OAH*H$_&orz4Wrr|P{1DY0>3ZCU|rx4Oe&_z-YM zo7%IA&pjIJ-My+w4no8_<;NTA?fi;73Y9R)p_aT0*lbDO(^!8Ya^owPSd+%gFD8j2LftO`~o;K11WqFX_74dMt-oaY| zvdn&pyq%x(>-_>7mTTgM~ z$*~n3^bP(kQ>>-Y>u5w7JHClldu1Y)c3#R;bMzKQNrA`lH$a)>WVb@$CBV{s3O^Ud ze;HWRmhhe&y_eBvtaV{O5w(&=R@r1Om6=E3vM{yJ0?P$r2@mh6kI7D(;4$wrJpqRy ze$I~lHq468r#tEydFyaa;@tiZ+GL0-EM7dvhIa$Y7*+iDf#YrXU%)a975^h(sXZ<; zI_YD)ihLLBEKSJ4vz_#MT0qe|z@JE;E8GpZnGN>>Hr0iyD{U%gspMCM6~8btK;>;RkZyw@G&v+{8^TH^6Ii(u zJk@Rb2{HF9q_e|h+XHt9(bSO00q%&<2?5otS5wcIQ>I%ZLTx4a zT27ws%bzxF@-$zo{^KT%mYU+f8M+{Ggw|08on0zU;X#yRXsRn)CcrKF~wY#7=BXPrWmuzCHB?*@ZJK zW8aKi7zPf7)e=YHmqS&?#ZNDN!obRVJm#K6GJ4q$mL1C&QCO}#q+1nE1x~kNKX3|r Ud+CEXHdn9XQF71YWW>$>KYkH*VE_OC diff --git a/src/event.rs b/src/event.rs index 3fe725b..134a498 100644 --- a/src/event.rs +++ b/src/event.rs @@ -32,6 +32,33 @@ pub struct FtLockupRemoveFromDraftOperatorsWhitelist { pub account_ids: Vec, } +#[derive(Serialize, Debug)] +#[serde(crate = "near_sdk::serde")] +pub struct FtLockupCreateLockup { + pub id: LockupIndex, + pub account_id: AccountId, + pub balance: WrappedBalance, + pub start: TimestampSec, + pub finish: TimestampSec, + pub terminatable: bool, + pub draft_id: Option, +} + +impl From<(LockupIndex, Lockup, Option)> for FtLockupCreateLockup { + fn from(tuple: (LockupIndex, Lockup, Option)) -> Self { + let (id, lockup, draft_id) = tuple; + Self { + id, + account_id: lockup.account_id.to_string(), + balance: lockup.schedule.total_balance().into(), + start: lockup.schedule.0.first().unwrap().timestamp, + finish: lockup.schedule.0.last().unwrap().timestamp, + terminatable: lockup.termination_config.is_some(), + draft_id, + } + } +} + #[derive(Serialize, Debug)] #[serde(crate = "near_sdk::serde")] #[serde(tag = "event", content = "data")] @@ -42,6 +69,7 @@ pub(crate) enum EventKind { FtLockupRemoveFromDepositWhitelist(FtLockupRemoveFromDepositWhitelist), FtLockupAddToDraftOperatorsWhitelist(FtLockupAddToDraftOperatorsWhitelist), FtLockupRemoveFromDraftOperatorsWhitelist(FtLockupRemoveFromDraftOperatorsWhitelist), + FtLockupCreateLockup(Vec), } #[derive(Serialize, Debug)] @@ -217,4 +245,43 @@ mod tests { ) ); } + + #[test] + fn test_ft_lockup_create_lockup() { + testing_env!(get_context()); + + let account_id: AccountId = "alice.near".into(); + let balance: WrappedBalance = 10_000.into(); + let timestamp: TimestampSec = 1_500_000_000; + let lockup = Lockup::new_unlocked_since(account_id.clone(), balance.0, timestamp); + let lockup_id: LockupIndex = 100; + let draft_id: DraftIndex = 33; + + let event: FtLockupCreateLockup = (100, lockup, Some(draft_id)).into(); + + emit(EventKind::FtLockupCreateLockup(vec![event])); + assert_eq!( + test_utils::get_logs()[0], + format!( + r"EVENT_JSON:{}", + json!({ + "standard": PACKAGE_NAME, + "version": VERSION, + "event": "ft_lockup_create_lockup", + "data": [ + { + "id": lockup_id, + "account_id": account_id, + "balance": balance, + "start": timestamp - 1, + "finish": timestamp, + "terminatable": false, + "draft_id": Some(draft_id), + }, + ], + }) + .to_string(), + ) + ); + } } diff --git a/src/ft_token_receiver.rs b/src/ft_token_receiver.rs index 969327d..4734e72 100644 --- a/src/ft_token_receiver.rs +++ b/src/ft_token_receiver.rs @@ -43,6 +43,8 @@ impl FungibleTokenReceiver for Contract { lockup.account_id.as_ref(), index ); + let event: FtLockupCreateLockup = (index, lockup, None).into(); + emit(EventKind::FtLockupCreateLockup(vec![event])); } FtMessage::DraftGroupFunding(funding) => { let draft_group_id = funding.draft_group_id; diff --git a/src/lib.rs b/src/lib.rs index f02383a..87dee99 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -448,6 +448,7 @@ impl Contract { pub fn convert_drafts(&mut self, draft_ids: Vec) -> Vec { let mut draft_group_lookup: HashMap = HashMap::new(); + let mut events: Vec = vec![]; let lockup_ids: Vec = draft_ids .iter() .map(|draft_id| { @@ -472,17 +473,16 @@ impl Contract { let lockup = draft.lockup_create.into_lockup(&payer_id); let index = self.internal_add_lockup(&lockup); - log!( - "Created new lockup for {} with index {} from draft {}", - lockup.account_id.as_ref(), - index, - draft_id, - ); + + let event: FtLockupCreateLockup = (index, lockup, Some(draft_id.clone())).into(); + events.push(event); index }) .collect(); + emit(EventKind::FtLockupCreateLockup(events)); + draft_group_lookup .iter() .for_each(|(draft_group_id, draft_group)| { From f5f0794d82b16a7f3cca1b5763fc78703ea5f670 Mon Sep 17 00:00:00 2001 From: Alex Aunter Date: Mon, 1 Aug 2022 02:33:58 +0400 Subject: [PATCH 22/29] feat: add claim_lockup event --- res/ft_lockup.wasm | Bin 344100 -> 344910 bytes src/callbacks.rs | 7 +++++++ src/event.rs | 41 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+) diff --git a/res/ft_lockup.wasm b/res/ft_lockup.wasm index ca4a658a304cf4020c19c7e01eca2a9b2a49078d..73d9cc38bef2bb538416fdfddc46301821018fc5 100755 GIT binary patch delta 24816 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 delta 24371 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

J*6GB1d>{QM%yX{dU> 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 E0YRbe82|tP diff --git a/src/callbacks.rs b/src/callbacks.rs index b622517..26bec95 100644 --- a/src/callbacks.rs +++ b/src/callbacks.rs @@ -26,6 +26,7 @@ impl SelfCallbacks for Contract { let mut total_balance = 0; if promise_success { let mut remove_indices = vec![]; + let mut events: Vec = vec![]; for LockupClaim { index, is_final, @@ -36,6 +37,11 @@ impl SelfCallbacks for Contract { remove_indices.push(index); } total_balance += claim_amount.0; + let event = FtLockupClaimLockup { + id: index, + amount: claim_amount, + }; + events.push(event); } if !remove_indices.is_empty() { let mut indices = self.account_lockups.get(&account_id).unwrap_or_default(); @@ -44,6 +50,7 @@ impl SelfCallbacks for Contract { } self.internal_save_account_lockups(&account_id, indices); } + emit(EventKind::FtLockupClaimLockup(events)); } else { log!("Token transfer has failed. Refunding."); let mut modified = false; diff --git a/src/event.rs b/src/event.rs index 134a498..5f72010 100644 --- a/src/event.rs +++ b/src/event.rs @@ -59,6 +59,13 @@ impl From<(LockupIndex, Lockup, Option)> for FtLockupCreateLockup { } } +#[derive(Serialize, Debug)] +#[serde(crate = "near_sdk::serde")] +pub struct FtLockupClaimLockup { + pub id: LockupIndex, + pub amount: WrappedBalance, +} + #[derive(Serialize, Debug)] #[serde(crate = "near_sdk::serde")] #[serde(tag = "event", content = "data")] @@ -70,6 +77,7 @@ pub(crate) enum EventKind { FtLockupAddToDraftOperatorsWhitelist(FtLockupAddToDraftOperatorsWhitelist), FtLockupRemoveFromDraftOperatorsWhitelist(FtLockupRemoveFromDraftOperatorsWhitelist), FtLockupCreateLockup(Vec), + FtLockupClaimLockup(Vec), } #[derive(Serialize, Debug)] @@ -284,4 +292,37 @@ mod tests { ) ); } + + #[test] + fn test_ft_lockup_claim_lockup() { + testing_env!(get_context()); + + let lockup_id: LockupIndex = 100; + let amount: WrappedBalance = 10000.into(); + + let event = FtLockupClaimLockup { + id: lockup_id, + amount, + }; + + emit(EventKind::FtLockupClaimLockup(vec![event])); + assert_eq!( + test_utils::get_logs()[0], + format!( + r"EVENT_JSON:{}", + json!({ + "standard": PACKAGE_NAME, + "version": VERSION, + "event": "ft_lockup_claim_lockup", + "data": [ + { + "id": lockup_id, + "amount": amount, + }, + ], + }) + .to_string(), + ) + ); + } } From a989ea5e7fb3cad1e98b52317975fd680d4dd0bd Mon Sep 17 00:00:00 2001 From: Alex Aunter Date: Mon, 1 Aug 2022 03:32:20 +0400 Subject: [PATCH 23/29] feat: add terminate_lockup event --- res/ft_lockup.wasm | Bin 344910 -> 345243 bytes src/callbacks.rs | 8 ++------ src/event.rs | 45 +++++++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 7 +++++++ 4 files changed, 54 insertions(+), 6 deletions(-) diff --git a/res/ft_lockup.wasm b/res/ft_lockup.wasm index 73d9cc38bef2bb538416fdfddc46301821018fc5..d89b180a8a42d74fb6f63d67d8fb8305fd237e04 100755 GIT binary patch delta 27643 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 delta 27323 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 diff --git a/src/callbacks.rs b/src/callbacks.rs index 26bec95..3e16169 100644 --- a/src/callbacks.rs +++ b/src/callbacks.rs @@ -88,12 +88,8 @@ impl SelfCallbacks for Contract { // There is no internal balance, so instead we create a new lockup. let lockup = Lockup::new_unlocked_since(account_id, amount.0, current_timestamp_sec()); let lockup_index = self.internal_add_lockup(&lockup); - log!( - "Generated a new lockup #{} as a refund of {} for account {}", - lockup_index, - amount.0, - lockup.account_id.as_ref(), - ); + let event: FtLockupCreateLockup = (lockup_index, lockup, None).into(); + emit(EventKind::FtLockupCreateLockup(vec![event])); 0.into() } else { amount diff --git a/src/event.rs b/src/event.rs index 5f72010..247d21b 100644 --- a/src/event.rs +++ b/src/event.rs @@ -66,6 +66,14 @@ pub struct FtLockupClaimLockup { pub amount: WrappedBalance, } +#[derive(Serialize, Debug)] +#[serde(crate = "near_sdk::serde")] +pub struct FtLockupTerminateLockup { + pub id: LockupIndex, + pub termination_timestamp: TimestampSec, + pub unvested_balance: WrappedBalance, +} + #[derive(Serialize, Debug)] #[serde(crate = "near_sdk::serde")] #[serde(tag = "event", content = "data")] @@ -78,6 +86,7 @@ pub(crate) enum EventKind { FtLockupRemoveFromDraftOperatorsWhitelist(FtLockupRemoveFromDraftOperatorsWhitelist), FtLockupCreateLockup(Vec), FtLockupClaimLockup(Vec), + FtLockupTerminateLockup(Vec), } #[derive(Serialize, Debug)] @@ -325,4 +334,40 @@ mod tests { ) ); } + + #[test] + fn test_ft_lockup_terminate_lockup() { + testing_env!(get_context()); + + let lockup_id: LockupIndex = 100; + let termination_timestamp: TimestampSec = 1_800_000_000; + let unvested_balance: WrappedBalance = 10000.into(); + + let event = FtLockupTerminateLockup { + id: lockup_id, + termination_timestamp, + unvested_balance, + }; + + emit(EventKind::FtLockupTerminateLockup(vec![event])); + assert_eq!( + test_utils::get_logs()[0], + format!( + r"EVENT_JSON:{}", + json!({ + "standard": PACKAGE_NAME, + "version": VERSION, + "event": "ft_lockup_terminate_lockup", + "data": [ + { + "id": lockup_id, + "termination_timestamp": termination_timestamp, + "unvested_balance": unvested_balance, + }, + ], + }) + .to_string(), + ) + ); + } } diff --git a/src/lib.rs b/src/lib.rs index 87dee99..74a1db1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -283,6 +283,13 @@ impl Contract { self.internal_save_account_lockups(&lockup_account_id, indices); } + let event = FtLockupTerminateLockup { + id: lockup_index, + termination_timestamp, + unvested_balance: unvested_balance.into(), + }; + emit(EventKind::FtLockupTerminateLockup(vec![event])); + if unvested_balance > 0 { ext_fungible_token::ft_transfer( beneficiary_id.clone(), From 574a4b4bffed4e8a5d148135628bde374f23ae00 Mon Sep 17 00:00:00 2001 From: Alex Aunter Date: Mon, 1 Aug 2022 04:06:11 +0400 Subject: [PATCH 24/29] feat: add create_draft_group event --- res/ft_lockup.wasm | Bin 345243 -> 345640 bytes src/event.rs | 37 +++++++++++++++++++++++++++++++++++++ src/lib.rs | 3 +++ 3 files changed, 40 insertions(+) diff --git a/res/ft_lockup.wasm b/res/ft_lockup.wasm index d89b180a8a42d74fb6f63d67d8fb8305fd237e04..2f5f60f370cfad7589464d77be32e2bfbfdcdc40 100755 GIT binary patch delta 21506 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 S#OcHC*3ov8yb_}2JpOZW* diff --git a/src/event.rs b/src/event.rs index 247d21b..97cd1cb 100644 --- a/src/event.rs +++ b/src/event.rs @@ -74,6 +74,12 @@ pub struct FtLockupTerminateLockup { pub unvested_balance: WrappedBalance, } +#[derive(Serialize, Debug)] +#[serde(crate = "near_sdk::serde")] +pub struct FtLockupCreateDraftGroup { + pub id: DraftGroupIndex, +} + #[derive(Serialize, Debug)] #[serde(crate = "near_sdk::serde")] #[serde(tag = "event", content = "data")] @@ -87,6 +93,7 @@ pub(crate) enum EventKind { FtLockupCreateLockup(Vec), FtLockupClaimLockup(Vec), FtLockupTerminateLockup(Vec), + FtLockupCreateDraftGroup(Vec), } #[derive(Serialize, Debug)] @@ -370,4 +377,34 @@ mod tests { ) ); } + + #[test] + fn test_ft_lockup_create_draft_group() { + testing_env!(get_context()); + + let draft_group_id: DraftGroupIndex = 22; + + let event = FtLockupCreateDraftGroup { + id: draft_group_id, + }; + + emit(EventKind::FtLockupCreateDraftGroup(vec![event])); + assert_eq!( + test_utils::get_logs()[0], + format!( + r"EVENT_JSON:{}", + json!({ + "standard": PACKAGE_NAME, + "version": VERSION, + "event": "ft_lockup_create_draft_group", + "data": [ + { + "id": draft_group_id, + }, + ], + }) + .to_string(), + ) + ); + } } diff --git a/src/lib.rs b/src/lib.rs index 74a1db1..043451a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -403,6 +403,9 @@ impl Contract { .is_none(), "Invariant" ); + emit(EventKind::FtLockupCreateDraftGroup( + vec![FtLockupCreateDraftGroup { id: index }] + )); index } From 6c30effd67a7741184c786c0ee6ce086b41a2631 Mon Sep 17 00:00:00 2001 From: Alex Aunter Date: Mon, 1 Aug 2022 05:12:35 +0400 Subject: [PATCH 25/29] feat: add create_draft event --- res/ft_lockup.wasm | Bin 345640 -> 347071 bytes src/event.rs | 72 +++++++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 6 +++- tests/draft.rs | 2 +- 4 files changed, 78 insertions(+), 2 deletions(-) diff --git a/res/ft_lockup.wasm b/res/ft_lockup.wasm index 2f5f60f370cfad7589464d77be32e2bfbfdcdc40..cf076b9d90dc85ee9144b2a097924d1b2a1d73d4 100755 GIT binary patch delta 62738 zcmdS?d3;UB{|AoWnR9dRjU;l&zL0ybEl7xcsp6!xT3u*$r9~|zR25ZPl^}?vgo9CQ z?6HU75?j>TRxPDUsYa_sX=$siw#xVUnsd%gV(F*v$M28d_xm9Co-@m9W?u8!<~6UG zn>#ULr-;aV*P%>tP1c7y{?s#^Wms9gjx!>Ex-(2ElW}dAEhyclWn9zOm#LIKCm_0O z&p|x~bng2`w?1$6?~KRSd-v-)sP`NFY)b>m_8iptjeea64d~i$V9y={Y%2o7U+Xcb z^Po5S^yt^QYqxH1ywz_|=ic3I8v?>8-AXZF4YX|xC_~A{t8G(2Q1RP9n=c^rwH^-+ z>fG7I%Q3Rx4k0F3G07LHl+JHAO zUUYtk(P)V*BVlw0<30pkN^IaUXZc8qt-bA0UB;`q#Q!g1E|m1BYP zg7XLGW#?~>E6&?&C0oqjch2KG*hGHPIiLTg*D71J!uQVi`5%sKzRH!uuR50TKOF^p zg>wo2!nu^6(BCXOn&)x-X4zNLZwF*JKC>USFLW$&EOsn$taPk!tahw*{OGvhxaFAW zoZ_77)Sc6u)15P%1&$q#SPM>qD zbBA-cbDwj+^MLas=cmp?&cn_l&X1j+IgdGuoZmRVb)I*A=ls$6lk=+cXXkb2WLLIp zifgKChHJKKj%$`{u4}PtiEF8Ap=*&V*R{g6(zVRB*0s)+=UU@h?JBcvY}jO1eVf~s z$ZcMm_TlEj44W39uFKFnsEyg*`ul2i_LuHcs|OyPu?tyDoupqV8jS&)`# zJQ`zmJ2h^A339vKL23D;!&Wm^q}Pk66km{qp2fOtZq|?ky_!AE%{5mVhM^Yd10oXH z0eyBvEp{aT+WbO>--l5BhMaxkh3lSG^1fSv;)}WM%3k zS3l9q$8>8lb1|Aww`NdhWS?cMmj`DNQjs zU4CUx<$qCaH)kK{vukwcndfy@vmXCzjHvxAub$tzW+-RB=x-#~!RLbH&iG`t+Oc2q zpRQHa&d%sV>plvO+Ff^O^);KQ_hsBREhSAAG{L;3o8z@vnmUtSG1Y|o-}N5#JY{B% zMhf0W@7A;Hy%=}#L#hl~)(+Ur+Qu|3F4XPy-SK%;oM^?3*-f?utG8(;gHT57)?3!E zLX0X}bt+AmH8r+*$gv`bm841pV{+HF@rYeBPi2W1s2C4P#i5P|NeS z`qYM_(@iSp+WRa`J35vC)HaDOm<3S>v@D*6j+%*hM@f*lRSF5)kifM}B~3e6qFAAg zQju3GwHzf#-oa5NT}m4o+XiHG-i!u>tWt@R9;hi3OOMC8 z13a!Ex3hJKqnGzgMsnwRIHlS%7I zRRSTcX6u7mR=O)~Y0Kg4m_B2gM}JsL4I57)(Q9uV!igssByE8{TdNo`jnZXDnL5FE z-o=Er!XBl6rzNn(dO&IpE687(3bis%@6ajj*NuscdmbHq6=m=tXXxW^( zl&V526@ex4@<%>gS7BTAjgR() zsP;Z~0>t#^W9#ZJCJVt6pxHbQ{BaTl5PJY);#R$(k9ndoG29b_fY$m?_Gj$8zT~N- zpzn-!+;;VR{+XwIoXymyJ>3do{?yZL@m%GZD(r*&w$D7qBKP_ypD4fu*&t_gWrsMn zSAX+akMYTicIy3~cbhM|PjC0E`C=qF|0pP=xzfu$TdH1382{@t&;HPCbIS7%`5S2e z;)8nh3*NhdDRXxfinY7#k$UZyYL?7)=5D3FMVoyCuu{3#HeseTMF(KzcwwPPm}P+Q zw@5=eslWHq;NZ;jDB6&#;I`3v_GgiLM90Cw6W1XTDXuhifmFEq%8nIc&m1ABjUZ`Z zBTbXaeeqEwLAig^u?{<^hj*&Q7k{g_>Qnewv%sq!n`JW_DNE)Br^+ta*u zx5JW$cDIvW@^fEtv$*Bdy--+-u>aIjFDvrD?L36>RU`FDU83>_b#2XI5f*eCz*gzW z-4{FameJsI^^@HnWkUD%sP@1Vsn$910U-%JESgVcrc%0_CGuboazK(^7Y6PE%fxBd zWC>l*?D2BBHIl?#;4N@PDpQ62OOKY$LbIJFJv+BHT5v&hq6LT$w@WLUSE`Bb9v3yy z#p^^9PNNA~LYJMR6usYTQTp|s6>AGhB0hGhGYJcx0Nzq9)dVa`YGRITLf2l4b6%6r zy58-zmKgQo*ETdWDnN3gVNx@0yLKd}RG&I|AW;+f3*KP#DOmQYNS4s`ny-8HO}%1c z{H;0x1Pa-u6_RjNr|Oq_#W|12XI&5K-O@xdP~bpGH4Gg%wcC==ftz|5v z61qO7_sHUwKo=yeFg%$%RrjP}cxK6m(q1TT3B89Eh?3bxNozXm8!e@jXer06e+^0>fAB99XFqWw3B4hZwsHl9__1S&n_1k^A6c=YG z4hs{-SIsht5A7T0+$Nu?c!%PmL@-AT$OcX7fv*FyNqse6Z_cLaX|JcedNP*)ohNdD zHaa;QZ(20!!j96e$+sht9!+iJE>m4`c>>&l?m%D~)(fmSP}Dsu78w=wo3FQTY>XJJ zf_{Nd3XRcPh_xGhVk^NXM@$@y?pLesG%6Q_PUZLoKtSld+q`D9ng3nCDy(ddu@**i zFou@v@AZ$@>-T>!c$w4}G{x#NB&M^?`ak`lxdWpZZoO28B6)a2xb3~IwU({yk8#L z2c@5XCn>m4rgE^Ox>uk4&L^-5I=1YRYn<_$zsZx3$-oxXN>l(CxbkRO-Pk+H4fz~Af@XOXRM znwFC;YTjhk2zKyyS05&qPc5 z+Tm5jRR<5&|H+)gj_9*S=dq)D+c7oR7JcxT#`s)2CWXz=i^f!eC~J|QsMi`B7GfEE zU|My8{^Z!ce8wn|Fu`6^zc98YOuRZ*tLpO#0`=6a@*tFFvr_!4UWF9n9;p~ji%p-O zHG=1i)4k&w1xz5K)oYLU>KWtWuuQ8xDOq>FpP*m#zttK4fSEpPd~-aV8sA5LChPeV zJ-R-jqWMO(ZcVUY%o^{}drhq1FWJIhswtkR6$@JF_SQPH_7;NGztO*&)SYKv(${QH z&>xr*0o|Q3InvBLug{&_k!M{fky$%C8Wvfb>}u>Ay?^#op%;ltz>Qc)!i+nwAIg55 zpSfP5Li;J<><7K)l;MWWT1^j`8r=ShS&O*lBr_E=l(?380G-kj)VVa5wxC)z4n|A1 zHPiSbuyJp0qudDCb3c^;P)Ky2HuXVT?Ju92{Deexaou>$PIWUsrMjW_sB3s&8p)<0 z#ZdPA$5ggDl@(8P;2yn|UY?ncL-eTT{?>!ysFrOR>SQmWI`JSIGdHLt#FG9W@ni?? z)_>Fk$y~ajXR)945!1ruV&sKLYXKmsX)#d~dO_=yBt2z%XBy&^=?}q4@%i*N@MBe+ zQMExq7KAj626)8g8jo59j}i>8*dJq!90=s2#v`OA8DHvUedvsiVMU)KpPX^pZT2Qv zNLrD8VMcG~`N>F!Y4f~Dy=R$KqPR@_%;(EXI8#g%rZQSZ=_6--1T;K8yGD>~9Ceubr#@nK znE%~|_xZD%I&)7F^uP3?+4Y^9&F8o|3C^M~DE$vzoAZ$KfSEpFPUDA8%ICig^St}V(GG=YAk`&pLECE*Bje{v$wI($pteCG##GbjK%kacD#d{`BgNv+V3fHo=haf~7WB=f zpmR?kE%Aat)_U7{v9U$Oh#K=aNv$)edIg}FJ5ZgWr_YNmb4qGSEnNLtUo@{-OsNTj zT@t97ld9jCS1ZD=uVCSEZI3O@%iwQ$V7}#V34p()`}}92@CxRWj;omSl5_EDuz>oT zo}Salw5XtWp+(7dgRx{i1 zLA$9BUD(`t+)i}ES`c6S6EV+{iCNYsmFfP2QP8sQ!JT_^ae|pvcvgjmX>3s zyr*%2c5Pc8k;QjdGjy< z*`Qy|edvw`RBh&X8pd~e=jF}drk%6ACB)5F%cCJ~eqX-JdGG|~X6ZXtOp3fgo(Qd~ zI*vHd1KK8qc2j?KWj3F+SiioqsdJlIy1}X}cMd(%jzK9mKX@}p3)bxFc>SwYmElt5 zt5agl#eFp!h>B~TN2TY~4KZ|He|)vKqTzdy#vnYb5TM4=jhk>LuCA77LXauub1;Yi zW%o&AkSGE#GxgJ}YqR5e(3+PqrM=fIW!v-BwF_C&6dIDo1_o7PEFJW1M^BhrfnGp8 zSl#M&QUa|#b|^Bva7+R}F;YJ_rZUs-V;A&Y7th9vI#cbD!BIAC(PxB;a@q!c<+>XD zOv$R1*N2xYWl~T_UqtL&`)&St9r`DUsgxn&TnunAkTfhV%7>gZ1vRQKCe@hGviU@$-B&kNLF z-|F_~2kP6mhM~;Stt%pRLM7&r(~4R#DPV#=W!qi`)wTUuo^u{%NPQSI-)?_^jnNZ! zbSl9dnL8c=I~>@N#8&9P?RbH$)Suk>IrzGAVI8(wf39$3iL&PkYq0P0gLlrSAQ?a|Z$-tZRC-+#)yiQNw)35}n9eXNuFg8{;5eLi8!$|>G z0TyQ%NibZ{ORbzP(8+LMSbhr_SPkLdmOcbfJ5&tF!PuEur#IN!5VP2K@4I9oT-w`| zZO|+4OT~6Y$8=?Xb!-MD?{5o(dFcKmJTKkvW()NF z`&*Iy7IL5t`&Msp;1#wef8K!*<}4!8hpDjsqv}zn4;8B-Xb8VYZ<_wgM=v$KM&&R} z@+pxDHAH~vzro@y>lpI2da{JJO}-qYPnbSqKGs4F(AaV@B!GV6W3Tht=aj!ezx{C& zHd1f$$z|w`DhFF(nUZ#}MsQ|6hSiWq1L8zIV!`Ch)RN%VlACqdx6?ZvsfCu$9f~AdZ_$xj{-S|* z75zaLedDk!TIXnSQRiJnha9a{!)nuUXRaJ~qMO6d%j40X^LqQk75v2m{;%R!N)?Ad zEIpz-pV|{qILQSjhaJK(D^vn%<(cyStu*=cNaB~~9#Ly<1*`jj;7NKuD z+JcDxpQFj47m0<`OOlb8`nTTXvmw}VT>n`mc3D61*?2s6JvJ1dr;iO`H}nq2YvMWM zcq`{os$mP#)q~;CT}8(=H0}MoCcA>?82z=+>zjDAliTdyyS_o+`*{^qzx;Wdns@g+ zlYF#9o&i{KxE=H%SK3?kS58Eu>9nuheR@9iy(l-{>WV`au74=~3wEoC9?V)}?_@*t?&UfET zgTLbI5iBx4``dgbcokMnBv)cd`i$>}unqa4-#1}_e!S}KFGL0UQK-LpAtiFJoF;M+ z2V)Nm#x&Lu>OS3fq30bl$wLtKz~JU~poHP?g-1C+oujw9*pX)}*B4xz!RF|VFFiyr z?_HY1_U6a_u!14%WAEkX*)9Frl?c7=mCigPOYi(+q`v&h!!og<{_>A5{f{eg`lCOF z8<~rmACXHGk9PeWh|<4Au~IX?DUnL6M?`&K6#&5^i|6Vse~Je+zWmd>Y`ds9!T!9| z*3ID^>3_93T;^-9P6QD*yY?KLov&Z}gyE(0FFiry`+o6+9NAR}xql!7pAhBOfBB?z zO8&uLKPP%w_*){H_~f@yKT9k^eC=`EN;|N5UAFwo1~@`djp!xTfLh?7)XYME3UNdEI%lS$I` zyxlnDFH$|ohxhU?VwEs`$L$g9*z}fcj`Iw$uexRWx2z!>En*paI?Ui9DZD^W4p7t% zklU;Y?sJ z`7XK`_5(NjUM$1PaduWDRAbdbt*{;Y061O&b3risj%^WRL)e?_jQBHzRSMZAiNYi@ zU-h!=A_qRomt(Ce-H>q}WmUOA2(hJR@YD=ALSVs+k(EN!DI$23QdP_^$68dkN?XJi zK+9xAaO85${xFOatIkH@ERR8t5iQHJYE}Kq-fX$oeFU4=%}kq)q#4(4urzhIc)vW0 z4YXRgDDuj)im?_zB2yAplG>^Gm*Qf1U>zt7V?KPH3uA74@o<)oW=DntQ3c}HaQ18^ zqjmJtMP44m7sj+wC=q=kSZkDD7s0mU>y1bWIWLmEh55YNja5+4UlH1!Mff^Kp*i-6 zFD!=LWbA-Xjbnc^pQ94J9Ts@2>Z_H&&M;PJWa$rm_l)nA3T!#UJX5wnc0FIGDhvkn zQJTTm%FHP&1kbwE^^$%AgTjo(+EAv$fc0Hc_0e z#hzukqE2m=$R>-IYO|NvHLnD+;?VcGPEapwutx zvtIBbn{Tik>ajf{L&rYPhhl+lhr3*S-GIgVH~;Nm6LVEFg$wr{7AYz>WIw+lp3$oQRRuL0k)IYIEbu zjpe&=H)R#rHqpE(tIx)YflXQM&|)s6_@n~gx~8lF3oP12(-01Vzxn`+u613$+KV~E z4s8VWs-2V>E-Qo5)J?ty&Ddqe)(TH^=4G2itL9+8ZDLb%HUs#1q6MqLW{V*$*eLeC zxY+_cSxWGWq?YUnc1yg|lEp=o$}y42M9M?Z(K}nRs+gniTY{dpi)@X>Hn=TIs1n`S z!X-mW+67iR;oC|#XCfn0e66v_lniohc~s&-R>#KF5%lg=Q!|E-@|1V0sqU<0aC=cM z;eJG>sFKPC*ZYM8V65BeVaNi;Lp4V3WlOynqCp7`Mm1HIRVRrTr6N; z&?73(R{{UO$uZ4gHvV)1OQ_~{{5!>``f3r{Q70jL<`X`wFA5q~?=5BRH7R@D^wjn6jbRA!j zsdu`LZ{9O?;u$gGPayuLnEEXH5qQsd4y3V5{P-M844Eid*HnbU`#i*H5#>aSwC9;x zI@>q)dG@>lJ^A%ZV5qT~`oZ6#g{LEXKG2MfR5ywd9a$thA!c@DkGm}?Zs|rz-V{K< zwIfhi`-Qy|dopmbl=Uj=cI*TUWr<0hSe0^yj>49OS$MbD(+L9Mf++tod&=M5dSBYh z>=1`^ZqkJ_yu_tW`5{st|n%uv7}HFk1OQv>x0^8NtOFa%L#!q|AX95}yoWePS&L7WGN@3W6(P zD7AZwRSUELZ4?=Afo6{g@fK?vXaU(MF24mKn<-p_p$T`3=7U*6pat@x=sB2GPPQOe zrkI_Ce|c$B$-PPDQT?4-@AD02I}ldw8$5*d#vZq?Xei5OY7Wht5%Wd{@FtP*E*lPQ zdHY@VblK99P5i8|C>MwjRtYF-_%OB_$WM9?gf&_`{T?{?cQNuk=-RDf$$K!{wuo-S z*&z0%I60ibZ!P{A&YomniO17f?dW_`SsL>=46g-rj?=J}^>kJV0DS4Nhw_CxgT;bZ z9>~D*T@7cEAB?h3^7BiQS4mgsemtJx4$=x2cJC)UO-*e@bsB-_pQ ziEl@;UCxO!NqSBdD@U;^&N=4G7o$MQMItqmd7TGkTCV7m$sUc?NePn}kdmWunwCv; zs!kIJGg*4IZAMYE(K6V&#EulF#Ze$UrFQKm1^=V10i#(j=PDEKxzS83;q(N|IZKH4 zSJ5ZpD)p4?D0W^vI|e5EH8E)n+gW-SHivp(?!s0QW5%*t&MV^xz%{XTEEw*%I6am< z?=+=|I5(EXyFQ>{1Wo4pxx5Hb_=ggpyONT{;w;uN(p0cm`>P1zHivsoM2uq|Hd8bj z$Ck1+;_NsU1Eqg;9!nNg#d_f zb~Ir*7TtuAsM!aoGRh@L8><(hBbBTjdgNmvi2x_dOAU%`1S5<#k7OR@h&QG{b7qPs zr?NP)cM9-4Tilugr7n{yW5qIXD*FPXXse^=--{bMYfz%E4X3eQC0>_JW8Ix|*3#sy z^Oc{@ZZHflNU+a9P-g|q+*KlMCPuefw3^Afv6UisCa7_===%Zad#)J!0n24eM9M7o zE?X*A&0>!P=6yiZ8Lu4_H)ml&mx%b;;Inyx&1G?A;p>39#&%UAPgFsrv!R(5i7m6S zdNc#Kux>=O9+_6eU=ksAtKy7LFR~QbJ?qA|FLE$*?+PPQ6<9&z!Nd^Sb{U#h`7&KYagh8aiS{|XJv^UP5B-7M6BrQq2lAmn44==cCNC$-GWzW@tmiw4iUt7W6w-qJ z=zJ{jmWaRRLsqR46?0f*WS%iFAc@8ny>7B6J&V~wubF#{Bg==MTNfsVX5H6%h8u}U@asRxaeb`W1K)P&f> zN_Z0`#u|X!jMg7E)h9YFLO(W%tVIy;o5gD5?bIUn5XM|#F{@bF7!BaJqefnUOjHa| ztwZc)uU3lAi&=LJf6rp}S|u~ero@pYY8aMh@fjxZ? z4ukpPiDiJbOsro9n|`V|vy8O|x7EsJ3t_q)%>{p7@OhTAvW$J|aD6xI-N&RNJdV54}H_;oF7&{)!pjQR&x zIaJB?u_St!Dzm)K)bwFq1g1O}LeBbYP^An(z6GL79;^4LQJg4PZaR{4BbyLrhz+AK zy3>XF)XVA-&eYKR5c)`=kH)ZG&g5a4wpuvXfiAa-dh1xTP@g$A35M*Jb&#h&i+Sr< zoLf>gSf-e`3~DpFsIC;J)?v1{i4N;orBI7A4M5xeH$dms!~eBbJe|+#JY>=MvKfVt z@nM$Ux~mu3{R@bF`K)Sr3s7AVYo?u|5_TRwyTkljsET zY2Vq@Lea*DCGQe((8ub)mvGC+Vq?Is{#N3y8Ri>(79b~`-J^R~ct$rZjWV2%|+DPT2P zerT4bc}KY}^wG;aVu{E8URS9jmQ=d5yn4NWC58KG+%O~+SgP4#bpeZxGY3ZW3~)o} zBZWSQo{I`#DXkIStyuT$5l?LeJ(uhbwnoIPt&*M#w*DJEb7DD6@NZk$xO+`-_BK`( zdPUCjhxeW5d(~XFo$WRE*&)+lbi)f}oLGWr8?}R7fYIG&CtO1N#qyo33l^$n3fXJ; z8c+z<+9!T2#42{b@a$rpyrvoNKXODgpc^t%9=~CBZ^Ne02!J;Xn9?T;0pwjT|X;kplhzx4F{jo2jEj#y*^WKPZy+!=1ZAyuBZ8{V-m~2!4R2 zl`wbTIshsAy~sHLOMQhnb^x=x&{yswc!yz>#C|L-_D4Tvp$Zh`i=Sc*I9eR~6r65~ z3E3=0K?nN8%}?bLFX|9%*d?OJArSf}Vk*8W9hQhB6Ga**Qd>$Urzm$aUqH|24zY*X zA(42P)%s7S!_dR5Vc;2g5{?AN=ELkocGXw@2#f~w_3fju8n9n;6yquo$MF_!?v&uT zK>)2OXrm)jl=}>Xoar0z8Oygv`b!)nrKV*&)3ij4>wzyIx(dYWU$Adkfv^2Z=Aaf{ zIK_SjHXi$uH4L*3EHJXrBDLdWjOt&44+})Wmr&6^%{UDQ%Sh4fH1ptV^l3Jztl4!p zUj|!alh1jE4Q71q7%TWGTv73|cAUL}8U7?5J_`h07w?~C^_&xBc*+E^|13-5UuKGP z!K_|T7YJRhk$HGpy!jh87TbNzhEzRGxNpdtAq!{G8wZDwCO;!5q}ZwXmH6pvRv}C# zgYlSu|Nbk{r3ikahD9u@M6R{(EOTp>GoZ<)QPrlN74wVWM3-M)(dQhtjn0V6=b%Bp z7Orow1YW07Sr>k==&|4zNf{mZ^1`q*Wr8d zoQDwz80X;?I4#zlXAQ#TVCBBMfe8RUCH^|kl0n>w-?2QvI`th~#m7bG@1+M~{r52b z<_pIK))6pXy}+sk`H_Gord@!O?X);_0c!8GxOf2zzakNHkv$kyBr!gl7a9Tv!)X#->Nshbc zC3vpC6jv{?`c7j^4&iwYn-oRE6^AIRvOw|V5AbRiBV+OpSdX6;JB_caKd_W4W<|Ms z;h%AkLO5`ff!#vp4pqMvtuC{En2`L-SO}dKXD+jmXt?tgh=tQ){1sL))M&$;U7*u< z1*~=2ckT+yXDB-TC$<7RyDhIueCk&vJ}+Fw4$W!t;x)*e(_+#!iN4%x%o|&b6YPCR zoRAE&A)e27{u&GALEjK!Jq(89IdSV3;!e@|SJn;`l=mxZQ2MlfQlRCS$5tcc$?%S^8^dny_(V&F>7y5Hj_vXX46O?VGVB7%ZAV@Zwh?;-x>} z>bkeDAFlc5{>8tK>`1Zn25a{JFYkWtpFnu2I}pSpe?c|; zJOSRV;R;_Ue!GcyW%CrxpYjxqc>ESw*t$tzl+6df!o##n}KJfyJXd ztMi9=!oe#B{$RFs!8gdkD>L?^_`u1HGe)nJg8GX%;=%|n_^!DOsC3RqZ};A0(JqLf z%A-cuGYtaJU;IG74}vU3BuB@0UkTxZ(zIb_AAdHWofm+%P&`|f6F%h0r9W|UDO;=w z<$d|)k$St~5#>>b3?B98Vzdmwk)qxzzlNhV#rG_To#lALk}18h*Zod;jLNu&LHtl2 z&X3=4imR%q6UN=5Oc<|5al=ce8E&UNA~TG)4qr^+8pZ)Sus_zAh+Gq2h4Cf`HC7{d zJeEeu5j?f*4eAeM8N!F)e-#tLc=P+#jS+()(Re8UA*BF_VG;b3``5>|-nDSxzZ8T= zOF=NC!{@QgkzPsqtYH53@v_SD8QSLN!a~@2f$A^P6rxj?+UP};6rlbh9*pAeM13XC zTGJ~0CYgq)gH00cJ8>wA*K9@%4%4n|nIIeEiao&LbYX9a8HF11Hh3Tp=;9H-vsfaq_L_Z@&DhF9RvmMuL1u|J+aEPjnc{R{FUquBe@AJMFI#o|7UmGvUfIgH$JpUb|@ zk?G_W`X@t_OW@(6QbiswLMouGPh?*Fz1qsG2xK#nSCKy(WHsqfX9+cd*Qt(h#=FR4 zm4tQQaR-o{pCWq2^Y-_hJTu7Wt|1gpDmI7y`=pkhyy8iXPb`I?;#p0?q|yK*!W6At z8ijShwlR*Zx*ei%0%VAmd!V1$$@at=OqHv~VC!ui*>e;RCG(6o zm~bWD$abT8MqYpz>EVw(fZa4~y?Yh%h|;(l_f^l*kt~W_rSs&F_g;9y6j_yCP?B7S zI0Y@f^6&(qczIRvxR<*^q{9uIgHo9A_dPtOF{VxS62*a6NeMu&-0&*_9L!|)0VN3c zeZ`Yrp6I+x@-ay0Mc6XR*~0?N^G@giJST=z{)lnbUDSDo$2p7Si!Qnh;F02@m&ZM5 zo{Z)Y7KZc_T@w8(^G+}+KdsDLSC}WW6uBK}(>BmWG>I4yKH8{@MeQm)BEfX40hiW> z2RYku<&C-F(X9%96dN|H>1&?&qY6$CZxpdrd84L_2{`Sb7!cbL*caUPW$>w*OW%?} z(R=KLnLsC0wSdNmpQ`fu*fg$GjXxY_3`L>y@+f@`3)o9yST(*pa;8*%Xds*1ZpgqY zkQT0qJPAwCUWu?E3dHC#$3Nv0`R* zUL$C%+)c7W?q!KjtMiB3+*pE{XvpiM8EkciW6?sV5tLM=kvuSRW~pIiAbS?6h=w>M zpjcOowLv)?8)$}<&7xxsUe{T;l;(AUm{xP_@Oy1v~+GheO}) zc8T1YybjM^Ax_uiO~P_yC$`g2Xafd#_(xPr;t#4>)D5k&wn}yflsPMzH)@X%`9T<+ zi6pqP=`O9(SZakt6HA~p3rn5wxcFO%yDUs0p=lVB&WoE#yovLQY-ECHmW-*pE?!9H zO?l>WF)f+*toff|ty(GmN#Y*ya4jAkx?v?D$2`ltND*r*@i>uHi+6ye99|oe=w>Yl z(TS_Xq1rq#WU)NVXktO^s>Q>C$YqHJ-Ez^J%NZjoN$&JWg+>@DIa_Z)E`{ zGML+jD_O)Nb@+rz_sSvB09}FI2FNiiy!wBuRERBoc?hh$hyz_Xu z`!YN6MqU0GqF@T@^6&7KQ;(BBW`8}NiLb}&^9Qg`oK>G^A=kmo>j{@ z0K13OqYc4m`v^`Y6OKQ10;R?vRpdO%!+F+Tc`~;6_0D8@VD`UfcW=&@5G27Pre6R0jCv8p%KJ+5q=#-%Rv-4c`jGC=08N2DpCT|gv*#x znXpUzWAvSQ7z<#`)-R6$Cp*NWZTNhAU24O}{l8-FralHOwL_eFjQ@ZhSUG!pm7bUEY{IvvG`@k5fIBAre=lbd z2jM%VG``ChWE1>_>8RE6}{2^?Vtwhzj+pZ$bi;Xin0AWkDHR6So zqG9{JA(xq?C}4sFX)+_|9r5!T_}_|tu#2is^Xie-B}245V%#xAu~wqT)8PCwbeEA< z0gC1)G3RMsHSW^ql(3K1qbPk)X6Kzi8ftv?G_UioAuZR8d#McTIm5J`pLvEiaSMvB zDuGJF<_4Q)n+EqPGPrZhDu&@B5R9}LzU{UWa! za!nqUu};x!f06$|r)V~I;;ky(9a&4KXh3q>W?6|&(Zs*Z-*8(6jWA74{ukLkK5r;# z>Sto*%lwHztI|fnUg1rl{F}YP8^gkW>lOZ}KXbj<{|a1w7R2@9r&oCOn8|V+wf(#N zSMq6Gh*lFRouM!`iIJW8udx3Icj50QPt26KOXL$dMFJ=CEKX#M4f+te>_RI&;)-24 zW2owWl{bR>^MzOWwDOAxk92J$!w3p-gWN`O>s4MM?uP6}Rbz0Pv3@pCdrUO!#@p6C zW;9JJ6=QxbOV)<*(uhy9gJXC@o^2SZ`j^Cj?mP|i z`&DT0PtSw#oIwpt?Y#k91)Sd`Ez{Q zI+CT>5g64QE0%x6_TK#QqqVVDIAAqJJluyTmzhT$0EHv@y*|8h^ZE3y zF%Jc?t5TjqMp^4{MDba7e@ek+T>Y6LH=pIsq$upmE8KZ4TDGxMEwKWZf&W@G1)au9 z5<=W4p^N%`d2)MGh*JZ8A07^c3hBW+~+3__v6XICVrvg;68J`!9OtX zW5l%tCF3W_RSPs`7+2F6B#lEM(7>QN)k_oyRZNp-Tv#K%e}gx@2PhDd45Gy?H%6B% zP^8QO%2fi?5wo8?`tz6EW_&5#IcTFB8MT9iIq=<0Q+eP+0 zvkiYhGd!9r-Ck}Ctr71;fW+E2dE=;}HGpL;OZ}m#+r+Imd9`~utny6#DIHdYrv8M( zstzV#>HuE*zWNL#Y3VZx1F-a&R9KX7Mf^2@w}HGnw?c`lOevO51NNa!;9$8^r)95J zx{7ZH@~%*9tq1XUq1bi};>o2IoA?_^2)95^Me)d6ylm-g->Yx&x}1;B6i3!5;bO(x zy!O9nzcq4&;DGkK`8EQMEL~-2KSpQ7WKZ##0YUqjm^cKB+>N+m2oAjoLwKlg4CNJ} z_^J$rfL$*J&=h5pzSz)P{bAcSye1Fce-xU&nWNKMrm6@i4v{o~23e@oFWM z6Je>eays%Jf3v)$oczeXES?$86QdRr1;Wa^A~i-eLu077#MI%uQQ`zseO!}jf*@xs zDFmtfVc4uV@(v1gsY}Jr!}+Y}Q3Q(Um}Ux}GwsHW&SFtI_r_$9X`?l!;`D@kK$U^y zXVZCYsFSi8{E&>;)zE<(2I=RgSZWn= zEkho-p`0bMiUL}GH;cdNwjh+EWxCAUrX6vlsV7A6I7!Q0$AOj)jsq=^8ON&yT2M9$ z%7C5n={VjB6kdKjZ&%ScTEnDoDUsg@@CHDMTQ$~;jPd-*z@i<5p(KO8>y{;jt66MexO#NwPhJFyy$Mna`S(SQmaG(ME^=i-%M7mimFc4!P@6;vDW+ zaTM9rS4w_YjBS<@*;cxB26vTcKaYn6x%|g&jRetpI{5Dwv3fc-Z%T_%mnlZUYt~8H z@#6Ay-rj2+>oZ8yWh^#slqmP7cx48E#%mq&yKlLX;@Ax7nfz-8r&Eb-1b@1O99|^2 zo@}boYqXm>$Izo2?07a6X)ZT3=^T7(+eEjSyoKis-DYX2QY2qQ&>N`Bk*4L2pq%Z# z-7|TiJS95|d-w%n$t>=TH6!3?rLD{)XrMocDmtNmZWjLyZqzSk^GYEXtZ_eRe?#MYi2b&ikimb^t=jzU>%oW#=EiO;vi3s|~JW+s-aX4DO zzFpru8_lh=(YTF~E-%r{4NvpZ4p(p)RP!H>zB!NAtY}GEYYqZ~Am^+y<3#KE{MB&d zpgWOtsHD9UK7i6$o+m^e3t|F^4}t50dHU4z#DH#@>9zK z&weTN1)M^tb}Zoa{pZ6Z6PlcQMNZH$5wZ{_0rqMZ@@6sX41O~O1#$JX?KD|GitL3v ztNI2rn>cxgv82;hp%6JhN>ISG9YR~g8;7m3ggemS6u-QcrojPAM zUcv{2{=FZ=kv}qW1c|f7mL>cxAh`BYI4*t^J(luCe9jJ0W*JZRlcI?X$UUI;8rJa> zMf+vELc|zDBO}oeZxEaaeI2!or(l`5VHs~qzmxR&d;oa8Ptz#a}FUaZCpG zc|$=DSO$Q|KNp{@f>c+j$(#K41fE4WwsFw(X*XrpEplg(5dn=$W!NNfGcQT`e3Z&aZ=u zbK`Cix1PJpTfcz=uiviS7>(up2X_OG(-T8-Y$#ajl5EfWz*;3 z_gG|xc99xa{}639^6nms?`H0yL_gmZViPuzA5hdKLOp{sOEs@^Rb1c5t3G(Y4q)rc zzkE9&Eik0`jb;P<&*J$_ya+~f&H?_anB{}@xJ#__VefMfHSaf?pZth-^*yo~KDrVr z`s&9#1;pQRvzt2>XU`*tB0e;sU;QB*c&`oux=(LkJ{ZA81 zqq1rDn%Es>loQT5vxtbch`d6`n=>ML7x$E&SzpIpd<3GZPtj}#s29bN5M?G%H+(m5 z8E2&y&nJvw?EreXTb$a>k*p>y}a*UtSGBMd=g@7+A$0}sq(fd?gD zIMww6d@HpWQ$+bi5>uf3+M!wGRnx3u8^zC`@CY%lfX5>TS_f7k>?dgQ?Y=q( z`5xkd-#?W+5OwJP;DMJ9-J1ud9pVEbP2z_Wp6HjzB#Y=b{xF{i9$0=DM&&~B$zdK} z-C_l35BkB0i$;Kz(WwtjgNCe-H9|eYQ{nc0<_ND`a;iog;gK8b&O5^E z|4*_q^eFe{$Z439J4Kb#*sdtv_Mv7=DFC8NThM-n z`==|x`pJNsMCs$TRhG}{{S@OpG_y(IhDt`j;a+pafuiEXX&!UGF5jV***cMUhS#|- zDgIwAlP$eh96Ze{{r3icIl~*=*Wr7y*apC~;q5N{-{mWQ7Ifd@EJBxx#OAYis(#;( zXZdU#SPdyaGBQ+v_Q$!IN`p+Uw{vB z=oS7rW`ExmKH6Vzy|2TMd^q_8kNt$WlGWnxpKyAmK-{>>tK-dk4WXvE0_+-ixIl<& zyh2k;C}@SCky3s=(vho){YY9J#LHBJ7b&{oB2FuorVrQ8eDuBOWB$)T^H_24XI?eT zh~1Q$3m}PpvP8fy{E7cb`@Hwd{duso_IdDsf?NI9{|dK?nEETC>;88k1|dV^hA7D= zDYi`gh9o1BiWeNk78b~*c#Tm!FvG`y8sg($5bxjmI*Vw9-(H@wR0M~g1|VCiN3 z&7Uu6EOp&UcI}Lt|A$#S@aDg)?{1X9JM1ms9VvI={lraa*R1_V+BHeH;KeLuv4~E$ zq%AY-7Edajf zNlvh8moi#P6e`OVGFno(B1m<7sVG&kFl2V6T6JrRWNAW%8SNpD(z@xOO%{ANPBmY& zw=1>bG#O!6>f#cw4R+;Gyxp=Z9TCg%Qh@R>JTVIbl;939Ih{M zqMo=30awzE1@F`iF~gzM#17(z4n>QX*YA-1asvkR!xW3HVVLf6(ubVjl+fRHDs{_^ zkn2%IaLegRfi+&>ROpJZ&z;JzfcB9~dAXK(jR3A|^WO%By<#vco$SA(A6a`uhd`xy zN%A6F9LuKsKxJ}?WfPG{Df3CZTt=z(u3zquIyV9 zW9CBh^K#0+FErbfSMI;iM5M4^62ce)#*lIsM=mR`kjEt}Oc^2)-{K)6BwUHVV^!WT z9INmWYt1hrl*tW78%8OP?HK`8AT~EqTxI{dva~&h^ZpQsvm=!T3I2tru|T0CKJxqu zf{{?@xVRdrROj1Aidqd7udi8@vVfTFY&1NJSg=PcCA}~-q|#K>Iz}n>!r)Mh95#%$ zVKK_6P`~EK%~MSMN|cRN=q9~-v5E&xJR7Tw1nHlQ1xtPN`prj+Z1lh9RlZ;Bq+6$WwHmN zO9sgVH{_csOpDy6Rw$L*7G(bP&qo61Fk-4n=-8$OXd|QxvpNKxaOrB+hQCQWFHGGm zG`BJo#Jtt5cyZwQtXqkF!2llAz=riR-Ps|B;Fa4aaEegB@K0$QXU!%7`bZAb&4VgY zElM$J$>>{#e%rA5+s>ne*Z7o5QiKxSj^kyiwA52O(2ncqeT5nLrKRE!;z=GQ6S4Cm z+^clJw+|u9D zNvLB+pfePBWG_CECEpQ7q{>U(F&3^Km1HS@P2D5jt)c{_1NDwUURRn2E_4byDuaaE zw{IuBndSj!(hf!$4JWKU!A1u#Po5C-(LTU~+w=&Goql3ZkXVupe@;v19Pb(M%0Z_vYc6aVlipB z}Ty`uGVO)e`^~Ja+he&~1JV=0yX-KwhW9E%I+2DM4x=~^; zp%K1WEkph!Vu?gIkrn~@lzA2*gk%A?JK@tvk z1$Vr<)arvp3^bsNEZrTu%$-o;JfLiAr7?0X8+eedTL%LTG~$$>#0XKGiOzV64XKF2 zsDdt0hk#78L)i*-=!VI|)MC7vV>FR2+cP;i*>;>0rfG;KTsas1XOah7WgqaXmxyH6 zjw~&NqzTmaNb)q#dIA6fU9-*c8z$bw}P9P$8D1JFn5L3!@Qut4n&6SdV5ExT`qmCe4)03V6>cE{h@}3LQN^#ni(j`Fga$YK;S>u<0C0P;OdEC*M zX#X_lDUFmO2KowjN06ZLy34!6iNCPF>E>3a#W3wvJh)MFMKDTS>#5)ERGSlJkddtjlyIpw7gkvXkeQcjEf@fFr3Mt??}p` zIS1!}MQPTFcIJ^OqnX0*Ci6st|KR83o(O|GjWq-HJ=#;r9pS0$4);XRmPv$`(huSr zeMC+q$irR9U0F3PBa+i;o+x*uJB-E(Qg@+%F~>N1Nm9j{WqR@eXJ{GpQ^Y*!vA{@D zn!BRBX<2y$yVyv8=>{nD1d@w3swbwoD;Q6e)7+BTxt0v}tZm!OX)~N_wTW3tSabT( zQ-T!ij-e_p`srquyF4;*^M4owuqVuoUonJMOP4d`3CAFDdyqSvw4N~@iM}HEE)0gV zxr6A}mpE?S9TjtL@D{i}qa-2NfY~gu>F>%@+=#y~j0n`#6Bjh7Z4o#AVeY(x* zRuvhqkHq6PDLg2Im{b!k`}Bm9SkunPjD|SGfLB}~1S1x^BboFDn!;m-d~68+7m{MM z^nqH&h>@8?U?AN9Q7SDZ6q2O7rQil=o0q4P+%oitQ^qY*lXlgJb1{f!2MtD=wuY&( z&m0^aXq5qpZYtMKl2+1cXqofy?T?d~MsKi#wv|e?&ed%oksy}VP+A0821R9vf} zWX3Ev1u$;@K<{Q^u+!-GebuYt{hG>?W|WRX%W53`< zlv9n6RQgROfHTtMHmmq3NlA{7A*ud6$aNWo5|pewg&@X`$x1t{23932Phf%m|5W!S z&`}jl+cVQWOkxt4KtgtsK-j_>mY}S;7(fJ65JV6J6chw8AfTX<08y5p1cMYP2nZ_3 zzD`)w@PY_}5Hz@f3K|tzBw#>6kngF!w3pQlF}3wCC$na+Q|rhb_s8sdB(;*-nUm#JM7(b)b2Wi-J} zdgU$8yPJqR*l9JSxkzihTU|@yE;B7_r_}?8xf_L+MR=W7zg96(+Tydex#%3I+2C|h zs^DvhB2q=yc+Epwca(3o@}Ot4?>?HGD!RmLb~h*bg3hFhzA!|0Y9U?=)C@P!=@w#W z;2f?jBhkliRT{b^8$1hc6(`tDdtxi`KGv~qTZ@L#Wt&N;b8{JM*7&FNLTj;QfXis7B!b>SX;3feKWqD_#k*0 z$EcRY0!k>om^|`x#v#74++q=E@;4|bhJx3O9z*-d>2XVDr$PY zi?bjG)u+JJ(Wk43F};h!XnI!>fnqM{3d7<)I@wip!y}*6qMK-7KSM*hp(`Arb=^d? z>rWQx@Xb5iP4vO;QN6pw>rA=-E|@&Or|Wl#fn`V1ls5_rgqtr$-z|1nH(x-R%3^0L zF6nW;`6B%uF$eaPFYgh}@I4i~i&#MQx}$If)Tz4|fdXynE>bv~pSr68h4&B{xUO>K zeWE6<>>>DU?8zP?*;}}%d&T`I+~|A71$^L;o+$pWw63Sf!5DAd3-rI!_+H|+GN(f> z5DX{mbooIqObc5m;yxHvRTjg*{fqm=ZC>t?y~UlbRq9B?uQaT;NX9Uk(;HTx1N2jG z;p57frCb@Oxxlr{{U~uE?YLjGL5Z&14>7lh>h%%L9EriW{4rZ%zGV-_IC#YnHv zzz4)q_-)F5qB*=BTlN#f>TOXIv!X^znEkr|Mzt4SKfRsi za*0Ov7iH%y^69<)BBJJ-YB>pd%$-Hn&}DAgnS#5(Zo1N6)J|Ww4+ZuV22cR3h zM~@Fc;oqYfX7Kg^kq4;NK-BP$)N7#NBLd?GiWWewH<9~IJzEA|8(rpik{t-GJ9=Uu5%{XaAu6{^N z`b(qsJk+1wtjblcwZPmUi-tce*cl{!uy_uY^Pj<@X89?UN(ZCbzN4x`L{Gn%r-oqk zeoHHdi2CJYJjFvqx^-40jyet%wOe0PLd@qO7M^<@ICeMv6K>2(TDn;WMmWa0s0(v1 zUTCRBhlYyV+h{g=0#)zKYcFxlN=L#=TzO;T-+c6|gM3crfdtJ~Q{jOxU#gGjqhZ)P z*+tiIs3uV7cajnw6P@f|d4@hF-sXwc{kT{Rv9td1a$=M#xV#ws?Qt>ID@L)3G4p~L z%^WG}CQP>m4mXuPp;ktO^BQ|cie9&9Q!q|S)qX%glKL~YB0vxcnyO?1M)Fk zy?BjehRExdYmKcEB}{+EG@4*OQ4T8%4B_YvAy{coRaETS3XFT2l?K20#ENnpb>RNc z>r|W}hPjH?prPDXsplwB8xFhAjuPWsn^rUKB3&LO2D*wZVBl!c!c}Skua6e{>@U&K zC&ihNSyl#xXpE0(&=?VK|ClC?5plT7deIn&@l{kbMs$uSw1ffIifLDZ%OSq3*;vuj zJ5Au5P(&vAnO++UF_}%l<6xP6iyDm+?IBx7kAt*4MoY&*Jg%az$6*RsL_tr936PR6 zJS8SVwmF}MY&$}&o)%+kY8eKO;0x~VsaE5h)DB+30c0O98s@ET7~oj8M%`1gX^p!2 zfx3+s6)EIRdw`=@ML;qP9xo<(J$l>Cfnm$_;kGtvI(TKzxy7GrgW`l9P1)ylisRsu2Ve^ZQ!efI;TH24Y?Uk)d3 zibZZAAcna~F`o21U3>=8X9-0-i?aWYSBylw?}1ax<-RqS-n?3AsQE$tfSINaoVs$? zu%yi)=W`;>aV&=(Y%bxHSt^CBYwvoFUWJp5SeLF<(Xn)Wv<#->&xvZS|5EeA zq@{(c+Bo;!{?dA0%ZcI>$kvcdF%HK>N@j{K<+q*bSSBRs59H1goy*5~9?24IS%QY< ziod%ap-3%haKMls86DW-KD#`R zWsA4)1fwVP1>xYQ7_;VJZre^>rwV;hL4bKcZ7)_dYw5vPgzrTKWt(Msm61G6jPQD} z_-vLfpC+2bYte^fUeV{Jf#kb9O%3MQ=@2Hl`?>3sc=}FI@Z2nl}QJkhYhE;Sk0@$_b*9WBg_zMs`Lwig-en30iU6f1@h7whMV z`euX2(v^8wW&YLpWnU?4{DLc>8x$jW3qDNoAK{R8Mxm%m$L2%9-%1T%g^}WWdiz!3 zcW%IQ>{Z^!)?*EqIxG*pj&9t!Ku+NslfO9fS2c z9BYIk+PXyC`oCIdU0kbPu;@t}*OK7?SEp52Q(nuaoqI%BDmYnVLOaj-sV@bPwdMgGOQTbL=fhPZ zIdIM)9+8bxZ*0sMeZC2V3%85!#@LKa(DYsrpT)aVaj`0?t0{FV%m168x zRi$rQpq3k9?%hW3Y{ZncjS4r4QwX+i66yABb2sCQx6`wmMI>-=QmbS7ny7X!M7uAg z1Di#?24xmMSmDbrM9f7pO33>)4&|wpv_&M`ZLKX>**E2?N#b=1R7(rC=_`*j?89(( z;qS&ij5?FbTLVbLb~`>ooVP{Pt1`*bocB6mR#$!S4?4U>H1=NL4B@;cR(GC&mO}3ft*@5-P zOEhDLNDcf&wRk<#hMP*)cRzq(?LTQFzDJ}~nXJbE21cV@@>mn!9+!r zbU@U_tpRr(5N!f?tLo>AITjxi%{}`Lz)}pM$6X(Wmh^+=3@tps%Ntt$wpUO7SG~H& z|6Ye)5(GD8W2UA0{Hw05?>H#mwKcY^iv7B_CeT%U)2>~j>Ne%ybnX9ICrSBCBzkW( zC>!d#KgMXn9@6m7M9VwP?Mo#C%C;{R2pb@aGhVn^3JnVilZZPDM=W4Dhu><1ocm1F zZ>sGOC5w5;CL0TuaAp=3l%-(dBM{3DS7_aN=;tEoFE=r9D9YN@QN!xv&qbtHmYr0x zEbAtQRCxVIP}~6i!^E+Ws7E`c~ZI?Hb3Go}hU1&J?;v+;IrIYt-+! z@Pz2bXTI-I!U+-HOm`ZE;x6Fh{c5@hU^fWeW2x0Wu+LpY!%m3$ncnWf-NI;OEPlhM zdw5-%id88!t=5@KeX(wIJM>TZJ-9z&RabkC?pFZ3SP<);&ywC2R1+uj7&dG$Bo$M{ zcVg|$Z^r)WJMrYdxEXuFKi-V}_V?JnJV^bDu{)%Kn)H4#w2gzF%f;An0B+KcVr2Ll zE?-cR&5@?=B;@aL&!Ci-WmSs)3FI^AGmoqmHiNY~%h3=Tq8(p0mjd!-8twT>ybasw z$djUTboocd)$>kjv(>%LbND1YZtROaf1Jj4s$j!Jb1eoyA_)9NKzTGYox4)1bOAS7jW~xXpp^EUgW7MQmX<(2 zC?$CwTDyf>e_r%Ae?QH8F4HfFBo5bJ5LGja*#*#D%pJsZur|tL*jwuN8)(X7m}cH= zUp{!!%EFxV;p|U?yGsY&kSt$ee3O|NT|~}o?+vL;jBhH7hANec9#PB7C4d{bVPVYZ zX*Wb$7@ANj>butPJ99<|o!BX(x}r_^I?G`2*sk!*E%-5`fC2Y%?n#L}9Wj4@a`O1D{oq7q~fmh0E zT*5+jW)5|{Bx<;3Zeg}(DB}`ZcO4zPgbm~6IW+P&Q8jQy4#(k^RXXvctU`-_6RD0L z^71D3Rd(IVt$xYlcy=*F$)~*xpj^q>m5ED!S&_lpipjG1DJ8rynDL~%hckNVcTv@` zB8R?uQZ}Tb-$gsG>A3!7(cE=hedsD0dRa7Jt1(>`&p6iPP}mh%C`<8@mdM~w*?L7Z zbj;jBKVQLK>Kc0S5AirIq59(wm^Lp^wX0&F{X(9-VIXyG|AMVOV*$w^BQ?V1vo{XHwoIk~c|AM^5b!_HrrQX-Y!k|x8^CD|^ zk>~n#_~4=aj@xB=@^+4ZPd_%7umVL^?5*a|mit>19DG$|ePHtGE(ab(+)g7LvOTu* z*E-}~fc|vIA=nETEM(`v7t}2dp}0T7kTR^k-s)Cuxq#!$CU>v!$&(%WBaOYZ&?%cn z7FZF`m$<4wQ~cZ(KVy{wt-g_8#?R{f0ah3K>uhPRlyh)(R6VDxg-6u-HR_ifaB2vD#%)Qs4HugFP{44NaO$cxI!Tx zS740+zEbV62b1M)ArubIVK9S$qR6DcqZ+A>BKo+3jJu=Q+$Rac2CKDY;$}*9Yi)Ih zk=d2Gp$*up)O(pNQ>dG8`8gZK`4}~E$(Hdd8FmX*l1$W!LSSS&?#3Ov^C`!LZ=FH! zyJU2etNd;Jh66ezTE0>cy15a+otI}GUdZwch5j01Q;>0$f&$R~i|DQZSq&4*;{kY# zBJ+zMRqI-5Dj0Q)au~pV7z`hOjME=uWZr<;#`)mg1CzUDE?W~wVL@`aOI4lmk!M$s zly-P%^bL`<=$Bx0+8hcFk=^Vk8P(06<5?ae*V-M^PEwyr@}9bSTg^;g4_<4NDjY+U8&tbKFb2j&AGS1XTHYr*Yg56>rSEq=+cFGP=db^k8M# z1;XK-$}-)t=oFPymSN$GPJsjt!s=#kh>uZ;()fg;s>p_pspqJ371^4@sa5b%^Ul$L z%Car}Ttx;uiqFx?%JOy&nGY7T-NR%RN8Wjgt|A)*Y$*lXjv=?u-Bn~N9CbbklTSUe znDcV$dDUgS;V?{;H62?5xSlcX91~hig&KERbY)4`+W#^stqqqiN0bR#+zn|8TJ=uK z{Z-|Vx_=Q_CZgnO!;V&6!#ZJPyaWUNK8mG*_@XE-LN2(u?)h|_PC0S(UA!dAwFYUx7pu~|G%V}S;0{eC#9$;T1MMkm za>Xa7<(|H=vYx%pU&d?M1R1-S@1R*7Clg&Jbuk@@lW?4Pfz^#->QPP3g|EQR)nrQq zN%8W*)ZJ#3)vi3ci^^djejz=B5+N{nI(tFsPeFO1y<)`d={sqW6MFrbc%1oKLQ1jD zO2BA1O|K-#Wcx)=L4y3v?z+l}+=cXBbvY<*#|#F(vof?}I^;}eDr}*rbqyI{hnJ61 z=K3Vb9>KY+eu1J)ci*2Rg9DUS7qq~UH>h4X75s+%^{Ywplur3aP1)-vDKl!xyB(`? zXlE_SdQ)jFsr05tYReh{rV6++hi2E7`=Bp9PzTfJ1)5Pu)*;N|=MY(38?o;@R8d zCd3287W5gaX?nEh&c-M<8fR3Be890_CLK(XOH;`F* zW0~SJmRIvDw`Bu5@^)W2aTC#DqI|9vWL`m)(btUStVm;spQeRPe^FVmV`vJrjQ zOjdHuQ%d#^^mQ|NKa`%-=340)WIs>uHd=Frg7ILcnyk}br)Vw1rkDRy3 zj!{{xi$7N1W;5Q01_FgF5%1{*8i*czoBXtvissD+E=U2>x(m&U1d-DyRG4B<|CaJ) zJ7;yim5j|SoC>-`yu*-Kk)J6z#Gs*&{LoU57%K`_kO~7Uh=M?byZA$JdV+sDTG{hC zv}WJj0B~|)2g!$a1zc1P}4 z^lDoVil*?VTJw%^Qejh#;&Ry6v-rDO7^UT~ z+1ZS3U~J;h%c1Zp^Nlk~$YsbBN7glJX~_Em=COo^%MVpFWU|IaYb<&IuSbl-He-&; zW4WhUds*!0P@?jPGG;#Sn@6Y-YAjF~tqddsvs;zJlD`RzDKatCzk^&3*;k>X%rxI` zPppqh&ksazX6dw!eJ95_o$7qzRp5y!~@}wUdmA|6K9#(t1IY_H!!g1kG%l=eJHWOoXa( zB{l*zTvy?_eu!eb$OH?`ufv^$zb)RKqHbmA6rgjl^c8rHYGN1py#%+1?vb7B_Cxee zcX>H_$29(mpoEr2XlJaGxwf(9i z_1}IyoxKmb&Ou7+EwkV-wzIc<0v8~s+%F>n=P8MqXzcKGzhCxMf^~HtSv^GyGt@V~ zng>Z5fY3GV?ZjZdTiKMm0lWycWbWL)(nvVK+#p&*5@Z5S6Xpg7!}C@u$qSURiw5=m}OtgmbiDf?Al49b0;YkgsIto-U%`25Ej*=>oT z&_pX3kh4Ae$?+^_5A~Bw$MDU8_`)O|0WXDsQBJ?1Y5$i^7Rw+xieLWWHpsASli z10m54(ZPYTDuN#d%J^7Q{IEom#ykiOTSCNe!#&1uk9B`e34@^1Y@=?2#3-GWB@oVHn^?#% zzXbW*WceZf394CGNH!~hQ2;^iaSxG?RlwIiGhE(^VAF8fF|%|sk5}DCE1;&b&Dq7$ zo{@EcYQqRF<;;M@kl^Sb?;LnsNjj^Z4Lt{zl*8UQHkWgrMhr{DOk}Q`smzF=1xDmw zj4R(^bz`cif00VlWR^*ZJaTq6Hly4wGSUnb^sT^4UqZa!szot84Xxx&1d@^a_z z>n8+_T%?-4cycH@7>dBCViQHKk+K1LNAr=e_8p+?k&rnD>D!TV6`+|<$ZSBN86eq5 z?J}@lDxnD(GN#vVm0GXFnV*T#1uId*8n6Db{LxKrcx78T>_l;D;xYx z6yzj2I9gW0Av=&o(xK->CSS;c=3djn<~xeN&@# zm*``K%%KH}4XJV96$X|a<|_D<+KrJjaZK#M7+EWB-9e6tHL{O$oHZg+v6p3p!6sj6 ztb72T^~1-?HjT2UqBhhKUIXViSkAy?#}zV}BZ9(hkhKgevolT&d_GpbX690Z@-N$~ z(yDPX$1!y(ty(4PJEl#guU5$^bm}SjG+q{X_-WaIHcXV2L#Ht}UVo_~$HEG@@oD)S zRuw7ZWlz`=Ul=c!hD~Q87K&I9pmK0X8aLmynIM}6>SViV`~+DeaNS(~yhNkO^X3G( z(T<$@JS*G4N=MJi#K0^ob`$MnP^aBQr=Nvr|DFEW0Q1tY=dhx_d!y_}w@#E3s;I2d zDSUJOV50oibz%c&6`?%=UN9m{Hg;ssr_Nbe_0IP^n}v0% z?~VP|OHx_p8;s^lQn}W1izg;wzMDf4lVOL$jr)^jvU4$4M&9|+Rp~i^V#D;EdEI+e zrGm+FEbPp$PmwXO1@xE#Tbmc!Hbp)YSI7(4R7V|DpaYxhsg7ICkKz-|&Lv8(;obUhXGV^THpff)gQu zQ)PqlBPV|a2)!fco~bY}6w}jFWuqX=Y+WhHJ%_%UCTm6OH}6$-99zff797IA?oaa; zO{-7Urpa(Ou}Cp@S1rC|AFn*8`yT7E?eUPjwfcz@Vqonm;*P@ zu9=QS!dyI!gJEv%^k&RJLl$rjN#vO!AHgw`YB{nu&b!+4WLwCe%{lU#{R7X&nKIPw zJirxJwk;95Y(0Mrs*h{=1AGF_cA+a+hW&hw{cjBW`Si?7GP&A;%_WpVYnG4hVAd zK@CTHym8D4kJId2RKs>E%$4C3mMc@b-N=0b4{+YI`fs@}+dw;KLFy>>_mpeldb8#2 zI2(f2tAk+PY*+{8(vI13jM;F{!qIij%TUn2GTZ4(O3Rb&fXvFn_&-WZ@*q04(YMX* z(P8=`J#0_wEtNaydO8HJdyWjKdX(GLk)}pUb%(iA04r0&IWo$1g5!d!z5GyBhx<4^ zGDkkeub+H7N2a(=aum*3MZ6;Kb1W;QCti`aRS~39JBD?3p7?WdR-H9?dG|0H}qe&DB&<(B50xJXL%N{I{i7N&fdwgQy zyt~x`Ll7GrWUMqnya{8>wPL~%12D$|gA!#X9Ak`2KbVK&9G@E7-UprGZxM=rqVYgZ;!Ktjwx_? z5AoInJ4CL-6u52Y$(W|*wl3z-aEuDvH)E?~+sRdzYQvylF>9-9+scR*3IS+6&76ld z+g`eg^bqus^Ra`yPBlh!U}Y#T=BDS1^U<}wr}YS2*FFIQBZ|`IqO+IGmjPn#r)ti? z%YdkGGszodyeeY?Lo9GJgEf%NVPGliRak{TQ@;cGF&@sN*aYE$q`(Ud)^KDMQMFfP zG`U}s0j|6v&Ny0Sd<#Dh#OYQSQQOxboleuB*HF0YiYCb{++w71EImSNz#X| zcr_AKPW}YI1RA$cM$|0fp<&p98lh<*%a1XrG$17>Ew>ozvru+TxM0Sa7ohMZYHpR- z(qP=bdOldlX7*!r@OAl&OewEj)>ol{HY@XYJ{ZP?c5hBvCae>H0b2%Iys z<5n3T4DM;S8;yJr>WQcT9|UXyIP2qszyPuvxA-9V$tc_p?ad~}dUW!FFfTUyYjV9UYg94229yEJt^7~0yM)@jEn7M!O{4K|qsphy zM$n<=KYtsoGKCVCt9DSEJ5Maf@_r7knp}a+xXJYH3K`Lz<&)Ox=X~pvH7m;SBQcgK zq_vdul5Q$TYBz8j5%+7mTd`eSmhrrI`vJz^Stxk@exJ(i7*B+?w}e`NeTrChRCqoDD!Ce|Q_ zR?D7_oM|+5yo`4o&8Fq!u?39qz<7u~MH)?u*T~w*GgxKxTN^M6H*BJTlHey{F6!LJ z@Q}ES3)H2zRt&n;iU=!)x*@7iTqIo}m5Yn6PLPQ)DiT&I7iVX8D^P8Ix+ihjqp4&q zrs?k}bRC-PI~sKn5-K56y3F!cqf^hwks)SzS-61#4S5!Z`I*yb-m@|xF!uzS&qy@% z`ovnRZKCPxv4SvbF^b}zmK}l>7hbC}laWu$>NTeFN0(oym>6%%T&2f0$k8a+*BfAd zGM77mT5go1e3`rG&JG-MmbQxL7DPa zJQ0M-DWL|Np{-7#uA9-!IJUi6c6Xisj=$Sn{RUuEuq3zq$*ymfBdV%RIF`!1-c-^S z-+huMZILaV^SB&kx@*P4@0piL1(%wOTV$H0xMIVxyGKSwSu;q2jT;#Zwf{*eP4>up zLHxJ=k(~pTrfAeNj#1xy$i^kKARmqh*z7rxFPpbp%qtBpBdl0Zb+rbKRSe{qQkzkO zrdB!gCZyDBtBh}Lss(&2lCQ&zN{Bj4!1figFiQDT%M@`{K}IR9+bXvNZ&JJ+rm8V| zo1A5NkTFlwgUr1h?Qnn^ZI@J@`jhQ)AR?OXz#?S@4c{TxI9{JdPn;BY{Ea&(!5y@Q zXYspOb>e2LGw(q@DOb?y)a!j&$@B-U5rBKg65y-7f^y%NL%q3r=WU8CfL4BndKbu6 zAtkK#xPRaU6z=s|Q~)bUmU2FXA0T`eGkGlsjcKyNu~N_8e+-m){~7LleE9sG=rWt==uX+VZCSC9>5ek8L>^;kST~AO=5Gm_qB0t=>ii!W zXX^d|@Ru0hN@Sff?G$U9!SZ$a0~zF+$?JX$doD$&(wtQpNukZc z@w=WDH+T$9+=J3AKSkRRx;82@C#Oz^8sR`EQBDhOKSX~!Nq2n+9diqf`Vjsq9(w6R znFtf!x({W8rdg*s+gM`(hu(R5ox;L$}ExW$cr2x9HMlpC#HS`vh&`rcVrj zSj?wC_Q}Wb<-~4SukOdhu$4aD4-0BO zUE425dyBs8oM-$2_^1WHf6i{V85l&ipiT6~L3yQeQij{s%Vx8sN}H_~!lVq(nnSX$ z2;I}$ZMzqU*7ys>-yVwkR1QZ!eEw4it3CAYr}8Mo&-@~6@6MvF9K23n7D1hw<+)ab zIQt&Ym!CPYbW5?*N0NRlP&7*Kx`exT2#0%)1ao5|{aFNcS20(lHjhY+@9GJ5lSG<_fX`g;_3Xt>+fUSV%5mc27~1MJA4#k&W7 z`|{?7^o2(QX6BmyN&M!j)$mjJo!|qH$8WA@9X|oTm>k5KHp($^derOQ8}S7uYxPqIa5cBI?p2F>mGYlpvV&!C@Vj@_Q^IeQYy zwY@uC{26-3A~H_N=L3g~8!~dt;6Y;s(YjMI)^p?(x`(jYrc%fm_*@iFuQT#qN8M`l z&KX%PG`*VJ773Qz>Ri$3^yL|>`qIgM7TswXVmZ@v>VFoS3$}Q-t%?GtpT*WgeSq9} zx6=mzk>>JQWVM`9evx;>$!yXuvW25r0&V*RI?bbW`4?FJ)=-;s7)Zwx+_o^JEJX+r zXZwQ2o`WB5^+bB-9A>R_`uLojnlcoh9fa8D@z(@@8vY)?lYQV~{Dv!)Z74loBI`No zRHqFk@S~nc7fa;ZwCp@~(k4>f3osf@r1=++eX}ID`q(xIDh;!E)@c`09zY`d75|9d!6t+0;wh$!=3)d?JOH z%G)zFi@`v1WovkrADrt4zwQUG2F$%)r{4&e`;dk=`N8>stJ-YQUV;Na_!i(OoiCLU z-trwmbea#p@BR4w;0L=LHnSeBDhdb8Gn6h*0$>(18m{37#{iDD*=XuTEQuz1R$r8V z*wG1A{06VnQabV*X1HU7JF4D}T99nE&4UQ>MYhvVy46h6p6r+9+R%RW+_oM-7vT>K zZT)EHW%+Par}}O+Zk!0)16>F*?l4z9ZLY}P6#~=7r8ib_~9c?aoGl^O~BY zZaFy}&USqoH#2)<%eH3Lv-+A@M*`+fR0|>ZKjVWNdASF*nCDbd}Ijin+6e|&6SNw6)kGa>a1m6;bEaG)>mwQ4& zoS)lM)}^`eGP2Ef8Gk+Tr(vinwx&MtPW)zm>nOaEvt6hr3jrB42cU;ka^Blrqq_jj z6NHAx0rurS1+XvoA%MB(X!=orxe}LApxfClahYMx&ntl9+%&vO!!*p7Y^_FH$s)jw z`@=HY=XSR6ati{Qhm+=ZJ7E6AWt14|Y-(Rdy$~2Wwl-SLmwF&zMQvqL0JxJ6x6c7{ z+aOcsHkhuNK}u!k_kqhsao6E$i>u;{=yNjN>|;M8gb26k=qp`Jybf#EuAeYw^w=Sf z3>xv|kOce(+Sm?er*4AZi9Rq_Z)F-4=8Oz}XzZ{NgNKZMvf=0_yVCk9&RNjqjWB1G z%C?TCk`aN9%EQdoksb+iCWkfyo^_GV2|_tk@8nhzc_u<0cW=?36tQYySsr!^t#!2;+qNoG)D62QKlWKd)h0QPtUK$QNMCn$u+bMd6SC)40C)&2btY zg5Ui08h*?#evDr{Ycwi7wTZx>8caV#IPdn>$4(T4wFT5i$4KXBdr!~SNM|K`;<2u7 zTQ{J;L))UW*p{Jv?n9V@`fJ57{T$_tN6!h2c0SsDM-Nj<^#Uo^mWD?F=4#S#24H09 zg&zdWgF(j+1oQ=HYTIrXL=QtLAx?I2e<$DFNZ~SV_ z)++Z}z`pTue*76uwAnJf865Rvz%U5B@jNN}e)!9PeKY695g?Md5~(Dg`{tRSVTu5e=h+ed=qr=D{&`P z;xhUfNE_sno?#w4Iz#5|8$Ss!&y+g;4e-nK{o-YQ8Eo|{z;?g*Ehw;Wde(D%YwR1p z_~U-@Yqy1pZ@yEhl!^8aG#{swTi64#MbrnpHRChjN zA5R}wcixR4u7>mB6kR3Ujoaf-!`zEH`oKx}q}mMA`Wnu5-8I=Te2DLd6#@2b`(i)% zd%(?o*k07}WF$FTRo3719Z0M)zm()`SY6{EMk!3ZSr-ohHtT}ENpij(m;k#8uPa}t z=W9AU1!e$DR^XAEPB!C()^cVhYU9c^#IRh}@Sph2a(NG}ujPC#)Y-?J1odQGLj7wy zn}((X&6BrAH=`xBot-jQKurt;TI*Mf{oq`{zUpE&U>-D@{yD%fo!Ewf{VfQe1kB;1 z2wB|pLC6)`9U-fgcOhg|;ZB5@W@Bt^@q-B)A>_VY9U;#mVSQxbaR zy;s95W}5lHhXHf%)$#uUT*U|e1Tc3{9lsYamtMoX+>4@=BeFdmYVC}wtnm+_qp&s} zJJNHdwX>o=U~VN%9{_&PlLT88 zXS8)b5~8h!nTQCd{)c6~hcqe#DE@d29|A9K3Jn(m=BCuVt6TIMejOjp)1WWRk|${t z&1mQR1xniZG-q%72+!d(=Wu(d9?r+H(&P?!+S9GQGtUlV!HL_kSS+T{bY}|$oztDO zQi{i#4Z0D8Jg;aN6HPhzEx;%y^uoXn&f&&APr219C<;YQ1lkwoexTu4#B;M~I1X?P ShG}yL=fiG|W^)0L^#1`aGT{FJ delta 61834 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 V0$i10y1AQofM26oeZZsle*sO@A%p+` diff --git a/src/event.rs b/src/event.rs index 97cd1cb..b0c740c 100644 --- a/src/event.rs +++ b/src/event.rs @@ -80,6 +80,33 @@ pub struct FtLockupCreateDraftGroup { pub id: DraftGroupIndex, } +#[derive(Serialize, Debug)] +#[serde(crate = "near_sdk::serde")] +pub struct FtLockupCreateDraft { + pub id: DraftIndex, + pub draft_group_id: DraftGroupIndex, + pub account_id: AccountId, + pub balance: WrappedBalance, + pub start: TimestampSec, + pub finish: TimestampSec, + pub terminatable: bool, +} + +impl From<(DraftIndex, Draft)> for FtLockupCreateDraft { + fn from(tuple: (DraftIndex, Draft)) -> Self { + let (id, draft) = tuple; + Self { + id, + draft_group_id: draft.draft_group_id, + account_id: draft.lockup_create.account_id.to_string(), + balance: draft.lockup_create.schedule.total_balance().into(), + start: draft.lockup_create.schedule.0.first().unwrap().timestamp, + finish: draft.lockup_create.schedule.0.last().unwrap().timestamp, + terminatable: draft.lockup_create.vesting_schedule.is_some(), + } + } +} + #[derive(Serialize, Debug)] #[serde(crate = "near_sdk::serde")] #[serde(tag = "event", content = "data")] @@ -94,6 +121,7 @@ pub(crate) enum EventKind { FtLockupClaimLockup(Vec), FtLockupTerminateLockup(Vec), FtLockupCreateDraftGroup(Vec), + FtLockupCreateDraft(Vec), } #[derive(Serialize, Debug)] @@ -407,4 +435,48 @@ mod tests { ) ); } + + #[test] + fn test_ft_lockup_create_draft() { + testing_env!(get_context()); + + let account_id: ValidAccountId = "alice.near".try_into().unwrap(); + let balance: WrappedBalance = 10_000.into(); + let timestamp: TimestampSec = 1_500_000_000; + let lockup_create = LockupCreate { + account_id: account_id.clone(), + schedule: Schedule::new_unlocked_since(balance.0, timestamp), + vesting_schedule: None, + }; + let draft_group_id: DraftGroupIndex = 123; + let draft = Draft { draft_group_id, lockup_create }; + let draft_id: DraftIndex = 33; + + let event: FtLockupCreateDraft = (draft_id, draft).into(); + + emit(EventKind::FtLockupCreateDraft(vec![event])); + assert_eq!( + test_utils::get_logs()[0], + format!( + r"EVENT_JSON:{}", + json!({ + "standard": PACKAGE_NAME, + "version": VERSION, + "event": "ft_lockup_create_draft", + "data": [ + { + "id": draft_id, + "draft_group_id": draft_group_id, + "account_id": account_id.to_string(), + "balance": balance, + "start": timestamp - 1, + "finish": timestamp, + "terminatable": false, + }, + ], + }) + .to_string(), + ) + ); + } } diff --git a/src/lib.rs b/src/lib.rs index 043451a..5013aee 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -417,8 +417,9 @@ impl Contract { pub fn create_drafts(&mut self, drafts: Vec) -> Vec { self.assert_draft_operators_whitelist(&env::predecessor_account_id()); let mut draft_group_lookup: HashMap = HashMap::new(); + let mut events: Vec = vec![]; let draft_ids: Vec = drafts - .iter() + .into_iter() .map(|draft| { let draft_group = draft_group_lookup .entry(draft.draft_group_id) @@ -438,11 +439,14 @@ impl Contract { .checked_add(draft.total_balance()) .expect("attempt to add with overflow"); draft_group.draft_indices.insert(index); + let event: FtLockupCreateDraft = (index, draft).into(); + events.push(event); index }) .collect(); + emit(EventKind::FtLockupCreateDraft(events)); draft_group_lookup .iter() .for_each(|(draft_group_id, draft_group)| { diff --git a/tests/draft.rs b/tests/draft.rs index 31115c9..6bec572 100644 --- a/tests/draft.rs +++ b/tests/draft.rs @@ -274,7 +274,7 @@ fn test_fund_draft_group_with_convert_too_big_group() { e.create_draft_group(&e.owner); - let n_drafts = 200; + let n_drafts = 100; // intentionally create too big draft group to convert with restricted gas let drafts: Vec = iter::repeat(draft).take(n_drafts).collect(); From 7571769dd86cfba664f7ff52c2a765b0a7bef6c3 Mon Sep 17 00:00:00 2001 From: Alex Aunter Date: Mon, 1 Aug 2022 05:44:00 +0400 Subject: [PATCH 26/29] feat: add fund_draft_group event --- res/ft_lockup.wasm | Bin 347071 -> 347531 bytes src/event.rs | 41 +++++++++++++++++++++++++++++++++++++++ src/ft_token_receiver.rs | 2 ++ 3 files changed, 43 insertions(+) diff --git a/res/ft_lockup.wasm b/res/ft_lockup.wasm index cf076b9d90dc85ee9144b2a097924d1b2a1d73d4..378512c8313cc53550e167021f58b4978cf15ef7 100755 GIT binary patch delta 21498 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 V23%Fb)T^g;l-)$jlL9$+{~ulTza{_x delta 21326 zcmch9d3+Q_^Y?a7FS%hu?t^4Egfm>>2yzL-t$=uOC@42VI0QMwM;{X;N;rhT0EG}B zV1$4O!2lCANCF6m0Rjd@MF|omDv!j+h(Ut>b`-$>jwWpCpT#oRj0d*lNpL7_i*4y~S>6$}KS#^^i8mrt({)rP-SD zKS}%0)|8#muGki{Y;C&#LOkE_j|o{t1<4j$(HqIh7K@LXy&9MrsTOOk>p#y+*Jv5_ zW1FT)7Kex3SG{QI>*wjCCU2KqP1TAuvhI=j&brIAYxN_8GERV&*wSL@Y^i5g>~&Q! zSIy8G1UOnQb&By7KI&rEqvE5cx*oZY`iAR~`KT#5Qvy0$S*Er%beM1H6^KmW!p_yq z9Ir5ME8D3BMzvz;S}*+Fsl5=j0Dm9a-cSpRp22@Tm9r%JRmRJ|(0m+&SaQx&j>i;l zvtt#Pa`wg!s>4#~k>R|3PC{H~&i`Giz0k6a1eqN%-&(raDmA1ZpXSQ2AkLRo$rGsi4 zbopIru|{g@PHD0EuRAT4u|ZO8b`Q10lBi}I*jj_*^Vgglzn+pDaW0O+trAPuR`hue zP2F12G-(dwul8gP#(VG{s->Ayb{!l&+2ei|iB(F>!R2GQ@yL9cPfso>J$XlGF&&WNP1z=*SAS;E}Ch!9F9)1FFhEw|(cdH&~gvlvY?poHpy3Nq<|I z6ZY(fbuf*J$1ma~o3v3A?7V!FHh)46%hx(goX1NxYP%||NSHfNFI}i^YYEwn8|jQti3jQ9WU9UMJ1xr7Oh9(^RQxe zqC=ZMIY28-e3E5oou)X@{D>)I@O)s3gJ-`DX%3A|orRe&XR3qetuqK8OdS9Y>ojm| z0-=dEc-o+b7qVa%TdB*%F07YU3Psn`SfW~PU`5)&X|cigD=FEg-JCW7YLA*O)t*0n zz*< zd<;*$s*PFRMH`UzJ!WA1icbxHAA~`EXk`Olm8VTwIRwbZD|>sSoRkAwPn)(ftZqjO z?_p;MfAIg(6IvT>8|q!q+T*X^sznG5+S*l9C8)D{6RK}r{U$F-)jF(c)cC_xSi!-4 z5s@}HAJqm9#TQZOkA=<>M5QxY@|wiJl5-%)2&dj*Gh>9kj#_d~`)kc4UbMaUbl?EkjSqqY7*tUDCUTUT`Z(TG; zy|>mKmtfrbW)du0A1T4k^}Se@R=&P7%hlr28}X7aw8zu?v*X(O^at4m?W^=SUUotA z*zg+MO5GS}SF?@C6RDPcDH}3leB}jTY8y36`*=g_b0*JmcOLZ0OWkXz=W;PbFE2Hv z2Bi*YPD+_;=J|rBV!3R~bWBrvuJ+KzodKCOIxN7wD#vrvc?MU!lmS=FVViGrueF~@ zXF#0I@yM)FoU4K&)I6Gk}w2L{R z?|Cv-oa5LY3^^W_<(aPMgC%7I;MXU@uxM{yYEFgv1QqR1cfMazTW?szkO^lbE z)ee8UseQR@9_y!PqHVKW>ir~QPmE2*KTAEV!kbo`Dozv2pEYN^ z;(e`a;dC_qZsGIz8*%b^t#hG|w)*4*Z3m$B)C9Iyn{sMIK&ErCZffUPS9l~O=4tlR zjkLc`)w@sG5tOyR553T+v-I@+>J-Z|n}-iXw@6fx7|6b4YR67>)WVDEVXD_X-O*;P zT|DG;M=i@JPRG-A3`TnS&Wns)-1i$>Vl|m` zRK0Cy>H3ByEX|Xp=&jnYzVM)>`rLT-jKV9H(bFB6gKo5EV|mpw9mvCiSLM*wPHZ`# z-mx?Lgs~F3-G$kCMFB;3Wg+Z>-mxoN#d+Q#vS;(&x_@^T%Xm=%U4B3bqyatHXcrQs zAL_yCpojEnPnN}2=`ZwR$X8bBFZN{v8OxwCDZIO`^k>8CKx6%xM_5}qHaaX )6K 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 F{{gRPY*qjO diff --git a/src/event.rs b/src/event.rs index b0c740c..be1567c 100644 --- a/src/event.rs +++ b/src/event.rs @@ -107,6 +107,13 @@ impl From<(DraftIndex, Draft)> for FtLockupCreateDraft { } } +#[derive(Serialize, Debug)] +#[serde(crate = "near_sdk::serde")] +pub struct FtLockupFundDraftGroup { + pub id: DraftGroupIndex, + pub amount: WrappedBalance, +} + #[derive(Serialize, Debug)] #[serde(crate = "near_sdk::serde")] #[serde(tag = "event", content = "data")] @@ -122,6 +129,7 @@ pub(crate) enum EventKind { FtLockupTerminateLockup(Vec), FtLockupCreateDraftGroup(Vec), FtLockupCreateDraft(Vec), + FtLockupFundDraftGroup(Vec), } #[derive(Serialize, Debug)] @@ -479,4 +487,37 @@ mod tests { ) ); } + + #[test] + fn test_ft_lockup_fund_draft_group() { + testing_env!(get_context()); + + let draft_group_id: DraftGroupIndex = 22; + let amount: WrappedBalance = 10000.into(); + + let event = FtLockupFundDraftGroup { + id: draft_group_id, + amount, + }; + + emit(EventKind::FtLockupFundDraftGroup(vec![event])); + assert_eq!( + test_utils::get_logs()[0], + format!( + r"EVENT_JSON:{}", + json!({ + "standard": PACKAGE_NAME, + "version": VERSION, + "event": "ft_lockup_fund_draft_group", + "data": [ + { + "id": draft_group_id, + "amount": amount, + }, + ], + }) + .to_string(), + ) + ); + } } diff --git a/src/ft_token_receiver.rs b/src/ft_token_receiver.rs index 4734e72..b7d9cd2 100644 --- a/src/ft_token_receiver.rs +++ b/src/ft_token_receiver.rs @@ -75,6 +75,8 @@ impl FungibleTokenReceiver for Contract { } } } + let event = FtLockupFundDraftGroup { id: draft_group_id, amount: amount.into() }; + emit(EventKind::FtLockupFundDraftGroup(vec![event])); } } From bf5f908540f0c7fa6142c9df958ad0bba8bd3520 Mon Sep 17 00:00:00 2001 From: Alex Aunter Date: Mon, 1 Aug 2022 05:49:19 +0400 Subject: [PATCH 27/29] feat: add discard_draft_group event --- res/ft_lockup.wasm | Bin 347531 -> 347908 bytes src/event.rs | 37 +++++++++++++++++++++++++++++++++++++ src/lib.rs | 2 ++ 3 files changed, 39 insertions(+) diff --git a/res/ft_lockup.wasm b/res/ft_lockup.wasm index 378512c8313cc53550e167021f58b4978cf15ef7..8cb6ad4e40a335631fc1b0e956f59d1cb25c0290 100755 GIT binary patch delta 21472 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, FtLockupCreateDraft(Vec), FtLockupFundDraftGroup(Vec), + FtLockupDiscardDraftGroup(Vec), } #[derive(Serialize, Debug)] @@ -520,4 +527,34 @@ mod tests { ) ); } + + #[test] + fn test_ft_lockup_discard_draft_group() { + testing_env!(get_context()); + + let draft_group_id: DraftGroupIndex = 22; + + let event = FtLockupDiscardDraftGroup { + id: draft_group_id, + }; + + emit(EventKind::FtLockupDiscardDraftGroup(vec![event])); + assert_eq!( + test_utils::get_logs()[0], + format!( + r"EVENT_JSON:{}", + json!({ + "standard": PACKAGE_NAME, + "version": VERSION, + "event": "ft_lockup_discard_draft_group", + "data": [ + { + "id": draft_group_id, + }, + ], + }) + .to_string(), + ) + ); + } } diff --git a/src/lib.rs b/src/lib.rs index 5013aee..fc23b4d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -524,6 +524,8 @@ impl Contract { } else { self.draft_groups.insert(&draft_group_id as _, &draft_group); } + + emit(EventKind::FtLockupDiscardDraftGroup(vec![FtLockupDiscardDraftGroup { id: draft_group_id}])); } pub fn delete_drafts(&mut self, draft_ids: Vec) { From e919b16a52f41cf0a97aefd7cc276417f093698c Mon Sep 17 00:00:00 2001 From: Alex Aunter Date: Mon, 1 Aug 2022 05:59:53 +0400 Subject: [PATCH 28/29] feat: add delete_draft event --- res/ft_lockup.wasm | Bin 347908 -> 348641 bytes src/event.rs | 37 +++++++++++++++++++++++++++++++++++++ src/lib.rs | 6 ++++++ 3 files changed, 43 insertions(+) diff --git a/res/ft_lockup.wasm b/res/ft_lockup.wasm index 8cb6ad4e40a335631fc1b0e956f59d1cb25c0290..92e911835453bb069780b1fe9e5d8ca769a13454 100755 GIT binary patch delta 23651 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 DD4Jdc diff --git a/src/event.rs b/src/event.rs index 3689f62..20a3dfd 100644 --- a/src/event.rs +++ b/src/event.rs @@ -120,6 +120,12 @@ pub struct FtLockupDiscardDraftGroup { pub id: DraftGroupIndex, } +#[derive(Serialize, Debug)] +#[serde(crate = "near_sdk::serde")] +pub struct FtLockupDeleteDraft { + pub id: DraftIndex, +} + #[derive(Serialize, Debug)] #[serde(crate = "near_sdk::serde")] #[serde(tag = "event", content = "data")] @@ -137,6 +143,7 @@ pub(crate) enum EventKind { FtLockupCreateDraft(Vec), FtLockupFundDraftGroup(Vec), FtLockupDiscardDraftGroup(Vec), + FtLockupDeleteDraft(Vec), } #[derive(Serialize, Debug)] @@ -557,4 +564,34 @@ mod tests { ) ); } + + #[test] + fn test_ft_lockup_delete_draft() { + testing_env!(get_context()); + + let draft_id: DraftIndex = 22; + + let event = FtLockupDeleteDraft { + id: draft_id, + }; + + emit(EventKind::FtLockupDeleteDraft(vec![event])); + assert_eq!( + test_utils::get_logs()[0], + format!( + r"EVENT_JSON:{}", + json!({ + "standard": PACKAGE_NAME, + "version": VERSION, + "event": "ft_lockup_delete_draft", + "data": [ + { + "id": draft_id, + }, + ], + }) + .to_string(), + ) + ); + } } diff --git a/src/lib.rs b/src/lib.rs index fc23b4d..f214a21 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -531,6 +531,7 @@ impl Contract { pub fn delete_drafts(&mut self, draft_ids: Vec) { // no authorization required here since the draft group discard has been authorized let mut draft_group_lookup: HashMap = HashMap::new(); + let mut events: Vec = vec![]; for draft_id in &draft_ids { let draft = self.drafts.remove(&draft_id as _).expect("draft not found"); let draft_group = draft_group_lookup @@ -547,8 +548,13 @@ impl Contract { draft_group.total_amount -= amount; assert!(draft_group.draft_indices.remove(draft_id), "Invariant"); + + let event = FtLockupDeleteDraft { id: draft_id.clone() }; + events.push(event); } + emit(EventKind::FtLockupDeleteDraft(events)); + for (draft_group_id, draft_group) in &draft_group_lookup { if draft_group.draft_indices.is_empty() { self.draft_groups.remove(&draft_group_id as _); From 793acdca8294207b2537adf8c4a25b19b4e206ff Mon Sep 17 00:00:00 2001 From: Alex Aunter Date: Mon, 1 Aug 2022 06:01:04 +0400 Subject: [PATCH 29/29] style: cargo fmt --- res/ft_lockup.wasm | Bin 348641 -> 348641 bytes src/event.rs | 17 +++++++---------- src/ft_token_receiver.rs | 5 ++++- src/lib.rs | 14 +++++++++----- 4 files changed, 20 insertions(+), 16 deletions(-) diff --git a/res/ft_lockup.wasm b/res/ft_lockup.wasm index 92e911835453bb069780b1fe9e5d8ca769a13454..87c113c027fb3e6419a0b06139d2bce175dffa1f 100755 GIT binary patch delta 75 zcmaF3SoGmy(S{br7N!>F7M3lnoQ#H2ObiS*3=9mXlmr;KfV3)*&x^#@K;tWHw_;>n G9smGQRt%&7 delta 75 zcmaF3SoGmy(S{br7N!>F7M3lnoQ#GNObiS*3=9mXlmr;KfV47@&x^!YL*vVBw_;>n G9smGPUJRT7 diff --git a/src/event.rs b/src/event.rs index 20a3dfd..e122d32 100644 --- a/src/event.rs +++ b/src/event.rs @@ -434,9 +434,7 @@ mod tests { let draft_group_id: DraftGroupIndex = 22; - let event = FtLockupCreateDraftGroup { - id: draft_group_id, - }; + let event = FtLockupCreateDraftGroup { id: draft_group_id }; emit(EventKind::FtLockupCreateDraftGroup(vec![event])); assert_eq!( @@ -471,7 +469,10 @@ mod tests { vesting_schedule: None, }; let draft_group_id: DraftGroupIndex = 123; - let draft = Draft { draft_group_id, lockup_create }; + let draft = Draft { + draft_group_id, + lockup_create, + }; let draft_id: DraftIndex = 33; let event: FtLockupCreateDraft = (draft_id, draft).into(); @@ -541,9 +542,7 @@ mod tests { let draft_group_id: DraftGroupIndex = 22; - let event = FtLockupDiscardDraftGroup { - id: draft_group_id, - }; + let event = FtLockupDiscardDraftGroup { id: draft_group_id }; emit(EventKind::FtLockupDiscardDraftGroup(vec![event])); assert_eq!( @@ -571,9 +570,7 @@ mod tests { let draft_id: DraftIndex = 22; - let event = FtLockupDeleteDraft { - id: draft_id, - }; + let event = FtLockupDeleteDraft { id: draft_id }; emit(EventKind::FtLockupDeleteDraft(vec![event])); assert_eq!( diff --git a/src/ft_token_receiver.rs b/src/ft_token_receiver.rs index b7d9cd2..ff2c63d 100644 --- a/src/ft_token_receiver.rs +++ b/src/ft_token_receiver.rs @@ -75,7 +75,10 @@ impl FungibleTokenReceiver for Contract { } } } - let event = FtLockupFundDraftGroup { id: draft_group_id, amount: amount.into() }; + let event = FtLockupFundDraftGroup { + id: draft_group_id, + amount: amount.into(), + }; emit(EventKind::FtLockupFundDraftGroup(vec![event])); } } diff --git a/src/lib.rs b/src/lib.rs index f214a21..441fae4 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -403,9 +403,9 @@ impl Contract { .is_none(), "Invariant" ); - emit(EventKind::FtLockupCreateDraftGroup( - vec![FtLockupCreateDraftGroup { id: index }] - )); + emit(EventKind::FtLockupCreateDraftGroup(vec![ + FtLockupCreateDraftGroup { id: index }, + ])); index } @@ -525,7 +525,9 @@ impl Contract { self.draft_groups.insert(&draft_group_id as _, &draft_group); } - emit(EventKind::FtLockupDiscardDraftGroup(vec![FtLockupDiscardDraftGroup { id: draft_group_id}])); + emit(EventKind::FtLockupDiscardDraftGroup(vec![ + FtLockupDiscardDraftGroup { id: draft_group_id }, + ])); } pub fn delete_drafts(&mut self, draft_ids: Vec) { @@ -549,7 +551,9 @@ impl Contract { assert!(draft_group.draft_indices.remove(draft_id), "Invariant"); - let event = FtLockupDeleteDraft { id: draft_id.clone() }; + let event = FtLockupDeleteDraft { + id: draft_id.clone(), + }; events.push(event); }