From b544b919a61015d80595b1b0fb941e7cba22f330 Mon Sep 17 00:00:00 2001 From: jonesmarvin8 <83104039+jonesmarvin8@users.noreply.github.com> Date: Tue, 17 Mar 2026 15:51:25 -0400 Subject: [PATCH] combine test files --- artifacts/program_methods/amm.bin | Bin 530208 -> 530208 bytes .../authenticated_transfer.bin | Bin 386208 -> 386212 bytes artifacts/program_methods/pinata.bin | Bin 389496 -> 389496 bytes artifacts/program_methods/pinata_token.bin | Bin 400132 -> 400172 bytes .../privacy_preserving_circuit.bin | Bin 516156 -> 516148 bytes artifacts/program_methods/token.bin | Bin 477360 -> 477360 bytes artifacts/test_program_methods/burner.bin | Bin 384772 -> 384772 bytes .../test_program_methods/chain_caller.bin | Bin 402476 -> 402476 bytes .../test_program_methods/changer_claimer.bin | Bin 387604 -> 387604 bytes artifacts/test_program_methods/claimer.bin | Bin 383488 -> 383488 bytes .../test_program_methods/data_changer.bin | Bin 381024 -> 381024 bytes .../test_program_methods/extra_output.bin | Bin 383600 -> 383576 bytes .../malicious_authorization_changer.bin | Bin 389832 -> 389856 bytes artifacts/test_program_methods/minter.bin | Bin 383540 -> 383492 bytes .../test_program_methods/missing_output.bin | Bin 383532 -> 383532 bytes .../modified_transfer.bin | Bin 385460 -> 385456 bytes .../test_program_methods/nonce_changer.bin | Bin 383568 -> 383544 bytes artifacts/test_program_methods/noop.bin | Bin 383420 -> 383420 bytes .../program_owner_changer.bin | Bin 383528 -> 383528 bytes .../simple_balance_transfer.bin | Bin 385580 -> 385556 bytes programs/amm/Cargo.toml | 3 +- programs/amm/src/lib.rs | 2 - programs/amm/src/tests.rs | 2010 ++++++++++++++--- 23 files changed, 1699 insertions(+), 316 deletions(-) diff --git a/artifacts/program_methods/amm.bin b/artifacts/program_methods/amm.bin index da0ed533d88af86db32d731e8372bd7a3e32074a..ab0cbe5f8bd79b9d25cba4c0c54ff190e6f47fb5 100644 GIT binary patch delta 1399 zcmai!%P#{_6vlOM#v>k8S~^2&)k=ivJld{=g`_JXb|T8ct|S&LSa@WT?udw-t-qiw zBsU&yDQOUCBN4Tc*!w5U+^sX$`uom3zw@1Y?^!-_mXGY&K3lRI?IyeV5)N3vv~*K5 z4Z}+4am!3;W-5*=Wr*S}gBD6C0W??3!oo>hjSp0%E>@L72Nx;cV1!(nDRU;uF7%IZKMAm-aLCs4z#Mv@Td8_(^ zw|d0-9zmf4bEi?00$v=th8;Y4gCK?~ut*ZPsbjw4vCQWRwA0P!iV(oVZ-}t)6KJ%D z16rncp!_PSmL+ib<(3fsjL5yL^99mU&)@aql;l`;UtyITaC9H$!-57~L0JArpTvu8 zxdTf<@Qa)dYCl`Ag4#@ixJir3-Lw=@Si|oyPM+*k#uQC3qiewGJH2Fg2{Fa^r(8(J zPY`X98w78gGvMHdfDo6xRQ_?q1^nEgiwzo?EPox@x(8OS4hLkJGj3Eh1cBr-pTIJo H^8Lgw0LNsb delta 1395 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 diff --git a/artifacts/program_methods/pinata.bin b/artifacts/program_methods/pinata.bin index 7c7c66a58126b2996ced36db023e0c5c9e26ba38..f27b106194950db29de68e1cfce4fd2670adaddb 100644 GIT binary patch delta 949 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 VJuS@IwZ2kKn`TZ~=X-v^{{r>7Ft-2z delta 10763 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 ibIVWup)W@cyy5dNuMGIj)aL@Fn%2);QW8)g~qY diff --git a/artifacts/program_methods/privacy_preserving_circuit.bin b/artifacts/program_methods/privacy_preserving_circuit.bin index e5131ebea1a2d46b7467aa8415e7149d0bb53e05..aee7c1361a4d0ab80e1d7225301db81550fc777c 100644 GIT binary patch delta 11359 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 delta 11370 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 diff --git a/artifacts/program_methods/token.bin b/artifacts/program_methods/token.bin index edd100862c6df99c557e2abc8aaaca8d3ef9cc06..5de3f363ff745ee1c0a6ab190ed175b5caf36f61 100644 GIT binary patch delta 823 zcmdlmQFg;b*@hOz7N!>F7M3ln{O=`AO-wD#ElezojSVf0EsQKI42&4!qx{T`r%&Wy zQ=0Dep0!jMi<;>l`Pnq2O!RVc%5wE^%A4bq-yZgX)mH$U$x}bDDQvyQX3K(25@fCV zbYE6BcC51LtZb*SN^CS>6P}*^pH*RcIUCzL+)BLJ*%GkIg6x$x#_wNsMH3609tH)f ziShIg_gECCZ>V4soLIw9xKQmYz_cZbF7M3ln{O={rEDVhdOpPtfj7`lqx{T`r%&Wy zQ=0Dep0!jMi<;>l`Pnq2O!RVc%5wE^%A4bq-yZgX)mH$U$x}bDDQvyQX3K(25@fCV zbYE6BcC51LtZb*SN^CS>6P}*^pH*RcIUCzL+)BLJ*%GkIg6x$x#_wNsMH3609tH)f ziShIg_gECCZ>V4soLIw9xKQmYz_dTZq2g* diff --git a/artifacts/test_program_methods/burner.bin b/artifacts/test_program_methods/burner.bin index bba11c265d84a9987ab4289b0de5610a800412eb..3af0656bdb0485fe652bcde80946e7ff584cec24 100644 GIT binary patch delta 775 zcmZqKC*HD8yrG4$g{g&k3rp$-NfRSOBST9wQxii210xGlOG`sThWIEybK~h7cCtuL zpT2>mP8f@t=^GESs89Fb$ijhBR@%^9FDIugR}YK!?Q1r&bh6>pIz4{}3p-ZX&K)eL zuu5#)!Xi9fU@MEl^qD(Z))7$ByNksEyOM(}8d3&0oelD}hJp!Bc~Hoi7)(z*4Rl6; zFN?tTS-V*lGh($VU@uD*R*A-oERk3x8cbLcru$uD!5(ZtS%>NUx-4?j753v$qVSPL zVtV`)7NP0M`&qtVwF4BZQbsua2ll@tUTJkHOZ@WEhGuvbXh<32mDk7Ra1AMA+!`mY RVv%VNJjAj+@DS@}831lG&bt5r delta 771 zcmZqKC*HD8yrG4$g{g&k3rp$-NkdaZb3+453qw;ABLg!NGebi&hWIEybK~h7cCtuL zpT2>mP8f@t=^GESs89Fb$ijhBR@%^9FDIugR}YK!?Q1r&bh6>pIz4{}3p-ZX&K)eL zuu5#)!Xi9fU@MEl^qD(Z))7$ByNksEyOM(}8d3&0oelD}hJp!Bc~Hoi7)(z*4Rl6; zFN?tTS-V*lGh($VU@uD*R*A-oEK!0Okuv?EAWPzOze_Ca*yS9j_v^CAO;^~@f<06f zKC(zmkH5kqG(CAg%NMK`gJM+52&dn`ewV~6tuAGWUtZeK46gzWDMP&S`nVjfA!UqP UFEi6)hge@)2O^gi9EzJ#$O)O2!3{4CyrVFyMYDntkR+s6SLM(!~gJ*iaENdDzz2IP#GR5giu>ABq z7FO&50E(398*s>iQd%74TpHl2(LW$@GoT5z!M-qS7}V& h%Z5EXz>@#*NJ?4acF_H2EHdro?5x|%+1a+r005C=y>FEi6)hgw2giEG;dJ4a^KI4NOc7O-)P;rVFyMYDntkR+s6SLM(!~gJ*iaENdDzz2IP#GR5giu>ABq z7FO&50E(398*s>iQd%74TpHl2(LW$@GoT5z!M-qS7}V& h%Z5EXz>@#*NJ?4acF_H2EHdro?5x|%+1a+r000nQyVd{z diff --git a/artifacts/test_program_methods/changer_claimer.bin b/artifacts/test_program_methods/changer_claimer.bin index 1189fafdeba8a24b7a96967fa7248428ca5674d5..139da2a48142db0397f7fdb892bfbdbfba4d4d48 100644 GIT binary patch delta 885 zcmbPoMSRK?@rD-07N!>FEi89;2wR$%n3x%xSQ;Bxn3$Uxn3))wPyeukWg1qA!c#2j z(+})q;lL>?ZD_2QlT((fhsE6Ovb$KeV%56+=^++VMqGw!Na8eddfpM1Q&{zRA7$B# zRYLk0%Q37H3tlnXOgA{rB92uy>Nra@R*4CBSR%1XOnk`fFx}uavjQIH1J%Ugkq)$E zRhsU05{HvOu_0w>fh%yPhd*XX$Lg}e11#dxbMLbVPY*rC;*DL&DHaVWoJN~Z2d4y? z(|A(C^f5l*a delta 886 zcmbPoMSRK?@rD-07N!>FEi89;2%DH08k-rJ8k(4znHrf`SelqwO#iThWg1qA!c#2j z(+})q;lL>?ZD_2QlT((fhsE6Ovb$KeV%56+=^++VMqGw!Na8eddfpM1Q&{zRA7$B# zRYLk0%Q37H3tlnXOgA{rB92uy>Nra@R*4CBSR%1XOnk`fFx}uavjQIH1J%Ugkq)$E zRhsU05{HvOu_0|}fje*_96N^lH!daH> K31?Zi$N&Ha`sv32 diff --git a/artifacts/test_program_methods/claimer.bin b/artifacts/test_program_methods/claimer.bin index 459b4049ffc3d3bba8bd41cee6faeb8c5368f21f..c92813a9ba09bfd6030ad24aed7f4a08b3724398 100644 GIT binary patch delta 741 zcmZqJBHjQ*EsQNpEzDb3Zm$-$Fg7(YvNSZYG%+;DnkObMh-FF+yD@Lq(y>_rvVU?&YVhNsp?hFg|fKa^8>@a=3 zFf0Fb-uujglDI?+^)2ig_jMR%ygg@btz-qMmBF|IfYeY;UgB~>65pxtivh`GFI9I zzf(1)@7v14j!V17v~4&fK{jvq-Ny2Y5vyLW9V}H?C2EUUf~TK5!-72^6z?-TOkXd| z%0Hd=KC_@C?hpYgjGKPoEDmEF&$DPvkKM)c1*;Rlp>2fQY_L53P*b1Iy9YWc1@rD-07N!>FEi5yZ2pbugniv^bn3-5u8k?J&S{hlJZeP8GC7ThOOuObX LmhGC$Sk1KnOz0H( delta 73 zcmaE`K>Wc1@rD-07N!>FEi5yZ2wNH$8yXmzS{PZH7?>Ly8k!j!Z(qHHC7ThOOuObX LmhGC$Sk1KnMhFzU diff --git a/artifacts/test_program_methods/extra_output.bin b/artifacts/test_program_methods/extra_output.bin index bfb0beda9a9aba7dc9a1f160b82a902944557f6c..4e57b7922343d4ff812ae7dbd4a8a231151fdd2f 100644 GIT binary patch delta 9599 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 delta 9637 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 z z!*{_6D9vWl_zl6w!C!s9ZU_TI!9^FW5YGqO>&RQ+J&lTS7>n`G4a2Ue#`BYxxcvxC zqT_ENWSCJ1Zc4L9;A0!s%-pAb_v3>BO0U8*&H_gug!9CUBar)azch%#_sd#G%+G^vFbS_jfHlW}=u+6q+>sJ^kMz?p<&UVtivW@Hf9Nq zWrO>`3E{|Ep3yJhbsa1RI^YF%FiItb$1fI)h>C42wq*~zz>?wMO73sOOzX$tej$=j zod2ulAY}KU0TRN)Yl5LLfd%fJi=^vm9G6D_i{LzPD))Z{t^h|dx6Q_cY)Q5dOwrci z_BnVRxEkY)^S==d6%a7@Wi}RbQ7_-iKsZzc-U-fU0}JM(@btxuIK=0{)%`4oRW1jz2XxNEDlFSCWEWjnXGhP!M@=&%nX)p148Y#P6Iv!w2@w%KFQkzJKV|-#*}MDTV!^J*K~R-VtY(_nGgVt@RO~ zIDc|WXTQR2+Gi+OL*=T85-^tJErxtniUpF5Kscl2$lpKE|u zE_Eh$yo*;c@%_`i!M$B=yk8%3zUx)LbSB=}ezbSfmrlPs8rgi*`KtG!e>x}qQBvRc zPv-*1AKSh69(Ly5QCZqq=Y%_q-~F|7gtwr#E6AI%(izh3E|KtJ*sMFM{pOUbop*4J zGfYo8;`~v*g9R+V=g!SN!w22Xp2!*RrSI;#XkJhG-TI>cU#-#Mad)$MwA>lmzeq8(#QdLFjT- diff --git a/artifacts/test_program_methods/minter.bin b/artifacts/test_program_methods/minter.bin index 7f59d988eb925d956921c87b21fb60b96285c3db..1e464b894cc897c6a5a3fe96ef5ec8292bc4f76e 100644 GIT binary patch delta 9593 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 xg5ogueSN1q1IQ zM6PQ%xh;)osZ&_$wc{IRk%4;QozWx~wtq!YoCFt=UAxnI z^2-^u-cTOD3TG0*naZGFVWCo%DlX|o%MT|h9+E-1cRf~7g9BuFvU3D|26GFp@?)0T zAbS`Mk?YI~;Oj2l1`B5#KJ%8t;Y)@Ts11up+`!!>N;m%YkhW1=SG+7J=N&%%*yI8t?sy64_(P+%*4TY^JpF|KL(_Q<#1jkNvk}%^I>j9UB`fa@Y#5u z5L5eBY=EnXXcTNcJ~@vN<>=67n*IK_n#y-urcbtVh?a-%!I2$dR#5%$N!=Yp+$4cO2;1pXz#ayUD+R3{Ljh+PzLv%C z`sOt)lkA7f;l*nHdd_NI3p`RGj+>6bhGTFZJS53yck7k|Yv5~5{jv{-?f3rx17!?^ z3q{o9Y|t?DURw(W!AqlQ?^Vd3BD>rjO_N#LP0#N;@F^afy(*%ko**ag@Z0|_!_rp) zZ!Gf3ylD0Q=RQdrzJZX{4~6_3Jjx^qm504%Q@LEc3QpPK$gj@j1M?^wDg(#=g;1RE z)w~7GpQUsc(oORnXw{WT@J1S%dG$wzHr&iWQZ)wD4srMSTq84MvrEU%S<~ zZ`T0*z?{JHCA$ix^$<6yWdF$7@o#KSfw_6u{^KI{^w^}x@;1Wcgw#LW_K&UVcq^@cdefU|7VPrIuhY`aSI0)Io&SHg CMm$yk delta 9625 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 bZdxz*zv79rGD|$Mf751I4~~ua>*D_dMrb}K diff --git a/artifacts/test_program_methods/missing_output.bin b/artifacts/test_program_methods/missing_output.bin index af956dfdb48420123c25e6c7704c55ef842e1ac0..5654765877472c484cd271adafaf6c94e53fd0c6 100644 GIT binary patch delta 733 zcmZ3pMSRT`@rD-07N!>FEi9aCgpCa?j4aHI%nZ#<%}vcL%neK|rpv5hnTu5-a5syF zl!;zWPFb!VHjQ9;bDZ+q1J<(evf(mWUCJ1z&gmOBvz)@JasDF~?!v_G;lymNcyT zCYG=`OuulJMFpGe_QYK*a@bu1@}`s#ZVSQkxcxaDEN_WdzsB_1JuK|l+y&M>ecv8D efjn(59!Y5vJgFjK8H-GNFEi9aCgw4$?EX>W!49twp%?vC|49rZ-r^~EinTu5-a5syF zl!;zWPFb!VHjQ9;bDZ+q1J<(evf(mWUCJ1z&gmOBvz)@JasDF~?!v_G;lymNcyT zCYG=`OuulJMFpGe_QYK*a@bu1@}`s#ZVSQkxcxaDEN_WdzsB_1JuK|l+y&M>ecv8D efjn(59!Y5vJgFjK8H-GN^CcRx~~!^O;(dWLQ4#@BGg`oa6m2-^cgy+iUN&*IIk+ zwfEU<+SRIjSF4ptTFk1pw`xNdWj~*-ZO+#JvQNvmFYnVUqO3P+MCuJgW{HTdYw~HW zNN!$Oy26^SOYGMonQ%+RgW&@KUUXEXq=O*_a%X(ByqOISH93%8i zRlh&fiIjE2a3#O}2NWZ}UddY&Z}>vLnl|P<0l34E4Are)J@%yeEA~E|G$<@FYS`T3 z!(Zwf(`wI(RA(5HsD`a+5HVmcEXU!6gZ*{sWN)w5`)Ss%SXtE5kjjvo5VNqV_AWzG zl%8Qfip2Icq^07IFW@EewM_3M(Bz+4zdH?CuH;iL5`N}MROX$7x4>S$bpJ)9)VJe7 zd6I^VA--WBz)5%e32@7=WMqI}g!5rHAvDo0iEQiV=fk`9KmMh+(Bht@eNL92cxQ{x z9n@>$R(vPY@*dPHdvoo>hxD-_tDg2+%Yp8E#9dSv?G31oevzWLn zM;@j8zCv7b?lmM<#pylbuq+_odPO7wd8#W9%WO@Pp)@3`0Y~9^u$Q+L_TgInYLsQ% zsL9#;4C$cymB4dy4XIU}lAuZHLw>D)6c*x%=C*X0g)6YrORpBsOr$7IZGJe z0dOT;tKb1=P}XgS*N zFqvJO2&*KMeek__2^T(v=TtDq z^G{7pw#+nSx|09Wk;qJ=?kdjc#EOj!OJ_CDTsRi?4F3?$4e-zKB^*(5OExF7-5w1~ zoKo;JoC|vjdUdAIanN}@AMSvGS@d@dY=FOH0%s|mNcHZ5qk##F;J2A@gpzNEpFut@ z!cn?h?NZ$Cg8o;li~^Npp;#?Jc2|~QzQ2n~;6reh@;o}_+Jbf;oDe8*FTq7P;#Jf= z@brLV&AJh(QH_r2@}WKYXT61PooL5?f6?2|nha}C!3pqI_|yx2K|2H2!p_n=5xK>n zUH9>$qh!2E)Fy`0y|KSS`!$`>TF6TH9;))k5oH z(t4zEtgK*eRh!;}^Ir9fX#-p`y3t9QU)=2a(8jplci>{6dAt1&nl)=mD(x!`$x&-? z7M=qe%C+B<>4zBS#q=P&H=rjegBXwTryC8gX1rG~zJlvtGo(T3?{()jYpBb7`*Lik zA~vmA9}3e1fBz1JQwn{>P3|T+kbB!}pna}&Xq{$tph%bfhhKPR!rR~k<-j_)5c`G-yKUWC2Wka;SebKwK@@4|Q|yEnr*6MZ{=g7bZTOnUTYzXl9_8ZLa-Uyz+} zxj#VkyEJ){{yA!b{_vFmFNO>0@0}I9if1H+p3r`<4=06IXv6O6OI>>3kd-Q+@4#gn z{Cnc(@U}nu{x2qORdAu&L_fmDB;TJ}dwaXk*rsWJ=uZLPW5`|=xA=QF#6R`j7y~by z>W^Dz59%1IiMF~7VfQm`xf=JugB0p73^}X#JX}4^A9v?N#BaJ^HlKkL0{js??@L1t zsPPx!%E0)$@-K(NRq^kZ!}1^IKC0|}4lX%j zNUqAKzr&|$`~x+90R5RKQO%PNC)WD%b#O^Q{xzKI%PmQ{m&;0^!%TP{9mmG(;WutJ&y*D1gT) zg=b-5!q&>e?)Pib8uoVXQ*hAWmYX>3J?md*47G|=vw8RE-i@Gwdj?cM>u z3YKwRM(A>TtrNA6Ubr{L7@4O!^+ zze8Rgg~Gu3whz91?cJeuq48&EzZB?~GL~cTydj5_-YM|(dPA0~t@0yW z7Pxz6kTJ&?f0OcOE?gc6(003Rf9Gh}NQo)C=-&X5s65iQ#ZcUE&#a+SU%6S!uyFlD;pipM!YW_$hhJH+{f&ZEKGkvrkw9XvFJ37!f| zTNF5nkz>y&2w5?4O=hCVG$l65y>{%hFOLhYh}LG=uS^Qnw26D3arymCsZ{a)$X>8G z)LqvS?F~yq`=hdF&C+Dk3bQc}_Q2IE&Bi&b4MOoV3ul^N79urO;SC z&Ui|b+i9;<_U*L0Ee}1>R7L^Xp0pRkg1eD8U4~O()J8aqGd(@P zOW=$^|G&Ypuvdy>p2e?#`~kRUVEn6a51%dhjD}8u0XJf3FTaB%7irQvz?&9OdST)c zG4KN1HNcs_(WEo%IrJQy85qAEo_Eqz6~*rT@1gjnrZJxjiym&gMO$!&gr#0Zca%Nj z-O&D!H4S4Vh^IH){lWS}dJQ2AU-3oXT>^Y+^ z=70^z2f$N&d4E|(!}LIhJ#Yf-ZG+}Zhz{IMO*jnB56FM8FaJ68M6`9>;`~|VkK4DD z{d!Ya4CQdr^O}r&BOG}RaJJ7F_+2=R+~E><@4xW@rT8eE_gYvA)Vv*DATV&1;z{tF z*TZtc?XOFzeQr~zLeD-ABBrLxyOpb%i)r) ze5#X%4zK*07q;8Nkz*9LWETy)S5Zflf?wfwZr!wN7D z;M`Z#cnbyJo~Hv#U?`93>v?Rib}O7SL7$&6h$R@O6n+SAI%-Oy3h8-x?=e$KlsxSM zkG+3o!dTb9jLY=@ry04)IQpi+(~n~y23bzSA8Cl963kHwYMlNVpE(rjmLioCSMJGT0;v&BJ09D1}iJwBWXR91gD8-(j_85raG3%1)@@ zUZRqA99+MKS5BqxpKuB6MJ&4m*Xw85)+(n?!u5MiOLA05GH=6!eeTPY z19*q^l^L1S8E}b)$*c*Hi45qGs)-Tr-Y6V-yL4`BBx$NrkPq)}>+gbXcOqwkQA!@& z1AXk0>53=A!JMgttwJiDw`OKfJmedrj~eg@T=_4uRPoEOS2!GlcEg8G8b&M8sBaLIS^w;{&D8aXXVqd ztT~lQdHCP({T9bgDYXLPF#em;@soe>EDZFTHb=YIuVbY|Bvwr7QC^9 zxQYgk+jrn&t4-OhCKxb>oM;!85>@+m!ll16rHID|XM#a zPqQmrcF+HXG^BpycQ{(at*3?wRZiT$fKVJY8_$9mmM!Z=?#6u7IfZ2~TzV1%)P!%s z9e%=qrmg`U7qW{e#a?0i3!D%gmX%s3x5Mfse7rUbH&(**r5qrX-ZJH3SNm{vXxfn* zGwU@>#;9=c)ZgUwKCSvh5c9g-ViEfA27M?})$PKtBjeLjA=QKY<=E;@31egE%767KNkM>VnD$E)B~aDt=H zlo8*HY-M1m+F%*H$+zGGIC+AnaNJRm?Q9sYHniY zPqPg+HCfmqvZ0SI>(zp0IIXWP)rwP(iLCJ%uo!OXr%OawfhJS`C35lhki;_Ij@UZ* zY8<#)@mFvX?8+04iyVhDZFxKkrZaFG8{DoIY_KN&GjM}8`tnJU%$sy+QXAF$DAGje zqtv|eQzDfEF@{>r+NL@N9{>K@-M81LT?F4%07tU|6E~}J${yD7{-hdfyA*B0SC49L`_Md>Le zE~}77D8GexXO7b)M#X6had^%rulZFZ9(l4O56NOplN<(;)Pg2>DeUI$4(m`u;Btf+ zx<-=|<8|q!=Dh_MXX(416;r(YSO`btdWQcOoO?Top$tC?_d@PE-tSsXw)^H6 z!FxS6okd(pi4$OCqs(h+{q!)G0-l!%U#*?Vq<}h_({R-cUD6e&#%j_sQxBKE?NAwf3f9B==#6%jcADi) zcnD5_Rg%eGcpM(Ntt&6?N_h?J-$3ttrM{K0Kf>?9Z3dJLJ02LT-BPyfc;M4H$F4&2 z-60_d!iV0ky(T?iYz*^*aE-4V{tWxO+A+A~9?$X=&ax6t47;ky}{umpp#$N{)F2ZvWq=^^Q-_E`eQz^>udaF&nH!548v$xX46D7P6QiBk&B z!CA1YU_?I}9T%O;%ivxZIEwkUf#>0`*uXwYJ5m|_an!fr6YxehoTlWp@Dk(&VU7rh zc4JwOGl37xw`ov`CW_S&jJ=T~_?=fpZ@~xQQOfhE0arG(+u?X$gL@t>!4bEk?tzPZ zj>QfnQZw5e3rMv!>z6=mz-;M3y+7;LvnEq+pyBwq25x!AYiK9o2G~A&J0giX4a+zG zSvbeXr{F}`ZHNX(yx&`2cKlr6NZd*W{b8>wJ9IuUTN`7Iyb!n?seNLN)PiqDr=+KF zt*mBm)tk1!*)Mv{^gLWXtIbJSR@R|?@SV7fn{m-MTx;!NSTpA*GrmTbOmzl7z{Rkx zT-!jVA7q^y(?jrXpPn9R#P}X>yV>w7tatmxH*o9Ax|~(|M-0B=3h~^qK%u8N`WBJ{xm#Wntdm`XZ)#>AnsnuVdW~lxTm#1|2R6d>=y9|42%PvA z@3P4lM%XKKS*qf>1m4H|{;apN+k!Li^X&Kq&h_|SNgqzV`V3tP7jE_rqzk;X>xScg2Tg3lf8mXg^zr5`(L?$s98Wqq@aOD>KSN4Ae z*SzidUrOBe!iB1cT4DWu&!0wXTaV!EsFd{fA$AIl~FvFAnsy!;_=-9~F- zpWxw0bHF63pLMI$x_9rQQGcn+3B{-3{qwzbL#GhGBCl;e4#)fWeR%0ty6jWyFTnM_ z^&@jN*#!4Q&iQl}lYtfn+ymQDwrxQ0$H_$#so~~O_zKnnk@7dV@N2Kx9EO*&uiNE} zJ2jaJcXRa0T)3R|gq3|FxBT+pP;rm%jKY+@kdd#{_#z8wW{fl~MbENs|S zd6;qsPe9nM++x^oaQg{Y^2Yze>DfMc1nu^7YhYS1HaI#sRg;~~x|~uQ_s-K~{ZUd~ zMdIw;+o549J8NcY8H)uB3;Lo}oRC?#bMXkD&s#0l%D}8UzA!JMw z>#tS*EP<Vu=EWE? zO1b@jb!k$tHp=WmYbr@FBwa0k4E2efjJ6K;2i7(D%$Pxboal^PbxKJ+hr7i+%eve#hSaNgzi%yjDtJ>syWZMT z8vHb3^rD5DY+Y@%<-s0!{~Dt$4<`JE_`hg`ZzlU$^9ML_xo2mCwe9!8*@3vwB25M{ zUa#z{vj(mTJ`$z%u-;f3JRCiz@KMg^?}msQu*Ycehm5x8&zvR5KQiQmI+*<5QW(Cx zcnvOlCM1zc{{eXWH%8m%S)+AmLvVJaS%aRGXG4O!;W%A}lVQ|`c?@@Ys*hK|X}Atlw5sUdV=dSm{4{7T zz?hb+LUKx-%4T>|JKiCR&n?#^ZjHBj#*@7KR)^5!82bc#A96RkJK+0a*O`c?xL|$q z@$iG5e2lDQpvX624;&A>Wzgwqq5}_98%}|9ee$2JOK%4si8Px{?w^;ub$d&x*K0$f zD~Efm&}90nq42K(cKH;*o8b_0o8N+Wuj2zsaTA>Va!B&kzI~n{Fz{Z*^WfsOAvx;I z56EWgegUxdqV#Gq=P*h;<&KD(9shE%cT^S|Sl z#pjLigTdyv;0W?8S+#6$*fx*k29RbamE&kLPs1%ZwBD8Ti}HzAb;)Hbd;ShM>jkym zWZ=ZlOyCG~<GNNtexD}ryGR&LK<47Xz7 zZZ$vRvPe7;$bsz$41-UV=~AWSJK%)1UPOALqsn139Fi3bwALBn&k%cqt^6flHp0(# zo3GROTzJ`2a8H28lHH}$2EibA97$KC_^l{v=>fehqU&NbQXY1=6=d$U9=;C!W zZ$32LGab`KlTkho>fqK@gj8)XtSeojU#Kl<--Ndkp(G{$9In8iEX6CYr}uth2+bwz z@MrKvj`S@1hX)$E@sUqbTyz&CqJUpV?W%|)pP%YZTX~l=SMq>f#u!Eb^cLt^GDh3#l){<3)x_Mh2DusXA_!ToyD&}(^@ zsHD9YZe7o>oJ!w6;d0oG*jV0+J0GX4RZbm)TX!3#WU7!1?~MnaIKNEU9xQ^ZSL)<~ z6QQg7@Oz9e0@-k(k5|JRwm6^e_WI#TM2LvGM>=^RrHwpB={pY>JY(vhaBFCy4Z@OW z{uEyW7n0RPFr3wS@LAZAN6HL%o=^Tde2^R{V1jMH^*3paP1fGkz~0_-*p+n~S02aoCDyUylUGdP0J z__$L^H~3afj=xUCa43#<$O_nhm-HM(|8JnT>&oNjM&SV=T&OlY1`D0BQt{f+yxn2D zD(nq!9mCHPzPsVVB(l7pcLXUpRKXd3k5c+Grc$Q9BYR}3i3h%cjZA3pap${P$z`-$ zZTNitl~r*Z_E*IV(@5g8de~#zzz3$=AC+DXorkkeI=}nca?6~dNpv6Q*0%?uXHte; zLb6j?96N_v?oUJ%7s1i}Ia5_eN%vl9&`Q{E&^{tVM~T!8n+IoGp2e+0?2Dwel85f9)0g?xhfUo4S4 zMg7<9Cb;PpKJC;7BEMmrVdWIIX%sqVMWZ>{(sTe)e*H7WiPG@w6iwMiCn5_1FUQ3M!x>U F{{r}ybnO5D diff --git a/artifacts/test_program_methods/nonce_changer.bin b/artifacts/test_program_methods/nonce_changer.bin index cdb931f93182173fbf66cabcfdd55e3c5bf26f92..75f117e3023032023d3d3863d316af09bf82facc 100644 GIT binary patch delta 9619 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 a-%zae^u(DjedKQWy7r>ED%-PS&c6UYU^R>Y diff --git a/artifacts/test_program_methods/noop.bin b/artifacts/test_program_methods/noop.bin index 6a90fcd4376db669df84351d10d878169e78dff0..aa9c8e8441b06bbcbc0801ee8c821d8a251e8f42 100644 GIT binary patch delta 711 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 delta 9650 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 YI(D5m&K$bUTmKEMo%zi0h}Wn6FG(^~Z2$lO diff --git a/programs/amm/Cargo.toml b/programs/amm/Cargo.toml index cee580af..4c3ded21 100644 --- a/programs/amm/Cargo.toml +++ b/programs/amm/Cargo.toml @@ -11,5 +11,4 @@ token_core.workspace = true amm_core.workspace = true [features] -with-nssa = ["nssa"] -test-utils = [] \ No newline at end of file +with-nssa = ["nssa"] \ No newline at end of file diff --git a/programs/amm/src/lib.rs b/programs/amm/src/lib.rs index 1219592c..923f99da 100644 --- a/programs/amm/src/lib.rs +++ b/programs/amm/src/lib.rs @@ -7,7 +7,5 @@ pub mod new_definition; pub mod remove; pub mod swap; -#[cfg(all(test, feature = "with-nssa"))] -mod full_tests; #[cfg(test)] mod tests; diff --git a/programs/amm/src/tests.rs b/programs/amm/src/tests.rs index 97561516..11161cf2 100644 --- a/programs/amm/src/tests.rs +++ b/programs/amm/src/tests.rs @@ -4,6 +4,10 @@ use amm_core::{ PoolDefinition, compute_liquidity_token_pda, compute_liquidity_token_pda_seed, compute_pool_pda, compute_vault_pda, compute_vault_pda_seed, }; +#[cfg(feature = "with-nssa")] +use nssa::{ + PrivateKey, PublicKey, PublicTransaction, V02State, program::Program, public_transaction, +}; use nssa_core::{ account::{Account, AccountId, AccountWithMetadata, Data}, program::{ChainedCall, ProgramId}, @@ -20,7 +24,30 @@ const AMM_PROGRAM_ID: ProgramId = [42; 8]; struct BalanceForTests; struct ChainedCallForTests; struct IdForTests; -struct AccountForTests; +struct AccountWithMetadataForTests; +#[cfg(feature = "with-nssa")] +struct PrivateKeysForTests; +#[cfg(feature = "with-nssa")] +struct IdForExeTests; +#[cfg(feature = "with-nssa")] +struct BalanceForExeTests; +#[cfg(feature = "with-nssa")] +struct AccountsForExeTests; + +#[cfg(feature = "with-nssa")] +impl PrivateKeysForTests { + fn user_token_a_key() -> PrivateKey { + PrivateKey::try_new([31; 32]).expect("Keys constructor expects valid private key") + } + + fn user_token_b_key() -> PrivateKey { + PrivateKey::try_new([32; 32]).expect("Keys constructor expects valid private key") + } + + fn user_token_lp_key() -> PrivateKey { + PrivateKey::try_new([33; 32]).expect("Keys constructor expects valid private key") + } +} impl BalanceForTests { fn vault_a_reserve_init() -> u128 { @@ -158,8 +185,8 @@ impl ChainedCallForTests { ChainedCall::new( TOKEN_PROGRAM_ID, vec![ - AccountForTests::user_holding_a(), - AccountForTests::vault_a_init(), + AccountWithMetadataForTests::user_holding_a(), + AccountWithMetadataForTests::vault_a_init(), ], &token_core::Instruction::Transfer { amount_to_transfer: BalanceForTests::add_max_amount_a(), @@ -170,12 +197,12 @@ impl ChainedCallForTests { fn cc_swap_token_b_test_1() -> ChainedCall { let swap_amount: u128 = 166; - let mut vault_b_auth = AccountForTests::vault_b_init(); + let mut vault_b_auth = AccountWithMetadataForTests::vault_b_init(); vault_b_auth.is_authorized = true; ChainedCall::new( TOKEN_PROGRAM_ID, - vec![vault_b_auth, AccountForTests::user_holding_b()], + vec![vault_b_auth, AccountWithMetadataForTests::user_holding_b()], &token_core::Instruction::Transfer { amount_to_transfer: swap_amount, }, @@ -189,12 +216,12 @@ impl ChainedCallForTests { fn cc_swap_token_a_test_2() -> ChainedCall { let swap_amount: u128 = 285; - let mut vault_a_auth = AccountForTests::vault_a_init(); + let mut vault_a_auth = AccountWithMetadataForTests::vault_a_init(); vault_a_auth.is_authorized = true; ChainedCall::new( TOKEN_PROGRAM_ID, - vec![vault_a_auth, AccountForTests::user_holding_a()], + vec![vault_a_auth, AccountWithMetadataForTests::user_holding_a()], &token_core::Instruction::Transfer { amount_to_transfer: swap_amount, }, @@ -209,8 +236,8 @@ impl ChainedCallForTests { ChainedCall::new( TOKEN_PROGRAM_ID, vec![ - AccountForTests::user_holding_b(), - AccountForTests::vault_b_init(), + AccountWithMetadataForTests::user_holding_b(), + AccountWithMetadataForTests::vault_b_init(), ], &token_core::Instruction::Transfer { amount_to_transfer: BalanceForTests::add_max_amount_b(), @@ -222,8 +249,8 @@ impl ChainedCallForTests { ChainedCall::new( TOKEN_PROGRAM_ID, vec![ - AccountForTests::user_holding_a(), - AccountForTests::vault_a_init(), + AccountWithMetadataForTests::user_holding_a(), + AccountWithMetadataForTests::vault_a_init(), ], &token_core::Instruction::Transfer { amount_to_transfer: BalanceForTests::add_successful_amount_a(), @@ -235,8 +262,8 @@ impl ChainedCallForTests { ChainedCall::new( TOKEN_PROGRAM_ID, vec![ - AccountForTests::user_holding_b(), - AccountForTests::vault_b_init(), + AccountWithMetadataForTests::user_holding_b(), + AccountWithMetadataForTests::vault_b_init(), ], &token_core::Instruction::Transfer { amount_to_transfer: BalanceForTests::add_successful_amount_b(), @@ -245,12 +272,15 @@ impl ChainedCallForTests { } fn cc_add_pool_lp() -> ChainedCall { - let mut pool_lp_auth = AccountForTests::pool_lp_init(); + let mut pool_lp_auth = AccountWithMetadataForTests::pool_lp_init(); pool_lp_auth.is_authorized = true; ChainedCall::new( TOKEN_PROGRAM_ID, - vec![pool_lp_auth, AccountForTests::user_holding_lp_init()], + vec![ + pool_lp_auth, + AccountWithMetadataForTests::user_holding_lp_init(), + ], &token_core::Instruction::Mint { amount_to_mint: 282, }, @@ -261,12 +291,12 @@ impl ChainedCallForTests { } fn cc_remove_token_a() -> ChainedCall { - let mut vault_a_auth = AccountForTests::vault_a_init(); + let mut vault_a_auth = AccountWithMetadataForTests::vault_a_init(); vault_a_auth.is_authorized = true; ChainedCall::new( TOKEN_PROGRAM_ID, - vec![vault_a_auth, AccountForTests::user_holding_a()], + vec![vault_a_auth, AccountWithMetadataForTests::user_holding_a()], &token_core::Instruction::Transfer { amount_to_transfer: BalanceForTests::remove_actual_a_successful(), }, @@ -278,12 +308,12 @@ impl ChainedCallForTests { } fn cc_remove_token_b() -> ChainedCall { - let mut vault_b_auth = AccountForTests::vault_b_init(); + let mut vault_b_auth = AccountWithMetadataForTests::vault_b_init(); vault_b_auth.is_authorized = true; ChainedCall::new( TOKEN_PROGRAM_ID, - vec![vault_b_auth, AccountForTests::user_holding_b()], + vec![vault_b_auth, AccountWithMetadataForTests::user_holding_b()], &token_core::Instruction::Transfer { amount_to_transfer: 70, }, @@ -295,12 +325,15 @@ impl ChainedCallForTests { } fn cc_remove_pool_lp() -> ChainedCall { - let mut pool_lp_auth = AccountForTests::pool_lp_init(); + let mut pool_lp_auth = AccountWithMetadataForTests::pool_lp_init(); pool_lp_auth.is_authorized = true; ChainedCall::new( TOKEN_PROGRAM_ID, - vec![pool_lp_auth, AccountForTests::user_holding_lp_init()], + vec![ + pool_lp_auth, + AccountWithMetadataForTests::user_holding_lp_init(), + ], &token_core::Instruction::Burn { amount_to_burn: BalanceForTests::remove_amount_lp(), }, @@ -314,8 +347,8 @@ impl ChainedCallForTests { ChainedCall::new( TOKEN_PROGRAM_ID, vec![ - AccountForTests::user_holding_a(), - AccountForTests::vault_a_init(), + AccountWithMetadataForTests::user_holding_a(), + AccountWithMetadataForTests::vault_a_init(), ], &token_core::Instruction::Transfer { amount_to_transfer: BalanceForTests::add_successful_amount_a(), @@ -327,8 +360,8 @@ impl ChainedCallForTests { ChainedCall::new( TOKEN_PROGRAM_ID, vec![ - AccountForTests::user_holding_b(), - AccountForTests::vault_b_init(), + AccountWithMetadataForTests::user_holding_b(), + AccountWithMetadataForTests::vault_b_init(), ], &token_core::Instruction::Transfer { amount_to_transfer: BalanceForTests::add_successful_amount_b(), @@ -340,8 +373,8 @@ impl ChainedCallForTests { ChainedCall::new( TOKEN_PROGRAM_ID, vec![ - AccountForTests::pool_lp_init(), - AccountForTests::user_holding_lp_uninit(), + AccountWithMetadataForTests::pool_lp_init(), + AccountWithMetadataForTests::user_holding_lp_uninit(), ], &token_core::Instruction::Mint { amount_to_mint: BalanceForTests::lp_supply_init(), @@ -403,7 +436,7 @@ impl IdForTests { } } -impl AccountForTests { +impl AccountWithMetadataForTests { fn user_holding_a() -> AccountWithMetadata { AccountWithMetadata { account: Account { @@ -975,6 +1008,813 @@ impl AccountForTests { } } +#[cfg(feature = "with-nssa")] +impl BalanceForExeTests { + fn user_token_a_holding_init() -> u128 { + 10_000 + } + + fn user_token_b_holding_init() -> u128 { + 10_000 + } + + fn user_token_lp_holding_init() -> u128 { + 2_000 + } + + fn vault_a_balance_init() -> u128 { + 5_000 + } + + fn vault_b_balance_init() -> u128 { + 2_500 + } + + fn pool_lp_supply_init() -> u128 { + 5_000 + } + + fn token_a_supply() -> u128 { + 100_000 + } + + fn token_b_supply() -> u128 { + 100_000 + } + + fn token_lp_supply() -> u128 { + 5_000 + } + + fn remove_lp() -> u128 { + 1_000 + } + + fn remove_min_amount_a() -> u128 { + 500 + } + + fn remove_min_amount_b() -> u128 { + 500 + } + + fn add_min_amount_lp() -> u128 { + 1_000 + } + + fn add_max_amount_a() -> u128 { + 2_000 + } + + fn add_max_amount_b() -> u128 { + 1_000 + } + + fn swap_amount_in() -> u128 { + 1_000 + } + + fn swap_min_amount_out() -> u128 { + 200 + } + + fn vault_a_balance_swap_1() -> u128 { + 3_572 + } + + fn vault_b_balance_swap_1() -> u128 { + 3_500 + } + + fn user_token_a_holding_swap_1() -> u128 { + 11_428 + } + + fn user_token_b_holding_swap_1() -> u128 { + 9_000 + } + + fn vault_a_balance_swap_2() -> u128 { + 6_000 + } + + fn vault_b_balance_swap_2() -> u128 { + 2_084 + } + + fn user_token_a_holding_swap_2() -> u128 { + 9_000 + } + + fn user_token_b_holding_swap_2() -> u128 { + 10_416 + } + + fn vault_a_balance_add() -> u128 { + 7_000 + } + + fn vault_b_balance_add() -> u128 { + 3_500 + } + + fn user_token_a_holding_add() -> u128 { + 8_000 + } + + fn user_token_b_holding_add() -> u128 { + 9_000 + } + + fn user_token_lp_holding_add() -> u128 { + 4_000 + } + + fn token_lp_supply_add() -> u128 { + 7_000 + } + + fn vault_a_balance_remove() -> u128 { + 4_000 + } + + fn vault_b_balance_remove() -> u128 { + 2_000 + } + + fn user_token_a_holding_remove() -> u128 { + 11_000 + } + + fn user_token_b_holding_remove() -> u128 { + 10_500 + } + + fn user_token_lp_holding_remove() -> u128 { + 1_000 + } + + fn token_lp_supply_remove() -> u128 { + 4_000 + } + + fn user_token_a_holding_new_definition() -> u128 { + 5_000 + } + + fn user_token_b_holding_new_definition() -> u128 { + 7_500 + } + + fn lp_supply_init() -> u128 { + // isqrt(vault_a_balance_init * vault_b_balance_init) = isqrt(5_000 * 2_500) = 3535 + (BalanceForExeTests::vault_a_balance_init() * BalanceForExeTests::vault_b_balance_init()) + .isqrt() + } +} + +#[cfg(feature = "with-nssa")] +impl IdForExeTests { + fn pool_definition_id() -> AccountId { + amm_core::compute_pool_pda( + Program::amm().id(), + IdForExeTests::token_a_definition_id(), + IdForExeTests::token_b_definition_id(), + ) + } + + fn token_lp_definition_id() -> AccountId { + amm_core::compute_liquidity_token_pda( + Program::amm().id(), + IdForExeTests::pool_definition_id(), + ) + } + + fn token_a_definition_id() -> AccountId { + AccountId::new([3; 32]) + } + + fn token_b_definition_id() -> AccountId { + AccountId::new([4; 32]) + } + + fn user_token_a_id() -> AccountId { + AccountId::from(&PublicKey::new_from_private_key( + &PrivateKeysForTests::user_token_a_key(), + )) + } + + fn user_token_b_id() -> AccountId { + AccountId::from(&PublicKey::new_from_private_key( + &PrivateKeysForTests::user_token_b_key(), + )) + } + + fn user_token_lp_id() -> AccountId { + AccountId::from(&PublicKey::new_from_private_key( + &PrivateKeysForTests::user_token_lp_key(), + )) + } + + fn vault_a_id() -> AccountId { + amm_core::compute_vault_pda( + Program::amm().id(), + IdForExeTests::pool_definition_id(), + IdForExeTests::token_a_definition_id(), + ) + } + + fn vault_b_id() -> AccountId { + amm_core::compute_vault_pda( + Program::amm().id(), + IdForExeTests::pool_definition_id(), + IdForExeTests::token_b_definition_id(), + ) + } +} + +#[cfg(feature = "with-nssa")] +impl AccountsForExeTests { + fn user_token_a_holding() -> Account { + Account { + program_owner: Program::token().id(), + balance: 0u128, + data: Data::from(&TokenHolding::Fungible { + definition_id: IdForExeTests::token_a_definition_id(), + balance: BalanceForExeTests::user_token_a_holding_init(), + }), + nonce: 0, + } + } + + fn user_token_b_holding() -> Account { + Account { + program_owner: Program::token().id(), + balance: 0u128, + data: Data::from(&TokenHolding::Fungible { + definition_id: IdForExeTests::token_b_definition_id(), + balance: BalanceForExeTests::user_token_b_holding_init(), + }), + nonce: 0, + } + } + + fn pool_definition_init() -> Account { + Account { + program_owner: Program::amm().id(), + balance: 0u128, + data: Data::from(&PoolDefinition { + definition_token_a_id: IdForExeTests::token_a_definition_id(), + definition_token_b_id: IdForExeTests::token_b_definition_id(), + vault_a_id: IdForExeTests::vault_a_id(), + vault_b_id: IdForExeTests::vault_b_id(), + liquidity_pool_id: IdForExeTests::token_lp_definition_id(), + liquidity_pool_supply: BalanceForExeTests::pool_lp_supply_init(), + reserve_a: BalanceForExeTests::vault_a_balance_init(), + reserve_b: BalanceForExeTests::vault_b_balance_init(), + fees: 0u128, + active: true, + }), + nonce: 0, + } + } + + fn token_a_definition_account() -> Account { + Account { + program_owner: Program::token().id(), + balance: 0u128, + data: Data::from(&TokenDefinition::Fungible { + name: String::from("test"), + total_supply: BalanceForExeTests::token_a_supply(), + metadata_id: None, + }), + nonce: 0, + } + } + + fn token_b_definition_acc() -> Account { + Account { + program_owner: Program::token().id(), + balance: 0u128, + data: Data::from(&TokenDefinition::Fungible { + name: String::from("test"), + total_supply: BalanceForExeTests::token_b_supply(), + metadata_id: None, + }), + nonce: 0, + } + } + + fn token_lp_definition_acc() -> Account { + Account { + program_owner: Program::token().id(), + balance: 0u128, + data: Data::from(&TokenDefinition::Fungible { + name: String::from("LP Token"), + total_supply: BalanceForExeTests::token_lp_supply(), + metadata_id: None, + }), + nonce: 0, + } + } + + fn vault_a_init() -> Account { + Account { + program_owner: Program::token().id(), + balance: 0u128, + data: Data::from(&TokenHolding::Fungible { + definition_id: IdForExeTests::token_a_definition_id(), + balance: BalanceForExeTests::vault_a_balance_init(), + }), + nonce: 0, + } + } + + fn vault_b_init() -> Account { + Account { + program_owner: Program::token().id(), + balance: 0u128, + data: Data::from(&TokenHolding::Fungible { + definition_id: IdForExeTests::token_b_definition_id(), + balance: BalanceForExeTests::vault_b_balance_init(), + }), + nonce: 0, + } + } + + fn user_token_lp_holding() -> Account { + Account { + program_owner: Program::token().id(), + balance: 0u128, + data: Data::from(&TokenHolding::Fungible { + definition_id: IdForExeTests::token_lp_definition_id(), + balance: BalanceForExeTests::user_token_lp_holding_init(), + }), + nonce: 0, + } + } + + fn vault_a_swap_1() -> Account { + Account { + program_owner: Program::token().id(), + balance: 0u128, + data: Data::from(&TokenHolding::Fungible { + definition_id: IdForExeTests::token_a_definition_id(), + balance: BalanceForExeTests::vault_a_balance_swap_1(), + }), + nonce: 0, + } + } + + fn vault_b_swap_1() -> Account { + Account { + program_owner: Program::token().id(), + balance: 0u128, + data: Data::from(&TokenHolding::Fungible { + definition_id: IdForExeTests::token_b_definition_id(), + balance: BalanceForExeTests::vault_b_balance_swap_1(), + }), + nonce: 0, + } + } + + fn pool_definition_swap_1() -> Account { + Account { + program_owner: Program::amm().id(), + balance: 0u128, + data: Data::from(&PoolDefinition { + definition_token_a_id: IdForExeTests::token_a_definition_id(), + definition_token_b_id: IdForExeTests::token_b_definition_id(), + vault_a_id: IdForExeTests::vault_a_id(), + vault_b_id: IdForExeTests::vault_b_id(), + liquidity_pool_id: IdForExeTests::token_lp_definition_id(), + liquidity_pool_supply: BalanceForExeTests::pool_lp_supply_init(), + reserve_a: BalanceForExeTests::vault_a_balance_swap_1(), + reserve_b: BalanceForExeTests::vault_b_balance_swap_1(), + fees: 0u128, + active: true, + }), + nonce: 0, + } + } + + fn user_token_a_holding_swap_1() -> Account { + Account { + program_owner: Program::token().id(), + balance: 0u128, + data: Data::from(&TokenHolding::Fungible { + definition_id: IdForExeTests::token_a_definition_id(), + balance: BalanceForExeTests::user_token_a_holding_swap_1(), + }), + nonce: 0, + } + } + + fn user_token_b_holding_swap_1() -> Account { + Account { + program_owner: Program::token().id(), + balance: 0u128, + data: Data::from(&TokenHolding::Fungible { + definition_id: IdForExeTests::token_b_definition_id(), + balance: BalanceForExeTests::user_token_b_holding_swap_1(), + }), + nonce: 1, + } + } + + fn vault_a_swap_2() -> Account { + Account { + program_owner: Program::token().id(), + balance: 0u128, + data: Data::from(&TokenHolding::Fungible { + definition_id: IdForExeTests::token_a_definition_id(), + balance: BalanceForExeTests::vault_a_balance_swap_2(), + }), + nonce: 0, + } + } + + fn vault_b_swap_2() -> Account { + Account { + program_owner: Program::token().id(), + balance: 0u128, + data: Data::from(&TokenHolding::Fungible { + definition_id: IdForExeTests::token_b_definition_id(), + balance: BalanceForExeTests::vault_b_balance_swap_2(), + }), + nonce: 0, + } + } + + fn pool_definition_swap_2() -> Account { + Account { + program_owner: Program::amm().id(), + balance: 0u128, + data: Data::from(&PoolDefinition { + definition_token_a_id: IdForExeTests::token_a_definition_id(), + definition_token_b_id: IdForExeTests::token_b_definition_id(), + vault_a_id: IdForExeTests::vault_a_id(), + vault_b_id: IdForExeTests::vault_b_id(), + liquidity_pool_id: IdForExeTests::token_lp_definition_id(), + liquidity_pool_supply: BalanceForExeTests::pool_lp_supply_init(), + reserve_a: BalanceForExeTests::vault_a_balance_swap_2(), + reserve_b: BalanceForExeTests::vault_b_balance_swap_2(), + fees: 0u128, + active: true, + }), + nonce: 0, + } + } + + fn user_token_a_holding_swap_2() -> Account { + Account { + program_owner: Program::token().id(), + balance: 0u128, + data: Data::from(&TokenHolding::Fungible { + definition_id: IdForExeTests::token_a_definition_id(), + balance: BalanceForExeTests::user_token_a_holding_swap_2(), + }), + nonce: 1, + } + } + + fn user_token_b_holding_swap_2() -> Account { + Account { + program_owner: Program::token().id(), + balance: 0u128, + data: Data::from(&TokenHolding::Fungible { + definition_id: IdForExeTests::token_b_definition_id(), + balance: BalanceForExeTests::user_token_b_holding_swap_2(), + }), + nonce: 0, + } + } + + fn vault_a_add() -> Account { + Account { + program_owner: Program::token().id(), + balance: 0u128, + data: Data::from(&TokenHolding::Fungible { + definition_id: IdForExeTests::token_a_definition_id(), + balance: BalanceForExeTests::vault_a_balance_add(), + }), + nonce: 0, + } + } + + fn vault_b_add() -> Account { + Account { + program_owner: Program::token().id(), + balance: 0u128, + data: Data::from(&TokenHolding::Fungible { + definition_id: IdForExeTests::token_b_definition_id(), + balance: BalanceForExeTests::vault_b_balance_add(), + }), + nonce: 0, + } + } + + fn pool_definition_add() -> Account { + Account { + program_owner: Program::amm().id(), + balance: 0u128, + data: Data::from(&PoolDefinition { + definition_token_a_id: IdForExeTests::token_a_definition_id(), + definition_token_b_id: IdForExeTests::token_b_definition_id(), + vault_a_id: IdForExeTests::vault_a_id(), + vault_b_id: IdForExeTests::vault_b_id(), + liquidity_pool_id: IdForExeTests::token_lp_definition_id(), + liquidity_pool_supply: BalanceForExeTests::token_lp_supply_add(), + reserve_a: BalanceForExeTests::vault_a_balance_add(), + reserve_b: BalanceForExeTests::vault_b_balance_add(), + fees: 0u128, + active: true, + }), + nonce: 0, + } + } + + fn user_token_a_holding_add() -> Account { + Account { + program_owner: Program::token().id(), + balance: 0u128, + data: Data::from(&TokenHolding::Fungible { + definition_id: IdForExeTests::token_a_definition_id(), + balance: BalanceForExeTests::user_token_a_holding_add(), + }), + nonce: 1, + } + } + + fn user_token_b_holding_add() -> Account { + Account { + program_owner: Program::token().id(), + balance: 0u128, + data: Data::from(&TokenHolding::Fungible { + definition_id: IdForExeTests::token_b_definition_id(), + balance: BalanceForExeTests::user_token_b_holding_add(), + }), + nonce: 1, + } + } + + fn user_token_lp_holding_add() -> Account { + Account { + program_owner: Program::token().id(), + balance: 0u128, + data: Data::from(&TokenHolding::Fungible { + definition_id: IdForExeTests::token_lp_definition_id(), + balance: BalanceForExeTests::user_token_lp_holding_add(), + }), + nonce: 0, + } + } + + fn token_lp_definition_add() -> Account { + Account { + program_owner: Program::token().id(), + balance: 0u128, + data: Data::from(&TokenDefinition::Fungible { + name: String::from("LP Token"), + total_supply: BalanceForExeTests::token_lp_supply_add(), + metadata_id: None, + }), + nonce: 0, + } + } + + fn vault_a_remove() -> Account { + Account { + program_owner: Program::token().id(), + balance: 0u128, + data: Data::from(&TokenHolding::Fungible { + definition_id: IdForExeTests::token_a_definition_id(), + balance: BalanceForExeTests::vault_a_balance_remove(), + }), + nonce: 0, + } + } + + fn vault_b_remove() -> Account { + Account { + program_owner: Program::token().id(), + balance: 0u128, + data: Data::from(&TokenHolding::Fungible { + definition_id: IdForExeTests::token_b_definition_id(), + balance: BalanceForExeTests::vault_b_balance_remove(), + }), + nonce: 0, + } + } + + fn pool_definition_remove() -> Account { + Account { + program_owner: Program::amm().id(), + balance: 0u128, + data: Data::from(&PoolDefinition { + definition_token_a_id: IdForExeTests::token_a_definition_id(), + definition_token_b_id: IdForExeTests::token_b_definition_id(), + vault_a_id: IdForExeTests::vault_a_id(), + vault_b_id: IdForExeTests::vault_b_id(), + liquidity_pool_id: IdForExeTests::token_lp_definition_id(), + liquidity_pool_supply: BalanceForExeTests::token_lp_supply_remove(), + reserve_a: BalanceForExeTests::vault_a_balance_remove(), + reserve_b: BalanceForExeTests::vault_b_balance_remove(), + fees: 0u128, + active: true, + }), + nonce: 0, + } + } + + fn user_token_a_holding_remove() -> Account { + Account { + program_owner: Program::token().id(), + balance: 0u128, + data: Data::from(&TokenHolding::Fungible { + definition_id: IdForExeTests::token_a_definition_id(), + balance: BalanceForExeTests::user_token_a_holding_remove(), + }), + nonce: 0, + } + } + + fn user_token_b_holding_remove() -> Account { + Account { + program_owner: Program::token().id(), + balance: 0u128, + data: Data::from(&TokenHolding::Fungible { + definition_id: IdForExeTests::token_b_definition_id(), + balance: BalanceForExeTests::user_token_b_holding_remove(), + }), + nonce: 0, + } + } + + fn user_token_lp_holding_remove() -> Account { + Account { + program_owner: Program::token().id(), + balance: 0u128, + data: Data::from(&TokenHolding::Fungible { + definition_id: IdForExeTests::token_lp_definition_id(), + balance: BalanceForExeTests::user_token_lp_holding_remove(), + }), + nonce: 1, + } + } + + fn token_lp_definition_remove() -> Account { + Account { + program_owner: Program::token().id(), + balance: 0u128, + data: Data::from(&TokenDefinition::Fungible { + name: String::from("LP Token"), + total_supply: BalanceForExeTests::token_lp_supply_remove(), + metadata_id: None, + }), + nonce: 0, + } + } + + fn token_lp_definition_init_inactive() -> Account { + Account { + program_owner: Program::token().id(), + balance: 0u128, + data: Data::from(&TokenDefinition::Fungible { + name: String::from("LP Token"), + total_supply: 0, + metadata_id: None, + }), + nonce: 0, + } + } + + fn vault_a_init_inactive() -> Account { + Account { + program_owner: Program::token().id(), + balance: 0u128, + data: Data::from(&TokenHolding::Fungible { + definition_id: IdForExeTests::token_a_definition_id(), + balance: 0, + }), + nonce: 0, + } + } + + fn vault_b_init_inactive() -> Account { + Account { + program_owner: Program::token().id(), + balance: 0u128, + data: Data::from(&TokenHolding::Fungible { + definition_id: IdForExeTests::token_b_definition_id(), + balance: 0, + }), + nonce: 0, + } + } + + fn pool_definition_inactive() -> Account { + Account { + program_owner: Program::amm().id(), + balance: 0u128, + data: Data::from(&PoolDefinition { + definition_token_a_id: IdForExeTests::token_a_definition_id(), + definition_token_b_id: IdForExeTests::token_b_definition_id(), + vault_a_id: IdForExeTests::vault_a_id(), + vault_b_id: IdForExeTests::vault_b_id(), + liquidity_pool_id: IdForExeTests::token_lp_definition_id(), + liquidity_pool_supply: 0, + reserve_a: 0, + reserve_b: 0, + fees: 0u128, + active: false, + }), + nonce: 0, + } + } + + fn user_token_a_holding_new_init() -> Account { + Account { + program_owner: Program::token().id(), + balance: 0u128, + data: Data::from(&TokenHolding::Fungible { + definition_id: IdForExeTests::token_a_definition_id(), + balance: BalanceForExeTests::user_token_a_holding_new_definition(), + }), + nonce: 1, + } + } + + fn user_token_b_holding_new_init() -> Account { + Account { + program_owner: Program::token().id(), + balance: 0u128, + data: Data::from(&TokenHolding::Fungible { + definition_id: IdForExeTests::token_b_definition_id(), + balance: BalanceForExeTests::user_token_b_holding_new_definition(), + }), + nonce: 1, + } + } + + fn user_token_lp_holding_new_init() -> Account { + Account { + program_owner: Program::token().id(), + balance: 0u128, + data: Data::from(&TokenHolding::Fungible { + definition_id: IdForExeTests::token_lp_definition_id(), + balance: BalanceForExeTests::lp_supply_init(), + }), + nonce: 0, + } + } + + fn token_lp_definition_new_init() -> Account { + Account { + program_owner: Program::token().id(), + balance: 0u128, + data: Data::from(&TokenDefinition::Fungible { + name: String::from("LP Token"), + total_supply: BalanceForExeTests::lp_supply_init(), + metadata_id: None, + }), + nonce: 0, + } + } + + fn pool_definition_new_init() -> Account { + Account { + program_owner: Program::amm().id(), + balance: 0u128, + data: Data::from(&PoolDefinition { + definition_token_a_id: IdForExeTests::token_a_definition_id(), + definition_token_b_id: IdForExeTests::token_b_definition_id(), + vault_a_id: IdForExeTests::vault_a_id(), + vault_b_id: IdForExeTests::vault_b_id(), + liquidity_pool_id: IdForExeTests::token_lp_definition_id(), + liquidity_pool_supply: BalanceForExeTests::lp_supply_init(), + reserve_a: BalanceForExeTests::vault_a_balance_init(), + reserve_b: BalanceForExeTests::vault_b_balance_init(), + fees: 0u128, + active: true, + }), + nonce: 0, + } + } + + fn user_token_lp_holding_init_zero() -> Account { + Account { + program_owner: Program::token().id(), + balance: 0u128, + data: Data::from(&TokenHolding::Fungible { + definition_id: IdForExeTests::token_lp_definition_id(), + balance: 0, + }), + nonce: 0, + } + } +} + #[test] fn test_pool_pda_produces_unique_id_for_token_pair() { assert!( @@ -994,13 +1834,13 @@ fn test_pool_pda_produces_unique_id_for_token_pair() { #[test] fn test_call_add_liquidity_vault_a_omitted() { let _post_states = add_liquidity( - AccountForTests::pool_definition_init(), - AccountForTests::vault_a_with_wrong_id(), - AccountForTests::vault_b_init(), - AccountForTests::pool_lp_init(), - AccountForTests::user_holding_a(), - AccountForTests::user_holding_b(), - AccountForTests::user_holding_lp_init(), + AccountWithMetadataForTests::pool_definition_init(), + AccountWithMetadataForTests::vault_a_with_wrong_id(), + AccountWithMetadataForTests::vault_b_init(), + AccountWithMetadataForTests::pool_lp_init(), + AccountWithMetadataForTests::user_holding_a(), + AccountWithMetadataForTests::user_holding_b(), + AccountWithMetadataForTests::user_holding_lp_init(), NonZero::new(BalanceForTests::add_min_amount_lp()).unwrap(), BalanceForTests::add_max_amount_a(), BalanceForTests::add_max_amount_b(), @@ -1011,13 +1851,13 @@ fn test_call_add_liquidity_vault_a_omitted() { #[test] fn test_call_add_liquidity_vault_b_omitted() { let _post_states = add_liquidity( - AccountForTests::pool_definition_init(), - AccountForTests::vault_a_init(), - AccountForTests::vault_b_with_wrong_id(), - AccountForTests::pool_lp_init(), - AccountForTests::user_holding_a(), - AccountForTests::user_holding_b(), - AccountForTests::user_holding_lp_init(), + AccountWithMetadataForTests::pool_definition_init(), + AccountWithMetadataForTests::vault_a_init(), + AccountWithMetadataForTests::vault_b_with_wrong_id(), + AccountWithMetadataForTests::pool_lp_init(), + AccountWithMetadataForTests::user_holding_a(), + AccountWithMetadataForTests::user_holding_b(), + AccountWithMetadataForTests::user_holding_lp_init(), NonZero::new(BalanceForTests::add_min_amount_lp()).unwrap(), BalanceForTests::add_max_amount_a(), BalanceForTests::add_max_amount_b(), @@ -1028,13 +1868,13 @@ fn test_call_add_liquidity_vault_b_omitted() { #[test] fn test_call_add_liquidity_lp_definition_mismatch() { let _post_states = add_liquidity( - AccountForTests::pool_definition_init(), - AccountForTests::vault_a_init(), - AccountForTests::vault_b_init(), - AccountForTests::pool_lp_with_wrong_id(), - AccountForTests::user_holding_a(), - AccountForTests::user_holding_b(), - AccountForTests::user_holding_lp_init(), + AccountWithMetadataForTests::pool_definition_init(), + AccountWithMetadataForTests::vault_a_init(), + AccountWithMetadataForTests::vault_b_init(), + AccountWithMetadataForTests::pool_lp_with_wrong_id(), + AccountWithMetadataForTests::user_holding_a(), + AccountWithMetadataForTests::user_holding_b(), + AccountWithMetadataForTests::user_holding_lp_init(), NonZero::new(BalanceForTests::add_min_amount_lp()).unwrap(), BalanceForTests::add_max_amount_a(), BalanceForTests::add_max_amount_b(), @@ -1045,13 +1885,13 @@ fn test_call_add_liquidity_lp_definition_mismatch() { #[test] fn test_call_add_liquidity_zero_balance_1() { let _post_states = add_liquidity( - AccountForTests::pool_definition_init(), - AccountForTests::vault_a_init(), - AccountForTests::vault_b_init(), - AccountForTests::pool_lp_init(), - AccountForTests::user_holding_a(), - AccountForTests::user_holding_b(), - AccountForTests::user_holding_lp_init(), + AccountWithMetadataForTests::pool_definition_init(), + AccountWithMetadataForTests::vault_a_init(), + AccountWithMetadataForTests::vault_b_init(), + AccountWithMetadataForTests::pool_lp_init(), + AccountWithMetadataForTests::user_holding_a(), + AccountWithMetadataForTests::user_holding_b(), + AccountWithMetadataForTests::user_holding_lp_init(), NonZero::new(BalanceForTests::add_min_amount_lp()).unwrap(), 0, BalanceForTests::add_max_amount_b(), @@ -1062,13 +1902,13 @@ fn test_call_add_liquidity_zero_balance_1() { #[test] fn test_call_add_liquidity_zero_balance_2() { let _post_states = add_liquidity( - AccountForTests::pool_definition_init(), - AccountForTests::vault_a_init(), - AccountForTests::vault_b_init(), - AccountForTests::pool_lp_init(), - AccountForTests::user_holding_a(), - AccountForTests::user_holding_b(), - AccountForTests::user_holding_lp_init(), + AccountWithMetadataForTests::pool_definition_init(), + AccountWithMetadataForTests::vault_a_init(), + AccountWithMetadataForTests::vault_b_init(), + AccountWithMetadataForTests::pool_lp_init(), + AccountWithMetadataForTests::user_holding_a(), + AccountWithMetadataForTests::user_holding_b(), + AccountWithMetadataForTests::user_holding_lp_init(), NonZero::new(BalanceForTests::add_min_amount_lp()).unwrap(), 0, BalanceForTests::add_max_amount_a(), @@ -1079,13 +1919,13 @@ fn test_call_add_liquidity_zero_balance_2() { #[test] fn test_call_add_liquidity_vault_insufficient_balance_1() { let _post_states = add_liquidity( - AccountForTests::pool_definition_init(), - AccountForTests::vault_a_init_zero(), - AccountForTests::vault_b_init(), - AccountForTests::pool_lp_init(), - AccountForTests::user_holding_a(), - AccountForTests::user_holding_b(), - AccountForTests::user_holding_lp_init(), + AccountWithMetadataForTests::pool_definition_init(), + AccountWithMetadataForTests::vault_a_init_zero(), + AccountWithMetadataForTests::vault_b_init(), + AccountWithMetadataForTests::pool_lp_init(), + AccountWithMetadataForTests::user_holding_a(), + AccountWithMetadataForTests::user_holding_b(), + AccountWithMetadataForTests::user_holding_lp_init(), NonZero::new(BalanceForTests::add_max_amount_a()).unwrap(), BalanceForTests::add_max_amount_b(), BalanceForTests::add_min_amount_lp(), @@ -1096,13 +1936,13 @@ fn test_call_add_liquidity_vault_insufficient_balance_1() { #[test] fn test_call_add_liquidity_vault_insufficient_balance_2() { let _post_states = add_liquidity( - AccountForTests::pool_definition_init(), - AccountForTests::vault_a_init(), - AccountForTests::vault_b_init_zero(), - AccountForTests::pool_lp_init(), - AccountForTests::user_holding_a(), - AccountForTests::user_holding_b(), - AccountForTests::user_holding_lp_init(), + AccountWithMetadataForTests::pool_definition_init(), + AccountWithMetadataForTests::vault_a_init(), + AccountWithMetadataForTests::vault_b_init_zero(), + AccountWithMetadataForTests::pool_lp_init(), + AccountWithMetadataForTests::user_holding_a(), + AccountWithMetadataForTests::user_holding_b(), + AccountWithMetadataForTests::user_holding_lp_init(), NonZero::new(BalanceForTests::add_max_amount_a()).unwrap(), BalanceForTests::add_max_amount_b(), BalanceForTests::add_min_amount_lp(), @@ -1113,13 +1953,13 @@ fn test_call_add_liquidity_vault_insufficient_balance_2() { #[test] fn test_call_add_liquidity_actual_amount_zero_1() { let _post_states = add_liquidity( - AccountForTests::pool_definition_init_reserve_a_low(), - AccountForTests::vault_a_init_low(), - AccountForTests::vault_b_init_high(), - AccountForTests::pool_lp_init(), - AccountForTests::user_holding_a(), - AccountForTests::user_holding_b(), - AccountForTests::user_holding_lp_init(), + AccountWithMetadataForTests::pool_definition_init_reserve_a_low(), + AccountWithMetadataForTests::vault_a_init_low(), + AccountWithMetadataForTests::vault_b_init_high(), + AccountWithMetadataForTests::pool_lp_init(), + AccountWithMetadataForTests::user_holding_a(), + AccountWithMetadataForTests::user_holding_b(), + AccountWithMetadataForTests::user_holding_lp_init(), NonZero::new(BalanceForTests::add_min_amount_lp()).unwrap(), BalanceForTests::add_max_amount_a(), BalanceForTests::add_max_amount_b(), @@ -1130,13 +1970,13 @@ fn test_call_add_liquidity_actual_amount_zero_1() { #[test] fn test_call_add_liquidity_actual_amount_zero_2() { let _post_states = add_liquidity( - AccountForTests::pool_definition_init_reserve_b_low(), - AccountForTests::vault_a_init_high(), - AccountForTests::vault_b_init_low(), - AccountForTests::pool_lp_init(), - AccountForTests::user_holding_a(), - AccountForTests::user_holding_b(), - AccountForTests::user_holding_lp_init(), + AccountWithMetadataForTests::pool_definition_init_reserve_b_low(), + AccountWithMetadataForTests::vault_a_init_high(), + AccountWithMetadataForTests::vault_b_init_low(), + AccountWithMetadataForTests::pool_lp_init(), + AccountWithMetadataForTests::user_holding_a(), + AccountWithMetadataForTests::user_holding_b(), + AccountWithMetadataForTests::user_holding_lp_init(), NonZero::new(BalanceForTests::add_min_amount_lp()).unwrap(), BalanceForTests::add_max_amount_a_low(), BalanceForTests::add_max_amount_b_low(), @@ -1147,13 +1987,13 @@ fn test_call_add_liquidity_actual_amount_zero_2() { #[test] fn test_call_add_liquidity_reserves_zero_1() { let _post_states = add_liquidity( - AccountForTests::pool_definition_init_reserve_a_zero(), - AccountForTests::vault_a_init(), - AccountForTests::vault_b_init(), - AccountForTests::pool_lp_init(), - AccountForTests::user_holding_a(), - AccountForTests::user_holding_b(), - AccountForTests::user_holding_lp_init(), + AccountWithMetadataForTests::pool_definition_init_reserve_a_zero(), + AccountWithMetadataForTests::vault_a_init(), + AccountWithMetadataForTests::vault_b_init(), + AccountWithMetadataForTests::pool_lp_init(), + AccountWithMetadataForTests::user_holding_a(), + AccountWithMetadataForTests::user_holding_b(), + AccountWithMetadataForTests::user_holding_lp_init(), NonZero::new(BalanceForTests::add_min_amount_lp()).unwrap(), BalanceForTests::add_max_amount_a(), BalanceForTests::add_max_amount_b(), @@ -1164,13 +2004,13 @@ fn test_call_add_liquidity_reserves_zero_1() { #[test] fn test_call_add_liquidity_reserves_zero_2() { let _post_states = add_liquidity( - AccountForTests::pool_definition_init_reserve_b_zero(), - AccountForTests::vault_a_init(), - AccountForTests::vault_b_init(), - AccountForTests::pool_lp_init(), - AccountForTests::user_holding_a(), - AccountForTests::user_holding_b(), - AccountForTests::user_holding_lp_init(), + AccountWithMetadataForTests::pool_definition_init_reserve_b_zero(), + AccountWithMetadataForTests::vault_a_init(), + AccountWithMetadataForTests::vault_b_init(), + AccountWithMetadataForTests::pool_lp_init(), + AccountWithMetadataForTests::user_holding_a(), + AccountWithMetadataForTests::user_holding_b(), + AccountWithMetadataForTests::user_holding_lp_init(), NonZero::new(BalanceForTests::add_min_amount_lp()).unwrap(), BalanceForTests::add_max_amount_a(), BalanceForTests::add_max_amount_b(), @@ -1181,13 +2021,13 @@ fn test_call_add_liquidity_reserves_zero_2() { #[test] fn test_call_add_liquidity_payable_lp_zero() { let _post_states = add_liquidity( - AccountForTests::pool_definition_add_zero_lp(), - AccountForTests::vault_a_init(), - AccountForTests::vault_b_init(), - AccountForTests::pool_lp_init(), - AccountForTests::user_holding_a(), - AccountForTests::user_holding_b(), - AccountForTests::user_holding_lp_init(), + AccountWithMetadataForTests::pool_definition_add_zero_lp(), + AccountWithMetadataForTests::vault_a_init(), + AccountWithMetadataForTests::vault_b_init(), + AccountWithMetadataForTests::pool_lp_init(), + AccountWithMetadataForTests::user_holding_a(), + AccountWithMetadataForTests::user_holding_b(), + AccountWithMetadataForTests::user_holding_lp_init(), NonZero::new(BalanceForTests::add_min_amount_lp()).unwrap(), BalanceForTests::add_max_amount_a_low(), BalanceForTests::add_max_amount_b_low(), @@ -1197,13 +2037,13 @@ fn test_call_add_liquidity_payable_lp_zero() { #[test] fn test_call_add_liquidity_chained_call_successsful() { let (post_states, chained_calls) = add_liquidity( - AccountForTests::pool_definition_init(), - AccountForTests::vault_a_init(), - AccountForTests::vault_b_init(), - AccountForTests::pool_lp_init(), - AccountForTests::user_holding_a(), - AccountForTests::user_holding_b(), - AccountForTests::user_holding_lp_init(), + AccountWithMetadataForTests::pool_definition_init(), + AccountWithMetadataForTests::vault_a_init(), + AccountWithMetadataForTests::vault_b_init(), + AccountWithMetadataForTests::pool_lp_init(), + AccountWithMetadataForTests::user_holding_a(), + AccountWithMetadataForTests::user_holding_b(), + AccountWithMetadataForTests::user_holding_lp_init(), NonZero::new(BalanceForTests::add_min_amount_lp()).unwrap(), BalanceForTests::add_max_amount_a(), BalanceForTests::add_max_amount_b(), @@ -1211,7 +2051,10 @@ fn test_call_add_liquidity_chained_call_successsful() { let pool_post = post_states[0].clone(); - assert!(AccountForTests::pool_definition_add_successful().account == *pool_post.account()); + assert!( + AccountWithMetadataForTests::pool_definition_add_successful().account + == *pool_post.account() + ); let chained_call_lp = chained_calls[0].clone(); let chained_call_b = chained_calls[1].clone(); @@ -1226,13 +2069,13 @@ fn test_call_add_liquidity_chained_call_successsful() { #[test] fn test_call_remove_liquidity_vault_a_omitted() { let _post_states = remove_liquidity( - AccountForTests::pool_definition_init(), - AccountForTests::vault_a_with_wrong_id(), - AccountForTests::vault_b_init(), - AccountForTests::pool_lp_init(), - AccountForTests::user_holding_a(), - AccountForTests::user_holding_b(), - AccountForTests::user_holding_lp_init(), + AccountWithMetadataForTests::pool_definition_init(), + AccountWithMetadataForTests::vault_a_with_wrong_id(), + AccountWithMetadataForTests::vault_b_init(), + AccountWithMetadataForTests::pool_lp_init(), + AccountWithMetadataForTests::user_holding_a(), + AccountWithMetadataForTests::user_holding_b(), + AccountWithMetadataForTests::user_holding_lp_init(), NonZero::new(BalanceForTests::remove_amount_lp()).unwrap(), BalanceForTests::remove_min_amount_a(), BalanceForTests::remove_min_amount_b(), @@ -1243,13 +2086,13 @@ fn test_call_remove_liquidity_vault_a_omitted() { #[test] fn test_call_remove_liquidity_vault_b_omitted() { let _post_states = remove_liquidity( - AccountForTests::pool_definition_init(), - AccountForTests::vault_a_init(), - AccountForTests::vault_b_with_wrong_id(), - AccountForTests::pool_lp_init(), - AccountForTests::user_holding_a(), - AccountForTests::user_holding_b(), - AccountForTests::user_holding_lp_init(), + AccountWithMetadataForTests::pool_definition_init(), + AccountWithMetadataForTests::vault_a_init(), + AccountWithMetadataForTests::vault_b_with_wrong_id(), + AccountWithMetadataForTests::pool_lp_init(), + AccountWithMetadataForTests::user_holding_a(), + AccountWithMetadataForTests::user_holding_b(), + AccountWithMetadataForTests::user_holding_lp_init(), NonZero::new(BalanceForTests::remove_amount_lp()).unwrap(), BalanceForTests::remove_min_amount_a(), BalanceForTests::remove_min_amount_b(), @@ -1260,13 +2103,13 @@ fn test_call_remove_liquidity_vault_b_omitted() { #[test] fn test_call_remove_liquidity_lp_def_mismatch() { let _post_states = remove_liquidity( - AccountForTests::pool_definition_init(), - AccountForTests::vault_a_init(), - AccountForTests::vault_b_init(), - AccountForTests::pool_lp_with_wrong_id(), - AccountForTests::user_holding_a(), - AccountForTests::user_holding_b(), - AccountForTests::user_holding_lp_init(), + AccountWithMetadataForTests::pool_definition_init(), + AccountWithMetadataForTests::vault_a_init(), + AccountWithMetadataForTests::vault_b_init(), + AccountWithMetadataForTests::pool_lp_with_wrong_id(), + AccountWithMetadataForTests::user_holding_a(), + AccountWithMetadataForTests::user_holding_b(), + AccountWithMetadataForTests::user_holding_lp_init(), NonZero::new(BalanceForTests::remove_amount_lp()).unwrap(), BalanceForTests::remove_min_amount_a(), BalanceForTests::remove_min_amount_b(), @@ -1277,14 +2120,15 @@ fn test_call_remove_liquidity_lp_def_mismatch() { #[test] fn test_call_remove_liquidity_insufficient_liquidity_amount() { let _post_states = remove_liquidity( - AccountForTests::pool_definition_init(), - AccountForTests::vault_a_init(), - AccountForTests::vault_b_init(), - AccountForTests::pool_lp_init(), - AccountForTests::user_holding_a(), - AccountForTests::user_holding_b(), - AccountForTests::user_holding_a(), /* different token account than lp to create desired - * error */ + AccountWithMetadataForTests::pool_definition_init(), + AccountWithMetadataForTests::vault_a_init(), + AccountWithMetadataForTests::vault_b_init(), + AccountWithMetadataForTests::pool_lp_init(), + AccountWithMetadataForTests::user_holding_a(), + AccountWithMetadataForTests::user_holding_b(), + AccountWithMetadataForTests::user_holding_a(), /* different token account than lp to + * create desired + * error */ NonZero::new(BalanceForTests::remove_amount_lp()).unwrap(), BalanceForTests::remove_min_amount_a(), BalanceForTests::remove_min_amount_b(), @@ -1297,13 +2141,13 @@ fn test_call_remove_liquidity_insufficient_liquidity_amount() { #[test] fn test_call_remove_liquidity_insufficient_balance_1() { let _post_states = remove_liquidity( - AccountForTests::pool_definition_init(), - AccountForTests::vault_a_init(), - AccountForTests::vault_b_init(), - AccountForTests::pool_lp_init(), - AccountForTests::user_holding_a(), - AccountForTests::user_holding_b(), - AccountForTests::user_holding_lp_init(), + AccountWithMetadataForTests::pool_definition_init(), + AccountWithMetadataForTests::vault_a_init(), + AccountWithMetadataForTests::vault_b_init(), + AccountWithMetadataForTests::pool_lp_init(), + AccountWithMetadataForTests::user_holding_a(), + AccountWithMetadataForTests::user_holding_b(), + AccountWithMetadataForTests::user_holding_lp_init(), NonZero::new(BalanceForTests::remove_amount_lp_1()).unwrap(), BalanceForTests::remove_min_amount_a(), BalanceForTests::remove_min_amount_b(), @@ -1316,13 +2160,13 @@ fn test_call_remove_liquidity_insufficient_balance_1() { #[test] fn test_call_remove_liquidity_insufficient_balance_2() { let _post_states = remove_liquidity( - AccountForTests::pool_definition_init(), - AccountForTests::vault_a_init(), - AccountForTests::vault_b_init(), - AccountForTests::pool_lp_init(), - AccountForTests::user_holding_a(), - AccountForTests::user_holding_b(), - AccountForTests::user_holding_lp_init(), + AccountWithMetadataForTests::pool_definition_init(), + AccountWithMetadataForTests::vault_a_init(), + AccountWithMetadataForTests::vault_b_init(), + AccountWithMetadataForTests::pool_lp_init(), + AccountWithMetadataForTests::user_holding_a(), + AccountWithMetadataForTests::user_holding_b(), + AccountWithMetadataForTests::user_holding_lp_init(), NonZero::new(BalanceForTests::remove_amount_lp()).unwrap(), BalanceForTests::remove_min_amount_a(), BalanceForTests::remove_min_amount_b(), @@ -1333,13 +2177,13 @@ fn test_call_remove_liquidity_insufficient_balance_2() { #[test] fn test_call_remove_liquidity_min_bal_zero_1() { let _post_states = remove_liquidity( - AccountForTests::pool_definition_init(), - AccountForTests::vault_a_init(), - AccountForTests::vault_b_init(), - AccountForTests::pool_lp_init(), - AccountForTests::user_holding_a(), - AccountForTests::user_holding_b(), - AccountForTests::user_holding_lp_init(), + AccountWithMetadataForTests::pool_definition_init(), + AccountWithMetadataForTests::vault_a_init(), + AccountWithMetadataForTests::vault_b_init(), + AccountWithMetadataForTests::pool_lp_init(), + AccountWithMetadataForTests::user_holding_a(), + AccountWithMetadataForTests::user_holding_b(), + AccountWithMetadataForTests::user_holding_lp_init(), NonZero::new(BalanceForTests::remove_amount_lp()).unwrap(), 0, BalanceForTests::remove_min_amount_b(), @@ -1350,13 +2194,13 @@ fn test_call_remove_liquidity_min_bal_zero_1() { #[test] fn test_call_remove_liquidity_min_bal_zero_2() { let _post_states = remove_liquidity( - AccountForTests::pool_definition_init(), - AccountForTests::vault_a_init(), - AccountForTests::vault_b_init(), - AccountForTests::pool_lp_init(), - AccountForTests::user_holding_a(), - AccountForTests::user_holding_b(), - AccountForTests::user_holding_lp_init(), + AccountWithMetadataForTests::pool_definition_init(), + AccountWithMetadataForTests::vault_a_init(), + AccountWithMetadataForTests::vault_b_init(), + AccountWithMetadataForTests::pool_lp_init(), + AccountWithMetadataForTests::user_holding_a(), + AccountWithMetadataForTests::user_holding_b(), + AccountWithMetadataForTests::user_holding_lp_init(), NonZero::new(BalanceForTests::remove_amount_lp()).unwrap(), BalanceForTests::remove_min_amount_a(), 0, @@ -1366,13 +2210,13 @@ fn test_call_remove_liquidity_min_bal_zero_2() { #[test] fn test_call_remove_liquidity_chained_call_successful() { let (post_states, chained_calls) = remove_liquidity( - AccountForTests::pool_definition_init(), - AccountForTests::vault_a_init(), - AccountForTests::vault_b_init(), - AccountForTests::pool_lp_init(), - AccountForTests::user_holding_a(), - AccountForTests::user_holding_b(), - AccountForTests::user_holding_lp_init(), + AccountWithMetadataForTests::pool_definition_init(), + AccountWithMetadataForTests::vault_a_init(), + AccountWithMetadataForTests::vault_b_init(), + AccountWithMetadataForTests::pool_lp_init(), + AccountWithMetadataForTests::user_holding_a(), + AccountWithMetadataForTests::user_holding_b(), + AccountWithMetadataForTests::user_holding_lp_init(), NonZero::new(BalanceForTests::remove_amount_lp()).unwrap(), BalanceForTests::remove_min_amount_a(), BalanceForTests::remove_min_amount_b_low(), @@ -1380,7 +2224,10 @@ fn test_call_remove_liquidity_chained_call_successful() { let pool_post = post_states[0].clone(); - assert!(AccountForTests::pool_definition_remove_successful().account == *pool_post.account()); + assert!( + AccountWithMetadataForTests::pool_definition_remove_successful().account + == *pool_post.account() + ); let chained_call_lp = chained_calls[0].clone(); let chained_call_b = chained_calls[1].clone(); @@ -1395,13 +2242,13 @@ fn test_call_remove_liquidity_chained_call_successful() { #[test] fn test_call_new_definition_with_zero_balance_1() { let _post_states = new_definition( - AccountForTests::pool_definition_init(), - AccountForTests::vault_a_init(), - AccountForTests::vault_b_init(), - AccountForTests::pool_lp_init(), - AccountForTests::user_holding_a(), - AccountForTests::user_holding_b(), - AccountForTests::user_holding_lp_uninit(), + AccountWithMetadataForTests::pool_definition_init(), + AccountWithMetadataForTests::vault_a_init(), + AccountWithMetadataForTests::vault_b_init(), + AccountWithMetadataForTests::pool_lp_init(), + AccountWithMetadataForTests::user_holding_a(), + AccountWithMetadataForTests::user_holding_b(), + AccountWithMetadataForTests::user_holding_lp_uninit(), NonZero::new(0).expect("Balances must be nonzero"), NonZero::new(BalanceForTests::vault_b_reserve_init()).unwrap(), AMM_PROGRAM_ID, @@ -1412,13 +2259,13 @@ fn test_call_new_definition_with_zero_balance_1() { #[test] fn test_call_new_definition_with_zero_balance_2() { let _post_states = new_definition( - AccountForTests::pool_definition_init(), - AccountForTests::vault_a_init(), - AccountForTests::vault_b_init(), - AccountForTests::pool_lp_init(), - AccountForTests::user_holding_a(), - AccountForTests::user_holding_b(), - AccountForTests::user_holding_lp_uninit(), + AccountWithMetadataForTests::pool_definition_init(), + AccountWithMetadataForTests::vault_a_init(), + AccountWithMetadataForTests::vault_b_init(), + AccountWithMetadataForTests::pool_lp_init(), + AccountWithMetadataForTests::user_holding_a(), + AccountWithMetadataForTests::user_holding_b(), + AccountWithMetadataForTests::user_holding_lp_uninit(), NonZero::new(BalanceForTests::vault_a_reserve_init()).unwrap(), NonZero::new(0).expect("Balances must be nonzero"), AMM_PROGRAM_ID, @@ -1429,13 +2276,13 @@ fn test_call_new_definition_with_zero_balance_2() { #[test] fn test_call_new_definition_same_token_definition() { let _post_states = new_definition( - AccountForTests::pool_definition_init(), - AccountForTests::vault_a_init(), - AccountForTests::vault_b_init(), - AccountForTests::pool_lp_init(), - AccountForTests::user_holding_a(), - AccountForTests::user_holding_a(), - AccountForTests::user_holding_lp_uninit(), + AccountWithMetadataForTests::pool_definition_init(), + AccountWithMetadataForTests::vault_a_init(), + AccountWithMetadataForTests::vault_b_init(), + AccountWithMetadataForTests::pool_lp_init(), + AccountWithMetadataForTests::user_holding_a(), + AccountWithMetadataForTests::user_holding_a(), + AccountWithMetadataForTests::user_holding_lp_uninit(), NonZero::new(BalanceForTests::vault_a_reserve_init()).unwrap(), NonZero::new(BalanceForTests::vault_b_reserve_init()).unwrap(), AMM_PROGRAM_ID, @@ -1446,13 +2293,13 @@ fn test_call_new_definition_same_token_definition() { #[test] fn test_call_new_definition_wrong_liquidity_id() { let _post_states = new_definition( - AccountForTests::pool_definition_init(), - AccountForTests::vault_a_init(), - AccountForTests::vault_b_init(), - AccountForTests::pool_lp_with_wrong_id(), - AccountForTests::user_holding_a(), - AccountForTests::user_holding_b(), - AccountForTests::user_holding_lp_uninit(), + AccountWithMetadataForTests::pool_definition_init(), + AccountWithMetadataForTests::vault_a_init(), + AccountWithMetadataForTests::vault_b_init(), + AccountWithMetadataForTests::pool_lp_with_wrong_id(), + AccountWithMetadataForTests::user_holding_a(), + AccountWithMetadataForTests::user_holding_b(), + AccountWithMetadataForTests::user_holding_lp_uninit(), NonZero::new(BalanceForTests::vault_a_reserve_init()).unwrap(), NonZero::new(BalanceForTests::vault_b_reserve_init()).unwrap(), AMM_PROGRAM_ID, @@ -1463,13 +2310,13 @@ fn test_call_new_definition_wrong_liquidity_id() { #[test] fn test_call_new_definition_wrong_pool_id() { let _post_states = new_definition( - AccountForTests::pool_definition_with_wrong_id(), - AccountForTests::vault_a_init(), - AccountForTests::vault_b_init(), - AccountForTests::pool_lp_init(), - AccountForTests::user_holding_a(), - AccountForTests::user_holding_b(), - AccountForTests::user_holding_lp_uninit(), + AccountWithMetadataForTests::pool_definition_with_wrong_id(), + AccountWithMetadataForTests::vault_a_init(), + AccountWithMetadataForTests::vault_b_init(), + AccountWithMetadataForTests::pool_lp_init(), + AccountWithMetadataForTests::user_holding_a(), + AccountWithMetadataForTests::user_holding_b(), + AccountWithMetadataForTests::user_holding_lp_uninit(), NonZero::new(BalanceForTests::vault_a_reserve_init()).unwrap(), NonZero::new(BalanceForTests::vault_b_reserve_init()).unwrap(), AMM_PROGRAM_ID, @@ -1480,13 +2327,13 @@ fn test_call_new_definition_wrong_pool_id() { #[test] fn test_call_new_definition_wrong_vault_id_1() { let _post_states = new_definition( - AccountForTests::pool_definition_init(), - AccountForTests::vault_a_with_wrong_id(), - AccountForTests::vault_b_init(), - AccountForTests::pool_lp_init(), - AccountForTests::user_holding_a(), - AccountForTests::user_holding_b(), - AccountForTests::user_holding_lp_uninit(), + AccountWithMetadataForTests::pool_definition_init(), + AccountWithMetadataForTests::vault_a_with_wrong_id(), + AccountWithMetadataForTests::vault_b_init(), + AccountWithMetadataForTests::pool_lp_init(), + AccountWithMetadataForTests::user_holding_a(), + AccountWithMetadataForTests::user_holding_b(), + AccountWithMetadataForTests::user_holding_lp_uninit(), NonZero::new(BalanceForTests::vault_a_reserve_init()).unwrap(), NonZero::new(BalanceForTests::vault_b_reserve_init()).unwrap(), AMM_PROGRAM_ID, @@ -1497,13 +2344,13 @@ fn test_call_new_definition_wrong_vault_id_1() { #[test] fn test_call_new_definition_wrong_vault_id_2() { let _post_states = new_definition( - AccountForTests::pool_definition_init(), - AccountForTests::vault_a_init(), - AccountForTests::vault_b_with_wrong_id(), - AccountForTests::pool_lp_init(), - AccountForTests::user_holding_a(), - AccountForTests::user_holding_b(), - AccountForTests::user_holding_lp_uninit(), + AccountWithMetadataForTests::pool_definition_init(), + AccountWithMetadataForTests::vault_a_init(), + AccountWithMetadataForTests::vault_b_with_wrong_id(), + AccountWithMetadataForTests::pool_lp_init(), + AccountWithMetadataForTests::user_holding_a(), + AccountWithMetadataForTests::user_holding_b(), + AccountWithMetadataForTests::user_holding_lp_uninit(), NonZero::new(BalanceForTests::vault_a_reserve_init()).unwrap(), NonZero::new(BalanceForTests::vault_b_reserve_init()).unwrap(), AMM_PROGRAM_ID, @@ -1514,13 +2361,13 @@ fn test_call_new_definition_wrong_vault_id_2() { #[test] fn test_call_new_definition_cannot_initialize_active_pool() { let _post_states = new_definition( - AccountForTests::pool_definition_active(), - AccountForTests::vault_a_init(), - AccountForTests::vault_b_init(), - AccountForTests::pool_lp_init(), - AccountForTests::user_holding_a(), - AccountForTests::user_holding_b(), - AccountForTests::user_holding_lp_uninit(), + AccountWithMetadataForTests::pool_definition_active(), + AccountWithMetadataForTests::vault_a_init(), + AccountWithMetadataForTests::vault_b_init(), + AccountWithMetadataForTests::pool_lp_init(), + AccountWithMetadataForTests::user_holding_a(), + AccountWithMetadataForTests::user_holding_b(), + AccountWithMetadataForTests::user_holding_lp_uninit(), NonZero::new(BalanceForTests::vault_a_reserve_init()).unwrap(), NonZero::new(BalanceForTests::vault_b_reserve_init()).unwrap(), AMM_PROGRAM_ID, @@ -1531,13 +2378,13 @@ fn test_call_new_definition_cannot_initialize_active_pool() { #[test] fn test_call_new_definition_chained_call_successful() { let (post_states, chained_calls) = new_definition( - AccountForTests::pool_definition_active(), - AccountForTests::vault_a_init(), - AccountForTests::vault_b_init(), - AccountForTests::pool_lp_init(), - AccountForTests::user_holding_a(), - AccountForTests::user_holding_b(), - AccountForTests::user_holding_lp_uninit(), + AccountWithMetadataForTests::pool_definition_active(), + AccountWithMetadataForTests::vault_a_init(), + AccountWithMetadataForTests::vault_b_init(), + AccountWithMetadataForTests::pool_lp_init(), + AccountWithMetadataForTests::user_holding_a(), + AccountWithMetadataForTests::user_holding_b(), + AccountWithMetadataForTests::user_holding_lp_uninit(), NonZero::new(BalanceForTests::vault_a_reserve_init()).unwrap(), NonZero::new(BalanceForTests::vault_b_reserve_init()).unwrap(), AMM_PROGRAM_ID, @@ -1545,7 +2392,10 @@ fn test_call_new_definition_chained_call_successful() { let pool_post = post_states[0].clone(); - assert!(AccountForTests::pool_definition_add_successful().account == *pool_post.account()); + assert!( + AccountWithMetadataForTests::pool_definition_add_successful().account + == *pool_post.account() + ); let chained_call_lp = chained_calls[0].clone(); let chained_call_b = chained_calls[1].clone(); @@ -1560,11 +2410,11 @@ fn test_call_new_definition_chained_call_successful() { #[test] fn test_call_swap_incorrect_token_type() { let _post_states = swap( - AccountForTests::pool_definition_init(), - AccountForTests::vault_a_init(), - AccountForTests::vault_b_init(), - AccountForTests::user_holding_a(), - AccountForTests::user_holding_b(), + AccountWithMetadataForTests::pool_definition_init(), + AccountWithMetadataForTests::vault_a_init(), + AccountWithMetadataForTests::vault_b_init(), + AccountWithMetadataForTests::user_holding_a(), + AccountWithMetadataForTests::user_holding_b(), BalanceForTests::add_max_amount_a(), BalanceForTests::min_amount_out(), IdForTests::token_lp_definition_id(), @@ -1575,11 +2425,11 @@ fn test_call_swap_incorrect_token_type() { #[test] fn test_call_swap_vault_a_omitted() { let _post_states = swap( - AccountForTests::pool_definition_init(), - AccountForTests::vault_a_with_wrong_id(), - AccountForTests::vault_b_init(), - AccountForTests::user_holding_a(), - AccountForTests::user_holding_b(), + AccountWithMetadataForTests::pool_definition_init(), + AccountWithMetadataForTests::vault_a_with_wrong_id(), + AccountWithMetadataForTests::vault_b_init(), + AccountWithMetadataForTests::user_holding_a(), + AccountWithMetadataForTests::user_holding_b(), BalanceForTests::add_max_amount_a(), BalanceForTests::min_amount_out(), IdForTests::token_a_definition_id(), @@ -1590,11 +2440,11 @@ fn test_call_swap_vault_a_omitted() { #[test] fn test_call_swap_vault_b_omitted() { let _post_states = swap( - AccountForTests::pool_definition_init(), - AccountForTests::vault_a_init(), - AccountForTests::vault_b_with_wrong_id(), - AccountForTests::user_holding_a(), - AccountForTests::user_holding_b(), + AccountWithMetadataForTests::pool_definition_init(), + AccountWithMetadataForTests::vault_a_init(), + AccountWithMetadataForTests::vault_b_with_wrong_id(), + AccountWithMetadataForTests::user_holding_a(), + AccountWithMetadataForTests::user_holding_b(), BalanceForTests::add_max_amount_a(), BalanceForTests::min_amount_out(), IdForTests::token_a_definition_id(), @@ -1605,11 +2455,11 @@ fn test_call_swap_vault_b_omitted() { #[test] fn test_call_swap_reserves_vault_mismatch_1() { let _post_states = swap( - AccountForTests::pool_definition_init(), - AccountForTests::vault_a_init_low(), - AccountForTests::vault_b_init(), - AccountForTests::user_holding_a(), - AccountForTests::user_holding_b(), + AccountWithMetadataForTests::pool_definition_init(), + AccountWithMetadataForTests::vault_a_init_low(), + AccountWithMetadataForTests::vault_b_init(), + AccountWithMetadataForTests::user_holding_a(), + AccountWithMetadataForTests::user_holding_b(), BalanceForTests::add_max_amount_a(), BalanceForTests::min_amount_out(), IdForTests::token_a_definition_id(), @@ -1620,11 +2470,11 @@ fn test_call_swap_reserves_vault_mismatch_1() { #[test] fn test_call_swap_reserves_vault_mismatch_2() { let _post_states = swap( - AccountForTests::pool_definition_init(), - AccountForTests::vault_a_init(), - AccountForTests::vault_b_init_low(), - AccountForTests::user_holding_a(), - AccountForTests::user_holding_b(), + AccountWithMetadataForTests::pool_definition_init(), + AccountWithMetadataForTests::vault_a_init(), + AccountWithMetadataForTests::vault_b_init_low(), + AccountWithMetadataForTests::user_holding_a(), + AccountWithMetadataForTests::user_holding_b(), BalanceForTests::add_max_amount_a(), BalanceForTests::min_amount_out(), IdForTests::token_a_definition_id(), @@ -1635,11 +2485,11 @@ fn test_call_swap_reserves_vault_mismatch_2() { #[test] fn test_call_swap_ianctive() { let _post_states = swap( - AccountForTests::pool_definition_inactive(), - AccountForTests::vault_a_init(), - AccountForTests::vault_b_init(), - AccountForTests::user_holding_a(), - AccountForTests::user_holding_b(), + AccountWithMetadataForTests::pool_definition_inactive(), + AccountWithMetadataForTests::vault_a_init(), + AccountWithMetadataForTests::vault_b_init(), + AccountWithMetadataForTests::user_holding_a(), + AccountWithMetadataForTests::user_holding_b(), BalanceForTests::add_max_amount_a(), BalanceForTests::min_amount_out(), IdForTests::token_a_definition_id(), @@ -1650,11 +2500,11 @@ fn test_call_swap_ianctive() { #[test] fn test_call_swap_below_min_out() { let _post_states = swap( - AccountForTests::pool_definition_init(), - AccountForTests::vault_a_init(), - AccountForTests::vault_b_init(), - AccountForTests::user_holding_a(), - AccountForTests::user_holding_b(), + AccountWithMetadataForTests::pool_definition_init(), + AccountWithMetadataForTests::vault_a_init(), + AccountWithMetadataForTests::vault_b_init(), + AccountWithMetadataForTests::user_holding_a(), + AccountWithMetadataForTests::user_holding_b(), BalanceForTests::add_max_amount_a(), BalanceForTests::min_amount_out(), IdForTests::token_a_definition_id(), @@ -1664,11 +2514,11 @@ fn test_call_swap_below_min_out() { #[test] fn test_call_swap_chained_call_successful_1() { let (post_states, chained_calls) = swap( - AccountForTests::pool_definition_init(), - AccountForTests::vault_a_init(), - AccountForTests::vault_b_init(), - AccountForTests::user_holding_a(), - AccountForTests::user_holding_b(), + AccountWithMetadataForTests::pool_definition_init(), + AccountWithMetadataForTests::vault_a_init(), + AccountWithMetadataForTests::vault_b_init(), + AccountWithMetadataForTests::user_holding_a(), + AccountWithMetadataForTests::user_holding_b(), BalanceForTests::add_max_amount_a(), BalanceForTests::add_max_amount_a_low(), IdForTests::token_a_definition_id(), @@ -1676,7 +2526,9 @@ fn test_call_swap_chained_call_successful_1() { let pool_post = post_states[0].clone(); - assert!(AccountForTests::pool_definition_swap_test_1().account == *pool_post.account()); + assert!( + AccountWithMetadataForTests::pool_definition_swap_test_1().account == *pool_post.account() + ); let chained_call_a = chained_calls[0].clone(); let chained_call_b = chained_calls[1].clone(); @@ -1694,11 +2546,11 @@ fn test_call_swap_chained_call_successful_1() { #[test] fn test_call_swap_chained_call_successful_2() { let (post_states, chained_calls) = swap( - AccountForTests::pool_definition_init(), - AccountForTests::vault_a_init(), - AccountForTests::vault_b_init(), - AccountForTests::user_holding_a(), - AccountForTests::user_holding_b(), + AccountWithMetadataForTests::pool_definition_init(), + AccountWithMetadataForTests::vault_a_init(), + AccountWithMetadataForTests::vault_b_init(), + AccountWithMetadataForTests::user_holding_a(), + AccountWithMetadataForTests::user_holding_b(), BalanceForTests::add_max_amount_b(), BalanceForTests::min_amount_out(), IdForTests::token_b_definition_id(), @@ -1706,7 +2558,9 @@ fn test_call_swap_chained_call_successful_2() { let pool_post = post_states[0].clone(); - assert!(AccountForTests::pool_definition_swap_test_2().account == *pool_post.account()); + assert!( + AccountWithMetadataForTests::pool_definition_swap_test_2().account == *pool_post.account() + ); let chained_call_a = chained_calls[1].clone(); let chained_call_b = chained_calls[0].clone(); @@ -1724,13 +2578,13 @@ fn test_call_swap_chained_call_successful_2() { #[test] fn test_new_definition_lp_asymmetric_amounts() { let (post_states, chained_calls) = new_definition( - AccountForTests::pool_definition_inactive(), - AccountForTests::vault_a_init(), - AccountForTests::vault_b_init(), - AccountForTests::pool_lp_init(), - AccountForTests::user_holding_a(), - AccountForTests::user_holding_b(), - AccountForTests::user_holding_lp_uninit(), + AccountWithMetadataForTests::pool_definition_inactive(), + AccountWithMetadataForTests::vault_a_init(), + AccountWithMetadataForTests::vault_b_init(), + AccountWithMetadataForTests::pool_lp_init(), + AccountWithMetadataForTests::user_holding_a(), + AccountWithMetadataForTests::user_holding_b(), + AccountWithMetadataForTests::user_holding_lp_uninit(), NonZero::new(BalanceForTests::vault_a_reserve_init()).unwrap(), NonZero::new(BalanceForTests::vault_b_reserve_init()).unwrap(), AMM_PROGRAM_ID, @@ -1757,13 +2611,13 @@ fn test_new_definition_lp_symmetric_amounts() { assert_eq!(expected_lp, 100); let (post_states, chained_calls) = new_definition( - AccountForTests::pool_definition_inactive(), - AccountForTests::vault_a_init(), - AccountForTests::vault_b_init(), - AccountForTests::pool_lp_init(), - AccountForTests::user_holding_a(), - AccountForTests::user_holding_b(), - AccountForTests::user_holding_lp_uninit(), + AccountWithMetadataForTests::pool_definition_inactive(), + AccountWithMetadataForTests::vault_a_init(), + AccountWithMetadataForTests::vault_b_init(), + AccountWithMetadataForTests::pool_lp_init(), + AccountWithMetadataForTests::user_holding_a(), + AccountWithMetadataForTests::user_holding_b(), + AccountWithMetadataForTests::user_holding_lp_uninit(), NonZero::new(token_a_amount).unwrap(), NonZero::new(token_b_amount).unwrap(), AMM_PROGRAM_ID, @@ -1777,8 +2631,8 @@ fn test_new_definition_lp_symmetric_amounts() { let expected_lp_call = ChainedCall::new( TOKEN_PROGRAM_ID, vec![ - AccountForTests::pool_lp_init(), - AccountForTests::user_holding_lp_uninit(), + AccountWithMetadataForTests::pool_lp_init(), + AccountWithMetadataForTests::user_holding_lp_uninit(), ], &token_core::Instruction::Mint { amount_to_mint: expected_lp, @@ -1790,3 +2644,535 @@ fn test_new_definition_lp_symmetric_amounts() { assert_eq!(chained_call_lp, expected_lp_call); } + +#[cfg(feature = "with-nssa")] +fn state_for_amm_tests() -> V02State { + let initial_data = []; + let mut state = V02State::new_with_genesis_accounts(&initial_data, &[]); + state.force_insert_account( + IdForExeTests::pool_definition_id(), + AccountsForExeTests::pool_definition_init(), + ); + state.force_insert_account( + IdForExeTests::token_a_definition_id(), + AccountsForExeTests::token_a_definition_account(), + ); + state.force_insert_account( + IdForExeTests::token_b_definition_id(), + AccountsForExeTests::token_b_definition_acc(), + ); + state.force_insert_account( + IdForExeTests::token_lp_definition_id(), + AccountsForExeTests::token_lp_definition_acc(), + ); + state.force_insert_account( + IdForExeTests::user_token_a_id(), + AccountsForExeTests::user_token_a_holding(), + ); + state.force_insert_account( + IdForExeTests::user_token_b_id(), + AccountsForExeTests::user_token_b_holding(), + ); + state.force_insert_account( + IdForExeTests::user_token_lp_id(), + AccountsForExeTests::user_token_lp_holding(), + ); + state.force_insert_account( + IdForExeTests::vault_a_id(), + AccountsForExeTests::vault_a_init(), + ); + state.force_insert_account( + IdForExeTests::vault_b_id(), + AccountsForExeTests::vault_b_init(), + ); + + state +} + +#[cfg(feature = "with-nssa")] +fn state_for_amm_tests_with_new_def() -> V02State { + let initial_data = []; + let mut state = V02State::new_with_genesis_accounts(&initial_data, &[]); + state.force_insert_account( + IdForExeTests::token_a_definition_id(), + AccountsForExeTests::token_a_definition_account(), + ); + state.force_insert_account( + IdForExeTests::token_b_definition_id(), + AccountsForExeTests::token_b_definition_acc(), + ); + state.force_insert_account( + IdForExeTests::user_token_a_id(), + AccountsForExeTests::user_token_a_holding(), + ); + state.force_insert_account( + IdForExeTests::user_token_b_id(), + AccountsForExeTests::user_token_b_holding(), + ); + state +} + +#[cfg(feature = "with-nssa")] +#[test] +fn test_simple_amm_remove() { + let mut state = state_for_amm_tests(); + + let instruction = amm_core::Instruction::RemoveLiquidity { + remove_liquidity_amount: BalanceForExeTests::remove_lp(), + min_amount_to_remove_token_a: BalanceForExeTests::remove_min_amount_a(), + min_amount_to_remove_token_b: BalanceForExeTests::remove_min_amount_b(), + }; + + let message = public_transaction::Message::try_new( + Program::amm().id(), + vec![ + IdForExeTests::pool_definition_id(), + IdForExeTests::vault_a_id(), + IdForExeTests::vault_b_id(), + IdForExeTests::token_lp_definition_id(), + IdForExeTests::user_token_a_id(), + IdForExeTests::user_token_b_id(), + IdForExeTests::user_token_lp_id(), + ], + vec![0], + instruction, + ) + .unwrap(); + + let witness_set = public_transaction::WitnessSet::for_message( + &message, + &[&PrivateKeysForTests::user_token_lp_key()], + ); + + let tx = PublicTransaction::new(message, witness_set); + state.transition_from_public_transaction(&tx).unwrap(); + + let pool_post = state.get_account_by_id(IdForExeTests::pool_definition_id()); + let vault_a_post = state.get_account_by_id(IdForExeTests::vault_a_id()); + let vault_b_post = state.get_account_by_id(IdForExeTests::vault_b_id()); + let token_lp_post = state.get_account_by_id(IdForExeTests::token_lp_definition_id()); + let user_token_a_post = state.get_account_by_id(IdForExeTests::user_token_a_id()); + let user_token_b_post = state.get_account_by_id(IdForExeTests::user_token_b_id()); + let user_token_lp_post = state.get_account_by_id(IdForExeTests::user_token_lp_id()); + + let expected_pool = AccountsForExeTests::pool_definition_remove(); + let expected_vault_a = AccountsForExeTests::vault_a_remove(); + let expected_vault_b = AccountsForExeTests::vault_b_remove(); + let expected_token_lp = AccountsForExeTests::token_lp_definition_remove(); + let expected_user_token_a = AccountsForExeTests::user_token_a_holding_remove(); + let expected_user_token_b = AccountsForExeTests::user_token_b_holding_remove(); + let expected_user_token_lp = AccountsForExeTests::user_token_lp_holding_remove(); + + assert_eq!(pool_post, expected_pool); + assert_eq!(vault_a_post, expected_vault_a); + assert_eq!(vault_b_post, expected_vault_b); + assert_eq!(token_lp_post, expected_token_lp); + assert_eq!(user_token_a_post, expected_user_token_a); + assert_eq!(user_token_b_post, expected_user_token_b); + assert_eq!(user_token_lp_post, expected_user_token_lp); +} + +#[cfg(feature = "with-nssa")] +#[test] +fn test_simple_amm_new_definition_inactive_initialized_pool_and_uninit_user_lp() { + let mut state = state_for_amm_tests_with_new_def(); + + // Uninitialized in constructor + state.force_insert_account( + IdForExeTests::vault_a_id(), + AccountsForExeTests::vault_a_init_inactive(), + ); + state.force_insert_account( + IdForExeTests::vault_b_id(), + AccountsForExeTests::vault_b_init_inactive(), + ); + state.force_insert_account( + IdForExeTests::pool_definition_id(), + AccountsForExeTests::pool_definition_inactive(), + ); + state.force_insert_account( + IdForExeTests::token_lp_definition_id(), + AccountsForExeTests::token_lp_definition_init_inactive(), + ); + + let instruction = amm_core::Instruction::NewDefinition { + token_a_amount: BalanceForExeTests::vault_a_balance_init(), + token_b_amount: BalanceForExeTests::vault_b_balance_init(), + amm_program_id: Program::amm().id(), + }; + + let message = public_transaction::Message::try_new( + Program::amm().id(), + vec![ + IdForExeTests::pool_definition_id(), + IdForExeTests::vault_a_id(), + IdForExeTests::vault_b_id(), + IdForExeTests::token_lp_definition_id(), + IdForExeTests::user_token_a_id(), + IdForExeTests::user_token_b_id(), + IdForExeTests::user_token_lp_id(), + ], + vec![0, 0], + instruction, + ) + .unwrap(); + + let witness_set = public_transaction::WitnessSet::for_message( + &message, + &[ + &PrivateKeysForTests::user_token_a_key(), + &PrivateKeysForTests::user_token_b_key(), + ], + ); + + let tx = PublicTransaction::new(message, witness_set); + state.transition_from_public_transaction(&tx).unwrap(); + + let pool_post = state.get_account_by_id(IdForExeTests::pool_definition_id()); + let vault_a_post = state.get_account_by_id(IdForExeTests::vault_a_id()); + let vault_b_post = state.get_account_by_id(IdForExeTests::vault_b_id()); + let token_lp_post = state.get_account_by_id(IdForExeTests::token_lp_definition_id()); + let user_token_a_post = state.get_account_by_id(IdForExeTests::user_token_a_id()); + let user_token_b_post = state.get_account_by_id(IdForExeTests::user_token_b_id()); + let user_token_lp_post = state.get_account_by_id(IdForExeTests::user_token_lp_id()); + + let expected_pool = AccountsForExeTests::pool_definition_new_init(); + let expected_vault_a = AccountsForExeTests::vault_a_init(); + let expected_vault_b = AccountsForExeTests::vault_b_init(); + let expected_token_lp = AccountsForExeTests::token_lp_definition_new_init(); + let expected_user_token_a = AccountsForExeTests::user_token_a_holding_new_init(); + let expected_user_token_b = AccountsForExeTests::user_token_b_holding_new_init(); + let expected_user_token_lp = AccountsForExeTests::user_token_lp_holding_new_init(); + + assert_eq!(pool_post, expected_pool); + assert_eq!(vault_a_post, expected_vault_a); + assert_eq!(vault_b_post, expected_vault_b); + assert_eq!(token_lp_post, expected_token_lp); + assert_eq!(user_token_a_post, expected_user_token_a); + assert_eq!(user_token_b_post, expected_user_token_b); + assert_eq!(user_token_lp_post, expected_user_token_lp); +} + +#[cfg(feature = "with-nssa")] +#[test] +fn test_simple_amm_new_definition_inactive_initialized_pool_init_user_lp() { + let mut state = state_for_amm_tests_with_new_def(); + + // Uninitialized in constructor + state.force_insert_account( + IdForExeTests::vault_a_id(), + AccountsForExeTests::vault_a_init_inactive(), + ); + state.force_insert_account( + IdForExeTests::vault_b_id(), + AccountsForExeTests::vault_b_init_inactive(), + ); + state.force_insert_account( + IdForExeTests::pool_definition_id(), + AccountsForExeTests::pool_definition_inactive(), + ); + state.force_insert_account( + IdForExeTests::token_lp_definition_id(), + AccountsForExeTests::token_lp_definition_init_inactive(), + ); + state.force_insert_account( + IdForExeTests::user_token_lp_id(), + AccountsForExeTests::user_token_lp_holding_init_zero(), + ); + + let instruction = amm_core::Instruction::NewDefinition { + token_a_amount: BalanceForExeTests::vault_a_balance_init(), + token_b_amount: BalanceForExeTests::vault_b_balance_init(), + amm_program_id: Program::amm().id(), + }; + + let message = public_transaction::Message::try_new( + Program::amm().id(), + vec![ + IdForExeTests::pool_definition_id(), + IdForExeTests::vault_a_id(), + IdForExeTests::vault_b_id(), + IdForExeTests::token_lp_definition_id(), + IdForExeTests::user_token_a_id(), + IdForExeTests::user_token_b_id(), + IdForExeTests::user_token_lp_id(), + ], + vec![0, 0], + instruction, + ) + .unwrap(); + + let witness_set = public_transaction::WitnessSet::for_message( + &message, + &[ + &PrivateKeysForTests::user_token_a_key(), + &PrivateKeysForTests::user_token_b_key(), + ], + ); + + let tx = PublicTransaction::new(message, witness_set); + state.transition_from_public_transaction(&tx).unwrap(); + + let pool_post = state.get_account_by_id(IdForExeTests::pool_definition_id()); + let vault_a_post = state.get_account_by_id(IdForExeTests::vault_a_id()); + let vault_b_post = state.get_account_by_id(IdForExeTests::vault_b_id()); + let token_lp_post = state.get_account_by_id(IdForExeTests::token_lp_definition_id()); + let user_token_a_post = state.get_account_by_id(IdForExeTests::user_token_a_id()); + let user_token_b_post = state.get_account_by_id(IdForExeTests::user_token_b_id()); + let user_token_lp_post = state.get_account_by_id(IdForExeTests::user_token_lp_id()); + + let expected_pool = AccountsForExeTests::pool_definition_new_init(); + let expected_vault_a = AccountsForExeTests::vault_a_init(); + let expected_vault_b = AccountsForExeTests::vault_b_init(); + let expected_token_lp = AccountsForExeTests::token_lp_definition_new_init(); + let expected_user_token_a = AccountsForExeTests::user_token_a_holding_new_init(); + let expected_user_token_b = AccountsForExeTests::user_token_b_holding_new_init(); + let expected_user_token_lp = AccountsForExeTests::user_token_lp_holding_new_init(); + + assert_eq!(pool_post, expected_pool); + assert_eq!(vault_a_post, expected_vault_a); + assert_eq!(vault_b_post, expected_vault_b); + assert_eq!(token_lp_post, expected_token_lp); + assert_eq!(user_token_a_post, expected_user_token_a); + assert_eq!(user_token_b_post, expected_user_token_b); + assert_eq!(user_token_lp_post, expected_user_token_lp); +} + +#[cfg(feature = "with-nssa")] +#[test] +fn test_simple_amm_new_definition_uninitialized_pool() { + let mut state = state_for_amm_tests_with_new_def(); + + // Uninitialized in constructor + state.force_insert_account( + IdForExeTests::vault_a_id(), + AccountsForExeTests::vault_a_init_inactive(), + ); + state.force_insert_account( + IdForExeTests::vault_b_id(), + AccountsForExeTests::vault_b_init_inactive(), + ); + + let instruction = amm_core::Instruction::NewDefinition { + token_a_amount: BalanceForExeTests::vault_a_balance_init(), + token_b_amount: BalanceForExeTests::vault_b_balance_init(), + amm_program_id: Program::amm().id(), + }; + + let message = public_transaction::Message::try_new( + Program::amm().id(), + vec![ + IdForExeTests::pool_definition_id(), + IdForExeTests::vault_a_id(), + IdForExeTests::vault_b_id(), + IdForExeTests::token_lp_definition_id(), + IdForExeTests::user_token_a_id(), + IdForExeTests::user_token_b_id(), + IdForExeTests::user_token_lp_id(), + ], + vec![0, 0], + instruction, + ) + .unwrap(); + + let witness_set = public_transaction::WitnessSet::for_message( + &message, + &[ + &PrivateKeysForTests::user_token_a_key(), + &PrivateKeysForTests::user_token_b_key(), + ], + ); + + let tx = PublicTransaction::new(message, witness_set); + state.transition_from_public_transaction(&tx).unwrap(); + + let pool_post = state.get_account_by_id(IdForExeTests::pool_definition_id()); + let vault_a_post = state.get_account_by_id(IdForExeTests::vault_a_id()); + let vault_b_post = state.get_account_by_id(IdForExeTests::vault_b_id()); + let token_lp_post = state.get_account_by_id(IdForExeTests::token_lp_definition_id()); + let user_token_a_post = state.get_account_by_id(IdForExeTests::user_token_a_id()); + let user_token_b_post = state.get_account_by_id(IdForExeTests::user_token_b_id()); + let user_token_lp_post = state.get_account_by_id(IdForExeTests::user_token_lp_id()); + + let expected_pool = AccountsForExeTests::pool_definition_new_init(); + let expected_vault_a = AccountsForExeTests::vault_a_init(); + let expected_vault_b = AccountsForExeTests::vault_b_init(); + let expected_token_lp = AccountsForExeTests::token_lp_definition_new_init(); + let expected_user_token_a = AccountsForExeTests::user_token_a_holding_new_init(); + let expected_user_token_b = AccountsForExeTests::user_token_b_holding_new_init(); + let expected_user_token_lp = AccountsForExeTests::user_token_lp_holding_new_init(); + + assert_eq!(pool_post, expected_pool); + assert_eq!(vault_a_post, expected_vault_a); + assert_eq!(vault_b_post, expected_vault_b); + assert_eq!(token_lp_post, expected_token_lp); + assert_eq!(user_token_a_post, expected_user_token_a); + assert_eq!(user_token_b_post, expected_user_token_b); + assert_eq!(user_token_lp_post, expected_user_token_lp); +} + +#[cfg(feature = "with-nssa")] +#[test] +fn test_simple_amm_add() { + let mut state = state_for_amm_tests(); + + let instruction = amm_core::Instruction::AddLiquidity { + min_amount_liquidity: BalanceForExeTests::add_min_amount_lp(), + max_amount_to_add_token_a: BalanceForExeTests::add_max_amount_a(), + max_amount_to_add_token_b: BalanceForExeTests::add_max_amount_b(), + }; + + let message = public_transaction::Message::try_new( + Program::amm().id(), + vec![ + IdForExeTests::pool_definition_id(), + IdForExeTests::vault_a_id(), + IdForExeTests::vault_b_id(), + IdForExeTests::token_lp_definition_id(), + IdForExeTests::user_token_a_id(), + IdForExeTests::user_token_b_id(), + IdForExeTests::user_token_lp_id(), + ], + vec![0, 0], + instruction, + ) + .unwrap(); + + let witness_set = public_transaction::WitnessSet::for_message( + &message, + &[ + &PrivateKeysForTests::user_token_a_key(), + &PrivateKeysForTests::user_token_b_key(), + ], + ); + + let tx = PublicTransaction::new(message, witness_set); + state.transition_from_public_transaction(&tx).unwrap(); + + let pool_post = state.get_account_by_id(IdForExeTests::pool_definition_id()); + let vault_a_post = state.get_account_by_id(IdForExeTests::vault_a_id()); + let vault_b_post = state.get_account_by_id(IdForExeTests::vault_b_id()); + let token_lp_post = state.get_account_by_id(IdForExeTests::token_lp_definition_id()); + let user_token_a_post = state.get_account_by_id(IdForExeTests::user_token_a_id()); + let user_token_b_post = state.get_account_by_id(IdForExeTests::user_token_b_id()); + let user_token_lp_post = state.get_account_by_id(IdForExeTests::user_token_lp_id()); + + let expected_pool = AccountsForExeTests::pool_definition_add(); + let expected_vault_a = AccountsForExeTests::vault_a_add(); + let expected_vault_b = AccountsForExeTests::vault_b_add(); + let expected_token_lp = AccountsForExeTests::token_lp_definition_add(); + let expected_user_token_a = AccountsForExeTests::user_token_a_holding_add(); + let expected_user_token_b = AccountsForExeTests::user_token_b_holding_add(); + let expected_user_token_lp = AccountsForExeTests::user_token_lp_holding_add(); + + assert_eq!(pool_post, expected_pool); + assert_eq!(vault_a_post, expected_vault_a); + assert_eq!(vault_b_post, expected_vault_b); + assert_eq!(token_lp_post, expected_token_lp); + assert_eq!(user_token_a_post, expected_user_token_a); + assert_eq!(user_token_b_post, expected_user_token_b); + assert_eq!(user_token_lp_post, expected_user_token_lp); +} + +#[cfg(feature = "with-nssa")] +#[test] +fn test_simple_amm_swap_1() { + let mut state = state_for_amm_tests(); + + let instruction = amm_core::Instruction::Swap { + swap_amount_in: BalanceForExeTests::swap_amount_in(), + min_amount_out: BalanceForExeTests::swap_min_amount_out(), + token_definition_id_in: IdForExeTests::token_b_definition_id(), + }; + + let message = public_transaction::Message::try_new( + Program::amm().id(), + vec![ + IdForExeTests::pool_definition_id(), + IdForExeTests::vault_a_id(), + IdForExeTests::vault_b_id(), + IdForExeTests::user_token_a_id(), + IdForExeTests::user_token_b_id(), + ], + vec![0], + instruction, + ) + .unwrap(); + + let witness_set = public_transaction::WitnessSet::for_message( + &message, + &[&PrivateKeysForTests::user_token_b_key()], + ); + + let tx = PublicTransaction::new(message, witness_set); + state.transition_from_public_transaction(&tx).unwrap(); + + let pool_post = state.get_account_by_id(IdForExeTests::pool_definition_id()); + let vault_a_post = state.get_account_by_id(IdForExeTests::vault_a_id()); + let vault_b_post = state.get_account_by_id(IdForExeTests::vault_b_id()); + let user_token_a_post = state.get_account_by_id(IdForExeTests::user_token_a_id()); + let user_token_b_post = state.get_account_by_id(IdForExeTests::user_token_b_id()); + + let expected_pool = AccountsForExeTests::pool_definition_swap_1(); + let expected_vault_a = AccountsForExeTests::vault_a_swap_1(); + let expected_vault_b = AccountsForExeTests::vault_b_swap_1(); + let expected_user_token_a = AccountsForExeTests::user_token_a_holding_swap_1(); + let expected_user_token_b = AccountsForExeTests::user_token_b_holding_swap_1(); + + assert_eq!(pool_post, expected_pool); + assert_eq!(vault_a_post, expected_vault_a); + assert_eq!(vault_b_post, expected_vault_b); + assert_eq!(user_token_a_post, expected_user_token_a); + assert_eq!(user_token_b_post, expected_user_token_b); +} + +#[cfg(feature = "with-nssa")] +#[test] +fn test_simple_amm_swap_2() { + let mut state = state_for_amm_tests(); + + let instruction = amm_core::Instruction::Swap { + swap_amount_in: BalanceForExeTests::swap_amount_in(), + min_amount_out: BalanceForExeTests::swap_min_amount_out(), + token_definition_id_in: IdForExeTests::token_a_definition_id(), + }; + let message = public_transaction::Message::try_new( + Program::amm().id(), + vec![ + IdForExeTests::pool_definition_id(), + IdForExeTests::vault_a_id(), + IdForExeTests::vault_b_id(), + IdForExeTests::user_token_a_id(), + IdForExeTests::user_token_b_id(), + ], + vec![0], + instruction, + ) + .unwrap(); + + let witness_set = public_transaction::WitnessSet::for_message( + &message, + &[&PrivateKeysForTests::user_token_a_key()], + ); + + let tx = PublicTransaction::new(message, witness_set); + state.transition_from_public_transaction(&tx).unwrap(); + + let pool_post = state.get_account_by_id(IdForExeTests::pool_definition_id()); + let vault_a_post = state.get_account_by_id(IdForExeTests::vault_a_id()); + let vault_b_post = state.get_account_by_id(IdForExeTests::vault_b_id()); + let user_token_a_post = state.get_account_by_id(IdForExeTests::user_token_a_id()); + let user_token_b_post = state.get_account_by_id(IdForExeTests::user_token_b_id()); + + let expected_pool = AccountsForExeTests::pool_definition_swap_2(); + let expected_vault_a = AccountsForExeTests::vault_a_swap_2(); + let expected_vault_b = AccountsForExeTests::vault_b_swap_2(); + let expected_user_token_a = AccountsForExeTests::user_token_a_holding_swap_2(); + let expected_user_token_b = AccountsForExeTests::user_token_b_holding_swap_2(); + + assert_eq!(pool_post, expected_pool); + assert_eq!(vault_a_post, expected_vault_a); + assert_eq!(vault_b_post, expected_vault_b); + assert_eq!(user_token_a_post, expected_user_token_a); + assert_eq!(user_token_b_post, expected_user_token_b); +}