From 0523e253a07cf2612b5432ff6dc603e27268592a Mon Sep 17 00:00:00 2001 From: Alex Daddy Date: Sat, 7 Aug 2021 02:27:18 +0000 Subject: [PATCH] GitBook: [main] 20 pages and 10 assets modified --- .gitbook/assets/0floor.png | Bin 0 -> 13876 bytes .gitbook/assets/cecjing.png | Bin 0 -> 19191 bytes .gitbook/assets/cectable2 (1).png | Bin 0 -> 12049 bytes .gitbook/assets/cectable2.png | Bin 0 -> 12049 bytes .gitbook/assets/cectable3.png | Bin 0 -> 7517 bytes .gitbook/assets/image.png | Bin 0 -> 50552 bytes .gitbook/assets/lending-user-flow.jpg | Bin 0 -> 29954 bytes ...uidity (2) (2) (2) (2) (2) (2) (2) (1).png | Bin 0 -> 6347 bytes ...uidity (2) (2) (2) (2) (2) (2) (2) (2).png | Bin 0 -> 6347 bytes .../liquidity (2) (2) (2) (2) (2) (2) (2).png | Bin 0 -> 6347 bytes README.md | 21 +- SUMMARY.md | 31 + developers/smart-contracts/README.md | 2 + developers/smart-contracts/apis/README.md | 6 + developers/smart-contracts/apis/equations.md | 111 ++ developers/smart-contracts/apis/pools.md | 1286 +++++++++++++++++ developers/smart-contracts/apis/vault.md | 61 + developers/smart-contracts/diagrams/README.md | 2 + .../smart-contracts/diagrams/class-diagram.md | 4 + .../diagrams/protocol-use-case.md | 30 + developers/smart-contracts/error-codes.md | 100 ++ faq.md | 81 ++ ...-fixed-yield-and-no-risk-of-liquidation.md | 32 + ...t-making-designed-for-lending-protocols.md | 56 + protocol/collateral-rebalancing-pool.md | 24 + protocol/liquidity-bootstrapping-pool.md | 14 + ...ure-that-supports-ecosystem-development.md | 54 + protocol/vault.md | 14 + protocol/yield-farming-on-alex.md | 16 + whitepaper/automated-market-making-of-alex.md | 414 ++++++ 30 files changed, 2358 insertions(+), 1 deletion(-) create mode 100644 .gitbook/assets/0floor.png create mode 100644 .gitbook/assets/cecjing.png create mode 100644 .gitbook/assets/cectable2 (1).png create mode 100644 .gitbook/assets/cectable2.png create mode 100644 .gitbook/assets/cectable3.png create mode 100644 .gitbook/assets/image.png create mode 100644 .gitbook/assets/lending-user-flow.jpg create mode 100644 .gitbook/assets/liquidity (2) (2) (2) (2) (2) (2) (2) (1).png create mode 100644 .gitbook/assets/liquidity (2) (2) (2) (2) (2) (2) (2) (2).png create mode 100644 .gitbook/assets/liquidity (2) (2) (2) (2) (2) (2) (2).png create mode 100644 SUMMARY.md create mode 100644 developers/smart-contracts/README.md create mode 100644 developers/smart-contracts/apis/README.md create mode 100644 developers/smart-contracts/apis/equations.md create mode 100644 developers/smart-contracts/apis/pools.md create mode 100644 developers/smart-contracts/apis/vault.md create mode 100644 developers/smart-contracts/diagrams/README.md create mode 100644 developers/smart-contracts/diagrams/class-diagram.md create mode 100644 developers/smart-contracts/diagrams/protocol-use-case.md create mode 100644 developers/smart-contracts/error-codes.md create mode 100644 faq.md create mode 100644 lending-protocol-with-fixed-yield-and-no-risk-of-liquidation.md create mode 100644 protocol/automated-market-making-designed-for-lending-protocols.md create mode 100644 protocol/collateral-rebalancing-pool.md create mode 100644 protocol/liquidity-bootstrapping-pool.md create mode 100644 protocol/platform-architecture-that-supports-ecosystem-development.md create mode 100644 protocol/vault.md create mode 100644 protocol/yield-farming-on-alex.md create mode 100644 whitepaper/automated-market-making-of-alex.md diff --git a/.gitbook/assets/0floor.png b/.gitbook/assets/0floor.png new file mode 100644 index 0000000000000000000000000000000000000000..b94d3e4845a31e59466cf14987bef1e0ce5b9227 GIT binary patch literal 13876 zcmd73WmuH$x<5QacMF5SP)bOSO3Bcvf?y#?4lRwu(A|vzNFyjJNGjc}bVx|d&>+nK z0}S!M(P!_yp7+>m@4eQi_X7tr_i^0kmFM+~^O{KQduo(qm&rgN5an%kr!@W{hx!%!xURk}Dsh?$7BN0ma-<$AQ!+(?cKuTfJQy(ES#y>6jpaJr>3 z5U2ht{z2)dAJZ@H2<@WLv28C#xTvq{RBnZ1_xy>1n@vPlK%;f%6w!05tKTXqY)sy+ zg{&Hp7I+G@#sw;-tlUD>JZZ6+`Cej{O~X@jFJ<#}NowWwbqHTbWD)&)@2iDNpJVjn zn5R-Z^ybXou*=4i2P zhIW{G^w}WGxY;}heBv(rOX0FBJ5_fKie)yb|JHaTi8BR?ATX0j2_t+yB@~w>j_(uZ zDAv(@wt62ckz(L#hHcsHFt&f|;S^G~9~ z*JNxnQIN@H->eFp0>vC;V%XHW_g63&xAU2-Do@?0Mi$8z+AQM|Pu94o`+7T?-hp=C z1fT1`VljI;yll6BdhT#lvWdsXHkzM{y(eT1`CrX&@;&n@dbdvgt#kNhh29H1rw_&p z-jd3K#P5RJpX{@Fd@&R^l`EgvMG&QCHa52ZX!!!n%$j*EMYi+A%;6&+hTwpv#G_m5 zt=}H`kfHQXQe@(zei-nkUGg5tYjkrGwy!W)zi!`}D@tB^4gJKD-Bt30%l+WB0xP%U zSIE=yW4i!KoDS7;_faBJ{Cr|SN~q@d_){D?J%*}lUklq?b(OtBmJ!d!x%&DU?~3C% z5PGv1y2IOTE-Ex6 zJsaDc-nbaq=UXi|5gC%12uJS4Jvhn7&atUUtBT89f~^b$X+%dJ;<%>$zoG76QBNi_~}}-{v4*nP|E9kW{3e2sKHdjF3)F z^W?LS+=Uf5np+Kz2`ev2usyLk=3(HNpecz#Ng59nt7@hD)~5O3@7_9sP(PibzQ-5l zpc5}6>$_6Wqtax8nnP!GfTj2EI@V#>f2}(V6va!gEts*UQ#KjCcwd_&kBko`V15!Iu~yG&SX6s6#L9i&Q&rTxRwYj((CyV{P9SesoE@59B;4h^ zo5z%?yg!h3d4eA2CqTKMJA8wq#WRNqGjAMGgEGkpj8ZcU^FOuY**wVu(G z8T)QkUb_1;U|nHdz2K-*tG|CcMh-8{@iEtW^x6AfB>@!Ar2i;U*W^7X{n%FKsh1!L z0sSUlx_v5fj-rQgoFujQ3`!V>U$+IW>o<^w?{WB81A*G}_ngZ6@tba<=A87e$p$Al zj`}{R(5jUAwUd!ln>0!*L+(Uf9v{Q^9&@_=dqkA{Pxb#A&Lx@~f_EW!-87j-o_-q^ z`j#m3eA`+}$Sa{XwAvAMr!0jj|9U2-Vy&tot)lik!>w!w>|>;OF`t>X$E%a<&4&(B zWz?E%2(f_j_rz2K*w0U^`d7Dk7-o@AkGr2B%F77HQ>H1`3tz^P(zp}zg)L2wxCnid zxGYdi*#&Kj`;zKk=li;vBxOOLb@Rq|j%`g$uLaKB?9gduMxU33yXgqx_h4Lu8q+w> zj*vc*eb`C4LlQ4>ag54)qN1E8I(A_YkEjKHmK&tu>*g#RcO{cHXYoxqPF>n9;pgT- zuWFnxAumZ6;CyNdNsr>NSS^#ag?X7Fb!smoir2EwFx9*H3~SQ0n6Bz{or)Wj)9n41;8IDfk4Jcwe<9sT- zOV{Zxz=pBY#B!y9^|Zjrvyk1`bwe!v1aeOm?#_qHFouW zJyHFcdQcIo7GEde3YO;laxv{l)b$U6|A}7|(nMs4e;xMz*=wfnQY+6J6-T0O#DUNH zqc!lu2EkIRn>VJ(`3CEu<>p;%V)5r&=V5345SaS|`+|?2-Y)vHnfsGllu4M+lZog3 za2YCbsk@fQ)^%{;^x>$X=$}{PQ#mC@;Zw3MG&T4InYiuAx5)mf%ROHubo(kdi8qT> z%~{7p8t4(D0bdx{Olp|4-+IeHg_Il$Jd0W!5905sl&@(EemFWgt<8GuI&2aSkv(~} zeJ;$dpmd}z&NvILCR|&-!>(Bo#a8x&jrD4g*0^w&(F^Nr$tPz6UO;lzuvaCUQu}xd z-xolmU8Y5-dhLkk7;cz4TlzDwDer4;8_zEWXwp-(EjGL0Noly4l>Md!X z9_EO1>Yi~be?EFTNVo7z z;X7KT^&K=0#}?%H7pZ*~jd6=2rJXX8KyKw`oX$~wObp|U$^o|rQ9Rk&xZK2WF%#@d zAonA86aR1I$No+R6ia=}!SmM!eQpgkh;9}=_A-!sEGsL-A*4dw^UIPc&$l_#r(mzj z>64GoQ~Aqln+XT|9^i@ArY%orpFy{R#cbdxtonYd{e;A!IIR{t_*HsAD;;6w$l}tl zAm&|5B-(zl!oma$0h9BS&7C7iBhWb7`mVZg{$mqO@n`T|`(xiwp(TC7Y(z&u)6<3@ z1m!goG)Lm64K0kA&v*l(X7VONs2Y~PJvnfC*o$H5WmS``m8hlKxLNL41K}RbT?el* zV7RO59X4mw#x@69Df7Y7-rc=*$o-ija3LC)dSqusu;C_;orEWtx@>k49dV*yFwbDp z)M|9tVBo!m_tcU?{q7)mqJj5$IkN^9uYkauy7E*)kbzNt>eV^n_?vIP)DoDn{X|TL zvI6)M!3A|MWz^AYI(_eE4szGrNpdTqm)3|E$REU0HrhCjftGNir%jqJja{UhiT)9q z*D>J5g#gJE5cF;^5qN$BtC$my<5H`5@JiO%|EP6^n_c@JRYWkU1YzF0m4N5@Q{-o& zo9Wbiyu@wI1j90vJn03vYryQsic!n6P)D%5<&YvjReQPDL>UWZFjP)oLT4tz3e(-@ ztgHgjYoqrjD%x+ko|A8%S)@1=x$oG&>`5B~9j8n)Q!N zE*tr@=qmfKG?r-Mp6iR`%Gt`Bz)&_pdee3hEAgwFC93iVPTsvYdZ^VoQP-#N;W>-9 zvlw~2ZUCDSdX2;TH@`l%4eGqL%Ht&fJWS&A)WIZ$8Tt!toA6F6I}!}nH(kEkZ!Oe8-APZ3l1ySp9Kq|Js@%)DH?SaY?NOFE;(aZPVl&9Fb78`>wcM66f z<+0nt^~#(XyX(3^v9L$1X+KkC|_b;@&Ux@O#*wzU>>bp8p`R;M@Q)x=)5De&}f zs0(ic`5f*_UpAJLm8r)ahg0f@|B3aDcu>ZuCCmQ`w?WIvz0Iz7wliCfTLyMYw{iRX z!Q^}KT3T9JM$@8pjpql^S_TnlZ$$MQhWeAm0F}e}ekJZ@`|`f|Rw=5xmy*&x>bSmf zsU=-wO7g3df%*BlBSi{n@>{P?iCs@$8-+93k_qdGMM?frUKARYdf+gCYv(8EB=6RA zH4ZhNC5*L@!ue5nuD9}CmU2vUV`Lw4rmv^ALY60PGOfaEV6g4)ZYYT+x+volqU!%Dl}tFL3$y`ewa5nD|8C9AL|_Nxz)%pT1b(;t#>^I!H&_LwYud1Mlowqht* zpQh>7sJ^$D)CMv;YzQ3Qp^Gz9b(%?SQss< zfFN?4qZ^i)CWuuXbFZ@>o$wLu)ZBxnqk7-h7@Oy|ku+9kvZ|Gqjm2Yv9^IyKE!|zUH$@NEPQFdd};P~tF!A4nR=L_y^Pbo$h83o zWC|vk2&^QB>O^bjwEwwTBBk8b@-6gTTDX9q1g%SQ>#}VO^!&b}=&pB;-zbHTdMDy@ z%X9i4Q4Rgo(;?J+g1#PBrUSh_Ta!-r!>^4e-yMU`uRM{PXZYXu@zY-Y^#9ua4NJ}J ztuF%1(E3DTqJwTNuEik$|3Cma@F$-xq{%o;n*_)K4eXr@stLT?qC7@ATu%oGtS}&T z{=3(5J}sS|o>4@CJu+VV#_)7JXs%h{l8;Wkcdy6P==LN?X$4 zNU3C@6A%gyS8sD}cE@A2EW{IGO}eqLekcH%TA+!PR>Ua%6F0u zw7Ro8lj#(DLfmJW2yfzExk^3>H3D_|6wn$-lJ@s=B2~$82) z;iTNbpzDV^(oHjXdn>}GWRWTX6b)izrg#w@Borhm+tjg=N~iB^Gvn=O-FeAXSX0iG=r=iZQ|jvqXL z-RwSKb($C-TMSH5G^Mo~t?MQQ1vEsnw&hq;w0{z#o)_wpf5z0Sz;NQNxQ@%6gwb$! z#KQYHd-NXO>?7R^mGUmZm@Y^utaxH)g@61RUiuTvKxu2CynGffDIuO68-7{1m@U-8 zlqyQ1Ut5{A^1dBqfEBDus>CPtlCr;5nqs(}=Gjiu= z{Z&_HAqr3{|{L9;q%hz(Jqt@e|xrj%i8DkaBpvOja}T1?Jt1i9hEVv`;A_8 zCs1hHqOFn6f}igxI_PYEcz8Jfi3HK)R^#b+%g;*NbtO~XSy_hi<=8OuDNpai(~S)O zv%MXwvX@-tjZP$Kucn+^S*zkBbAvzymy(D^@^MKRbwN7WwtcghQ;GJ;TxDFdLG98z zJC~nr8v7`W_6wI8v9Qt&SQF^|RvTwEEN17VJSJXa861JC)9WdfKAlc>-0fm}s|z9` z$~l_Oe~k6b6e{g%7Tby{4CoqAPYF`!>WEqTE++CwvPb-^PbEP3tCrUoMAfOZWU77r zkr`E7BS7wQ=hXgz>k>Vt7NkbiK)z{N z@l6RCP^Jc?@GXWU+{Xu4nM{#V^?{s{y`@+^T0b-VnEpTuTPWf5YgkW3+0rZv*;6No z-;Zd*7qNOlXivnm&O^&&qaD#4iDITBLv7Zx@G4x{ML(IpB1hB+bMjZ@Woo+96-*N| z+~h0`bpUXtLELOXU$^&i`H>n9o8}-$HiGe;TSG?cXqi39nm1a8VrG+LTXQpGWALXE zBc@lmvmBqJGU_L3q(n*BfN>8QqOZ_JuNMFdRK}$vS;7?SY=CP-IJZ@mk5T>#^Y19% z@~nKJ62tE1m6e^_H=k~Fy6fFcohG~6&ZC0tLhXvfc}ZlpWFOZsrK_7JF8`>D)(Z^j z7FP!4D!8X~<=zbXWdrq{w!F{tn8tg{f%@KdA+RKnqLWKtV>UdGr{T2$S}`K*9`_`@ zP$Ux0RxkCD+aH$YQT?QNg%5Q%-`$$N+IOW?UAL}eZ}F0z!r(m8j%3MWUu*>aBc$+} zV8`OKw`+N;MoI;q(ZhfvoVs%BS(W08K5q0pZL0Lp6PSgXO}m zf;*f3JvaHEoe_$UdvUl^W+0ORgIVGfi<-PUV@&!7l_MkF;+eL((<(veIho}d!|El3 z7^Vq*0j<{5&BoPp`;tWb?>TJ*zk}iBq_E|Q8i)4O`k2Pe;q-5U`y)%1+P>?6_DIhgP`{=7b z{nqn-XCVBwdT9CXImDsXk<*#=3NrhWYPLPE=whL)g0SeoMz^`sjm*1fqWWI-Nn=@`8IzGl*a1Bgk}0}ak7m4I$q=!9nztwm3} z9z9|nnNmQ@8;8Tp~d1hu- z&Ij5$R`Y$|zvHZ4r-JBfEAB0+h+!VZisieT**D$=n*|T(y2@8bAadts)N0_2Ra-7s z83&E9X6BnD4KRAuV34mJGDeYbw9r$yLwMOkx+UL!WX}AO7nl|ES+%Lk6V0Lm7316j zL(CX`A+K!j!?S26sF2fu+RCcHfVuIkxNX+yo7Lky`I8|49TSDFC)xco|ZU zO=*ENRW;NJxD=awW_&tlj=BaR zhBrv$>jy}`$9(%nKd=FLMcdsHg(h+bJ$Ok3R~>LJu*-iTE!vh=wY*G_vpgNH|0LI& zYTU!=m6TLs#1I0K|G#TDd9^ODkagKtn3JApMRi} z5Syl``yHWF;?R2|Mvf?q^k1#wlq{WMw$5Yj(#0ttV8U8|l;7VO^Zx*{e;15@f9A){~s(HvlgSD>>Ew0bpeemI!LkAMfw)y__ZMd-6u6<*@&>Z`PpO-6KsJKwm&g zUZ5}3Dna*3p|NgF`E>yk-Ksz{0uBz9hz_UeR5jD8!y3Eb!?$#gW(E`~hg5GB6wt7W z2qI~7FSmr+pN}%)r>R<+qwdv4{(~Y1ng5jEF`{%yK&%d4~1k%sZM;=VjlJtioM@G26^iUl&IJ zN$8@{wIB5hz%fTaOLo`TDDl#YG`Pb|x{flv>FYU5lJ0B>4K7P!wE#N%1shjH&`H*v z;VQ>KFIo;ONjaYFjhoX`mTn|>B7`4F4z<_)V{GxzMZZrYGRpuTA+RUA>o}8gNt6X&w)t7D z$mFd3W(vG$4A9rb2Uk!V?ut4?*BEnP@p~IJuTV>aq%alN)`Q-eh((e2~ z;f~2l=gGPgqck))WeU=tQuW}9L??P)3(k3U$QQ=qlJDSRWkO@}re)|wlYED{)Xl0J5X5CM9MKN%`Dxy#DB7PlTc0E z_W`4HA#ypLW3LYPXthDD0TX#5Q@mu@LzZ`5DiM<--`vJ^XS#a3arwS5QQM>3%84{LV8 zYz{|ShLWF{6aJ9%>ok>8j?oGL)`)RFve>U<*!uq`xNQF$mtPS411|f!{-vFH0D4^^ z;y8mB(0!0z>)xEYjNdcQYzFNymj{=8C*;&A@Q{fEcXV;8MiDYKmEQ`Yob8t=>mjN9 zX6GLyO-~4B-2EIjkdGrO$B`G{MnxZ45>n(6!K3GcHV6cDFnR0G#mP#BNm8wI!PYrM zu~9CJV97OoO`71vN#SR(=i#f}?@KLTnV42>G%QMAntsD~K}Aa_A6`h_o=r#Z>G)=! zyaNZFEA$k(9qrog?N7z}7nx@6-=_LPsG!cWoUgxxX^x z32JM0K0X;g6so#$pXO&2)%antG8V5KH)()1Gf2EN%L#97OvamF5jgXPcHHzQjQq9& zMRdLai^l!5`ZPd}PI43jckqYtyBlb*DGo4iJ6{inp8Ceo=TrGD1+G(x;SJ4`cru>a zLkV=hRX$btxJhVrkMY) z(B)le^y_tzVfT8J)1@)?j*+URgY?#(LZ=xAPc@{@?n>Nvi05v~@+AHAEKNN#B%}eE z#WjtEy=(LZApEgT6USI6F@U!hOyF)*_RaR->_^&^=b70`?5@&8{C6Bh_@4^8!z(zy z=+P4&mX?R7+h5|Wy78FCYsU9kGMQ_?Xk()c5b3!c?;VnrFla}}TYPc$l0@BtrTavd zPMq!A-fa+!ol09Z+wk+7O)MxIJjNOLSNs=Z@eZk7LESpioI3?gzDkGFj?-`WNlIQh ze#M(K|9Skq=5ET2u`UWg+9Nl9fi5Fg38gSZ`<7=IsO#FlQATR|4|i6QD73u_{@*#S ze+SV2Gw#|H{WfZ^fd6jPdfWYj)UEg}bt_Ib+1kWxXNrs2Me6{08`Y7O#Xm>#WXPI= zZ2K?WOEKv)I!}KhB#6DPQr7b%W@d(^6)<+KsnGNNCR4^X*J@n9pU_Q5MusQAFJB_i zEhxE}Ejz7pj|(`o0$PSLUh9EdSK>lf+TnrVlXZ%DFENn@?UG-YxS&~zg)rnZ`9hah zz41trc+x(`q}m96sA7oy!6?x*HcPI7X-oECL#oKBWJK9j+CTIQ!teHG)rpiB;xbc6 z$6I{r1JY?iw`8gKHm=DvzaIRt?CvtW`6UOFlJGgE#%B~u&&8-w<+46Uw;lB#xIaKB zUHuTqh3E}l87BY9zr|)aaR6Dcg5LA!^6+|dcu0R}rvJ1hVNcx^Rn>ZR5%l0bF7E;=E6M&~ za4gsDiTJ^nTMZ|6Au#E?n%{avCfK|tyqNsW#utXVIGUE3fD`@^HvPtJK|1lry2raw zg-zlB2;-CoU;ltJ+%5qCcv?`IVRx3ak0D8V)#x&b#~BO>a}YL#cVCF%Cr)M|@5T$? zq#RwX4gPp(#)UtT45>;49=#@reK@{+T(g{h+ca?-9Qsbev4`wK1cQ8&yS$^#Cr{b$ zX+?>ffhLXsywG=7Pi4hcGF^BgRf6zBEm(gmVv>7<5Vfmfj``^OMjfcd4Zuxi z$ZZqBgX*)c_cuDNFH=im$@ywpJF;QWRr;U-P1o$I{>Oh7$NQIG4d=?_$-GF>*lP{+>zeD`Dvis` z_?!h~(axU#yBhwyBy`kJ&(#y7 z5_?^41+%o~>ff*>vO@~n$%I~2bowPq()$*4_ee)+Ww^c#;CBBZkHhZML)(A5&jp@> zX!sV0uOH*0uFk54-xWids@LP`5l{)(iZI=VjTZ+S7Pj5!_w}I((gx{b`0nn|+@@64 z7ivQf)~T}hZ0SRRw603~RvGHnNbwBwqS5!tZ{;b8yemZLJGir5@+Cd+s|~bc$inbN zaKg}_OvKT0=xRnhZ_WnHX^`@MXqN>i(E>i%x-1+BFYcGG(X3|ill7?lywH#V$YqxE zZeQr8FBTykA3krrhU>p24X;{SoME+8@gQM5iKgzWvwd=cg~vS8!F17F(;sRE*Nhky z&xy$qLGmH*3zg)_qrJcs4SRbYqZD24nYEmfUt`Hzjc9~5YRLdfVeUQYu&3MH`NNkf z{Ap~0t}?(Z606JiW7nc#oJ};pb@R=UI>_m6V6Z={o0MK+637bhsYP|5hf1aKkG?=v zsOHl`8*DD38&!etEgXdyZAgD14eHE1Wt3O;Ens`}t05e7l@Uz4|M`9ur+_G#NvB*y z5m3fF7K^{)G~3TEi8lKZqD*yq6*P0K;~f$J)Ao6%p@vq1m4ugD%2!~fVuwB&^2#hM z+q)F~meAcP3jZmfNrMBlR=_>KSQ$vW$KYf9GpE&_%BRHrJ;zJfdo0INxQZoH-N*FN%1C z@($sTj)i3o0LTUJ(6rMiF%Ae;5PZpN`d+@I+~DHZphsWgY`&&f%0OwIVgK9fA|GEr zdeP`0ZyTus_}9Xggm^@uqG)uBg>`9`_SoZ`Nh1+XFC=BjCp9dgvv1 z4CKC1V~Qsrrlhm#C30T&+45OlU+^{{Q+y^cw6FSGL~95vWq&|lOX9Vq#TK(?WzP7XwuZ@w|7E<g>@$qTXC_q{Lx;o8}f3t_IZ!#;m6 zFjnBX6UtR!^l1A~fQVEH-!y~!BlH)64$YJ>Agdq3Lr5kW9`J!UM;KZK`;@U8N0;(u zkqWOko-XB9xg40ulaY8oYmchZ%yYi5%d|5#xp-gbngdy+mvL#_2?YpvKEIu`4in)g z7z5$6ys_;RE9;&z8p!@O3S-^#AE=(6YzR)=HAF`gb88SjJI?DtLgSGhAY_cbO-$UVu8a*>@YL(F3im8Kp#S59x>n&?i7$ z|0l8+c~d++N=l&QOF^S;Vx=X}{a7+}_gzhLx*9M~ zK8V$BfI65dZVyWDOom3Kh9^Hd%-fI!=M@L-|?i$;IOdRZ{GO@q2)@}&3En0}+ z*kfS(poR^izb#l+zS&vWO;+VM7~!1VENUwfQ~zPLQZv~`r8ietMv=MeOm}%34^YEz(wUMCO0m% zvt}=d5v3+dXm+ZUvF>do)&MIVB|D~sT_}#NswJ>FgWt#gSgq}V*RfrsFLGS?4dd6>f=r>=<=N)8NR3&lRK$YSN!n3+{qTgzCL`!Qufi&D8G+*}jpfUN_@?7M{s;~C!n-{2N8EzeD=pZ&{Cw)-|HCIB$dcQRiO6{^#}e z3#V$~e~QqifQ4p(+g%a@RoV4d+cFh;$~FmR!WKx#r1eTd9}AO|K5bufrVv%7(#tal z!3K5C_m`h}j9#G;|8{bFb6uH7kt(Qa#P=@;T-fAtq)O9qgBZmF`4EmKQJdymN#XH( zO{QY;gz0J$d+Dk)wybJAU$lcQJEWpP>HD8~BAR#YlfU#GGji2{yIskiPZ#oYIJ{8d z6n_)@Gi~07A;jln?Vzq}zc4d!LxjA+UNycvpmiKQC@W+MCUe~#Rcz*xfmOA`8pJjK) zJlU`Pk8+rrga9=d^N`}G}JTU zEJ@ZvH0#M5sqzJAfC>MF-HIf*W?Wb;E;KBaxM^G3t~Ivb#A#&FT;(ZV`p#!nb%2ig z^*yg#f;)DO^xR^b;E85ak~eUayG}TS=Y4mYbUe`UYw(@vyFJ{cB;!eru`LLB^TX5{MHn# zT{I?+?B+)7*9?16_tu-Gr#_M|TPX8XIz2_p&V~aWCenb?09?U7P19 zwCbA`8um8B@wy8u`wkz+_pU3i6soF5G*|d;W$!s4rm+_m`SCBm7&wRY+u#X3PO3kW zy=a+$Hk068kd3sL3{MSPu>C91l%5u|yY^D=+Y6=c+g&%mGedz+tcHZlzjILTuZ{O! z)+Shf+fCJ8*x7Of@P>~#m^e5wFI2&Y;;$MtK=%mY_+dB8Ri(PVb3xT^1KIsYwyQH< z>G7cQYJ00Mi*$D$wHu!>k5U@{%K9c+At9-Tr6kGmYtZ_13n1KYo6>HB8^nlAR4z zU_T!(uj9R6VF=u5rLn_zIs$+4?s|<`i=*!?xE)>=R`tOHG=9oy$a-A*x8h@m$&{Z;mI zU3ju7;*+*#v|F63R}8(bmQw{#w$|98;j*i(6hBx@p^gYS43{7!EAt5crk_)9nD^|FPO9RXdfq;U>3qU&nm5g`~=sIV^OJN%+^G!BM5= z9kG~N+e0MT2+^9chH{}Njqj)E{5qto1>m78+^xKHMZ&`84w9q6hBcISe!cH@iV;Oh z;>yTU*!NfoBJc`PG`lnRWE9oNC+X$7=W60(rzy{M4mWuWZqmKarp2erl}HsBt2=xx zEItr7>yA2-ze1c4^^>3X&5vF@g+`v}aM<_COVgl(w`&yZm2r1<0|v9as58#53B z30mLAn~RqfC4m`!^d~;>`L6LDJ=#o0D$``pd}*(0+)|Ag_5QZp)6J2(o8#wot5D9j z3DjCn?@Oj`Gil(>7^Kxw6R)#dy3=WAZ=0$o%I!c5-g+ombg%>m#MPS9%gw0<{jt0Gr@-gLZlHbUW?6WI)_>FBs4{HYX?VdY}uq_-=~H@*Pyr-IHJOQeEP>-_wclLfF&JAPP7xZb#=OC!I$O^p3e&@I7Oxg zhp*_gTnB{yC17!jrxHty0EbA?iEa4(1YrfuCHL1qo8sH@h-{dW%(P zE}Fxjq&Y~7-%AwMSb%f+n!4ODWa0EI+;esI#t&*sTI4(0lC+QUYTLk!w?p1?wZAm< z$}(xjI=NRoWw5voSneFfD)XNew(UGgTYdt{|I=`Wi+eTqtP)Td`L0(=FHAzx_(aJk zm3WqG?9@>=M)}|61SCno@2nscYpph!7aty>S69!$iIa^k*}P6Gz%RW(w^i;b7b%(q F{XhGK8N>hp literal 0 HcmV?d00001 diff --git a/.gitbook/assets/cecjing.png b/.gitbook/assets/cecjing.png new file mode 100644 index 0000000000000000000000000000000000000000..3ad3ae2bff90f0c6e4bec9f771d75dbf0748b81a GIT binary patch literal 19191 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 M2u{{jR^*g_06`Z&UjP6A literal 0 HcmV?d00001 diff --git a/.gitbook/assets/cectable2 (1).png b/.gitbook/assets/cectable2 (1).png new file mode 100644 index 0000000000000000000000000000000000000000..62c1e8610e36cc20b6e78f43de2e54eefe4321dd GIT binary patch literal 12049 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 B;r{>t literal 0 HcmV?d00001 diff --git a/.gitbook/assets/cectable2.png b/.gitbook/assets/cectable2.png new file mode 100644 index 0000000000000000000000000000000000000000..62c1e8610e36cc20b6e78f43de2e54eefe4321dd GIT binary patch literal 12049 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 B;r{>t literal 0 HcmV?d00001 diff --git a/.gitbook/assets/cectable3.png b/.gitbook/assets/cectable3.png new file mode 100644 index 0000000000000000000000000000000000000000..fe7352cfbed9b483d691fb64ccb4bd56231c6e58 GIT binary patch literal 7517 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 Cq3T@# literal 0 HcmV?d00001 diff --git a/.gitbook/assets/image.png b/.gitbook/assets/image.png new file mode 100644 index 0000000000000000000000000000000000000000..1c9d5ba872a18a6e812e72df6dfff37f5e8c0a2c GIT binary patch literal 50552 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 literal 0 HcmV?d00001 diff --git a/.gitbook/assets/lending-user-flow.jpg b/.gitbook/assets/lending-user-flow.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d54d67ec0dd34e697c8941f7e6d8dfc34ba2dd8a GIT binary patch literal 29954 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 literal 0 HcmV?d00001 diff --git a/.gitbook/assets/liquidity (2) (2) (2) (2) (2) (2) (2) (1).png b/.gitbook/assets/liquidity (2) (2) (2) (2) (2) (2) (2) (1).png new file mode 100644 index 0000000000000000000000000000000000000000..a4ab9478a2e465f66caf8edeca187db964599cd7 GIT binary patch literal 6347 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 + Equations are smart contracts which handles rebalancing of the Pool. It is the + integral component of maintaining pool. It allows creation of any rebalancing + strategies to be deployed as a pool. +--- + +# Equations + +## Weighted Equation + + Weighted Equation is an implementation of pool maintaining logic, which balances the ration between two tokens one each pool with unique logic of ALEX. It is a basically fork of Balancer, which mainly uses constant product AMM but for ALEX, weight follows [Black & Scholes delta](https://en.wikipedia.org/wiki/Black–Scholes_model). Details can be found on our whitepaper and [here](https://docs.alexgo.io/protocol/platform-architecture-that-supports-ecosystem-development#weighted-equation). Developers can use `(contract-call?)` for using this weighted equation anywhere in the smart contract. + +### **get-y-given-x** + +**Prototype:** + +`(define-read-only (get-y-given-x (balance-x) (balance-y) (weight-x) (weight-y) (dy))` + +**Input:** `uint uint uint uint uint` + +**Output:** `bool | uint` + +Get the appropriate value of dy from given dx which maintains the balance of given pool. + +``` +$ Usage +``` + +### **get-x-given-y** + +**Prototype:** + +`(define-read-only (get-x-given-y (balance-x) (balance-y) (weight-x) (weight-y) (dx))` + +**Input:** `uint uint uint uint uint` + +**Output:** `bool | uint` + +Get the appropriate value of dx from given dy which maintains the balance of given pool. + +``` +$ Usage +``` + +### **get-**x-given-price + +**Prototype:** + +`(define-read-only (get-x-given-price (balance-x) (balance-y) (weight-x) (weight-y) (price))` + +**Input:** `uint uint uint uint uint` + +**Output:** `bool | uint` + +Get the appropriate value of dx from given price which maintains the balance of given pool. + +``` +$ Usage +``` + +### **get-**token-given-position + +**Prototype:** + +`(define-read-only (get-token-given-position (balance-x) (balance-y) (weight-x) (weight-y) (total-supply) (dx) (dy))` + +**Input:** `uint uint uint uint uint uint uint` + +**Output:** `bool | uint` + +Get the appropriate value of token from given parameters which maintains the balance of given pool. + +``` +$ Usage +``` + +### **get-**position-given-mint + +**Prototype:** + +`(define-read-only (get-position-given-mint (balance-x) (balance-y) (weight-x) (weight-y) (total-supply) (token))` + +**Input:** `uint uint uint uint uint` + +**Output:** `bool | uint` + +Get the appropriate position value \(dx and dy\) from given parameters such as minted amount and total supply which maintains the balance of given pool. + +``` +$ Usage +``` + +### **get-**position-given-burn + +**Prototype:** + +`(define-read-only (get-position-given-burn (balance-x) (balance-y) (weight-x) (weight-y) (total-supply) (token))` + +**Input:** `uint uint uint uint uint` + +**Output:** `bool | uint` + +Identical to `get-position-given-mint` since it is reverse of calculation. + +``` +$ Usage +``` + + + diff --git a/developers/smart-contracts/apis/pools.md b/developers/smart-contracts/apis/pools.md new file mode 100644 index 0000000..31acb86 --- /dev/null +++ b/developers/smart-contracts/apis/pools.md @@ -0,0 +1,1286 @@ +--- +description: >- + Pools are smart contracts which handles the logic of swaps and liquidity + addition & removal. They handle logic of dynamic trading strategies. Check + Pool Protocol for details. +--- + +# Pools + +* [Fixed Weight Pool](pools.md#fixed-weight-pool) +* [Collateral Rebalancing Pool](pools.md#collateral-rebalancing-pool) +* [Yield Token Pool](pools.md#fixed-weight-pool-1) +* [Liquidity Bootstrapping Pool](pools.md#liquidity-bootstrapping-pool) + +## Fixed Weight Pool + + Fixed weight pool is a tactical template which can be used as a reference for developers to use as a template on future works. Unlike Balancer or UniSwap, our weighted equation do allow dynamic weighting which depends on [Black & Scholes delta](https://en.wikipedia.org/wiki/Black–Scholes_model). Therefore, we have forked a fixed weight pool from Balancer, but appropriately modified solidity to clarity language : + + + +### **get-pool-count** + +**Prototype:** + +`(define-read-only (get-pool-count))` + +**Input:** `void` + +**Output:** `bool | uint` + +Get the number of currently existing pools. + +``` +$ Usage +``` + + + +### **get-pools** + +**Prototype:** + +`(define-read-only (get-pools))` + +**Input:** `void` + +**Output:** `bool | uint` + +Get the list of currently existing pools. + +``` +$ Usage +``` + + + +### **get-pool-details** + +**Prototype:** + +`(define-read-only (get-pool-details (token-x-trait) (token-y-trait) (weight-x) (weight-y))` + +**Input:** `, , uint, uint` + +**Output:** `bool | uint` + +Gets the details of pool which matches the given parameter. Notice that pools are predefined map data structure, using token traits and weights as key and various detailed attributes as values. + +``` +$ Usage +``` + +### **get-pool-contracts** + +**Prototype:** + +`(define-read-only (get-pool-contracts (pool-id))` + +**Input:** `uint` + +**Output:** `bool | uint` + +Gets the details of pool using pool id. Notice that pools are predefined map data structure, using token traits and weights as key and various detailed attributes as values. + +``` +$ Usage +``` + + + +### **create-pool** + +**Prototype:** + +`(define-public (create-pool (token-x-trait) (token-y-trait) (weight-x) (weight-y) (the-pool-token) (the-vault) (dx) (dy))` + +**Input:** `, , uint, uint, , , uint, uint` + +**Output:** `bool | uint` + +Creates a pool using the given parameter. Created pool can be reached through the unique id which is allocated through this function. dx and dy is initially added to the created pool. + +``` +$ Usage +``` + + + +### **add-to-position** + +**Prototype:** `(define-public (add-to-position (token-x-trait) (token-y-trait) (weight-x) (weight-y) (the-pool-token) (the-vault) (dx) (dy))` + +**Input:** `, , uint, uint, , , uint, uint` + +**Output:** `bool | uint` + +Add Liquidity to the given pool. First retrieve the existing pool with token traits, then add liquidity of x and y to the specified pool. Adding the liquidity to the pool should conform with equation. Liquidity Provider receives pool token as a reward, which represents the ownership of the liquidity provided pool. + +``` +$ Usage +``` + +### \*\*\*\* + +### **reduce-position** + +**Prototype:** `(define-public (reduce-position (token-x-trait) (token-y-trait) (weight-x) (weight-y) (the-pool-token) (the-vault) (percent))` + +**Input:** `, , uint, uint, , , uint` + +**Output:** `bool | uint` + + Remove Liquidity from the given pool. First retrieve the existing pool with token traits, then remove liquidity of x and y to the specified pool using the requested user \(tx-sender\)'s pool token. Removing the liquidity to the pool should conform with equation. Liquidity Provider receives corresponding dx and dy to his own vault while the used pool token is burnt. + +``` +$ Usage +``` + +### \*\*\*\* + +### **swap-x-for-y** + +**Prototype:**`(define-public (swap-x-for-y (token-x-trait) (token-y-trait) (weight-x) (weight-y) (the-equation) (dx))` + +**Input:** `, , uint, uint, , , uint` + +**Output:** `bool | uint` + +Allows swapping between the two tokens in a pool. With given dx, find the corresponding amount for swapping to dy using equation. Then conduct swapping by transferring between tx-sender and pool. + +``` +$ Usage +``` + + + +### **swap-y-for-x** + +**Prototype:**`(define-public (swap-x-for-y (token-x-trait) (token-y-trait) (weight-x) (weight-y) (the-equation) (dy))` + +**Input:** `, , uint, uint, , , uint` + +**Output:** `bool | uint` + +Allows swapping between the two tokens in a pool. With given dy, find the corresponding amount for swapping to dx using equation. Then conduct swapping by transferring between tx-sender and pool. + +``` +$ Usage +``` + +### **get-x-given-y** + +**Prototype:** `(define-read-only (get-x-given-y (token-x-trait ) (token-y-trait ) (weight-x ) (weight-y) (dy))` + +**Input:** `, , uint, uint, uint` + +**Output:** `bool | uint` + +Returns a dx which conforms the weighted equation using dy. This API is used to maintain the pool ratio using the equation and use to get an adequate amount of dy that corresponds to given dx. + +``` +$ Usage +``` + +### \*\*\*\* + +### **get-y-given-x** + +**Prototype:** `(define-read-only (get-x-given-y (token-x-trait ) (token-y-trait ) (weight-x ) (weight-y) (dx))` + +**Input:** `, , uint, uint, uint` + +**Output:** `bool | uint` + +Returns a dy which conforms the weighted equation using dx. This API is used to maintain the pool ratio using the equation and use to get an adequate amount of dx that corresponds to given dy. + +``` +$ Usage +``` + +### \*\*\*\* + +### **set-fee-to-address** + +**Prototype:** `(define-public (set-fee-to-address (token-x-trait ) (token-y-trait ) (weight-x) (weight-y) (address))` + +**Input:** `, , uint, uint, principal` + +**Output:** `bool | uint` + + Set the platform fee collector address of given pool. Platform fee gathered on each pool action will be collected to the given address after execution. + +``` +$ Usage +``` + +### **get-fee-to-address** + +**Prototype:** `(define-read-only (get-fee-to-address (token-x-trait ) (token-y-trait ) (weight-x ) (weight-y))` + +**Input:** `, , uint, uint` + +**Output:** `bool | uint` + + Get the platform fee collector address which is currently set on the given pool. + +``` +$ Usage +``` + +### **get-fees** + +**Prototype:** `(define-read-only (get-fees (token-x-trait ) (token-y-trait ) (weight-x ) (weight-y))` + +**Input:** `, , uint, uint` + +**Output:** `bool | uint` + + Get the current platform fee of given pool. + +``` +$ Usage +``` + +### collect-fees + +**Prototype:** `(define-public (collect-fees (token-x-trait ) (token-y-trait ) (weight-x ) (weight-y))` + +**Input:** `, , uint, uint` + +**Output:** `bool | uint` + + Collect the platform fee from the collector address which is set on the given pool. The balance of each token in collector address will be initialized back to zero. + +``` +$ Usage +``` + +### get-token-given-position + +**Prototype:** `(define-read-only (get-token-given-position (token-x-trait ) (token-y-trait ) (weight-x ) (weight-y) (dx) (dy))` + +**Input:** `, , uint, uint, uint, uint` + +**Output:** `bool | uint` + + Returns a token which conforms the weighted equation using dx and dy. This API is used to maintain the pool ratio using the equation and use to get token. + +``` +$ Usage +``` + +### get-x-given-price + +**Prototype:** `(define-read-only (get-x-given-price (token-x-trait ) (token-y-trait ) (weight-x ) (weight-y) (price))` + +**Input:** `, , uint, uint, uint` + +**Output:** `bool | uint` + + Returns a dx which conforms the weighted equation using price. This API is used to maintain the pool ratio using the equation and use to get an adequate amount of dx that corresponds to given price. + +``` +$ Usage +``` + +### get-position-given-mint + +**Prototype:** `(define-read-only (get-position-given-mint (token-x-trait ) (token-y-trait ) (weight-x ) (weight-y) (token))` + +**Input:** `, , uint, uint, uint` + +**Output:** `bool | uint` + + Returns a position which conforms the weighted equation using mint token. This API is used to maintain the pool ratio using the equation and use to get an adequate amount of dx and dy that corresponds to given token mint. Mainly wraps the weighted equation of 'get-position-given-mint' for the easy usage in smart contract. + +``` +$ Usage +``` + +### get-position-given-burn + +**Prototype:** `(define-read-only (get-position-given-burn (token-x-trait ) (token-y-trait ) (weight-x ) (weight-y) (token))` + +**Input:** `, , uint, uint, uint` + +**Output:** `bool | uint` + + Returns a position which conforms the weighted equation using burnt token. This API is used to maintain the pool ratio using the equation and use to get an adequate amount of dx and dy that corresponds to given token burn. Mainly wraps the weighted equation of 'get-position-given-burn' for the easy usage in smart contract. + +``` +$ Usage +``` + +## Collateral Rebalancing Pool + +Collateral Rebalancing pool is a pool which users inject their collateral and mint ayToken\(against Token\) which represents the proportional ownership of the pool. Unlike Fixed weight pool, pools can be identified with 'token', 'collateral' and 'expiry', where by using weighted equation, it is possible to obtain a weight dynamically for the various operations in collateral rebalancing pool. Dynamic weighting in this context depends on [Black & Scholes delta](https://en.wikipedia.org/wiki/Black–Scholes_model). Collateral Rebalancing pool is mainly used by Borrower and Arbitrageurs. You can find detailed use cases [here](https://docs.alexgo.io/protocol/collateral-rebalancing-pool). + +### **get-pool-count** + +**Prototype:** + +`(define-read-only (get-pool-count))` + +**Input:** `void` + +**Output:** `bool | uint` + +Get the number of currently existing pools. + +``` +$ Usage +``` + + + +### **get-pools** + +**Prototype:** + +`(define-read-only (get-pools))` + +**Input:** `void` + +**Output:** `bool | uint` + +Get the list of currently existing pools. + +``` +$ Usage +``` + + + +### **get-pool-details** + +**Prototype:** + +`(define-read-only (get-pool-details (token-x-trait) (token-y-trait) (weight-x) (weight-y))` + +**Input:** `, , uint, uint` + +**Output:** `bool | uint` + +Gets the details of pool which matches the given parameter. Notice that pools are predefined map data structure, using token traits and weights as key and various detailed attributes as values. + +``` +$ Usage +``` + +### **get-pool-contracts** + +**Prototype:** + +`(define-read-only (get-pool-contracts (pool-id))` + +**Input:** `uint` + +**Output:** `bool | uint` + +Gets the details of pool using pool id. Notice that pools are predefined map data structure, using token traits and weights as key and various detailed attributes as values. + +``` +$ Usage +``` + + + +### **get-weight-x** + +**Prototype:** + +`(define-read-only (get-weight-x (token) (collateral) (expiry))` + +**Input:** ` uint` + +**Output:** `bool | uint` + +Gets the parameter corresponding weight through the internal calculation. Weight retrieving formula is implemented inside this function. + +``` +$ Usage +``` + +### **create-pool** + +**Prototype:** + +`(define-public (create-pool (token) (collateral) (the-yield-token) (the-vault)(dx) (dy))` + +**Input:** `, ,, , uint, uint` + +**Output:** `bool | uint` + +Creates a pool using the given parameter. Created pool can be reached through the unique id which is allocated through this function. dx and dy is initially added to the created pool. + +``` +$ Usage +``` + + + +### **add-to-position** + +**Prototype:** `(define-public (add-to-position (token) (collateral) (expiry) (the-yield-token) (the-vault)(dx) (dy))` + +**Input:** `, , uint , , uint, uint` + +**Output:** `bool | uint` + +Adds Liquidity to the given pool. First retrieve the existing pool with token traits, then add liquidity of x and y to the specified pool. Adding the liquidity to the pool should conform with equation. Liquidity Provider receives ayToken as a reward, which represents the ownership of the liquidity provided pool. For example, borrower can inject collateral\(usda\) to the CRP pool and mint ayToken\(ayUsda\). + +``` +$ Usage +``` + +### \*\*\*\* + +### **reduce-position** + +**Prototype:** `(define-public (reduce-position (token) (collateral) (expiry) (the-yield-token) (the-vault) (percent))` + +**Input:** `, , uint, , , uint` + +**Output:** `bool | uint` + + Remove Liquidity from the given pool. First retrieve the existing pool with token traits, then remove liquidity of x and y to the specified pool using the requested user \(tx-sender\)'s pool token. Removing the liquidity to the pool should conform with equation. Liquidity Provider receives corresponding dx and dy to his own vault while the used pool token is burnt. + +``` +$ Usage +``` + +### \*\*\*\* + +### **swap-x-for-y** + +**Prototype:**`(define-public (swap-x-for-y (token) (collateral) (expiry) (the-vault) (dx))` + +**Input:** `, , uint, , uint` + +**Output:** `bool | uint` + +Allows swapping between the two tokens in a pool. With given dx, find the corresponding amount for swapping to dy using weighted equation. Then conduct swapping by transferring between tx-sender and pool. For the CRP use cases, arbitrageurs uses to gain profit by swapping in the pool. + +``` +$ Usage +``` + + + +### **swap-y-for-x** + +**Prototype:**`(define-public (swap-y-for-x (token) (collateral) (expiry) (the-vault) (dy))` + +**Input:** `, , uint, , uint` + +**Output:** `bool | uint` + +Allows swapping between the two tokens in a pool. With given dy, find the corresponding amount for swapping to dx using weighted equation. Then conduct swapping by transferring between tx-sender and pool. For the CRP use cases, arbitrageurs uses to gain profit by swapping in the pool. + +``` +$ Usage +``` + +### **get-x-given-y** + +**Prototype:** `(define-read-only (get-x-given-y (token) (collateral) (expiry) (dy))` + +**Input:** `, , uint, uint` + +**Output:** `bool | uint` + +Returns a dx which conforms the weighted equation using dy. This API is used to maintain the pool ratio using the equation and use to get an adequate amount of dx that corresponds to given dy. + +``` +$ Usage +``` + +### \*\*\*\* + +### **get-y-given-x** + +**Prototype:** `(define-read-only (get-x-given-y (token) (collateral) (expiry) (dx))` + +**Input:** `, , uint, uint` + +**Output:** `bool | uint` + +Returns a dy which conforms the weighted equation using dx. This API is used to maintain the pool ratio using the equation and use to get an adequate amount of dy that corresponds to given dx. + +``` +$ Usage +``` + +### \*\*\*\* + +### **set-fee-to-address** + +**Prototype:** `(define-public (set-fee-to-address (token) (collateral) (expiry) (address))` + +**Input:** `, , uint, principal` + +**Output:** `bool | uint` + + Set the platform fee collector address of given pool. Platform fee gathered on each pool action will be collected to the given address after execution. + +``` +$ Usage +``` + +### **get-fee-to-address** + +**Prototype:** `(define-read-only (get-fee-to-address (token) (collateral) (expiry))` + +**Input:** `, , uint` + +**Output:** `bool | uint` + + Get the platform fee collector address which is currently set on the given pool. + +``` +$ Usage +``` + +### **get-fees** + +**Prototype:** `(define-read-only (get-fees (token) (collateral) (expiry))` + +**Input:** `, , uint` + +**Output:** `bool | uint` + + Get the current platform fee of given pool. + +``` +$ Usage +``` + +### collect-fees + +**Prototype:** `(define-public (collect-fees (token) (collateral) (expiry))` + +**Input:** `, , uint` + +**Output:** `bool | uint` + + Collect the platform fee from the collector address which is set on the given pool. The balance of each token in collector address will be initialized back to zero. + +``` +$ Usage +``` + +### get-token-given-position + +**Prototype:** `(define-read-only (get-token-given-position (token) (collateral) (expiry) (dx) (dy))` + +**Input:** `, , uint, uint, uint` + +**Output:** `bool | uint` + + Returns a token which conforms the weighted equation using dx and dy. This API is used to maintain the pool ratio using the equation and use to get token. + +``` +$ Usage +``` + +### get-x-given-price + +**Prototype:** `(define-read-only (get-x-given-price (token) (collateral) (expiry) (price))` + +**Input:** `, , uint, uint` + +**Output:** `bool | uint` + + Returns a dx which conforms the weighted equation using price. This API is used to maintain the pool ratio using the equation and use to get an adequate amount of dx that corresponds to given price. + +``` +$ Usage +``` + +### get-position-given-mint + +**Prototype:** `(define-read-only (get-position-given-mint (token) (collateral) (expiry) (shares))` + +**Input:**`, , uint, uint` + +**Output:** `bool | uint` + + Returns a position which conforms the weighted equation using amount of minted token. This API is used to maintain the pool ratio using the equation and use to get an adequate amount of dx and dy that corresponds to given token mint. Mainly wraps the weighted equation of 'get-position-given-mint' for the easy usage in smart contract. + +``` +$ Usage +``` + +### get-position-given-burn + +**Prototype:** `(define-read-only (get-position-given-burn (token) (collateral) (expiry) (shares))` + +**Input:** `, , uint, uint` + +**Output:** `bool | uint` + + Returns a position which conforms the weighted equation using amount of burnt token. This API is used to maintain the pool ratio using the equation and use to get an adequate amount of dx and dy that corresponds to given token burn. Mainly wraps the weighted equation of 'get-position-given-burn' for the easy usage in smart contract. + +``` +$ Usage +``` + +## + + + +## Yield Token Pool + + Yield Token Pool is the main pool which all the entities \(Arbitrageurs, Borrower, Lender and LP\) exerts their own influence. On swapping in yield token pool, users should pay the platform fee which to the pre-designated address. Each pair of tokens have its own unique yield token pool contract. For details please check our [whitepaper](https://docs.alexgo.io/whitepaper/automated-market-making-of-alex). + +### **get-max-expiry** + +**Prototype:** + +`(define-read-only (get-max-expiry))` + +**Input:** `void` + +**Output:** `bool | uint` + +Get the maximum expiry of current Yield Token Pool + +``` +$ Usage +``` + +### **get-t** + +**Prototype:** + +`(define-read-only (get-t (expiry)))` + +**Input:** `uint` + +**Output:** `bool | uint` + +Get the computed value of given expiry for the usage in yield token equation + +``` +$ Usage +``` + +### **get-pool-count** + +**Prototype:** + +`(define-read-only (get-pool-count))` + +**Input:** `void` + +**Output:** `bool | uint` + +Get the number of currently existing pools. + +``` +$ Usage +``` + + + +### **get-pools** + +**Prototype:** + +`(define-read-only (get-pools))` + +**Input:** `void` + +**Output:** `bool | uint` + +Get the list of currently existing yield token pools. + +``` +$ Usage +``` + + + +### **get-pool-details** + +**Prototype:** + +`(define-read-only (get-pool-details (token-x-trait))` + +**Input:** `` + +**Output:** `bool | uint` + +Gets the details of yield token pool which matches the given token trait. Notice that pools are predefined map data structure, using token traits and weights as key and various detailed attributes as values. + +``` +$ Usage +``` + +### **get-pool-contracts** + +**Prototype:** + +`(define-read-only (get-pool-contracts (pool-id))` + +**Input:** `uint` + +**Output:** `bool | uint` + +Gets the details of yield token pool using pool id. Notice that pools are predefined map data structure, using token traits and weights as key and various detailed attributes as values. + +``` +$ Usage +``` + + + +### **create-pool** + +**Prototype:** + +`(define-public (create-pool (token-x-trait) (token-y-trait) (the-pool-token) (the-vault) (dx) (dy))` + +**Input:** `, , , , uint, uint` + +**Output:** `bool | uint` + +Create a yield-token pool using the given parameter. Created pool can be reached through the unique id which is allocated through this function. dx and dy is initially added to the created pool. + +``` +$ Usage +``` + +### **add-to-position** + +**Prototype:** `(define-public (add-to-position (token-x-trait)(the-pool-token) (the-vault) (dx) (dy))` + +**Input:** `, , , , uint, uint` + +**Output:** `bool | uint` + +Add Liquidity to the given pool. First retrieve the existing pool with token traits, then add liquidity of x and y to the specified pool. Adding the liquidity to the pool should conform with equation. Liquidity Provider receives pool token as a reward, which represents the ownership of the liquidity provided pool. + +``` +$ Usage +``` + +### \*\*\*\* + +### **reduce-position** + +**Prototype:** `(define-public (reduce-position (token-x-trait) (token-y-trait), (the-pool-token) (the-vault) (percent))` + +**Input:** `, , , , uint` + +**Output:** `bool | uint` + + Remove Liquidity from the given pool. First retrieve the existing pool with token traits, then remove liquidity of x and y to the specified pool using the requested user \(tx-sender\)'s pool token. Removing the liquidity to the pool should conform with equation. Liquidity Provider receives corresponding dx and dy to his own vault while the used pool token is burnt. + +``` +$ Usage +``` + +### \*\*\*\* + +### **swap-x-for-y** + +**Prototype:**`(define-public (swap-x-for-y (token-x-trait) (token-y-trait) (the-vault) (dx))` + +**Input:** `, , , uint` + +**Output:** `bool | uint` + +Allows swapping between yield token and target token in a pool. With given dx, find the corresponding amount for swapping to dy using equation. Then conduct swapping by transferring between tx-sender and pool. + +``` +$ Usage +``` + + + +### **swap-y-for-x** + +**Prototype:**`(define-public (swap-y-for-x (token-x-trait) (token-y-trait) (the-vault) (dy))` + +**Input:** `, , , uint` + +**Output:** `bool | uint` + +Allows swapping between yield token and target token in pool. With given dy, find the corresponding amount for swapping to dx using equation. Then conduct swapping by transferring between tx-sender and pool. + +``` +$ Usage +``` + + **get-x-given-y** + +**Prototype:** `(define-read-only (get-x-given-y (token-x-trait) (dy))` + +**Input:** ` uint` + +**Output:** `bool | uint` + +Returns a dx which conforms the weighted equation using dy. This API is used to maintain the pool ratio using the equation and use to get an adequate amount of dx that corresponds to given dy. + +``` +$ Usage +``` + +### \*\*\*\* + +### **get-y-given-x** + +**Prototype:** `define-read-only (get-y-given-x (token-x-trait) (dx))` + +**Input:** `, uint` + +**Output:** `bool | uint` + +Returns a dy which conforms the weighted equation using dx. This API is used to maintain the pool ratio using the equation and use to get an adequate amount of dy that corresponds to given dx. + +``` +$ Usage +``` + +### \*\*\*\* + +### **set-fee-to-address** + +**Prototype:** `(define-public (set-fee-to-address (token-x-trait) (address))` + +**Input:** `, principal` + +**Output:** `bool | uint` + + Set the platform fee collector address of given yield token pool. Platform fee gathered on each pool action will be collected to the given address after execution. + +``` +$ Usage +``` + +### **get-fee-to-address** + +**Prototype:** `(define-read-only (get-fee-to-address (token-x-trait))` + +**Input:** `` + +**Output:** `bool | uint` + + Get the platform fee collector address which is currently set on the yield token pool. + +``` +$ Usage +``` + +### **get-fees** + +**Prototype:** `(define-read-only (get-fees (token-x-trait))` + +**Input:** `` + +**Output:** `bool | uint` + + Get the current platform fee of given yield token pool. + +``` +$ Usage +``` + +### collect-fees + +**Prototype:** `(define-public (collect-fees (token-x-trait) (token-xy-trait))` + +**Input:** `, ` + +**Output:** `bool | uint` + + Collect the platform fee from the collector address which is set on the given pool. The balance of each token in collector address will be initialized back to zero. + +``` +$ Usage +``` + +### get-token-given-position + +**Prototype:** `(define-read-only (get-token-given-position (token-x-trait) (dx))` + +**Input:** `, uint` + +**Output:** `bool | uint` + + Returns a token which conforms the weighted equation using dx and yield token. This API is used to maintain the pool ratio using the yield token equation and use to get token. + +``` +$ Usage +``` + +### get-x-given-price + +**Prototype:** `(define-read-only (get-x-given-price (token-x-trait) (price))` + +**Input:** `, uint` + +**Output:** `bool | uint` + + Returns a dx which conforms the yield token equation using price. This API is used to maintain the pool ratio using the equation and use to get an adequate amount of dx that corresponds to given price. + +``` +$ Usage +``` + +### get-position-given-mint + +**Prototype:** `(define-read-only (get-position-given-mint (token-x-trait) (shares))` + +**Input:**`, uint` + +**Output:** `bool | uint` + + Returns a position which conforms the yield token equation using amount of minted token. This API is used to maintain the pool ratio using the equation and use to get an adequate amount of dx and dy that corresponds to given token mint. Mainly wraps the yield token equation of 'get-position-given-mint' for the easy usage in smart contract. + +``` +$ Usage +``` + +### get-position-given-burn + +**Prototype:** `(define-read-only (get-position-given-burn (get-position-given-mint (token-x-trait) (shares))` + +**Input:** `, uint` + +**Output:** `bool | uint` + + Returns a position which conforms the yield token equation using amount of burnt token. This API is used to maintain the pool ratio using the equation and use to get an adequate amount of dx and dy that corresponds to given token burn. Mainly wraps the yield token equation of 'get-position-given-burn' for the easy usage in smart contract. + +``` +$ Usage +``` + + + + + + + +## Liquidity Bootstrapping Pool + +Liquidity Bootstrapping pool is used for initializing all Yield Token Pools, which makes ayToken as a base token and Token to become a target Token. Detailed use cases and explanation can be ion our [White Paper](https://app.gitbook.com/@alexgo-io/s/docs/protocol/liquidity-bootstrapping-pool). + +### **get-pool-count** + +**Prototype:** + +`(define-read-only (get-pool-count))` + +**Input:** `void` + +**Output:** `bool | uint` + +Get the number of currently existing pools. + +``` +$ Usage +``` + + + +### **get-pools** + +**Prototype:** + +`(define-read-only (get-pools))` + +**Input:** `void` + +**Output:** `bool | uint` + +Get the list of currently existing pools. + +``` +$ Usage +``` + + + +### **get-pool-details** + +**Prototype:** + +`(define-read-only (get-pool-details (token-x-trait) (token-y-trait) (expiry))` + +**Input:** `, , uint, uint` + +**Output:** `bool | uint` + +Gets the details of pool which matches the given parameter. Notice that pools are predefined map data structure, using token traits and weights as key and various detailed attributes as values. + +``` +$ Usage +``` + +### **get-pool-contracts** + +**Prototype:** + +`(define-read-only (get-pool-contracts (pool-id))` + +**Input:** `uint` + +**Output:** `bool | uint` + +Gets the details of pool using pool id. Notice that pools are predefined map data structure, using token traits and weights as key and various detailed attributes as values. + +``` +$ Usage +``` + + + +### **get-weight-x** + +**Prototype:** + +`(define-read-only (get-weight-x (token-x-trait) (token-y-trait) (expiry))` + +**Input:** ` uint` + +**Output:** `bool | uint` + +Gets the parameter corresponding weight through the internal calculation. Weight retrieving formula is implemented inside this API. + +``` +$ Usage +``` + +### **create-pool** + +**Prototype:** + +`(define-public (create-pool (token-x-trait) (token-y-trait) (weight-x-0) (weight-x-1) (expiry) (the-pool-token) (the-vault) (dx) (dy))` + +**Input:** `, , uint, uint, uint, , , uint, uint` + +**Output:** `bool | uint` + +Creates a pool using the given parameter. Created pool can be reached through the unique id which is allocated through this function. dx and dy is initially added to the created pool. + +``` +$ Usage +``` + + + +### **add-to-position** + +**Prototype:** `(define-public (add-to-position (token-x-trait) (token-y-trait) (expiry) (the-pool-token) (the-vault) (dx) (dy))` + +**Input:** `, , uint, , , uint, uint` + +**Output:** `bool | uint` + +Adds Liquidity to the given pool. First retrieve the existing pool with token traits, then add liquidity of x and y to the specified pool. Adding the liquidity to the pool should conform with equation. Liquidity Provider receives ayToken as a reward, which represents the ownership of the liquidity provided pool. + +``` +$ Usage +``` + +### \*\*\*\* + +### **reduce-position** + +**Prototype:** `(define-public (reduce-position (token-x-trait) (token-y-trait) (expiry) (the-pool-token) (the-vault) (percent))` + +**Input:** `, , uint, , , uint` + +**Output:** `bool | uint` + + Remove Liquidity from the given pool. First retrieve the existing pool with token traits, then remove liquidity of x and y to the specified pool using the requested user \(tx-sender\)'s pool token. Removing the liquidity to the pool should conform with equation. Liquidity Provider receives corresponding dx and dy to his own vault while the used pool token is burnt. + +``` +$ Usage +``` + +### \*\*\*\* + +### **swap-x-for-y** + +**Prototype:**`(define-public (swap-x-for-y (token-x-trait) (token-y-trait) (expiry) (the-vault) (dy))` + +**Input:** `, , uint, , uint` + +**Output:** `bool | uint` + +Allows swapping between the two tokens in a pool. With given dx, find the corresponding amount for swapping to dy using weighted equation. Then conduct swapping by transferring between tx-sender and pool. + +``` +$ Usage +``` + + + +### **swap-y-for-x** + +**Prototype:**`(define-public (swap-y-for-x (token-x-trait) (token-y-trait) (expiry) (the-vault) (dx))` + +**Input:** `, , uint, , uint` + +**Output:** `bool | uint` + +Allows swapping between the two tokens in a pool. With given dy, find the corresponding amount for swapping to dx using weighted equation. Then conduct swapping by transferring between tx-sender and pool. + +``` +$ Usage +``` + + + +### **collect-fees** + +**Prototype:**`(define-public (collect-fees (token-x-trait) (token-y-trait) (expiry))` + +**Input:** `, , uint` + +**Output:** `bool | uint` + +Collects the accrued platform fee. Transaction occurs from pool to designated fee-to-address principal. As a result, platform fees collected in pool \(fee-balance\) is reseted to zero. + +``` +$ Usage +``` + +### \*\*\*\* + +### **get-x-given-y** + +**Prototype:** `(define-read-only (get-x-given-y (token-x-trait) (token-y-trait) (expiry) (dy))` + +**Input:** `, , uint, uint` + +**Output:** `bool | uint` + +Returns a dx which conforms the weighted equation using dy. This API is used to maintain the pool ratio using the equation and use to get an adequate amount of dx that corresponds to given dy. + +``` +$ Usage +``` + +### \*\*\*\* + +### **get-y-given-x** + +**Prototype:** `(define-read-only (get-x-given-y (token-x-trait) (token-y-trait) (expiry) (dx))` + +**Input:** `, , uint, uint` + +**Output:** `bool | uint` + +Returns a dy which conforms the weighted equation using dx. This API is used to maintain the pool ratio using the equation and use to get an adequate amount of dy that corresponds to given dx. + +``` +$ Usage +``` + +### \*\*\*\* + +### **set-fee-to-address** + +**Prototype:** `(define-public (set-fee-to-address (token-x-trait) (token-y-trait) (expiry) (address))` + +**Input:** `, , uint, principal` + +**Output:** `bool | uint` + + Set the platform fee collector address of given pool. Platform fee gathered on each pool action will be collected to the given address after execution. + +``` +$ Usage +``` + +### **get-fee-to-address** + +**Prototype:** `(define-read-only (get-fee-to-address (token-x-trait) (token-y-trait) (expiry))` + +**Input:** `, , uint` + +**Output:** `bool | uint` + + Get the platform fee collector address which is currently set on the given pool. + +``` +$ Usage +``` + +### **get-fees** + +**Prototype:** `(define-read-only (get-fees (token-x-trait) (token-y-trait) (expiry))` + +**Input:** `, , uint` + +**Output:** `bool | uint` + + Get the current platform fee of given pool. + +``` +$ Usage +``` + +### get-token-given-position + +**Prototype:** `(define-read-only (get-token-given-position (token-x-trait) (token-y-trait) (expiry) (dx) (dy))` + +**Input:** `, , uint, uint, uint` + +**Output:** `bool | uint` + + Returns a token which conforms the weighted equation using dx and dy. This API is used to maintain the pool ratio using the equation and use to get token. + +``` +$ Usage +``` + +### get-x-given-price + +**Prototype:** `(define-read-only (get-x-given-price (token-x-trait) (token-y-trait) (expiry) (price))` + +**Input:** `, , uint, uint` + +**Output:** `bool | uint` + + Returns a dx which conforms the weighted equation using price. This API is used to maintain the pool ratio using the equation and use to get an adequate amount of dx that corresponds to given price. + +``` +$ Usage +``` + +### get-position-given-mint + +**Prototype:** `(define-read-only (get-position-given-mint (token-x-trait) (token-y-trait) (expiry) (shares))` + +**Input:**`, , uint, uint` + +**Output:** `bool | uint` + + Returns a position which conforms the weighted equation using amount of minted token. This API is used to maintain the pool ratio using the equation and use to get an adequate amount of dx and dy that corresponds to given token mint. Mainly wraps the weighted equation of 'get-position-given-mint' for the easy usage in smart contract. + +``` +$ Usage +``` + +### get-position-given-burn + +**Prototype:** `(define-read-only (get-position-given-burn (token-x-trait) (token-y-trait) (expiry) (shares))` + +**Input:** `, , uint, uint` + +**Output:** `bool | uint` + + Returns a position which conforms the weighted equation using amount of burnt token. This API is used to maintain the pool ratio using the equation and use to get an adequate amount of dx and dy that corresponds to given token burn. Mainly wraps the weighted equation of 'get-position-given-burn' for the easy usage in smart contract. + +``` +$ Usage +``` + + + diff --git a/developers/smart-contracts/apis/vault.md b/developers/smart-contracts/apis/vault.md new file mode 100644 index 0000000..c60237a --- /dev/null +++ b/developers/smart-contracts/apis/vault.md @@ -0,0 +1,61 @@ +--- +description: >- + Vault is smart contract that holds and manages the assets of all pools. It + keeps assets managed by other external contracts such as pool. Also, users can + trigger flash loan from vault. +--- + +# Vault + +## ALEX-Vault + +Vault is responsible for managing assets of all ALEX pools. Transaction in all the existing pools can be found in [Vault Protocol](https://docs.alexgo.io/protocol/vault). + +### **get-balance** + +**Prototype:** + +`(define-read-only (get-balance (token)))` + +**Input:** `principal` + +**Output:** `bool | uint` + +Get the balance of `tx-sender` of given token from vault. parameter "token'' should be an implemented token, which returns balance internally using `ft-get-balance` + +``` +$ Usage +``` + +### **get-balances** + +**Prototype:** + +`(define-read-only (get-balances)` + +**Input:** `void` + +**Output:** `bool | uint` + +Get the all the list of \(token, value\) object of `tx-sender` + +``` +$ Usage +``` + +### **flash-loan** + +**Prototype:** + +`(define-public (flash-loan (flash-loan-user) (token1) (token2) (token3)) (amount1) (amount2) (amount3)) | (flash-loan (flash-loan-user) (token1) (token2) (amount1) (amount2))` + +**Input:** `, , , uint, uint, uint | , , uint, uint` + +**Output:** `bool | uint` + +Executes flash loan up to 3 tokens of amounts specified. User can only make 2 token inputs if executing in single pool, while can also make 3 token inputs for executing flash loan two different pools. It first transfers each tokens to user, then execute flash loan by triggering `execute` function. Validating the exact amount of returned loan is followed by execution. For the detailed use cases, check [Flash Loan Protocol](https://docs.alexgo.io/protocol/vault#flash-loan). + +``` +$ Usage +``` + diff --git a/developers/smart-contracts/diagrams/README.md b/developers/smart-contracts/diagrams/README.md new file mode 100644 index 0000000..ff3d934 --- /dev/null +++ b/developers/smart-contracts/diagrams/README.md @@ -0,0 +1,2 @@ +# UML Diagrams + diff --git a/developers/smart-contracts/diagrams/class-diagram.md b/developers/smart-contracts/diagrams/class-diagram.md new file mode 100644 index 0000000..1ea03d1 --- /dev/null +++ b/developers/smart-contracts/diagrams/class-diagram.md @@ -0,0 +1,4 @@ +# Class Diagram + +![](https://yuml.me/alexgo/alex-v1-class.svg) + diff --git a/developers/smart-contracts/diagrams/protocol-use-case.md b/developers/smart-contracts/diagrams/protocol-use-case.md new file mode 100644 index 0000000..99c7dfb --- /dev/null +++ b/developers/smart-contracts/diagrams/protocol-use-case.md @@ -0,0 +1,30 @@ +# Use Case + +## Lender + +![](https://raw.githubusercontent.com/alexgo-io/alex-v1/main/diagrams/use-case-lender.svg) + +## Borrower creating a loan + +![](https://raw.githubusercontent.com/alexgo-io/alex-v1/main/diagrams/use-case-borrower.svg) + +## Borrower repaying a loan + +![](https://raw.githubusercontent.com/alexgo-io/alex-v1/main/diagrams/use-case-borrower-repay.svg) + +## Liquidity Provider + +![](https://raw.githubusercontent.com/alexgo-io/alex-v1/main/diagrams/use-case-lp.svg) + +## Arbitrageur + +![](https://raw.githubusercontent.com/alexgo-io/alex-v1/main/diagrams/use-case-arbitrageur.svg) + +## Fee Collector + +![](https://raw.githubusercontent.com/alexgo-io/alex-v1/main/diagrams/use-case-fee.svg) + +## Putting them all together + +![](https://raw.githubusercontent.com/alexgo-io/alex-v1/main/diagrams/use-case-back-end.svg) + diff --git a/developers/smart-contracts/error-codes.md b/developers/smart-contracts/error-codes.md new file mode 100644 index 0000000..6dd4f32 --- /dev/null +++ b/developers/smart-contracts/error-codes.md @@ -0,0 +1,100 @@ +# Error Codes + +## General Error + +General error starts with 1000. + +| Error | Code | Description | +| :--- | :---: | :---: | +| authorisation-err | 1000 | Unauthorised access | +| internal-function-call-err | 1001 | function call error in the same contract | + +## Pool Error + +Pool errors starts with 2000. + +| Error | Code | Description | +| :--- | :---: | :---: | +| pool-already-exists-err | 2000 | Pool Already Existing | +| invalid-pool-err | 2001 | Accesing invalid Pool | +| no-liquidity-err | 2002 | Liquidity insufficient | +| invalid-liquidity-err | 2003 | Accesing Invalid Liquidity feature | +| too-many-pools-err | 2004 | Exceeded maximum number of pool | +| no-fee-x-err | 2005 | Insufficient fee for Token-X | +| no-fee-y-err | 2006 | Insufficient fee for Token-Y | +| invalid-token-err | 2007 | Accesing invalid Token | +| invalid-balance-err | 2008 | Accesing invalid balance | +| invalid-expiry-err | 2009 | expiry > max-expiry | +| already-expiry-err | 2010 | current block-height > expiry | +| internal-get-weight-err | 2012 | get-weight fail on pool logic | +| get-expiry-fail-err | 2013 | get-expiry fail on pool logic | +| yield-token-equation-call-err | 2014 | yield token equation calling error | +| get-price-fail-err | 2015 | get-price error | + +## Vault Error + +Vault errors starts with 3000. + +| Error | Code | Description | +| :--- | :---: | :---: | +| transfer-failed-err | 3000 | General transfer failed | +| transfer-x-failed-err | 3001 | Transfer of Token-X failed | +| transfer-y-failed-err | 3002 | Transfer of Token-Y failed | +| insufficient-flash-loan-balance-err | 3003 | Insufficient Flash Loan balance | +| invalid-post-loan-balance-err | 3004 | Invalid Post loan balance | +| user-execute-err | 3005 | User execution error of Flashloan | +| transfer-one-by-one-err | 3006 | Error on Transfer flash loan | +| none-token-err | 3007 | Flash loan none token error | +| get-token-fail | 3008 | Token acquiring fail in flash loan | + +## Equation Error + +Equation error starts with 4000. + +| Error | Code | Description | +| :--- | :---: | :---: | +| weight-sum-err | 4000 | Sum of weight should be always 1 | +| max-in-ratio-err | 4001 | In ratio Error | +| max-out-ratio-err | 4002 | Out ration Error | +| math-call-err | 4003 | Error while calling math functions on library | + +## Math Error + +Math error starts with 5000. + +| Error | Code | Description | +| :--- | :---: | :---: | +| percent-greater-than-one | 5000 | percent value exceeded 1 | +| SCALE\_UP\_OVERFLOW | 5001 | scale up overflow error | +| SCALE\_DOWN\_OVERFLOW | 5002 | scale down overflow error | +| ADD\_OVERFLOW | 5003 | addition overflow | +| SUB\_OVERFLOW | 5004 | subtraction overflow | +| MUL\_OVERFLOW | 5005 | multiplication overflow | +| DIV\_OVERFLOW | 5006 | division overflow | +| POW\_OVERFLOW | 5007 | power operation overflow | +| MAX\_POW\_RELATIVE\_ERROR | 5008 | max pow relative error | +| X\_OUT\_OF\_BOUNDS | 5009 | parameter x out of bounds | +| Y\_OUT\_OF\_BOUNDS | 5010 | parameter y out of bounds | +| PRODUCT\_OUT\_OF\_BOUNDS | 5011 | product of x and y out of bounds | +| INVALID\_EXPONENT | 5012 | exponential error | +| OUT\_OF\_BOUNDS | 5013 | general out of bounds error | +| fixed-point-err | 5014 | catch-all for math-fixed-point errors | +| | | | + +## Token Error + +Token error starts with 6000. + +| Error | Code | Description | +| :--- | :---: | :---: | +| get-symbol-fail-err | 6000 | get-symbol failed | + +## Oracle Error + +Token error starts with 7000. + +| Error | Code | Description | +| :--- | :---: | :---: | +| get-oracle-price-fail-err | 7000 | get-price failed | +| err-token-not-in-oracle | 7001 | Token cannot be found on given oracle source | + diff --git a/faq.md b/faq.md new file mode 100644 index 0000000..8e45bb0 --- /dev/null +++ b/faq.md @@ -0,0 +1,81 @@ +# FAQ + +## Why Stacks? + +Stacks makes Bitcoin programmable, enabling decentralized apps and smart contracts that inherit all of Bitcoin’s powers. Back-of-envelope calculation tells us that the DeFi market on Bitcoin could be as big as $300bn. ALEX will be part of it. We are one of the first DeFi projects on Stacks. And we are building the DeFi primitives essential to more sophisticated DeFi projects. + +For example, with ALEX on Stacks, Bitcoin holders will be able to lend and borrow Bitcoin with better user experience at a more competitive rate. Bitcoin traders can build sophisticated services and strategies on ALEX to provide liquidity and participate in yield farming across multiple pools available at ALEX. Start-ups can issue tokens and raise Bitcoin on ALEX to build better community-owned projects with low capital requirements from the team. + +## How does Stacks allow much better DeFi user experience for Bitcoin holders? + +Currently for a Bitcoin holders to use DeFi on Ethereum, he/she needs to “wrap” his/her Bitcoin. + +This means: + +1. The Bitcoin holder needs to find a WBTC merchant, +2. Opens an account subject to KYC/AML, +3. Transfer BTC to the merchant, +4. The merchant then goes to a WBTC custodian, +5. Transfers BTC to the custodian, +6. The custodian mints/transfers WBTC to the custodian, +7. The custodian transfers WBTC to the holder, +8. Now the holder can use WBTC to use DeFi on Ethereum. + +On Stacks, the same Bitcoin holder would do the following: + +1. The Bitcoin holder uses his/her BTC to use DeFi on Stacks. +2. \(and that’s it!\) + +The key technical difference between Stacks and Ethereum, that allows Stacks to do the above, is that Stacks has a read access to Bitcoin blockchain state \(something not possible on Ethereum\). + +So smart contracts written on Stacks can see BTC being locked and issue “wrapped” BTC, which can then be used freely on Stacks. + +Such a “wrapping” of BTC on Stacks, however, is done by a smart contract and does not affect the holder’s user experience \(i.e. that process is invisible to him/her\). + +So from the user experience perspective, you are almost natively accessing Bitcoin on Stacks. + +Compared to using WBTC on ETH, a Bitcoin holder, therefore, is not subject to: + +* Intermediary risk \(of WBTC merchant and custodian\), +* KYC/AML process \(duplicate/redundant for many, if not most, existing BTC holders\), and +* Costs \(which can be expensive\) to convert from BTC to WBTC and vice versa. + +## What tokens can and will ALEX support? + +ALEX will support all native/SIP10-compatible tokens on Stacks. + +## Who are the key actors on ALEX? + +There are five actors on ALEX: + +* **Lender**: Go to Yield Token Pool => Sell Token / Buy ayToken +* **Borrower**: Go to Collateral Rebalancing Pool => Deposit Collateral => Mint ayToken => Go to Yield Token Pool => Sell ayToken / Buy Token +* **Liquidity Provider**: Go to Yield Token Pool => Deposit ayToken & Token => Mint Yield Token Pool Token +* **Arbitrageur / Flash Loan User**: Go to Vault => Create Flash Loan => Trade at Pools + +See[ Use Case](https://docs.alexgo.io/developers/smart-contracts/diagrams/protocol-use-case). + +## What Collateralization Ratio \(or Loan-to-Value\) can we expect on ALEX? + +While details are being finalized, we can expect, for example, a collateralization ratio of 1.25x \(i.e. 80% LTV\) for a BTC loan against USD stablecoin collateral. + +Further, lending and borrowing on ALEX will not be subject to liquidation risk. + +All of this is made possible by our [Collateral Rebalancing Pool](protocol/collateral-rebalancing-pool.md), which dynamically rebalances between borrowed token and collateral to manage the default risk. + +## What kind of transaction fee and speed do you require? + +The design of our [Collateral Rebalancing Pool ](https://docs.alexgo.io/protocol/collateral-rebalancing-pool)requires low transaction fee. The transaction fee on Stacks at the moment is negligible. + +The Bitcoin block time is too slow to support decentralized apps like ALEX. To work around Bitcoin's limited speed, Stacks uses microblocks that result in near-instant confirmation on the Stacks blockchain. At the rate of the Bitcoin block time, these blocks will settle from Stacks to Bitcoin to provide the finality and security of Bitcoin. + +Scaling independently of Bitcoin ensures that Stacks transactions are fast enough for ALEX, while still benefiting from Bitcoin’s security and settlement. + +## Will you provide cross chain capability? + +Yes, we will develop cross chain capability in the future. Our [core architecture](https://docs.alexgo.io/protocol/platform-architecture-that-supports-ecosystem-development) is not tied to Stacks. + +## What’s your borrowing rate right now? + +Our lending and borrowing rates are [market driven](https://docs.alexgo.io/protocol/automated-market-making-designed-for-lending-protocols). + diff --git a/lending-protocol-with-fixed-yield-and-no-risk-of-liquidation.md b/lending-protocol-with-fixed-yield-and-no-risk-of-liquidation.md new file mode 100644 index 0000000..f42b1b0 --- /dev/null +++ b/lending-protocol-with-fixed-yield-and-no-risk-of-liquidation.md @@ -0,0 +1,32 @@ +# Lending and Borrowing at fixed yield with no risk of liquidation + +## Lending at fixed yield for a fixed term + +Buying of ayToken \(against Token\) equates to lending of Token at the rate implied by the price of ayToken until T. Holding ayToken until T allows the holder to accrue, with certainty, at a fixed rate \(as implied by the price at which holder bought ayToken\). Selling of ayToken before T could result in a profit or loss, depending on the prevailing price of ayToken. + +![](https://raw.githubusercontent.com/alexgo-io/alex-v1/main/diagrams/use-case-lender.svg) + +ALEX provides a fixed schedule of maturities for each Token to allow liquidity aggregation. On a regular basis, a new ayToken is launched, whose liquidity is bootstrapped using Liquidity Bootstrapping Pool. + +## Borrowing at fixed yield for a fixed term with no risk of liquidation + +Minting of ayToken by adding eligible collateral to a collateral pool and selling of ayToken against Token equates to the borrowing of Token at the rate implied by the price at which ayToken was sold. + +### Creating a loan + +![](https://raw.githubusercontent.com/alexgo-io/alex-v1/main/diagrams/use-case-borrower.svg) + +### Repaying a loan + +![](https://raw.githubusercontent.com/alexgo-io/alex-v1/main/diagrams/use-case-borrower-repay.svg) + +The collateral pool will dynamically rebalance between Token and eligible collateral to ensure the solvency of ayToken. The dynamic rebalancing of collateral is akin to a real-time margining of the loan, minimising counterparty risk. + +For example, ayBTC / USD pool \(i.e. borrow BTC against USD\) will implement a dynamic hedging strategy against BTC upside \(i.e. sell USD and buy BTC as BTC spot goes up, and vice versa\). The resulting rebalancing between USD and BTC will be then executed by arbitrageurs participating in the pool pricing curve. See some illustration [here](https://docs.google.com/spreadsheets/d/1nSg6L30iedpk_rLhq3E7Zv8ct3Myb_D8oWmgJzwtwtw/edit?usp=sharing). The borrower effectively is an LP \(and receives ayBTC as the PoolToken\) and the USD collateral provided will be automatically converted into a basket of USD and BTC. + +The main benefit of such dynamic rebalancing is that we can be \(much\) more aggressive in LTV and remove liquidation entirely \(with appropriate LTV and reserve fund\). This also allows aggregation of all ayToken into a single pool \(rather than separate pool for each borrower\). + +The main drawback is that the collateral received at the time of repayment will not be same in USD value as the original value \(due to rebalancing\). + +To those interested in understanding the mathematics behind it, please refer to [Collateral Rebalancing Pool](https://docs.alexgo.io/protocol/collateral-rebalancing-pool). + diff --git a/protocol/automated-market-making-designed-for-lending-protocols.md b/protocol/automated-market-making-designed-for-lending-protocols.md new file mode 100644 index 0000000..2bff88d --- /dev/null +++ b/protocol/automated-market-making-designed-for-lending-protocols.md @@ -0,0 +1,56 @@ +# Yield Token Pool + +Please refer to our [white paper](https://docs.alexgo.io/whitepaper/automated-market-making-of-alex) for a more rigorous treatment on the subject. + +## Lending and Borrowing Process + +ALEX's core product is essentially a zero coupon bond in conventional finance. A key benefit is reduced uncertainty about a loan's interest rate, resulting in better financial planning. Specifically, prior to entering a loan contract, borrowers and lenders secure the loan's interest rate and tenor on ALEX. + +Here is a concrete example. Rachel has 100 USD. She wants to increase her 100 USD. She chooses to lend her assets out. She's ok with lending out her 100 USD for a fixed term of three months. She goes to ALEX's interface. There, Rachel can see that "three month ayUSD" is currently priced at 0.9 vs USD. Put simply, 1 ayUSD gets her 0.9 USD. She takes her 100 USD and exchanges it for ayUSD. Given the current exchange rate, she gets about 110 ayUSD. Now she waits. Three months pass. Now, Rachel can exchange her 110 ayUSD for USD again. The rate is 1 ayUSD to 1 USD. So Rachel gets 110 USD. That's a gain of 10 USD over 3 months. Pretty nice! + +Here is the general story. Borrowers and lenders enter a loan contract. Specifically, they swap a forward contract based token called "ayToken" with "Token". "Token" is the underlying asset. For example, they swap ayUSD with USD. More generally, the lender lends out "Tokens" and obtains "ayToken" in return. The price of "Token" is lower than its par value. The contract starts when a lender deposits "Token" in an ALEX pool. Then, upon expiration, the lender redeems the underlying asset, "Token", at par value. Because the lender lent out their "Token" at discounted price some time ago, and now redeems "Token" for par value, there is a profit. Pretty nice! + +In mathematical terms, the interest rate r is calculated as $$p_{t}=\frac{1}{e^{rt}}$$, where $$p_{t}$$ is the spot price of ayToken and the interest rate is assumed to compound. The formula utilises one of the most fundamental principles in asset pricing: an asset's present value is the asset's discounted future value. Thus, in our simplified example, $$t$$= 1 and $$r=\log\frac{1}{0.9}\approx10\%$$. + +## Automated Market Making \(AMM\) Protocol + +When designing the AMM protocol, ALEX believes the following: + +1. AMMs are mathematically neat and reflect economic demand and supply. For example, price should increase when demand is high or supply is low; +2. AMMs are a type of mean, which remains constant during trading activities. This approach is also adopted by popular platforms such as _Uniswap,_ which employ algorithmic means; and +3. AMMs can be interpreted through the lens of modern finance theory. Doing so enables ALEX to grow and draw comparisons with conventional finance. + +After extensive research, our beliefs led us to an AMM first proposed by _YieldSpace_. While we appreciate the mathematical beauty of their derivation, we adapt it in several ways with _ALEX_. For example, we replace a simple interest rate with a compounding interest rate. This change is in line with standard uses in financial pricing and modelling since Black and Scholes. We also develop a new capital efficiency scheme, as explained below. + +In mathematical terms, our AMM can be expressed as: + +$$ +x^{1-t}+y^{1-t}=L +$$ + +where $$x$$, $$y$$, $$t$$ and $$L$$ are, respectively, the balance of "Token", balance of "ayToken", time to maturity and a constant term when $$t$$ is fixed. The interest rate $$r$$ is defined as $$r=\log\left(\frac{y}{x}\right)$$, i.e. the natural logarithm of the ratio of balance between "ayToken" and "Token", while the price of "ayToken" with respect to "Token" is $$\left(\frac{y}{x}\right)^{t}$$. + +Our design depicts an AMM in the of a form of a generalised mean. It makes economic sense because the shape of the curve is decreasing and convex. It incorporates time to maturity $$t$$, which is explicitly built-in to derive ayToken's spot price. We refer readers to our [white paper](https://docs.alexgo.io/whitepaper/automated-market-making-of-alex) for detail. + +## Liquidity Providers \(LP\) and Capital Efficiency + +LPs deposit both ayToken and Token in a pool to facilitate trading activities. LPs are typically ready to market-make on all possible scenarios of interest rate movements ranging from $$-\infty$$ to $$+\infty$$. However, part of the interest rates curve or movements will never be considered by market participants. On example is the part where the interest rate is negative. Although negative rates can be introduced in the fiat world by central bankers as monetary policy tool, yield farmers in the crypto world are still longing everything to be positive. In ALEX, positive rate refers to spot price of ayToken not exceeding 1 and ayToken reserve is larger than Token. + +Inspired by _Uniswap v3_, ALEX employs virtual tokens - part of the assets that will never be touched, hence is not required to be held by LP. + +![Figure 1](../.gitbook/assets/cecjing.png) + +Figure 1 illustrates an example of adopting virtual tokens in the event of positive interest rate. The blue line is the standard AMM. The blue dot marks an equal balance of Token and ayToken of $$y_{v}$$, meaning there is no, or a 0%, interest rate. $$y_{v}$$ is the boundary amount, as any amount lower than it will never be touched by LP to avoid negative rate, which is represented by blue dashed line. Thus, $$y_{v}$$ is virtual token reserve. Effectively, LP is market-making on the red line, which shifts the blue line lower by $$y_{v}$$. When ayToken is depleted as shown by red dashed line, trading activities are suspended. + +A numerical example provided in Table 1 shows capital efficiency with respect to various interest rate, assuming $$t$$= 0.5 and $$L$$= 20 for illustration's sake. When the current interest rate$$r$$= 10%, LPs are required to deposit 95 token and 105 ayToken according to standard AMM. However, if the interest rate is floored at 0%, LP only needs to contribute 5 ayToken, as the rest 100 ayToken would be virtual. This is a decent saving more than 90%. + +![Table 1: Capital Efficiency when Interest Rate is Floored at 0](../.gitbook/assets/cectable3.png) + +## Yield Curve and Yield Farming + +By expressing the interest rate as $$p_{t}=\frac{1}{e^{rt}}$$, i.e. $$r=-\frac{1}{t}\log p_{t}$$, we can obtain a series of interest rates from trading pool prices with respect to various maturities, based on which we are able to build a yield curve. The Yield curve is the benchmark tool for modelling risk-free rates in conventional finance. The shape of the curve dictates expectations about future interest rate path, which helps market participants understand market behaviours and trends. Currently we might be able to build a Bitcoin yield curve from Bitcoin futures listed on the Chicago Mercantile Exchange \(CME\). However, not only is the exchange heavily regulated, its trading volume is skewed to the very short dated front end contracts lasting several months only. ALEX aims to offer future contracts up to 1y when the platform goes live. Should markets mature, ALEX may extend to longer tenors. + +Yield farmers can benefit from understanding the yield curve by purchasing ayToken whose tenor corresponds to high interest rates and selling ayToken whose tenor associates with low interest rates. This is a typical “carry" strategy. + +Last but not least, based on the development of the yield curve and solid design work of our AMM, ALEX will be able to provide more products. Specifically, ALEX will be able to offer derivatives, including options and structured products, building on and extending a large amount of literatures and applications in conventional finance. + diff --git a/protocol/collateral-rebalancing-pool.md b/protocol/collateral-rebalancing-pool.md new file mode 100644 index 0000000..78b8811 --- /dev/null +++ b/protocol/collateral-rebalancing-pool.md @@ -0,0 +1,24 @@ +# Collateral Rebalancing Pool + +Collateral Rebalancing Pool \("CRP"\) uses [Weighted Equation](https://docs.alexgo.io/protocol/platform-architecture-that-supports-ecosystem-development) and dynamically rebalances between Token and Collateral. + +CRP dynamically rebalances collateral to ensure the ayToken minted \(i.e. the loan\) remain solvent especially in an adverse market environment \(i.e. the value of the loan does not exceed the value of collateral\). This dynamic rebalancing, together with a careful choice of the key parameters \(including LTV and volatilty assumption\) allows ALEX to eliminate the needs for liquidation. Any residual gap risk \(which CRP cannot address entirely\) is addressed through maintaining a strong reserve fund. + +For example, ayBTC / USD pool \(i.e. borrow BTC against USD\) will implement a dynamic hedging strategy against BTC upside \(i.e. sell USD and buy BTC as BTC spot goes up, and vice versa\). The resulting rebalancing between USD and BTC will be then executed by arbitrageurs participating in the pool pricing curve. See some illustration [here](https://docs.google.com/spreadsheets/d/1nSg6L30iedpk_rLhq3E7Zv8ct3Myb_D8oWmgJzwtwtw/edit?usp=sharing). The borrower effectively is an LP \(and receives ayBTC as the Pool Token\) and the USD collateral provided will be automatically converted into a basket of USD and BTC. + +The main benefit of such collateral rebalancing is that we can be \(much\) more aggressive in LTV and remove liquidation entirely \(with appropriate LTV and reserve fund\). This also allows aggregation of all ayToken into a single pool \(rather than separate pool for each borrower\). + +The main drawback is that the collateral received at the time of repayment will not be same in USD value as the original value \(due to rebalancing\). + +When a Borrower mints ayToken by providing appropriate Collateral, the Collateral is converted into a basket of Collateral and Token, with the weights determined by CRP. CRP determines the weights based on the prevailing LTV and uses the following formula: + +$$ +\begin{split} +&w_{Token}=N\left(d_{1}\right)\\ +&w_{Collateral}=\left(1-w_{Token}\right)\\ +&d_{1}= \frac{1}{\sigma\sqrt{t}}\left[\ln\left(\frac{LTV_{t}}{LTV_{0}}\right) + t\times\left(APY_{Token}-APY_{Collateral} + \frac{\sigma^2}{2}\right)\right] +\end{split} +$$ + +Some readers may note the similarity of the above formula to the [Black & Scholes delta](https://en.wikipedia.org/wiki/Black–Scholes_model), because it is. CRP essentially implements a delta replicating strategy of a call option on Token / Collateral, buying more Token when LTV moves higher and vice versa. + diff --git a/protocol/liquidity-bootstrapping-pool.md b/protocol/liquidity-bootstrapping-pool.md new file mode 100644 index 0000000..4ddde4b --- /dev/null +++ b/protocol/liquidity-bootstrapping-pool.md @@ -0,0 +1,14 @@ +# Liquidity Bootstrapping Pool + +Liquidity Bootstrapping Pool \("LBP"\) uses [Weighted Equation](https://docs.alexgo.io/protocol/platform-architecture-that-supports-ecosystem-development) and is designed to facilitate a capital efficient launch of a token \(the "Base Token"\) relative to another token \(the "Target Token"\). + +LBP is used to initialise all Yield Token Pools \(with ayToken being the Base Token and Token being the Target Token\). + +Initially, a bigger weight \(say 80%\) is assigned to Base Token, while the remaining \(say 20%\) is assigned to Target Token. The weights are gradually rebalanced to allow for the sale of Base Token and an efficient discovery of its price relative to the Target Token. + +LBP was first offered by [Balancer](https://docs.balancer.fi/v/v1/guides/smart-pool-templates-gui/liquidity-bootstrapping-pool) in 2020 and can be an interesting alternative to ICOs, IDOs or IEOs to bootstrap liquidity with little initial investment from the team. + +ALEX brings LBP to Stacks, allowing Stacks projects to build deep liquidity and find its price efficiently with low capital requirements. + +LBPs can result in a significantly better-funded project whose governance tokens are more evenly distributed among the community. This means the tokens remain in the hands of those that are invested in the project in the long term, instead of speculators looking for quick profits. + diff --git a/protocol/platform-architecture-that-supports-ecosystem-development.md b/protocol/platform-architecture-that-supports-ecosystem-development.md new file mode 100644 index 0000000..4b9c156 --- /dev/null +++ b/protocol/platform-architecture-that-supports-ecosystem-development.md @@ -0,0 +1,54 @@ +# Overview + +ALEX allows for implementation of arbitrary trading strategies and borrows from [Balancer V2](https://docs.balancer.fi). + +Equation abstracts rebalancing and market making logic, while Pool encapsulates the value of a strategy. Pool abstraction allows aggregation of the assets of all ALEX pools into a single vault, bringing many advantages over traditional DEX architecture. + +## Equation + +Equation triggers Pool rebalancing. This allows creation of any arbitrary rebalancing strategies to be deployed as a pool. + +### Weighted Equation + +Weighted Equation \("WE"\) is the most basic Equation of all and is a fork of [Balancer](https://balancer.fi/whitepaper.pdf), which generalised the constant product AMM popularised by Uniswap. We implement the following formula: + +$$ +V=\prod_{i}B_{i}^{w_{i}} +$$ + +Where $$V$$is a constant, $$B_{i}$$ is the balance of token i and $$w_{i}$$ is the weight of token i in the pool. + +As the price of each token changes, arbitrageurs rebalance the pool by making trades. This maintains the desired weighting of the value held by each token whilst collecting trading fees from the traders. + +### Yield Token Equation + +Yield Token Equation \("YTE"\) drives [Yield Token Pool](https://docs.alexgo.io/protocol/automated-market-making-designed-for-lending-protocols). It follows [Yield Space](https://yield.is/YieldSpace.pdf) and is designed specifically to facilitate efficient trading between ayToken and Token. Our main contribution is to extend the model to allow for capital efficiency from liquidity provision perspective \(inspired by [Uniswap V3](https://uniswap.org/whitepaper-v3.pdf)\). + +For example, if a pool is configured to trade between 0% and 10% APY, the capital efficiency can improve to 40x compared to when the yield can trade between $$-\infty$$ and $$+\infty$$. + +## Pool + +Pools handle the logic of dynamic trading strategies, whose token rebalancing are then handled by Vault. Rebalancing logic is driven by Equation. Pool issues Pool Token to liquidity providers. The number of Pool Tokens are determined based on a liquidity provider's relative contribution to the Pool. Pool Tokens thus represent proportional ownership of that Pool, or assets in that Pool. + +### Fixed Weight Pool + +Fixed Weight Pool \("FWP"\) is a fork of [Balancer Weighted Pool](https://docs.balancer.fi/core-concepts/protocol/pools#weighted-pools). + +### Collateral Rebalancing Pool + +Collateral Rebalancing Pool \("CRP"\) uses Weighted Equation and dynamically rebalances between Token and Collateral. CRP dynamically rebalances collateral to ensure the ayToken minted \(i.e. the loan\) remains solvent especially in an adverse market environment \(i.e. the value of the loan does not exceed the value of collateral\). + +### Yield Token Pool + +Yield Token Pool \("YTP"\) uses Yield Token Equation and is designed specifically to facilitate efficient trading between ayToken and Token. + +### Liquidity Bootstrapping Pool + +Liquidity Bootstrapping Pool \("LBP"\) uses Weighted Equation and is designed to facilitate a capital efficient launch of a token \(the "Base Token"\) relative to another token \(the "Target Token"\). + +LBP is used to initialise all Yield Token Pools \(with ayToken being the Base Token and Token being the Target Token\). + +## Vault + +Vault holds and manages the assets of all ALEX pools. The separation of pool and vault has many benefits including, among others, cheaper transaction costs for users and quicker learning curve for developers when building custom pools on ALEX. + diff --git a/protocol/vault.md b/protocol/vault.md new file mode 100644 index 0000000..f989b51 --- /dev/null +++ b/protocol/vault.md @@ -0,0 +1,14 @@ +# Vault + +Vault holds and manages the assets of all ALEX pools. The separation of pool and vault has many benefits including, among others, cheaper transaction costs for users and quicker learning curve for developers when building custom pools on ALEX. + +## Flash Loan + +Aggregating the assets of all ALEX pools into a single vault allows for the offering of Flash Loan, [popularized by AAVE](https://aave.com/flash-loans/). + +Flash Loans are uncollateralized loans that must be repaid \(plus interest\) in the same transaction as it is borrowed. Since everything done with the loan must be completed in a single transaction, there are codified guarantees that make it impossible for borrowers to run away with the tokens. + +Flash Loan allows arbitrageurs to take advantages of any price discrepancies in two or more pools without the needs for holding any input tokens. + +![](https://raw.githubusercontent.com/alexgo-io/alex-v1/main/diagrams/use-case-arbitrageur.svg) + diff --git a/protocol/yield-farming-on-alex.md b/protocol/yield-farming-on-alex.md new file mode 100644 index 0000000..e7afbf1 --- /dev/null +++ b/protocol/yield-farming-on-alex.md @@ -0,0 +1,16 @@ +# Yield Farming on ALEX + +A high LTV \(even on a static collateral\) can be offered between ayTokens of different maturities. For example, ayToken-1y as collateral may achieve 90% LTV to mint ayToken-O/N \(similar to borrowing overnight to buy long-term asset\). This allows "yield farming" whereby you repeat the process of buying ayToken-1y, use it as collateral to mint and sell ayToken-O/N for Token \(to buy ayToken-1y\) to achieve a high APY \(assuming ayToken-1y APY > ayToken-O/N APY\). + +![Yield Farming Use Case](https://raw.githubusercontent.com/alexgo-io/alex-v1/main/diagrams/use-case-yield-farming.svg) + +For example, Rachel spends 100 BTC and buys ayBTC-1y. She uses it as collateral to borrow ayBTC-O/N at 90% LTV. She then sells the borrowed ayBTC-O/N and buys more ayBTC-1y. She uses it as collateral to borrow ayBTC-O/N at 90% LTV. She repeats this process. + +If 1y APY is 10% and O/N APY is 5%, the above "yield farming" results in APY approaching 55%. + +Mathematically, + +$$r=\frac{1+r{1y}}{1-LTV}-\left(1+\frac{r{1d}}{365}\right)^{365}\left(\frac{LTV}{1-LTV}\right)-1$$ + +An illustration is available [here](https://docs.google.com/spreadsheets/d/1L-52KHFl7O_h22Fg4gpZKczdPEXuAt5yAh2gX3BQP58/edit?usp=sharing). + diff --git a/whitepaper/automated-market-making-of-alex.md b/whitepaper/automated-market-making-of-alex.md new file mode 100644 index 0000000..52b2e1e --- /dev/null +++ b/whitepaper/automated-market-making-of-alex.md @@ -0,0 +1,414 @@ +# Automated Market Making of Yield Token Pool + +## Abstract + +ALEX aims to provide a fixed rate borrowing and lending service with pre-determined maturity in the world of decentralised finance \(DeFi\). We include forward contracts in our trading pool, with Automated Market Making \(AMM\) engine in association with generalised mean. While we formalise the trading practise swapping forward contracts with underlying asset, we incorporate the latest innovation in the industry - concentrated liquidity. Consequently, liquidity provider of ALEX can save decent amount of capital by making markets on a selected range of interest rate. + +## Introduction + +ALEX stands for **A**utomated **L**iquidity **EX**change. It is a hybrid of automated market making and on-chain loanable fund built on Stacks blockchain network. While lenders and borrowers can minimise uncertainty by securing the loan with fixed rate and tenor, liquidity providers are able to take advantage of our capital efficiency mechanism by imposing cap and floor on the interest rate. This allows liquidity to be offered on parts of the curve that contains majority of trading activities and leads to efficient capital management. + +On ALEX, lending and borrowing activities are facilitated by a forward contract based token “ayToken”. It is similar to an OTC bilateral forward contract in the conventional financial market, which specifies underlying asset “Token” and expiry date. This paper assumes ayToken is minted and ready to be exchanged. Lenders purchase ayToken at a discount to the spot Token price when the contract is initiated and reclaim underlying asset upon expiration when forward price converges to spot price. Borrowers sell ayToken in return for Token on day one and return Token upon expiration. Implied interest rate depends on how much discount that the forward price is to the spot price at the time of transaction, which is executed on AMM. + +Last but not least, ALEX hopes to bridge the gap between Defi and conventional finance by applying an AMM protocol derived from one of the basic instruments in fixed income market - zero coupon bond firstly proposed by [Yield Space](https://yield.is/YieldSpace.pdf). This empowers ALEX to learn from the fiat world and offer more decentralised financial products in the future. + +This paper focuses on technical aspects of AMM and is the first of a series of ALEX papers unveiling all exciting features and applications of ALEX development. + +## AMM and Invariant Function + +ALEX AMM is built on three beliefs: \(i\) it is mathematically neat and reflect economic demand and supply; \(ii\) it is a type of mean, like other AMMs; and \(iii\) it is derived and can be interpreted in terms of yield and is somehow related to conventional finance, where research has been conducted for decades. + +We will firstly review some desirable features of AMM that ALEX hopes to exhibit. + +### Properties of AMM + +AMM protocol, which provides liquidity algorithmically, is the core engine of Defi. In the liquidity pool, two or more assets are deposited and subsequently swapped resulting in both reserve and price movement. The protocol follows an invariant function $$f(X)=L$$, where $$X=\left(x_1,x_2,\dots,x_d\right)$$ is $$d$$ dimension representing $$d$$ assets and $$L$$ is constant. When $$d=2$$, which is the common practise by a range of protocols, AMM $$f(x_1,x_2)=L$$ can be expressed as $$x_2=g(x_1)$$. Although it is not always true, $$g$$ tends to be twice differentiable and satisfies the following + +* monotonically decreasing, i.e. $$\frac{dg(x_1)}{dx_1}<0$$. This is because price is often defined as $$-\frac{dg(x_1)}{dx_1}$$. A decreasing function ensures price to be positive. +* convex, i.e. $$\frac{d^2g(x_1)}{dx_1^2} \geq 0$$. This is equivalent to say that $$-\frac{dg(x_1)}{dx_1}$$ is a non-increasing function of $$x_1$$. It is within the expectation of economic theory of demand and supply, as more reserve of $$x_1$$ means declining price. + +Meanwhile, $$f$$ can usually be interpreted as a form of mean, for example, [mStable](https://docs.mstable.org) relates to arithmetic mean, where $$x_1+x_2=L$$ \(constant sum formula\); one of the most popular platforms [Uniswap](https://uniswap.org/whitepaper-v3.pdf) relates to geometric mean, where $$x_1 x_2=L$$ \(constant product formula\); [Balancer](https://balancer.fi/whitepaper.pdf), which our collateral rebalancing pool employs, applies weighted geometric mean. Its AMM is $$x_1^{w_1} x_2^{w_2}=L$$ where $$w_1$$ and $$w_2$$ are fixed weights. However, none of these three protocols consider time to maturity, which is essential in modern interest rate theory. + +### ALEX AMM + +After extensive research, we consider it possible for ALEX AMM to be connected to generalised mean defined as + +$$ +\left( \frac{1}{d} \sum _{i=1}^{d} x_i^p \right)^{\frac{1}{p}} +$$ + +where $$0 \leq p \leq 1$$. The expression might remind readers of $$p$$-norm when $$x_i \geq 0$$. It is however not true when $$p<1$$ as triangle inequality doesn't hold. + +When $$d=2$$ and $$p$$ is fixed, the core component of generalised mean is assumed constant as below. + +$$ +x_1^p+x_2^p=L +$$ + +This equation is regarded reasonable as AMM, because \(i\) function $$g$$ where $$x_2=g(x_1)$$ is monotonically decreasing and convex; and \(ii\) The boundary value of $$p=1$$ and $$p=0$$ corresponds to constant sum and constant product formula respectively. When $$p$$ increases from 0 to 1, price $$-\frac{dg(x_1)}{x_1}$$ gradually converges to 1. This is what ALEX hopes to achieve when forward becomes spot. This also means that $$p$$ is somehow related to time to maturity. Please refer to [Appendix 1](automated-market-making-of-alex.md#appendix-1-generalised-mean-when-d-2) for a detailed discussion. + +In the benchmark research piece by [Yield Space](https://yield.is/YieldSpace.pdf), the invariant function above is formalised from the perspective of zero coupon bond. $$p$$ is replaced by $$1-t$$ where $$t$$ is time to maturity and $$L$$ is a function of $$t$$, so that + +$$ +x_1^{1-t}+x_2^{1-t}=L\left(t\right) +$$ + +This is derived by solving the following differential equation when $$t \neq 1$$ + +$$ +-\frac{dx_2}{dx_1}=\left(\frac{x_2}{x_1} \right)^t +$$ + + + +In the rest of the paper, to be consistent with [Yield Space](https://yield.is/YieldSpace.pdf), we employ notations below + +* $$x$$ : balance of the underlying Token +* $$y$$ : balance of ayToken +* $$r$$ : implied interest rate, defined as the natural logarithm of balance of ayToken and Token + +$$ +r=log \left( \frac{y}{x} \right) +$$ + +* $$p$$ : price of Token in terms of ayToken. The commonly quoted ayToken price is the inverse, i.e. $$\frac{1}{p}$$ + +$$ +p=\left(\frac{y}{x} \right)^t=e^{rt} +$$ + +ALEX's implied interest rate is compound. Not only does the compound rate allow us to derive mathematical formulas throughout the paper, we can also conduct further research and offer more products by referring to vast amount of literatures and applications in conventional finance, which is largely built on Black-Scholes model with compound rate employed as the discounting factor. + +Using notations above, the invariant function is rewritten as $$x^{1-t}+y^{1-t}=L$$ with the differential equation $$-\frac{dy}{dx}=\left(\frac{y}{x} \right)^t$$. Unless specified, we assume $$L$$ constant and call it invariant constant. This means that $$t$$ is fixed and there is no minting or burning coins. In practise, liquidity providers can add or reduce liquidity, and $$L$$ needs to be recalibrated daily when $$t$$ changes. + +Though purely theoretical at this stage, [Appendix 2](automated-market-making-of-alex.md#appendix-2-liquidity-mapping-to-uniswap-v3) maps $$L$$ to the liquidity distribution of [Uniswap V3](https://uniswap.org/whitepaper-v3.pdf). This is motivated by an independent research from [Paradigm](https://www.paradigm.xyz/2021/06/uniswap-v3-the-universal-amm/). + +## Trading Formulae + +Market transaction, which involves exchange of Token and ayToken, satisfies the invariant function. While fee is deposited back to the liquidity pool in some protocols, such as _Uniswap V2_, resulting in slight increase of $$L$$ after each transaction, ALEX counts the fee separately. This is consistent with [Uniswap V3](https://uniswap.org/whitepaper-v3.pdf). Hence $$L$$ remains constant. + +### Out-Given-In + +In order to purchase $$\Delta y$$ amount of ayToken from the pool, the buyer needs to deposit $$\Delta x$$ amount of Token. $$\Delta x$$ and $$\Delta y$$ satisfy the following + +$$ +(x+\Delta x)^{1-t}+(y-\Delta y)^{1-t}=x^{1-t}+y^{1-t} +$$ + +After each transaction, balance is updated as below: $$x\rightarrow x+\Delta x$$ and $$y\rightarrow y-\Delta y$$. Balance of $$y$$ should not be less than that of $$x$$ to avoid negative interest rate, which will be discussed in detail later. Rearranging the formula results in + +$$ +\Delta y=y-\left[x^{1-t}+y^{1-t}-(x+\Delta x)^{1-t}\right]^{\frac{1}{1-t}} +$$ + +When transaction cost exists, the actual deposit to the pool is less than $$\Delta x$$. Assuming $$\lambda\Delta x$$ is the actual amount and $$(1-\lambda)\Delta x$$ is the fee, above can now be expressed as + +$$ +\begin{split} +&(x+\lambda\Delta x)^{1-t}+(y-\Delta y)^{1-t}=x^{1-t}+y^{1-t}\\ +&\Delta y=y-\left[x^{1-t}+y^{1-t}-(x+\lambda\Delta x)^{1-t}\right]^{\frac{1}{1-t}} +\end{split} +$$ + +To keep $$L$$ constant, the updated balance is: $$x\rightarrow x+\lambda\Delta x$$ and $$y\rightarrow y-\Delta y$$. + +### In-Given-Out + +This is the opposite case to above. We are deriving $$\Delta x$$ from $$\Delta y$$. + +$$ +\Delta x=\frac{1}{\lambda}{\left[x^{1-t}+y^{1-t}-(y-\Delta y)^{1-t}\right]^{\frac{1}{1-t}}-x} +$$ + +### In-Given-Price / Yield + +Sometimes, trader would like to adjust the price/yield, perhaps due to deviation of AMM price to the market value. Define $$p'$$ the AMM price after rebalancing the Token and ayToken in the pool + +$$ +p'=\left(\frac{y-\Delta y}{x+\lambda\Delta x}\right)^{t} +$$ + +Then, the added amount of $$\Delta x$$ can be calculated from the formula below + + + +$$ +\begin{split} +&(x+\lambda\Delta x)^{1-t}+(y-\Delta y)^{1-t}=x^{1-t}+y^{1-t}\\ +&1+\left(\frac{y}{x}\right)^{1-t}=\left(1+\lambda\frac{\Delta x}{x}\right)^{1-t}+(\frac{y-\Delta y}{x})^{1-t}\\ +&1+p^{\frac{1-t}{t}}=\left(1+\lambda\frac{\Delta x}{x}\right)^{1-t}+p'^{\frac{1-t}{t}}\left(1+\lambda\frac{\Delta x}{x}\right)^{1-t}\\ +&\Delta x=\frac{x}{\lambda}\left[\left(\frac{1+p^{\frac{1-t}{t}}}{1+p'^{\frac{1-t}{t}}}\right)^{\frac{1}{1-t}}-1\right]\\ +\end{split} +$$ + +Denote $$r$$ and $$r'$$ the current and trader's target interest rate respectively. Because $$p=e^{rt}$$ and $$p'=e^{r't}$$, the above equation can also be rewritten as + +$$ +\Delta x=\frac{x}{\lambda}\left[\left(\frac{1+e^{r(1-t)}}{1+e^{r'(1-t)}}\right)^{\frac{1}{1-t}}-1\right] +$$ + +### Transaction Cost on Notional and Yield + +In the previous sections, fee is in proportion to the notional amount. This is consistent with AMM such as _Uniswap_. However, it could be hard to interpret in the yield space, as market participants tend to think of borrowing or lending activity in terms of rate. + +The formula below expresses $$\lambda$$ regarding bid/offer imposed on interest rate $$r$$, so that conversion in between the two is possible. Denote $$r_m$$ as the mid rate calculated from AMM + +$$ +e^{r_m}=\frac{\Delta y}{\lambda\Delta x} +$$ + +However, trader deposits $$\Delta x$$ rather than $$\lambda\Delta x$$. Therefore, the bid rate $$r_b$$ when purchasing ayToken satisfies + +$$ +e^{r_b}=\frac{\Delta y}{\Delta x} +$$ + +$$\Delta r_b=r_m-r_b$$ is then the fee charged to the purchaser in the yield space, + +$$ +e^{\Delta r_b}=\frac{1}{\lambda} +$$ + +Hence, $$\lambda$$ can be expressed as a function of $$\Delta r_b$$ + +$$ +\lambda=e^{-\Delta r_b} +$$ + +Actual fee is $$1- \lambda=1-e^{-\Delta r_b} \approx \Delta r_b$$ using Taylor expansion to the first order. Thus $$\lambda \approx 1-\Delta r_b$$ . + +It can be shown that the above equality also holds when redeeming ayToken for Token, except $$\Delta r_b$$ replaced by $$\Delta r_o=r_o-r_m$$, where $$e^{r_m}=\frac{\lambda\Delta y}{\Delta x}$$ and $$e^{r_o}=\frac{\Delta y}{\Delta x}$$. Here, $$r_o$$ is the offer rate when selling ayToken and $$\Delta r_o$$ is the corresponding fee charged to the seller in the yield space. + +## Concentrated Liquidity + +In the current setting, liquidity provider can make market on any rate between $$-\infty$$ to $$+\infty$$. However, market participants might wish to impose certain constraint, for example no negative interest rate. One solution is to set up bounds on $$\frac{y}{x}$$, which are related to the rate. In the case of positive rate, this means balance of ayToken always larger than Token. Although it solves the problem, the amount of ayToken lower than Token would be excluded from trading activities in any means. We are proposing an alternative approach by introducing virtual tokens. + +Virtual tokens constitute part of the trading pool reserve that would never be touched hence underutilised. Liquidity providers should not be required to maintain this part of the pool and we are therefore set them as virtual. For example, when rate is floored at 0%, $$t$$= 0.5 and $$L$$= 20, liquidity providers will never face the situation of ayToken balance falling below 100, which can then be regarded as virtual to save the actual capital cost. + +The idea is inspired by concentrated liquidity in _Uniswap v3_. + +### Pool with interest rate floored at zero + +This section only allows liquidity on non-negative interest rate. Concentrated liquidity is achieved by introducing virtual token reserves $$y_v$$, which satisfies + +$$ +x^{1-t}+(y+y_{v})^{1-t}=L +$$ + +Figure 1 illustrates the example above of $$t$$= 0.5 and $$L$$= 20 by displaying two sets of curves: Invariant Function Curve \(“IFC"\) satisfying $$x^{1-t}+y^{1-t}=L$$ and Capital Efficiency Curve \(“CEC"\) satisfying $$x^{1-t}+(y+y_v)^{1-t}=L$$. Intuitively CEC is attained by lowering IFC by $$y_v$$= 100. + +![Figure 1](../.gitbook/assets/cecjing.png) + +#### Initialisation + +Instead of contributing equal amount of Token and ayToken to initialise the pool with interest rate 0%, liquidity provider only needs to contribute x amount of Token. This is because virtual token $$y_v=x=\left(\frac{1}{2}L\right)^{\frac{1}{1-t}}$$. + +#### Trading + +Balance of Token and ayToken, including both actual and virtual, still satisfy the invariant function. However, once the actual ayToken is depleted and only Token is left in the pool, trading would be ceased until more ayToken is deposited. + +#### Minting and Burning + +Before liquidity expansion or reduction by minting or burning coins, assume that the old pool has Token $$x$$ and ayToken $$y$$ satisfying $$x^{1-t}+y^{1-t}=L$$, where $$y=y_a+y_v$$ and $$y_a$$ and $$y_v$$ are balance of actual and virtual ayToken respectively. + +Minting and burning should not affect price and interest rate. This means that newly added or withdrawn coins would be in proportion to x and y. Denote new amount of Token and ayToken as $$x'=kx$$ and $$y'=ky$$ respectively. $$y'=y'_a+y'_v$$ where $$y'_a$$ is actual whereas $$y'_v$$ virtual. They satisfy the following + +$$ +\begin{split} +&y'_a+y'_v=ky\\ +&2y'^{1-t}_v=k^{1-t}L +\end{split} +$$ + +Solution to the above equations is + +$$ +\begin{split} +&y'_{a}=ky-y'_{v}\\y'_{v} +&=\left(\frac{1}{2}L\right)^{\frac{1}{1-t}}k +\end{split} +$$ + +This means $$y'_v=ky_v$$ and $$y'_a=ky_a$$. + +#### Example + +Assume $$t$$= 0.5. Rachel initialises a liquidity pool of 0% interest rate with 100 Token on CEC. Although there is no actual ayToken, 0% rate implies 100 virtual tokens and $$L$$= 20 on IFC. + +Suppose Rachel then sells 50 ayToken to the pool on the same day. On IFC, this means ayToken amount of 150 \(50 actual and 100 virtual\) and the amount of 60.10 Token remaining on IFC. + +Now suppose Billy wants to mint 10% of the liquidity pool. This means that Billy needs to deposit 6.01 \(10% of 60.10\) Token. Virtual balance is updated to $$\left(\frac{1}{2}\times20\right)^{\frac{1}{0.5}}\times1.1=110$$. Billy needs to deposit 5 ayToken \($$1.1\times150-110-50$$\), so that the summation of actual and virtual ayToken is 165. Interest rate remains the same before and after Billy's participation. Note that both actual and virtual ayToken balance increase by 10%, which is the same proportion as the growth of liquidity pool. + +### Range-bound Pool + +The above section can be extended to any constraint pool with upper interest rate $$r_{u}$$ and lower interest rate $$r_{l}$$. If interest rate falls out of \[$$r_{l} $$,$$r_{u}$$\], swapping would be suspended as one of the tokens would have been depleted. + +Denote $$x_{a}$$, $$x_{v}$$, $$y_{a}$$ and $$y_{v}$$ balance of actual Token, virtual Token, actual ayToken and virtual ayToken respectively. They satisfy invariant function on IFC, i.e. $$(x{a}+x{v})^{1-t}+(y{a}+y{v})^{1-t}=L$$. + +The amount of Token an ayToken can be expressed as a function of L and current interest rate $$r_{c}=\frac{y_{a}+y_{v}}{x_{a}+x_{v}}$$. + +$$ +\begin{split} +&x_{a}+x_{v}&=\left[\frac{L}{1+e^{(1-t)r_{c}}}\right]^{\frac{1}{1-t}}\\ +&y_{a}+y_{v}&=\left[\frac{L}{1+e^{-(1-t)r_{c}}}\right]^{\frac{1}{1-t}} +\end{split} +$$ + +Intuitively, when $$r_{c}=r_{l}$$, ayToken is depleted; Similarly, when $$r_{c}=r_{u}$$, Token is used up. Therefore, + +$$ +\begin{split} +&x_{v}=\left[\frac{L}{1+e^{(1-t)r_{u}}}\right]^{\frac{1}{1-t}}\\ +&y_{v}=\left[\frac{L}{1+e^{-(1-t)r_{l}}}\right]^{\frac{1}{1-t}} +\end{split} +$$ + +See [Appendix 3](automated-market-making-of-alex.md#appendix-3-derivation-of-actual-and-virtual-token-reserve) for a detailed derivation of virtual, as well as actual token reserve. + +Similar to the case of 0% floor, minting or burning coins would result in invariant constant changing from $$L$$ to $$k^{1-t}L$$. Meanwhile, both actual and virtual Token and ayToken would grow proportionally by $$k$$, as they are linear function of $$L^{\frac{1}{1-t}}$$. + +#### Example + +We aim to show here how virtual token is able to assist liquidity providers to efficiently manage capital. + +![Figure 2](../.gitbook/assets/cectable2.png) + +In Figure 2, assume lower bound is 0%, whereas upper bound is 50%. We also set $$t$$= 0.5 and $$L$$= 20. If interest rate is 0%, $$L$$= 20 means holding equal amount of Token and ayToken of 100 each $$\left(100^{0.5}+100^{0.5}=20\right)$$. The figure compares actual holding of Token and ayToken with and without cap and floor. + +According to the figure, when current implied interest rate is 10%, without capital efficiency, liquidity provider is required to deposit 95.06 Token and 105.06 ayToken. This is in comparison with 18.39 Token and 5.06 ayToken after imposing cap and floor. In this example, the capital saving is at least 77%. + +## Appendix 1: Generalised Mean when d=2 + +ALEX's invariant function is $$f(x_{1},x_{2};p)=x{_1}^{p}+x_{2}^{p}=L.$$ It can be rearranged as $$x{2}=g(x_{1})=(L-x_{1}^{p})^{\frac{1}{p}}$$. $$x_{1}$$ and $$x_{2}$$ should both be positive meaning the liquidity pool contains both tokens. + +#### Theorem + +When $$0