From 2864b1c940edddef0b9172507751476ca85360f3 Mon Sep 17 00:00:00 2001 From: prasad-kumkar Date: Mon, 14 Nov 2022 16:41:34 +0530 Subject: [PATCH 01/37] done --- package.json | 4 +- public/assets/crypto_logos/aurora.png | Bin 0 -> 19820 bytes public/assets/crypto_logos/near.png | Bin 0 -> 9134 bytes public/assets/crypto_logos/usdc.png | Bin 0 -> 20513 bytes public/aurora.png | Bin 0 -> 6420 bytes src/components/ConnectButton.tsx | 73 +- src/components/Header.tsx | 37 +- src/components/deposit/Deposit.tsx | 84 +- src/components/deposit/RecentDeposits.tsx | 8 +- src/components/deposit/Withdraw.tsx | 53 +- src/components/trade/Graph.tsx | 1 + src/components/trade/Limit/BuyModal.tsx | 141 +- src/components/trade/Limit/SellModal.tsx | 163 +- src/components/trade/Market/BuyModal.tsx | 124 +- src/components/trade/Market/SellModal.tsx | 64 +- src/context/DataProvider.tsx | 103 +- src/context/Wallet.tsx | 2 + src/pages/_app.tsx | 15 +- src/pages/faucet.tsx | 135 +- src/pages/portfolio.tsx | 7 +- src/utils/chains.ts | 150 + src/utils/const.ts | 32 +- src/utils/contract.ts | 40 +- yarn.lock | 4643 ++++++++++++++------- 24 files changed, 3923 insertions(+), 1956 deletions(-) create mode 100644 public/assets/crypto_logos/aurora.png create mode 100644 public/assets/crypto_logos/near.png create mode 100644 public/assets/crypto_logos/usdc.png create mode 100644 public/aurora.png create mode 100644 src/utils/chains.ts diff --git a/package.json b/package.json index 4e5b6dc..3dea517 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "axios": "^1.1.3", "big.js": "^6.2.1", "dotenv": "^16.0.3", + "ethers": "^5.7.2", "framer-motion": "^6.3.0", "lightweight-charts": "^3.8.0", "next": "latest", @@ -25,7 +26,8 @@ "react-dom": "^18.2.0", "react-icons": "^4.6.0", "react-twitter-widgets": "^1.11.0", - "tronweb": "^4.4.0" + "tronweb": "^4.4.0", + "wagmi": "^0.8.3" }, "devDependencies": { "@types/node": "^18.0.0", diff --git a/public/assets/crypto_logos/aurora.png b/public/assets/crypto_logos/aurora.png new file mode 100644 index 0000000000000000000000000000000000000000..780e1ef7723c77ec8154015e2fe3516042d83c1a GIT binary patch literal 19820 zcmXV1byQSexK+v-N*KCp=8H6G{HRy7{Z@m& zg&c<*|M!iT)W0z@9lv%*#%JRA6Aebjqc!$PMdMJ^QT#W*(u-_bAxCfs(gGpSZzkmb zzz+n-XVGea7F`M`|2Kjo^f9XcFL`&{Crg_Srhe2eAIdF1oDJz<${IyM>_;jxQq!&dlIJ&J%AfmPA5A$<4j=gc8-swD*G)OD3SA|U(wEx^ z!|sQ$!837z$FRKV>?GgE-F{kAJhCBG!W{{jkP$1wMoo>5=>Y#abdmD$U3o1BT1G+zrQQq#+JWw9@^f9 zd(zQ44>;yi)I3Hu?G09r0Rx(b8^DUz1_ zvDKobu{HF@ppQ*kpi;i)9H&&O4X1_T!lmXH;j0Cen(AUDb(a3_lak?5JHv!>8@fby zGMM;e1WOsqi88-t7&w0lmdv!75srtb0lK}PLu>jZSH{JrMqGh5kPP|Jl^%Y)jD;xN zWwp9~{F%6A_aw2J14SX5im1Y->%~m*s#LJ9NGv!pXx*F-d;hK#e)=gW;=X0|cf3M` z;`j^iTL66d8RhGf3!wdQDaK^jNMrd2zV&g1#u$RI$7E3BzzA+po!I-CzFkXOlc+nH z7T*!NL?8sAeo@ZV^jYo~@3jnkXexzrv4zCkXf(j_Fi=G~`8Yc^K%)?oitlhRgeyJN zMC&I`bu-)fcJa^iz*Q2F7~L;KD#pF98$(qa<11iN#!0JsE(Fr+(ksASs+*D{}+9y_oUL|ZA zED*2gt+@qpn(X&OvS|rI5D?5*Rb#rAY*ZX}{%-VTfY-)NBZD?+x98OzcL#TMh z^sdwuGk=YzlW(spU*k>x3p!MM+*d>$>Pq+k3G@l8nnx0CL^+{;8p+MpZU2;ao*el4pDY1bFJEFlQ9*v;09H=Seg21_8*TEKIM<|OU^zF;!P$315+n^urys+laiPLv+N=Z%7J3jYs zh0VT#rgq%F&4L3cY@ej)`WQ10KbZ@77!`*^xbT3(zS4@ySfT+V0kM?$b_7=m1Xe6E zc+y055XJ!_gw;s?tAEY+tk*)vV?@>DyX0G*9FU~?1a!Pe z8$$I5@Z%qIwNq(}O;}kxOY#aV$*!kPf3K^4U32Vb^y(x+P+|0Gm!0j^l&Ti;jo@Gd zdyD%r2oXh?%J`I;;i$66%_d1-M2-_l6hxPbFi_y-2~a%xY@WoFzFoe2+qZq=QX@q& zopb1!|Di=Gafu*>7_7wMsB>Ui0|Z6r({~3|?SVFzm|eKE-Htpedrx-aZ~Ka0%O{C3 z?%WV%E}r&xk7k-VVyMK8|sQ>jnUcOH$}Ep_ptY-rZbxK(5D!i#`^yA0TwNwOci-1v4jML(Bso2GTi@ zk+J~qyKYaAP|%Qt)k9j|?*=sM<9!*prw@Xa!gdWWVi$xVNu>tt6zr#RmAma_h{jJ0`M=~0(Qg>x zO2p-k+Rc&M{=!@D-bF2FEH>hxAG0Sd))8heyE`Fs#eYlkz^Ih=2_Gi*S!3o4{7EhQ zd^=Mwf^yeNX|+3X4!6rV;vz~LMoMJ&rk}T{NZk&P^mpRFD(u_Ei=0DyW#cYiW1N3Q zjiIp@E1nwJ&Y0Fp84$WivuL_4Jpb^6v??EPxvblzjh+RhBF7fU^A`D^w3Qh{cpXepGt~$x+u(X}Dw4^Qe+(Yx8uZ8C( zQ@E3zIWb!=)z=JY^^4%}rZ&LQ6FfX45bgZkFHs@aLXI@>&cjs^rw6B;@1S2mz&R&E zETEAM^rpn6_Kh|>$Vy%KFABZdR)mGVsk_V9NP>UvCpX9xgDF^mLgdXMAIgt&2iKN2 zRfM&15vD}rXl(08nK&(;&ENeTC%)GO58EMxs!G?X2`Qq`c){xzJOlVM{!LVkaQ5GQ1>3VCO9!o2QR&iBd~ZN1bg58W7{3)^Vl1}f&l6>FsqMoW!4kGiA>@SEVhG`t(ddTi?6juM%a zLCN&Sh5jiVBR1BgsMb~m|HkF5#G6sSa`(wZ;t zQ4k-7J`l>v&{R1F{_Xnea`qAZdX@xskP@S^%clLH8&iZAv#ui3=01QlO+8vk{M%9; zWongRL6DQo-MB5{=A+aBS8!SRLdX~YaAy{CXO?^UoE*xqZCE3+Dt z&6wLG*n}-w9{(6-nbplWjCxeivT3zKT#3u8ja;<+I3Q(~qFyuBg~CfvRr8UpS?iD$ zol*R8x9$@jw%2+EjYob=dveRi)!}%f<>Ox#(?U5k3NQR7YL*4fOlB^{NeXD866vJl z&b`S)>6t-6;3~N(u^UZ7ECaSL4(eJzaaT>A-hQ-AOI3`(Hh!lom_W?|!K@1fh;qjq zPsFB^V`?nZYYt}TQ)D-pT;?e}pgsIi;P@|UBEPCWJbl4lE>M*9VqK9}+Ss` zA`9gg;hs|Grt@H*#a~zkaKa;(=%T&hH_o5Pg^BY?>=@5Y%&#gTi8md2U z5-adrH1;{tzE6eH{=35Ba@WCMaW-$1la^ZsFFau)`5p@Vf!^X(af^r6=~k@mzS)AQ zU)b|)zD$j=6-LOsYH^LfC8dYxm9=G{tEvYY+m+hSN5A)5O}e||!;rP$h+>h999Gff zL7@XYRW};`9aRmM>q+voaYyu_={lVnMj!u*ty%v01^}Y#MjN7HP^zNs6IN^!rpa86 zvoZ$T>xun&UEOyojtjHiBw#bfPvS)}4=?v!`c9((T_S3`!cx9JBN<&Rm29KhE~wg$ zu}__?dy|_!*p9T#To=@h=?9BUEe_{83itd%2j4qz+GnvdiT@RUCqm|7t{u0g9#W38 z3{ik68bPaQyE^dmM}Y!Yf$=7a!iDv|cXB8&fqt90Dq1~&MVcAs5D9C?O&qMpAeXMq zqj;3i3ag1_+$H=*(XVp}<5pI9aPU;Ea_NUp({V(u;l&*Aq zy*Z+s3?__OG4-|LmlE?;8ai>-vD;&ize&o&3xB{*q3*JvTTOjm4IBAqK3Xxim>jcF zf=wur%uLrml~KCl8kwN^Qs-ibAe9@{+9|u{(uaD*&R^p=ZvD(@xr`>wpFy;drm*E^ z$vmB5>hG3nz5&ac(!x-lA1j!j{E#Hk=S_Gdp<#Nrc+8F6f3m!m+m+ z35cxYzbh(hlGZMuWeW0mDH{8fwT^6QeoQDessg8o&#ZC(YENCCj$K^G0)#)v6_X2a zF)rm{@qu`X+8Xt?`d%@YXZ^_Qw9}2p6v1Pr>(u5+wxA3!*)uH?U$0lIZGCU9`pPMF zy41~)L|G^N0b}z6VJ|aiC_Ca8RGFF^G5WO`ZG$K!5PGp(cjLjU9hk z0YBq=@*I(${HB2aVsWjW_+3uP>~2upokWYT1hD)>8i!x>8OT@U+morn9 z0%Vgdz~_SKD$b){QWJJnaXS7P(ZCoB$?8uR`UZF(UtMx0k<&UsDEt}9&*x%;Y%G0lGPmth_M zevF<4jf~P0mKv_3 zrfGg%z`Vrd z?WZwauJIShAn#NC(!>=j_P%F$xIO2d(Em_HeW6wtkXG^o$9q;8FSVQikW5JTYI)lU zI)th352D1@wygZpXgobG`D*;U$swqwnDkw6P8CW#K%q;!I_?;9wpv5lh3)&an|b3} zLr0Lx$)0qa!|XLgxeOTcbXV_L?dp`B=Lg_dX!5mN3_SHO@23IA!#)@yYwBVpL9k6O*u^qm__oaq)O|FEB`OzK z2jm;bu0x$+!!c>geBs;%1?Ok|H9jOpmNuSW!i=a;GCe|@zL)kTMC(-f5}}xz$P}ww zDy~Abr>o`djKpA+Wo&{h@}>6Y-j9E2xG=>(tM9*6Ja5-JYx7RPTPvtC=1mLK)|;=K z7Aher&~9S7{=*vJdcb+~X=Lhbz4P79J!o-|sh`w_7XtVUfZI=B=QhFK(nuPAKDTh- z5<~r$43YEPX6g(&IK$Q?CxT`;O1w4bk#p8_#dsjE)0nBHls{<8twhWB`&$aoTr-UW z&C(N6n?y^lI(K^}`Jrmp$u(TO>Pk|QeHIFi>P~BBzdEIqjMFoWRbNJ+^yGZuAXWg- zcaOthkRsfe$ZxgI48x$hoZjPh5^wg!yoasc?5}ww zgI;Y<4vOG=ZN9OjX3Lt1_G1Cx6c6y9eYsXxKVpi;E6fvDGa2U>-!1r^RMdMHdn_*# zAKPr-;|OlvFToJiQkvxDjc&=OkSXB**m^D8>LEdct`;lr2WDmEaFb(zleYJNP@RbG zyMSBI-JHG^Fn*>9#Le1zo9NV$*z@`%`Dze~ zd|c{bTWU|FiXF@2+U?UH7C*n!^i_i+(l67J^;*!e?=tSTXio_wgjGnGpv zDIxIFT2my4c0-lC4Qe5&Wp&5H){|7Le=csuG+MrEo2;0`PhoUxWVt}8+?Rd4ErRc; z{mrxe#Mgx}T70~BjxjQVCtc2uvgtzbnr5)8szi;&d;^^`hQ~l^wRB#X__bZlxLQg0 zbj6p!o;0Nn=RT$*(cG9|ljpakL0oXkaET;m@Cp&@26H(Q-sgAK*xX;0m0yx4qD4enYg zL_gTjU}D3W+;>^)PTowy4;O_l?zJ{z+`U7{cmL*cuj(C%q@-**_ihj^)y7xw<3VRr z<=`Rl(zhCt7kOOW^i%}09cl_ZC?5&hFqDWw=<5u+&Gy^y1X0WDEN(2+a@7}WFwAm- zw5H;zdF?;FDA&aaDU*I>4KFq%B6N$x*o*hXYIl+hG4aggW0@_OOLa!cZWTyj?oA~< zTlk!`xsG3?9(Rek%eFPe4cRWUE|qLIj82BbX4HHt+-VwT-xq#qIlOwYb~z^BJBs!i zD*mCo$uwZ$lFuGqr4H4HSQ1ndEk}N)dtNEwFOh^;STdiyvZNXqApv%h-Ke|czk}DW zzq=(@ctSPw``~j`HT0wFK*kvWnraUQfv6HUZ^Y`2$*+Q;t$8hco5u& zgz!6lz#D3m>I6uN-JzFOn?+H0mX@!^!O}bndMgt{GwJ0lM-~AP3x}5nxt-vff2wa5 z!7_>c4TC*g`@q@I2DwHNNkVLM5!!A5ucX(T6@H@c86w%5Td`X0vPnwv1hJqb*bP0v zoL~#sH3|l#%dyM7Up?(l&fiS#a8t8n5@3(U19M1sRUUU_3I)hoj&rZ01qEODrZiN^ z#(Ois#M2ALK39U|K0_STe)lOQ0t%{44*vXp)wVlM;7IKEuPC=I>1|nawd@#wCN5mN zo+~=M(#cOZhqQ^$M)|cfxuzy7enE^mGVK#YepSXJUgW?FeBd0V<{ca@*CR^B1wpyU zUlJ3o;rc~;^;we{e>;Er%Ux5!h*dly$l}H&+cEc|R+|H4weccw35^vWbXq;w+s+-t zG3qPB1Ux0lQ43j-Q;mNXthWs4Anfe7f0zu#r zj2OHkeGDI`P27OH$yaCU$J_361lyX&m}x^oDT_Hb&_449^E#0 ze~3wp^#Rca_?nilgTZjnzD+3+m%fOpKGmoVv?$;*SWmZ4Q%kgi_Q#b)TB7vx8W^Su zDSMB)Q!1BwId!h|N_adh3Z{0jTpE?lR+PQ`Xu%?r6_-Vn4>$Qo@dxfWhRxiR4(-xUy)25%mM7h8Df{jBa?i9EiYjgU5HnIb96 zrmfYKb>GjHSA3i1iM3Y#?~6V=b?bz2cvf0!zq?deEf-z%VEFU96#en&U)B5ZcJC4& zBIuONy=$>gz=UFa>dTGjUvutqFl2EePxP$^J%^AnzQ+oifzRjhB^&k6bJN{e7CXaO z8K&SJc+<8F$TP>sVkwOFwbRVDs88DfuoI>!Z}A~L#!!E;8UNH-R37gS zzAWDTIltu-W0Jr>?`O%RtSdtO5WagqM1aiFUt2C4GKgmVg@f{gO6#014ENtn){oCE z+r*H@I!6FsfoMr&7YEb}y#?1cztu9Q}ykD0Z`^4Y~Kx|vl8D&2jh=H%Ck}b_!s(J z1D0<6$8eCXB7xN0RvkSLJ%9$j~V<-Va2F_3tyAVN$^q=K{(`yQCp39qASbglexD%ip~AM84vad=|@QC zh=dTVGw~#(+1Q%l@6X%5X&9jB& z&ID4&L9)&Ni1`g;=z@%*!e%IJ<6kr7<3_k}2I#VE^*-dHmWs8R${M-{xF>Ofc|l-5 z48dsTUP-`(x*mc9nsIv`gQnb72S@KeR_npFu|0ZAWEsf0aylP1$v}+_%Ry(12}Xfn zD1m%WZT7gH-8LkT?1p8W!&u2|CBssQY)X=?bn(J7Q7)T%emm;N$R3NkvaJ!4bu?4U zW)RpGu?5BmCrlR|$H1Z!q7Yi)Op*(#&R8NBI#=omyTDFA}x2_n6!6H3b z+!8%(dK?32?3esSpL0vNZO|biO0Y$~GZjU$)=-80M~bY@DE}Ac`vEd~Zk=6?6jrxm zRFp0EdaYB&AqAVN8cUf~1C>pcs;JAF+#6?OuO7laU~a&djgHPan151o3lp!OWxg*` zt2%&D%~tF0T196^PEgZ*50+89V?V>4UT@fO(-z{M#b#kD{Xqc$&k^=cC$-5iI2W7sp-;UkTIhQ*(6)L@8hIFj*`QAOv2A6;7`#Rp0WTD5)7!vix zT8!;ucJ=;7{P(a(E_MiL!D8|?eYp#Y z!cHv;H1GaCj(?u9ik5sH=!l~Q#F$U>{shR(!cg?sE{xJFf*oFxVkxO*<(5C=#SZWY zWgEPb?*TzCnNA*3HsgC z@1cPGmfV+Gu#>9Q(BS7QTb}*D%j1j91%2VOZ1PqY0F@T>uB-WGPPFs&2+QKR$&8pk z*Pi{yc))^+fX`-%)ikOL%odtW!ZvsiVs;L_BYJN!n0Q)Yxf6ku$X!;|u|q0jvMkWz zz~3dU2-8*2MPcYhw{@}MH4&#nzWA7_u9qPPC|oZ8xC15Y@yW{jATUfQ^@glw$wTc@ zp>;R#W!t(?riwFk-XG`I(%RB0i)C`uFoa{ZzeFZ0B{cOuf(UuKa@6HCve~cVkfHH(I9G99CM8N_T4~!G+sA7*5;6b$(cnXNxb(z_`xUP!W!31 z-3YclkXwHfOfr&|QhjrR;hDOGMnuWrb08ht!pz6zzriNAG6ciCD&2_;GWd*u^pG-} z5WFYw~Oat=M{^DZ*1>qrqGx~Sm^Oxh%u~zXRrF|bF3J^Xk;ZeE&2=0`XVcUiE}i2;H9c%(omdGfC}zcH zkyOIo7%XB+)472l%|5dd?++M{z0cLI{W{?rX+6AX`OVg4#z?(__>|C|LC6r?R(;bT ztor>wQ-N(7-mUgO$5s91sdUjJQ2fBGD-qP!_VODkH5|3fCR#Uy@?ZrHNH1f*c69qs zW}=7_a7xRB`WOOWGk(%0E{_L+Y*-E|bM3&Xv936h7HZy>U+Jp;Zjk*Zf#c=6dnd~l4fctp^&&qK%slbyJULQagxT# z;!#3pv_PAUpUx327U_DrDk8D&BxDKbj2t;Jj#f#c=B`h*qsP#s<>06F9%}M;KDa{X zC0~R0bM7zDxEB4xI{GvyuX9MQ-K;MYk7_H08K~O3JY5Lt7zRV}z`*o@x|TgQi=~;n z`?a4&V_w_rcEytxX{#FF7WQJY&e7TQd9 z)plbx$Y8tl*9KUh^F90gr|PNdH`mz!IYxONIVd)(Xa>M}PP(#qnkyfx{qh7dfM_T^ z(vMfUaWi>2=s6H;^wlKVrHYi;^>*?LC5Nv~>iF z4%oaENCWS7SAMEbHj?!m1l4Mfq!yu>)2RN{qRJ^r5x>2uHR?F zHUT%H4zVHWxSwgxC845jB)eVIQ>)LQ7V@9@jjqKf*(n|qyh#<}Se~z~E+q6+H^hCj zJiG)rWb~swuPTvMO?hyoyydEytBy8{iiLA^0`{xvMQ^!S;5fYS%ZcKw61%BAm#qAx zVM?PxTk#frW9vB3cI2I1gI%e*lsA;bA9 z`4taBL71FWEwHcZpZvlpd`1yiheMXeF<~Y0mh{GlsplG2mAK10zY-tnj1Sg@otZKp?lHI5;rJwAl&B4# z>O&m~1l@P{|FTFWhu%nx=5zayg>@;w(DZ3?yFa+SqVKQ8OJN{6(-@7V51cvh<(I@N zlAKK3t#?X{f>SD-0X=HU>6E?gFLN0s-6RG0Ce?RLR@8E6Nz$hb?6lkv8=hthRsRA2&YMG9;T%4Zr0W2mjpql43!v0D4i zU)nb?7BiXSgX^;AjfnGy5ZEmgKkNrYZA90lf3RPE#2J6$cN8*>pyw0KA^O}VU;Hk~ zn0-?8mAr{Xz4)+IsO-|LrIziMl%Qg|391GbD#}4KQaMX*Y;X~Ed)>Rcrm~sr zYSFwj5xIm(V+7T91Y2|=Ry6<%WxUH3W2!Oj@5mCt4nO;#(8zknA}~R!t`=m~p|&$4 zD86&_R_lHT>hXbO<*!si*7Y`vUQ5`#^j>u13(GQb(GN&*T(5aUXb1eHNhT4UPn5B+ z)`@Y&`&SXz{6`PIogG(*Tvz`=(A{If+czeq-xtFT(@PCGv8JkG+jG?tzebb+WPr)X zIZ;P&dGbmvouByC0y@zP9t!cUv4m+xG4rI@dE5a+yRMl3n*XAE30dctTV^8B|1^Fz zTwWlr4J%Tbw_6cROohizHHg?<%`82AFdLp7jA5a*uXOH&mEt;3(lcUu&ysn0QGfE7 zDkwK);=Xa)65UaAlgy@-#!4X!M*umXLxKZ~Ti&^Q4MbE9>i$+(ZBkFKmVhSIv3ORU zFHdfh!7l}8!Wt#~a8F$LgZwvM{1F$*?`$F@sv<=4{&-d`Z)N1aO(f0>=`FCz=15EL z`B6)?5A>48Sw+0GoVAN8O%d9MoxI&IW!QzuTv-7)-{1!_-A1puEljxGO5;25Zw>@G2s=Kc4W7W>bYg~Y5 z-)BpS)uaSyiN{v-xc*p9q@!BCvOd2qefR3_mE4iL8XVDaWM0I?pI1~cmkH0>8NS`= z{I`eJJr}g>JI&{5JWDT#A*eRygpmL8q*tDCSWA&u|L7-)l7Xt&%aFRl%{q z#{rDC>tW&W_?8>R1m;9q88qlt-b1rjMiMPpDbyR+jq?5B#OCg|l_Y18ux!3>h!kER z=o-m%T3U!~3KOQhKiycadYYTQ=YTC5kg15ZixU}8SBMnHKgioXkhiX0ru83+H?x(B zR|l!!?^qJD;+F7k|5+D&B)#6atULYS?GIOq6Zkt=@SqHjn!i@YyXFUW);jO+2(Mlu zPMwg7IZ(J)RP+aK0 zMWXh7#aPHMbtqFdRS)$3(@mha5n7#pkpUr7MI@+??Z|;+lF|^B?=M=HY$O=c{1=-o zBQascx$@Tp-xU=ujQq=~As5C!O|{65qZGsQK@wJiZ)o{w2!PBn63!&#K{NkSZ}3@I z{J^mWh4)CsSXF(#4aF??>3da^`*3&*Md5nlPUFOfh!=w;WHk9w!=HVKAFPPkKlbA- z$^#~b!6RIRh3_BD9hg*edBQYPBaa$3>#}jJ5&#K6`8<`6Q>Fzalr_o-7_5 zpMh|Yu{H<730su(ghHeG78n##IRFrPTuKw3} z)gf<()Exq~8Y9t|fHXOz`(Hg(nM&P7;!TE|SUwrYsHDHuTp~$w-?q0ewuZ(y(Qn^%FY0iXFQyCEFEN!6LK17iHIx7L|JqIMCKw43| z@`xI=W%n7;-9#u(A-t(IOPBh(E59X@G= zo7mh6v~g?2a_4h)kxgW6JCEz>c%&vXk084J<(_`k3Cx6X_2Gx>lzVjPYFATqQ210o z=o~pMgqk3O-$>D{6j!o3G?A7}!R>a36dG6d3-NTm_plQK1|UoT2w9udAyd10EiCmd zC1f2V*1Dn@|Jhr7ijG&wUskyTy0cWnM8FcgyLmHB#4YW?#GdKWBv50XmpU)G>iB0}`$Zxn_b+7qt?*1fcI0*$ z%+3BF(itJL_*cyEc|39jyACREp$=6ap7>SLa~@dmbny{s9;4E`Pi%btX#iz8sKqx#7N}yeAvIAj^~@)Z;6~6j2(3cUyPv{juR7eS1Vaxqp2BTf)VcNL>wd zz0Y`##rb{5$V`KX3z(pfJ2>A||H=xWP_E5O9Q7eo9m#-8ov2fp+H(*w1b;q1JFboM zs4^YLShwL!4;pUMGyWsg~%{{y^{AZ?P} zr~7a}_Pl1oOa9<-yybL5jU=QMBP>PP0?1rCw6n_=j}GiC}##U1KUhV(l;)#(EMN2gSVZ|D0lvZc;y1cFY~m|`R!b%%`8GR9(tDouBM znOJ$xN$+<^zyKP0UXI|e=T87e_f)drJdKn5geqead2M_}-l!C_v2(p26D8l~vjb z2Y9)0wf9knL9j4}%+F$OeM-TiZUB!RMvj6k$M<8B?Z(%(>ph`A;!7QEeOrC|{{qA^ zUq&!4Cljb9W?B}#zi`nY#mbIHq3A8Y)Yu|)Yn;uyo#Sg=GOaYPW$TpBDbSUV>0m(< zGpr+s>m>?I~q#`WybL z*ncu&1ht%8uXcm(UP>=F(PD__kbfkr( zU0aW@v1HT+_?3C?tZ)ByoBh++M8<%IIjV;E!!rd%GO@_^ju3$hmW)kU0Y$k!!kD*5 zC{XbeEL=3;kl@I90S0RpB*)X)vbd+Ns#rwx&EQ!FT)u6^r3+4nEi@d?c~Q1KqE`)C z^^~(K{JCLQ=71)OJYCpbu1TN43SVsVB@s0f!^-77*@5zGkjBuD%C~*7eX4l6j4;|P zTKNfmB-XmIZRxv5Ey*@@3pvKIA(>V9c9j@u!@QI_ADuef-u}pV-C$E#>6uFU_i90H zQd`Kw#mWH9-7JmnBhu?Su4@*U#UfW9)jYk-c5RNT2Rp_c%qluYBw2T)@?)HpgObC8 z+)2h`z5WUNe6IuCtui_2e~Mv1FE-Y8HFSN0xH;Q9p93aSK{z1S)6%ir&1O9jd8*Ma zI_aKG{Db|1(0h(zB%1fLv}z;pRJGK8A)0SiCB>6#c0SrSm!tZFyV(z%i?3bu0H8U# z03v6|Uw&dH<$im$s#CEo-TF^6*o$tOoqXST0F(brU0DWJLwRE$az0*0q7mpQS-z-O zW@z&6{j0voB=^3RuEIX#9^XCm{yqQC+iq_%PaR{^t+QVA?PDECu1Lu&W2R63d%E7f zeuBmO$a|AauuCK@)9NJnM#Nkta%R4&evF?t(LZO33&Ei)Rx*{fyxlkyeZYOv^U zVSj?u_YLc^9u-{YBiQj=f`d#xK`F&8<|}e{L|q`&pZ#}R1klDH0@2_jNeRD4H?&O0 zHG}vg-rRZ)gEtv}5N}s{Q3RD)Tp2fW;A~{KTuV5QR*#hmW$jtTGUVGqcCI#m4+$_$ zev?g2eInXNu+@T+1?cdzLOqZ7{Of^k|DqWIi_xbP%5MeJwrjop<;eruiEW>#3T#Zq z8CR2D9LB2m@R_~_1H9!))r%vv#BVIU4;8dMiV7E&1+)9Zb zYs}~Kj1S)lj)jVtVPA=|?4|bZ<+5Y^rB87owl{=Tg`O6Na+e-MqD&&C>imSYPA7}a z^}D^>Gs2|vU(tB9K`}MHH?n>tY9XuO6rsC=x>`r~7CIj7$1Bkovdv^*5+V*;_xa|F z?e@dUN33sEPhWn)`Kdy)tUc?^bs0G&8GU|eLy&}!z*ae1s!}{gsFi*+iv;P!e&w5u z&Z(#F+WH%gCr938i&6kv&_ed#s1!w!#5v5^S3rib^3cqiRYBoopt9W`%lE{iG@LUN z=pL+y{x=qH!F^WIOGZmi3(<-K5RsPmU_jVcQWbTiOel$;Y?NkH?sB*tC@C`FTIjO$ z*Xj$cY;)&dtwt=JRVO*?J{3B^vcb-f5LAvlEq*}I!$i@n^nt+en-Q?~&1WT&`XVF} z_-ly$TR7lnes(B*sv?7esJkhG6xTshee|jJ<_5{QeJ``icrBER7IV%*;qQlJ26bBu z(3Hn{par=CTTR5~dQWw?MGrbj^k4SwHy-Oapgh+5@(B5B;cfeP;_p5^Lz&GgLO@X) zFr-zWvuVlR%L3SDlP1Rm9V8xO1otI{!$ulP?dDO48}k7|Np?)m>Uz~4+~NBuTm{?r z?dKaw780{HKpm3-Lp`3f7dM^%`%#dZ>}@wKd6<+Zy5x{y?VG1MTmj-d_p8SK`&id4 z+ES@ipec#!Hnx5HYW{vG%-AjqcgENj=zra2=>~WF>PwBpr+-^Z+w>4y>dVxb=80-h`7v zPT*TX=TCJ22-xWRLgG(v?#c&ogD?R@lM*%2cZow)cXKn6icZNJGddz$-=WOlYvZrn>hF0))?0Xq-p(PHqngrVQGkJ-E{diuSjQR zQ)mli@MiLTiV^BX!}fQ%9tz*)Z=xNB{MYe?uCF2mGdY9?ckugUW^C6#fxxqU>ibP| zC%y{xq2QDsHXo`j*~QMCC`CD-E&~zHXWR|ig$2H-D$9dO$I*^*z1P#0dv(l_v>qYs zBvkb~b3&B%bBrF1)=R3|kr}JRkjH#FIwgKnJGM7!hxRF=6LR-sjdfEYuYNN)9%a6i z#XIgBspmc8cfNJ@9)*-VkP(U}Yb+$gB}ax`Hq2bNc+m16KLqS?GAj8_`la~l(pE4e zi*Ws@rk4FGDFapK-hLeV0i}KAL?t7*AMK+fB%Icq z+0?G|joM`$%khVqWF<<7qvZ-#LJh(eg9AEN#v=(82>cXv$hvj6lV9Ty8cCroSk?DD zBhxsJr-%y;{e<05g$HY$Fk}E(6~^d#j39BES;6-@w0;MmfbXK!0hiW0`NFnYV&o@I z^P#g8gWd@EF`3aa3~{v0{3w+D0wunbQTfjFmLIDkv?#lN)Nmi zaO%ZUtnCAUunAs>Euv}!B5wZ4=I^%4VM@d=e;>8D8J7s~e8zgD4YUUEC4nKF&jT4<**^LCl&Qu& z$uXLi6SgFfICl#VrSG_7Tqh;`TW+D{`aST}{%WJhWjIxq$Ne?nMkZ1RFgXAQ=VdP{ zMXzfO6|VQ3n!Hl?^`N>ixtuCYX{ouhSl#k+Wk}BBx6(d}@wP}z8>kc+kd(HPOK*fL z9JxxrLhJ^S&c;YZ&6Ll2ZFTpiytTu4Y%y{is9OD?xEP!drJgtA?)n<|2`Ktb$!rKotMae-gAscm!iE4MQ4*@AqJcWO7ppy8;LQ?$WigAn zCCDvX>`pK;aCV9{F>UoGf=3RP$N~nSx}2&1mji1dO@ua&C<33yRW{m1DYBBx;K`{A%Umuql$Yn-R zzR&3#8if9e@?JY@8g-%Lcp^QCO`=B93Me+@-!9Mc>Vx91%pz@cijtg*`Ux}2&|(6e zFjzeG$fj~wSuQK(%pcr%oAtU5Kc)NbHj6PvhJyhV%ALPFLE+DmKdp8|<8=e}#7irf zibn{SUz_Kp-206OB5OMY57<{Ao=W^<@X7BS>~=Ir?vxb&`CdzoD0*YuFoY>{uv_}GnbNQOnpj;Z?n%INtnpG%BuB*Mb_b;bVCxEu_Z|R72$e~fXiGFh4uQn6y5l)^dogkwpU)Oub@g1 z0!v(fLzFDyNdL8MYs>*s&Gi+i776M4l96DstEt`KDEHTU@qD{U+8!oi2z$;`N*Kr2 z3WqI!1NQD)dn-z{N5jRV&Q(;=FSZ|+Vn+XRCI?wwG@hfUiwvnidFY3KsRNS3RqXPz z7#z;;286BlzG{O)faQW~y?EW_emo)z)yOv9B)`_+Yx$!aD^}${$Y$ZS#7K`!!zcwo zBw72_VkpQ%QKHsP*zYUv8BfK4+mX{~um3OZLI(Bf$r%8$EhI8zJVZB+Nm(B~Zo*Q) z#{@2dVq@tP52?*k^z>jrNLs+-pY<+!{|gg zPE=Ar@;ZpM`)3T~|GhS27NJW+HdRuQM4yVaj3t+2LT~RRR-XN1<9~`d({L! z$x;j>6b20kjPJpDwAj3H}eI74>{+%Z=bW@42=%FZ(TD@`fyg``T=Q6e zXY^6e+I%4w*>$2GTPbq67iB8!3T>#fstXd2-j&$r8*g}fK52>iAhBq({lRr*pU%N* z7-NA19;LI+x4XQwve5Z3p>{@%^+CvN=r5lgBbm%N&Cegu`tB;xN{p?l_clAfpXOkc zzaF@IedW;=YhWX!K5ApWN@f@ zC1{KMmAh>kUJ~%uQ;Upow85}6V61l?`1W;&gR?8+IbxVVMIxDSEIxnrORX8>S`34( zk)WoA>%{rZbAj)%9X~cn0Uez{bmVdcf`aq;zdjVIN6q=quqW;yav1odkou&C%~%rv z8}2xw7wcV4%{@NC#wT36JWx3xqV148v}=V|3mCstf0N+b9p@e{4%V#&EOTSUhf&IgXZ=c0N07Cb|GZ~;*1HMQaN z^-xy#aB5fmV&O#DK>K~*0oydLGi4UB16md0qBwE(T@ng1=jYX{6#T2Z3u_E3JLuM* zB!5a(DB$FIva`kN%p`S$^O;%AF6(9yr+J$BD9tC+?lyJ`J%(IaJ#@Z7w1gt)&&RE| zx72ZInF4%%;@sg?GPjA12MsD37mbyd)y>X`|1x5YSPZsL)2Nx)6C<~vc?q_>!OvD*MQrn1{vNzS(7Jhk zd!?*QrJx4=9A1FXN}Dt4oZGp>@7sXIiyii+9Z28pqttu&{_5&nKXVYF{Dxd%LfhEw zj*XBX3G7`*`CtlvpTPoJf4*51`5buv4t;LMbN|a4%E7xLyf`&m#C~;vC4o*F=0KgJ$z`6=!;mnseH7fES_)0-ahqs}aK*KktRv_ebbqi0 zD=J$cV8|xfy|v+&Vz&K25+`^$MlRh7X!Mee&YE9H=a5nchm3#=*tRg{U`ZE0l!VNJe>*Pf1qX+L!RM!m|Q=(Hi=& zqol~Q<pjWROzl9-Y4vr^Xni|0WsiLwg6H|dv3Bi_JLy8A$Xf#$>vLU+eeGKX6lj4 zYO<3=OfYEa#<+5maYgR}C)^}ni7R*5EyoX-sj@MJP`RE}$4NQ$sd@XapVM7B-%o-P z7Yww{w8?&nA>P*%X19KN1`ALr z0rqukvP^vtmn-g_Gb@#qu8zMH_hB-)T?exCGOu2g=M@tMu!MPCEs7!3z^qpr{_N&^X;Pz$K8K>yWjbq)*cwoI2<@C{V|=+dnH;z#(^-`?G6)PMEf-6Ndq2V zvNG!AtAcbhMfVTe{h&v9T*(Tvo|Cn=vdUfHXj`p!G3w%ZAMBy z>F=06++WwRY&%tRco}PvXqpw5^&-io)pb;)#N5P#8kV!IY}$2@p7$D|ph zb?W?bzrV`m)&;{MH;vP}#UcFxWF7a3(NF#CJ$t!lDbhczhq}^#Hs8qlV)e>F(JMRW zty`U4(i1QBrl%!lR=9K1xd}17w-u_VqXtk8b??wBa7$K}!{EH$*%Q zFSd&8zcSp{7IBuKK*-@3>Dy#ZmcY?c22R`Fk|j&}21ZQ%aV z0i244G@d>HPCJH4?WcQ`E$wUd``Rbto5uQqu5PVaFfEX|)1y@ue-kqT`}=`4xKOgQ zhc@RNvc6&1s4|1T>uP<38%igJ&O=wr|}S@)k3PK22>e4p2l*Fx8gy(mHug4Z;b#diUjP|Y1 z=u1k9dT4a^e_!#`~C?WbW{|+G5Bz=Bk9D~YSa+X}@2+M0fv z(!vG9b{N$6rQ}ad=t6BR-4IKU-9)&63^7vbG_)RLUfXLiew_k_`rie%Zw_uh;yDbq=jc`(#a=-(XP50Npl@KhpdeN5_pGD zPae{J*-Z+VmXh3NY^*<{$@%XV&miGyh0Kl8gkXqLg=ps_lcJ7B>f$&Ju@7m==v1=LjB=gLEn&+(q z|77)_nF-Pjr}K2^ENEnyL&N#s68_z*=ZX4AKV5dkrj tx{bl^|H|5;)Maw~4`{Cc!||CTZh+LrBd1hG2AiVB0f$*#t1)qo`6n)dtT_Mx literal 0 HcmV?d00001 diff --git a/public/assets/crypto_logos/near.png b/public/assets/crypto_logos/near.png new file mode 100644 index 0000000000000000000000000000000000000000..63fbddf33bfb5f688a9a39157f31290386515634 GIT binary patch literal 9134 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 literal 0 HcmV?d00001 diff --git a/public/assets/crypto_logos/usdc.png b/public/assets/crypto_logos/usdc.png new file mode 100644 index 0000000000000000000000000000000000000000..ab4fcacc835d21db6698ab2775d4fe16cf91ea70 GIT binary patch literal 20513 zcmW)nWl$W=7KU-x0E@c@7Iz7*!4p^(3$VCLaCg_>t_i_?(clh2f&_PhyZhbm{+QaD zsp>P`J+J;NXG(U1%tZm=Ktub&j8;i@Mn z4q!J(mQt!xaBy`An9nB2uzPeTMcuD(a5#PcUGPJWKh5Ca)S*hUQd*v0PW;e)wFef( zUmoYG-)gGnv32@$d+dR2F*fpIhSAg0V+7LERX&G8-h@AT<*+8=RI+BD^ zp$r~fg6K%^5KN2+pow?_dlHj5t$2O#_2aD`|5m*GyY?caT_#)i#>K8CM9==H%M|m* zb7nv6&Wz0{wE1fGohzWuNN~D76bnvC{NgY={_?oT8_szfK1TjByc;9Sa)f2n81?$1 z_vpcX-PQa@Vp*zh?6n>F&Ei$1B>vTdq)Ykj&CM6^GVZhg=Ci;rHjTN`)1P42H?l39@96&Xl!|!7`w5>1g$@E{y8626@(U$m)=j!% zCV%7)h<`oX`#aN>Kj{y+lN_*%+l-m=iB{!)z9`+#@545FE(+H8?V*l2?;8_9iH(iT zypeO6X#~V#LTU3ww_#-b_%l$YK!xNL+#s4*vQ=wbgSXj*sccgQ)_@;HOGt>0=gczC zlD3SdK&no|ApfP#Vb`MmOiuI{TZ?d;!{}MNS%RuW;^`@9ZQ*^o3d7q#S7&&5_;|O# zD4O=$w`k2kjM;40Ex{@DUtepu;z|HmO%BFA8Np_ZBp7(XD42=<>9NRYF>x3RIFF7u z4gr_g^eLB`V;97wq2Jaw6BJ<6m(FrMAxf4OCYs?33r4}Jmc77Wu_fE=uu$KlSD$r_ z!_djr$-8VL-M`;ZfB>D|RiAK2PQD{TN#4W7n4=h=&WCj$n8fZ{O+3t+D2n437i^5nQsx~f1!twW5?BKi@swga+)*(#c6ze5Y zH2T==#i@~`w-t`u!%W>&31lk!*R!D8y;5i+oo`*tmgqe}sc2}2bcC~)U??L~+|F_> zAMcL(=kK)rc=jxv)kMw@li<1;!I-F@i*c zpB=8BO2&)5+Ey`turtS7oJIxe{1XJ0F}k*sl%AD)7D)I~1mu#DO@y+gh)hx{#+S~| zf&}0f>e_FW-pf2z^O(?Ie{d+=y7^>6EW;)0Z(R}xdEo*`Loffm2 z)dk1zue&STY`eEC#py~smdKRC@iPfNM5gjf+qr%cHS#cmA-wwh% zN5i0N(`w`TRBXKy*-8Da)ofFmrZAUAe8t@Uh^TOR2NSF+ktm!|?rKRJa*x43Qsj${ zc((t@>G6O}2GzzkY=+}h!sedWp5k_VeDyK#G8Pob4b&AsTd}94zgrLZ^~$l=sJga$ z>PTHw(%*CanW`lodh`01?u9j{=WyE~W&Hun&(F&jW{cO*@~2`YXqL-k@kr!CuTQ+? zC8}bdRd*;9!^=zS6&p!c4lXA)HaE-p(1dHmA8I=75M&=c99h-h zd38?xzPv_!S|8?4(BA@a1+nASdRlIZ`won~Q?f3761Oe+_xbpr21&+rOVXY=bXacA zm1Hdal5r)l<4*g|8LPibH~CJn2+e9XeRh1~JE2=;`oj&99U@z066m?)iM zlyGd^aFwW$KYql-F2d@(kpA=9#RkZyagOZrmY~P3Fes(Af;7EgygTyNP?kWjeCg{aoKR ztDSe%lF!1tBzz7Ry?p%q_$-EIC@K;orE&65XSIiM&bF5eL6y2c%t2XMsEoPv{|uC# zOO31#i0}FS45NT6*aKY3NukCUF0i)jBfV4zBh7A=ptOxn^ZCCAh;QJSRDN|T0MpRw z7dbTwvhaqvOUs;z&*2KgO4q_zB>{RbKAp)i^Np{4O#Wf&Y}lf3buP%?8g%RYPYl+_ zK7YV>Ikwl{$;ik-ZppHy2Ied6`nQB!n?eU)X5w~Kt$Q)JeO685LKiX|#4kCxqfp4Ki>GhTI zeM$0-4eO^GP&K{1=q;Y{UEbvItSjcj^e~cekel2J>6%x)D+_gZ3nRK5Yi z%VfHKPy#gNtD@O6u4d}jr=yV>c~ldW4rV~ctn}CpEj*3@i!{j zndU_;B$&J2{R-#R-X}u%CVNDcQ=rx|Wzl6jQ`c~&tlyv*v-`8}qxCgXxZow6&dUo` z<>x4ED*fiGedt-MZbc?C4Z>KqXol%pS+E-!QKdGy=za4EIbf>F-D>OIzq`I7cuW5^ zG-6y1{tlDe!5IRQwQ|V(G?V%td$kSen`Km+;n4D%5>v~`W9{Tq`x_b-R9HkaO>A28)= z5%p@lalxhLjskVIJyJ%JHG8g`(!G2i`81V}aDDY`z$V7d_jWq9ZG9t*5Uz!~-`(!p z%pN7fV_)a%GiXH%kt@!u44QMX-qh(a`v;=frQcVc4w04=QIt!S{SaujoWQ-mp52dy zm-&~ofl)GFyXAvJ#Flewk~)Y){=uGcvCU5~ALmvYGfjvgOK+sfl(?2a4v=W;tUf`* zi9n)Q?Svac*;iVI5~!%JLxXQ=9!IJ7o-inG2p2thONVSxfIfRFn33v?DSM>VqjUs+ z_LF;MK+J^Py!<$Ig~;~cLcrBQxfJy{(v|F#E5!S63Ln(cRutX3by>M_ge0j5J+Kxu=KFL+=~FJPV}cr(SW}Zd)^U6 z%n`>vxnjqx_ez_))vywLP2s2Kz{wvfb@bm%*__@s?9t-&LBmG{*0x!uqW4HwreFml19iJ{4X$PppvJ;%`?JSfs$sVFufm(k%3a3ykgu6ClkmxC zA@72n`c;W`E{Falqo7xoPh@aA(ktgc+dSr?45V}B<%k`3*FiX9ykGgh4sO>DaO=yS zh6;An>H0G5p~h~e;yNqjUG^J`nf&xZxSvWPV(`c-M?@@RQV^bhZx-^*R;;OUvSJf>*=MVdQwFcBzlQb$69`e0nUzRd%KOvfKr9 zbN0JN@zSt-6)FU7+2NOP8qXGFdJ&ACRy5nBZX;5ixiAC58DD$&q4$|t?1dlkyE&|=YQ5jfaf&||q z4R;q$_RGJii#W4MOCE=DbR~9sMu~Rb0cb7gu7+@Pl4tMIO#D|aGHiEam#d^|A4t~; z&A6`x)gosSuEMemF~vXV+%BI89xi?|5X>f1k`lN&L5|!OO|M2$v@jRvlX7QE^9ows zm>ZCCH~&U+PxFYS2JFtPkg{BB=N{txSX%9A97qR+WZW;fKmP`fb-9fDT&=18t!x-6h8vI+mFqof45eN^ye09*z{yeVHJNXB&#oyi}$3y|4o(M`R)0*ny`Vj_D05~Y3|n^ z+jKGhazFemojl%IiffELqpx>J9d(VxCXNn)_eo#@!`okG8^6I~^1h0pwo0!5jbY{c96)t4a zs0?ATuKblGGvPe_rGb>fQ%ntYsWlxt-j%Zw3O3=|6R|Uqo)h^eGy&Gq``OP+Z}8JTjAyP@_9aVTo(+Fl zhhL6u@I^OitQG5L&`j{x&Rqu)_3!~d zn`p*M{EH4wFITFvVa-(@xRIIKM=c_Dq%iW=g^zvB8{`H!I}w}M66W(QpKRGO>MC6r zLD|b5Nq>}7D}@K@nuP`L)Gef0Hk2=)EuHgyC~pC(T8$GRP@`v$g!&vktabP@!7IEi z-KIL&m((lMxpvQn{9fut9{M6PVp!s2Rl({p4m21hl>Dg5QR}(tKCh@VphdMq))sQG zTD>(o(*hjEOlKA=g`Ls8w{3KF@G9_YEZ2K*Dn_3UAud>ks=A*M2T+*Xh9r-1M>x8e zMK7qpG^f8)cOESP^&R7Oh;HL*xC2CDA7t$SN0T%jb^yv09YAUW4bOM9y0({HIo}L3 z+^B?RO0$C@bD$GG^$9TT$|4F zSa2cYRF>+muZr{<1ne7|8X%=cNjqB;>^{~B_pr}9F?5B7O>GwcHuYW6($R%AG$`b7$cYGdIqGa^A!*C6ES`*xc>? z1>sg9=`T6I!UM98jmNK3?Fv7SP)8yP^${;SJx?vN_3 zmW`4RIbS~C0QB+ng_h))FcUoe&@EglJ_{ZfN2eWa!I;pTm`0at_+Sldgdg{ zNE@6@g;u*A6y&}lM1vr+2#h$5Ix-Vu!xvdfwgL-5DD=$YZ?L4^YJ$x;+B{Pbvsq6uQuRK){ z|HKw^+V5gvPK3P0+=3W&!V1WG?7;6~S)|*-&A?pAY<92{TDfaEI0%+~sxj$ZxAp`?i$}R5(DLmc zhT4vB=!LNyAH)GgFK)y8S}GU*ThJ?xzb9Pu*784XC%ZknEg^;~tehW9GsUu2+W8d% zD%bG05#l|y$};pF9T{g1cbCE1s6^24j+D#%{{o~l=WtMP2Xv7qMrBsfL>DYZ(d0Uz zVKlX&mTF>x&d|rmX>r3|Gp1DF*=XFN?Xek~Z!wjRex?$|JL%S;a;P60xYHWh!J3DG zr_Xz*dPmeYuAC|7SaGh?^lBgF(a@l_A!my9(Uk7+!dY)VM*L&CO>MZ=iUZ`kmMd%h z39TKG5u0%x6YU)zm2=Xb*F*Tt(&I{lXKV%PFImb{ANMhvjBj%B*nQWPhsNneJr)JU z>u$6PeQ~4x$kxt1IXEHQQ`F)Uy9vsaEYZZF+E~_@?(odh^1KC&V>jkSqyVC20U9kg!gNw+r-xozUX9tutyZQlSZasi@s2w+Dq>T1SAw`& zY)ijOJo@S2@@YZ`PGaita5RS%dJryDPQ-iUgZbJ*O$+PVP<5?-9LYwvjz{(|rmH-2 z+O)9)DKu@pG)W_s!ra%{1ebIYaevckIa%F?vEW2}W|y@wg%4~X3B#ETs7-6?lqQK_ z!72rHr&qtF7@}T$YyoxJHE@41`M#{1d~%SWlf6B+^;nPR4=iWre|f~O7C?}!s<^^X zcIIIzZTMhnk&wsqqa}xEEwa+GqUdw(ait6v5sr{8>Ut8LV1g|Tr*D0DKfuv^WW^oM z&}7Qq>l&3!mo#r(%vfM8Y!11nzvR?AUyXJUn0KRo&;YHFe~vfIPcmA`W@5%lYEh)~ z=p=vLH|7xZix?yJQu^m0lwmhqYSUCEAlh~T2`mFsUKz{Aaq!uN2^FY$J!C77JP&DLSwC4br10)_@U>3DSKiR?q_l|-`p$*lULzIIEnEV z^}mVh9}LE1iI}@V>q_PpWcmxbtMEjc&Lrk;ex$?RQl9ijE6wANBI&tneYUojY%AndaPFh0K06KH%YXW1NB)-Pg6QauK{O{J#*=`~E?Vf8NR6K+ z8vHSxe|bAV?oD~Ik0M&W=)&gu6Nl(8RQ|a&UQuCvBbLAY(lG1eZnul$wA0}{fzuk5iTeeHKukJ zc#oFOInQK!Oq3JV)z+1DTtCt#%|W+}p=Y4a*o*55^7__6)U2@35QkkQI#R1MjsjSi z7a3UUoj;%Z=wm>hG+1S)&r&hmw<~*QAA=uDF|k{^S3rGDoSA#VB4wv@faA*{zJA!o zibp4!s27oeZNbF#(bN`etPo{P3}|nq8FJ%lS;mFa&pEM3HlOP%W}J?StstaCrxz~39i^{aqy5=d7a)kL_%`19VXC=;i)fF$8vYzP{d zYS?QWl?F^w4bPmj0~tfntg9fzR>Ly?U~jIs9cL$Ey;ExHG zgeAR0nEaL2mTK-q^wqo&ZIZ~O{jI8J@?BKC6^v<@;P1#r1k%Fp%Zc5bJ_Z1H*Kkf> z{Pe=pkSvRuVX_Ih^*_JPmS(VsUa2}X<|s~DjO-9ibO+LQ(!u6|@p2&tw|Ici!=kWT zL-*Mbg?rpKk)H1mw^ajzEK^TJ=i+Kb z_}D8U)Rhx3N9_s2?IXKB%_d=sFP!TA4S#Dy;c3Cp+FP>F_%=oJ&;+3n4;)X4m zC27$5{tNb#TP=DalG;@1Idok={#BE~QE$)kdsc=EM*U1osX^qnT32{zSVId1CB>;p zovFc^ReS9837DI@t}s-ks7!k)-Gc>^DtnM^N7Gc9I#>TTgn4r;d+NjJ{7CyZPW)T}8vRIO zG3#T-CSB12q$ELJ8y?_6iRqn=9|^joFLEAJ{x?!E=Vs0%i|_&e1c^14?w-)?auZG7 zm|pfk_Hi9CA{&(kB#k>H_(~PQkl~s^;yIW}0G2iEO1Jr^Q-`Y~p*e)qc=S>xZDBrb z`FbC*<)=G2@onKj&BGJ9bK$`t4F{{-uGswA$i(G~y-dE8oi10IR&0B)(|CPPemeZe zcA7Qp5-a(~5(nW|VC z6q%9plsJ0fY4qGfEeo<(p<1k{$-T^IY;~WUFh#X4Bvk;q1H#ys$G-MEqH3O%cLn3#Tk;p2PE#3 zZQN8WXCQyGMFm#lD$}j7%zu-tts5;3qZwrL#*TJyODGCD$JaOHO*hlqiBtJ^dF|CQ z_RnwRTrO=SO(OEw6JtWO2S;&JN~J;@Dt#{+R~h-wjcBB-tomW67+Z_v7ICDbyWk3< zg4B6jWrET4_Ce9!gDS;Js{><>Km$&Yp)NQW>X;lN6nfRSoQ``!!=^b%3z}AF5M0W7oh7gkLQ(xCMPZO?d zjnGGd2+<|YO;-goAJ>ie=CqHkmS;Gdo|M96Q2_+po(D5ce^htI%Q6&=0HftUIlwfb za;`)XiWd0IEnhg$Rg0GAXwu943IOwFi$I{P3%#Q%18iM+ahjoHHL9ju#_$GOUF*c=j zrLgs4c>AY;QR(Yv<$h$EWoI~TBP%?ocTO|x%7%wfpwIuV@{=IylfJoXpYb86*Jgr- z32_tpox9NUIvweCwMvvTU*%}nPT*% z-xrEzFmVK|T&BB7ncX+Ms|zL&*Ib2TYMSHMreU@2OvPgZ@4sU>0-+a$X;ZsR;c;qp z{m5lJp^B~$IHgfNYHnCEu#gbnizKqL2#EaP+jEL2AFS1mTdpL;F4iREE0WHJ2D<*Z z_^jj9678`1tFkr34{CS8^nn)k1+Er`e$=Eak;akGsxW{R7jS4j>qYy|HXAi>G*H+e z?Y`j~*FbQcWm-=HTvv^FEhvGs3Jrx!3=;HHz23W3##5t4+@q=%UBuNx z?|S@9^q(>Fln|3|C$q{7Cg#6$IH4U=`FRH2vTKLlt#mU?j- zWf9yewTXdf4+{wcdGF?H1bn!Az3bY3{K)ACx11T)#fXeP4_nwb%o}wMgE@3+Ym0cz z$~W_rB!ar62@`iOV5lIa`T`rm6?HliIUFEHo|C6%`1!M1@4L1w?mEpg$E$c5(BCnl z7Tz(G6Pb>4k5QV$H~SE-y}NeGxbm)AGLuNza{@I%WC_vx}Tia2ESnGcED5Q6V<`^$Q0-Bh% zLvZQ?NiQpT`!t|WgPiKAnxbEVE1N2OK4u)^5oVmaZ-lAO*X||Qw?Z3tm;o6kHIZ)k zFoIER;1BGFn4prV5MLLET<%4Ft$psHz@Nh{{p+xkP;<6Wcf{*bE%S#*5?oM(dGChu zNFhz)OvxO9EEFWfBBhO)Bw1Z<(4Iu{9+;~hyE)zS^3&Wc6E>lwm__ab0W!_IJ{BM43% zj{U~2^D^aOo}Y6T4=*54l+`9azg_JiaJsr5<6f$1p?fKW_E%*pY^&gzM;Irp!Lab! z#FNxFYGtf6PLi5u6FfC8Qym7>wteBSBGWdhSv(;9mo|XA8!VLD{XR^wK)0Mg4Ndfl zgcT6rr)GC)>rrbvX;~ROm`q(oCn(mQh}GFwSs028FDs{oMrM0n7zSkPUl@GCL++P& zy`CTx^{j(M9$o>ho%^AYQBKk;eW#%~{W(VeuDP>uSo6D_`NI@NE8o|BMtv`*?kIKBIaZ9 z+1P9r6|Rw4s?vtb$ks<${AFp;M}k|T+TMA)HL3D+dwS|wJF~)fEGAcXdq*P=xO26q z{O5g}ue26;JYaKHs6ld&r++}=Rz_O-^@#<}BvpwBpUvG-YHhh2{#5{Xgx&ctamW7(=-P z`699{#&(9@`{Qxi?d3kc%Hmyw?X9G~6G3t64z_f3`(-diS>A&{`5gc%QTib!Eyj=} zl{A*soLnS1URS}tHKxJw_iYLC8kZX~a0E?8*FGACAm{;e{F5Pb1x5M+N*LyDL)hRkSF?zH(~FWSZTN zkL0W3TcY$#DnC9~8oWb@53@Z8KY6ykp|pBoN)40aA3c{(E27>6W!khBf9e|-an>fB zc4Vgxro`t(445zZ>Gxi=9xjdeIR`CIPK@L^`61^na)1Oh-$Asc7OR=7!$b|>E$>Kj zL!(&bP~PH|MV^=+mD|c0ZuogGg_N5|5P=>e6?69ZaX{qtBo{lSU+SA!C}!1(iPB!N zlgXN~ro6&e%?!QOUN!2f>U4sltXRP%gwpmK+?_zrb1?h1a(~k;#I4rM`&@vBUJpzv zmp+k7n!W5^cPX_%ro=x|FAE%0{E+?2i8p}G57lNsd9DLd9_H6kW$hW=k)!ojAT$F$ z*a+6i1r7x5m^1kAVg9SKqfd{|oa}5*_DeHF?+MnRKl@DhZ{E>@dFs!xib{`7x>_xs z1`AKpXXr0afvB^WRgG8}CS-q5F|heD+kMw@wrW0JJ_sI7XQxBLY)9ApX|vM1!u#jm zzsXoQUr1Qm8%u5W^<0ttL2&~ED7sd1Mp+v9u$4GO5+JxZ-sQIrACRFHp`FQIxQXpC zyyf~g*qnMZc8Jw?ciYX5QNEO-bbI?DdpK|tpUD8`6qpVUL-L6H#TRTYvMNZ2qnuS6 z9*fJyJ{56ep@IntKUe5ZiUv0utsDL3d6pYI9Y(u%(?}&?js#8izbE{~h{c&^t32$j z=2?7%7txegmOg-Mp6w~b{7E~39p6LjiOSHe(fC9iOTM3r=#Tw&e*TwXY1$mtFKEI2 z(1o%>c6XswHpVNHR>b#@ANs~LaBa(gWx}39o{DtIUKj5!c&e&Pt>u-rA85)+x55Ar zTy@=^^2X?6k96CW*GsxIY`Ctxxvv_TctF5>t)v0CuM~4vgmEQ3i(dDV7YaQ85Q)H) zr!~~@j$kV+C?P6NLK6k$g*FN8$-N`C`oQltv z4FB zP@{xdK40>3ZU~m;Zzg=yrXx+>$jsb2G^tu_3`sq5dwj3Sflk|Z6~>rdH!Nw_<*(Rm zg7&>7+kvfAyE#$&+HdC_+E?eSROF+>SbWIXnAqD0SsBt8Fp0ts;0#Ux#HEy?Bcse9 zp2duX$o#%gDMqR|vR+cK>*HM>jpYw_0P0M!?`9mZg@xC+5?j@Bd8Qa(10Fw$V%&e= zu@BSgogmxwEVh!yf1g_R`|tEM?Sm14&J1N4*`5TrFXtQR@60%dNfbAHduy<2BPLa~ zd1tLQd4r`_YFF#5CMb<^HGhnWf5hA*^VetH?3!#do04dHcS37|sG~uSM7Aq~WPE+4 z`{cw*tTD`7qk4Qy&|+;^)Q`_<@!XcOf`u(N>n?6tTVyxs{v1X-E}43Brf^0)-c$j0 zkd6G>3|$A<`%^*|M5J3VUbrtwRyme3E92r9Llk;cH?X>xfQ5-00!9J8_3=?{b2lzh zYoa&3{?(Gl2AMgh3rri0Wv1yZFG5U#GZa;7WkB$G2*B)?13n^3Mo0mM| z?Dtp<8e*`mpCZnxi`jaY-`se{WSOdD7WB9sYPn7Ff)UO3H1oFb`x|DJzt9*TK|vpo zM3c~oENpVNr}z-hS#J2P-Sb)u=7PC@*}Ntzu`A;QXD$dO5viqBu1|=QUlk14JYAqH+;Jc(8%>yOJvL-yg1~F zCGa-R99uF(r5IT+rW?-iS}Tz?fh$9vz0!?&ZOsWR(S0s|2y@i}1B8e}%fxR@oqLMG z`O_H$QFH%Ib~-RxoRFCui5Wsa{0BV-mg{j4Qv5mhmaS*G`=-a5S4YMKf@`X^=q)q9 z>1(BVR_)Xo5I~_6@lU!neLqU?P)+le*O1nw#NAzpgX7^eZ0e?}9myRBy`&53w$FU_ z5hCR4n6@^kek_Fa2`x&KCmOT8vqIf1NtU*=bc&uKDEE#{nCT$T!zZ^y66!e|%#bIG zQ!JPfsDD>kosP+4e<`2$&t(7_`keA-nRzR`;5l+`6Ww6JUz0Dj@*6RVFd)T(;EKd z{O2NvT+wo=0_s=)1_t7RkhV%?5qct7aW%jSoD-+*4+*b+KRL>yJ+l?=ATox5M+X9* zcT?D7%~P)M(Fx&G%J_IpJsP#?jJ-|1ks} ziUT9rZE9kWSVyQBr>#Y5__DU7n{cl=*T0P~r-^hB@1QUza&R8ftP90Hh=9 zpgQY)<@>HXZRK5q4|sKq{h~6eUPGKYEZ@}&1rZD#4?g(gNG-DOeZe3pW%V<{^35~x(7%RXDt`8r`LrO+O?(Y)O z7WT{)p483$u0rsH2IdX}@R-6rccS$-2~h8Uf`!o+rsObWNCHQ_0nhon)#B~1Rn^SA zb#k40=YWT*dlbfJFu27SI|?Y=Q1m^75E=4kXY3}0q;GpK8v6&o{?-UT6^1e~UOKZk zJWLH>IoD||vpPxoj>#9Pz2g|Hll0?;bUjWFkw|~1VKiBK*^c(@_-WQ9$uA~0>SUhls=dUgaNV{+)Do{ zrSb_$w1}f!(Llta(`6GolikIjc6$*9{>xCTb?By=B@A0M7_}JisOYZl#7Vf_osDV8 zGKle*l1Xt! z14YDD)$O6KASqbG9k-c-$r6JA%0qZ8pYKWNEwM>wo^MvTOz#wZ<zBfqquaGxsgSvcw1M4fD`*@R7gdUs-} z90qjItTiY1w2xST(n#X(?Q*Ex9nO%C@FVElH*v48XzxLHw7j~W5!jeSdftV+ZFcWJ zqLF+LzVZ1l?4~k>a)3#@ia!vKEpXqSHqa9=mvc5;CBqU-ss96OV_|4oqBIW6lz^;fdm%LZQgOmg`>1KYN`U277qNboCG7UOu;dhesG1p#=6rq$M&1Arf!Lkh{Z zE@ji&VKQ>mnC6}2T_S^R!y$>yBqNp^{9ng7W=QF?G`LIYOUH=mSW=`$4edZKm5k#*r2IVggT5q zOTG#R7`P&XdlyRkkM+k!prY*HuVrVNAOa6kKW{m6Oj>Zd3+bWwR7S9Wx4>dA`9@4P zlDz@*`~%JgW4V>N38RI=%=M(~XEqr9ic^}#wj*cxd=r#6)mY7%5um}hq0t)XknAi8 zaXT@cjk_W* zezEb08i`iI)Eu&5tzV9f1}u*! zVJN7`Ea3MdmU!THFJ`t7peY@FvsS-OScAN;SIj@|_uc z9xQR^aoFLGr-CiV*Vxy6gJX8)s#q~q-5EXCS#fqn6=Xv*nNIzEoDsclGJ}HkKtH0O z3BW_c`(t= ztSW+3dSn*(5!p`Lr5htYwJA`|70f6k_cYdknaNW8KIB+3+grA(_~AXYwN_rsz0!jb zSdqV$NmqsNq~<;t@)@LPZJ61#yqAPvbZ=?k@EHGf)Y5#je>bL7V? zVag}*3YC{C6P=<*WL99eB|=ZvUamRNAG6h?9?pc#aVUG_W)f%?friIArw&&Y84_%| z?{ja~WAXZX0J55vyThmCr&Bo`EGX9XU#UgQN@UPxLJAR!bM2eP>#ldKp9kFkVL03^TWKJ1ggHAZny9 z`VgX-oc__q&_r}W5zBF5$XuQR;{y?M+jA7oBBWlj1Fhpa!k*f|SEhRRhL&MlLgKJ13PaPdQ528Y#P#7!HFP z0zaYNH?+yP+sIXMM4|#~YhLVe&^w`_5=oti`klP;48zTDx;?V*daBF+z21bAGzcM; zLF;C3syNvplc0}B(b^Vh>Km7IR6L^V7t&m14sXqVO@&kB_#jlMh8naHM^;N5j~y&Q zmg(BT=tfh-m7i-KRPH%ZkW!7+waB9Vv%yaS?@z+1pso3leg-X+@7zO+Z(#-jv%8Ee zXO1Up!JUB3&8i686MV+Kj>NXzT;Fg`hoH{sTat#JHuqsCi^~^FU1%b8K)j`+E?_tV zFPGLP{OvY~Og~tO*Yi3gbvz&D=3xGe30g<56G`Ln>?$;Ew2$}@A=^Fnb+^(ZmG($< zKk7MiEZWa$o#*K2I`~hj`UIXnf8`f--^OoUB0f%RtKM584~_h@!E=I;$_)kpDyIAG z7g-X-KdC5+ORHr3%h--)=5HpcMw|5z&VA_lgw(fip+F~#Es~XZx&Ts|gGX3dh)RS- zp3o-DGZjaYE(Ff_HI?UCffYVg#q=EK5Mu+*9C;)i&tUctA)SGhfqj*7en#V9UJM!| z_eYR2(om@&PYx0a^K!l=du2W8fhjgX1x&Wm898N`eGKg)@X7d^&u5izUth>m>*H1> zmW`nlZ%0yqGwBEwhS+AZVNgj*Pzh;$6)hzYk4Q8K1FeM$B|7>4ts@c1MCliK&(*

=N( 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 T`SswR7=VU~j&g;PRnY$c|L;&^ literal 0 HcmV?d00001 diff --git a/src/components/ConnectButton.tsx b/src/components/ConnectButton.tsx index d659820..df35550 100644 --- a/src/components/ConnectButton.tsx +++ b/src/components/ConnectButton.tsx @@ -39,17 +39,23 @@ import { BiLogOut, BiMoney } from 'react-icons/bi'; import { MdCopyAll, MdLogout } from 'react-icons/md'; import { ChevronDownIcon, ChevronUpIcon } from '@chakra-ui/icons'; import Link from 'next/link'; +import { useAccount, useConnect, useDisconnect } from 'wagmi'; +import { chains, ChainID } from '../utils/chains'; const ConnectButton = ({}) => { + const {address: evmAddress, isConnected: isEvmConnected, isConnecting: isEvmConnecting} = useAccount(); + const {connectAsync: connectEvm, connectors} = useConnect(); + const { disconnect: disconnectEvm } = useDisconnect() + const { isConnected: isTronConnected, isConnecting, address: tronAddress, connect: connectTron, - tronWeb, disconnect, } = useContext(WalletContext); - const { isDataReady, isFetchingData, fetchData } = useContext(DataContext); + + const { isDataReady, isFetchingData, fetchData, setChain, chain } = useContext(DataContext); const { isOpen, onOpen, onClose } = useDisclosure(); const { isOpen: isConnectOpen, @@ -60,7 +66,8 @@ const ConnectButton = ({}) => { const _connectTron = () => { connectTron((_address: string | null, _err: string) => { if (!isDataReady && !isFetchingData && _address) { - fetchData((window as any).tronWeb, _address); + fetchData(_address, ChainID.NILE); + setChain(ChainID.NILE); } }); onConnectClose(); @@ -70,16 +77,39 @@ const ConnectButton = ({}) => { navigator.clipboard.writeText(tronAddress as string); }; - const _connectBttc = () => {}; + const _connectEvm = (chain: number) => { + connectEvm({chainId: chains[chain].id, connector: connectors[chain]}).then((res) => { + fetchData(res.account, ChainID.AURORA); + setChain(ChainID.AURORA); + localStorage.setItem("address", res.account) + localStorage.setItem("chain", ChainID.AURORA.toString()); + }) + onConnectClose(); + }; const _disconnect = () => { - disconnect(); + if(chain == ChainID.NILE) { + disconnect(); + // reload + window.location.reload(); + } else { + localStorage.removeItem("address"); + localStorage.removeItem("chain"); + disconnectEvm(); + window.location.reload(); + } onClose(); }; + const address = () => { + if (isEvmConnected) return evmAddress; + if (isTronConnected) return tronAddress; + return ''; + } + return ( - {isTronConnected ? ( + {isTronConnected || isEvmConnected ? ( // // + )} - {(hash && response) && ( + {(response) && ( {response} - - {' '} View on TronScan - + } diff --git a/src/components/deposit/RecentDeposits.tsx b/src/components/deposit/RecentDeposits.tsx index eb1578c..58f88ca 100644 --- a/src/components/deposit/RecentDeposits.tsx +++ b/src/components/deposit/RecentDeposits.tsx @@ -29,7 +29,7 @@ export default function Recent({ type }) { {token.symbol} {/* {token.name} */} {' '} {tokenFormatter(null).format( - item.amount / 10 ** token.decimals + item.amount / 10 ** token?.decimals )}{' '} - {token.symbol} + {token?.symbol} {new Date( diff --git a/src/components/deposit/Withdraw.tsx b/src/components/deposit/Withdraw.tsx index 29982e9..5e6d91f 100644 --- a/src/components/deposit/Withdraw.tsx +++ b/src/components/deposit/Withdraw.tsx @@ -16,15 +16,19 @@ import { Input, InputGroup, InputRightElement } from '@chakra-ui/react'; import { Select } from '@chakra-ui/react'; import { DataContext } from '../../context/DataProvider'; import Image from 'next/image'; -import { getABI, getAddress } from '../../utils/contract'; +import { getABI, getAddress, getContract, send } from '../../utils/contract'; import { PhoneIcon } from '@chakra-ui/icons'; import axios from 'axios'; +import { useAccount } from 'wagmi'; +import { ChainID } from '../../utils/chains'; const Big = require('big.js'); const ethers = require('ethers'); export default function Deposit() { const { address, isConnected } = useContext(WalletContext); - const { tokens } = useContext(DataContext); + const { address: evmAddress, isConnected: isEvmConnected } = useAccount(); + + const { tokens, chain, explorer } = useContext(DataContext); const [selectedToken, setSelectedToken] = React.useState(0); const [amount, setAmount] = React.useState('0'); @@ -41,7 +45,7 @@ export default function Deposit() { setAmount(amount); }; - const withdraw = () => { + const withdraw = async () => { setLoading(true); setResponse(null); setConfirmed(false); @@ -51,16 +55,27 @@ export default function Deposit() { let _amount = Big(amount) .times(10 ** token.decimals) .toFixed(0); - (window as any).tronWeb - .contract(getABI('Vault'), getAddress('Vault')) - .methods.withdraw(token.id, _amount) - .send({}) - .then((res: any) => { + + let vault = await getContract('Vault', chain); + send(vault, 'withdraw', [token.id, _amount], chain) + .then(async (res: any) => { + setLoading(false); + setResponse('Transaction sent! Waiting for confirmation...'); + if (chain == ChainID.NILE) { setHash(res); - setLoading(false); checkResponse(res); - setResponse('Transaction sent! Waiting for confirmation...'); - }); + } else { + setHash(res.hash); + await res.wait(1); + setConfirmed(true); + setResponse('Transaction Successful!'); + } + }) + .catch((err: any) => { + setLoading(false); + setConfirmed(true); + setResponse('Transaction failed. Please try again!'); + }); }; const checkResponse = (tx_id: string) => { @@ -174,14 +189,14 @@ export default function Deposit() { loading || Number(amount) == 0 || amountExceedsBalance() || - !isConnected + !(isConnected || isEvmConnected) } onClick={withdraw} isLoading={loading} loadingText="Confirm in your wallet" bgGradient={'linear(to-r, #E11860, #CB1DC3)'} size="lg"> - {!isConnected + {!(isConnected || isEvmConnected) ? 'Connect Wallet' : Number(amount) == 0 ? 'Enter Amount' @@ -190,7 +205,7 @@ export default function Deposit() { : 'Withdraw'} - {(hash && response) && ( + {(response) && ( {response} - - {' '} View on TronScan - + } diff --git a/src/components/trade/Graph.tsx b/src/components/trade/Graph.tsx index 9784c6d..c80c5c4 100644 --- a/src/components/trade/Graph.tsx +++ b/src/components/trade/Graph.tsx @@ -17,6 +17,7 @@ const Graph = ({ pair }) => { if (chart.current && pair) { let exchangeData = pairData[pair?.id]?.exchangeRate ?? []; + console.log(exchangeData); if(!Array.isArray(exchangeData)) { exchangeData = [] } diff --git a/src/components/trade/Limit/BuyModal.tsx b/src/components/trade/Limit/BuyModal.tsx index 6779beb..6be6488 100644 --- a/src/components/trade/Limit/BuyModal.tsx +++ b/src/components/trade/Limit/BuyModal.tsx @@ -11,7 +11,7 @@ import React, { useContext } from 'react'; const Big = require('big.js'); import axios from 'axios'; -import { getABI, getAddress } from '../../../utils/contract'; +import { getABI, getAddress, getContract, send } from '../../../utils/contract'; import { Modal, @@ -29,6 +29,9 @@ import { AiOutlineLoading } from 'react-icons/ai'; import { CheckIcon } from '@chakra-ui/icons'; import { tokenFormatter } from '../../../utils/formatters'; import { WalletContext } from '../../../context/Wallet'; +import { useAccount } from 'wagmi'; +import { ChainID } from '../../../utils/chains'; +import { Endpoints } from '../../../utils/const'; export default function BuyModal({ pair, @@ -44,16 +47,19 @@ export default function BuyModal({ const [response, setResponse] = React.useState(null); const [hash, setHash] = React.useState(null); const [confirmed, setConfirmed] = React.useState(false); - + const [orders, setOrders] = React.useState([]); const [orderToPlace, setOrderToPlace] = React.useState(0); const [expectedOutput, setExpectedOutput] = React.useState(0); const [offsetAmount, setOffsetAmount] = React.useState(0); - - const {isConnected} = useContext(WalletContext); + + const { isConnected } = useContext(WalletContext); + const { isConnected: isEvmConnected } = useAccount(); + const { chain, explorer } = useContext(DataContext); const amountExceedsBalance = () => { - if (amount == '0' || amount == '' || !token1?.tradingBalance ) return false; + if (amount == '0' || amount == '' || !token1?.tradingBalance) + return false; if (Number(amount) && token1?.tradingBalance) return Big(amount).gt( Big(token1?.tradingBalance).div(10 ** token1?.decimals) @@ -61,14 +67,15 @@ export default function BuyModal({ }; const amountExceedsMin = () => { - if (token0Amount == '0' || token0Amount == '' || !token0 || !pair) return false; + if (token0Amount == '0' || token0Amount == '' || !token0 || !pair) + return false; if (Number(token0Amount) && pair?.minToken0Order && token0.decimals) return Big(token0Amount).lt( Big(pair?.minToken0Order).div(10 ** token0.decimals) ); }; - const buy = () => { + const buy = async () => { setLoading(true); setConfirmed(false); setHash(null); @@ -77,28 +84,38 @@ export default function BuyModal({ .times(10 ** token0.decimals) .toFixed(0); - (window as any).tronWeb - .contract(getABI('Exchange'), getAddress('Exchange')) - .methods.executeAndPlaceOrder( + let exchange = await getContract('Exchange', chain); + send( + exchange, + 'executeAndPlaceOrder', + [ pair.tokens[0].id, pair.tokens[1].id, _amount, (Number(price) * 10 ** pair.exchangeRateDecimals).toFixed(0), 1, - orders.map((o) => '0x' + o.id) - ) - .send({ - feeLimit: 1000000000, - }) - .then((res: any) => { + orders.map((o) => o.id), + ], + chain + ) + .then(async (res: any) => { + setLoading(false); + setResponse('Transaction sent! Waiting for confirmation...'); + if (chain == ChainID.NILE) { setHash(res); - setLoading(false); checkResponse(res); - setResponse('Transaction sent! Waiting for confirmation...'); - }) - .catch((err: any) => { - setLoading(false); - }); + } else { + setHash(res.hash); + await res.wait(1); + setConfirmed(true); + setResponse('Transaction Successful!'); + } + }) + .catch((err: any) => { + setLoading(false); + setConfirmed(true); + setResponse('Transaction failed. Please try again!'); + }); }; // check response in intervals @@ -131,7 +148,7 @@ export default function BuyModal({ .toFixed(0); axios - .get('https://api.zexe.io/matchedorders/' + pair.id, { + .get(Endpoints[chain]+'matchedorders/' + pair.id, { params: { amount: _amount, exchange_rate: Big(price).times( @@ -143,7 +160,7 @@ export default function BuyModal({ .then((resp) => { let orders = resp.data.data; let ordersToExecute = []; - let _orderToPlace = token0Amount * (10 ** token0.decimals); + let _orderToPlace = token0Amount * 10 ** token0.decimals; let _expectedOutput = Big(0); for (let i in orders) { let execAmount = Math.min(_orderToPlace, orders[i].amount); @@ -161,10 +178,14 @@ export default function BuyModal({ _expectedOutput = _expectedOutput.plus( Big(_orderToPlace).times(price) ); - if(Number(_orderToPlace) < Number(pair?.minToken0Order)){ - setOffsetAmount(Number(_orderToPlace)) + if (Number(_orderToPlace) < Number(pair?.minToken0Order)) { + setOffsetAmount(Number(_orderToPlace)); } - setOrderToPlace(Number(_orderToPlace) > Number(pair?.minToken0Order) ? _orderToPlace : 0); + setOrderToPlace( + Number(_orderToPlace) > Number(pair?.minToken0Order) + ? _orderToPlace + : 0 + ); setOrders(ordersToExecute); setExpectedOutput(_expectedOutput.toFixed(0)); }); @@ -187,7 +208,7 @@ export default function BuyModal({ bgColor={'green2'} onClick={_onOpen} disabled={ - !isConnected || + !(isConnected || isEvmConnected) || loading || Number(amount) <= 0 || amountExceedsBalance() || @@ -195,13 +216,20 @@ export default function BuyModal({ price == '' || Number(price) <= 0 }> - {!isConnected ? 'Connect Wallet' : amountExceedsMin() + {!(isConnected || isEvmConnected) + ? 'Connect Wallet' + : amountExceedsMin() ? 'Amount is too less' : amountExceedsBalance() ? 'Insufficient Trading Balance' : 'Limit Buy'} - + @@ -210,24 +238,34 @@ export default function BuyModal({ Executing Orders {orders.map((o) => { - if (o.amount > 0) return - {/* Order ID */} - ID: {o.id} + if (o.amount > 0) + return ( + + {/* Order ID */} + ID: {o.id} - - {tokenFormatter(null).format( - o.amount / 10 ** pair.tokens[0].decimals - )}{' '} - {pair.tokens[0].symbol} @{' '} - {tokenFormatter(null).format( - o.exchangeRate / - 10 ** pair.exchangeRateDecimals - )}{' '} - {pair.tokens[1].symbol} - - ; - else return null - })} + + {tokenFormatter(null).format( + o.amount / + 10 ** + pair.tokens[0].decimals + )}{' '} + {pair.tokens[0].symbol} @{' '} + {tokenFormatter(null).format( + o.exchangeRate / + 10 ** + pair.exchangeRateDecimals + )}{' '} + {pair.tokens[1].symbol} + + + ); + else return null; + })} {orders.length == 0 && ( No orders to execute @@ -274,16 +312,15 @@ export default function BuyModal({ ? 'success' : 'error' } - variant='subtle' - > + variant="subtle"> {response} - @@ -291,7 +328,7 @@ export default function BuyModal({ View on TronScan - + } diff --git a/src/components/trade/Limit/SellModal.tsx b/src/components/trade/Limit/SellModal.tsx index f5a6fbf..a12faea 100644 --- a/src/components/trade/Limit/SellModal.tsx +++ b/src/components/trade/Limit/SellModal.tsx @@ -1,10 +1,18 @@ -import { Alert, AlertIcon, Box, Button, Flex, Text, useDisclosure } from '@chakra-ui/react'; +import { + Alert, + AlertIcon, + Box, + Button, + Flex, + Text, + useDisclosure, +} from '@chakra-ui/react'; import React, { useContext } from 'react'; const Big = require('big.js'); const MIN_T0_ORDER = '10000000000000000'; import axios from 'axios'; -import { getABI, getAddress } from '../../../utils/contract'; +import { getABI, getAddress, getContract, send } from '../../../utils/contract'; import { Modal, @@ -22,6 +30,9 @@ import { AiOutlineLoading } from 'react-icons/ai'; import { CheckIcon } from '@chakra-ui/icons'; import { tokenFormatter } from '../../../utils/formatters'; import { WalletContext } from '../../../context/Wallet'; +import { ChainID } from '../../../utils/chains'; +import { useAccount } from 'wagmi'; +import { Endpoints } from '../../../utils/const'; export default function SellModal({ pair, @@ -40,37 +51,51 @@ export default function SellModal({ const [orderToPlace, setOrderToPlace] = React.useState(0); const [expectedOutput, setExpectedOutput] = React.useState(0); const [offsetAmount, setOffsetAmount] = React.useState(0); + const { address: evmAddress, isConnected: isEvmConnected } = useAccount(); - const {isConnected} = useContext(WalletContext); + const { isConnected } = useContext(WalletContext); + const { chain, explorer } = useContext(DataContext); - const sell = () => { + const sell = async () => { setLoading(true); let _amount = Big(amount) - .times(10 ** token0.decimals) - .minus(offsetAmount) - .toFixed(0); + .times(10 ** token0.decimals) + .minus(offsetAmount) + .toFixed(0); - (window as any).tronWeb - .contract(getABI('Exchange'), getAddress('Exchange')) - .methods.executeAndPlaceOrder( + let exchange = await getContract('Exchange', chain); + + send( + exchange, + 'executeAndPlaceOrder', + [ pair.tokens[0].id, pair.tokens[1].id, _amount, (Number(price) * 10 ** pair.exchangeRateDecimals).toFixed(0), 0, - orders.map((order) => '0x' + order.id) - ) - .send({ - feeLimit: 1000000000 - }) - .then((res: any) => { - setHash(res); + orders.map((order) => order.id), + ], + chain + ) + .then(async (res: any) => { setLoading(false); - checkResponse(res); setResponse('Transaction sent! Waiting for confirmation...'); + if (chain == ChainID.NILE) { + setHash(res); + checkResponse(res); + } else { + setHash(res.hash); + await res.wait(1); + setConfirmed(true); + setResponse('Transaction Successful!'); + } }) .catch((err: any) => { + console.log(err) setLoading(false); + setConfirmed(true); + setResponse('Transaction failed. Please try again!'); }); }; @@ -104,7 +129,7 @@ export default function SellModal({ .toFixed(0); axios - .get('https://api.zexe.io/matchedorders/' + pair.id, { + .get(Endpoints[chain]+'matchedorders/' + pair.id, { params: { amount: _amount, exchange_rate: Big(price).times( @@ -116,7 +141,7 @@ export default function SellModal({ .then((resp) => { let orders = resp.data.data; let ordersToExecute = []; - let _orderToPlace = amount*(10**token0.decimals); + let _orderToPlace = amount * 10 ** token0.decimals; let _expectedOutput = Big(0); for (let i in orders) { let execAmount = Math.min(_orderToPlace, orders[i].amount); @@ -134,10 +159,14 @@ export default function SellModal({ _expectedOutput = _expectedOutput.plus( Big(_orderToPlace).div(price) ); - if(Number(_orderToPlace) < Number(pair?.minToken0Order)){ - setOffsetAmount(Number(_orderToPlace)) + if (Number(_orderToPlace) < Number(pair?.minToken0Order)) { + setOffsetAmount(Number(_orderToPlace)); } - setOrderToPlace(Number(_orderToPlace) > Number(pair?.minToken0Order) ? _orderToPlace : 0); + setOrderToPlace( + Number(_orderToPlace) > Number(pair?.minToken0Order) + ? _orderToPlace + : 0 + ); setOrders(ordersToExecute); setExpectedOutput(_expectedOutput.toFixed(0)); }); @@ -163,7 +192,9 @@ export default function SellModal({ const amountExceedsMin = () => { if (amount == '0' || amount == '' || !pair || !token0) return false; if (Number(amount) && pair?.minToken0Order && token0.decimals) - return Big(amount).lt(Big(pair?.minToken0Order).div(10 ** token0.decimals)); + return Big(amount).lt( + Big(pair?.minToken0Order).div(10 ** token0.decimals) + ); }; return ( @@ -174,7 +205,7 @@ export default function SellModal({ bgColor={'red'} onClick={_onOpen} disabled={ - !isConnected || + !(isConnected || isEvmConnected) || loading || Number(amount) <= 0 || amountExceedsBalance() || @@ -182,13 +213,20 @@ export default function SellModal({ price == '' || Number(price) <= 0 }> - {!isConnected ? 'Connect Wallet' : amountExceedsMin() + {!(isConnected || isEvmConnected) + ? 'Connect Wallet' + : amountExceedsMin() ? 'Amount is too less' : amountExceedsBalance() ? 'Insufficient Trading Balance' : 'Limit Sell'} - + @@ -197,37 +235,34 @@ export default function SellModal({ Executing Orders {orders.map((o) => { - if (o.amount > 0) - return ( - - {/* Order ID */} - - ID: {o.id} - + if (o.amount > 0) + return ( + + {/* Order ID */} + ID: {o.id} - - {tokenFormatter(null).format( - o.amount / - 10 ** - pair.tokens[0] - .decimals - )}{' '} - {pair.tokens[0].symbol} @{' '} - {tokenFormatter(null).format( - o.exchangeRate / - 10 ** - pair.exchangeRateDecimals - )}{' '} - {pair.tokens[1].symbol} - - - ); - else return null; - })} + + {tokenFormatter(null).format( + o.amount / + 10 ** + pair.tokens[0].decimals + )}{' '} + {pair.tokens[0].symbol} @{' '} + {tokenFormatter(null).format( + o.exchangeRate / + 10 ** + pair.exchangeRateDecimals + )}{' '} + {pair.tokens[1].symbol} + + + ); + else return null; + })} {orders.length == 0 && ( No orders to execute @@ -238,8 +273,8 @@ export default function SellModal({ OrderType: SELL - {orderToPlace/(10**token0?.decimals)} {token0?.symbol} @ {price}{' '} - {token1?.symbol} + {orderToPlace / 10 ** token0?.decimals}{' '} + {token0?.symbol} @ {price} {token1?.symbol} ) : ( @@ -278,17 +313,13 @@ export default function SellModal({ {response} - - {' '} View on TronScan - + } diff --git a/src/components/trade/Market/BuyModal.tsx b/src/components/trade/Market/BuyModal.tsx index 5e667a5..0d61465 100644 --- a/src/components/trade/Market/BuyModal.tsx +++ b/src/components/trade/Market/BuyModal.tsx @@ -11,7 +11,7 @@ import React, { useContext } from 'react'; const Big = require('big.js'); import axios from 'axios'; -import { getABI, getAddress } from '../../../utils/contract'; +import { getABI, getAddress, getContract, send } from '../../../utils/contract'; import { Modal, @@ -29,6 +29,9 @@ import { AiOutlineLoading } from 'react-icons/ai'; import { CheckIcon } from '@chakra-ui/icons'; import { tokenFormatter } from '../../../utils/formatters'; import { WalletContext } from '../../../context/Wallet'; +import { useAccount } from 'wagmi'; +import { ChainID } from '../../../utils/chains'; +import { Endpoints } from '../../../utils/const'; export default function BuyModal({ pair, @@ -47,10 +50,13 @@ export default function BuyModal({ const [orderToPlace, setOrderToPlace] = React.useState(0); const [expectedOutput, setExpectedOutput] = React.useState(0); - const {isConnected} = useContext(WalletContext); + const { isConnected } = useContext(WalletContext); + const { isConnected: isEvmConnected } = useAccount(); + const { chain, explorer } = useContext(DataContext); const amountExceedsBalance = () => { - if (amount == '0' || amount == '' || !token1?.tradingBalance ) return false; + if (amount == '0' || amount == '' || !token1?.tradingBalance) + return false; if (Number(amount) && token1?.tradingBalance) return Big(amount).gt( Big(token1?.tradingBalance).div(10 ** token1?.decimals) @@ -58,14 +64,15 @@ export default function BuyModal({ }; const amountExceedsMin = () => { - if (token0Amount == '0' || token0Amount == '' || !token0 || !pair) return false; + if (token0Amount == '0' || token0Amount == '' || !token0 || !pair) + return false; if (Number(token0Amount) && pair?.minToken0Order && token0.decimals) return Big(token0Amount).lt( Big(pair?.minToken0Order).div(10 ** token0.decimals) ); }; - const buy = () => { + const buy = async () => { setLoading(true); setConfirmed(false); setHash(null); @@ -74,24 +81,37 @@ export default function BuyModal({ .times(10 ** token0.decimals) .toFixed(0); - (window as any).tronWeb - .contract(getABI('Exchange'), getAddress('Exchange')) - .methods.executeAndPlaceOrder( + let exchange = await getContract('Exchange', chain); + send( + exchange, + 'executeAndPlaceOrder', + [ pair.tokens[0].id, pair.tokens[1].id, _amount, Number.MAX_SAFE_INTEGER.toString(), 1, - orders.map((o) => '0x' + o.id) - ) - .send({ - feeLimit: 1000000000, - }) - .then((res: any) => { - setHash(res); + orders.map((o) => '0x' + o.id), + ], + chain + ) + .then(async (res: any) => { setLoading(false); - checkResponse(res); setResponse('Transaction sent! Waiting for confirmation...'); + if (chain == ChainID.NILE) { + setHash(res); + checkResponse(res); + } else { + setHash(res.hash); + await res.wait(1); + setConfirmed(true); + setResponse('Transaction Successful!'); + } + }) + .catch((err: any) => { + setLoading(false); + setConfirmed(true); + setResponse('Transaction failed. Please try again!'); }); }; @@ -128,7 +148,7 @@ export default function BuyModal({ .toFixed(0); axios - .get('https://api.zexe.io/market/matched/orders/' + pair.id, { + .get(Endpoints[chain] + 'market/matched/orders/' + pair.id, { params: { amount: _amount, exchange_rate: Big(price).times( @@ -159,7 +179,11 @@ export default function BuyModal({ Big(_orderToPlace).times(price) ); - setOrderToPlace(Number(_orderToPlace) > Number(pair?.minToken0Order) ? _orderToPlace : 0); + setOrderToPlace( + Number(_orderToPlace) > Number(pair?.minToken0Order) + ? _orderToPlace + : 0 + ); setOrders(ordersToExecute); setExpectedOutput(_expectedOutput.toFixed(0)); }); @@ -181,7 +205,7 @@ export default function BuyModal({ bgColor={'green2'} onClick={_onOpen} disabled={ - !isConnected || + !(isConnected || isEvmConnected) || loading || Number(amount) <= 0 || amountExceedsBalance() || @@ -189,13 +213,20 @@ export default function BuyModal({ price == '' || Number(price) <= 0 }> - {!isConnected ? 'Connect Wallet' :amountExceedsMin() + {!(isConnected || isEvmConnected) + ? 'Connect Wallet' + : amountExceedsMin() ? 'Amount is too less' : amountExceedsBalance() ? 'Insufficient Trading Balance' : 'Market Buy'} - + @@ -204,24 +235,34 @@ export default function BuyModal({ Executing Orders {orders.map((o) => { - if (o.amount > 0) return - {/* Order ID */} - ID: {o.id} + if (o.amount > 0) + return ( + + {/* Order ID */} + ID: {o.id} - - {tokenFormatter(null).format( - o.amount / 10 ** pair.tokens[0].decimals - )}{' '} - {pair.tokens[0].symbol} @{' '} - {tokenFormatter(null).format( - o.exchangeRate / - 10 ** pair.exchangeRateDecimals - )}{' '} - {pair.tokens[1].symbol} - - ; - else return null - })} + + {tokenFormatter(null).format( + o.amount / + 10 ** + pair.tokens[0].decimals + )}{' '} + {pair.tokens[0].symbol} @{' '} + {tokenFormatter(null).format( + o.exchangeRate / + 10 ** + pair.exchangeRateDecimals + )}{' '} + {pair.tokens[1].symbol} + + + ); + else return null; + })} {orders.length == 0 && ( No orders to execute @@ -274,17 +315,16 @@ export default function BuyModal({ {response} - - {' '} View on TronScan - + } diff --git a/src/components/trade/Market/SellModal.tsx b/src/components/trade/Market/SellModal.tsx index 3e97262..72aed5b 100644 --- a/src/components/trade/Market/SellModal.tsx +++ b/src/components/trade/Market/SellModal.tsx @@ -12,7 +12,7 @@ const Big = require('big.js'); const MIN_T0_ORDER = '10000000000000000'; import axios from 'axios'; -import { getABI, getAddress } from '../../../utils/contract'; +import { getABI, getAddress, getContract, send } from '../../../utils/contract'; import { Modal, @@ -30,6 +30,9 @@ import { AiOutlineLoading } from 'react-icons/ai'; import { CheckIcon } from '@chakra-ui/icons'; import { tokenFormatter } from '../../../utils/formatters'; import { WalletContext } from '../../../context/Wallet'; +import { ChainID } from '../../../utils/chains'; +import { useAccount } from 'wagmi'; +import { Endpoints } from '../../../utils/const'; export default function SellModal({ pair, @@ -49,35 +52,50 @@ export default function SellModal({ const [expectedOutput, setExpectedOutput] = React.useState(0); const { isConnected } = useContext(WalletContext); + const { chain, explorer } = useContext(DataContext); + const { address: evmAddress, isConnected: isEvmConnected } = useAccount(); - const sell = () => { + + const sell = async () => { setLoading(true); let _amount = Big(amount) .times(10 ** token0.decimals) .toFixed(0); - (window as any).tronWeb - .contract(getABI('Exchange'), getAddress('Exchange')) - .methods.executeAndPlaceOrder( + let exchange = await getContract('Exchange', chain); + + send( + exchange, + 'executeAndPlaceOrder', + [ pair.tokens[0].id, pair.tokens[1].id, _amount, '0', 0, - orders.map((order) => '0x' + order.id) - ) - .send({ - feeLimit: 1000000000, - }) - .then((res: any) => { + orders.map((order) => '0x' + order.id), + ], + chain + ) + .then(async (res: any) => { + setLoading(false); + setResponse('Transaction sent! Waiting for confirmation...'); + if (chain == ChainID.NILE) { setHash(res); - setLoading(false); checkResponse(res); - setResponse('Transaction sent! Waiting for confirmation...'); - }) - .catch((err: any) => { - setLoading(false); - }); + } else { + setHash(res.hash); + await res.wait(1); + setConfirmed(true); + setResponse('Transaction Successful!'); + } + }) + .catch((err: any) => { + console.log(err) + setLoading(false); + setConfirmed(true); + setResponse('Transaction failed. Please try again!'); + }); }; // check response in intervals @@ -110,7 +128,7 @@ export default function SellModal({ .toFixed(0); axios - .get('https://api.zexe.io/market/matched/orders/' + pair.id, { + .get(Endpoints[chain] + 'market/matched/orders/' + pair.id, { params: { amount: _amount, exchange_rate: Big(price).times( @@ -182,7 +200,7 @@ export default function SellModal({ bgColor={'red'} onClick={_onOpen} disabled={ - !isConnected || + !(isConnected || isEvmConnected) || loading || Number(amount) <= 0 || amountExceedsBalance() || @@ -190,7 +208,7 @@ export default function SellModal({ price == '' || Number(price) <= 0 }> - {!isConnected + {!(isConnected || isEvmConnected) ? 'Connect Wallet' : amountExceedsMin() ? 'Amount is too less' @@ -296,12 +314,8 @@ export default function SellModal({ {response} - {' '} View on TronScan diff --git a/src/context/DataProvider.tsx b/src/context/DataProvider.tsx index 3f5340f..53f523e 100644 --- a/src/context/DataProvider.tsx +++ b/src/context/DataProvider.tsx @@ -1,9 +1,10 @@ import * as React from 'react'; -import { DUMMY_ADDRESS, HELPER } from '../utils/const'; +import { DUMMY_ADDRESS, HELPER, Endpoints } from '../utils/const'; const { Big } = require('big.js'); import tronWeb from '../utils/tronWeb'; import axios from 'axios'; -import { getABI, getAddress } from '../utils/contract'; +import { call, getABI, getAddress, getContract } from '../utils/contract'; +import { ChainID, chains, chainMapping } from '../utils/chains'; const DataContext = React.createContext({} as DataValue); @@ -18,6 +19,9 @@ const coingeckoIds = { 'USDD': 'usdd', 'WTRX': 'tron', 'BTT': 'bittorrent', + 'NEAR': 'near', + 'AURORA': 'aurora-near', + 'USDC': 'usd-coin', }; const dummyPrices = { @@ -27,6 +31,9 @@ const dummyPrices = { 'USDD': '1', 'WTRX': '0.006', 'BTT': '0.0000008', + 'NEAR': '3.2', + 'AURORA': '0.8', + 'USDC': '1', }; @@ -46,6 +53,7 @@ function DataProvider({ children }: any) { const [tokens, setTokens] = React.useState([]); const [userDepositWithdraws, setUserDepositWithdraws] = React.useState([]); + const [chain, setChain] = React.useState(null); const [dollarFormatter, setDollarFormatter] = React.useState( new Intl.NumberFormat('en-US', { @@ -61,20 +69,25 @@ function DataProvider({ children }: any) { React.useEffect(() => {}, []) - const getWalletBalances = async (address: string, _tokens = tokens) => { - let multicall = await tronWeb.contract(getABI('Helper'), getAddress('Helper')); + + const explorer = () => { + return chain === ChainID.NILE ? 'https://nile.tronscan.org/#/transaction/' : chainMapping[chain]?.blockExplorers.default.url+'tx/'; + } + + const getWalletBalances = async (address: string, _tokens = tokens, chain: number) => { + let multicall = await getContract('Helper', chain); Promise.all([ - multicall.balanceOf(_tokens.map(token => token.id), address).call(), - multicall.allowance(_tokens.map(token => token.id), address, getAddress('Vault')).call(), - multicall.tradingBalanceOf(getAddress('Vault'), _tokens.map(token => token.id), address).call(), + call(multicall, 'balanceOf', [_tokens.map(token => token.id), address], chain), + call(multicall, 'allowance', [_tokens.map(token => token.id), address, getAddress('Vault', chain)], chain), + call(multicall, 'tradingBalanceOf', [getAddress('Vault', chain), _tokens.map(token => token.id), address], chain), ]).then(async (res) => { // set balance in token let newTokens = [] for(let index in _tokens) { let token = _tokens[index]; - token.balance = res[0].balance[index].toString(); - token.allowance = res[1].balance[index].toString(); - token.tradingBalance = res[2].balance[index].toString(); + token.balance = res[0][index].toString(); + token.allowance = res[1][index].toString(); + token.tradingBalance = res[2][index].toString(); newTokens.push(token); } setTokens(newTokens); @@ -93,18 +106,18 @@ function DataProvider({ children }: any) { }) } - const fetchData = async (tronWeb: any, address: string|null, firstTime = true, _tokens=tokens, _pairs=pairs) => { + const fetchData = async (address: string|null, chain: ChainID, firstTime = true, _tokens=tokens, _pairs=pairs) => { setIsFetchingData(firstTime); setDataFetchError(null); try { // fetch data - const requests = [axios.get('https://api.zexe.io/allpairs')] - if(firstTime) requests.push(axios.get('https://api.zexe.io/alltokens')) + const requests = [axios.get(Endpoints[chain]+'allpairs')] + if(firstTime) requests.push(axios.get(Endpoints[chain]+'alltokens')) Promise.all(requests).then(async (res) => { _pairs = res[0].data.data; setPairs(_pairs); - fetchPairData(_pairs); - fetchPairStatus(_pairs); + fetchPairData(_pairs, chain); + fetchPairStatus(_pairs, chain); if(firstTime) { _tokens = res[1].data.data; @@ -118,15 +131,15 @@ function DataProvider({ children }: any) { } if(address) { - getWalletBalances(address, _tokens); - fetchPlacedOrders(address, _pairs) - fetchCancelledOrders(address, _pairs) - fetchExecutedOrders(address, _pairs) - fetchUserDepositsWithdraws(address) + getWalletBalances(address, _tokens, chain); + fetchPlacedOrders(address, _pairs, chain) + fetchCancelledOrders(address, _pairs, chain) + fetchExecutedOrders(address, _pairs, chain) + fetchUserDepositsWithdraws(address, chain) } - fetchOrders(_pairs) - fetchExecutedPairData(_pairs); - setTimeout(() => fetchData(tronWeb, address, false, _tokens, _pairs), 8000); + fetchOrders(_pairs, chain) + fetchExecutedPairData(_pairs, chain); + setTimeout(() => fetchData(address, chain, false, _tokens, _pairs), 8000); }) } catch (error) { setDataFetchError(error.message); @@ -134,10 +147,9 @@ function DataProvider({ children }: any) { setIsFetchingData(false); }; - - const fetchOrders = (pairs: any[]) => { + const fetchOrders = (pairs: any[], chain: number) => { let orderRequests = pairs.map((pair) => { - return axios.get(`https://api.zexe.io/orders/${pair.id}`); + return axios.get(Endpoints[chain]+`orders/${pair.id}`); }) Promise.all(orderRequests).then((res) => { let newOrders = {}; @@ -148,9 +160,9 @@ function DataProvider({ children }: any) { }) } - const fetchPlacedOrders = (address: string, pairs: any[]) => { + const fetchPlacedOrders = (address: string, pairs: any[], chain: number) => { let orderRequests = pairs.map((pair) => { - return axios.get(`https://api.zexe.io/orders_placed/${address}/${pair.id}`); + return axios.get(Endpoints[chain]+`orders_placed/${address}/${pair.id}`); }) Promise.all(orderRequests).then((res) => { let newOrders = {}; @@ -162,9 +174,9 @@ function DataProvider({ children }: any) { } // api.zexe.io/pair/pricetrend/{pair}?interval=300000 - const fetchPairData = (pairs: any[]) => { + const fetchPairData = (pairs: any[], chain: number) => { let pairRequests = pairs.map((pair) => { - return axios.get(`https://api.zexe.io/pair/pricetrend/${pair.id}?interval=300000`); + return axios.get(Endpoints[chain]+`pair/pricetrend/${pair.id}?interval=300000`); }) Promise.all(pairRequests).then((res) => { let newPairs = {}; @@ -176,9 +188,9 @@ function DataProvider({ children }: any) { } // /pair/orders/history/:id - const fetchExecutedPairData = async (pairs: any[]) => { + const fetchExecutedPairData = async (pairs: any[], chain: number) => { let pairRequests = pairs.map((pair) => { - return axios.get(`https://api.zexe.io/pair/orders/history/${pair.id}`); + return axios.get(Endpoints[chain]+`pair/orders/history/${pair.id}`); }) Promise.all(pairRequests).then((res) => { let newPairs = {}; @@ -190,9 +202,9 @@ function DataProvider({ children }: any) { } // /orders_history/:taker/:pairId - const fetchExecutedOrders = async (address: string, pairs: any[]) => { + const fetchExecutedOrders = async (address: string, pairs: any[], chain: number) => { let pairRequests = pairs.map((pair) => { - return axios.get(`https://api.zexe.io/orders_history/${address}/${pair.id}`); + return axios.get(Endpoints[chain]+`orders_history/${address}/${pair.id}`); }) Promise.all(pairRequests).then((res) => { let newPairs = {}; @@ -204,9 +216,9 @@ function DataProvider({ children }: any) { } // /user/order/cancelled/:maker/:pairId - const fetchCancelledOrders = async (address: string, pairs: any[]) => { + const fetchCancelledOrders = async (address: string, pairs: any[], chain: number) => { let pairRequests = pairs.map((pair) => { - return axios.get(`https://api.zexe.io/user/order/cancelled/${address}/${pair.id}`); + return axios.get(Endpoints[chain]+`user/order/cancelled/${address}/${pair.id}`); }) Promise.all(pairRequests).then((res) => { let newPairs = {}; @@ -218,12 +230,11 @@ function DataProvider({ children }: any) { } // /pair/trading/status/:pairId - const fetchPairStatus = async (pairs: any[]) => { + const fetchPairStatus = async (pairs: any[], chain: number) => { let pairRequests = pairs.map((pair) => { - return axios.get(`https://api.zexe.io/pair/trading/status/${pair.id}`); + return axios.get(Endpoints[chain]+`pair/trading/status/${pair.id}`); }) Promise.all(pairRequests).then((res) => { - console.log(res); let newPairs = {}; res.forEach((pair, index) => { return newPairs[pairs[index].id] = pair.data.data; @@ -233,8 +244,8 @@ function DataProvider({ children }: any) { } // /user/deposits/withdraws/:id - const fetchUserDepositsWithdraws = async (address: string) => { - axios.get('https://api.zexe.io/user/deposits/withdraws/' + address).then((res) => { + const fetchUserDepositsWithdraws = async (address: string, chain: number) => { + axios.get(Endpoints[chain]+'user/deposits/withdraws/' + address).then((res) => { setUserDepositWithdraws(res.data.data); }) } @@ -255,7 +266,9 @@ function DataProvider({ children }: any) { cancelledOrders, orderHistory, pairStats, - userDepositWithdraws + userDepositWithdraws, + chain, setChain, + explorer }; return ( @@ -273,13 +286,15 @@ interface DataValue { tokenFormatter: any; isFetchingData: boolean; orders: any; - fetchData: (_:any, __:string) => void; + fetchData: (address :string, chainId: ChainID) => void; placedOrders: any, pairExecutedData: any, cancelledOrders: any, orderHistory: any, pairStats: any, - userDepositWithdraws: any + userDepositWithdraws: any, + chain: number, setChain: (chain: number) => void, + explorer: () => string } export { DataProvider, DataContext }; diff --git a/src/context/Wallet.tsx b/src/context/Wallet.tsx index 99aef6b..49abc8a 100644 --- a/src/context/Wallet.tsx +++ b/src/context/Wallet.tsx @@ -45,6 +45,7 @@ function WalletProvider({children}: any) { setIsDisconnected(false); setIsConnecting(false); localStorage.setItem("address", _addr) + localStorage.setItem("chain", '-3'); }) .catch((err: any) => { if(options.errRetryCount >= 3){ @@ -83,6 +84,7 @@ function WalletProvider({children}: any) { setIsConnected(false); setIsConnecting(false); localStorage.removeItem("address"); + localStorage.removeItem("chain"); } const value: WalletValue = { diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index b6088b1..184ca85 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -7,9 +7,21 @@ import { AppDataProvider } from '../context/AppData'; import { Header } from '../components/Header'; import { WalletProvider } from '../context/Wallet'; import '../styles/globals.css'; +import { configureChains, createClient, defaultChains, WagmiConfig } from 'wagmi'; +import { chains } from '../utils/chains'; +import { publicProvider } from 'wagmi/providers/public' + +const { provider, webSocketProvider } = configureChains(chains, [publicProvider()]); + +const client = createClient({ + provider, + webSocketProvider, +}); + function MyApp({ Component, pageProps }: AppProps) { return ( + @@ -20,7 +32,8 @@ function MyApp({ Component, pageProps }: AppProps) { + ) } -export default MyApp +export default MyApp \ No newline at end of file diff --git a/src/pages/faucet.tsx b/src/pages/faucet.tsx index 6f0134d..e6b5c84 100644 --- a/src/pages/faucet.tsx +++ b/src/pages/faucet.tsx @@ -16,7 +16,7 @@ import React from 'react'; import { useContext } from 'react'; import { DataContext } from '../context/DataProvider'; import { WalletContext } from '../context/Wallet'; -import { getABI } from '../utils/contract'; +import { getABI, getContract, send } from '../utils/contract'; const mintAmount = { USDT: 1000, @@ -25,6 +25,9 @@ const mintAmount = { ETH: 10, WTRX: 10000, BTT: 10000000, + AURORA: 100, + NEAR: 10, + USDC: 1000, }; const Big = require('big.js'); @@ -32,6 +35,8 @@ import { Input, InputGroup } from '@chakra-ui/react'; import axios from 'axios'; import Link from 'next/link'; import Head from 'next/head'; +import { useAccount } from 'wagmi'; +import { ChainID } from '../utils/chains'; function RadioCard(props) { const { getInputProps, getCheckboxProps } = useRadio(props); @@ -42,41 +47,40 @@ function RadioCard(props) { return ( <> - - - Testnet Faucet | ZEXE | Buy & Sell Crypto on TRON - + + Testnet Faucet | ZEXE | Buy & Sell Crypto on TRON - - - - {props.children} + + + + {props.children} + - ); } export default function faucets() { - const { tokens } = useContext(DataContext); + const { tokens, chain, explorer } = useContext(DataContext); const { address, isConnected } = useContext(WalletContext); + const { address: evmAddress, isConnected: isEvmConnected } = useAccount(); const [selectedToken, setSelectedToken] = React.useState(0); @@ -104,19 +108,34 @@ export default function faucets() { const token = tokens[selectedToken]; // mint tokens - const tokenContract = await (window as any).tronWeb.contract( - getABI('ERC20'), - token.id - ); - tokenContract.methods - .mint(address, Big(mintAmount[token.symbol]).times(1e18).toFixed(0)) - .send({}) - .then((res: any) => { + const tokenContract = await getContract('ERC20', chain, token.id); + send( + tokenContract, + 'mint', + [ + address ?? evmAddress, + Big(mintAmount[token.symbol]).times(1e18).toFixed(0), + ], + chain + ) + .then(async (res: any) => { + setLoading(false); + setResponse('Transaction sent! Waiting for confirmation...'); + if (chain == ChainID.NILE) { setHash(res); - setLoading(false); checkResponse(res); - setResponse('Transaction sent! Waiting for confirmation...'); - }); + } else { + setHash(res.hash); + await res.wait(1); + setConfirmed(true); + setResponse('Transaction Successful!'); + } + }) + .catch((err: any) => { + setLoading(false); + setConfirmed(true); + setResponse('Transaction failed. Please try again!'); + }); }; const checkResponse = (tx_id: string) => { @@ -200,29 +219,6 @@ export default function faucets() { ); })} - {/* - - {'trx'} - Tron - TRX - - - */} @@ -272,10 +268,12 @@ export default function faucets() { bgGradient={'linear(to-r, #E11860, #CB1DC3)'} size="lg" isLoading={loading} - disabled={!isConnected}> - {isConnected ? 'Mint' : 'Connect Wallet'} + disabled={!(isConnected || isEvmConnected) || loading}> + {isConnected || isEvmConnected + ? 'Mint' + : 'Connect Wallet'} - {hash && response && ( + {response && ( {response} - {' '} View on TronScan - + } diff --git a/src/pages/portfolio.tsx b/src/pages/portfolio.tsx index 0313ee0..3faa1a7 100644 --- a/src/pages/portfolio.tsx +++ b/src/pages/portfolio.tsx @@ -28,9 +28,12 @@ import { import { dollarFormatter, tokenFormatter } from '../utils/formatters'; import Head from 'next/head'; import Image from 'next/image'; +import { useAccount } from 'wagmi'; export default function wallet() { const { address, isConnected } = useContext(WalletContext); + const { address: evmAddress, isConnected: isEvmConnected } = useAccount(); + const { tokens } = useContext(DataContext); const [balance, setBalance] = React.useState(0); const [tradingBalancesUSD, setTradingBalancesUSD] = React.useState([]); @@ -74,7 +77,7 @@ export default function wallet() { - {isConnected ? ( + {(isConnected || isEvmConnected) ? ( - {address} + {address??evmAddress} =2.0.0", "@chakra-ui/styled-system@2.3.4": - "integrity" "sha512-Lozbedu+GBj4EbHB/eGv475SFDLApsIEN9gNKiZJBJAE1HIhHn3Seh1iZQSrHC/Beq+D5cQq3Z+yPn3bXtFU7w==" - "resolved" "https://registry.npmjs.org/@chakra-ui/styled-system/-/styled-system-2.3.4.tgz" - "version" "2.3.4" +"@chakra-ui/styled-system@2.3.4": + version "2.3.4" + resolved "https://registry.npmjs.org/@chakra-ui/styled-system/-/styled-system-2.3.4.tgz" + integrity sha512-Lozbedu+GBj4EbHB/eGv475SFDLApsIEN9gNKiZJBJAE1HIhHn3Seh1iZQSrHC/Beq+D5cQq3Z+yPn3bXtFU7w== dependencies: - "csstype" "^3.0.11" - "lodash.mergewith" "4.6.2" + csstype "^3.0.11" + lodash.mergewith "4.6.2" "@chakra-ui/switch@2.0.14": - "integrity" "sha512-6lzhCkJq7vbD3yGaorGLp0ZZU4ewdKwAu0e62qR8TfYZwbcbpkXbBKloIHbA2XKOduISzS2WYqjmoP6jSKIxrA==" - "resolved" "https://registry.npmjs.org/@chakra-ui/switch/-/switch-2.0.14.tgz" - "version" "2.0.14" + version "2.0.14" + resolved "https://registry.npmjs.org/@chakra-ui/switch/-/switch-2.0.14.tgz" + integrity sha512-6lzhCkJq7vbD3yGaorGLp0ZZU4ewdKwAu0e62qR8TfYZwbcbpkXbBKloIHbA2XKOduISzS2WYqjmoP6jSKIxrA== dependencies: "@chakra-ui/checkbox" "2.2.2" -"@chakra-ui/system@>=2.0.0", "@chakra-ui/system@2.3.0": - "integrity" "sha512-BxikahglBI0uU8FE3anEorDTU5oKTUuBIEKVcQrEVnrbNuRJEy1OVYyCNXfqW3MpruRO9ypYV2bWt02AZZWEaQ==" - "resolved" "https://registry.npmjs.org/@chakra-ui/system/-/system-2.3.0.tgz" - "version" "2.3.0" +"@chakra-ui/system@2.3.0": + version "2.3.0" + resolved "https://registry.npmjs.org/@chakra-ui/system/-/system-2.3.0.tgz" + integrity sha512-BxikahglBI0uU8FE3anEorDTU5oKTUuBIEKVcQrEVnrbNuRJEy1OVYyCNXfqW3MpruRO9ypYV2bWt02AZZWEaQ== dependencies: "@chakra-ui/color-mode" "2.1.9" "@chakra-ui/react-utils" "2.0.8" "@chakra-ui/styled-system" "2.3.4" "@chakra-ui/theme-utils" "2.0.1" "@chakra-ui/utils" "2.0.11" - "react-fast-compare" "3.2.0" + react-fast-compare "3.2.0" "@chakra-ui/table@2.0.11": - "integrity" "sha512-zQTiqPKEgjdeO/PG0FByn0fH4sPF7dLJF+YszrIzDc6wvpD96iY6MYLeV+CSelbH1g0/uibcJ10PSaFStfGUZg==" - "resolved" "https://registry.npmjs.org/@chakra-ui/table/-/table-2.0.11.tgz" - "version" "2.0.11" + version "2.0.11" + resolved "https://registry.npmjs.org/@chakra-ui/table/-/table-2.0.11.tgz" + integrity sha512-zQTiqPKEgjdeO/PG0FByn0fH4sPF7dLJF+YszrIzDc6wvpD96iY6MYLeV+CSelbH1g0/uibcJ10PSaFStfGUZg== dependencies: "@chakra-ui/react-context" "2.0.4" "@chakra-ui/tabs@2.1.4": - "integrity" "sha512-/CQGj1lC9lvruT5BCYZH6Ok64W4CDSysDXuR2XPZXIih9kVOdXQEMXxG8+3vc63WqTBjHuURtZI0g8ouOy84ew==" - "resolved" "https://registry.npmjs.org/@chakra-ui/tabs/-/tabs-2.1.4.tgz" - "version" "2.1.4" + version "2.1.4" + resolved "https://registry.npmjs.org/@chakra-ui/tabs/-/tabs-2.1.4.tgz" + integrity sha512-/CQGj1lC9lvruT5BCYZH6Ok64W4CDSysDXuR2XPZXIih9kVOdXQEMXxG8+3vc63WqTBjHuURtZI0g8ouOy84ew== dependencies: "@chakra-ui/clickable" "2.0.10" "@chakra-ui/descendant" "3.0.10" @@ -870,49 +786,49 @@ "@chakra-ui/react-use-safe-layout-effect" "2.0.2" "@chakra-ui/tag@2.0.11": - "integrity" "sha512-iJJcX+4hl+6Se/8eCRzG+xxDwZfiYgc4Ly/8s93M0uW2GLb+ybbfSE2DjeKSyk3mQVeGzuxGkBfDHH2c2v26ew==" - "resolved" "https://registry.npmjs.org/@chakra-ui/tag/-/tag-2.0.11.tgz" - "version" "2.0.11" + version "2.0.11" + resolved "https://registry.npmjs.org/@chakra-ui/tag/-/tag-2.0.11.tgz" + integrity sha512-iJJcX+4hl+6Se/8eCRzG+xxDwZfiYgc4Ly/8s93M0uW2GLb+ybbfSE2DjeKSyk3mQVeGzuxGkBfDHH2c2v26ew== dependencies: "@chakra-ui/icon" "3.0.11" "@chakra-ui/react-context" "2.0.4" "@chakra-ui/textarea@2.0.12": - "integrity" "sha512-msR9YMynRXwZIqR6DgjQ2MogA/cW1syBx/R0v3es+9Zx8zlbuKdoLhYqajHteCup8dUzTeIH2Vs2vAwgq4wu5A==" - "resolved" "https://registry.npmjs.org/@chakra-ui/textarea/-/textarea-2.0.12.tgz" - "version" "2.0.12" + version "2.0.12" + resolved "https://registry.npmjs.org/@chakra-ui/textarea/-/textarea-2.0.12.tgz" + integrity sha512-msR9YMynRXwZIqR6DgjQ2MogA/cW1syBx/R0v3es+9Zx8zlbuKdoLhYqajHteCup8dUzTeIH2Vs2vAwgq4wu5A== dependencies: "@chakra-ui/form-control" "2.0.11" -"@chakra-ui/theme-tools@^2.0.2", "@chakra-ui/theme-tools@2.0.12": - "integrity" "sha512-mnMlKSmXkCjHUJsKWmJbgBTGF2vnLaMLv1ihkBn5eQcCubMQrBLTiMAEFl5pZdzuHItU6QdnLGA10smcXbNl0g==" - "resolved" "https://registry.npmjs.org/@chakra-ui/theme-tools/-/theme-tools-2.0.12.tgz" - "version" "2.0.12" +"@chakra-ui/theme-tools@2.0.12", "@chakra-ui/theme-tools@^2.0.2": + version "2.0.12" + resolved "https://registry.npmjs.org/@chakra-ui/theme-tools/-/theme-tools-2.0.12.tgz" + integrity sha512-mnMlKSmXkCjHUJsKWmJbgBTGF2vnLaMLv1ihkBn5eQcCubMQrBLTiMAEFl5pZdzuHItU6QdnLGA10smcXbNl0g== dependencies: "@chakra-ui/anatomy" "2.0.7" "@ctrl/tinycolor" "^3.4.0" "@chakra-ui/theme-utils@2.0.1": - "integrity" "sha512-NDwzgTPxm+v3PAJlSSU1MORHLMqO9vsRJ+ObELD5wpvE9aEyRziN/AZSoK2oLwCQMPEiU7R99K5ij1E6ptMt7w==" - "resolved" "https://registry.npmjs.org/@chakra-ui/theme-utils/-/theme-utils-2.0.1.tgz" - "version" "2.0.1" + version "2.0.1" + resolved "https://registry.npmjs.org/@chakra-ui/theme-utils/-/theme-utils-2.0.1.tgz" + integrity sha512-NDwzgTPxm+v3PAJlSSU1MORHLMqO9vsRJ+ObELD5wpvE9aEyRziN/AZSoK2oLwCQMPEiU7R99K5ij1E6ptMt7w== dependencies: "@chakra-ui/styled-system" "2.3.4" "@chakra-ui/theme" "2.1.14" - "lodash.mergewith" "4.6.2" + lodash.mergewith "4.6.2" "@chakra-ui/theme@2.1.14": - "integrity" "sha512-6EYJCQlrjSjNAJvZmw1un50F8+sQDFsdwu/7UzWe+TeANpKlz4ZcHbh0gkl3PD62lGis+ehITUwqRm8htvDOjw==" - "resolved" "https://registry.npmjs.org/@chakra-ui/theme/-/theme-2.1.14.tgz" - "version" "2.1.14" + version "2.1.14" + resolved "https://registry.npmjs.org/@chakra-ui/theme/-/theme-2.1.14.tgz" + integrity sha512-6EYJCQlrjSjNAJvZmw1un50F8+sQDFsdwu/7UzWe+TeANpKlz4ZcHbh0gkl3PD62lGis+ehITUwqRm8htvDOjw== dependencies: "@chakra-ui/anatomy" "2.0.7" "@chakra-ui/theme-tools" "2.0.12" "@chakra-ui/toast@4.0.0": - "integrity" "sha512-abeeloJac5T9WK2IN76fEM5FSRH+erNXln2HqDf5wLBn33avSBXWyTiUL8riVSUqto0lrIn6FuK/MmKo0DH4og==" - "resolved" "https://registry.npmjs.org/@chakra-ui/toast/-/toast-4.0.0.tgz" - "version" "4.0.0" + version "4.0.0" + resolved "https://registry.npmjs.org/@chakra-ui/toast/-/toast-4.0.0.tgz" + integrity sha512-abeeloJac5T9WK2IN76fEM5FSRH+erNXln2HqDf5wLBn33avSBXWyTiUL8riVSUqto0lrIn6FuK/MmKo0DH4og== dependencies: "@chakra-ui/alert" "2.0.11" "@chakra-ui/close-button" "2.0.11" @@ -923,9 +839,9 @@ "@chakra-ui/theme" "2.1.14" "@chakra-ui/tooltip@2.2.0": - "integrity" "sha512-oB97aQJBW+U3rRIt1ct7NaDRMnbW16JQ5ZBCl3BzN1VJWO3djiNuscpjVdZSceb+FdGSFo+GoDozp1ZwqdfFeQ==" - "resolved" "https://registry.npmjs.org/@chakra-ui/tooltip/-/tooltip-2.2.0.tgz" - "version" "2.2.0" + version "2.2.0" + resolved "https://registry.npmjs.org/@chakra-ui/tooltip/-/tooltip-2.2.0.tgz" + integrity sha512-oB97aQJBW+U3rRIt1ct7NaDRMnbW16JQ5ZBCl3BzN1VJWO3djiNuscpjVdZSceb+FdGSFo+GoDozp1ZwqdfFeQ== dependencies: "@chakra-ui/popper" "3.0.8" "@chakra-ui/portal" "2.0.10" @@ -935,34 +851,57 @@ "@chakra-ui/react-use-merge-refs" "2.0.4" "@chakra-ui/transition@2.0.11": - "integrity" "sha512-O0grc162LARPurjz1R+J+zr4AAKsVwN5+gaqLfZLMWg6TpvczJhwEA2fLCNAdkC/gomere390bJsy52xfUacUw==" - "resolved" "https://registry.npmjs.org/@chakra-ui/transition/-/transition-2.0.11.tgz" - "version" "2.0.11" + version "2.0.11" + resolved "https://registry.npmjs.org/@chakra-ui/transition/-/transition-2.0.11.tgz" + integrity sha512-O0grc162LARPurjz1R+J+zr4AAKsVwN5+gaqLfZLMWg6TpvczJhwEA2fLCNAdkC/gomere390bJsy52xfUacUw== "@chakra-ui/utils@2.0.11": - "integrity" "sha512-4ZQdK6tbOuTrUCsAQBHWo7tw5/Q6pBV93ZbVpats61cSWMFGv32AIQw9/hA4un2zDeSWN9ZMVLNjAY2Dq/KQOA==" - "resolved" "https://registry.npmjs.org/@chakra-ui/utils/-/utils-2.0.11.tgz" - "version" "2.0.11" + version "2.0.11" + resolved "https://registry.npmjs.org/@chakra-ui/utils/-/utils-2.0.11.tgz" + integrity sha512-4ZQdK6tbOuTrUCsAQBHWo7tw5/Q6pBV93ZbVpats61cSWMFGv32AIQw9/hA4un2zDeSWN9ZMVLNjAY2Dq/KQOA== dependencies: "@types/lodash.mergewith" "4.6.6" - "css-box-model" "1.2.1" - "framesync" "5.3.0" - "lodash.mergewith" "4.6.2" + css-box-model "1.2.1" + framesync "5.3.0" + lodash.mergewith "4.6.2" "@chakra-ui/visually-hidden@2.0.11": - "integrity" "sha512-e+5amYvnsmEQdiWH4XMyvrtGTdwz//+48vwj5CsNWWcselzkwqodmciy5rIrT71/SCQDOtmgnL7ZWAUOffxfsQ==" - "resolved" "https://registry.npmjs.org/@chakra-ui/visually-hidden/-/visually-hidden-2.0.11.tgz" - "version" "2.0.11" + version "2.0.11" + resolved "https://registry.npmjs.org/@chakra-ui/visually-hidden/-/visually-hidden-2.0.11.tgz" + integrity sha512-e+5amYvnsmEQdiWH4XMyvrtGTdwz//+48vwj5CsNWWcselzkwqodmciy5rIrT71/SCQDOtmgnL7ZWAUOffxfsQ== + +"@coinbase/wallet-sdk@^3.5.3": + version "3.5.4" + resolved "https://registry.yarnpkg.com/@coinbase/wallet-sdk/-/wallet-sdk-3.5.4.tgz#957aa74521a4afa61ae99e1e2b948a6e017fcc87" + integrity sha512-+5s05dmB6YUPUnV5vThP96GVG1O4GgS3qYvjYJhe56ds8YFz+keU3/docFBLf8FQOCIO5j7IZtZmVGvz7G+kRw== + dependencies: + "@metamask/safe-event-emitter" "2.0.0" + "@solana/web3.js" "1.52.0" + bind-decorator "^1.0.11" + bn.js "^5.1.1" + buffer "^6.0.3" + clsx "^1.1.0" + eth-block-tracker "4.4.3" + eth-json-rpc-filters "4.2.2" + eth-rpc-errors "4.0.2" + json-rpc-engine "6.1.0" + keccak "^3.0.1" + preact "^10.5.9" + qs "^6.10.3" + rxjs "^6.6.3" + sha.js "^2.4.11" + stream-browserify "^3.0.0" + util "^0.12.4" "@ctrl/tinycolor@^3.4.0": - "integrity" "sha512-ej5oVy6lykXsvieQtqZxCOaLT+xD4+QNarq78cIYISHmZXshCvROLudpQN3lfL8G0NL7plMSSK+zlyvCaIJ4Iw==" - "resolved" "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.4.1.tgz" - "version" "3.4.1" + version "3.4.1" + resolved "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.4.1.tgz" + integrity sha512-ej5oVy6lykXsvieQtqZxCOaLT+xD4+QNarq78cIYISHmZXshCvROLudpQN3lfL8G0NL7plMSSK+zlyvCaIJ4Iw== "@emotion/babel-plugin@^11.10.5": - "integrity" "sha512-xE7/hyLHJac7D2Ve9dKroBBZqBT7WuPQmWcq7HSGb84sUuP4mlOWoB8dvVfD9yk5DHkU1m6RW7xSoDtnQHNQeA==" - "resolved" "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.10.5.tgz" - "version" "11.10.5" + version "11.10.5" + resolved "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.10.5.tgz" + integrity sha512-xE7/hyLHJac7D2Ve9dKroBBZqBT7WuPQmWcq7HSGb84sUuP4mlOWoB8dvVfD9yk5DHkU1m6RW7xSoDtnQHNQeA== dependencies: "@babel/helper-module-imports" "^7.16.7" "@babel/plugin-syntax-jsx" "^7.17.12" @@ -970,57 +909,57 @@ "@emotion/hash" "^0.9.0" "@emotion/memoize" "^0.8.0" "@emotion/serialize" "^1.1.1" - "babel-plugin-macros" "^3.1.0" - "convert-source-map" "^1.5.0" - "escape-string-regexp" "^4.0.0" - "find-root" "^1.1.0" - "source-map" "^0.5.7" - "stylis" "4.1.3" + babel-plugin-macros "^3.1.0" + convert-source-map "^1.5.0" + escape-string-regexp "^4.0.0" + find-root "^1.1.0" + source-map "^0.5.7" + stylis "4.1.3" "@emotion/cache@^11.10.5": - "integrity" "sha512-dGYHWyzTdmK+f2+EnIGBpkz1lKc4Zbj2KHd4cX3Wi8/OWr5pKslNjc3yABKH4adRGCvSX4VDC0i04mrrq0aiRA==" - "resolved" "https://registry.npmjs.org/@emotion/cache/-/cache-11.10.5.tgz" - "version" "11.10.5" + version "11.10.5" + resolved "https://registry.npmjs.org/@emotion/cache/-/cache-11.10.5.tgz" + integrity sha512-dGYHWyzTdmK+f2+EnIGBpkz1lKc4Zbj2KHd4cX3Wi8/OWr5pKslNjc3yABKH4adRGCvSX4VDC0i04mrrq0aiRA== dependencies: "@emotion/memoize" "^0.8.0" "@emotion/sheet" "^1.2.1" "@emotion/utils" "^1.2.0" "@emotion/weak-memoize" "^0.3.0" - "stylis" "4.1.3" + stylis "4.1.3" "@emotion/hash@^0.9.0": - "integrity" "sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ==" - "resolved" "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.0.tgz" - "version" "0.9.0" + version "0.9.0" + resolved "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.0.tgz" + integrity sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ== "@emotion/is-prop-valid@^0.8.2": - "integrity" "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==" - "resolved" "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz" - "version" "0.8.8" + version "0.8.8" + resolved "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz" + integrity sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA== dependencies: "@emotion/memoize" "0.7.4" "@emotion/is-prop-valid@^1.2.0": - "integrity" "sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg==" - "resolved" "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz" - "version" "1.2.0" + version "1.2.0" + resolved "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz" + integrity sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg== dependencies: "@emotion/memoize" "^0.8.0" -"@emotion/memoize@^0.8.0": - "integrity" "sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==" - "resolved" "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.0.tgz" - "version" "0.8.0" - "@emotion/memoize@0.7.4": - "integrity" "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==" - "resolved" "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz" - "version" "0.7.4" + version "0.7.4" + resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz" + integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw== -"@emotion/react@^11.0.0", "@emotion/react@^11.0.0-rc.0", "@emotion/react@^11.9.0", "@emotion/react@>=10.0.35": - "integrity" "sha512-TZs6235tCJ/7iF6/rvTaOH4oxQg2gMAcdHemjwLKIjKz4rRuYe1HJ2TQJKnAcRAfOUDdU8XoDadCe1rl72iv8A==" - "resolved" "https://registry.npmjs.org/@emotion/react/-/react-11.10.5.tgz" - "version" "11.10.5" +"@emotion/memoize@^0.8.0": + version "0.8.0" + resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.0.tgz" + integrity sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA== + +"@emotion/react@^11.9.0": + version "11.10.5" + resolved "https://registry.npmjs.org/@emotion/react/-/react-11.10.5.tgz" + integrity sha512-TZs6235tCJ/7iF6/rvTaOH4oxQg2gMAcdHemjwLKIjKz4rRuYe1HJ2TQJKnAcRAfOUDdU8XoDadCe1rl72iv8A== dependencies: "@babel/runtime" "^7.18.3" "@emotion/babel-plugin" "^11.10.5" @@ -1029,28 +968,28 @@ "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0" "@emotion/utils" "^1.2.0" "@emotion/weak-memoize" "^0.3.0" - "hoist-non-react-statics" "^3.3.1" + hoist-non-react-statics "^3.3.1" "@emotion/serialize@^1.1.1": - "integrity" "sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA==" - "resolved" "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.1.tgz" - "version" "1.1.1" + version "1.1.1" + resolved "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.1.tgz" + integrity sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA== dependencies: "@emotion/hash" "^0.9.0" "@emotion/memoize" "^0.8.0" "@emotion/unitless" "^0.8.0" "@emotion/utils" "^1.2.0" - "csstype" "^3.0.2" + csstype "^3.0.2" "@emotion/sheet@^1.2.1": - "integrity" "sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA==" - "resolved" "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.1.tgz" - "version" "1.2.1" + version "1.2.1" + resolved "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.1.tgz" + integrity sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA== -"@emotion/styled@^11.0.0", "@emotion/styled@^11.9.0": - "integrity" "sha512-8EP6dD7dMkdku2foLoruPCNkRevzdcBaY6q0l0OsbyJK+x8D9HWjX27ARiSIKNF634hY9Zdoedh8bJCiva8yZw==" - "resolved" "https://registry.npmjs.org/@emotion/styled/-/styled-11.10.5.tgz" - "version" "11.10.5" +"@emotion/styled@^11.9.0": + version "11.10.5" + resolved "https://registry.npmjs.org/@emotion/styled/-/styled-11.10.5.tgz" + integrity sha512-8EP6dD7dMkdku2foLoruPCNkRevzdcBaY6q0l0OsbyJK+x8D9HWjX27ARiSIKNF634hY9Zdoedh8bJCiva8yZw== dependencies: "@babel/runtime" "^7.18.3" "@emotion/babel-plugin" "^11.10.5" @@ -1060,29 +999,29 @@ "@emotion/utils" "^1.2.0" "@emotion/unitless@^0.8.0": - "integrity" "sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==" - "resolved" "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.0.tgz" - "version" "0.8.0" + version "0.8.0" + resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.0.tgz" + integrity sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw== "@emotion/use-insertion-effect-with-fallbacks@^1.0.0": - "integrity" "sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A==" - "resolved" "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz" - "version" "1.0.0" + version "1.0.0" + resolved "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz" + integrity sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A== "@emotion/utils@^1.2.0": - "integrity" "sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw==" - "resolved" "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.0.tgz" - "version" "1.2.0" + version "1.2.0" + resolved "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.0.tgz" + integrity sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw== "@emotion/weak-memoize@^0.3.0": - "integrity" "sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==" - "resolved" "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz" - "version" "0.3.0" + version "0.3.0" + resolved "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz" + integrity sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg== -"@ethersproject/abi@^5.7.0", "@ethersproject/abi@5.7.0": - "integrity" "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==" - "resolved" "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz" - "version" "5.7.0" +"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz" + integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== dependencies: "@ethersproject/address" "^5.7.0" "@ethersproject/bignumber" "^5.7.0" @@ -1094,10 +1033,10 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@ethersproject/abstract-provider@^5.7.0", "@ethersproject/abstract-provider@5.7.0": - "integrity" "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==" - "resolved" "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz" - "version" "5.7.0" +"@ethersproject/abstract-provider@5.7.0", "@ethersproject/abstract-provider@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz" + integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== dependencies: "@ethersproject/bignumber" "^5.7.0" "@ethersproject/bytes" "^5.7.0" @@ -1107,10 +1046,10 @@ "@ethersproject/transactions" "^5.7.0" "@ethersproject/web" "^5.7.0" -"@ethersproject/abstract-signer@^5.7.0", "@ethersproject/abstract-signer@5.7.0": - "integrity" "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==" - "resolved" "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz" - "version" "5.7.0" +"@ethersproject/abstract-signer@5.7.0", "@ethersproject/abstract-signer@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz" + integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== dependencies: "@ethersproject/abstract-provider" "^5.7.0" "@ethersproject/bignumber" "^5.7.0" @@ -1118,10 +1057,10 @@ "@ethersproject/logger" "^5.7.0" "@ethersproject/properties" "^5.7.0" -"@ethersproject/address@^5.7.0", "@ethersproject/address@5.7.0": - "integrity" "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==" - "resolved" "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz" - "version" "5.7.0" +"@ethersproject/address@5.7.0", "@ethersproject/address@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz" + integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== dependencies: "@ethersproject/bignumber" "^5.7.0" "@ethersproject/bytes" "^5.7.0" @@ -1129,48 +1068,48 @@ "@ethersproject/logger" "^5.7.0" "@ethersproject/rlp" "^5.7.0" -"@ethersproject/base64@^5.7.0", "@ethersproject/base64@5.7.0": - "integrity" "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==" - "resolved" "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz" - "version" "5.7.0" +"@ethersproject/base64@5.7.0", "@ethersproject/base64@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz" + integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== dependencies: "@ethersproject/bytes" "^5.7.0" -"@ethersproject/basex@^5.7.0", "@ethersproject/basex@5.7.0": - "integrity" "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==" - "resolved" "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz" - "version" "5.7.0" +"@ethersproject/basex@5.7.0", "@ethersproject/basex@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz" + integrity sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw== dependencies: "@ethersproject/bytes" "^5.7.0" "@ethersproject/properties" "^5.7.0" -"@ethersproject/bignumber@^5.7.0", "@ethersproject/bignumber@5.7.0": - "integrity" "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==" - "resolved" "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz" - "version" "5.7.0" +"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz" + integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== dependencies: "@ethersproject/bytes" "^5.7.0" "@ethersproject/logger" "^5.7.0" - "bn.js" "^5.2.1" + bn.js "^5.2.1" -"@ethersproject/bytes@^5.7.0", "@ethersproject/bytes@5.7.0": - "integrity" "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==" - "resolved" "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz" - "version" "5.7.0" +"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz" + integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/constants@^5.7.0", "@ethersproject/constants@5.7.0": - "integrity" "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==" - "resolved" "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz" - "version" "5.7.0" +"@ethersproject/constants@5.7.0", "@ethersproject/constants@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz" + integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== dependencies: "@ethersproject/bignumber" "^5.7.0" "@ethersproject/contracts@5.7.0": - "integrity" "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==" - "resolved" "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz" - "version" "5.7.0" + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz" + integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg== dependencies: "@ethersproject/abi" "^5.7.0" "@ethersproject/abstract-provider" "^5.7.0" @@ -1183,10 +1122,10 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/transactions" "^5.7.0" -"@ethersproject/hash@^5.7.0", "@ethersproject/hash@5.7.0": - "integrity" "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==" - "resolved" "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz" - "version" "5.7.0" +"@ethersproject/hash@5.7.0", "@ethersproject/hash@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz" + integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== dependencies: "@ethersproject/abstract-signer" "^5.7.0" "@ethersproject/address" "^5.7.0" @@ -1198,10 +1137,10 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@ethersproject/hdnode@^5.7.0", "@ethersproject/hdnode@5.7.0": - "integrity" "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==" - "resolved" "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz" - "version" "5.7.0" +"@ethersproject/hdnode@5.7.0", "@ethersproject/hdnode@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz" + integrity sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg== dependencies: "@ethersproject/abstract-signer" "^5.7.0" "@ethersproject/basex" "^5.7.0" @@ -1216,10 +1155,10 @@ "@ethersproject/transactions" "^5.7.0" "@ethersproject/wordlists" "^5.7.0" -"@ethersproject/json-wallets@^5.7.0", "@ethersproject/json-wallets@5.7.0": - "integrity" "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==" - "resolved" "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz" - "version" "5.7.0" +"@ethersproject/json-wallets@5.7.0", "@ethersproject/json-wallets@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz" + integrity sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g== dependencies: "@ethersproject/abstract-signer" "^5.7.0" "@ethersproject/address" "^5.7.0" @@ -1232,48 +1171,48 @@ "@ethersproject/random" "^5.7.0" "@ethersproject/strings" "^5.7.0" "@ethersproject/transactions" "^5.7.0" - "aes-js" "3.0.0" - "scrypt-js" "3.0.1" + aes-js "3.0.0" + scrypt-js "3.0.1" -"@ethersproject/keccak256@^5.7.0", "@ethersproject/keccak256@5.7.0": - "integrity" "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==" - "resolved" "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz" - "version" "5.7.0" +"@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz" + integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== dependencies: "@ethersproject/bytes" "^5.7.0" - "js-sha3" "0.8.0" + js-sha3 "0.8.0" -"@ethersproject/logger@^5.7.0", "@ethersproject/logger@5.7.0": - "integrity" "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==" - "resolved" "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz" - "version" "5.7.0" +"@ethersproject/logger@5.7.0", "@ethersproject/logger@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz" + integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== -"@ethersproject/networks@^5.7.0", "@ethersproject/networks@5.7.1": - "integrity" "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==" - "resolved" "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz" - "version" "5.7.1" +"@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0": + version "5.7.1" + resolved "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz" + integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/pbkdf2@^5.7.0", "@ethersproject/pbkdf2@5.7.0": - "integrity" "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==" - "resolved" "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz" - "version" "5.7.0" +"@ethersproject/pbkdf2@5.7.0", "@ethersproject/pbkdf2@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz" + integrity sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw== dependencies: "@ethersproject/bytes" "^5.7.0" "@ethersproject/sha2" "^5.7.0" -"@ethersproject/properties@^5.7.0", "@ethersproject/properties@5.7.0": - "integrity" "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==" - "resolved" "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz" - "version" "5.7.0" +"@ethersproject/properties@5.7.0", "@ethersproject/properties@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz" + integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== dependencies: "@ethersproject/logger" "^5.7.0" "@ethersproject/providers@5.7.2": - "integrity" "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==" - "resolved" "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz" - "version" "5.7.2" + version "5.7.2" + resolved "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz" + integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== dependencies: "@ethersproject/abstract-provider" "^5.7.0" "@ethersproject/abstract-signer" "^5.7.0" @@ -1293,50 +1232,50 @@ "@ethersproject/strings" "^5.7.0" "@ethersproject/transactions" "^5.7.0" "@ethersproject/web" "^5.7.0" - "bech32" "1.1.4" - "ws" "7.4.6" + bech32 "1.1.4" + ws "7.4.6" -"@ethersproject/random@^5.7.0", "@ethersproject/random@5.7.0": - "integrity" "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==" - "resolved" "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz" - "version" "5.7.0" +"@ethersproject/random@5.7.0", "@ethersproject/random@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz" + integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ== dependencies: "@ethersproject/bytes" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/rlp@^5.7.0", "@ethersproject/rlp@5.7.0": - "integrity" "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==" - "resolved" "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz" - "version" "5.7.0" +"@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz" + integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== dependencies: "@ethersproject/bytes" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/sha2@^5.7.0", "@ethersproject/sha2@5.7.0": - "integrity" "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==" - "resolved" "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz" - "version" "5.7.0" +"@ethersproject/sha2@5.7.0", "@ethersproject/sha2@^5.5.0", "@ethersproject/sha2@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz" + integrity sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw== dependencies: "@ethersproject/bytes" "^5.7.0" "@ethersproject/logger" "^5.7.0" - "hash.js" "1.1.7" + hash.js "1.1.7" -"@ethersproject/signing-key@^5.7.0", "@ethersproject/signing-key@5.7.0": - "integrity" "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==" - "resolved" "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz" - "version" "5.7.0" +"@ethersproject/signing-key@5.7.0", "@ethersproject/signing-key@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz" + integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== dependencies: "@ethersproject/bytes" "^5.7.0" "@ethersproject/logger" "^5.7.0" "@ethersproject/properties" "^5.7.0" - "bn.js" "^5.2.1" - "elliptic" "6.5.4" - "hash.js" "1.1.7" + bn.js "^5.2.1" + elliptic "6.5.4" + hash.js "1.1.7" "@ethersproject/solidity@5.7.0": - "integrity" "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==" - "resolved" "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz" - "version" "5.7.0" + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz" + integrity sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA== dependencies: "@ethersproject/bignumber" "^5.7.0" "@ethersproject/bytes" "^5.7.0" @@ -1345,19 +1284,19 @@ "@ethersproject/sha2" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@ethersproject/strings@^5.7.0", "@ethersproject/strings@5.7.0": - "integrity" "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==" - "resolved" "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz" - "version" "5.7.0" +"@ethersproject/strings@5.7.0", "@ethersproject/strings@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz" + integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== dependencies: "@ethersproject/bytes" "^5.7.0" "@ethersproject/constants" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/transactions@^5.7.0", "@ethersproject/transactions@5.7.0": - "integrity" "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==" - "resolved" "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz" - "version" "5.7.0" +"@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz" + integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== dependencies: "@ethersproject/address" "^5.7.0" "@ethersproject/bignumber" "^5.7.0" @@ -1370,18 +1309,18 @@ "@ethersproject/signing-key" "^5.7.0" "@ethersproject/units@5.7.0": - "integrity" "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==" - "resolved" "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz" - "version" "5.7.0" + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz" + integrity sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg== dependencies: "@ethersproject/bignumber" "^5.7.0" "@ethersproject/constants" "^5.7.0" "@ethersproject/logger" "^5.7.0" "@ethersproject/wallet@5.7.0": - "integrity" "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==" - "resolved" "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz" - "version" "5.7.0" + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz" + integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA== dependencies: "@ethersproject/abstract-provider" "^5.7.0" "@ethersproject/abstract-signer" "^5.7.0" @@ -1399,10 +1338,10 @@ "@ethersproject/transactions" "^5.7.0" "@ethersproject/wordlists" "^5.7.0" -"@ethersproject/web@^5.7.0", "@ethersproject/web@5.7.1": - "integrity" "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==" - "resolved" "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz" - "version" "5.7.1" +"@ethersproject/web@5.7.1", "@ethersproject/web@^5.7.0": + version "5.7.1" + resolved "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz" + integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== dependencies: "@ethersproject/base64" "^5.7.0" "@ethersproject/bytes" "^5.7.0" @@ -1410,10 +1349,10 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@ethersproject/wordlists@^5.7.0", "@ethersproject/wordlists@5.7.0": - "integrity" "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==" - "resolved" "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz" - "version" "5.7.0" +"@ethersproject/wordlists@5.7.0", "@ethersproject/wordlists@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz" + integrity sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA== dependencies: "@ethersproject/bytes" "^5.7.0" "@ethersproject/hash" "^5.7.0" @@ -1422,439 +1361,1279 @@ "@ethersproject/strings" "^5.7.0" "@fontsource/zen-dots@^4.5.8": - "integrity" "sha512-Fo1njHtPHUQk0Yr7dk4F8l/mNNJZVA4NJfwe7OayAGQWuZswEh5pCPGUDpblE/VBwno4fimFcX6sZCGx9sGK3A==" - "resolved" "https://registry.npmjs.org/@fontsource/zen-dots/-/zen-dots-4.5.8.tgz" - "version" "4.5.8" - -"@jridgewell/gen-mapping@^0.1.0": - "integrity" "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==" - "resolved" "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz" - "version" "0.1.1" - dependencies: - "@jridgewell/set-array" "^1.0.0" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jridgewell/gen-mapping@^0.3.2": - "integrity" "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==" - "resolved" "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz" - "version" "0.3.2" - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/resolve-uri@3.1.0": - "integrity" "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" - "resolved" "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" - "version" "3.1.0" - -"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": - "integrity" "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" - "resolved" "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" - "version" "1.1.2" - -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@1.4.14": - "integrity" "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" - "resolved" "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" - "version" "1.4.14" - -"@jridgewell/trace-mapping@^0.3.9": - "integrity" "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==" - "resolved" "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz" - "version" "0.3.17" - dependencies: - "@jridgewell/resolve-uri" "3.1.0" - "@jridgewell/sourcemap-codec" "1.4.14" + version "4.5.8" + resolved "https://registry.npmjs.org/@fontsource/zen-dots/-/zen-dots-4.5.8.tgz" + integrity sha512-Fo1njHtPHUQk0Yr7dk4F8l/mNNJZVA4NJfwe7OayAGQWuZswEh5pCPGUDpblE/VBwno4fimFcX6sZCGx9sGK3A== + +"@json-rpc-tools/provider@^1.5.5": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@json-rpc-tools/provider/-/provider-1.7.6.tgz#8a17c34c493fa892632e278fd9331104e8491ec6" + integrity sha512-z7D3xvJ33UfCGv77n40lbzOYjZKVM3k2+5cV7xS8G6SCvKTzMkhkUYuD/qzQUNT4cG/lv0e9mRToweEEVLVVmA== + dependencies: + "@json-rpc-tools/utils" "^1.7.6" + axios "^0.21.0" + safe-json-utils "^1.1.1" + ws "^7.4.0" + +"@json-rpc-tools/types@^1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@json-rpc-tools/types/-/types-1.7.6.tgz#5abd5fde01364a130c46093b501715bcce5bdc0e" + integrity sha512-nDSqmyRNEqEK9TZHtM15uNnDljczhCUdBmRhpNZ95bIPKEDQ+nTDmGMFd2lLin3upc5h2VVVd9tkTDdbXUhDIQ== + dependencies: + keyvaluestorage-interface "^1.0.0" + +"@json-rpc-tools/utils@^1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@json-rpc-tools/utils/-/utils-1.7.6.tgz#67f04987dbaa2e7adb6adff1575367b75a9a9ba1" + integrity sha512-HjA8x/U/Q78HRRe19yh8HVKoZ+Iaoo3YZjakJYxR+rw52NHo6jM+VE9b8+7ygkCFXl/EHID5wh/MkXaE/jGyYw== + dependencies: + "@json-rpc-tools/types" "^1.7.6" + "@pedrouid/environment" "^1.0.1" + +"@metamask/safe-event-emitter@2.0.0", "@metamask/safe-event-emitter@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@metamask/safe-event-emitter/-/safe-event-emitter-2.0.0.tgz#af577b477c683fad17c619a78208cede06f9605c" + integrity sha512-/kSXhY692qiV1MXu6EeOZvg5nECLclxNXcKCxJ3cXQgYuRymRHpdx/t7JXfsK+JLjwA1e1c1/SBrlQYpusC29Q== "@motionone/animation@^10.12.0": - "integrity" "sha512-h+1sdyBP8vbxEBW5gPFDnj+m2DCqdlAuf2g6Iafb1lcMnqjsRXWlPw1AXgvUMXmreyhqmPbJqoNfIKdytampRQ==" - "resolved" "https://registry.npmjs.org/@motionone/animation/-/animation-10.14.0.tgz" - "version" "10.14.0" + version "10.14.0" + resolved "https://registry.npmjs.org/@motionone/animation/-/animation-10.14.0.tgz" + integrity sha512-h+1sdyBP8vbxEBW5gPFDnj+m2DCqdlAuf2g6Iafb1lcMnqjsRXWlPw1AXgvUMXmreyhqmPbJqoNfIKdytampRQ== dependencies: "@motionone/easing" "^10.14.0" "@motionone/types" "^10.14.0" "@motionone/utils" "^10.14.0" - "tslib" "^2.3.1" + tslib "^2.3.1" "@motionone/dom@10.12.0": - "integrity" "sha512-UdPTtLMAktHiqV0atOczNYyDd/d8Cf5fFsd1tua03PqTwwCe/6lwhLSQ8a7TbnQ5SN0gm44N1slBfj+ORIhrqw==" - "resolved" "https://registry.npmjs.org/@motionone/dom/-/dom-10.12.0.tgz" - "version" "10.12.0" + version "10.12.0" + resolved "https://registry.npmjs.org/@motionone/dom/-/dom-10.12.0.tgz" + integrity sha512-UdPTtLMAktHiqV0atOczNYyDd/d8Cf5fFsd1tua03PqTwwCe/6lwhLSQ8a7TbnQ5SN0gm44N1slBfj+ORIhrqw== dependencies: "@motionone/animation" "^10.12.0" "@motionone/generators" "^10.12.0" "@motionone/types" "^10.12.0" "@motionone/utils" "^10.12.0" - "hey-listen" "^1.0.8" - "tslib" "^2.3.1" + hey-listen "^1.0.8" + tslib "^2.3.1" "@motionone/easing@^10.14.0": - "integrity" "sha512-2vUBdH9uWTlRbuErhcsMmt1jvMTTqvGmn9fHq8FleFDXBlHFs5jZzHJT9iw+4kR1h6a4SZQuCf72b9ji92qNYA==" - "resolved" "https://registry.npmjs.org/@motionone/easing/-/easing-10.14.0.tgz" - "version" "10.14.0" + version "10.14.0" + resolved "https://registry.npmjs.org/@motionone/easing/-/easing-10.14.0.tgz" + integrity sha512-2vUBdH9uWTlRbuErhcsMmt1jvMTTqvGmn9fHq8FleFDXBlHFs5jZzHJT9iw+4kR1h6a4SZQuCf72b9ji92qNYA== dependencies: "@motionone/utils" "^10.14.0" - "tslib" "^2.3.1" + tslib "^2.3.1" "@motionone/generators@^10.12.0": - "integrity" "sha512-6kRHezoFfIjFN7pPpaxmkdZXD36tQNcyJe3nwVqwJ+ZfC0e3rFmszR8kp9DEVFs9QL/akWjuGPSLBI1tvz+Vjg==" - "resolved" "https://registry.npmjs.org/@motionone/generators/-/generators-10.14.0.tgz" - "version" "10.14.0" + version "10.14.0" + resolved "https://registry.npmjs.org/@motionone/generators/-/generators-10.14.0.tgz" + integrity sha512-6kRHezoFfIjFN7pPpaxmkdZXD36tQNcyJe3nwVqwJ+ZfC0e3rFmszR8kp9DEVFs9QL/akWjuGPSLBI1tvz+Vjg== dependencies: "@motionone/types" "^10.14.0" "@motionone/utils" "^10.14.0" - "tslib" "^2.3.1" + tslib "^2.3.1" "@motionone/types@^10.12.0", "@motionone/types@^10.14.0": - "integrity" "sha512-3bNWyYBHtVd27KncnJLhksMFQ5o2MSdk1cA/IZqsHtA9DnRM1SYgN01CTcJ8Iw8pCXF5Ocp34tyAjY7WRpOJJQ==" - "resolved" "https://registry.npmjs.org/@motionone/types/-/types-10.14.0.tgz" - "version" "10.14.0" + version "10.14.0" + resolved "https://registry.npmjs.org/@motionone/types/-/types-10.14.0.tgz" + integrity sha512-3bNWyYBHtVd27KncnJLhksMFQ5o2MSdk1cA/IZqsHtA9DnRM1SYgN01CTcJ8Iw8pCXF5Ocp34tyAjY7WRpOJJQ== "@motionone/utils@^10.12.0", "@motionone/utils@^10.14.0": - "integrity" "sha512-sLWBLPzRqkxmOTRzSaD3LFQXCPHvDzyHJ1a3VP9PRzBxyVd2pv51/gMOsdAcxQ9n+MIeGJnxzXBYplUHKj4jkw==" - "resolved" "https://registry.npmjs.org/@motionone/utils/-/utils-10.14.0.tgz" - "version" "10.14.0" + version "10.14.0" + resolved "https://registry.npmjs.org/@motionone/utils/-/utils-10.14.0.tgz" + integrity sha512-sLWBLPzRqkxmOTRzSaD3LFQXCPHvDzyHJ1a3VP9PRzBxyVd2pv51/gMOsdAcxQ9n+MIeGJnxzXBYplUHKj4jkw== dependencies: "@motionone/types" "^10.14.0" - "hey-listen" "^1.0.8" - "tslib" "^2.3.1" + hey-listen "^1.0.8" + tslib "^2.3.1" "@next/env@13.0.0": - "integrity" "sha512-65v9BVuah2Mplohm4+efsKEnoEuhmlGm8B2w6vD1geeEP2wXtlSJCvR/cCRJ3fD8wzCQBV41VcMBQeYET6MRkg==" - "resolved" "https://registry.npmjs.org/@next/env/-/env-13.0.0.tgz" - "version" "13.0.0" + version "13.0.0" + resolved "https://registry.npmjs.org/@next/env/-/env-13.0.0.tgz" + integrity sha512-65v9BVuah2Mplohm4+efsKEnoEuhmlGm8B2w6vD1geeEP2wXtlSJCvR/cCRJ3fD8wzCQBV41VcMBQeYET6MRkg== + +"@next/swc-android-arm-eabi@13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-13.0.0.tgz#15cd89d19d3c00d123fdfe367bab38c362f6c515" + integrity sha512-+DUQkYF93gxFjWY+CYWE1QDX6gTgnUiWf+W4UqZjM1Jcef8U97fS6xYh+i+8rH4MM0AXHm7OSakvfOMzmjU6VA== + +"@next/swc-android-arm64@13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@next/swc-android-arm64/-/swc-android-arm64-13.0.0.tgz#9410365bb07097268d4773a46b02cfe6b3fe3ab7" + integrity sha512-RW9Uy3bMSc0zVGCa11klFuwfP/jdcdkhdruqnrJ7v+7XHm6OFKkSRzX6ee7yGR1rdDZvTnP4GZSRSpzjLv/N0g== "@next/swc-darwin-arm64@13.0.0": - "integrity" "sha512-APA26nps1j4qyhOIzkclW/OmgotVHj1jBxebSpMCPw2rXfiNvKNY9FA0TcuwPmUCNqaTnm703h6oW4dvp73A4Q==" - "resolved" "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.0.0.tgz" - "version" "13.0.0" + version "13.0.0" + resolved "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.0.0.tgz" + integrity sha512-APA26nps1j4qyhOIzkclW/OmgotVHj1jBxebSpMCPw2rXfiNvKNY9FA0TcuwPmUCNqaTnm703h6oW4dvp73A4Q== + +"@next/swc-darwin-x64@13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-13.0.0.tgz#6b214753410e1d8512a1491045acea1e188df7d6" + integrity sha512-qsUhUdoFuRJiaJ7LnvTQ6GZv1QnMDcRXCIjxaN0FNVXwrjkq++U7KjBUaxXkRzLV4C7u0NHLNOp0iZwNNE7ypw== + +"@next/swc-freebsd-x64@13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@next/swc-freebsd-x64/-/swc-freebsd-x64-13.0.0.tgz#eeb176bdb585f48882bdac1d04271b918ca87590" + integrity sha512-sCdyCbboS7CwdnevKH9J6hkJI76LUw1jVWt4eV7kISuLiPba3JmehZSWm80oa4ADChRVAwzhLAo2zJaYRrInbg== + +"@next/swc-linux-arm-gnueabihf@13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-13.0.0.tgz#2c2a9622c93f87a8baca94e068f674da4cae6018" + integrity sha512-/X/VxfFA41C9jrEv+sUsPLQ5vbDPVIgG0CJrzKvrcc+b+4zIgPgtfsaWq9ockjHFQi3ycvlZK4TALOXO8ovQ6Q== + +"@next/swc-linux-arm64-gnu@13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.0.0.tgz#69505827e2928fb18034150fd4d754d54c4a1c4b" + integrity sha512-x6Oxr1GIi0ZtNiT6jbw+JVcbEi3UQgF7mMmkrgfL4mfchOwXtWSHKTSSPnwoJWJfXYa0Vy1n8NElWNTGAqoWFw== + +"@next/swc-linux-arm64-musl@13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.0.0.tgz#487a88f2583a046e882328fe0665b37eca4fd0f6" + integrity sha512-SnMH9ngI+ipGh3kqQ8+mDtWunirwmhQnQeZkEq9e/9Xsgjf04OetqrqRHKM1HmJtG2qMUJbyXFJ0F81TPuT+3g== + +"@next/swc-linux-x64-gnu@13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.0.0.tgz#29e89c7e4fd2e2b16ad059076f6261998aee53df" + integrity sha512-VSQwTX9EmdbotArtA1J67X8964oQfe0xHb32x4tu+JqTR+wOHyG6wGzPMdXH2oKAp6rdd7BzqxUXXf0J+ypHlw== + +"@next/swc-linux-x64-musl@13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.0.0.tgz#2f63aae922d2b2829aec21bf8f9adda8b6c16365" + integrity sha512-xBCP0nnpO0q4tsytXkvIwWFINtbFRyVY5gxa1zB0vlFtqYR9lNhrOwH3CBrks3kkeaePOXd611+8sjdUtrLnXA== + +"@next/swc-win32-arm64-msvc@13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.0.0.tgz#4117bad96c2a6775f70294fba45c63951a8a21ac" + integrity sha512-NutwDafqhGxqPj/eiUixJq9ImS/0sgx6gqlD7jRndCvQ2Q8AvDdu1+xKcGWGNnhcDsNM/n1avf1e62OG1GaqJg== + +"@next/swc-win32-ia32-msvc@13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.0.0.tgz#5914eb86f9ea92a00d76cb094dd9734b3bf2012c" + integrity sha512-zNaxaO+Kl/xNz02E9QlcVz0pT4MjkXGDLb25qxtAzyJL15aU0+VjjbIZAYWctG59dvggNIUNDWgoBeVTKB9xLg== + +"@next/swc-win32-x64-msvc@13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.0.0.tgz#c54a5a739dee04b20338d305226a2acdf701f67f" + integrity sha512-FFOGGWwTCRMu9W7MF496Urefxtuo2lttxF1vwS+1rIRsKvuLrWhVaVTj3T8sf2EBL6gtJbmh4TYlizS+obnGKA== + +"@pedrouid/environment@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@pedrouid/environment/-/environment-1.0.1.tgz#858f0f8a057340e0b250398b75ead77d6f4342ec" + integrity sha512-HaW78NszGzRZd9SeoI3JD11JqY+lubnaOx7Pewj5pfjqWXOEATpeKIFb9Z4t2WBUK2iryiXX3lzWwmYWgUL0Ug== "@popperjs/core@^2.9.3": - "integrity" "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==" - "resolved" "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz" - "version" "2.11.6" + version "2.11.6" + resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz" + integrity sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw== "@react-icons/all-files@^4.1.0": - "integrity" "sha512-hxBI2UOuVaI3O/BhQfhtb4kcGn9ft12RWAFVMUeNjqqhLsHvFtzIkFaptBJpFDANTKoDfdVoHTKZDlwKCACbMQ==" - "resolved" "https://registry.npmjs.org/@react-icons/all-files/-/all-files-4.1.0.tgz" - "version" "4.1.0" + version "4.1.0" + resolved "https://registry.npmjs.org/@react-icons/all-files/-/all-files-4.1.0.tgz" + integrity sha512-hxBI2UOuVaI3O/BhQfhtb4kcGn9ft12RWAFVMUeNjqqhLsHvFtzIkFaptBJpFDANTKoDfdVoHTKZDlwKCACbMQ== + +"@solana/buffer-layout@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@solana/buffer-layout/-/buffer-layout-4.0.0.tgz#75b1b11adc487234821c81dfae3119b73a5fd734" + integrity sha512-lR0EMP2HC3+Mxwd4YcnZb0smnaDw7Bl2IQWZiTevRH5ZZBZn6VRWn3/92E3qdU4SSImJkA6IDHawOHAnx/qUvQ== + dependencies: + buffer "~6.0.3" + +"@solana/web3.js@1.52.0": + version "1.52.0" + resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.52.0.tgz#71bd5c322a31e3e2fa8cda2261c594846810b8ea" + integrity sha512-oG1+BX4nVYZ0OBzmk6DRrY8oBYMsbXVQEf9N9JOfKm+wXSmjxVEEo8v3IPV8mKwR0JvUWuE8lOn3IUDiMlRLgg== + dependencies: + "@babel/runtime" "^7.12.5" + "@ethersproject/sha2" "^5.5.0" + "@solana/buffer-layout" "^4.0.0" + bigint-buffer "^1.1.5" + bn.js "^5.0.0" + borsh "^0.7.0" + bs58 "^4.0.1" + buffer "6.0.1" + fast-stable-stringify "^1.0.0" + jayson "^3.4.4" + js-sha3 "^0.8.0" + node-fetch "2" + react-native-url-polyfill "^1.3.0" + rpc-websockets "^7.5.0" + secp256k1 "^4.0.2" + superstruct "^0.14.2" + tweetnacl "^1.0.3" "@swc/helpers@0.4.11": - "integrity" "sha512-rEUrBSGIoSFuYxwBYtlUFMlE2CwGhmW+w9355/5oduSw8e5h2+Tj4UrAGNNgP9915++wj5vkQo0UuOBqOAq4nw==" - "resolved" "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.11.tgz" - "version" "0.4.11" + version "0.4.11" + resolved "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.11.tgz" + integrity sha512-rEUrBSGIoSFuYxwBYtlUFMlE2CwGhmW+w9355/5oduSw8e5h2+Tj4UrAGNNgP9915++wj5vkQo0UuOBqOAq4nw== + dependencies: + tslib "^2.4.0" + +"@tanstack/query-core@4.15.1": + version "4.15.1" + resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-4.15.1.tgz#a282f04fe5e612b50019e1cfaf0efabd220e00ce" + integrity sha512-+UfqJsNbPIVo0a9ANW0ZxtjiMfGLaaoIaL9vZeVycvmBuWywJGtSi7fgPVMCPdZQFOzMsaXaOsDtSKQD5xLRVQ== + +"@tanstack/query-persist-client-core@4.15.1": + version "4.15.1" + resolved "https://registry.yarnpkg.com/@tanstack/query-persist-client-core/-/query-persist-client-core-4.15.1.tgz#27e459a531de16454755a515b8d3dc4a0b99c7bb" + integrity sha512-ldoGHNJ4Du83CT1CvJQqaJtQXEz4CdGcDmexVoyRG2q8DV9PAfYi+zls462ZbIWxlni93pkEgG1/q4mZVk2nqQ== + +"@tanstack/query-sync-storage-persister@^4.14.5": + version "4.15.1" + resolved "https://registry.yarnpkg.com/@tanstack/query-sync-storage-persister/-/query-sync-storage-persister-4.15.1.tgz#a2a1407178cf429a21cf1f8e36a2e7d65d8bbc9c" + integrity sha512-uMk8VCTkxTS9F99nSjbJRIsNalv6cwAtBJ6HgX41dYW2BCQR4ZQrM52oohIMbZo8DqlE/gGRtplbCbQ3NDfx4g== + dependencies: + "@tanstack/query-persist-client-core" "4.15.1" + +"@tanstack/react-query-persist-client@^4.14.5": + version "4.16.1" + resolved "https://registry.yarnpkg.com/@tanstack/react-query-persist-client/-/react-query-persist-client-4.16.1.tgz#ab54352fe8435e88961cda48c75b844ab6e6e559" + integrity sha512-7i1Dj9amEDdRz34UMslf11uFs7QSpGqNRT9nFwc17pcJ4I3X7tSiEN1pgrAMg05eqnfGJgnSTZg+RpFR1Nsy+w== dependencies: - "tslib" "^2.4.0" + "@tanstack/query-persist-client-core" "4.15.1" + +"@tanstack/react-query@^4.14.5": + version "4.16.1" + resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-4.16.1.tgz#077006b8eb2c87fbe8d1597c1a0083a2d218b791" + integrity sha512-PDE9u49wSDykPazlCoLFevUpceLjQ0Mm8i6038HgtTEKb/aoVnUZdlUP7C392ds3Cd75+EGlHU7qpEX06R7d9Q== + dependencies: + "@tanstack/query-core" "4.15.1" + use-sync-external-store "^1.2.0" "@types/big.js@^6.1.6": - "integrity" "sha512-0r9J+Zz9rYm2hOTwiMAVkm3XFQ4u5uTK37xrQMhc9bysn/sf/okzovWMYYIBMFTn/yrEZ11pusgLEaoarTlQbA==" - "resolved" "https://registry.npmjs.org/@types/big.js/-/big.js-6.1.6.tgz" - "version" "6.1.6" + version "6.1.6" + resolved "https://registry.npmjs.org/@types/big.js/-/big.js-6.1.6.tgz" + integrity sha512-0r9J+Zz9rYm2hOTwiMAVkm3XFQ4u5uTK37xrQMhc9bysn/sf/okzovWMYYIBMFTn/yrEZ11pusgLEaoarTlQbA== + +"@types/bn.js@^4.11.3": + version "4.11.6" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" + integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== + dependencies: + "@types/node" "*" + +"@types/connect@^3.4.33": + version "3.4.35" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" + integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + dependencies: + "@types/node" "*" "@types/lodash.mergewith@4.6.6": - "integrity" "sha512-RY/8IaVENjG19rxTZu9Nukqh0W2UrYgmBj5sdns4hWRZaV8PqR7wIKHFKzvOTjo4zVRV7sVI+yFhAJql12Kfqg==" - "resolved" "https://registry.npmjs.org/@types/lodash.mergewith/-/lodash.mergewith-4.6.6.tgz" - "version" "4.6.6" + version "4.6.6" + resolved "https://registry.npmjs.org/@types/lodash.mergewith/-/lodash.mergewith-4.6.6.tgz" + integrity sha512-RY/8IaVENjG19rxTZu9Nukqh0W2UrYgmBj5sdns4hWRZaV8PqR7wIKHFKzvOTjo4zVRV7sVI+yFhAJql12Kfqg== dependencies: "@types/lodash" "*" "@types/lodash@*": - "integrity" "sha512-eHcVlLXP0c2FlMPm56ITode2AgLMSa6aJ05JTTbYbI+7EMkCEE5qk2E41d5g2lCVTqRe0GnnRFurmlCsDODrPw==" - "resolved" "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.186.tgz" - "version" "4.14.186" + version "4.14.186" + resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.186.tgz" + integrity sha512-eHcVlLXP0c2FlMPm56ITode2AgLMSa6aJ05JTTbYbI+7EMkCEE5qk2E41d5g2lCVTqRe0GnnRFurmlCsDODrPw== + +"@types/node@*": + version "18.11.9" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.9.tgz#02d013de7058cea16d36168ef2fc653464cfbad4" + integrity sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg== + +"@types/node@^12.12.54": + version "12.20.55" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" + integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== "@types/node@^18.0.0": - "integrity" "sha512-LhFTglglr63mNXUSRYD8A+ZAIu5sFqNJ4Y2fPuY7UlrySJH87rRRlhtVmMHplmfk5WkoJGmDjE9oiTfyX94CpQ==" - "resolved" "https://registry.npmjs.org/@types/node/-/node-18.11.7.tgz" - "version" "18.11.7" + version "18.11.7" + resolved "https://registry.npmjs.org/@types/node/-/node-18.11.7.tgz" + integrity sha512-LhFTglglr63mNXUSRYD8A+ZAIu5sFqNJ4Y2fPuY7UlrySJH87rRRlhtVmMHplmfk5WkoJGmDjE9oiTfyX94CpQ== "@types/parse-json@^4.0.0": - "integrity" "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" - "resolved" "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz" - "version" "4.0.0" + version "4.0.0" + resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + +"@types/pbkdf2@^3.0.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.0.tgz#039a0e9b67da0cdc4ee5dab865caa6b267bb66b1" + integrity sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ== + dependencies: + "@types/node" "*" "@types/prop-types@*": - "integrity" "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" - "resolved" "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz" - "version" "15.7.5" + version "15.7.5" + resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz" + integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== "@types/react-dom@^18.0.0": - "integrity" "sha512-C3GYO0HLaOkk9dDAz3Dl4sbe4AKUGTCfFIZsz3n/82dPNN8Du533HzKatDxeUYWu24wJgMP1xICqkWk1YOLOIw==" - "resolved" "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.8.tgz" - "version" "18.0.8" + version "18.0.8" + resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.8.tgz" + integrity sha512-C3GYO0HLaOkk9dDAz3Dl4sbe4AKUGTCfFIZsz3n/82dPNN8Du533HzKatDxeUYWu24wJgMP1xICqkWk1YOLOIw== dependencies: "@types/react" "*" -"@types/react@*", "@types/react@^16.8.0 || ^17.0.0 || ^18.0.0", "@types/react@^16.9.0 || ^17.0.0 || ^18.0.0", "@types/react@^18.0.0": - "integrity" "sha512-wRJWT6ouziGUy+9uX0aW4YOJxAY0bG6/AOk5AW5QSvZqI7dk6VBIbXvcVgIw/W5Jrl24f77df98GEKTJGOLx7Q==" - "resolved" "https://registry.npmjs.org/@types/react/-/react-18.0.24.tgz" - "version" "18.0.24" +"@types/react@*", "@types/react@^18.0.0": + version "18.0.24" + resolved "https://registry.npmjs.org/@types/react/-/react-18.0.24.tgz" + integrity sha512-wRJWT6ouziGUy+9uX0aW4YOJxAY0bG6/AOk5AW5QSvZqI7dk6VBIbXvcVgIw/W5Jrl24f77df98GEKTJGOLx7Q== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" - "csstype" "^3.0.2" + csstype "^3.0.2" "@types/scheduler@*": - "integrity" "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" - "resolved" "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz" - "version" "0.16.2" + version "0.16.2" + resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz" + integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== + +"@types/secp256k1@^4.0.1": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.3.tgz#1b8e55d8e00f08ee7220b4d59a6abe89c37a901c" + integrity sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w== + dependencies: + "@types/node" "*" + +"@types/ws@^7.4.4": + version "7.4.7" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.7.tgz#f7c390a36f7a0679aa69de2d501319f4f8d9b702" + integrity sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww== + dependencies: + "@types/node" "*" + +"@wagmi/core@0.7.3": + version "0.7.3" + resolved "https://registry.yarnpkg.com/@wagmi/core/-/core-0.7.3.tgz#e61d582d5968d0b2ec97c8727903b3cb7d5fe847" + integrity sha512-gXbIsDR+FfrjBckhu0j9FoJhP5faXqiUpsKP22M9cbN4g1ZDdXsOUCkaWJbcoGicIxTd0oMcsxCyqC4c3ue2AA== + dependencies: + abitype "^0.1.8" + eventemitter3 "^4.0.7" + zustand "^4.1.4" + +"@walletconnect/browser-utils@^1.8.0": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@walletconnect/browser-utils/-/browser-utils-1.8.0.tgz#33c10e777aa6be86c713095b5206d63d32df0951" + integrity sha512-Wcqqx+wjxIo9fv6eBUFHPsW1y/bGWWRboni5dfD8PtOmrihrEpOCmvRJe4rfl7xgJW8Ea9UqKEaq0bIRLHlK4A== + dependencies: + "@walletconnect/safe-json" "1.0.0" + "@walletconnect/types" "^1.8.0" + "@walletconnect/window-getters" "1.0.0" + "@walletconnect/window-metadata" "1.0.0" + detect-browser "5.2.0" + +"@walletconnect/client@^1.8.0": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@walletconnect/client/-/client-1.8.0.tgz#6f46b5499c7c861c651ff1ebe5da5b66225ca696" + integrity sha512-svyBQ14NHx6Cs2j4TpkQaBI/2AF4+LXz64FojTjMtV4VMMhl81jSO1vNeg+yYhQzvjcGH/GpSwixjyCW0xFBOQ== + dependencies: + "@walletconnect/core" "^1.8.0" + "@walletconnect/iso-crypto" "^1.8.0" + "@walletconnect/types" "^1.8.0" + "@walletconnect/utils" "^1.8.0" + +"@walletconnect/core@^1.8.0": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@walletconnect/core/-/core-1.8.0.tgz#6b2748b90c999d9d6a70e52e26a8d5e8bfeaa81e" + integrity sha512-aFTHvEEbXcZ8XdWBw6rpQDte41Rxwnuk3SgTD8/iKGSRTni50gI9S3YEzMj05jozSiOBxQci4pJDMVhIUMtarw== + dependencies: + "@walletconnect/socket-transport" "^1.8.0" + "@walletconnect/types" "^1.8.0" + "@walletconnect/utils" "^1.8.0" + +"@walletconnect/crypto@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@walletconnect/crypto/-/crypto-1.0.2.tgz#3fcc2b2cde6f529a19eadd883dc555cd0e861992" + integrity sha512-+OlNtwieUqVcOpFTvLBvH+9J9pntEqH5evpINHfVxff1XIgwV55PpbdvkHu6r9Ib4WQDOFiD8OeeXs1vHw7xKQ== + dependencies: + "@walletconnect/encoding" "^1.0.1" + "@walletconnect/environment" "^1.0.0" + "@walletconnect/randombytes" "^1.0.2" + aes-js "^3.1.2" + hash.js "^1.1.7" + +"@walletconnect/encoding@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@walletconnect/encoding/-/encoding-1.0.1.tgz#93c18ce9478c3d5283dbb88c41eb2864b575269a" + integrity sha512-8opL2rs6N6E3tJfsqwS82aZQDL3gmupWUgmvuZ3CGU7z/InZs3R9jkzH8wmYtpbq0sFK3WkJkQRZFFk4BkrmFA== + dependencies: + is-typedarray "1.0.0" + typedarray-to-buffer "3.1.5" + +"@walletconnect/environment@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@walletconnect/environment/-/environment-1.0.0.tgz#c4545869fa9c389ec88c364e1a5f8178e8ab5034" + integrity sha512-4BwqyWy6KpSvkocSaV7WR3BlZfrxLbJSLkg+j7Gl6pTDE+U55lLhJvQaMuDVazXYxcjBsG09k7UlH7cGiUI5vQ== + +"@walletconnect/ethereum-provider@^1.8.0": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@walletconnect/ethereum-provider/-/ethereum-provider-1.8.0.tgz#ed1dbf9cecc3b818758a060d2f9017c50bde1d32" + integrity sha512-Nq9m+oo5P0F+njsROHw9KMWdoc/8iGHYzQdkjJN/1C7DtsqFRg5k5a3hd9rzCLpbPsOC1q8Z5lRs6JQgDvPm6Q== + dependencies: + "@walletconnect/client" "^1.8.0" + "@walletconnect/jsonrpc-http-connection" "^1.0.2" + "@walletconnect/jsonrpc-provider" "^1.0.5" + "@walletconnect/signer-connection" "^1.8.0" + "@walletconnect/types" "^1.8.0" + "@walletconnect/utils" "^1.8.0" + eip1193-provider "1.0.1" + eventemitter3 "4.0.7" + +"@walletconnect/iso-crypto@^1.8.0": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@walletconnect/iso-crypto/-/iso-crypto-1.8.0.tgz#44ddf337c4f02837c062dbe33fa7ab36789df451" + integrity sha512-pWy19KCyitpfXb70hA73r9FcvklS+FvO9QUIttp3c2mfW8frxgYeRXfxLRCIQTkaYueRKvdqPjbyhPLam508XQ== + dependencies: + "@walletconnect/crypto" "^1.0.2" + "@walletconnect/types" "^1.8.0" + "@walletconnect/utils" "^1.8.0" + +"@walletconnect/jsonrpc-http-connection@^1.0.2": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-http-connection/-/jsonrpc-http-connection-1.0.3.tgz#0343811bb33fb8a3823cb3306b306cf2ed61e99a" + integrity sha512-npPvDG2JxyxoqOphDiyjp5pPeASRBrlfQS39wHESPHlFIjBuvNt9lV9teh53MK9Ncbyxh4y2qEKMfPgcUulTRg== + dependencies: + "@walletconnect/jsonrpc-utils" "^1.0.3" + "@walletconnect/safe-json" "^1.0.0" + cross-fetch "^3.1.4" + +"@walletconnect/jsonrpc-provider@^1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-provider/-/jsonrpc-provider-1.0.5.tgz#1a66053b6f083a9885a32b7c2c8f6a376f1a4458" + integrity sha512-v61u4ZIV8+p9uIHS2Kl2YRj/2idrQiHcrbrJXw3McQkEJtj9mkCofr1Hu/n419wSRM5uiNK8Z4WRS9zGTTAhWQ== + dependencies: + "@walletconnect/jsonrpc-utils" "^1.0.3" + "@walletconnect/safe-json" "^1.0.0" + +"@walletconnect/jsonrpc-types@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-types/-/jsonrpc-types-1.0.1.tgz#a96b4bb2bcc8838a70e06f15c1b5ab11c47d8e95" + integrity sha512-+6coTtOuChCqM+AoYyi4Q83p9l/laI6NvuM2/AHaZFuf0gT0NjW7IX2+86qGyizn7Ptq4AYZmfxurAxTnhefuw== + dependencies: + keyvaluestorage-interface "^1.0.0" + +"@walletconnect/jsonrpc-utils@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.3.tgz#5bd49865eef0eae48e8b45a06731dc18691cf8c7" + integrity sha512-3yb49bPk16MNLk6uIIHPSHQCpD6UAo1OMOx1rM8cW/MPEAYAzrSW5hkhG7NEUwX9SokRIgnZK3QuQkiyNzBMhQ== + dependencies: + "@walletconnect/environment" "^1.0.0" + "@walletconnect/jsonrpc-types" "^1.0.1" + +"@walletconnect/mobile-registry@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@walletconnect/mobile-registry/-/mobile-registry-1.4.0.tgz#502cf8ab87330841d794819081e748ebdef7aee5" + integrity sha512-ZtKRio4uCZ1JUF7LIdecmZt7FOLnX72RPSY7aUVu7mj7CSfxDwUn6gBuK6WGtH+NZCldBqDl5DenI5fFSvkKYw== + +"@walletconnect/qrcode-modal@^1.8.0": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@walletconnect/qrcode-modal/-/qrcode-modal-1.8.0.tgz#ddd6f5c9b7ee52c16adf9aacec2a3eac4994caea" + integrity sha512-BueaFefaAi8mawE45eUtztg3ZFbsAH4DDXh1UNwdUlsvFMjqcYzLUG0xZvDd6z2eOpbgDg2N3bl6gF0KONj1dg== + dependencies: + "@walletconnect/browser-utils" "^1.8.0" + "@walletconnect/mobile-registry" "^1.4.0" + "@walletconnect/types" "^1.8.0" + copy-to-clipboard "^3.3.1" + preact "10.4.1" + qrcode "1.4.4" + +"@walletconnect/randombytes@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@walletconnect/randombytes/-/randombytes-1.0.2.tgz#95c644251a15e6675f58fbffc9513a01486da49c" + integrity sha512-ivgOtAyqQnN0rLQmOFPemsgYGysd/ooLfaDA/ACQ3cyqlca56t3rZc7pXfqJOIETx/wSyoF5XbwL+BqYodw27A== + dependencies: + "@walletconnect/encoding" "^1.0.1" + "@walletconnect/environment" "^1.0.0" + randombytes "^2.1.0" + +"@walletconnect/safe-json@1.0.0", "@walletconnect/safe-json@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@walletconnect/safe-json/-/safe-json-1.0.0.tgz#12eeb11d43795199c045fafde97e3c91646683b2" + integrity sha512-QJzp/S/86sUAgWY6eh5MKYmSfZaRpIlmCJdi5uG4DJlKkZrHEF7ye7gA+VtbVzvTtpM/gRwO2plQuiooIeXjfg== + +"@walletconnect/signer-connection@^1.8.0": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@walletconnect/signer-connection/-/signer-connection-1.8.0.tgz#6cdf490df770e504cc1a550bdb5bac7696b130bc" + integrity sha512-+YAaTAP52MWZJ2wWnqKClKCPlPHBo6reURFe0cWidLADh9mi/kPWGALZ5AENK22zpem1bbKV466rF5Rzvu0ehA== + dependencies: + "@walletconnect/client" "^1.8.0" + "@walletconnect/jsonrpc-types" "^1.0.1" + "@walletconnect/jsonrpc-utils" "^1.0.3" + "@walletconnect/qrcode-modal" "^1.8.0" + "@walletconnect/types" "^1.8.0" + eventemitter3 "4.0.7" + +"@walletconnect/socket-transport@^1.8.0": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@walletconnect/socket-transport/-/socket-transport-1.8.0.tgz#9a1128a249628a0be11a0979b522fe82b44afa1b" + integrity sha512-5DyIyWrzHXTcVp0Vd93zJ5XMW61iDM6bcWT4p8DTRfFsOtW46JquruMhxOLeCOieM4D73kcr3U7WtyR4JUsGuQ== + dependencies: + "@walletconnect/types" "^1.8.0" + "@walletconnect/utils" "^1.8.0" + ws "7.5.3" + +"@walletconnect/types@^1.8.0": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@walletconnect/types/-/types-1.8.0.tgz#3f5e85b2d6b149337f727ab8a71b8471d8d9a195" + integrity sha512-Cn+3I0V0vT9ghMuzh1KzZvCkiAxTq+1TR2eSqw5E5AVWfmCtECFkVZBP6uUJZ8YjwLqXheI+rnjqPy7sVM4Fyg== + +"@walletconnect/utils@^1.8.0": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@walletconnect/utils/-/utils-1.8.0.tgz#2591a197c1fa7429941fe428876088fda6632060" + integrity sha512-zExzp8Mj1YiAIBfKNm5u622oNw44WOESzo6hj+Q3apSMIb0Jph9X3GDIdbZmvVZsNPxWDL7uodKgZcCInZv2vA== + dependencies: + "@walletconnect/browser-utils" "^1.8.0" + "@walletconnect/encoding" "^1.0.1" + "@walletconnect/jsonrpc-utils" "^1.0.3" + "@walletconnect/types" "^1.8.0" + bn.js "4.11.8" + js-sha3 "0.8.0" + query-string "6.13.5" + +"@walletconnect/window-getters@1.0.0", "@walletconnect/window-getters@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@walletconnect/window-getters/-/window-getters-1.0.0.tgz#1053224f77e725dfd611c83931b5f6c98c32bfc8" + integrity sha512-xB0SQsLaleIYIkSsl43vm8EwETpBzJ2gnzk7e0wMF3ktqiTGS6TFHxcprMl5R44KKh4tCcHCJwolMCaDSwtAaA== + +"@walletconnect/window-metadata@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@walletconnect/window-metadata/-/window-metadata-1.0.0.tgz#93b1cc685e6b9b202f29c26be550fde97800c4e5" + integrity sha512-9eFvmJxIKCC3YWOL97SgRkKhlyGXkrHwamfechmqszbypFspaSk+t2jQXAEU7YClHF6Qjw5eYOmy1//zFi9/GA== + dependencies: + "@walletconnect/window-getters" "^1.0.0" "@zag-js/element-size@0.1.0": - "integrity" "sha512-QF8wp0+V8++z+FHXiIw93+zudtubYszOtYbNgK39fg3pi+nCZtuSm4L1jC5QZMatNZ83MfOzyNCfgUubapagJQ==" - "resolved" "https://registry.npmjs.org/@zag-js/element-size/-/element-size-0.1.0.tgz" - "version" "0.1.0" + version "0.1.0" + resolved "https://registry.npmjs.org/@zag-js/element-size/-/element-size-0.1.0.tgz" + integrity sha512-QF8wp0+V8++z+FHXiIw93+zudtubYszOtYbNgK39fg3pi+nCZtuSm4L1jC5QZMatNZ83MfOzyNCfgUubapagJQ== "@zag-js/focus-visible@0.1.0": - "integrity" "sha512-PeaBcTmdZWcFf7n1aM+oiOdZc+sy14qi0emPIeUuGMTjbP0xLGrZu43kdpHnWSXy7/r4Ubp/vlg50MCV8+9Isg==" - "resolved" "https://registry.npmjs.org/@zag-js/focus-visible/-/focus-visible-0.1.0.tgz" - "version" "0.1.0" + version "0.1.0" + resolved "https://registry.npmjs.org/@zag-js/focus-visible/-/focus-visible-0.1.0.tgz" + integrity sha512-PeaBcTmdZWcFf7n1aM+oiOdZc+sy14qi0emPIeUuGMTjbP0xLGrZu43kdpHnWSXy7/r4Ubp/vlg50MCV8+9Isg== -"aes-js@3.0.0": - "integrity" "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==" - "resolved" "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz" - "version" "3.0.0" +JSONStream@^1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" + integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" -"ansi-styles@^3.2.1": - "integrity" "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==" - "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" - "version" "3.2.1" +abitype@^0.1.7, abitype@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/abitype/-/abitype-0.1.8.tgz#f47d397b95d81a445a0d0ef2fdd7827131b3fd74" + integrity sha512-2pde0KepTzdfu19ZrzYTYVIWo69+6UbBCY4B1RDiwWgo2XZtFSJhF6C+XThuRXbbZ823J0Rw1Y5cP0NXYVcCdQ== + +aes-js@3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz" + integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== + +aes-js@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.1.2.tgz#db9aabde85d5caabbfc0d4f2a4446960f627146a" + integrity sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ== + +ansi-regex@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" + integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: - "color-convert" "^1.9.0" + color-convert "^1.9.0" -"aria-hidden@^1.1.1": - "integrity" "sha512-PN344VAf9j1EAi+jyVHOJ8XidQdPVssGco39eNcsGdM4wcsILtxrKLkbuiMfLWYROK1FjRQasMWCBttrhjnr6A==" - "resolved" "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.1.tgz" - "version" "1.2.1" +aria-hidden@^1.1.1: + version "1.2.1" + resolved "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.1.tgz" + integrity sha512-PN344VAf9j1EAi+jyVHOJ8XidQdPVssGco39eNcsGdM4wcsILtxrKLkbuiMfLWYROK1FjRQasMWCBttrhjnr6A== dependencies: - "tslib" "^2.0.0" + tslib "^2.0.0" -"asynckit@^0.4.0": - "integrity" "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - "resolved" "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" - "version" "0.4.0" +async-mutex@^0.2.6: + version "0.2.6" + resolved "https://registry.yarnpkg.com/async-mutex/-/async-mutex-0.2.6.tgz#0d7a3deb978bc2b984d5908a2038e1ae2e54ff40" + integrity sha512-Hs4R+4SPgamu6rSGW8C7cV9gaWUKEHykfzCCvIRuaVv636Ju10ZdeUbvb4TBEW0INuq2DHZqXbK4Nd3yG4RaRw== + dependencies: + tslib "^2.0.0" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== -"axios@^0.26.1": - "integrity" "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==" - "resolved" "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz" - "version" "0.26.1" +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + +axios@^0.21.0: + version "0.21.4" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" + integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== dependencies: - "follow-redirects" "^1.14.8" + follow-redirects "^1.14.0" -"axios@^1.1.3": - "integrity" "sha512-00tXVRwKx/FZr/IDVFt4C+f9FYairX517WoGCL6dpOntqLkZofjhu43F/Xl44UOpqa+9sLFDrG/XAnFsUYgkDA==" - "resolved" "https://registry.npmjs.org/axios/-/axios-1.1.3.tgz" - "version" "1.1.3" +axios@^0.26.1: + version "0.26.1" + resolved "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz" + integrity sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA== dependencies: - "follow-redirects" "^1.15.0" - "form-data" "^4.0.0" - "proxy-from-env" "^1.1.0" + follow-redirects "^1.14.8" -"babel-plugin-macros@^3.1.0": - "integrity" "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==" - "resolved" "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz" - "version" "3.1.0" +axios@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/axios/-/axios-1.1.3.tgz" + integrity sha512-00tXVRwKx/FZr/IDVFt4C+f9FYairX517WoGCL6dpOntqLkZofjhu43F/Xl44UOpqa+9sLFDrG/XAnFsUYgkDA== + dependencies: + follow-redirects "^1.15.0" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + +babel-plugin-macros@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz" + integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== dependencies: "@babel/runtime" "^7.12.5" - "cosmiconfig" "^7.0.0" - "resolve" "^1.19.0" - -"bech32@1.1.4": - "integrity" "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" - "resolved" "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz" - "version" "1.1.4" - -"big.js@^6.2.1": - "integrity" "sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ==" - "resolved" "https://registry.npmjs.org/big.js/-/big.js-6.2.1.tgz" - "version" "6.2.1" - -"bignumber.js@^9.0.1": - "integrity" "sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==" - "resolved" "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.0.tgz" - "version" "9.1.0" - -"bn.js@^4.11.9": - "integrity" "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - "resolved" "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" - "version" "4.12.0" - -"bn.js@^5.2.1": - "integrity" "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - "resolved" "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz" - "version" "5.2.1" - -"brorand@^1.1.0": - "integrity" "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" - "resolved" "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz" - "version" "1.1.0" - -"browserslist@^4.21.3", "browserslist@>= 4.21.0": - "integrity" "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==" - "resolved" "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz" - "version" "4.21.4" - dependencies: - "caniuse-lite" "^1.0.30001400" - "electron-to-chromium" "^1.4.251" - "node-releases" "^2.0.6" - "update-browserslist-db" "^1.0.9" - -"callsites@^3.0.0": - "integrity" "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - "resolved" "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" - "version" "3.1.0" - -"caniuse-lite@^1.0.30001400", "caniuse-lite@^1.0.30001406": - "integrity" "sha512-n7cosrHLl8AWt0wwZw/PJZgUg3lV0gk9LMI7ikGJwhyhgsd2Nb65vKvmSexCqq/J7rbH3mFG6yZZiPR5dLPW5A==" - "resolved" "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001426.tgz" - "version" "1.0.30001426" - -"chalk@^2.0.0": - "integrity" "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==" - "resolved" "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" - "version" "2.4.2" - dependencies: - "ansi-styles" "^3.2.1" - "escape-string-regexp" "^1.0.5" - "supports-color" "^5.3.0" - -"client-only@0.0.1": - "integrity" "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" - "resolved" "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz" - "version" "0.0.1" - -"color-convert@^1.9.0": - "integrity" "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==" - "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" - "version" "1.9.3" - dependencies: - "color-name" "1.1.3" - -"color-name@1.1.3": - "integrity" "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" - "version" "1.1.3" - -"combined-stream@^1.0.8": - "integrity" "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==" - "resolved" "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" - "version" "1.0.8" - dependencies: - "delayed-stream" "~1.0.0" - -"compute-scroll-into-view@1.0.14": - "integrity" "sha512-mKDjINe3tc6hGelUMNDzuhorIUZ7kS7BwyY0r2wQd2HOH2tRuJykiC06iSEX8y1TuhNzvz4GcJnK16mM2J1NMQ==" - "resolved" "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.14.tgz" - "version" "1.0.14" - -"convert-source-map@^1.5.0", "convert-source-map@^1.7.0": - "integrity" "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - "resolved" "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz" - "version" "1.9.0" - -"copy-to-clipboard@3.3.1": - "integrity" "sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw==" - "resolved" "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz" - "version" "3.3.1" - dependencies: - "toggle-selection" "^1.0.6" - -"cosmiconfig@^7.0.0": - "integrity" "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==" - "resolved" "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz" - "version" "7.0.1" + cosmiconfig "^7.0.0" + resolve "^1.19.0" + +babel-plugin-polyfill-corejs2@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz#5d1bd3836d0a19e1b84bbf2d9640ccb6f951c122" + integrity sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q== + dependencies: + "@babel/compat-data" "^7.17.7" + "@babel/helper-define-polyfill-provider" "^0.3.3" + semver "^6.1.1" + +babel-plugin-polyfill-corejs3@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz#56ad88237137eade485a71b52f72dbed57c6230a" + integrity sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.3" + core-js-compat "^3.25.1" + +babel-plugin-polyfill-regenerator@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz#390f91c38d90473592ed43351e801a9d3e0fd747" + integrity sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.3" + +base-x@^3.0.2: + version "3.0.9" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" + integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== + dependencies: + safe-buffer "^5.0.1" + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +bech32@1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz" + integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== + +big.js@^6.2.1: + version "6.2.1" + resolved "https://registry.npmjs.org/big.js/-/big.js-6.2.1.tgz" + integrity sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ== + +bigint-buffer@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/bigint-buffer/-/bigint-buffer-1.1.5.tgz#d038f31c8e4534c1f8d0015209bf34b4fa6dd442" + integrity sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA== + dependencies: + bindings "^1.3.0" + +bignumber.js@^9.0.1: + version "9.1.0" + resolved "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.0.tgz" + integrity sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A== + +bind-decorator@^1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/bind-decorator/-/bind-decorator-1.0.11.tgz#e41bc06a1f65dd9cec476c91c5daf3978488252f" + integrity sha512-yzkH0uog6Vv/vQ9+rhSKxecnqGUZHYncg7qS7voz3Q76+TAi1SGiOKk2mlOvusQnFz9Dc4BC/NMkeXu11YgjJg== + +bindings@^1.3.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +blakejs@^1.1.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" + integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== + +bn.js@4.11.8: + version "4.11.8" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" + integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== + +bn.js@^4.11.0, bn.js@^4.11.8, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^5.0.0, bn.js@^5.1.1, bn.js@^5.2.0, bn.js@^5.2.1: + version "5.2.1" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz" + integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== + +borsh@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/borsh/-/borsh-0.7.0.tgz#6e9560d719d86d90dc589bca60ffc8a6c51fec2a" + integrity sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA== + dependencies: + bn.js "^5.2.0" + bs58 "^4.0.0" + text-encoding-utf-8 "^1.0.2" + +brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz" + integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== + +browserify-aes@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserslist@^4.21.3, browserslist@^4.21.4: + version "4.21.4" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz" + integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== + dependencies: + caniuse-lite "^1.0.30001400" + electron-to-chromium "^1.4.251" + node-releases "^2.0.6" + update-browserslist-db "^1.0.9" + +bs58@^4.0.0, bs58@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" + integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== + dependencies: + base-x "^3.0.2" + +bs58check@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc" + integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== + dependencies: + bs58 "^4.0.0" + create-hash "^1.1.0" + safe-buffer "^5.1.2" + +btoa@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/btoa/-/btoa-1.2.1.tgz#01a9909f8b2c93f6bf680ba26131eb30f7fa3d73" + integrity sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g== + +buffer-alloc-unsafe@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" + integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== + +buffer-alloc@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" + integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== + dependencies: + buffer-alloc-unsafe "^1.1.0" + buffer-fill "^1.0.0" + +buffer-fill@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" + integrity sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ== + +buffer-from@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== + +buffer@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.1.tgz#3cbea8c1463e5a0779e30b66d4c88c6ffa182ac2" + integrity sha512-rVAXBwEcEoYtxnHSO5iWyhzV/O1WMtkUYWlfdLS7FjU4PnSJJHEfHXi/uHPI5EwltmOA794gN3bm3/pzuctWjQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + +buffer@^5.4.3: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +buffer@^6.0.3, buffer@~6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + +bufferutil@^4.0.1: + version "4.0.7" + resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.7.tgz#60c0d19ba2c992dd8273d3f73772ffc894c153ad" + integrity sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw== + dependencies: + node-gyp-build "^4.3.0" + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^5.0.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +caniuse-lite@^1.0.30001400, caniuse-lite@^1.0.30001406: + version "1.0.30001426" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001426.tgz" + integrity sha512-n7cosrHLl8AWt0wwZw/PJZgUg3lV0gk9LMI7ikGJwhyhgsd2Nb65vKvmSexCqq/J7rbH3mFG6yZZiPR5dLPW5A== + +chalk@^2.0.0: + version "2.4.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +client-only@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz" + integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== + +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +clone@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" + integrity sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w== + +clsx@^1.1.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" + integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^2.20.3: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +compute-scroll-into-view@1.0.14: + version "1.0.14" + resolved "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.14.tgz" + integrity sha512-mKDjINe3tc6hGelUMNDzuhorIUZ7kS7BwyY0r2wQd2HOH2tRuJykiC06iSEX8y1TuhNzvz4GcJnK16mM2J1NMQ== + +convert-source-map@^1.5.0: + version "1.9.0" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + +copy-to-clipboard@3.3.1: + version "3.3.1" + resolved "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz" + integrity sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw== + dependencies: + toggle-selection "^1.0.6" + +copy-to-clipboard@^3.3.1: + version "3.3.3" + resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz#55ac43a1db8ae639a4bd99511c148cdd1b83a1b0" + integrity sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA== + dependencies: + toggle-selection "^1.0.6" + +core-js-compat@^3.25.1: + version "3.26.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.26.1.tgz#0e710b09ebf689d719545ac36e49041850f943df" + integrity sha512-622/KzTudvXCDLRw70iHW4KKs1aGpcRcowGWyYJr2DEBfRrd6hNJybxSWJFuZYD4ma86xhrwDDHxmDaIq4EA8A== + dependencies: + browserslist "^4.21.4" + +cosmiconfig@^7.0.0: + version "7.0.1" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz" + integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== dependencies: "@types/parse-json" "^4.0.0" - "import-fresh" "^3.2.1" - "parse-json" "^5.0.0" - "path-type" "^4.0.0" - "yaml" "^1.10.0" - -"css-box-model@1.2.1": - "integrity" "sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==" - "resolved" "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz" - "version" "1.2.1" - dependencies: - "tiny-invariant" "^1.0.6" - -"csstype@^3.0.11", "csstype@^3.0.2": - "integrity" "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" - "resolved" "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz" - "version" "3.1.1" - -"debug@^4.1.0": - "integrity" "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==" - "resolved" "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" - "version" "4.3.4" - dependencies: - "ms" "2.1.2" - -"delayed-stream@~1.0.0": - "integrity" "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" - "resolved" "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" - "version" "1.0.0" - -"detect-node-es@^1.1.0": - "integrity" "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" - "resolved" "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz" - "version" "1.1.0" - -"dotenv@^16.0.3": - "integrity" "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==" - "resolved" "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz" - "version" "16.0.3" - -"electron-to-chromium@^1.4.251": - "integrity" "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==" - "resolved" "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz" - "version" "1.4.284" - -"elliptic@^6.5.4", "elliptic@6.5.4": - "integrity" "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==" - "resolved" "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz" - "version" "6.5.4" - dependencies: - "bn.js" "^4.11.9" - "brorand" "^1.1.0" - "hash.js" "^1.0.0" - "hmac-drbg" "^1.0.1" - "inherits" "^2.0.4" - "minimalistic-assert" "^1.0.1" - "minimalistic-crypto-utils" "^1.0.1" - -"enhanced-resolve@^5.10.0": - "integrity" "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==" - "resolved" "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz" - "version" "5.10.0" - dependencies: - "graceful-fs" "^4.2.4" - "tapable" "^2.2.0" - -"error-ex@^1.3.1": - "integrity" "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==" - "resolved" "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" - "version" "1.3.2" - dependencies: - "is-arrayish" "^0.2.1" - -"escalade@^3.1.1": - "integrity" "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" - "resolved" "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" - "version" "3.1.1" - -"escape-string-regexp@^1.0.5": - "integrity" "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" - "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" - "version" "1.0.5" - -"escape-string-regexp@^4.0.0": - "integrity" "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" - "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" - "version" "4.0.0" - -"ethers@^5.4.4": - "integrity" "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==" - "resolved" "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz" - "version" "5.7.2" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +cross-fetch@^3.1.4: + version "3.1.5" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" + integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== + dependencies: + node-fetch "2.6.7" + +css-box-model@1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz" + integrity sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw== + dependencies: + tiny-invariant "^1.0.6" + +csstype@^3.0.11, csstype@^3.0.2: + version "3.1.1" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz" + integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw== + +debug@^4.1.1: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og== + +delay@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/delay/-/delay-5.0.0.tgz#137045ef1b96e5071060dd5be60bf9334436bd1d" + integrity sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw== + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +detect-browser@5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/detect-browser/-/detect-browser-5.2.0.tgz#c9cd5afa96a6a19fda0bbe9e9be48a6b6e1e9c97" + integrity sha512-tr7XntDAu50BVENgQfajMLzacmSe34D+qZc4zjnniz0ZVuw/TZcLcyxHQjYpJTM36sGEkZZlYLnIM1hH7alTMA== + +detect-node-es@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz" + integrity sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ== + +dijkstrajs@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/dijkstrajs/-/dijkstrajs-1.0.2.tgz#2e48c0d3b825462afe75ab4ad5e829c8ece36257" + integrity sha512-QV6PMaHTCNmKSeP6QoXhVTw9snc9VD8MulTT0Bd99Pacp4SS1cjcrYPgBPmibqKVtMJJfqC6XvOXgPMEEPH/fg== + +dotenv@^16.0.3: + version "16.0.3" + resolved "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz" + integrity sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ== + +eip1193-provider@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/eip1193-provider/-/eip1193-provider-1.0.1.tgz#420d29cf4f6c443e3f32e718fb16fafb250637c3" + integrity sha512-kSuqwQ26d7CzuS/t3yRXo2Su2cVH0QfvyKbr2H7Be7O5YDyIq4hQGCNTo5wRdP07bt+E2R/8nPCzey4ojBHf7g== + dependencies: + "@json-rpc-tools/provider" "^1.5.5" + +electron-to-chromium@^1.4.251: + version "1.4.284" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz" + integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== + +elliptic@6.5.4, elliptic@^6.5.2, elliptic@^6.5.4: + version "6.5.4" + resolved "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +enhanced-resolve@^5.10.0: + version "5.10.0" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz" + integrity sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es6-promise@^4.0.3: + version "4.2.8" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + +es6-promisify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + integrity sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ== + dependencies: + es6-promise "^4.0.3" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eth-block-tracker@4.4.3: + version "4.4.3" + resolved "https://registry.yarnpkg.com/eth-block-tracker/-/eth-block-tracker-4.4.3.tgz#766a0a0eb4a52c867a28328e9ae21353812cf626" + integrity sha512-A8tG4Z4iNg4mw5tP1Vung9N9IjgMNqpiMoJ/FouSFwNCGHv2X0mmOYwtQOJzki6XN7r7Tyo01S29p7b224I4jw== + dependencies: + "@babel/plugin-transform-runtime" "^7.5.5" + "@babel/runtime" "^7.5.5" + eth-query "^2.1.0" + json-rpc-random-id "^1.0.1" + pify "^3.0.0" + safe-event-emitter "^1.0.1" + +eth-json-rpc-filters@4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/eth-json-rpc-filters/-/eth-json-rpc-filters-4.2.2.tgz#eb35e1dfe9357ace8a8908e7daee80b2cd60a10d" + integrity sha512-DGtqpLU7bBg63wPMWg1sCpkKCf57dJ+hj/k3zF26anXMzkmtSBDExL8IhUu7LUd34f0Zsce3PYNO2vV2GaTzaw== + dependencies: + "@metamask/safe-event-emitter" "^2.0.0" + async-mutex "^0.2.6" + eth-json-rpc-middleware "^6.0.0" + eth-query "^2.1.2" + json-rpc-engine "^6.1.0" + pify "^5.0.0" + +eth-json-rpc-middleware@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/eth-json-rpc-middleware/-/eth-json-rpc-middleware-6.0.0.tgz#4fe16928b34231a2537856f08a5ebbc3d0c31175" + integrity sha512-qqBfLU2Uq1Ou15Wox1s+NX05S9OcAEL4JZ04VZox2NS0U+RtCMjSxzXhLFWekdShUPZ+P8ax3zCO2xcPrp6XJQ== + dependencies: + btoa "^1.2.1" + clone "^2.1.1" + eth-query "^2.1.2" + eth-rpc-errors "^3.0.0" + eth-sig-util "^1.4.2" + ethereumjs-util "^5.1.2" + json-rpc-engine "^5.3.0" + json-stable-stringify "^1.0.1" + node-fetch "^2.6.1" + pify "^3.0.0" + safe-event-emitter "^1.0.1" + +eth-query@^2.1.0, eth-query@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/eth-query/-/eth-query-2.1.2.tgz#d6741d9000106b51510c72db92d6365456a6da5e" + integrity sha512-srES0ZcvwkR/wd5OQBRA1bIJMww1skfGS0s8wlwK3/oNP4+wnds60krvu5R1QbpRQjMmpG5OMIWro5s7gvDPsA== + dependencies: + json-rpc-random-id "^1.0.0" + xtend "^4.0.1" + +eth-rpc-errors@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/eth-rpc-errors/-/eth-rpc-errors-4.0.2.tgz#11bc164e25237a679061ac05b7da7537b673d3b7" + integrity sha512-n+Re6Gu8XGyfFy1it0AwbD1x0MUzspQs0D5UiPs1fFPCr6WAwZM+vbIhXheBFrpgosqN9bs5PqlB4Q61U/QytQ== + dependencies: + fast-safe-stringify "^2.0.6" + +eth-rpc-errors@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eth-rpc-errors/-/eth-rpc-errors-3.0.0.tgz#d7b22653c70dbf9defd4ef490fd08fe70608ca10" + integrity sha512-iPPNHPrLwUlR9xCSYm7HHQjWBasor3+KZfRvwEWxMz3ca0yqnlBeJrnyphkGIXZ4J7AMAaOLmwy4AWhnxOiLxg== + dependencies: + fast-safe-stringify "^2.0.6" + +eth-rpc-errors@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/eth-rpc-errors/-/eth-rpc-errors-4.0.3.tgz#6ddb6190a4bf360afda82790bb7d9d5e724f423a" + integrity sha512-Z3ymjopaoft7JDoxZcEb3pwdGh7yiYMhOwm2doUt6ASXlMavpNlK6Cre0+IMl2VSGyEU9rkiperQhp5iRxn5Pg== + dependencies: + fast-safe-stringify "^2.0.6" + +eth-sig-util@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-1.4.2.tgz#8d958202c7edbaae839707fba6f09ff327606210" + integrity sha512-iNZ576iTOGcfllftB73cPB5AN+XUQAT/T8xzsILsghXC1o8gJUqe3RHlcDqagu+biFpYQ61KQrZZJza8eRSYqw== + dependencies: + ethereumjs-abi "git+https://github.com/ethereumjs/ethereumjs-abi.git" + ethereumjs-util "^5.1.1" + +ethereum-cryptography@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" + integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== + dependencies: + "@types/pbkdf2" "^3.0.0" + "@types/secp256k1" "^4.0.1" + blakejs "^1.1.0" + browserify-aes "^1.2.0" + bs58check "^2.1.2" + create-hash "^1.2.0" + create-hmac "^1.1.7" + hash.js "^1.1.7" + keccak "^3.0.0" + pbkdf2 "^3.0.17" + randombytes "^2.1.0" + safe-buffer "^5.1.2" + scrypt-js "^3.0.0" + secp256k1 "^4.0.1" + setimmediate "^1.0.5" + +"ethereumjs-abi@git+https://github.com/ethereumjs/ethereumjs-abi.git": + version "0.6.8" + resolved "git+https://github.com/ethereumjs/ethereumjs-abi.git#ee3994657fa7a427238e6ba92a84d0b529bbcde0" + dependencies: + bn.js "^4.11.8" + ethereumjs-util "^6.0.0" + +ethereumjs-util@^5.1.1, ethereumjs-util@^5.1.2: + version "5.2.1" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz#a833f0e5fca7e5b361384dc76301a721f537bf65" + integrity sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ== + dependencies: + bn.js "^4.11.0" + create-hash "^1.1.2" + elliptic "^6.5.2" + ethereum-cryptography "^0.1.3" + ethjs-util "^0.1.3" + rlp "^2.0.0" + safe-buffer "^5.1.1" + +ethereumjs-util@^6.0.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz#fcb4e4dd5ceacb9d2305426ab1a5cd93e3163b69" + integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw== + dependencies: + "@types/bn.js" "^4.11.3" + bn.js "^4.11.0" + create-hash "^1.1.2" + elliptic "^6.5.2" + ethereum-cryptography "^0.1.3" + ethjs-util "0.1.6" + rlp "^2.2.3" + +ethers@^5.4.4: + version "5.7.2" + resolved "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz" + integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== dependencies: "@ethersproject/abi" "5.7.0" "@ethersproject/abstract-provider" "5.7.0" @@ -1887,282 +2666,559 @@ "@ethersproject/web" "5.7.1" "@ethersproject/wordlists" "5.7.0" -"eventemitter3@^3.1.0": - "integrity" "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" - "resolved" "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz" - "version" "3.1.2" - -"fancy-canvas@0.2.2": - "integrity" "sha512-50qi8xA0QkHbjmb8h7XQ6k2fvD7y/yMfiUw9YTarJ7rWrq6o5/3CCXPouYk+XSLASvvxtjyiQLRBFt3qkE3oyA==" - "resolved" "https://registry.npmjs.org/fancy-canvas/-/fancy-canvas-0.2.2.tgz" - "version" "0.2.2" - -"find-root@^1.1.0": - "integrity" "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" - "resolved" "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz" - "version" "1.1.0" - -"focus-lock@^0.11.2": - "integrity" "sha512-4n0pYcPTa/uI7Q66BZna61nRT7lDhnuJ9PJr6wiDjx4uStg491ks41y7uOG+s0umaaa+hulNKSldU9aTg9/yVg==" - "resolved" "https://registry.npmjs.org/focus-lock/-/focus-lock-0.11.3.tgz" - "version" "0.11.3" - dependencies: - "tslib" "^2.0.3" - -"follow-redirects@^1.14.8", "follow-redirects@^1.15.0": - "integrity" "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" - "resolved" "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz" - "version" "1.15.2" - -"form-data@^4.0.0": - "integrity" "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==" - "resolved" "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" - "version" "4.0.0" +ethers@^5.7.2: + version "5.7.2" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" + integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== dependencies: - "asynckit" "^0.4.0" - "combined-stream" "^1.0.8" - "mime-types" "^2.1.12" + "@ethersproject/abi" "5.7.0" + "@ethersproject/abstract-provider" "5.7.0" + "@ethersproject/abstract-signer" "5.7.0" + "@ethersproject/address" "5.7.0" + "@ethersproject/base64" "5.7.0" + "@ethersproject/basex" "5.7.0" + "@ethersproject/bignumber" "5.7.0" + "@ethersproject/bytes" "5.7.0" + "@ethersproject/constants" "5.7.0" + "@ethersproject/contracts" "5.7.0" + "@ethersproject/hash" "5.7.0" + "@ethersproject/hdnode" "5.7.0" + "@ethersproject/json-wallets" "5.7.0" + "@ethersproject/keccak256" "5.7.0" + "@ethersproject/logger" "5.7.0" + "@ethersproject/networks" "5.7.1" + "@ethersproject/pbkdf2" "5.7.0" + "@ethersproject/properties" "5.7.0" + "@ethersproject/providers" "5.7.2" + "@ethersproject/random" "5.7.0" + "@ethersproject/rlp" "5.7.0" + "@ethersproject/sha2" "5.7.0" + "@ethersproject/signing-key" "5.7.0" + "@ethersproject/solidity" "5.7.0" + "@ethersproject/strings" "5.7.0" + "@ethersproject/transactions" "5.7.0" + "@ethersproject/units" "5.7.0" + "@ethersproject/wallet" "5.7.0" + "@ethersproject/web" "5.7.1" + "@ethersproject/wordlists" "5.7.0" -"framer-motion@^6.3.0", "framer-motion@>=4.0.0": - "integrity" "sha512-o1BGqqposwi7cgDrtg0dNONhkmPsUFDaLcKXigzuTFC5x58mE8iyTazxSudFzmT6MEyJKfjjU8ItoMe3W+3fiw==" - "resolved" "https://registry.npmjs.org/framer-motion/-/framer-motion-6.5.1.tgz" - "version" "6.5.1" +ethjs-util@0.1.6, ethjs-util@^0.1.3: + version "0.1.6" + resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536" + integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w== + dependencies: + is-hex-prefixed "1.0.0" + strip-hex-prefix "1.0.0" + +eventemitter3@4.0.7, eventemitter3@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +eventemitter3@^3.1.0: + version "3.1.2" + resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz" + integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== + +events@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +eyes@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" + integrity sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ== + +fancy-canvas@0.2.2: + version "0.2.2" + resolved "https://registry.npmjs.org/fancy-canvas/-/fancy-canvas-0.2.2.tgz" + integrity sha512-50qi8xA0QkHbjmb8h7XQ6k2fvD7y/yMfiUw9YTarJ7rWrq6o5/3CCXPouYk+XSLASvvxtjyiQLRBFt3qkE3oyA== + +fast-safe-stringify@^2.0.6: + version "2.1.1" + resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" + integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== + +fast-stable-stringify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fast-stable-stringify/-/fast-stable-stringify-1.0.0.tgz#5c5543462b22aeeefd36d05b34e51c78cb86d313" + integrity sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag== + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +find-root@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz" + integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +focus-lock@^0.11.2: + version "0.11.3" + resolved "https://registry.npmjs.org/focus-lock/-/focus-lock-0.11.3.tgz" + integrity sha512-4n0pYcPTa/uI7Q66BZna61nRT7lDhnuJ9PJr6wiDjx4uStg491ks41y7uOG+s0umaaa+hulNKSldU9aTg9/yVg== + dependencies: + tslib "^2.0.3" + +follow-redirects@^1.14.0, follow-redirects@^1.14.8, follow-redirects@^1.15.0: + version "1.15.2" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +framer-motion@^6.3.0: + version "6.5.1" + resolved "https://registry.npmjs.org/framer-motion/-/framer-motion-6.5.1.tgz" + integrity sha512-o1BGqqposwi7cgDrtg0dNONhkmPsUFDaLcKXigzuTFC5x58mE8iyTazxSudFzmT6MEyJKfjjU8ItoMe3W+3fiw== dependencies: "@motionone/dom" "10.12.0" - "framesync" "6.0.1" - "hey-listen" "^1.0.8" - "popmotion" "11.0.3" - "style-value-types" "5.0.0" - "tslib" "^2.1.0" + framesync "6.0.1" + hey-listen "^1.0.8" + popmotion "11.0.3" + style-value-types "5.0.0" + tslib "^2.1.0" optionalDependencies: "@emotion/is-prop-valid" "^0.8.2" -"framesync@5.3.0": - "integrity" "sha512-oc5m68HDO/tuK2blj7ZcdEBRx3p1PjrgHazL8GYEpvULhrtGIFbQArN6cQS2QhW8mitffaB+VYzMjDqBxxQeoA==" - "resolved" "https://registry.npmjs.org/framesync/-/framesync-5.3.0.tgz" - "version" "5.3.0" +framesync@5.3.0: + version "5.3.0" + resolved "https://registry.npmjs.org/framesync/-/framesync-5.3.0.tgz" + integrity sha512-oc5m68HDO/tuK2blj7ZcdEBRx3p1PjrgHazL8GYEpvULhrtGIFbQArN6cQS2QhW8mitffaB+VYzMjDqBxxQeoA== + dependencies: + tslib "^2.1.0" + +framesync@6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/framesync/-/framesync-6.0.1.tgz" + integrity sha512-fUY88kXvGiIItgNC7wcTOl0SNRCVXMKSWW2Yzfmn7EKNc+MpCzcz9DhdHcdjbrtN3c6R4H5dTY2jiCpPdysEjA== dependencies: - "tslib" "^2.1.0" - -"framesync@6.0.1": - "integrity" "sha512-fUY88kXvGiIItgNC7wcTOl0SNRCVXMKSWW2Yzfmn7EKNc+MpCzcz9DhdHcdjbrtN3c6R4H5dTY2jiCpPdysEjA==" - "resolved" "https://registry.npmjs.org/framesync/-/framesync-6.0.1.tgz" - "version" "6.0.1" - dependencies: - "tslib" "^2.1.0" - -"function-bind@^1.1.1": - "integrity" "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - "resolved" "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" - "version" "1.1.1" - -"gensync@^1.0.0-beta.2": - "integrity" "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" - "resolved" "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" - "version" "1.0.0-beta.2" - -"get-nonce@^1.0.0": - "integrity" "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==" - "resolved" "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz" - "version" "1.0.1" - -"globals@^11.1.0": - "integrity" "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" - "resolved" "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" - "version" "11.12.0" - -"graceful-fs@^4.2.4": - "integrity" "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" - "resolved" "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" - "version" "4.2.10" - -"has-flag@^3.0.0": - "integrity" "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" - "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" - "version" "3.0.0" - -"has@^1.0.3": - "integrity" "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==" - "resolved" "https://registry.npmjs.org/has/-/has-1.0.3.tgz" - "version" "1.0.3" - dependencies: - "function-bind" "^1.1.1" - -"hash.js@^1.0.0", "hash.js@^1.0.3", "hash.js@1.1.7": - "integrity" "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==" - "resolved" "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz" - "version" "1.1.7" - dependencies: - "inherits" "^2.0.3" - "minimalistic-assert" "^1.0.1" - -"hey-listen@^1.0.8": - "integrity" "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==" - "resolved" "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz" - "version" "1.0.8" - -"hmac-drbg@^1.0.1": - "integrity" "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==" - "resolved" "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz" - "version" "1.0.1" - dependencies: - "hash.js" "^1.0.3" - "minimalistic-assert" "^1.0.0" - "minimalistic-crypto-utils" "^1.0.1" - -"hoist-non-react-statics@^3.3.1": - "integrity" "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==" - "resolved" "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz" - "version" "3.3.2" - dependencies: - "react-is" "^16.7.0" - -"import-fresh@^3.2.1": - "integrity" "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==" - "resolved" "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" - "version" "3.3.0" - dependencies: - "parent-module" "^1.0.0" - "resolve-from" "^4.0.0" - -"inherits@^2.0.3", "inherits@^2.0.4": - "integrity" "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - "resolved" "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" - "version" "2.0.4" - -"injectpromise@^1.0.0": - "integrity" "sha512-qNq5wy4qX4uWHcVFOEU+RqZkoVG65FhvGkyDWbuBxILMjK6A1LFf5A1mgXZkD4nRx5FCorD81X/XvPKp/zVfPA==" - "resolved" "https://registry.npmjs.org/injectpromise/-/injectpromise-1.0.0.tgz" - "version" "1.0.0" - -"invariant@^2.2.4": - "integrity" "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==" - "resolved" "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz" - "version" "2.2.4" - dependencies: - "loose-envify" "^1.0.0" - -"is-arrayish@^0.2.1": - "integrity" "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" - "resolved" "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" - "version" "0.2.1" - -"is-core-module@^2.9.0": - "integrity" "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==" - "resolved" "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz" - "version" "2.11.0" - dependencies: - "has" "^1.0.3" - -"js-sha3@0.8.0": - "integrity" "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" - "resolved" "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz" - "version" "0.8.0" - -"js-tokens@^3.0.0 || ^4.0.0", "js-tokens@^4.0.0": - "integrity" "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - "resolved" "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" - "version" "4.0.0" - -"jsesc@^2.5.1": - "integrity" "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - "resolved" "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" - "version" "2.5.2" - -"json-parse-even-better-errors@^2.3.0": - "integrity" "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - "resolved" "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" - "version" "2.3.1" - -"json5@^2.2.1": - "integrity" "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==" - "resolved" "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz" - "version" "2.2.1" - -"lightweight-charts@^3.8.0": - "integrity" "sha512-7yFGnYuE1RjRJG9RwUTBz5wvF1QtjBOSW4FFlikr8Dh+/TDNt4ci+HsWSYmStgQUpawpvkCJ3j5/W25GppGj9Q==" - "resolved" "https://registry.npmjs.org/lightweight-charts/-/lightweight-charts-3.8.0.tgz" - "version" "3.8.0" - dependencies: - "fancy-canvas" "0.2.2" - -"lines-and-columns@^1.1.6": - "integrity" "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - "resolved" "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" - "version" "1.2.4" - -"loadjs@^4.2.0": - "integrity" "sha512-AgQGZisAlTPbTEzrHPb6q+NYBMD+DP9uvGSIjSUM5uG+0jG15cb8axWpxuOIqrmQjn6scaaH8JwloiP27b2KXA==" - "resolved" "https://registry.npmjs.org/loadjs/-/loadjs-4.2.0.tgz" - "version" "4.2.0" - -"lodash.mergewith@4.6.2": - "integrity" "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==" - "resolved" "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz" - "version" "4.6.2" - -"lodash@^4.17.21": - "integrity" "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - "resolved" "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" - "version" "4.17.21" - -"loose-envify@^1.0.0", "loose-envify@^1.1.0", "loose-envify@^1.4.0": - "integrity" "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==" - "resolved" "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" - "version" "1.4.0" - dependencies: - "js-tokens" "^3.0.0 || ^4.0.0" - -"mime-db@1.52.0": - "integrity" "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - "resolved" "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" - "version" "1.52.0" - -"mime-types@^2.1.12": - "integrity" "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==" - "resolved" "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" - "version" "2.1.35" - dependencies: - "mime-db" "1.52.0" - -"minimalistic-assert@^1.0.0", "minimalistic-assert@^1.0.1": - "integrity" "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - "resolved" "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" - "version" "1.0.1" - -"minimalistic-crypto-utils@^1.0.1": - "integrity" "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" - "resolved" "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz" - "version" "1.0.1" - -"ms@2.1.2": - "integrity" "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - "resolved" "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" - "version" "2.1.2" - -"nanoid@^3.3.4": - "integrity" "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" - "resolved" "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz" - "version" "3.3.4" - -"next-transpile-modules@^10.0.0": - "integrity" "sha512-FyeJ++Lm2Fq31gbThiRCrJlYpIY9QaI7A3TjuhQLzOix8ChQrvn5ny4MhfIthS5cy6+uK1AhDRvxVdW17y3Xdw==" - "resolved" "https://registry.npmjs.org/next-transpile-modules/-/next-transpile-modules-10.0.0.tgz" - "version" "10.0.0" - dependencies: - "enhanced-resolve" "^5.10.0" - -"next@latest": - "integrity" "sha512-puH1WGM6rGeFOoFdXXYfUxN9Sgi4LMytCV5HkQJvVUOhHfC1DoVqOfvzaEteyp6P04IW+gbtK2Q9pInVSrltPA==" - "resolved" "https://registry.npmjs.org/next/-/next-13.0.0.tgz" - "version" "13.0.0" + tslib "^2.1.0" + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" + integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.3" + +get-nonce@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz" + integrity sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q== + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graceful-fs@^4.2.4: + version "4.2.10" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== + dependencies: + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: + version "1.1.7" + resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hey-listen@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz" + integrity sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q== + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz" + integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hoist-non-react-statics@^3.3.1: + version "3.3.2" + resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + +ieee754@^1.1.13, ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +injectpromise@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/injectpromise/-/injectpromise-1.0.0.tgz" + integrity sha512-qNq5wy4qX4uWHcVFOEU+RqZkoVG65FhvGkyDWbuBxILMjK6A1LFf5A1mgXZkD4nRx5FCorD81X/XvPKp/zVfPA== + +invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +is-arguments@^1.0.4: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-callable@^1.1.3: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.9.0: + version "2.11.0" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz" + integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== + dependencies: + has "^1.0.3" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== + +is-generator-function@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + +is-hex-prefixed@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" + integrity sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA== + +is-typed-array@^1.1.10, is-typed-array@^1.1.3: + version "1.1.10" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" + integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + +is-typedarray@1.0.0, is-typedarray@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + +isarray@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isomorphic-ws@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" + integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== + +jayson@^3.4.4: + version "3.7.0" + resolved "https://registry.yarnpkg.com/jayson/-/jayson-3.7.0.tgz#b735b12d06d348639ae8230d7a1e2916cb078f25" + integrity sha512-tfy39KJMrrXJ+mFcMpxwBvFDetS8LAID93+rycFglIQM4kl3uNR3W4lBLE/FFhsoUCEox5Dt2adVpDm/XtebbQ== + dependencies: + "@types/connect" "^3.4.33" + "@types/node" "^12.12.54" + "@types/ws" "^7.4.4" + JSONStream "^1.3.5" + commander "^2.20.3" + delay "^5.0.0" + es6-promisify "^5.0.0" + eyes "^0.1.8" + isomorphic-ws "^4.0.1" + json-stringify-safe "^5.0.1" + lodash "^4.17.20" + uuid "^8.3.2" + ws "^7.4.5" + +js-sha3@0.8.0, js-sha3@^0.8.0: + version "0.8.0" + resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz" + integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-rpc-engine@6.1.0, json-rpc-engine@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-6.1.0.tgz#bf5ff7d029e1c1bf20cb6c0e9f348dcd8be5a393" + integrity sha512-NEdLrtrq1jUZyfjkr9OCz9EzCNhnRyWtt1PAnvnhwy6e8XETS0Dtc+ZNCO2gvuAoKsIn2+vCSowXTYE4CkgnAQ== + dependencies: + "@metamask/safe-event-emitter" "^2.0.0" + eth-rpc-errors "^4.0.2" + +json-rpc-engine@^5.3.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-5.4.0.tgz#75758609d849e1dba1e09021ae473f3ab63161e5" + integrity sha512-rAffKbPoNDjuRnXkecTjnsE3xLLrb00rEkdgalINhaYVYIxDwWtvYBr9UFbhTvPB1B2qUOLoFd/cV6f4Q7mh7g== + dependencies: + eth-rpc-errors "^3.0.0" + safe-event-emitter "^1.0.1" + +json-rpc-random-id@^1.0.0, json-rpc-random-id@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz#ba49d96aded1444dbb8da3d203748acbbcdec8c8" + integrity sha512-RJ9YYNCkhVDBuP4zN5BBtYAzEl03yq/jIIsyif0JY9qyJuQQZNeDK7anAPKKlyEtLSj2s8h6hNh2F8zO5q7ScA== + +json-stable-stringify@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.2.tgz#e06f23128e0bbe342dc996ed5a19e28b57b580e0" + integrity sha512-eunSSaEnxV12z+Z73y/j5N37/In40GK4GmsSy+tEHJMxknvqnA7/djeYtAgW0GsWHUfg+847WJjKaEylk2y09g== + dependencies: + jsonify "^0.0.1" + +json-stringify-safe@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== + +jsonify@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.1.tgz#2aa3111dae3d34a0f151c63f3a45d995d9420978" + integrity sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg== + +jsonparse@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== + +keccak@^3.0.0, keccak@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.2.tgz#4c2c6e8c54e04f2670ee49fa734eb9da152206e0" + integrity sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ== + dependencies: + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + readable-stream "^3.6.0" + +keyvaluestorage-interface@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/keyvaluestorage-interface/-/keyvaluestorage-interface-1.0.0.tgz#13ebdf71f5284ad54be94bd1ad9ed79adad515ff" + integrity sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g== + +lightweight-charts@^3.8.0: + version "3.8.0" + resolved "https://registry.npmjs.org/lightweight-charts/-/lightweight-charts-3.8.0.tgz" + integrity sha512-7yFGnYuE1RjRJG9RwUTBz5wvF1QtjBOSW4FFlikr8Dh+/TDNt4ci+HsWSYmStgQUpawpvkCJ3j5/W25GppGj9Q== + dependencies: + fancy-canvas "0.2.2" + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +loadjs@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/loadjs/-/loadjs-4.2.0.tgz" + integrity sha512-AgQGZisAlTPbTEzrHPb6q+NYBMD+DP9uvGSIjSUM5uG+0jG15cb8axWpxuOIqrmQjn6scaaH8JwloiP27b2KXA== + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== + +lodash.mergewith@4.6.2: + version "4.6.2" + resolved "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz" + integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ== + +lodash@^4.17.20, lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12: + version "2.1.35" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz" + integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +nanoid@^3.3.4: + version "3.3.4" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz" + integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== + +next-transpile-modules@^10.0.0: + version "10.0.0" + resolved "https://registry.npmjs.org/next-transpile-modules/-/next-transpile-modules-10.0.0.tgz" + integrity sha512-FyeJ++Lm2Fq31gbThiRCrJlYpIY9QaI7A3TjuhQLzOix8ChQrvn5ny4MhfIthS5cy6+uK1AhDRvxVdW17y3Xdw== + dependencies: + enhanced-resolve "^5.10.0" + +next@latest: + version "13.0.0" + resolved "https://registry.npmjs.org/next/-/next-13.0.0.tgz" + integrity sha512-puH1WGM6rGeFOoFdXXYfUxN9Sgi4LMytCV5HkQJvVUOhHfC1DoVqOfvzaEteyp6P04IW+gbtK2Q9pInVSrltPA== dependencies: "@next/env" "13.0.0" "@swc/helpers" "0.4.11" - "caniuse-lite" "^1.0.30001406" - "postcss" "8.4.14" - "styled-jsx" "5.1.0" - "use-sync-external-store" "1.2.0" + caniuse-lite "^1.0.30001406" + postcss "8.4.14" + styled-jsx "5.1.0" + use-sync-external-store "1.2.0" optionalDependencies: "@next/swc-android-arm-eabi" "13.0.0" "@next/swc-android-arm64" "13.0.0" @@ -2178,333 +3234,806 @@ "@next/swc-win32-ia32-msvc" "13.0.0" "@next/swc-win32-x64-msvc" "13.0.0" -"node-releases@^2.0.6": - "integrity" "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" - "resolved" "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz" - "version" "2.0.6" +node-addon-api@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" + integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== + +node-fetch@2, node-fetch@2.6.7, node-fetch@^2.6.1: + version "2.6.7" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" + +node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.5.0.tgz#7a64eefa0b21112f89f58379da128ac177f20e40" + integrity sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg== + +node-releases@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz" + integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== -"object-assign@^4.1.1": - "integrity" "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" - "resolved" "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" - "version" "4.1.1" +object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -"parent-module@^1.0.0": - "integrity" "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==" - "resolved" "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" - "version" "1.0.1" +object-inspect@^1.9.0: + version "1.12.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" + integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== + +p-limit@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== dependencies: - "callsites" "^3.0.0" + p-limit "^2.0.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -"parse-json@^5.0.0": - "integrity" "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==" - "resolved" "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" - "version" "5.2.0" +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== dependencies: "@babel/code-frame" "^7.0.0" - "error-ex" "^1.3.1" - "json-parse-even-better-errors" "^2.3.0" - "lines-and-columns" "^1.1.6" - -"path-parse@^1.0.7": - "integrity" "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - "resolved" "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" - "version" "1.0.7" - -"path-type@^4.0.0": - "integrity" "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" - "resolved" "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" - "version" "4.0.0" - -"picocolors@^1.0.0": - "integrity" "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - "resolved" "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" - "version" "1.0.0" - -"popmotion@11.0.3": - "integrity" "sha512-Y55FLdj3UxkR7Vl3s7Qr4e9m0onSnP8W7d/xQLsoJM40vs6UKHFdygs6SWryasTZYqugMjm3BepCF4CWXDiHgA==" - "resolved" "https://registry.npmjs.org/popmotion/-/popmotion-11.0.3.tgz" - "version" "11.0.3" - dependencies: - "framesync" "6.0.1" - "hey-listen" "^1.0.8" - "style-value-types" "5.0.0" - "tslib" "^2.1.0" - -"postcss@8.4.14": - "integrity" "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==" - "resolved" "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz" - "version" "8.4.14" - dependencies: - "nanoid" "^3.3.4" - "picocolors" "^1.0.0" - "source-map-js" "^1.0.2" - -"prop-types@^15.6.2": - "integrity" "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==" - "resolved" "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" - "version" "15.8.1" - dependencies: - "loose-envify" "^1.4.0" - "object-assign" "^4.1.1" - "react-is" "^16.13.1" - -"proxy-from-env@^1.1.0": - "integrity" "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - "resolved" "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" - "version" "1.1.0" - -"react-clientside-effect@^1.2.6": - "integrity" "sha512-XGGGRQAKY+q25Lz9a/4EPqom7WRjz3z9R2k4jhVKA/puQFH/5Nt27vFZYql4m4NVNdUvX8PS3O7r/Zzm7cjUlg==" - "resolved" "https://registry.npmjs.org/react-clientside-effect/-/react-clientside-effect-1.2.6.tgz" - "version" "1.2.6" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pbkdf2@^3.0.17: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== + +pify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-5.0.0.tgz#1f5eca3f5e87ebec28cc6d54a0e4aaf00acc127f" + integrity sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA== + +pngjs@^3.3.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f" + integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== + +popmotion@11.0.3: + version "11.0.3" + resolved "https://registry.npmjs.org/popmotion/-/popmotion-11.0.3.tgz" + integrity sha512-Y55FLdj3UxkR7Vl3s7Qr4e9m0onSnP8W7d/xQLsoJM40vs6UKHFdygs6SWryasTZYqugMjm3BepCF4CWXDiHgA== + dependencies: + framesync "6.0.1" + hey-listen "^1.0.8" + style-value-types "5.0.0" + tslib "^2.1.0" + +postcss@8.4.14: + version "8.4.14" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz" + integrity sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig== + dependencies: + nanoid "^3.3.4" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +preact@10.4.1: + version "10.4.1" + resolved "https://registry.yarnpkg.com/preact/-/preact-10.4.1.tgz#9b3ba020547673a231c6cf16f0fbaef0e8863431" + integrity sha512-WKrRpCSwL2t3tpOOGhf2WfTpcmbpxaWtDbdJdKdjd0aEiTkvOmS4NBkG6kzlaAHI9AkQ3iVqbFWM3Ei7mZ4o1Q== + +preact@^10.5.9: + version "10.11.2" + resolved "https://registry.yarnpkg.com/preact/-/preact-10.11.2.tgz#e43f2a2f2985dedb426bb4c765b7bb037734f8a8" + integrity sha512-skAwGDFmgxhq1DCBHke/9e12ewkhc7WYwjuhHB8HHS8zkdtITXLRmUMTeol2ldxvLwYtwbFeifZ9uDDWuyL4Iw== + +prop-types@^15.6.2: + version "15.8.1" + resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +qrcode@1.4.4: + version "1.4.4" + resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.4.4.tgz#f0c43568a7e7510a55efc3b88d9602f71963ea83" + integrity sha512-oLzEC5+NKFou9P0bMj5+v6Z40evexeE29Z9cummZXZ9QXyMr3lphkURzxjXgPJC5azpxcshoDWV1xE46z+/c3Q== + dependencies: + buffer "^5.4.3" + buffer-alloc "^1.2.0" + buffer-from "^1.1.1" + dijkstrajs "^1.0.1" + isarray "^2.0.1" + pngjs "^3.3.0" + yargs "^13.2.4" + +qs@^6.10.3: + version "6.11.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" + +query-string@6.13.5: + version "6.13.5" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.13.5.tgz#99e95e2fb7021db90a6f373f990c0c814b3812d8" + integrity sha512-svk3xg9qHR39P3JlHuD7g3nRnyay5mHbrPctEBDUxUkHRifPHXJDhBUycdCC0NBjXoDf44Gb+IsOZL1Uwn8M/Q== + dependencies: + decode-uri-component "^0.2.0" + split-on-first "^1.0.0" + strict-uri-encode "^2.0.0" + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +react-clientside-effect@^1.2.6: + version "1.2.6" + resolved "https://registry.npmjs.org/react-clientside-effect/-/react-clientside-effect-1.2.6.tgz" + integrity sha512-XGGGRQAKY+q25Lz9a/4EPqom7WRjz3z9R2k4jhVKA/puQFH/5Nt27vFZYql4m4NVNdUvX8PS3O7r/Zzm7cjUlg== dependencies: "@babel/runtime" "^7.12.13" -"react-dom@^18.0.0-0", "react-dom@^18.2.0", "react-dom@>=16.8 || ^17.0.0 || ^18.0.0", "react-dom@>=18": - "integrity" "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==" - "resolved" "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz" - "version" "18.2.0" +react-dom@^18.2.0: + version "18.2.0" + resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz" + integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== dependencies: - "loose-envify" "^1.1.0" - "scheduler" "^0.23.0" + loose-envify "^1.1.0" + scheduler "^0.23.0" -"react-fast-compare@3.2.0": - "integrity" "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==" - "resolved" "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz" - "version" "3.2.0" +react-fast-compare@3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz" + integrity sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA== -"react-focus-lock@^2.9.1": - "integrity" "sha512-pSWOQrUmiKLkffPO6BpMXN7SNKXMsuOakl652IBuALAu1esk+IcpJyM+ALcYzPTTFz1rD0R54aB9A4HuP5t1Wg==" - "resolved" "https://registry.npmjs.org/react-focus-lock/-/react-focus-lock-2.9.1.tgz" - "version" "2.9.1" +react-focus-lock@^2.9.1: + version "2.9.1" + resolved "https://registry.npmjs.org/react-focus-lock/-/react-focus-lock-2.9.1.tgz" + integrity sha512-pSWOQrUmiKLkffPO6BpMXN7SNKXMsuOakl652IBuALAu1esk+IcpJyM+ALcYzPTTFz1rD0R54aB9A4HuP5t1Wg== dependencies: "@babel/runtime" "^7.0.0" - "focus-lock" "^0.11.2" - "prop-types" "^15.6.2" - "react-clientside-effect" "^1.2.6" - "use-callback-ref" "^1.3.0" - "use-sidecar" "^1.1.2" - -"react-icons@^4.6.0": - "integrity" "sha512-rR/L9m9340yO8yv1QT1QurxWQvWpbNHqVX0fzMln2HEb9TEIrQRGsqiNFQfiv9/JEUbyHmHPlNTB2LWm2Ttz0g==" - "resolved" "https://registry.npmjs.org/react-icons/-/react-icons-4.6.0.tgz" - "version" "4.6.0" - -"react-is@^16.13.1", "react-is@^16.7.0": - "integrity" "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - "resolved" "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" - "version" "16.13.1" - -"react-remove-scroll-bar@^2.3.3": - "integrity" "sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==" - "resolved" "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz" - "version" "2.3.4" - dependencies: - "react-style-singleton" "^2.2.1" - "tslib" "^2.0.0" - -"react-remove-scroll@^2.5.4": - "integrity" "sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==" - "resolved" "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz" - "version" "2.5.5" - dependencies: - "react-remove-scroll-bar" "^2.3.3" - "react-style-singleton" "^2.2.1" - "tslib" "^2.1.0" - "use-callback-ref" "^1.3.0" - "use-sidecar" "^1.1.2" - -"react-style-singleton@^2.2.1": - "integrity" "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==" - "resolved" "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz" - "version" "2.2.1" - dependencies: - "get-nonce" "^1.0.0" - "invariant" "^2.2.4" - "tslib" "^2.0.0" - -"react-twitter-widgets@^1.11.0": - "integrity" "sha512-PMCLJQc30iqy01y1b2+HnMfCX+ZkOxWaPKJb4BhHgOgjSjoZb68K5T0nq3q+3YbX9K7OH0bhptgDihtBG/BqRQ==" - "resolved" "https://registry.npmjs.org/react-twitter-widgets/-/react-twitter-widgets-1.11.0.tgz" - "version" "1.11.0" - dependencies: - "loadjs" "^4.2.0" - -"react@*", "react@^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", "react@^16.8.0 || ^17 || ^18", "react@^16.8.0 || ^17.0.0 || ^18.0.0", "react@^16.9.0 || ^17.0.0 || ^18.0.0", "react@^18.0.0-0", "react@^18.2.0", "react@>= 16.8.0 || 17.x.x || ^18.0.0-0", "react@>=16.8 || ^17.0.0 || ^18.0.0", "react@>=16.8.0", "react@>=18": - "integrity" "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==" - "resolved" "https://registry.npmjs.org/react/-/react-18.2.0.tgz" - "version" "18.2.0" - dependencies: - "loose-envify" "^1.1.0" - -"regenerator-runtime@^0.13.10": - "integrity" "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==" - "resolved" "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz" - "version" "0.13.10" - -"resolve-from@^4.0.0": - "integrity" "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" - "resolved" "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" - "version" "4.0.0" - -"resolve@^1.19.0": - "integrity" "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==" - "resolved" "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz" - "version" "1.22.1" - dependencies: - "is-core-module" "^2.9.0" - "path-parse" "^1.0.7" - "supports-preserve-symlinks-flag" "^1.0.0" - -"scheduler@^0.23.0": - "integrity" "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==" - "resolved" "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz" - "version" "0.23.0" - dependencies: - "loose-envify" "^1.1.0" - -"scrypt-js@3.0.1": - "integrity" "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" - "resolved" "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz" - "version" "3.0.1" - -"semver@^5.6.0": - "integrity" "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - "resolved" "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" - "version" "5.7.1" - -"semver@^6.3.0": - "integrity" "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - "resolved" "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" - "version" "6.3.0" - -"source-map-js@^1.0.2": - "integrity" "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" - "resolved" "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" - "version" "1.0.2" - -"source-map@^0.5.7": - "integrity" "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" - "resolved" "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" - "version" "0.5.7" - -"style-value-types@5.0.0": - "integrity" "sha512-08yq36Ikn4kx4YU6RD7jWEv27v4V+PUsOGa4n/as8Et3CuODMJQ00ENeAVXAeydX4Z2j1XHZF1K2sX4mGl18fA==" - "resolved" "https://registry.npmjs.org/style-value-types/-/style-value-types-5.0.0.tgz" - "version" "5.0.0" - dependencies: - "hey-listen" "^1.0.8" - "tslib" "^2.1.0" - -"styled-jsx@5.1.0": - "integrity" "sha512-/iHaRJt9U7T+5tp6TRelLnqBqiaIT0HsO0+vgyj8hK2KUk7aejFqRrumqPUlAqDwAj8IbS/1hk3IhBAAK/FCUQ==" - "resolved" "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.0.tgz" - "version" "5.1.0" - dependencies: - "client-only" "0.0.1" - -"stylis@4.1.3": - "integrity" "sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==" - "resolved" "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz" - "version" "4.1.3" - -"supports-color@^5.3.0": - "integrity" "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==" - "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" - "version" "5.5.0" - dependencies: - "has-flag" "^3.0.0" - -"supports-preserve-symlinks-flag@^1.0.0": - "integrity" "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" - "resolved" "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" - "version" "1.0.0" - -"tapable@^2.2.0": - "integrity" "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" - "resolved" "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" - "version" "2.2.1" - -"tiny-invariant@^1.0.6": - "integrity" "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==" - "resolved" "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz" - "version" "1.3.1" - -"to-fast-properties@^2.0.0": - "integrity" "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" - "resolved" "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" - "version" "2.0.0" - -"toggle-selection@^1.0.6": - "integrity" "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" - "resolved" "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz" - "version" "1.0.6" - -"tronweb@^4.4.0": - "integrity" "sha512-0yPmjQE1drPcDtW4YCXFjtvDQmKc/utjKB2J6U5GDcWWhsGqE8yFjdIMJRa1yj1a/oFQNlthKMzw4Jd7lkWbYA==" - "resolved" "https://registry.npmjs.org/tronweb/-/tronweb-4.4.0.tgz" - "version" "4.4.0" + focus-lock "^0.11.2" + prop-types "^15.6.2" + react-clientside-effect "^1.2.6" + use-callback-ref "^1.3.0" + use-sidecar "^1.1.2" + +react-icons@^4.6.0: + version "4.6.0" + resolved "https://registry.npmjs.org/react-icons/-/react-icons-4.6.0.tgz" + integrity sha512-rR/L9m9340yO8yv1QT1QurxWQvWpbNHqVX0fzMln2HEb9TEIrQRGsqiNFQfiv9/JEUbyHmHPlNTB2LWm2Ttz0g== + +react-is@^16.13.1, react-is@^16.7.0: + version "16.13.1" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-native-url-polyfill@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/react-native-url-polyfill/-/react-native-url-polyfill-1.3.0.tgz#c1763de0f2a8c22cc3e959b654c8790622b6ef6a" + integrity sha512-w9JfSkvpqqlix9UjDvJjm1EjSt652zVQ6iwCIj1cVVkwXf4jQhQgTNXY6EVTwuAmUjg6BC6k9RHCBynoLFo3IQ== + dependencies: + whatwg-url-without-unicode "8.0.0-3" + +react-remove-scroll-bar@^2.3.3: + version "2.3.4" + resolved "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz" + integrity sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A== + dependencies: + react-style-singleton "^2.2.1" + tslib "^2.0.0" + +react-remove-scroll@^2.5.4: + version "2.5.5" + resolved "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz" + integrity sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw== + dependencies: + react-remove-scroll-bar "^2.3.3" + react-style-singleton "^2.2.1" + tslib "^2.1.0" + use-callback-ref "^1.3.0" + use-sidecar "^1.1.2" + +react-style-singleton@^2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz" + integrity sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g== + dependencies: + get-nonce "^1.0.0" + invariant "^2.2.4" + tslib "^2.0.0" + +react-twitter-widgets@^1.11.0: + version "1.11.0" + resolved "https://registry.npmjs.org/react-twitter-widgets/-/react-twitter-widgets-1.11.0.tgz" + integrity sha512-PMCLJQc30iqy01y1b2+HnMfCX+ZkOxWaPKJb4BhHgOgjSjoZb68K5T0nq3q+3YbX9K7OH0bhptgDihtBG/BqRQ== + dependencies: + loadjs "^4.2.0" + +react@^18.2.0: + version "18.2.0" + resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz" + integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== + dependencies: + loose-envify "^1.1.0" + +readable-stream@^3.5.0, readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +regenerator-runtime@^0.13.10: + version "0.13.10" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz" + integrity sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw== + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve@^1.14.2, resolve@^1.19.0: + version "1.22.1" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +rlp@^2.0.0, rlp@^2.2.3: + version "2.2.7" + resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf" + integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== + dependencies: + bn.js "^5.2.0" + +rpc-websockets@^7.5.0: + version "7.5.0" + resolved "https://registry.yarnpkg.com/rpc-websockets/-/rpc-websockets-7.5.0.tgz#bbeb87572e66703ff151e50af1658f98098e2748" + integrity sha512-9tIRi1uZGy7YmDjErf1Ax3wtqdSSLIlnmL5OtOzgd5eqPKbsPpwDP5whUDO2LQay3Xp0CcHlcNSGzacNRluBaQ== + dependencies: + "@babel/runtime" "^7.17.2" + eventemitter3 "^4.0.7" + uuid "^8.3.2" + ws "^8.5.0" + optionalDependencies: + bufferutil "^4.0.1" + utf-8-validate "^5.0.2" + +rxjs@^6.6.3: + version "6.6.7" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" + integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== + dependencies: + tslib "^1.9.0" + +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-event-emitter@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/safe-event-emitter/-/safe-event-emitter-1.0.1.tgz#5b692ef22329ed8f69fdce607e50ca734f6f20af" + integrity sha512-e1wFe99A91XYYxoQbcq2ZJUWurxEyP8vfz7A7vuUe1s95q8r5ebraVaA1BukYJcpM6V16ugWoD9vngi8Ccu5fg== + dependencies: + events "^3.0.0" + +safe-json-utils@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/safe-json-utils/-/safe-json-utils-1.1.1.tgz#0e883874467d95ab914c3f511096b89bfb3e63b1" + integrity sha512-SAJWGKDs50tAbiDXLf89PDwt9XYkWyANFWVzn4dTXl5QyI8t2o/bW5/OJl3lvc2WVU4MEpTo9Yz5NVFNsp+OJQ== + +scheduler@^0.23.0: + version "0.23.0" + resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz" + integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== + dependencies: + loose-envify "^1.1.0" + +scrypt-js@3.0.1, scrypt-js@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz" + integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== + +secp256k1@^4.0.1, secp256k1@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" + integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== + dependencies: + elliptic "^6.5.4" + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + +semver@^5.6.0: + version "5.7.1" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + +sha.js@^2.4.0, sha.js@^2.4.11, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +source-map@^0.5.7: + version "0.5.7" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== + +split-on-first@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" + integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== + +stream-browserify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-3.0.0.tgz#22b0a2850cdf6503e73085da1fc7b7d0c2122f2f" + integrity sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA== + dependencies: + inherits "~2.0.4" + readable-stream "^3.5.0" + +strict-uri-encode@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" + integrity sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ== + +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-hex-prefix@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f" + integrity sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A== + dependencies: + is-hex-prefixed "1.0.0" + +style-value-types@5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/style-value-types/-/style-value-types-5.0.0.tgz" + integrity sha512-08yq36Ikn4kx4YU6RD7jWEv27v4V+PUsOGa4n/as8Et3CuODMJQ00ENeAVXAeydX4Z2j1XHZF1K2sX4mGl18fA== + dependencies: + hey-listen "^1.0.8" + tslib "^2.1.0" + +styled-jsx@5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.0.tgz" + integrity sha512-/iHaRJt9U7T+5tp6TRelLnqBqiaIT0HsO0+vgyj8hK2KUk7aejFqRrumqPUlAqDwAj8IbS/1hk3IhBAAK/FCUQ== + dependencies: + client-only "0.0.1" + +stylis@4.1.3: + version "4.1.3" + resolved "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz" + integrity sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA== + +superstruct@^0.14.2: + version "0.14.2" + resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-0.14.2.tgz#0dbcdf3d83676588828f1cf5ed35cda02f59025b" + integrity sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ== + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +text-encoding-utf-8@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz#585b62197b0ae437e3c7b5d0af27ac1021e10d13" + integrity sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg== + +"through@>=2.2.7 <3": + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + +tiny-invariant@^1.0.6: + version "1.3.1" + resolved "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz" + integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +toggle-selection@^1.0.6: + version "1.0.6" + resolved "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz" + integrity sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ== + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +tronweb@^4.4.0: + version "4.4.0" + resolved "https://registry.npmjs.org/tronweb/-/tronweb-4.4.0.tgz" + integrity sha512-0yPmjQE1drPcDtW4YCXFjtvDQmKc/utjKB2J6U5GDcWWhsGqE8yFjdIMJRa1yj1a/oFQNlthKMzw4Jd7lkWbYA== dependencies: "@babel/runtime" "^7.0.0" - "axios" "^0.26.1" - "bignumber.js" "^9.0.1" - "elliptic" "^6.5.4" - "ethers" "^5.4.4" - "eventemitter3" "^3.1.0" - "injectpromise" "^1.0.0" - "lodash" "^4.17.21" - "semver" "^5.6.0" - "validator" "^13.7.0" - -"tslib@^2.0.0", "tslib@^2.0.3", "tslib@^2.1.0", "tslib@^2.3.1", "tslib@^2.4.0": - "integrity" "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" - "resolved" "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz" - "version" "2.4.0" - -"typescript@^4.7.2": - "integrity" "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==" - "resolved" "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz" - "version" "4.8.4" - -"update-browserslist-db@^1.0.9": - "integrity" "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==" - "resolved" "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz" - "version" "1.0.10" - dependencies: - "escalade" "^3.1.1" - "picocolors" "^1.0.0" - -"use-callback-ref@^1.3.0": - "integrity" "sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==" - "resolved" "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.0.tgz" - "version" "1.3.0" - dependencies: - "tslib" "^2.0.0" - -"use-sidecar@^1.1.2": - "integrity" "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==" - "resolved" "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz" - "version" "1.1.2" - dependencies: - "detect-node-es" "^1.1.0" - "tslib" "^2.0.0" - -"use-sync-external-store@1.2.0": - "integrity" "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==" - "resolved" "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz" - "version" "1.2.0" - -"validator@^13.7.0": - "integrity" "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==" - "resolved" "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz" - "version" "13.7.0" - -"ws@7.4.6": - "integrity" "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==" - "resolved" "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz" - "version" "7.4.6" - -"yaml@^1.10.0": - "integrity" "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" - "resolved" "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" - "version" "1.10.2" + axios "^0.26.1" + bignumber.js "^9.0.1" + elliptic "^6.5.4" + ethers "^5.4.4" + eventemitter3 "^3.1.0" + injectpromise "^1.0.0" + lodash "^4.17.21" + semver "^5.6.0" + validator "^13.7.0" + +tslib@^1.9.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.1, tslib@^2.4.0: + version "2.4.0" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz" + integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== + +tweetnacl@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" + integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== + +typedarray-to-buffer@3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +typescript@^4.7.2: + version "4.8.4" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz" + integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== + +update-browserslist-db@^1.0.9: + version "1.0.10" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz" + integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +use-callback-ref@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.0.tgz" + integrity sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w== + dependencies: + tslib "^2.0.0" + +use-sidecar@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz" + integrity sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw== + dependencies: + detect-node-es "^1.1.0" + tslib "^2.0.0" + +use-sync-external-store@1.2.0, use-sync-external-store@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz" + integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== + +utf-8-validate@^5.0.2: + version "5.0.10" + resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.10.tgz#d7d10ea39318171ca982718b6b96a8d2442571a2" + integrity sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ== + dependencies: + node-gyp-build "^4.3.0" + +util-deprecate@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +util@^0.12.4: + version "0.12.5" + resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" + integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== + dependencies: + inherits "^2.0.3" + is-arguments "^1.0.4" + is-generator-function "^1.0.7" + is-typed-array "^1.1.3" + which-typed-array "^1.1.2" + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +validator@^13.7.0: + version "13.7.0" + resolved "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz" + integrity sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw== + +wagmi@^0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/wagmi/-/wagmi-0.8.3.tgz#01184de1e3dfb3d6ae674060e370425d28c03105" + integrity sha512-9LVc+Wn6cV7wdGJtzf0SBXjSnpOZsXAlKMGqzYY9Xbus3z+sTsCRkWONK4hW+DZyf4M6wIU8jIyrK9AgcWunjA== + dependencies: + "@coinbase/wallet-sdk" "^3.5.3" + "@tanstack/query-sync-storage-persister" "^4.14.5" + "@tanstack/react-query" "^4.14.5" + "@tanstack/react-query-persist-client" "^4.14.5" + "@wagmi/core" "0.7.3" + "@walletconnect/ethereum-provider" "^1.8.0" + abitype "^0.1.7" + use-sync-external-store "^1.2.0" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +webidl-conversions@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" + integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== + +whatwg-url-without-unicode@8.0.0-3: + version "8.0.0-3" + resolved "https://registry.yarnpkg.com/whatwg-url-without-unicode/-/whatwg-url-without-unicode-8.0.0-3.tgz#ab6df4bf6caaa6c85a59f6e82c026151d4bb376b" + integrity sha512-HoKuzZrUlgpz35YO27XgD28uh/WJH4B0+3ttFqRo//lmq+9T/mIOJ6kqmINI9HpUpz1imRC/nR/lxKpJiv0uig== + dependencies: + buffer "^5.4.3" + punycode "^2.1.1" + webidl-conversions "^5.0.0" + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== + +which-typed-array@^1.1.2: + version "1.1.9" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" + integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + is-typed-array "^1.1.10" + +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + +ws@7.4.6: + version "7.4.6" + resolved "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz" + integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== + +ws@7.5.3: + version "7.5.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.3.tgz#160835b63c7d97bfab418fc1b8a9fced2ac01a74" + integrity sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg== + +ws@^7.4.0, ws@^7.4.5: + version "7.5.9" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + +ws@^8.5.0: + version "8.11.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143" + integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg== + +xtend@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== + +yaml@^1.10.0: + version "1.10.2" + resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yargs-parser@^13.1.2: + version "13.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs@^13.2.4: + version "13.3.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" + integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.2" + +zustand@^4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.1.4.tgz#b0286da4cc9edd35e91c96414fa54bfa4652a54d" + integrity sha512-k2jVOlWo8p4R83mQ+/uyB8ILPO2PCJOf+QVjcL+1PbMCk1w5OoPYpAIxy9zd93FSfmJqoH6lGdwzzjwqJIRU5A== + dependencies: + use-sync-external-store "1.2.0" From cef76176c701bcbfea71e2b5263cbced0f7398d5 Mon Sep 17 00:00:00 2001 From: prasad-kumkar Date: Tue, 15 Nov 2022 17:36:54 +0530 Subject: [PATCH 02/37] big number issue fix --- src/components/deposit/Deposit.tsx | 2 +- src/components/deposit/Withdraw.tsx | 2 +- src/components/trade/Graph.tsx | 1 - src/components/trade/Market/BuyModal.tsx | 2 +- src/components/trade/Market/SellModal.tsx | 4 ++-- src/context/DataProvider.tsx | 1 + src/pages/trade/[pairId].tsx | 9 ++++----- 7 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/components/deposit/Deposit.tsx b/src/components/deposit/Deposit.tsx index 1912a6d..d5ffd87 100644 --- a/src/components/deposit/Deposit.tsx +++ b/src/components/deposit/Deposit.tsx @@ -43,7 +43,7 @@ export default function Deposit() { const handleMax = () => { // set amount as token balance let token = tokens[selectedToken]; - let amount = Big(token.balance).div(10 ** token.decimals); + let amount = Big(token.balance ?? 0).div(10 ** token.decimals); setAmount(amount); }; diff --git a/src/components/deposit/Withdraw.tsx b/src/components/deposit/Withdraw.tsx index 5e6d91f..4b9151f 100644 --- a/src/components/deposit/Withdraw.tsx +++ b/src/components/deposit/Withdraw.tsx @@ -41,7 +41,7 @@ export default function Deposit() { const handleMax = () => { // set amount as token balance let token = tokens[selectedToken]; - let amount = Big(token.tradingBalance).div(10 ** token.decimals); + let amount = Big(token.tradingBalance ?? 0).div(10 ** token.decimals); setAmount(amount); }; diff --git a/src/components/trade/Graph.tsx b/src/components/trade/Graph.tsx index c80c5c4..9784c6d 100644 --- a/src/components/trade/Graph.tsx +++ b/src/components/trade/Graph.tsx @@ -17,7 +17,6 @@ const Graph = ({ pair }) => { if (chart.current && pair) { let exchangeData = pairData[pair?.id]?.exchangeRate ?? []; - console.log(exchangeData); if(!Array.isArray(exchangeData)) { exchangeData = [] } diff --git a/src/components/trade/Market/BuyModal.tsx b/src/components/trade/Market/BuyModal.tsx index 0d61465..7f8ec8a 100644 --- a/src/components/trade/Market/BuyModal.tsx +++ b/src/components/trade/Market/BuyModal.tsx @@ -91,7 +91,7 @@ export default function BuyModal({ _amount, Number.MAX_SAFE_INTEGER.toString(), 1, - orders.map((o) => '0x' + o.id), + orders.map((o) => o.id), ], chain ) diff --git a/src/components/trade/Market/SellModal.tsx b/src/components/trade/Market/SellModal.tsx index 72aed5b..abe57d2 100644 --- a/src/components/trade/Market/SellModal.tsx +++ b/src/components/trade/Market/SellModal.tsx @@ -71,9 +71,9 @@ export default function SellModal({ pair.tokens[0].id, pair.tokens[1].id, _amount, - '0', + pair.exchangeRate, 0, - orders.map((order) => '0x' + order.id), + orders.map((order) => order.id), ], chain ) diff --git a/src/context/DataProvider.tsx b/src/context/DataProvider.tsx index 53f523e..91c0145 100644 --- a/src/context/DataProvider.tsx +++ b/src/context/DataProvider.tsx @@ -131,6 +131,7 @@ function DataProvider({ children }: any) { } if(address) { + console.log('Fetching data...'); getWalletBalances(address, _tokens, chain); fetchPlacedOrders(address, _pairs, chain) fetchCancelledOrders(address, _pairs, chain) diff --git a/src/pages/trade/[pairId].tsx b/src/pages/trade/[pairId].tsx index 12a62e3..ea8c471 100644 --- a/src/pages/trade/[pairId].tsx +++ b/src/pages/trade/[pairId].tsx @@ -13,11 +13,14 @@ import { useEffect, useState } from 'react'; import Exchange from '../../components/trade/Exchange'; import { WalletContext } from '../../context/Wallet'; import Head from 'next/head'; +import { useAccount } from 'wagmi'; const Trade = () => { const { pairs } = useContext(DataContext); const { isConnected } = useContext(WalletContext); + const {isConnected: isEvmConnected} = useAccount(); + const router = useRouter(); const { pairId } = router.query; const [pair, setPair] = useState(null); @@ -32,10 +35,6 @@ const Trade = () => { pairId ) ); - // console.log(pair); - // if (!pair) { - // router.push('/trade') - // } }); return ( @@ -75,7 +74,7 @@ const Trade = () => { - {isConnected && ( + {(isConnected || isEvmConnected) && ( From c962f6193f22ca3d4ee283fd67c00c444fdcea98 Mon Sep 17 00:00:00 2001 From: prasad-kumkar Date: Thu, 17 Nov 2022 15:19:29 +0530 Subject: [PATCH 03/37] aurora --- public/arb.ico | Bin 0 -> 108212 bytes public/eth.png | Bin 0 -> 86443 bytes src/components/ConnectButton.tsx | 45 +++++++++++++++++++++------ src/components/Header.tsx | 2 +- src/components/deposit/Deposit.tsx | 2 +- src/components/trade/Limit/Buy.tsx | 6 ++-- src/components/trade/Limit/Sell.tsx | 6 ++-- src/components/trade/Market/Buy.tsx | 6 ++-- src/components/trade/Market/Sell.tsx | 6 ++-- src/pages/faucet.tsx | 2 +- src/pages/trade/[pairId].tsx | 15 +++++---- src/theme.tsx | 27 ++++++++++++++++ src/utils/const.ts | 2 +- 13 files changed, 87 insertions(+), 32 deletions(-) create mode 100644 public/arb.ico create mode 100644 public/eth.png diff --git a/public/arb.ico b/public/arb.ico new file mode 100644 index 0000000000000000000000000000000000000000..ad476725731ca9ecaaab19531521f73a2f7d8243 GIT binary patch literal 108212 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 literal 0 HcmV?d00001 diff --git a/public/eth.png b/public/eth.png new file mode 100644 index 0000000000000000000000000000000000000000..46e54fe946ee09c69895264bbde38e6cb27457c2 GIT binary patch literal 86443 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⪙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

^7HD&D@nAw38XPj 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 literal 0 HcmV?d00001 diff --git a/src/components/ConnectButton.tsx b/src/components/ConnectButton.tsx index df35550..5e7bf28 100644 --- a/src/components/ConnectButton.tsx +++ b/src/components/ConnectButton.tsx @@ -115,7 +115,7 @@ const ConnectButton = ({}) => { // bgGradient="linear(to-r, #E11860, #CB1DC3)" // color="gray.100" size="sm" _hover={{ bg: 'gray.800' }} onClick={onOpen}>{(tronAddress)?.slice(0, 6) + "..." + (tronAddress)?.slice(-4)} // -

+ { bgColor={'gray.50'} color={'gray.900'} onMouseEnter={onOpen} - onMouseLeave={onClose}> + onMouseLeave={onClose} + borderRadius={0}> @@ -217,11 +218,11 @@ const ConnectButton = ({}) => { )} - + - + {/* */} - + Choose a network @@ -248,7 +249,7 @@ const ConnectButton = ({}) => { /> - + */} + + - {/* */} + - - - - - - - - - {(response) && ( - - - - - - {response} - - {hash && - - View on explorer - - } - - - - )} - - - ); -} diff --git a/src/components/lever/borrow/BorrowModal.tsx b/src/components/lever/borrow/BorrowModal.tsx new file mode 100644 index 0000000..44d11b0 --- /dev/null +++ b/src/components/lever/borrow/BorrowModal.tsx @@ -0,0 +1,360 @@ +import { + Box, + Button, + InputGroup, + InputLeftElement, + InputRightElement, + useDisclosure, + Text, + Tooltip, + InputLeftAddon, + InputRightAddon, + Flex, + Alert, + AlertIcon, + Link, + IconButton, +} from "@chakra-ui/react"; +import React, { useContext, useState } from "react"; +import Image from "next/image"; +import { + Modal, + ModalOverlay, + ModalContent, + ModalHeader, + ModalFooter, + ModalBody, + ModalCloseButton, +} from "@chakra-ui/react"; + +import { Input } from "@chakra-ui/react"; + +import { + Slider, + SliderTrack, + SliderFilledTrack, + SliderThumb, + SliderMark, +} from "@chakra-ui/react"; + +const imageIds = { + ETH: "1027", + BTC: "1", + USDC: "3408", + DAI: "4943", +}; + +import { + NumberInput, + NumberInputField, + NumberInputStepper, + NumberIncrementStepper, + NumberDecrementStepper, +} from "@chakra-ui/react"; +import { getContract, send } from "../../../utils/contract"; +import { DataContext } from "../../../context/DataProvider"; +import { useAccount } from "wagmi"; +import { WalletContext } from "../../../context/Wallet"; +import { ethers } from 'ethers'; +import { ADDRESSES } from '../../../utils/const'; +import Big from "big.js"; +import { ChainID } from "../../../utils/chains"; +import axios from "axios"; +import { PlusSquareIcon } from "@chakra-ui/icons"; + +export default function LendModal({ market, token }) { + const { isOpen, onOpen, onClose } = useDisclosure(); + const [sliderValue, setSliderValue] = React.useState(0); + const [showTooltip, setShowTooltip] = React.useState(false); + const [inputAmount, setInputAmount] = useState("0"); + + const [loading, setLoading] = React.useState(false); + const [response, setResponse] = React.useState(null); + const [hash, setHash] = React.useState(null); + const [confirmed, setConfirmed] = React.useState(false); + + const { chain, explorer } = useContext(DataContext); + const { isConnected: isEvmConnected, address: EvmAddress } = useAccount(); + const { isConnected, address: TronAddress } = useContext(WalletContext); + + const updateSliderValue = (value: number) => { + setSliderValue(value); + setInputAmount( + ( + (value * (token?.balance / 10 ** token?.decimals)) / + 100 + ).toString() + ); + }; + + const updateMax = () => { + setInputAmount((token?.balance / 10 ** token?.decimals).toString()); + setSliderValue(100); + }; + + const updateAmount = (value: string) => { + setInputAmount(value); + // setSliderValue(Number(value) * 100 / (token?.balance / 10 ** token?.decimals)); + }; + + const amountExceedsBalance = () => { + return Number(inputAmount) > token?.balance / 10 ** token?.decimals + } + + const deposit = async () => { + setLoading(true); + setConfirmed(false); + setHash(null); + setResponse(''); + let amount = Big(inputAmount).times(10 ** token?.decimals); + const ctoken = await getContract('CToken', chain, market?.id); + send(ctoken, 'mint', [amount.toString()], chain) + .then(async (res: any) => { + setLoading(false); + setResponse('Transaction sent! Waiting for confirmation...'); + if (chain == ChainID.NILE) { + setHash(res); + checkResponse(res); + } else { + setHash(res.hash); + await res.wait(1); + setConfirmed(true); + setResponse('Transaction Successful!'); + } + }) + .catch((err: any) => { + setLoading(false); + setConfirmed(true); + setResponse('Transaction failed. Please try again!'); + }); + } + + // check response in intervals + const checkResponse = (tx_id: string) => { + axios + .get( + 'https://nile.trongrid.io/wallet/gettransactionbyid?value=' + + tx_id + ) + .then((res) => { + if (!res.data.ret) { + setTimeout(() => { + checkResponse(tx_id); + }, 2000); + } else { + setConfirmed(true); + if (res.data.ret[0].contractRet == 'SUCCESS') { + setResponse('Transaction Successful!'); + } else { + setResponse('Transaction Failed. Please try again.'); + } + } + }) + .catch((err: any) => { + setLoading(false); + }); + }; + + const approve = async () => { + setLoading(true) + const cToken = await getContract('ERC20', chain, market?.inputToken.id) + send(cToken, 'approve', [market?.id, ethers.constants.MaxUint256], chain) + .then((res: any) => { + console.log(res) + setLoading(false) + }) + } + + const _onClose = () => { + setInputAmount('0'); + setLoading(false); + setResponse(null); + setSliderValue(0); + onClose(); + }; + + return ( + <> + + } variant={'ghost'} onClick={onOpen} aria-label={""}/> + + + + + + + Borrowing {market?.inputToken.name} + + + + + {Number(inputAmount) < Number(market?.allowance) ? + + + + Balance {token?.balance / 10 ** token?.decimals} + + + + + {""} + + updateAmount(e)} + value={inputAmount} + > + + + + + + + + + + + + updateSliderValue(v)} + value={sliderValue} + onMouseEnter={() => setShowTooltip(true)} + onMouseLeave={() => setShowTooltip(false)} + > + + 25% + + + 50% + + + 75% + + + + + + + + + + + + {response && ( + + + + + + {response} + + {hash && + + View on explorer + + } + + + + ) + } + + + + : + + {""} + + To Deposit {token?.name} tokens to zexe, you need to enable it first + + + + + + } + + + + + ); +} diff --git a/src/components/lever/borrow/BorrowTable.tsx b/src/components/lever/borrow/BorrowTable.tsx new file mode 100644 index 0000000..be271c4 --- /dev/null +++ b/src/components/lever/borrow/BorrowTable.tsx @@ -0,0 +1,166 @@ +import React from "react"; +import { + Table, + Thead, + Tbody, + Tfoot, + Tr, + Th, + Td, + TableCaption, + TableContainer, + Box, + Flex, + Text, + Button, +} from "@chakra-ui/react"; + +import Image from "next/image"; +import { LeverDataContext } from "../../../context/LeverDataProvider"; +import { dollarFormatter } from "../../../utils/formatters"; + +import LendModal from "./RepayModal"; +import BorrowModal from "./BorrowModal"; +import { DataContext } from "../../../context/DataProvider"; + +const imageIds = { + ETH: "1027", + BTC: "1", + USDC: "3408", + DAI: "4943", +}; + +export default function LendingTable() { + const { markets } = React.useContext(LeverDataContext); + const { tokens } = React.useContext(DataContext); + + const token = (tokenId: string) => { + return tokens.find( + (token) => token.id.toLowerCase() === tokenId.toLowerCase() + ); + }; + + return ( + <> + {tokens.length > 0 && ( + + + + + + + + + + + + + + {markets.map((market) => { + return ( + + + + + + + + + + ); + })} + +
Asset + Borrow APR (%) + Liquidity
+ + {""} + + + {" "} + { + market + .inputToken + .name + }{" "} + ( + { + market + .inputToken + .symbol + } + ){" "} + + + {" "} + {dollarFormatter( + null + ).format( + market + .inputToken + .lastPriceUSD + )}{" "} + + + + + + {parseFloat( + market.rates[1].rate + ).toFixed(2)}{" "} + % + + + +{" "} + {parseFloat("0.0").toFixed( + 2 + )}{" "} + % + + + {dollarFormatter(null).format( + market.totalDepositBalanceUSD + )} + + + + + +
+
+
+ )} + + ); +} diff --git a/src/components/lever/borrow/RepayModal.tsx b/src/components/lever/borrow/RepayModal.tsx new file mode 100644 index 0000000..b28caa5 --- /dev/null +++ b/src/components/lever/borrow/RepayModal.tsx @@ -0,0 +1,413 @@ +import { + Box, + Button, + InputGroup, + InputLeftElement, + InputRightElement, + useDisclosure, + Text, + Tooltip, + InputLeftAddon, + InputRightAddon, + Flex, + Alert, + AlertIcon, + Link, + IconButton, +} from "@chakra-ui/react"; +import React, { useContext, useState } from "react"; +import Image from "next/image"; +import { + Modal, + ModalOverlay, + ModalContent, + ModalHeader, + ModalFooter, + ModalBody, + ModalCloseButton, +} from "@chakra-ui/react"; + +import { Input } from "@chakra-ui/react"; + +import { + Slider, + SliderTrack, + SliderFilledTrack, + SliderThumb, + SliderMark, +} from "@chakra-ui/react"; + +const imageIds = { + ETH: "1027", + BTC: "1", + USDC: "3408", + DAI: "4943", +}; + +import { + NumberInput, + NumberInputField, + NumberInputStepper, + NumberIncrementStepper, + NumberDecrementStepper, +} from "@chakra-ui/react"; +import { getContract, send } from "../../../utils/contract"; +import { DataContext } from "../../../context/DataProvider"; +import { useAccount } from "wagmi"; +import { WalletContext } from "../../../context/Wallet"; +import { ethers } from "ethers"; +import { ADDRESSES } from "../../../utils/const"; +import Big from "big.js"; +import { ChainID } from "../../../utils/chains"; +import axios from "axios"; +import { MinusIcon } from "@chakra-ui/icons"; + +export default function LendModal({ market, token }) { + const { isOpen, onOpen, onClose } = useDisclosure(); + const [sliderValue, setSliderValue] = React.useState(0); + const [showTooltip, setShowTooltip] = React.useState(false); + const [inputAmount, setInputAmount] = useState("0"); + + const [loading, setLoading] = React.useState(false); + const [response, setResponse] = React.useState(null); + const [hash, setHash] = React.useState(null); + const [confirmed, setConfirmed] = React.useState(false); + + const { chain, explorer } = useContext(DataContext); + const { isConnected: isEvmConnected, address: EvmAddress } = useAccount(); + const { isConnected, address: TronAddress } = useContext(WalletContext); + + const updateSliderValue = (value: number) => { + setSliderValue(value); + setInputAmount( + ( + (value * (token?.balance / 10 ** token?.decimals)) / + 100 + ).toString() + ); + }; + + const updateMax = () => { + setInputAmount((token?.balance / 10 ** token?.decimals).toString()); + setSliderValue(100); + }; + + const updateAmount = (value: string) => { + setInputAmount(value); + // setSliderValue(Number(value) * 100 / (token?.balance / 10 ** token?.decimals)); + }; + + const amountExceedsBalance = () => { + return Number(inputAmount) > token?.balance / 10 ** token?.decimals; + }; + + const deposit = async () => { + setLoading(true); + setConfirmed(false); + setHash(null); + setResponse(""); + let amount = Big(inputAmount).times(10 ** token?.decimals); + const ctoken = await getContract("CToken", chain, market?.id); + send(ctoken, "mint", [amount.toString()], chain) + .then(async (res: any) => { + setLoading(false); + setResponse("Transaction sent! Waiting for confirmation..."); + if (chain == ChainID.NILE) { + setHash(res); + checkResponse(res); + } else { + setHash(res.hash); + await res.wait(1); + setConfirmed(true); + setResponse("Transaction Successful!"); + } + }) + .catch((err: any) => { + setLoading(false); + setConfirmed(true); + setResponse("Transaction failed. Please try again!"); + }); + }; + + // check response in intervals + const checkResponse = (tx_id: string) => { + axios + .get( + "https://nile.trongrid.io/wallet/gettransactionbyid?value=" + + tx_id + ) + .then((res) => { + if (!res.data.ret) { + setTimeout(() => { + checkResponse(tx_id); + }, 2000); + } else { + setConfirmed(true); + if (res.data.ret[0].contractRet == "SUCCESS") { + setResponse("Transaction Successful!"); + } else { + setResponse("Transaction Failed. Please try again."); + } + } + }) + .catch((err: any) => { + setLoading(false); + }); + }; + + const approve = async () => { + setLoading(true); + const cToken = await getContract("ERC20", chain, market?.inputToken.id); + send( + cToken, + "approve", + [market?.id, ethers.constants.MaxUint256], + chain + ).then((res: any) => { + console.log(res); + setLoading(false); + }); + }; + + const _onClose = () => { + setInputAmount("0"); + setLoading(false); + setResponse(null); + setSliderValue(0); + onClose(); + }; + + return ( + <> + + } + variant={"ghost"} + onClick={onOpen} + aria-label={""} + /> + + + + + + + Depositing {market?.inputToken.name} + + + + {Number(inputAmount) < Number(market?.allowance) ? ( + + + Balance{" "} + {token?.balance / 10 ** token?.decimals} + + + + + {""} + + updateAmount(e)} + value={inputAmount} + > + + + + + + + + + + + + updateSliderValue(v)} + value={sliderValue} + onMouseEnter={() => setShowTooltip(true)} + onMouseLeave={() => setShowTooltip(false)} + > + + 25% + + + 50% + + + 75% + + + + + + + + + + + + {response && ( + + + + + + + {response} + + {hash && ( + + + View on explorer + + + )} + + + + + )} + + ) : ( + + + {""} + + + To Deposit {token?.name} tokens to + zexe, you need to enable it first{" "} + + + + + + + )} + + + + + ); +} diff --git a/src/components/lever/lend/LendModal.tsx b/src/components/lever/lend/LendModal.tsx new file mode 100644 index 0000000..cabae73 --- /dev/null +++ b/src/components/lever/lend/LendModal.tsx @@ -0,0 +1,400 @@ +import { + Box, + Button, + InputGroup, + InputLeftElement, + InputRightElement, + useDisclosure, + Text, + Tooltip, + InputLeftAddon, + InputRightAddon, + Flex, + Alert, + AlertIcon, + Link, +} from "@chakra-ui/react"; +import React, { useContext, useState } from "react"; +import Image from "next/image"; +import { + Modal, + ModalOverlay, + ModalContent, + ModalHeader, + ModalFooter, + ModalBody, + ModalCloseButton, +} from "@chakra-ui/react"; + +import { Input, IconButton } from '@chakra-ui/react'; + +import { + Slider, + SliderTrack, + SliderFilledTrack, + SliderThumb, + SliderMark, +} from "@chakra-ui/react"; + + +import { + NumberInput, + NumberInputField, + NumberInputStepper, + NumberIncrementStepper, + NumberDecrementStepper, +} from "@chakra-ui/react"; +import { getContract, send } from "../../../utils/contract"; +import { DataContext } from "../../../context/DataProvider"; +import { useAccount } from "wagmi"; +import { WalletContext } from "../../../context/Wallet"; +import { ethers } from "ethers"; +import { ADDRESSES, imageIds } from "../../../utils/const"; +import Big from "big.js"; +import { ChainID } from "../../../utils/chains"; +import axios from "axios"; +import { PlusSquareIcon } from "@chakra-ui/icons"; + +export default function LendModal({ market, token }) { + const { isOpen, onOpen, onClose } = useDisclosure(); + const [sliderValue, setSliderValue] = React.useState(0); + const [showTooltip, setShowTooltip] = React.useState(false); + const [inputAmount, setInputAmount] = useState("0"); + + const [loading, setLoading] = React.useState(false); + const [response, setResponse] = React.useState(null); + const [hash, setHash] = React.useState(null); + const [confirmed, setConfirmed] = React.useState(false); + + const { chain, explorer } = useContext(DataContext); + const { isConnected: isEvmConnected, address: EvmAddress } = useAccount(); + const { isConnected, address: TronAddress } = useContext(WalletContext); + + const updateSliderValue = (value: number) => { + setSliderValue(value); + setInputAmount( + ( + (value * (token?.balance / 10 ** token?.decimals)) / + 100 + ).toString() + ); + }; + + const updateMax = () => { + setInputAmount((token?.balance / 10 ** token?.decimals).toString()); + setSliderValue(100); + }; + + const updateAmount = (value: string) => { + setInputAmount(value); + // setSliderValue(Number(value) * 100 / (token?.balance / 10 ** token?.decimals)); + }; + + const amountExceedsBalance = () => { + return Number(inputAmount) > token?.balance / 10 ** token?.decimals; + }; + + const deposit = async () => { + setLoading(true); + setConfirmed(false); + setHash(null); + setResponse(""); + let amount = Big(inputAmount).times(10 ** token?.decimals); + const ctoken = await getContract("CToken", chain, market?.id); + send(ctoken, "mint", [amount.toString()], chain) + .then(async (res: any) => { + setLoading(false); + setResponse("Transaction sent! Waiting for confirmation..."); + if (chain == ChainID.NILE) { + setHash(res); + checkResponse(res); + } else { + setHash(res.hash); + await res.wait(1); + setConfirmed(true); + setResponse("Transaction Successful!"); + } + }) + .catch((err: any) => { + setLoading(false); + setConfirmed(true); + setResponse("Transaction failed. Please try again!"); + }); + }; + + // check response in intervals + const checkResponse = (tx_id: string) => { + axios + .get( + "https://nile.trongrid.io/wallet/gettransactionbyid?value=" + + tx_id + ) + .then((res) => { + if (!res.data.ret) { + setTimeout(() => { + checkResponse(tx_id); + }, 2000); + } else { + setConfirmed(true); + if (res.data.ret[0].contractRet == "SUCCESS") { + setResponse("Transaction Successful!"); + } else { + setResponse("Transaction Failed. Please try again."); + } + } + }) + .catch((err: any) => { + setLoading(false); + }); + }; + + const approve = async () => { + setLoading(true); + const cToken = await getContract("ERC20", chain, market?.inputToken.id); + send( + cToken, + "approve", + [market?.id, ethers.constants.MaxUint256], + chain + ).then((res: any) => { + console.log(res); + setLoading(false); + }); + }; + + const _onClose = () => { + setInputAmount("0"); + setLoading(false); + setResponse(null); + setSliderValue(0); + onClose(); + }; + + return ( + <> + + } variant={'ghost'} onClick={onOpen} aria-label={""}/> + + + + + + + Depositing {market?.inputToken.name} + + + + {Number(inputAmount) < Number(market?.allowance) ? ( + + + Balance{" "} + {token?.balance / 10 ** token?.decimals} + + + + + {""} + + updateAmount(e)} + value={inputAmount} + > + + + + + + + + + + + + updateSliderValue(v)} + value={sliderValue} + onMouseEnter={() => setShowTooltip(true)} + onMouseLeave={() => setShowTooltip(false)} + > + + 25% + + + 50% + + + 75% + + + + + + + + + + + + {response && ( + + + + + + + {response} + + {hash && ( + + + View on explorer + + + )} + + + + + )} + + ) : ( + + + {""} + + + To Deposit {token?.name} tokens to + zexe, you need to enable it first{" "} + + + + + + + )} + + + + + ); +} diff --git a/src/components/lever/lend/LendTable.tsx b/src/components/lever/lend/LendTable.tsx new file mode 100644 index 0000000..e5c3ea4 --- /dev/null +++ b/src/components/lever/lend/LendTable.tsx @@ -0,0 +1,169 @@ +import React from "react"; +import { + Table, + Thead, + Tbody, + Tfoot, + Tr, + Th, + Td, + TableCaption, + TableContainer, + Box, + Flex, + Text, + Button, +} from "@chakra-ui/react"; + +import Image from "next/image"; +import { LeverDataContext } from "../../../context/LeverDataProvider"; +import { dollarFormatter } from "../../../utils/formatters"; +import { BiPlus } from "react-icons/bi"; +import { PlusSquareIcon } from "@chakra-ui/icons"; +import LendModal from "./LendModal"; +import BorrowModal from "./WithdrawModal"; +import { DataContext } from "../../../context/DataProvider"; +import useEffect from "react"; + +const imageIds = { + ETH: "1027", + BTC: "1", + USDC: "3408", + DAI: "4943", +}; + +export default function LendingTable() { + const { markets } = React.useContext(LeverDataContext); + const { tokens } = React.useContext(DataContext); + + const token = (tokenId: string) => { + return tokens.find( + (token) => token.id.toLowerCase() === tokenId.toLowerCase() + ); + }; + + return ( + <> + {tokens.length > 0 && ( + + + + + + + + + + + + + + {markets.map((market) => { + return ( + + + + + + + + + ); + })} + +
Asset + Supply APR (%) + + Total Deposits +
+ + {""} + + + {" "} + { + market + .inputToken + .name + }{" "} + ( + { + market + .inputToken + .symbol + } + ){" "} + + + {" "} + {dollarFormatter( + null + ).format( + market + .inputToken + .lastPriceUSD + )}{" "} + + + + + + {parseFloat( + market.rates[0].rate + ).toFixed(2)}{" "} + % + + + +{" "} + {parseFloat("0.0").toFixed( + 2 + )}{" "} + % + + + {dollarFormatter(null).format( + market.totalDepositBalanceUSD + )} + + + + + +
+
+
+ )} + + ); +} diff --git a/src/components/lever/lend/WithdrawModal.tsx b/src/components/lever/lend/WithdrawModal.tsx new file mode 100644 index 0000000..51ef131 --- /dev/null +++ b/src/components/lever/lend/WithdrawModal.tsx @@ -0,0 +1,414 @@ +import { + Box, + Button, + InputGroup, + InputLeftElement, + InputRightElement, + useDisclosure, + Text, + Tooltip, + InputLeftAddon, + InputRightAddon, + Flex, + Alert, + AlertIcon, + Link, + IconButton, +} from "@chakra-ui/react"; +import React, { useContext, useState } from "react"; +import Image from "next/image"; +import { + Modal, + ModalOverlay, + ModalContent, + ModalHeader, + ModalFooter, + ModalBody, + ModalCloseButton, +} from "@chakra-ui/react"; + +import { Input } from "@chakra-ui/react"; + +import { + Slider, + SliderTrack, + SliderFilledTrack, + SliderThumb, + SliderMark, +} from "@chakra-ui/react"; + +const imageIds = { + ETH: "1027", + BTC: "1", + USDC: "3408", + DAI: "4943", +}; + +import { + NumberInput, + NumberInputField, + NumberInputStepper, + NumberIncrementStepper, + NumberDecrementStepper, +} from "@chakra-ui/react"; +import { getContract, send } from "../../../utils/contract"; +import { DataContext } from "../../../context/DataProvider"; +import { useAccount } from "wagmi"; +import { WalletContext } from "../../../context/Wallet"; +import { ethers } from "ethers"; +import Big from "big.js"; +import { ChainID } from "../../../utils/chains"; +import axios from "axios"; +import { AiFillMinusSquare } from "react-icons/ai"; +import { MinusIcon } from "@chakra-ui/icons"; + +export default function WithdrawModal({ market, token }) { + const { isOpen, onOpen, onClose } = useDisclosure(); + const [sliderValue, setSliderValue] = React.useState(0); + const [showTooltip, setShowTooltip] = React.useState(false); + const [inputAmount, setInputAmount] = useState("0"); + + const [loading, setLoading] = React.useState(false); + const [response, setResponse] = React.useState(null); + const [hash, setHash] = React.useState(null); + const [confirmed, setConfirmed] = React.useState(false); + + const { chain, explorer } = useContext(DataContext); + const { isConnected: isEvmConnected, address: EvmAddress } = useAccount(); + const { isConnected, address: TronAddress } = useContext(WalletContext); + + const updateSliderValue = (value: number) => { + setSliderValue(value); + setInputAmount( + ( + (value * depositBalance() / 100).toString() + )); + }; + + const updateMax = () => { + setInputAmount(depositBalance().toString()); + setSliderValue(100); + }; + + const updateAmount = (value: string) => { + setInputAmount(value); + // setSliderValue(Number(value) * 100 / (token?.balance / 10 ** token?.decimals)); + }; + + const amountExceedsBalance = () => { + return Number(inputAmount) > depositBalance(); + }; + + const deposit = async () => { + setLoading(true); + setConfirmed(false); + setHash(null); + setResponse(""); + let amount = Big(inputAmount).div(market?.exchangeRate).times(10 ** (token?.decimals-10)); + console.log(amount.toString()); + const ctoken = await getContract("CToken", chain, market?.id); + send(ctoken, "redeem", [amount.toString()], chain) + .then(async (res: any) => { + setLoading(false); + setResponse("Transaction sent! Waiting for confirmation..."); + if (chain == ChainID.NILE) { + setHash(res); + checkResponse(res); + } else { + setHash(res.hash); + await res.wait(1); + setConfirmed(true); + setResponse("Transaction Successful!"); + } + }) + .catch((err: any) => { + setLoading(false); + setConfirmed(true); + setResponse("Transaction failed. Please try again!"); + }); + }; + + // check response in intervals + const checkResponse = (tx_id: string) => { + axios + .get( + "https://nile.trongrid.io/wallet/gettransactionbyid?value=" + + tx_id + ) + .then((res) => { + if (!res.data.ret) { + setTimeout(() => { + checkResponse(tx_id); + }, 2000); + } else { + setConfirmed(true); + if (res.data.ret[0].contractRet == "SUCCESS") { + setResponse("Transaction Successful!"); + } else { + setResponse("Transaction Failed. Please try again."); + } + } + }) + .catch((err: any) => { + setLoading(false); + }); + }; + + const approve = async () => { + setLoading(true); + const cToken = await getContract("ERC20", chain, market?.inputToken.id); + send( + cToken, + "approve", + [market?.id, ethers.constants.MaxUint256], + chain + ).then((res: any) => { + console.log(res); + setLoading(false); + }); + }; + + const _onClose = () => { + setInputAmount("0"); + setLoading(false); + setResponse(null); + setSliderValue(0); + onClose(); + }; + + const depositBalance = () => market?.cTokenBalance * market?.exchangeRate / 10 ** (token?.decimals - 10); + + return ( + <> + + } + variant={"ghost"} + onClick={onOpen} + aria-label={""} + /> + + + + + + + Withdrawing {market?.inputToken.name} + + + + {Number(inputAmount) < Number(market?.allowance) ? ( + + + Balance{" "} + {depositBalance()} + + + + + {""} + + updateAmount(e)} + value={inputAmount} + > + + + + + + + + + + + + updateSliderValue(v)} + value={sliderValue} + onMouseEnter={() => setShowTooltip(true)} + onMouseLeave={() => setShowTooltip(false)} + > + + 25% + + + 50% + + + 75% + + + + + + + + + + + + {response && ( + + + + + + + {response} + + {hash && ( + + + View on explorer + + + )} + + + + + )} + + ) : ( + + + {""} + + + To Deposit {token?.name} tokens to + zexe, you need to enable it first{" "} + + + + + + + )} + + + + + ); +} diff --git a/src/components/trade/Exchange.tsx b/src/components/trade/Exchange.tsx index b5a8fa4..ad3f4a8 100644 --- a/src/components/trade/Exchange.tsx +++ b/src/components/trade/Exchange.tsx @@ -2,10 +2,15 @@ import { Box, Tooltip } from '@chakra-ui/react'; import React from 'react'; import { Tabs, TabList, TabPanels, Tab, TabPanel } from '@chakra-ui/react'; -import LimitOrder from './Limit/index'; -import MarketOrder from './Market'; +import LimitOrder from './new_orders/Limit'; +import MarketOrder from './new_orders/Market'; const Exchange = ({pair}) => { + const [hydrated, setHydrated] = React.useState(false); + React.useEffect(() => { + setHydrated(true); + }, []); + if (!hydrated) return <>; return { - if (amount == '0' || amount == '' || !token1?.tradingBalance) - return false; - if (Number(amount) && token1?.tradingBalance) - return Big(amount).gt( - Big(token1?.tradingBalance).div(10 ** token1?.decimals) - ); - }; - - const amountExceedsMin = () => { - if (token0Amount == '0' || token0Amount == '' || !token0 || !pair) - return false; - if (Number(token0Amount) && pair?.minToken0Order && token0.decimals) - return Big(token0Amount).lt( - Big(pair?.minToken0Order).div(10 ** token0.decimals) - ); - }; - - const buy = async () => { - setLoading(true); - setConfirmed(false); - setHash(null); - setResponse(''); - let _amount = Big(token0Amount) - .times(10 ** token0.decimals) - .toFixed(0); - - let exchange = await getContract('Exchange', chain); - send( - exchange, - 'executeAndPlaceOrder', - [ - pair.tokens[0].id, - pair.tokens[1].id, - _amount, - (Number(price) * 10 ** pair.exchangeRateDecimals).toFixed(0), - 1, - orders.map((o) => (chain == ChainID.NILE ? '0x' : '') + o.id), - ], - chain - ) - .then(async (res: any) => { - setLoading(false); - setResponse('Transaction sent! Waiting for confirmation...'); - if (chain == ChainID.NILE) { - setHash(res); - checkResponse(res); - } else { - setHash(res.hash); - await res.wait(1); - setConfirmed(true); - setResponse('Transaction Successful!'); - } - }) - .catch((err: any) => { - setLoading(false); - setConfirmed(true); - setResponse('Transaction failed. Please try again!'); - }); - }; - - // check response in intervals - const checkResponse = (tx_id: string) => { - axios - .get( - 'https://nile.trongrid.io/wallet/gettransactionbyid?value=' + - tx_id - ) - .then((res) => { - if (!res.data.ret) { - setTimeout(() => { - checkResponse(tx_id); - }, 2000); - } else { - setConfirmed(true); - if (res.data.ret[0].contractRet == 'SUCCESS') { - setResponse('Transaction Successful!'); - } else { - setResponse('Transaction Failed. Please try again.'); - } - } - }); - }; - - const _onOpen = () => { - onOpen(); - let _amount = Big(token0Amount) - .times(10 ** token0.decimals) - .toFixed(0); - - axios - .get(Endpoints[chain]+'matchedorders/' + pair.id, { - params: { - amount: _amount, - exchange_rate: Big(price).times( - 10 ** pair.exchangeRateDecimals - ), - order_type: 1, - }, - }) - .then((resp) => { - let orders = resp.data.data; - let ordersToExecute = []; - let _orderToPlace = token0Amount * 10 ** token0.decimals; - let _expectedOutput = Big(0); - for (let i in orders) { - let execAmount = Math.min(_orderToPlace, orders[i].amount); - orders[i].amount = execAmount; - ordersToExecute.push(orders[i]); - _orderToPlace = Big(_orderToPlace) - .minus(execAmount) - .toFixed(0); - _expectedOutput = _expectedOutput.plus( - Big(execAmount) - .times(orders[i].exchangeRate) - .div(10 ** pair.exchangeRateDecimals) - ); - } - _expectedOutput = _expectedOutput.plus( - Big(_orderToPlace).times(price) - ); - if (Number(_orderToPlace) < Number(pair?.minToken0Order)) { - setOffsetAmount(Number(_orderToPlace)); - } - setOrderToPlace( - Number(_orderToPlace) > Number(pair?.minToken0Order) - ? _orderToPlace - : 0 - ); - setOrders(ordersToExecute); - setExpectedOutput(_expectedOutput.toFixed(0)); - }); - }; - - const _onClose = () => { - setOrderToPlace(0); - setLoading(false); - setResponse(null); - setOrders([]); - setOffsetAmount(0); - onClose(); - }; - - return ( - <> - - - - - - Review - - - Executing Orders - {orders.map((o) => { - if (o.amount > 0) - return ( - - {/* Order ID */} - ID: {o.id} - - - {tokenFormatter(null).format( - o.amount / - 10 ** - pair.tokens[0].decimals - )}{' '} - {pair.tokens[0].symbol} @{' '} - {tokenFormatter(null).format( - o.exchangeRate / - 10 ** - pair.exchangeRateDecimals - )}{' '} - {pair.tokens[1].symbol} - - - ); - else return null; - })} - {orders.length == 0 && ( - - No orders to execute - - )} - Placing Orders - {orderToPlace > 0 ? ( - - OrderType: BUY - - {orderToPlace / 10 ** token0?.decimals}{' '} - {token0?.symbol} @ {price} {token1?.symbol} - - - ) : ( - - No limit order to place - - )} - - - Estimated Output: {token0Amount} {token0?.symbol} - - - Total Amount:{' '} - {expectedOutput / 10 ** token1?.decimals}{' '} - {token1?.symbol} - - - - - - {response ? ( - - - - - - - {response} - - {hash && - {' '} - - View on explorer - - } - - - - - - ) : ( - <> - - {' '} - - )} - - - - - - ); -} diff --git a/src/components/trade/Orders/OrderBook.tsx b/src/components/trade/Orders/OrderBook.tsx index 58873fb..03d53c1 100644 --- a/src/components/trade/Orders/OrderBook.tsx +++ b/src/components/trade/Orders/OrderBook.tsx @@ -10,7 +10,11 @@ import { AppDataContext } from '../../../context/AppData'; const Order = ({ order, index, total, pair, orderType }) => { const {setExchangeRate} = useContext(AppDataContext); return ( - setExchangeRate(order.exchangeRate/(10**pair?.exchangeRateDecimals))} _hover={{ cursor: 'pointer' }}> + setExchangeRate(order.exchangeRate/(10**18))} _hover={{ cursor: 'pointer' }} + bgGradient={'linear(to-r,' + (orderType == 'BUY' ? 'rgba(24, 176, 95, 100%), rgba(24, 176, 95, 100%))' : 'rgba(200, 50, 50, 100%), rgba(200, 50, 50, 100%))')} + bgSize={'1%'} + bgRepeat='no-repeat' + > { py={'3px'} px={4} _hover={{ bgColor: orderType == 'BUY' ? 'rgba(24, 176, 95, 20%)' : 'rgba(200, 50, 50, 20%)' }} - bgGradient={'linear(to-r,' + (orderType == 'BUY' ? 'rgba(24, 176, 95, 40%), rgba(24, 176, 95, 30%))' : 'rgba(200, 50, 50, 40%), rgba(200, 50, 50, 30%))')} - bgSize={100*order.amount/total + '%'} + bgGradient={'linear(to-r,' + (orderType == 'BUY' ? 'rgba(24, 176, 95, 20%), rgba(24, 176, 95, 20%))' : 'rgba(200, 50, 50, 20%), rgba(200, 50, 50, 20%))')} + + bgSize={300*order.amount/total + '%'} bgRepeat='no-repeat' > {tokenFormatter(null).format(order.amount/(10**pair?.tokens[0].decimals))} - {tokenFormatter(null).format((order.amount/(10**(pair?.tokens[0].decimals)))*(order.exchangeRate/(10**pair?.exchangeRateDecimals)))} + {tokenFormatter(null).format((order.amount/(10**(pair?.tokens[0].decimals)))*(order.exchangeRate/(10**18)))} - {tokenFormatter(pair?.exchangeRateDecimals).format(order.exchangeRate/(10**pair?.exchangeRateDecimals))} + {tokenFormatter(pair?.exchangeRateDecimals).format(order.exchangeRate/(10**18))} - + + ); }; @@ -81,7 +87,7 @@ export default function OrderBook({ pair }) { {pair?.priceDiff < 0 ? : } - {pair?.priceDiff/ (10**pair?.exchangeRateDecimals)} + {pair?.priceDiff/ (10**18)} - {tokenFormatter(pair?.exchangeRateDecimals).format(pair?.exchangeRate / (10**pair?.exchangeRateDecimals))} + {tokenFormatter(pair?.exchangeRateDecimals).format(pair?.exchangeRate / (10**18))} diff --git a/src/components/trade/Orders/OrderHistory.tsx b/src/components/trade/Orders/OrderHistory.tsx index 38b9c79..e760193 100644 --- a/src/components/trade/Orders/OrderHistory.tsx +++ b/src/components/trade/Orders/OrderHistory.tsx @@ -16,10 +16,10 @@ const Order = ({ order, pair, index }) => { {tokenFormatter(null).format(order.fillAmount/(10**pair?.tokens[0].decimals))} - {tokenFormatter(null).format(order.fillAmount*(order.exchangeRate/(10**pair.exchangeRateDecimals))/(10**pair?.tokens[0].decimals))} + {tokenFormatter(null).format(order.fillAmount*(order.exchangeRate/(10**18))/(10**pair?.tokens[0].decimals))} - {tokenFormatter(pair.exchangeRateDecimals).format(order.exchangeRate/(10**pair.exchangeRateDecimals))} + {tokenFormatter(pair.exchangeRateDecimals).format(order.exchangeRate/(10**18))} ); diff --git a/src/components/trade/TitlePanel.tsx b/src/components/trade/TitlePanel.tsx index 7bdbed5..83ce5f9 100644 --- a/src/components/trade/TitlePanel.tsx +++ b/src/components/trade/TitlePanel.tsx @@ -36,7 +36,7 @@ export default function TitlePanel({ pair }) { {/* Price */} - {tokenFormatter(pair?.exchangeRateDecimals).format(pair?.exchangeRate / (10**pair?.exchangeRateDecimals))} + {tokenFormatter(pair?.exchangeRateDecimals).format(pair?.exchangeRate / (10**18))} {tokenFormatter(null).format(pairStats[pair?.id]?.[0].changeInER)}% @@ -51,7 +51,7 @@ export default function TitlePanel({ pair }) { Trading Volume - {dollarFormatter(null).format(pairStats[pair?.id]?.[0].volume * pair?.exchangeRate / (10**pair?.exchangeRateDecimals))} + {dollarFormatter(null).format(pairStats[pair?.id]?.[0].volume * pair?.exchangeRate / (10**18))} diff --git a/src/components/trade/TokensPanel/AllTokens.tsx b/src/components/trade/TokensPanel/AllTokens.tsx index 0dcc98b..bcd645c 100644 --- a/src/components/trade/TokensPanel/AllTokens.tsx +++ b/src/components/trade/TokensPanel/AllTokens.tsx @@ -33,8 +33,8 @@ export default function AllTokens({search}) { = 0 ? 'green2' : 'red2'}> {tokenFormatter(pair.exchangeRateDecimals).format(pair.exchangeRate / - 10 ** pair.exchangeRateDecimals)} + 10 ** 18)} {tokenFormatter(2).format(pairStats[pair.id]?.[0].changeInER ?? 0)}% diff --git a/src/components/trade/Limit/Buy.tsx b/src/components/trade/new_orders/Buy.tsx similarity index 92% rename from src/components/trade/Limit/Buy.tsx rename to src/components/trade/new_orders/Buy.tsx index b4f698c..005738b 100644 --- a/src/components/trade/Limit/Buy.tsx +++ b/src/components/trade/new_orders/Buy.tsx @@ -21,12 +21,12 @@ import { DataContext } from '../../../context/DataProvider'; import { useEffect } from 'react'; import axios from 'axios'; import { getABI, getAddress } from '../../../utils/contract'; -import BuyModal from './BuyModal'; +import BuySellModal from './BuySellModal'; import { tokenFormatter } from '../../../utils/formatters'; import { AppDataContext } from '../../../context/AppData'; const Big = require('big.js'); -export default function BuyModule({ pair }) { +export default function BuyModule({ pair, limit }) { const [pairNow, setPairNow] = React.useState(null); const [amount, setAmount] = React.useState('0'); const [token0Amount, settoken0Amount] = React.useState('0'); @@ -52,7 +52,7 @@ export default function BuyModule({ pair }) { setToken0(_token0); setToken1(_token1); const newExchangeRate = - pair?.exchangeRate / 10 ** pair?.exchangeRateDecimals; + pair?.exchangeRate / 10 ** 18; setPrice(newExchangeRate.toFixed(pair?.exchangeRateDecimals)); newExchangeRate > 0 @@ -73,13 +73,13 @@ export default function BuyModule({ pair }) { isNaN(sliderValue) ) { const _price = Big(pair.exchangeRate).div( - 10 ** pair.exchangeRateDecimals + 10 ** 18 ); setPrice(_price.toString()); setSliderValue(20); if (_price.toNumber() > 0) { const token1Amount = Big(30) - .times(token1.tradingBalance) + .times(token1.balance) .div(100) .div(10 ** token1.decimals); @@ -100,7 +100,7 @@ export default function BuyModule({ pair }) { setSliderValue(e); if(!token1 || !price) return; const token1Amount = Big(e) - .times(token1.tradingBalance ?? 0) + .times(token1.balance ?? 0) .div(100) .div(10 ** token1.decimals); setAmount(token1Amount.toString()); @@ -153,9 +153,10 @@ export default function BuyModule({ pair }) { Price ({token1?.symbol}) - + {limit && Amount ({token0?.symbol}) - + } @@ -194,7 +195,7 @@ export default function BuyModule({ pair }) { Balance{' '} {tokenFormatter(null).format( - (token1?.tradingBalance ?? 0) / + (token1?.balance ?? 0) / 10 ** token1?.decimals )} @@ -249,13 +250,15 @@ export default function BuyModule({ pair }) { - ); diff --git a/src/components/trade/new_orders/BuySellModal.tsx b/src/components/trade/new_orders/BuySellModal.tsx new file mode 100644 index 0000000..cf64419 --- /dev/null +++ b/src/components/trade/new_orders/BuySellModal.tsx @@ -0,0 +1,268 @@ +import { + Alert, + AlertIcon, + Box, + Button, + Flex, + Skeleton, + Text, + useDisclosure, +} from "@chakra-ui/react"; +import React, { useContext } from "react"; +const Big = require("big.js"); + +import axios from "axios"; + +import { + Modal, + ModalOverlay, + ModalContent, + ModalHeader, + ModalFooter, + ModalBody, + ModalCloseButton, +} from "@chakra-ui/react"; + +import { DataContext } from "../../../context/DataProvider"; +import { WalletContext } from "../../../context/Wallet"; +import { useAccount } from "wagmi"; +import { Endpoints } from "../../../utils/const"; +import OrdersToExecute from "./OrdersToExecute"; + +import { Step, Steps, useSteps } from "chakra-ui-steps"; +import PlaceOrder from "./PlaceOrder"; +import { useEffect } from "react"; + +export default function BuySellModal({ + pair, + token1, + token0, + token1Amount, // needed for market orders + token0Amount, + price, // needed for limit orders + buy, + limit +}) { + const { isOpen, onOpen, onClose } = useDisclosure(); + const [orders, setOrders] = React.useState(null); + const [orderToPlace, setOrderToPlace] = React.useState(null); + + const { isConnected } = useContext(WalletContext); + + const { isConnected: isEvmConnected } = useAccount(); + + const { chain } = useContext(DataContext); + + const amountExceedsBalance = () => { + const amount = buy ? token0Amount * price : token0Amount; + const balance = buy + ? token1?.balance / 10 ** token1?.decimals + : token0?.balance / 10 ** token0?.decimals; + if (amount == "0" || amount == "" || !balance) return false; + if (Number(amount) && Number(balance)) return Big(amount).gt(balance); + }; + + const amountExceedsMin = () => { + if (token0Amount == "0" || token0Amount == "" || !token0 || !pair) + return false; + if (Number(token0Amount) && pair?.minToken0Order && token0.decimals) + return Big(token0Amount).lt( + Big(pair?.minToken0Order).div(10 ** token0.decimals) + ); + }; + + useEffect(() => { + if (token0Amount > 0 && token0 && !orderToPlace) { + setOrderToPlace( + Big(token0Amount) + .times(10 ** token0?.decimals) + .toFixed(0) + ); + } + }); + + const _onOpen = () => { + onOpen(); + let _amount = Big(token0Amount) + .times(10 ** token0.decimals) + .toFixed(0); + if(buy && !limit){ + _amount = Big(token1Amount) + .times(10 ** token1.decimals) + .toFixed(0); + } + + console.log(_amount); + + axios + .get(Endpoints[chain] + `order/${limit ? 'limit' : 'market'}/matched/` + pair.id, { + params: { + amount: _amount, + exchangeRate: Big(price) + .times(10 ** 18) + .toFixed(0), + buy, + chainId: chain, + }, + }) + .then((resp) => { + let _orders = resp.data.data; + setOrders(_orders); + }); + }; + + const { nextStep, prevStep, setStep, reset, activeStep } = useSteps({ + initialStep: 0, + }); + + const _onClose = () => { + setOrderToPlace(null); + setOrders(null); + onClose(); + reset(); + }; + + return ( + <> + + + + + + + {orders + ? orders.length > 0 && !(activeStep >= 1) + ? "Execute orders within limit" + : "Place order" + : "Review Order"} + + + + + {orders ? limit ? ( + orders.length > 0 ? ( + + + + + + + + + + + + + + ) : ( + + ) + ) : + + + + : ( + ( + <> + + + + + ) + )} + + + + + + ); +} diff --git a/src/components/trade/Limit/index.tsx b/src/components/trade/new_orders/Limit.tsx similarity index 76% rename from src/components/trade/Limit/index.tsx rename to src/components/trade/new_orders/Limit.tsx index 6bfcad5..1403326 100644 --- a/src/components/trade/Limit/index.tsx +++ b/src/components/trade/new_orders/Limit.tsx @@ -7,8 +7,8 @@ import BuyModule from './Buy'; const LimitOrder = ({ pair }) => { return ( - - + + ); }; diff --git a/src/components/trade/new_orders/Market.tsx b/src/components/trade/new_orders/Market.tsx new file mode 100644 index 0000000..99bef9a --- /dev/null +++ b/src/components/trade/new_orders/Market.tsx @@ -0,0 +1,16 @@ +import { Box, Button, Flex, Heading, Input, Text } from '@chakra-ui/react'; +import React from 'react'; + +import SellModule from './Sell'; +import BuyModule from './Buy'; + +const MarketOrder = ({ pair }) => { + return ( + + + + + ); +}; + +export default MarketOrder; diff --git a/src/components/trade/new_orders/OrdersToExecute.tsx b/src/components/trade/new_orders/OrdersToExecute.tsx new file mode 100644 index 0000000..b102328 --- /dev/null +++ b/src/components/trade/new_orders/OrdersToExecute.tsx @@ -0,0 +1,334 @@ +import { + Alert, + AlertIcon, + Box, + Button, + Flex, + Skeleton, + Text, +} from "@chakra-ui/react"; +import React, { useContext } from "react"; +import { tokenFormatter } from "../../../utils/formatters"; +import { useEffect } from "react"; +import { DataContext } from "../../../context/DataProvider"; +import Link from "next/link"; +import Big from "big.js"; +import { + getContract, + send, + getAddress, + getInterface, +} from "../../../utils/contract"; +import axios from "axios"; +import { ChainID } from "../../../utils/chains"; +import { ethers } from "ethers"; +import Image from "next/image"; +import { imageIds } from "../../../utils/const"; + +export default function OrdersToExecute({ + orders, + pair, + amountToFill, + nextStep, + token0, + token1, + buy, + setOrderToPlace, + price, + limit +}) { + const [totalSize, setTotalSize] = React.useState(0); + const [tokenAmountToSpend, setTokenAmountToSpend] = React.useState("0"); + const [amountExecuted, setAmountExecuted] = React.useState("0"); + const [loading, setLoading] = React.useState(false); + const [response, setResponse] = React.useState(null); + const [hash, setHash] = React.useState(null); + const [confirmed, setConfirmed] = React.useState(false); + + const { chain, explorer } = useContext(DataContext); + + const execute = async () => { + setLoading(true); + setConfirmed(false); + setHash(null); + setResponse(""); + let _amount = Big(amountToFill) + .times(10 ** pair.tokens[0].decimals) + .toFixed(0); + console.log(_amount); + const exchange = await getContract("Exchange", chain); + send( + exchange, + "executeMultipleLimitOrders", + [ + orders.map((order: any) => order.signature), + orders.map((order: any) => order.value), + _amount, + ], + chain + ) + .then(async (res: any) => { + setLoading(false); + setResponse("Transaction sent! Waiting for confirmation..."); + if (chain == ChainID.NILE) { + setHash(res); + checkResponse(res); + } else { + setHash(res.hash); + const receipt = await res.wait(1); + const exchangeItf = await getInterface("Exchange", chain); + // parse orders from receipt.logs + let total = Big(0); + + receipt.logs.forEach((log: any) => { + try { + const parsed = exchangeItf.parseLog(log); + if (parsed.name == "OrderExecuted") { + console.log(parsed); + total = total.plus(parsed.args.fillAmount); + } + } catch (err) {} + }); + setOrderToPlace(Big(_amount).sub(total).toFixed(0)); + setAmountExecuted(total.toFixed(0)); + setConfirmed(true); + setResponse("Transaction Successful!"); + } + }) + .catch((err: any) => { + console.log(err); + setLoading(false); + setConfirmed(true); + setResponse("Transaction failed. Please try again!"); + }); + }; + + const tokenToSpend = buy ? token1 : token0; + // const tokenAmountToSpend = buy ? totalSize : Big(totalSize).times(10**pair.tokens[0].decimals).times(orders[-1].value.exchangeRate).toFixed(0); + + const approve = async () => { + setLoading(true); + const token = await getContract("ERC20", chain, tokenToSpend.id); + send( + token, + "approve", + [getAddress("Exchange", chain), ethers.constants.MaxUint256], + chain + ).then((res: any) => { + setLoading(false); + }); + }; + + const checkResponse = (tx_id: string) => { + axios + .get( + "https://nile.trongrid.io/wallet/gettransactionbyid?value=" + + tx_id + ) + .then((res) => { + if (!res.data.ret) { + setTimeout(() => { + checkResponse(tx_id); + }, 2000); + } else { + setConfirmed(true); + if (res.data.ret[0].contractRet == "SUCCESS") { + setResponse("Transaction Successful!"); + } else { + setResponse("Transaction Failed. Please try again."); + } + } + }) + .catch((err: any) => { + setLoading(false); + }); + }; + + useEffect(() => { + if (orders) { + // calculate total size + let total = 0; + orders.forEach((o: any) => { + if (Number(o.value.amount) > 0) { + total += Number(o.value.amount); + } + }); + setTotalSize(total); + if (!buy) { + const _tokenAmountToSpend = Big(amountToFill) + .times(10 ** pair.tokens[0].decimals) + .toFixed(0); + setTokenAmountToSpend(_tokenAmountToSpend); + } else { + const _tokenAmountToSpend = Big(amountToFill) + .times(10 ** pair.tokens[0].decimals) + .times(price) + .toFixed(0); + setTokenAmountToSpend(_tokenAmountToSpend); + } + } + }); + + const status = response + ? response.includes("confirm") + ? "info" + : confirmed && response.includes("Success") + ? "success" + : "error" + : null; + + return ( + + {Big(tokenAmountToSpend).gt(tokenToSpend.allowance) ? ( + <> + + {""} + + You need to approve zexe to use your{" "} + {tokenToSpend.symbol} tokens to execute this order. + + + + + ) : ( + <> + + + {orders.map((o: any) => { + if (Number(o.value.amount) > 0) + return ( + + + {o.signature} + + + + {tokenFormatter(null).format( + o.value.amount / + 10 ** + pair.tokens[0] + .decimals + )}{" "} + {pair.tokens[0].symbol} @{" "} + {tokenFormatter(null).format( + o.value.exchangeRate / + 10 ** 18 + )}{" "} + {pair.tokens[1].symbol} + + + ); + else return null; + })} + {orders.length == 0 && ( + + No orders to execute + + )} + + + + + Amount to fill + + + {amountToFill} {pair.tokens[0].symbol} + + + + Total Size + + + {tokenFormatter(null).format( + totalSize / 10 ** pair.tokens[0].decimals + )}{" "} + {pair.tokens[0].symbol} + + + {Number(amountExecuted) > 0 && ( + <> + {/* {" "} + + Total Executed + + + {tokenFormatter(null).format( + Big(amountExecuted) + .div(10 ** pair.tokens[0].decimals) + .toNumber() + )}{" "} + {pair.tokens[0].symbol} + */} + + )} + {orders && ( + + + + {status && ( + + + + + {response} + + {hash && ( + + {" "} + + View on explorer + + + )} + + + )} + + {status == "info" ? ( + <> + ) : status == "success" || + orders.length == 0 ? ( + + ) : ( + + )} + + + )} + + )} + + ); +} diff --git a/src/components/trade/new_orders/PlaceOrder.tsx b/src/components/trade/new_orders/PlaceOrder.tsx new file mode 100644 index 0000000..b68ac28 --- /dev/null +++ b/src/components/trade/new_orders/PlaceOrder.tsx @@ -0,0 +1,180 @@ +import { Alert, AlertIcon, Box, Button, Flex, Text } from "@chakra-ui/react"; +import axios from "axios"; +import Big from "big.js"; +import { ethers, TypedDataDomain } from "ethers"; +import Link from "next/link"; +import React, { useContext } from "react"; +import { useAccount, useSignTypedData } from "wagmi"; +import { DataContext } from "../../../context/DataProvider"; +import { WalletContext } from "../../../context/Wallet"; +import { getAddress } from "../../../utils/contract"; + +export default function PlaceOrder({ + orderAmount, + amountToPlace, + token0, + token1, + price, + buy, + nextStep, +}) { + const [loading, setLoading] = React.useState(false); + const [response, setResponse] = React.useState(null); + const [hash, setHash] = React.useState(null); + const [confirmed, setConfirmed] = React.useState(false); + + const { data, isError, isLoading, isSuccess, signTypedDataAsync } = useSignTypedData(); + + const { chain, explorer } = useContext(DataContext); + const { address: TronAddress } = useContext(WalletContext); + const { address: EvmAddress } = useAccount(); + + const place = async () => { + setLoading(true); + setConfirmed(false); + setHash(null); + setResponse(""); + + let _amount = Big(amountToPlace) + // .times(10 ** token0.decimals) + .toFixed(0); + + const domain: any = { + name: "zexe", + version: "1", + chainId: chain.toString(), + verifyingContract: getAddress("Exchange", chain), + }; + + // The named list of all type definitions + const types = { + Order: [ + { name: "maker", type: "address" }, + { name: "token0", type: "address" }, + { name: "token1", type: "address" }, + { name: "amount", type: "uint256" }, + { name: "buy", type: "bool" }, + { name: "salt", type: "uint32" }, + { name: "exchangeRate", type: "uint216" }, + ], + }; + + const value = { + maker: TronAddress ?? EvmAddress, + token0: token0.id, + token1: token1.id, + amount: _amount, + buy, + salt: (Math.random() * 1000000).toFixed(0), + exchangeRate: ethers.utils.parseEther((price).toString()).toString(), + }; + + signTypedDataAsync({ + domain, + types, + value, + }).then((signature) => { + console.log(signature); + axios + .post("http://localhost:3010/order/create", { + signature, + data: value, + chainId: chain.toString(), + }) + .then((res) => { + setLoading(false); + setConfirmed(true); + setResponse("Order created successfully!"); + console.log(res); + }) + .catch((err) => { + setLoading(false); + setConfirmed(true); + setResponse("Order failed. Please try again!"); + console.log("err", err); + }); + }); + }; + + + return ( + + Order amount + {orderAmount} + + Executed amount + {Big(orderAmount).minus(Big(amountToPlace).div(10 ** 18)).toFixed(10)} + + {amountToPlace == 0 ? ( + <> + + Limit order was executed successfully! + + + + ) : ( + <> + Order amount to place + {Big(amountToPlace).div(10**18).toFixed(10)} + + + {response ? ( + + + + + + + {response} + + {hash && ( + + {" "} + + View on explorer + + + )} + + + + + + ) : ( + <> + + {/* {' '} */} + + )} + + + )} + + ); +} diff --git a/src/components/trade/Limit/Sell.tsx b/src/components/trade/new_orders/Sell.tsx similarity index 55% rename from src/components/trade/Limit/Sell.tsx rename to src/components/trade/new_orders/Sell.tsx index b6e63ba..ea75e6f 100644 --- a/src/components/trade/Limit/Sell.tsx +++ b/src/components/trade/new_orders/Sell.tsx @@ -4,7 +4,7 @@ import { NumberInputStepper, NumberIncrementStepper, NumberDecrementStepper, -} from '@chakra-ui/react'; +} from "@chakra-ui/react"; import { Slider, @@ -12,25 +12,24 @@ import { SliderFilledTrack, SliderThumb, SliderMark, -} from '@chakra-ui/react'; +} from "@chakra-ui/react"; -import { Box, Button, Flex, Heading, Input, Text } from '@chakra-ui/react'; -import React from 'react'; -import { useContext } from 'react'; -import { DataContext } from '../../../context/DataProvider'; -import { useEffect } from 'react'; -import axios from 'axios'; -import { getABI, getAddress } from '../../../utils/contract'; -import SellModal from './SellModal'; -import { tokenFormatter } from '../../../utils/formatters'; -import { AppDataContext } from '../../../context/AppData'; -const Big = require('big.js'); +import { Flex, Text } from "@chakra-ui/react"; +import React from "react"; +import { useContext } from "react"; +import { DataContext } from "../../../context/DataProvider"; +import { useEffect } from "react"; +import axios from "axios"; +import { tokenFormatter } from "../../../utils/formatters"; +import { AppDataContext } from "../../../context/AppData"; +import BuySellModal from "./BuySellModal"; +const Big = require("big.js"); -export default function BuyModule({ pair }) { +export default function BuyModule({ pair, limit }) { const [pairNow, setPairNow] = React.useState(null); - const [amount, setAmount] = React.useState('0'); - const [token1Amount, settoken1Amount] = React.useState('0'); + const [amount, setAmount] = React.useState("0"); + const [token1Amount, settoken1Amount] = React.useState("0"); const [loading, setLoading] = React.useState(false); const [response, setResponse] = React.useState(null); @@ -40,8 +39,8 @@ export default function BuyModule({ pair }) { const [token1, setToken1] = React.useState(null); const { tokens } = useContext(DataContext); - const {exchangeRate: price, setExchangeRate: setPrice} = useContext(AppDataContext); - + const { exchangeRate: price, setExchangeRate: setPrice } = + useContext(AppDataContext); useEffect(() => { const _token0 = tokens.find((t) => t.id === pair?.tokens[0].id); @@ -49,14 +48,19 @@ export default function BuyModule({ pair }) { setToken0(_token0); setToken1(_token1); // if there is change in pair - if(pair && pairNow !== pair?.id) { + if (pair && pairNow !== pair?.id) { const _token0 = tokens.find((t) => t.id === pair?.tokens[0].id); const _token1 = tokens.find((t) => t.id === pair?.tokens[1].id); setToken0(_token0); setToken1(_token1); - const newExchangeRate = (pair?.exchangeRate/(10**pair?.exchangeRateDecimals)) + const newExchangeRate = pair?.exchangeRate / 10 ** 18; setPrice(newExchangeRate.toFixed(pair?.exchangeRateDecimals)); - settoken1Amount(Big(amount).mul(newExchangeRate).toNumber().toFixed(pair?.exchangeRateDecimals ?? 0)); + settoken1Amount( + Big(amount) + .mul(newExchangeRate) + .toNumber() + .toFixed(pair?.exchangeRateDecimals ?? 0) + ); setPairNow(pair?.id); } @@ -66,19 +70,22 @@ export default function BuyModule({ pair }) { token0?.balance && isNaN(sliderValue) ) { - const _price = Big(pair.exchangeRate).div( - 10 ** pair.exchangeRateDecimals - ); + const _price = Big(pair.exchangeRate).div(10 ** 18); setPrice(_price.toString()); setSliderValue(20); if (_price.toNumber() > 0) { const token0Amount = Big(30) - .times(token0.tradingBalance) + .times(token0.balance) .div(100) .div(10 ** token1.decimals); - setAmount(token0Amount.toNumber().toFixed(pair.exchangeRateDecimals)); + setAmount( + token0Amount.toNumber().toFixed(pair.exchangeRateDecimals) + ); settoken1Amount( - token0Amount.times(_price).toNumber().toFixed(pair.exchangeRateDecimals) + token0Amount + .times(_price) + .toNumber() + .toFixed(pair.exchangeRateDecimals) ); } } @@ -86,32 +93,36 @@ export default function BuyModule({ pair }) { // check response in intervals const checkResponse = (tx_id: string) => { - axios.get('https://nile.trongrid.io/wallet/gettransactionbyid?value=' + tx_id) - .then(res => { - if(!res.data.ret){ - setTimeout(() => { - checkResponse(tx_id); - }, 2000); - } else { - setLoading(false) - if(res.data.ret[0].contractRet == 'SUCCESS') { - setResponse('Transaction Successful!') + axios + .get( + "https://nile.trongrid.io/wallet/gettransactionbyid?value=" + + tx_id + ) + .then((res) => { + if (!res.data.ret) { + setTimeout(() => { + checkResponse(tx_id); + }, 2000); } else { - setResponse('Transaction Failed. Please try again.') + setLoading(false); + if (res.data.ret[0].contractRet == "SUCCESS") { + setResponse("Transaction Successful!"); + } else { + setResponse("Transaction Failed. Please try again."); + } } - } - }) - } + }); + }; const setSlider = (e) => { setSliderValue(e); - if(!token0 || !price) return; + if (!token0 || !price) return; const token0Amount = Big(e) - .times(token0?.tradingBalance ?? 0) + .times(token0?.balance ?? 0) .div(100) .div(10 ** token1?.decimals); setAmount(token0Amount.toNumber().toString()); - if (price != '0' && price != '' && Number(price)) + if (price != "0" && price != "" && Number(price)) if (Number(price) > 0) settoken1Amount(token0Amount.times(price).toString()); }; @@ -119,11 +130,11 @@ export default function BuyModule({ pair }) { const updateToken0Amount = (e) => { setAmount(e); if ( - price != '0' && - price != '' && + price != "0" && + price != "" && Number(price) && - e != '0' && - e != '' && + e != "0" && + e != "" && Number(e) ) settoken1Amount(Big(e).times(price).toString()); @@ -132,11 +143,11 @@ export default function BuyModule({ pair }) { const updateToken1Amount = (e) => { settoken1Amount(e); if ( - price != '0' && - price != '' && + price != "0" && + price != "" && Number(price) && - e != '0' && - e != '' && + e != "0" && + e != "" && Number(e) ) setAmount(Big(e).div(price).toString()); @@ -144,32 +155,32 @@ export default function BuyModule({ pair }) { const onPriceChange = (e) => { setPrice(e); - if (amount != '0' && amount != '' && e != '0' && e != '' && Number(e)) + if (amount != "0" && amount != "" && e != "0" && e != "" && Number(e)) settoken1Amount(Big(amount).times(e).toString()); }; - - const labelStyles = { - mt: '2', - ml: '-2.5', - fontSize: 'xs', - color: 'gray.500', + mt: "2", + ml: "-2.5", + fontSize: "xs", + color: "gray.500", }; return ( - - - Price ({pair?.tokens[1].symbol}) + + + Price ({pair?.tokens[1].symbol}) + borderColor={"gray.700"} + > @@ -178,29 +189,37 @@ export default function BuyModule({ pair }) { - - Amount ({pair?.tokens[1].symbol}) + {limit && + Amount ({pair?.tokens[1].symbol}) + borderColor={"gray.700"} + > - + } - - - Total ({pair?.tokens[0].symbol}) - Balance {tokenFormatter(null).format((token0?.tradingBalance ?? 0)/(10**token0?.decimals))} + + + + Total ({pair?.tokens[0].symbol}) + + + Balance{" "} + {tokenFormatter(null).format( + (token0?.balance ?? 0) / 10 ** token0?.decimals + )} + + borderColor={"gray.700"} + > @@ -223,7 +243,8 @@ export default function BuyModule({ pair }) { value={sliderValue} onChange={setSlider} mt={8} - mb={3}> + mb={3} + > 25% @@ -241,7 +262,8 @@ export default function BuyModule({ pair }) { mt="-8" ml="-5" w="12" - fontSize={'xs'}> + fontSize={"xs"} + > {isNaN(sliderValue) ? 0 : sliderValue}% @@ -251,8 +273,16 @@ export default function BuyModule({ pair }) { - - + ); } diff --git a/src/context/DataProvider.tsx b/src/context/DataProvider.tsx index 60f8922..6e5b747 100644 --- a/src/context/DataProvider.tsx +++ b/src/context/DataProvider.tsx @@ -1,10 +1,13 @@ import * as React from 'react'; -import { DUMMY_ADDRESS, HELPER, Endpoints } from '../utils/const'; +import { DUMMY_ADDRESS, HELPER, Endpoints, ADDRESSES } from '../utils/const'; const { Big } = require('big.js'); import tronWeb from '../utils/tronWeb'; import axios from 'axios'; import { call, getABI, getAddress, getContract } from '../utils/contract'; import { ChainID, chains, chainMapping } from '../utils/chains'; +import Exchange from '../components/trade/Exchange'; +import { getBalancesAndApprovals } from '../utils/balances'; +import { BigNumber } from 'ethers'; const DataContext = React.createContext({} as DataValue); @@ -54,6 +57,7 @@ function DataProvider({ children }: any) { const [tokens, setTokens] = React.useState([]); const [userDepositWithdraws, setUserDepositWithdraws] = React.useState([]); const [chain, setChain] = React.useState(null); + const [block, setBlock] = React.useState(null); const [dollarFormatter, setDollarFormatter] = React.useState( new Intl.NumberFormat('en-US', { @@ -75,22 +79,32 @@ function DataProvider({ children }: any) { } const getWalletBalances = async (address: string, _tokens = tokens, chain: number) => { - let multicall = await getContract('Helper', chain); - Promise.all([ - call(multicall, 'balanceOf', [_tokens.map(token => token.id), address], chain), - call(multicall, 'allowance', [_tokens.map(token => token.id), address, getAddress('Vault', chain)], chain), - call(multicall, 'tradingBalanceOf', [getAddress('Vault', chain), _tokens.map(token => token.id), address], chain), - ]).then(async (res) => { - // set balance in token - let newTokens = [] - for(let index in _tokens) { - let token = _tokens[index]; - token.balance = res[0][index].toString(); - token.allowance = res[1][index].toString(); - token.tradingBalance = res[2][index].toString(); - newTokens.push(token); + // let multicall = await getContract('Helper', chain); + // Promise.all([ + // call(multicall, 'balanceOf', [_tokens.map(token => token.id), address], chain), + // call(multicall, 'allowance', [_tokens.map(token => token.id), address, getAddress('Vault', chain)], chain), + // call(multicall, 'tradingBalanceOf', [getAddress('Vault', chain), _tokens.map(token => token.id), address], chain), + // ]).then(async (res) => { + // // set balance in token + // let newTokens = [] + // for(let index in _tokens) { + // let token = _tokens[index]; + // token.balance = res[0][index].toString(); + // token.allowance = res[1][index].toString(); + // token.tradingBalance = res[2][index].toString(); + // newTokens.push(token); + // } + // setTokens(newTokens); + // }) + + getBalancesAndApprovals(_tokens.map(token => token.id), address, chain) + .then((res) => { + setBlock(res[0].toString()); + for(let i = 0; i < res[1].length; i+=2){ + _tokens[i/2].balance = BigNumber.from(res[1][i]).toString(); + _tokens[i/2].allowance = BigNumber.from(res[1][i+1]).toString(); } - setTokens(newTokens); + setTokens(_tokens); }) }; @@ -111,13 +125,13 @@ function DataProvider({ children }: any) { setDataFetchError(null); try { // fetch data - const requests = [axios.get(Endpoints[chain]+'allpairs')] - if(firstTime) requests.push(axios.get(Endpoints[chain]+'alltokens')) + const requests = [axios.get(Endpoints[chain]+'pair/allpairs', {params: {chainId: chain}})] + if(firstTime) requests.push(axios.get(Endpoints[chain]+'tokens', {params: {chainId: chain}})) Promise.all(requests).then(async (res) => { _pairs = res[0].data.data; setPairs(_pairs); - fetchPairData(_pairs, chain); - fetchPairStatus(_pairs, chain); + // fetchPairData(_pairs, chain); + // fetchPairStatus(_pairs, chain); if(firstTime) { _tokens = res[1].data.data; @@ -133,14 +147,14 @@ function DataProvider({ children }: any) { if(address) { console.log('Fetching data...'); getWalletBalances(address, _tokens, chain); - fetchPlacedOrders(address, _pairs, chain) - fetchCancelledOrders(address, _pairs, chain) - fetchExecutedOrders(address, _pairs, chain) - fetchUserDepositsWithdraws(address, chain) + // fetchPlacedOrders(address, _pairs, chain) + // fetchCancelledOrders(address, _pairs, chain) + // fetchExecutedOrders(address, _pairs, chain) + // fetchUserDepositsWithdraws(address, chain) } fetchOrders(_pairs, chain) fetchExecutedPairData(_pairs, chain); - if(loop) setTimeout(() => fetchData(address, chain, loop, false, _tokens, _pairs), 8000); + if(loop) setTimeout(() => fetchData(address, chain, loop, false, _tokens, _pairs), 20000); }) } catch (error) { setDataFetchError(error.message); @@ -149,9 +163,13 @@ function DataProvider({ children }: any) { }; const fetchOrders = (pairs: any[], chain: number) => { - let orderRequests = pairs.map((pair) => { - return axios.get(Endpoints[chain]+`orders/${pair.id}`); - }) + let orderRequests = pairs.map((pair) => ( + axios.get(Endpoints[chain]+`pair/orders/${pair.id}`, { + params: { + chainId: chain + } + }) + )) Promise.all(orderRequests).then((res) => { let newOrders = {}; res.forEach((order, index) => { @@ -191,7 +209,11 @@ function DataProvider({ children }: any) { // /pair/orders/history/:id const fetchExecutedPairData = async (pairs: any[], chain: number) => { let pairRequests = pairs.map((pair) => { - return axios.get(Endpoints[chain]+`pair/orders/history/${pair.id}`); + return axios.get(Endpoints[chain]+`pair/orders/history/${pair.id}`, { + params: { + chainId: chain + } + }); }) Promise.all(pairRequests).then((res) => { let newPairs = {}; diff --git a/src/context/LeverDataProvider.tsx b/src/context/LeverDataProvider.tsx new file mode 100644 index 0000000..e72b4ad --- /dev/null +++ b/src/context/LeverDataProvider.tsx @@ -0,0 +1,148 @@ +import * as React from 'react'; +import { DUMMY_ADDRESS, HELPER, Endpoints, ADDRESSES } from '../utils/const'; +const { Big } = require('big.js'); +import tronWeb from '../utils/tronWeb'; +import axios from 'axios'; +import { call, getABI, getAddress, getContract } from '../utils/contract'; +import { ChainID, chains, chainMapping } from '../utils/chains'; +import { getBalancesAndApprovals } from '../utils/balances'; +import { BigNumber, ethers } from 'ethers'; +import { Interface } from 'ethers/lib/utils.js'; + +const LeverDataContext = React.createContext({} as DataValue); + +// http://localhost:3010/allpairs +// http://localhost:3010/orders/1a7f0acc09e078a414a7d74d2d00434427ef2c021a09d075996d2441f0d4ab9c + +// list of tokens +const coingeckoIds = { + 'BTC': 'bitcoin', + 'ETH': 'ethereum', + 'USDT': 'tether', + 'USDD': 'usdd', + 'WTRX': 'tron', + 'BTT': 'bittorrent', + 'NEAR': 'near', + 'AURORA': 'aurora-near', + 'USDC': 'usd-coin', +}; + +const dummyPrices = { + 'BTC': '18000', + 'ETH': '1200', + 'USDT': '1', + 'USDD': '1', + 'WTRX': '0.006', + 'BTT': '0.0000008', + 'NEAR': '3.2', + 'AURORA': '0.8', + 'USDC': '1', +}; + +import erc20 from '../abis/ERC20.json' +import multicall from '../abis/Multicall2.json' + + +function LeverDataProvider({ children }: any) { + const [isDataReady, setIsDataReady] = React.useState(false); + const [isFetchingData, setIsFetchingData] = React.useState(false); + const [dataFetchError, setDataFetchError] = React.useState(null); + const [markets, setMarkets] = React.useState([]); + + React.useEffect(() => { + // fetch data if not fetched yet / is not fetching + // if (!isDataReady && !isFetchingData) { + // fetchData(); + // } + }, []) + + const getWalletBalances = async (address: string, _markets = markets, chain: ChainID) => { + const provider = new ethers.providers.Web3Provider(window.ethereum, "any"); + + const itf = new Interface(erc20.abi); + const multicallContract = new ethers.Contract( + ADDRESSES[chain].Multicall, + multicall.abi, + provider.getSigner() + ); + + let calls = [] + for (let i = 0; i<_markets.length; i++) { + calls.push([_markets[i].inputToken.id, itf.encodeFunctionData('balanceOf', [address])]) + calls.push([_markets[i].inputToken.id, itf.encodeFunctionData('allowance', [address, _markets[i].id])]) + calls.push([_markets[i].id, itf.encodeFunctionData('balanceOf', [address])]) + } + + return multicallContract.callStatic.aggregate(calls) + .then((res) => { + for(let i = 0; i < res[1].length; i+=3){ + _markets[i/3].balance = BigNumber.from(res[1][i]).toString(); + _markets[i/3].allowance = BigNumber.from(res[1][i+1]).toString(); + _markets[i/3].cTokenBalance = BigNumber.from(res[1][i+2]).toString(); + } + setMarkets(_markets); + }) + }; + + const fetchData = async (address: string, chain: ChainID) => { + setIsFetchingData(true); + setDataFetchError(null); + try { + // fetch data + const requests = [axios.post('https://api.thegraph.com/subgraphs/name/ze-xe/lever', { + query: + `{ + markets{ + id + inputToken{ + id + name + symbol + lastPriceUSD + } + rates { + rate + } + exchangeRate + inputTokenPriceUSD + totalDepositBalanceUSD + totalBorrowBalanceUSD + } + }` + })] + Promise.all(requests).then(async (res) => { + if(res[0].data.errors){ + setDataFetchError(res[0].data.errors[0].message) + return + } + setMarkets(res[0].data.data.markets) + getWalletBalances(address, res[0].data.data.markets, chain); + }) + } catch (error) { + setDataFetchError(error.message); + } + setIsFetchingData(false); + }; + + const value: DataValue = { + isDataReady, + markets, + dataFetchError, + isFetchingData, + fetchData, + }; + + return ( + {children} + ); +} + +interface DataValue { + isDataReady: boolean; + markets: any[]; + dataFetchError: string | null; + isFetchingData: boolean; + fetchData: (address :string, chainId: ChainID, loop?: boolean) => void; +} + +export { LeverDataProvider, LeverDataContext }; diff --git a/src/context/Wallet.tsx b/src/context/Wallet.tsx index 4d5a1ab..12fea05 100644 --- a/src/context/Wallet.tsx +++ b/src/context/Wallet.tsx @@ -61,7 +61,7 @@ function WalletProvider({children}: any) { } }) } else { - if(typeof window !== 'undefined'){ + // if(typeof window !== 'undefined'){ if(options.errRetryCount >= 3){ setConnectionError('Please install TronLink wallet extension'); setIsConnecting(false); @@ -73,7 +73,7 @@ function WalletProvider({children}: any) { } else { setTimeout(() => {connect(callback, {errRetryCount: options.errRetryCount + 1})}, 1000); } - } + // } } } diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index 184ca85..209430a 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -1,4 +1,20 @@ import { ChakraProvider, extendTheme } from '@chakra-ui/react'; +import '@rainbow-me/rainbowkit/styles.css'; +import '../styles/globals.css' +import { + darkTheme, + getDefaultWallets, + RainbowKitProvider, +} from '@rainbow-me/rainbowkit'; +import { + chain, + configureChains, + createClient, + WagmiConfig, +} from 'wagmi'; +import { alchemyProvider } from 'wagmi/providers/alchemy'; +import { publicProvider } from 'wagmi/providers/public'; + import theme from '../theme' import { AppProps } from 'next/app' @@ -6,32 +22,49 @@ import { DataProvider } from '../context/DataProvider'; import { AppDataProvider } from '../context/AppData'; import { Header } from '../components/Header'; import { WalletProvider } from '../context/Wallet'; -import '../styles/globals.css'; -import { configureChains, createClient, defaultChains, WagmiConfig } from 'wagmi'; -import { chains } from '../utils/chains'; -import { publicProvider } from 'wagmi/providers/public' +import { LeverDataProvider } from '../context/LeverDataProvider'; -const { provider, webSocketProvider } = configureChains(chains, [publicProvider()]); +const { chains, provider } = configureChains( + [{ + ...chain.arbitrumGoerli, + iconUrl: 'https://arbitrum.io/wp-content/uploads/2021/01/Arbitrum_Symbol-Full-color-White-background.png', + }, + chain.goerli +], + [ + alchemyProvider({ apiKey: process.env.ALCHEMY_ID }), + publicProvider() + ] +); -const client = createClient({ - provider, - webSocketProvider, +const { connectors } = getDefaultWallets({ + appName: 'My RainbowKit App', + chains }); +const wagmiClient = createClient({ + autoConnect: true, + connectors, + provider +}) function MyApp({ Component, pageProps }: AppProps) { return ( - + + +
+ + ) } diff --git a/src/pages/deposit.tsx b/src/pages/deposit.tsx deleted file mode 100644 index 566625e..0000000 --- a/src/pages/deposit.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import { Box, Flex } from '@chakra-ui/react'; -import Head from 'next/head'; -import React from 'react'; -import Deposit from '../components/deposit/Deposit'; -import Recent from '../components/deposit/RecentDeposits'; -import WalletBalance from '../components/deposit/WalletBalance'; - -export default function deposit() { - return ( - <> - - - Deposit | ZEXE | Buy & Sell Crypto on TRON - - - - - - - - - - - - - - - - - - ); -} diff --git a/src/pages/faucet.tsx b/src/pages/faucet.tsx index 88fc000..4117eef 100644 --- a/src/pages/faucet.tsx +++ b/src/pages/faucet.tsx @@ -19,18 +19,19 @@ import { WalletContext } from '../context/Wallet'; import { getABI, getContract, send } from '../utils/contract'; const mintAmount = { - USDT: 1000, - USDD: 1000, + USDT: 10000, + USDD: 10000, BTC: 1, ETH: 10, - WTRX: 10000, + WTRX: 100000, BTT: 10000000, - AURORA: 100, - NEAR: 10, - USDC: 1000, + AURORA: 1000, + NEAR: 100, + USDC: 10000, }; const Big = require('big.js'); + import { Input, InputGroup } from '@chakra-ui/react'; import axios from 'axios'; import Link from 'next/link'; @@ -40,7 +41,6 @@ import { ChainID } from '../utils/chains'; function RadioCard(props) { const { getInputProps, getCheckboxProps } = useRadio(props); - const { address, isConnected } = useContext(WalletContext); const input = getInputProps(); const checkbox = getCheckboxProps(); @@ -81,6 +81,7 @@ export default function faucets() { const { tokens, chain, explorer } = useContext(DataContext); const { address, isConnected } = useContext(WalletContext); const { address: evmAddress, isConnected: isEvmConnected } = useAccount(); + const [hydrated, setHydrated] = React.useState(false); const [selectedToken, setSelectedToken] = React.useState(0); @@ -160,6 +161,11 @@ export default function faucets() { }); }; + React.useEffect(() => { + setHydrated(true); + }, []); + + if (!hydrated) return <>; return ( {tokens.map((token, index) => { + console.log(token); const radio = getRadioProps({ value: index }); return ( { - const { colorMode, toggleColorMode } = useColorMode(); +const featuresTitle = { + fontSize: 'xl', + fontWeight: 'bold', + mt: 2, +}; - const featuresTitle = { - fontSize: 'xl', - fontWeight: 'bold', - mt: 2, - }; +const featuresText = { + fontSize: 'sm', +}; - const featuresText = { - fontSize: 'sm', - }; +const featuresIcon = { + size: '25', +}; - const featuresIcon = { - size: '25', - }; +const Index = () => { return ( <> diff --git a/src/pages/lend.tsx b/src/pages/lend.tsx new file mode 100644 index 0000000..cdeba01 --- /dev/null +++ b/src/pages/lend.tsx @@ -0,0 +1,37 @@ +import { Box, Flex, Heading, Text } from '@chakra-ui/react'; +import React from 'react' +import LendingTable from '../components/lever/lend/LendTable'; +import BorrowTable from '../components/lever/borrow/BorrowTable'; + +import { LeverDataContext } from '../context/LeverDataProvider' + +// https://s2.coinmarketcap.com/static/img/coins/64x64/1027.png +const imageIds = { + "ETH": "1027", + "BTC": "1", + "USDC": "3408", + "DAI": "4943" +} + +export default function lend() { + const {markets} = React.useContext(LeverDataContext); + + return ( + <> + + Lend your assets + Earn with high APR % + + + + + + + + + + + + + ) +} diff --git a/src/pages/portfolio.tsx b/src/pages/portfolio.tsx index ea43e09..b60db9c 100644 --- a/src/pages/portfolio.tsx +++ b/src/pages/portfolio.tsx @@ -105,7 +105,7 @@ export default function wallet() { {tokenFormatter(null).format( balance / 1e6 )}{' '} - TRX + ETH @@ -132,18 +132,18 @@ export default function wallet() { - - - - - + + + + + {tokens.map((token, index) => { return ( - - - - diff --git a/src/pages/trade/[pairId].tsx b/src/pages/trade/[pairId].tsx index 5fec17a..c5f834d 100644 --- a/src/pages/trade/[pairId].tsx +++ b/src/pages/trade/[pairId].tsx @@ -4,7 +4,7 @@ import GraphPanel from '../../components/trade/GraphPanel'; import TokensPanel from '../../components/trade/TokensPanel/TokensPanel'; import OrdersPanel from '../../components/trade/Orders/OrdersPanel'; import TitlePanel from '../../components/trade/TitlePanel'; -import Swap from '../../components/trade/Limit'; +import Swap from '../../components/trade/new_orders/Limit'; import { useContext } from 'react'; import { DataContext } from '../../context/DataProvider'; import { useRouter } from 'next/router'; @@ -43,7 +43,7 @@ const Trade = () => { <> - {pair?.exchangeRate / 10 ** pair?.exchangeRateDecimals}{' '} + {pair?.exchangeRate / 10 ** 18}{' '} {pair?.tokens[1].symbol}/{pair?.tokens[0].symbol} | ZEXE | Buy & Sell Crypto on TRON @@ -77,11 +77,11 @@ const Trade = () => { - {(isConnected || isEvmConnected) && ( + {/* {(isConnected || isEvmConnected) && ( - )} + )} */} ); diff --git a/src/pages/withdraw.tsx b/src/pages/withdraw.tsx deleted file mode 100644 index eb385e9..0000000 --- a/src/pages/withdraw.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import { Box, Flex } from '@chakra-ui/react'; -import React from 'react'; -import Withdraw from '../components/deposit/Withdraw'; -import Recent from '../components/deposit/RecentDeposits'; -import TradingBalance from '../components/deposit/TradingBalance'; -import Head from 'next/head'; - -export default function deposit() { - return ( - <> - - - Withdraw | ZEXE | Buy & Sell Crypto on TRON - - - - - - - - - - - - - - - - - - ); -} diff --git a/src/theme.tsx b/src/theme.tsx index fd50755..7217232 100644 --- a/src/theme.tsx +++ b/src/theme.tsx @@ -1,5 +1,6 @@ import { extendTheme, ThemeConfig } from '@chakra-ui/react' import { createBreakpoints, mode, StyleFunctionProps } from '@chakra-ui/theme-tools' +import { StepsStyleConfig as Steps } from 'chakra-ui-steps'; const fonts = { mono: `'Menlo', monospace` } @@ -73,6 +74,7 @@ const theme = extendTheme({ }), }, components: { + Steps, Button: { baseStyle: { borderRadius: '0px' diff --git a/src/utils/balances.ts b/src/utils/balances.ts new file mode 100644 index 0000000..d59cfb3 --- /dev/null +++ b/src/utils/balances.ts @@ -0,0 +1,26 @@ +import { ethers } from 'ethers'; +import { Interface } from 'ethers/lib/utils.js'; +import erc20 from '../abis/ERC20.json' +import multicall from '../abis/Multicall2.json' + +import { ADDRESSES } from './const'; + + +export function getBalancesAndApprovals(tokens: string[], account: string, chain: any, allowanceFor: string = ADDRESSES[chain].Exchange): Promise { + const provider = new ethers.providers.Web3Provider(window.ethereum, "any"); + + const itf = new Interface(erc20.abi); + const multicallContract = new ethers.Contract( + ADDRESSES[chain].Multicall, + multicall.abi, + provider.getSigner() + ); + + let calls = [] + for (let i = 0; i Date: Fri, 9 Dec 2022 14:50:21 +0530 Subject: [PATCH 14/37] vercel push --- src/components/trade/new_orders/BuySellModal.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/trade/new_orders/BuySellModal.tsx b/src/components/trade/new_orders/BuySellModal.tsx index cf64419..c517923 100644 --- a/src/components/trade/new_orders/BuySellModal.tsx +++ b/src/components/trade/new_orders/BuySellModal.tsx @@ -115,7 +115,7 @@ export default function BuySellModal({ initialStep: 0, }); - const _onClose = () => { + const _onClose = () => { setOrderToPlace(null); setOrders(null); onClose(); From 9df7537bae3764bee6a77feffdadfba75a996b71 Mon Sep 17 00:00:00 2001 From: prasad-kumkar Date: Fri, 9 Dec 2022 17:48:21 +0530 Subject: [PATCH 15/37] bug fixing, minor changes --- .hintrc | 3 +- src/components/Header.tsx | 2 +- src/components/lever/borrow/BorrowModal.tsx | 438 +++++++++--------- src/components/lever/borrow/BorrowTable.tsx | 7 +- src/components/lever/borrow/RepayModal.tsx | 62 +-- src/components/lever/lend/LendModal.tsx | 17 +- src/components/lever/lend/WithdrawModal.tsx | 4 +- .../trade/new_orders/BuySellModal.tsx | 21 +- .../trade/new_orders/OrdersToExecute.tsx | 12 +- .../trade/new_orders/PlaceOrder.tsx | 286 ++++++++---- src/context/DataProvider.tsx | 31 +- src/context/LeverDataProvider.tsx | 224 ++++++--- src/pages/lend.tsx | 24 +- 13 files changed, 661 insertions(+), 470 deletions(-) diff --git a/.hintrc b/.hintrc index 78629df..fe3262b 100644 --- a/.hintrc +++ b/.hintrc @@ -3,6 +3,7 @@ "development" ], "hints": { - "axe/forms": "off" + "axe/forms": "off", + "no-inline-styles": "off" } } \ No newline at end of file diff --git a/src/components/Header.tsx b/src/components/Header.tsx index 30a85e9..c02f2d9 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -62,7 +62,7 @@ export const Header = ({ title }: { title: string }) => { fetchData(address, connector.chains[0].id); fetchLeverData(address, connector.chains[0].id); setChain(connector.chains[0].id); - }, + } }); // const {connectAsync: connectEvm, connectors} = useConnect(); diff --git a/src/components/lever/borrow/BorrowModal.tsx b/src/components/lever/borrow/BorrowModal.tsx index 44d11b0..2ff3824 100644 --- a/src/components/lever/borrow/BorrowModal.tsx +++ b/src/components/lever/borrow/BorrowModal.tsx @@ -8,12 +8,12 @@ import { Text, Tooltip, InputLeftAddon, - InputRightAddon, - Flex, - Alert, - AlertIcon, - Link, - IconButton, + InputRightAddon, + Flex, + Alert, + AlertIcon, + Link, + IconButton, } from "@chakra-ui/react"; import React, { useContext, useState } from "react"; import Image from "next/image"; @@ -55,12 +55,13 @@ import { getContract, send } from "../../../utils/contract"; import { DataContext } from "../../../context/DataProvider"; import { useAccount } from "wagmi"; import { WalletContext } from "../../../context/Wallet"; -import { ethers } from 'ethers'; -import { ADDRESSES } from '../../../utils/const'; +import { ethers } from "ethers"; +import { ADDRESSES } from "../../../utils/const"; import Big from "big.js"; import { ChainID } from "../../../utils/chains"; import axios from "axios"; import { PlusSquareIcon } from "@chakra-ui/icons"; +import { LeverDataContext } from "../../../context/LeverDataProvider"; export default function LendModal({ market, token }) { const { isOpen, onOpen, onClose } = useDisclosure(); @@ -76,19 +77,20 @@ export default function LendModal({ market, token }) { const { chain, explorer } = useContext(DataContext); const { isConnected: isEvmConnected, address: EvmAddress } = useAccount(); const { isConnected, address: TronAddress } = useContext(WalletContext); + const { availableToBorrow } = useContext(LeverDataContext); const updateSliderValue = (value: number) => { setSliderValue(value); setInputAmount( ( - (value * (token?.balance / 10 ** token?.decimals)) / + (value * (parseFloat(availableToBorrow)/market.inputTokenPriceUSD)) / 100 ).toString() ); }; const updateMax = () => { - setInputAmount((token?.balance / 10 ** token?.decimals).toString()); + setInputAmount((parseFloat(availableToBorrow)/market.inputTokenPriceUSD).toString()); setSliderValue(100); }; @@ -97,43 +99,43 @@ export default function LendModal({ market, token }) { // setSliderValue(Number(value) * 100 / (token?.balance / 10 ** token?.decimals)); }; - const amountExceedsBalance = () => { - return Number(inputAmount) > token?.balance / 10 ** token?.decimals - } + const amountExceedsBalance = () => { + return Number(inputAmount) > parseFloat(availableToBorrow)/market.inputTokenPriceUSD + }; - const deposit = async () => { - setLoading(true); + const borrow = async () => { + setLoading(true); setConfirmed(false); setHash(null); - setResponse(''); - let amount = Big(inputAmount).times(10 ** token?.decimals); - const ctoken = await getContract('CToken', chain, market?.id); - send(ctoken, 'mint', [amount.toString()], chain) - .then(async (res: any) => { - setLoading(false); - setResponse('Transaction sent! Waiting for confirmation...'); - if (chain == ChainID.NILE) { - setHash(res); - checkResponse(res); - } else { - setHash(res.hash); - await res.wait(1); - setConfirmed(true); - setResponse('Transaction Successful!'); - } - }) - .catch((err: any) => { - setLoading(false); - setConfirmed(true); - setResponse('Transaction failed. Please try again!'); - }); - } + setResponse(""); + let amount = Big(inputAmount).times(10 ** token?.decimals); + const ctoken = await getContract("CToken", chain, market?.id); + send(ctoken, "borrow", [amount.toFixed(0)], chain) + .then(async (res: any) => { + setLoading(false); + setResponse("Transaction sent! Waiting for confirmation..."); + if (chain == ChainID.NILE) { + setHash(res); + checkResponse(res); + } else { + setHash(res.hash); + await res.wait(1); + setConfirmed(true); + setResponse("Transaction Successful!"); + } + }) + .catch((err: any) => { + setLoading(false); + setConfirmed(true); + setResponse("Transaction failed. Please try again!"); + }); + }; - // check response in intervals + // check response in intervals const checkResponse = (tx_id: string) => { axios .get( - 'https://nile.trongrid.io/wallet/gettransactionbyid?value=' + + "https://nile.trongrid.io/wallet/gettransactionbyid?value=" + tx_id ) .then((res) => { @@ -143,10 +145,10 @@ export default function LendModal({ market, token }) { }, 2000); } else { setConfirmed(true); - if (res.data.ret[0].contractRet == 'SUCCESS') { - setResponse('Transaction Successful!'); + if (res.data.ret[0].contractRet == "SUCCESS") { + setResponse("Transaction Successful!"); } else { - setResponse('Transaction Failed. Please try again.'); + setResponse("Transaction Failed. Please try again."); } } }) @@ -155,28 +157,24 @@ export default function LendModal({ market, token }) { }); }; - const approve = async () => { - setLoading(true) - const cToken = await getContract('ERC20', chain, market?.inputToken.id) - send(cToken, 'approve', [market?.id, ethers.constants.MaxUint256], chain) - .then((res: any) => { - console.log(res) - setLoading(false) - }) - } - - const _onClose = () => { - setInputAmount('0'); + const _onClose = () => { + setInputAmount("0"); setLoading(false); setResponse(null); setSliderValue(0); onClose(); }; - return ( + return ( <> - } variant={'ghost'} onClick={onOpen} aria-label={""}/> + } + variant={"ghost"} + onClick={onOpen} + aria-label={""} + /> @@ -187,171 +185,181 @@ export default function LendModal({ market, token }) { - - {Number(inputAmount) < Number(market?.allowance) ? - + + + + Max{" "} + {parseFloat(availableToBorrow)/market.inputTokenPriceUSD} + - - Balance {token?.balance / 10 ** token?.decimals} - + + + + + updateAmount(e)} + value={inputAmount} + > + + + + + + + + + + - - - - - updateAmount(e)} - value={inputAmount} - > - - - - - - - - - - + + 25% + + + 50% + + + 75% + + + + + + + + - updateSliderValue(v)} - value={sliderValue} - onMouseEnter={() => setShowTooltip(true)} - onMouseLeave={() => setShowTooltip(false)} - > - - 25% - - - 50% - - - 75% - - - - - - - - - - + - {response && ( - - - - - - {response} - - {hash && - - View on explorer + {response && ( + + + + + + + {response} - } - - + {hash && ( + + + View on explorer + + + )} + + + - ) - } - - - - : - - - - To Deposit {token?.name} tokens to zexe, you need to enable it first - - - - - - } + )} + + diff --git a/src/components/lever/borrow/BorrowTable.tsx b/src/components/lever/borrow/BorrowTable.tsx index be271c4..92acd3e 100644 --- a/src/components/lever/borrow/BorrowTable.tsx +++ b/src/components/lever/borrow/BorrowTable.tsx @@ -19,7 +19,7 @@ import Image from "next/image"; import { LeverDataContext } from "../../../context/LeverDataProvider"; import { dollarFormatter } from "../../../utils/formatters"; -import LendModal from "./RepayModal"; +import RepayModal from "./RepayModal"; import BorrowModal from "./BorrowModal"; import { DataContext } from "../../../context/DataProvider"; @@ -139,18 +139,19 @@ export default function LendingTable() { gap={2} justify="flex-end" > - - + diff --git a/src/components/lever/borrow/RepayModal.tsx b/src/components/lever/borrow/RepayModal.tsx index b28caa5..effb6eb 100644 --- a/src/components/lever/borrow/RepayModal.tsx +++ b/src/components/lever/borrow/RepayModal.tsx @@ -81,14 +81,14 @@ export default function LendModal({ market, token }) { setSliderValue(value); setInputAmount( ( - (value * (token?.balance / 10 ** token?.decimals)) / + (value * (market?.borrowBalance / 10 ** token?.decimals)) / 100 ).toString() ); }; const updateMax = () => { - setInputAmount((token?.balance / 10 ** token?.decimals).toString()); + setInputAmount((market?.borrowBalance / 10 ** token?.decimals).toString()); setSliderValue(100); }; @@ -98,7 +98,7 @@ export default function LendModal({ market, token }) { }; const amountExceedsBalance = () => { - return Number(inputAmount) > token?.balance / 10 ** token?.decimals; + return Number(inputAmount) > market?.borrowBalance / 10 ** token?.decimals; }; const deposit = async () => { @@ -108,7 +108,7 @@ export default function LendModal({ market, token }) { setResponse(""); let amount = Big(inputAmount).times(10 ** token?.decimals); const ctoken = await getContract("CToken", chain, market?.id); - send(ctoken, "mint", [amount.toString()], chain) + send(ctoken, "repayBorrow", [amount.toFixed(0)], chain) .then(async (res: any) => { setLoading(false); setResponse("Transaction sent! Waiting for confirmation..."); @@ -155,20 +155,6 @@ export default function LendModal({ market, token }) { }); }; - const approve = async () => { - setLoading(true); - const cToken = await getContract("ERC20", chain, market?.inputToken.id); - send( - cToken, - "approve", - [market?.id, ethers.constants.MaxUint256], - chain - ).then((res: any) => { - console.log(res); - setLoading(false); - }); - }; - const _onClose = () => { setInputAmount("0"); setLoading(false); @@ -193,11 +179,10 @@ export default function LendModal({ market, token }) { - Depositing {market?.inputToken.name} + Repaying {market?.inputToken.name} - {Number(inputAmount) < Number(market?.allowance) ? ( Balance{" "} - {token?.balance / 10 ** token?.decimals} + {market?.borrowBalance / 10 ** token?.decimals} @@ -234,7 +219,7 @@ export default function LendModal({ market, token }) { w={"100%"} defaultValue={0} max={ - token?.balance / + market?.borrowBalance / 10 ** token?.decimals } clampValueOnBlur={false} @@ -372,39 +357,6 @@ export default function LendModal({ market, token }) { )} - ) : ( - - - - - - To Deposit {token?.name} tokens to - zexe, you need to enable it first{" "} - - - - - - - )} diff --git a/src/components/lever/lend/LendModal.tsx b/src/components/lever/lend/LendModal.tsx index cabae73..080cf87 100644 --- a/src/components/lever/lend/LendModal.tsx +++ b/src/components/lever/lend/LendModal.tsx @@ -54,6 +54,7 @@ import Big from "big.js"; import { ChainID } from "../../../utils/chains"; import axios from "axios"; import { PlusSquareIcon } from "@chakra-ui/icons"; +import { LeverDataContext } from "../../../context/LeverDataProvider"; export default function LendModal({ market, token }) { const { isOpen, onOpen, onClose } = useDisclosure(); @@ -67,6 +68,8 @@ export default function LendModal({ market, token }) { const [confirmed, setConfirmed] = React.useState(false); const { chain, explorer } = useContext(DataContext); + const { incrementAllowance } = useContext(LeverDataContext); + const { isConnected: isEvmConnected, address: EvmAddress } = useAccount(); const { isConnected, address: TronAddress } = useContext(WalletContext); @@ -101,7 +104,7 @@ export default function LendModal({ market, token }) { setResponse(""); let amount = Big(inputAmount).times(10 ** token?.decimals); const ctoken = await getContract("CToken", chain, market?.id); - send(ctoken, "mint", [amount.toString()], chain) + send(ctoken, "mint", [amount.toFixed(0)], chain) .then(async (res: any) => { setLoading(false); setResponse("Transaction sent! Waiting for confirmation..."); @@ -116,6 +119,7 @@ export default function LendModal({ market, token }) { } }) .catch((err: any) => { + console.log(err); setLoading(false); setConfirmed(true); setResponse("Transaction failed. Please try again!"); @@ -156,10 +160,15 @@ export default function LendModal({ market, token }) { "approve", [market?.id, ethers.constants.MaxUint256], chain - ).then((res: any) => { - console.log(res); + ).then(async (res: any) => { + await res.wait(); + setLoading(false); + incrementAllowance(market.id, ethers.constants.MaxUint256.toString()); + }) + .catch((err: any) => { + console.log(err); setLoading(false); - }); + }) }; const _onClose = () => { diff --git a/src/components/lever/lend/WithdrawModal.tsx b/src/components/lever/lend/WithdrawModal.tsx index 51ef131..ffd5ff2 100644 --- a/src/components/lever/lend/WithdrawModal.tsx +++ b/src/components/lever/lend/WithdrawModal.tsx @@ -107,7 +107,7 @@ export default function WithdrawModal({ market, token }) { let amount = Big(inputAmount).div(market?.exchangeRate).times(10 ** (token?.decimals-10)); console.log(amount.toString()); const ctoken = await getContract("CToken", chain, market?.id); - send(ctoken, "redeem", [amount.toString()], chain) + send(ctoken, "redeem", [amount.toFixed(0)], chain) .then(async (res: any) => { setLoading(false); setResponse("Transaction sent! Waiting for confirmation..."); @@ -176,7 +176,7 @@ export default function WithdrawModal({ market, token }) { onClose(); }; - const depositBalance = () => market?.cTokenBalance * market?.exchangeRate / 10 ** (token?.decimals - 10); + const depositBalance = () => market?.collateralBalance; return ( <> diff --git a/src/components/trade/new_orders/BuySellModal.tsx b/src/components/trade/new_orders/BuySellModal.tsx index c517923..bf4e458 100644 --- a/src/components/trade/new_orders/BuySellModal.tsx +++ b/src/components/trade/new_orders/BuySellModal.tsx @@ -43,6 +43,10 @@ export default function BuySellModal({ buy, limit }) { + if(token0Amount == '') token0Amount = '0'; + if(token1Amount == '') token1Amount = '0'; + if(price == '') price = '0'; + const { isOpen, onOpen, onClose } = useDisclosure(); const [orders, setOrders] = React.useState(null); const [orderToPlace, setOrderToPlace] = React.useState(null); @@ -58,17 +62,9 @@ export default function BuySellModal({ const balance = buy ? token1?.balance / 10 ** token1?.decimals : token0?.balance / 10 ** token0?.decimals; - if (amount == "0" || amount == "" || !balance) return false; - if (Number(amount) && Number(balance)) return Big(amount).gt(balance); - }; - const amountExceedsMin = () => { - if (token0Amount == "0" || token0Amount == "" || !token0 || !pair) - return false; - if (Number(token0Amount) && pair?.minToken0Order && token0.decimals) - return Big(token0Amount).lt( - Big(pair?.minToken0Order).div(10 ** token0.decimals) - ); + if (isNaN(Number(amount))) return false; + return Big(amount).gt(balance); }; useEffect(() => { @@ -130,17 +126,16 @@ export default function BuySellModal({ bgColor={buy ? "green2" : "red2"} onClick={_onOpen} disabled={ + !Big(token0Amount).gt(0) || !(isConnected || isEvmConnected) || amountExceedsBalance() || - amountExceedsMin() || price == "" || Number(price) <= 0 } > {!(isConnected || isEvmConnected) ? "Connect Wallet" - : amountExceedsMin() - ? "Amount is too less" + : !Big(token0Amount).gt(0) ? "Enter Amount" : amountExceedsBalance() ? "Insufficient Trading Balance" : buy diff --git a/src/components/trade/new_orders/OrdersToExecute.tsx b/src/components/trade/new_orders/OrdersToExecute.tsx index b102328..1ce3e4f 100644 --- a/src/components/trade/new_orders/OrdersToExecute.tsx +++ b/src/components/trade/new_orders/OrdersToExecute.tsx @@ -45,7 +45,7 @@ export default function OrdersToExecute({ const [hash, setHash] = React.useState(null); const [confirmed, setConfirmed] = React.useState(false); - const { chain, explorer } = useContext(DataContext); + const { chain, explorer, incrementAllowance } = useContext(DataContext); const execute = async () => { setLoading(true); @@ -114,9 +114,15 @@ export default function OrdersToExecute({ "approve", [getAddress("Exchange", chain), ethers.constants.MaxUint256], chain - ).then((res: any) => { + ).then(async(res: any) => { + await res.wait(1); setLoading(false); - }); + incrementAllowance(tokenToSpend.id, ethers.constants.MaxUint256.toString()); + }) + .catch((err: any) => { + setLoading(false); + console.log(err); + }) }; const checkResponse = (tx_id: string) => { diff --git a/src/components/trade/new_orders/PlaceOrder.tsx b/src/components/trade/new_orders/PlaceOrder.tsx index b68ac28..d883ad6 100644 --- a/src/components/trade/new_orders/PlaceOrder.tsx +++ b/src/components/trade/new_orders/PlaceOrder.tsx @@ -3,14 +3,15 @@ import axios from "axios"; import Big from "big.js"; import { ethers, TypedDataDomain } from "ethers"; import Link from "next/link"; -import React, { useContext } from "react"; +import React, { useContext, useEffect } from "react"; import { useAccount, useSignTypedData } from "wagmi"; import { DataContext } from "../../../context/DataProvider"; import { WalletContext } from "../../../context/Wallet"; -import { getAddress } from "../../../utils/contract"; - +import { getAddress, getContract, send } from "../../../utils/contract"; +import Image from "next/image"; +import { imageIds } from "../../../utils/const"; export default function PlaceOrder({ - orderAmount, + orderAmount, amountToPlace, token0, token1, @@ -23,12 +24,57 @@ export default function PlaceOrder({ const [hash, setHash] = React.useState(null); const [confirmed, setConfirmed] = React.useState(false); - const { data, isError, isLoading, isSuccess, signTypedDataAsync } = useSignTypedData(); + const [tokenAmountToSpend, setTokenAmountToSpend] = React.useState("0"); + + const { data, isError, isLoading, isSuccess, signTypedDataAsync } = + useSignTypedData(); - const { chain, explorer } = useContext(DataContext); + const { chain, explorer, incrementAllowance } = useContext(DataContext); const { address: TronAddress } = useContext(WalletContext); const { address: EvmAddress } = useAccount(); + const tokenToSpend = buy ? token1 : token0; + + const approve = async () => { + setLoading(true); + const token = await getContract("ERC20", chain, tokenToSpend.id); + send( + token, + "approve", + [getAddress("Exchange", chain), ethers.constants.MaxUint256], + chain + ) + .then(async (res: any) => { + await res.wait(1); + setLoading(false); + incrementAllowance( + tokenToSpend.id, + ethers.constants.MaxUint256.toString() + ); + }) + .catch((err: any) => { + setLoading(false); + console.log(err); + }); + }; + + useEffect(() => { + if (token0 && token1) { + if (!buy) { + const _tokenAmountToSpend = Big(amountToPlace) + .times(10 ** token0.decimals) + .toFixed(0); + setTokenAmountToSpend(_tokenAmountToSpend); + } else { + const _tokenAmountToSpend = Big(amountToPlace) + .times(10 ** token1.decimals) + .times(price) + .toFixed(0); + setTokenAmountToSpend(_tokenAmountToSpend); + } + } + }); + const place = async () => { setLoading(true); setConfirmed(false); @@ -66,7 +112,7 @@ export default function PlaceOrder({ amount: _amount, buy, salt: (Math.random() * 1000000).toFixed(0), - exchangeRate: ethers.utils.parseEther((price).toString()).toString(), + exchangeRate: ethers.utils.parseEther(price.toString()).toString(), }; signTypedDataAsync({ @@ -96,85 +142,167 @@ export default function PlaceOrder({ }); }; - return ( - - Order amount - {orderAmount} - - Executed amount - {Big(orderAmount).minus(Big(amountToPlace).div(10 ** 18)).toFixed(10)} - - {amountToPlace == 0 ? ( - <> - - Limit order was executed successfully! - - - - ) : ( - <> - Order amount to place - {Big(amountToPlace).div(10**18).toFixed(10)} - - - {response ? ( - - - - - - - {response} - - {hash && ( - - {" "} - - View on explorer + <> + {!Big(tokenAmountToSpend).gt(tokenToSpend.allowance) ? ( + + + Order amount + + {orderAmount} + + {(!Big(orderAmount).eq(Big(amountToPlace).div(10 ** 18))) && ( + <> + + Executed amount + + + {Big(orderAmount) + .minus(Big(amountToPlace).div(10 ** 18)) + .toFixed(10)} + + + )} + + {amountToPlace == 0 ? ( + <> + + + Limit order was executed successfully! + + + + + ) : ( + <> + {!Big(orderAmount).eq(amountToPlace) && ( + <> + {" "} + + Order amount to place + + + {Big(amountToPlace) + .div(10 ** 18) + .toFixed(10)} + + + )} + + + Limit Price + + + {price} + + + + {response ? ( + + + + + + + {response} - - )} + {hash && ( + + {" "} + + View on explorer + + + )} + + - - - - - ) : ( - <> - - {/* + + ) : ( + <> + + {/* {' '} */} - - )} + + )} + + + )} + + ) : ( + <> + + + + You need to approve zexe to use your{" "} + {tokenToSpend.symbol} tokens to place this order. + + )} - + ); } diff --git a/src/context/DataProvider.tsx b/src/context/DataProvider.tsx index 6e5b747..f39bd16 100644 --- a/src/context/DataProvider.tsx +++ b/src/context/DataProvider.tsx @@ -78,25 +78,18 @@ function DataProvider({ children }: any) { return chain === ChainID.NILE ? 'https://nile.explorer.org/#/transaction/' : chainMapping[chain]?.blockExplorers.default.url+'tx/'; } - const getWalletBalances = async (address: string, _tokens = tokens, chain: number) => { - // let multicall = await getContract('Helper', chain); - // Promise.all([ - // call(multicall, 'balanceOf', [_tokens.map(token => token.id), address], chain), - // call(multicall, 'allowance', [_tokens.map(token => token.id), address, getAddress('Vault', chain)], chain), - // call(multicall, 'tradingBalanceOf', [getAddress('Vault', chain), _tokens.map(token => token.id), address], chain), - // ]).then(async (res) => { - // // set balance in token - // let newTokens = [] - // for(let index in _tokens) { - // let token = _tokens[index]; - // token.balance = res[0][index].toString(); - // token.allowance = res[1][index].toString(); - // token.tradingBalance = res[2][index].toString(); - // newTokens.push(token); - // } - // setTokens(newTokens); - // }) + const incrementAllowance = async (marketId: any, amount: string) => { + console.log('incrementing', marketId, amount) + let _markets = [...tokens]; + for(let i in _markets) { + if(_markets[i].id === marketId) { + _markets[i].allowance = Big(_markets[i].allowance).add(amount).toString() + } + } + setTokens(_markets); + } + const getWalletBalances = async (address: string, _tokens = tokens, chain: number) => { getBalancesAndApprovals(_tokens.map(token => token.id), address, chain) .then((res) => { setBlock(res[0].toString()); @@ -292,6 +285,7 @@ function DataProvider({ children }: any) { userDepositWithdraws, chain, setChain, explorer, + incrementAllowance }; return ( @@ -318,6 +312,7 @@ interface DataValue { userDepositWithdraws: any, chain: number, setChain: (chain: number) => void, explorer: () => string, + incrementAllowance: (token: string, amount: string) => Promise } export { DataProvider, DataContext }; diff --git a/src/context/LeverDataProvider.tsx b/src/context/LeverDataProvider.tsx index e72b4ad..1d8d81d 100644 --- a/src/context/LeverDataProvider.tsx +++ b/src/context/LeverDataProvider.tsx @@ -1,13 +1,13 @@ -import * as React from 'react'; -import { DUMMY_ADDRESS, HELPER, Endpoints, ADDRESSES } from '../utils/const'; -const { Big } = require('big.js'); -import tronWeb from '../utils/tronWeb'; -import axios from 'axios'; -import { call, getABI, getAddress, getContract } from '../utils/contract'; -import { ChainID, chains, chainMapping } from '../utils/chains'; -import { getBalancesAndApprovals } from '../utils/balances'; -import { BigNumber, ethers } from 'ethers'; -import { Interface } from 'ethers/lib/utils.js'; +import * as React from "react"; +import { DUMMY_ADDRESS, HELPER, Endpoints, ADDRESSES } from "../utils/const"; +const { Big } = require("big.js"); +import tronWeb from "../utils/tronWeb"; +import axios from "axios"; +import { call, getABI, getAddress, getContract } from "../utils/contract"; +import { ChainID, chains, chainMapping } from "../utils/chains"; +import { getBalancesAndApprovals } from "../utils/balances"; +import { BigNumber, ethers } from "ethers"; +import { Interface } from "ethers/lib/utils.js"; const LeverDataContext = React.createContext({} as DataValue); @@ -16,82 +16,143 @@ const LeverDataContext = React.createContext({} as DataValue); // list of tokens const coingeckoIds = { - 'BTC': 'bitcoin', - 'ETH': 'ethereum', - 'USDT': 'tether', - 'USDD': 'usdd', - 'WTRX': 'tron', - 'BTT': 'bittorrent', - 'NEAR': 'near', - 'AURORA': 'aurora-near', - 'USDC': 'usd-coin', + BTC: "bitcoin", + ETH: "ethereum", + USDT: "tether", + USDD: "usdd", + WTRX: "tron", + BTT: "bittorrent", + NEAR: "near", + AURORA: "aurora-near", + USDC: "usd-coin", }; const dummyPrices = { - 'BTC': '18000', - 'ETH': '1200', - 'USDT': '1', - 'USDD': '1', - 'WTRX': '0.006', - 'BTT': '0.0000008', - 'NEAR': '3.2', - 'AURORA': '0.8', - 'USDC': '1', + BTC: "18000", + ETH: "1200", + USDT: "1", + USDD: "1", + WTRX: "0.006", + BTT: "0.0000008", + NEAR: "3.2", + AURORA: "0.8", + USDC: "1", }; -import erc20 from '../abis/ERC20.json' -import multicall from '../abis/Multicall2.json' - +import erc20 from "../abis/ERC20.json"; +import ctoken from "../abis/CToken.json"; +import multicall from "../abis/Multicall2.json"; function LeverDataProvider({ children }: any) { const [isDataReady, setIsDataReady] = React.useState(false); const [isFetchingData, setIsFetchingData] = React.useState(false); - const [dataFetchError, setDataFetchError] = React.useState(null); + const [dataFetchError, setDataFetchError] = React.useState( + null + ); const [markets, setMarkets] = React.useState([]); + const [totalCollateralBalance, setTotalCollateralBalance] = React.useState('0') + const [totalBorrowBalance, setTotalBorrowBalance] = React.useState('0') + const [availableToBorrow, setAvailableToBorrow] = React.useState('0') React.useEffect(() => { - // fetch data if not fetched yet / is not fetching - // if (!isDataReady && !isFetchingData) { - // fetchData(); - // } - }, []) - - const getWalletBalances = async (address: string, _markets = markets, chain: ChainID) => { - const provider = new ethers.providers.Web3Provider(window.ethereum, "any"); - - const itf = new Interface(erc20.abi); - const multicallContract = new ethers.Contract( - ADDRESSES[chain].Multicall, - multicall.abi, - provider.getSigner() - ); - - let calls = [] - for (let i = 0; i<_markets.length; i++) { - calls.push([_markets[i].inputToken.id, itf.encodeFunctionData('balanceOf', [address])]) - calls.push([_markets[i].inputToken.id, itf.encodeFunctionData('allowance', [address, _markets[i].id])]) - calls.push([_markets[i].id, itf.encodeFunctionData('balanceOf', [address])]) - } - - return multicallContract.callStatic.aggregate(calls) + // fetch data if not fetched yet / is not fetching + // if (!isDataReady && !isFetchingData) { + // fetchData(); + // } + }, []); + + const getWalletBalances = async ( + address: string, + _markets = markets, + chain: ChainID + ) => { + const provider = new ethers.providers.Web3Provider( + window.ethereum, + "any" + ); + + const itf = new Interface(erc20.abi); + const ctokenitf = new Interface(ctoken.abi); + + const multicallContract = new ethers.Contract( + ADDRESSES[chain].Multicall, + multicall.abi, + provider.getSigner() + ); + + let calls = []; + for (let i = 0; i < _markets.length; i++) { + calls.push([ + _markets[i].inputToken.id, + itf.encodeFunctionData("balanceOf", [address]), + ]); + calls.push([ + _markets[i].inputToken.id, + itf.encodeFunctionData("allowance", [address, _markets[i].id]), + ]); + calls.push([ + _markets[i].id, + itf.encodeFunctionData("balanceOf", [address]), + ]); + calls.push([ + _markets[i].id, + ctokenitf.encodeFunctionData("borrowBalanceCurrent", [address]), + ]); + } + + return multicallContract.callStatic.aggregate(calls) .then((res) => { - for(let i = 0; i < res[1].length; i+=3){ - _markets[i/3].balance = BigNumber.from(res[1][i]).toString(); - _markets[i/3].allowance = BigNumber.from(res[1][i+1]).toString(); - _markets[i/3].cTokenBalance = BigNumber.from(res[1][i+2]).toString(); + let _totalCollateralBalance = Big(0); + let _totalBorrowBalance = Big(0); + let _availableToBorrow = Big(0); + + for (let i = 0; i < res[1].length; i += 4) { + _markets[i / 4].balance = BigNumber.from(res[1][i]).toString(); + _markets[i / 4].allowance = BigNumber.from(res[1][i + 1]).toString(); + _markets[i / 4].collateralBalance = Big(BigNumber.from(res[1][i + 2]).toString()) + .mul(_markets[i / 4]?.exchangeRate * 10 ** 10) + .div(1e18) + .toString(); + _markets[i / 4].borrowBalance = BigNumber.from(res[1][i + 3]).toString(); + + _totalCollateralBalance = _totalCollateralBalance.add( + Big(_markets[i / 4].collateralBalance).mul(_markets[i / 4].inputTokenPriceUSD) + ); + _totalBorrowBalance = _totalBorrowBalance.add( + Big(_markets[i / 4].borrowBalance).mul(_markets[i / 4].inputTokenPriceUSD).div(1e18) + ); + _availableToBorrow = _availableToBorrow.add( + Big(_markets[i / 4].collateralBalance).mul(_markets[i / 4].inputTokenPriceUSD).mul(_markets[i / 4].maximumLTV).div(100) + ); } + setTotalCollateralBalance(_totalCollateralBalance.toString()); + setTotalBorrowBalance(_totalBorrowBalance.toString()); + setAvailableToBorrow(_availableToBorrow.sub(_totalBorrowBalance).toString()); setMarkets(_markets); - }) + }); }; + const incrementAllowance = async (marketId: any, amount: string) => { + console.log('incrementing', marketId, amount) + let _markets = [...markets]; + for(let i in _markets) { + if(_markets[i].id === marketId) { + _markets[i].allowance = Big(_markets[i].allowance).add(amount).toString() + } + } + setMarkets(_markets); + } + const fetchData = async (address: string, chain: ChainID) => { setIsFetchingData(true); setDataFetchError(null); try { // fetch data - const requests = [axios.post('https://api.thegraph.com/subgraphs/name/ze-xe/lever', { - query: - `{ + const requests = [ + axios.post( + "https://api.thegraph.com/subgraphs/name/ze-xe/lever", + { + query: `{ markets{ id inputToken{ @@ -107,17 +168,20 @@ function LeverDataProvider({ children }: any) { inputTokenPriceUSD totalDepositBalanceUSD totalBorrowBalanceUSD + maximumLTV + } + }`, } - }` - })] + ), + ]; Promise.all(requests).then(async (res) => { - if(res[0].data.errors){ - setDataFetchError(res[0].data.errors[0].message) - return - } - setMarkets(res[0].data.data.markets) + if (res[0].data.errors) { + setDataFetchError(res[0].data.errors[0].message); + return; + } + setMarkets(res[0].data.data.markets); getWalletBalances(address, res[0].data.data.markets, chain); - }) + }); } catch (error) { setDataFetchError(error.message); } @@ -126,14 +190,20 @@ function LeverDataProvider({ children }: any) { const value: DataValue = { isDataReady, - markets, + markets, dataFetchError, isFetchingData, fetchData, + totalCollateralBalance, + totalBorrowBalance, + availableToBorrow, + incrementAllowance }; return ( - {children} + + {children} + ); } @@ -142,7 +212,11 @@ interface DataValue { markets: any[]; dataFetchError: string | null; isFetchingData: boolean; - fetchData: (address :string, chainId: ChainID, loop?: boolean) => void; + fetchData: (address: string, chainId: ChainID, loop?: boolean) => void; + totalCollateralBalance: string; + totalBorrowBalance: string; + availableToBorrow: string; + incrementAllowance: (market: any, amount: string) => void; } export { LeverDataProvider, LeverDataContext }; diff --git a/src/pages/lend.tsx b/src/pages/lend.tsx index cdeba01..4f992df 100644 --- a/src/pages/lend.tsx +++ b/src/pages/lend.tsx @@ -4,6 +4,7 @@ import LendingTable from '../components/lever/lend/LendTable'; import BorrowTable from '../components/lever/borrow/BorrowTable'; import { LeverDataContext } from '../context/LeverDataProvider' +import { dollarFormatter } from '../utils/formatters'; // https://s2.coinmarketcap.com/static/img/coins/64x64/1027.png const imageIds = { @@ -15,13 +16,34 @@ const imageIds = { export default function lend() { const {markets} = React.useContext(LeverDataContext); + const { availableToBorrow, totalBorrowBalance, totalCollateralBalance } = React.useContext(LeverDataContext); + return ( <> - + Lend your assets Earn with high APR % + + + + Collateral + {dollarFormatter(null).format(parseFloat(totalCollateralBalance))} + + + + Borrowed + {dollarFormatter(null).format(parseFloat(totalBorrowBalance))} + + + + Available to borrow + {dollarFormatter(null).format(parseFloat(availableToBorrow))} + + + + From cf4da907be88df29b8952fae8f642efc40b33cc0 Mon Sep 17 00:00:00 2001 From: prasad-kumkar Date: Fri, 16 Dec 2022 19:52:51 +0530 Subject: [PATCH 16/37] first data --- package.json | 1 + src/components/TVChartContainer/index.jsx | 234 ++++++++++++++++++---- src/components/trade/GraphPanel.tsx | 18 +- src/components/trade/Orders/OrderBook.tsx | 7 +- src/context/DataProvider.tsx | 47 ++--- src/utils/const.ts | 26 ++- yarn.lock | 51 ++++- 7 files changed, 304 insertions(+), 80 deletions(-) diff --git a/package.json b/package.json index 0193276..c744344 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "react-dom": "^18.2.0", "react-icons": "^4.6.0", "react-twitter-widgets": "^1.11.0", + "socket.io-client": "^4.5.4", "tronweb": "^4.4.0", "wagmi": "^0.8.3" }, diff --git a/src/components/TVChartContainer/index.jsx b/src/components/TVChartContainer/index.jsx index f2ea476..af5ea0c 100644 --- a/src/components/TVChartContainer/index.jsx +++ b/src/components/TVChartContainer/index.jsx @@ -1,23 +1,28 @@ -import * as React from 'react'; -import styles from './index.module.css'; -import { widget, version } from '../../../public/static/charting_library'; +import * as React from "react"; +import styles from "./index.module.css"; +import { widget, version } from "../../../public/static/charting_library"; +import axios from "axios"; +import { Endpoints } from "../../utils/const"; +import { ChainID } from "../../utils/chains"; function getLanguageFromURL() { - const regex = new RegExp('[\\?&]lang=([^&#]*)'); + const regex = new RegExp("[\\?&]lang=([^&#]*)"); const results = regex.exec(window.location.search); - return results === null ? null : decodeURIComponent(results[1].replace(/\+/g, ' ')); + return results === null + ? null + : decodeURIComponent(results[1].replace(/\+/g, " ")); } export class TVChartContainer extends React.PureComponent { static defaultProps = { - symbol: 'AAPL', - interval: 'D', - datafeedUrl: 'https://demo_feed.tradingview.com', - libraryPath: '/static/charting_library/', - chartsStorageUrl: 'https://saveload.tradingview.com', - chartsStorageApiVersion: '1.1', - clientId: 'tradingview.com', - userId: 'public_user_id', + symbol: "BTC_USDC", + interval: "15", + datafeedUrl: "https://demo_feed.tradingview.com", + libraryPath: "/static/charting_library/", + chartsStorageUrl: "https://saveload.tradingview.com", + chartsStorageApiVersion: "1.1", + clientId: "tradingview.com", + userId: "public_user_id", fullscreen: false, autosize: true, studiesOverrides: {}, @@ -27,7 +32,6 @@ export class TVChartContainer extends React.PureComponent { constructor(props) { super(props); - this.ref = React.createRef(); } @@ -35,42 +39,51 @@ export class TVChartContainer extends React.PureComponent { const widgetOptions = { symbol: this.props.symbol, // BEWARE: no trailing slash is expected in feed URL - datafeed: new window.Datafeeds.UDFCompatibleDatafeed(this.props.datafeedUrl), + datafeed: DataFeed, interval: this.props.interval, container: this.ref.current, library_path: this.props.libraryPath, - locale: getLanguageFromURL() || 'en', - disabled_features: ['use_localstorage_for_settings'], - enabled_features: ['study_templates'], - charts_storage_url: this.props.chartsStorageUrl, - charts_storage_api_version: this.props.chartsStorageApiVersion, - client_id: this.props.clientId, - user_id: this.props.userId, - fullscreen: this.props.fullscreen, - autosize: this.props.autosize, - studies_overrides: this.props.studiesOverrides, + locale: getLanguageFromURL() || "en", + disabled_features: ["use_localstorage_for_settings", "header_symbol_search", "header_compare", "header_undo_redo", "header_screenshot"], + // enabled_features: ["study_templates"], + // charts_storage_url: this.props.chartsStorageUrl, + // charts_storage_api_version: this.props.chartsStorageApiVersion, + // client_id: this.props.clientId, + // user_id: this.props.userId, + // fullscreen: this.props.fullscreen, + // autosize: this.props.autosize, + // studies_overrides: this.props.studiesOverrides, + theme: 'dark', + toolbar_bg: '#130B25', + + width: '100%', + height: '600', }; const tvWidget = new widget(widgetOptions); this.tvWidget = tvWidget; - tvWidget.onChartReady(() => { - tvWidget.headerReady().then(() => { - const button = tvWidget.createButton(); - button.setAttribute('title', 'Click to show a notification popup'); - button.classList.add('apply-common-tooltip'); - button.addEventListener('click', () => tvWidget.showNoticeDialog({ - title: 'Notification', - body: 'TradingView Charting Library API works correctly', - callback: () => { - console.log('Noticed!'); - }, - })); - - button.innerHTML = 'Check API'; - }); - }); + // tvWidget.onChartReady(() => { + // tvWidget.headerReady().then(() => { + // const button = tvWidget.createButton(); + // button.setAttribute( + // "title", + // "Click to show a notification popup" + // ); + // button.classList.add("apply-common-tooltip"); + // button.addEventListener("click", () => + // tvWidget.showNoticeDialog({ + // title: "Notification", + // body: "zexe API works correctly", + // callback: () => { + // console.log("Noticed!"); + // }, + // }) + // ); + // button.innerHTML = "Check API"; + // }); + // }); } componentWillUnmount() { @@ -81,10 +94,147 @@ export class TVChartContainer extends React.PureComponent { } render() { - return ( + return ( <>
); } } + +// import { getExchangeServerTime, getSymbols, getKlines, subscribeKline, unsubscribeKline, checkInterval } from './helpers' + +const configurationData = { + // supports_marks: false, + // supports_timescale_marks: false, + // supports_time: true, + supported_resolutions: ["5", "15", "30"], +}; + +const DataFeed = { + onReady: (callback) => { + console.log("[onReady]: Method call"); + setTimeout(() => callback(configurationData)); // callback must be called asynchronously. + }, + + resolveSymbol: ( + symbolName, + onSymbolResolvedCallback, + onResolveErrorCallback + ) => { + axios + .get(Endpoints[ChainID.ARB_GOERLI] + "chart/symbol", { + params: { + symbol: symbolName, + }, + }) + .then((resp) => { + const symbolItem = resp.data.data; + const symbolInfo = { + ticker: symbolItem.symbol, + name: symbolItem.symbol, + description: symbolItem.symbol, + type: "crypto", + session: "24x7", + timezone: "UTC", + exchange: "zexe", + minmov: 1, + pricescale: 100, + has_intraday: true, + has_no_volume: true, + has_weekly_and_monthly: false, + supported_resolutions: + configurationData.supported_resolutions, + volume_precision: 2, + pairId: symbolItem.ticker, + // data_status: 'streaming', + }; + + console.log("[resolveSymbol]: Symbol resolved", symbolInfo); + onSymbolResolvedCallback(symbolInfo); + }); + console.log("[resolveSymbol]: Method call", symbolName); + }, + + getBars: ( + symbolInfo, + resolution, + { from, to, firstDataRequest }, + onHistoryCallback, + onErrorCallback + ) => { + // console.log("[getBars]: Method call", firstDataRequest); + // console.log(symbolInfo.pairId, from, to, resolution); + axios + .get( + Endpoints[ChainID.ARB_GOERLI] + + "chart/bar/history/" + + symbolInfo.pairId, + { + params: { + from, + to, + interval: resolution, + firstDataRequest + }, + } + ) + .then((resp) => { + if (resp.data.data.length == 0) { + onHistoryCallback([], { noData: true }); + return; + } else { + const data = resp.data.data.exchangeRate; + onHistoryCallback(data, { noData: false }); + } + }) + .catch((err) => { + console.log(err); + onErrorCallback(err); + }); + }, + + // subscription to real-time updates + subscribeBars: ( + symbolInfo, + interval, + onRealtimeCallback, + subscribeUID, + onResetCacheNeededCallback + ) => { + console.log( + "[subscribeBars]: Method call with subscribeUID:", + subscribeUID + ); + // window.interval = setInterval( + // () => + // console.log(Date.now() - 100000) + // onRealtimeCallback([{ + // time: '1671087897000', + // open: 1, + // high: 2, + // low: 1, + // close: 2, + // volume: 100, + // }]) + // 10000 + // ); + + // subscribeKline({ symbol: symbolInfo.name, interval, uniqueID: subscribeUID, }, cb => onRealtimeCallback(cb)) + }, + unsubscribeBars: (subscriberUID) => { + console.log( + "[unsubscribeBars]: Method call with subscriberUID:", + subscriberUID + ); + // unsubscribeKline(subscriberUID) + clearInterval(window.interval); + }, + // getServerTime: (callback) => { + // getExchangeServerTime().then(time => { + // callback(Math.floor(time / 1000)) + // }).catch(err => { + // console.error(err) + // }) + // } +}; diff --git a/src/components/trade/GraphPanel.tsx b/src/components/trade/GraphPanel.tsx index a69f167..b9ead70 100644 --- a/src/components/trade/GraphPanel.tsx +++ b/src/components/trade/GraphPanel.tsx @@ -2,15 +2,23 @@ import { Box, Flex, Text } from '@chakra-ui/react' import React from 'react' import dynamic from "next/dynamic"; -const Graph = dynamic(() => import("./Graph"), { - ssr: false -}); +// const Graph = dynamic(() => import("./Graph"), { +// ssr: false +// }); + +// import dynamic from 'next/dynamic'; + +const TVChartContainer = dynamic( + () => + import('../TVChartContainer').then(mod => mod.TVChartContainer), + { ssr: false }, +); export default function GraphPanel({pair}) { return ( <> - - + + {pair && } ) diff --git a/src/components/trade/Orders/OrderBook.tsx b/src/components/trade/Orders/OrderBook.tsx index 03d53c1..d16b7e0 100644 --- a/src/components/trade/Orders/OrderBook.tsx +++ b/src/components/trade/Orders/OrderBook.tsx @@ -21,10 +21,9 @@ const Order = ({ order, index, total, pair, orderType }) => { color={orderType == 'BUY' ? 'green2' : 'red2'} py={'3px'} px={4} - _hover={{ bgColor: orderType == 'BUY' ? 'rgba(24, 176, 95, 20%)' : 'rgba(200, 50, 50, 20%)' }} + _hover={{ bgColor: orderType == 'BUY' ? 'rgba(24, 176, 95, 10%)' : 'rgba(200, 50, 50, 10%)' }} bgGradient={'linear(to-r,' + (orderType == 'BUY' ? 'rgba(24, 176, 95, 20%), rgba(24, 176, 95, 20%))' : 'rgba(200, 50, 50, 20%), rgba(200, 50, 50, 20%))')} - - bgSize={300*order.amount/total + '%'} + bgSize={600*order.amount/total + '%'} bgRepeat='no-repeat' > @@ -68,7 +67,7 @@ export default function OrderBook({ pair }) { Amount {pair?.tokens[1].symbol} Price {pair?.tokens[1].symbol} - {[...sellOrders].reverse().map((order: any, index: number) => { + {[...sellOrders].slice(0, 22).reverse().map((order: any, index: number) => { return ( ({} as DataValue); // http://localhost:3010/allpairs // http://localhost:3010/orders/1a7f0acc09e078a414a7d74d2d00434427ef2c021a09d075996d2441f0d4ab9c -// list of tokens -const coingeckoIds = { - 'BTC': 'bitcoin', - 'ETH': 'ethereum', - 'USDT': 'tether', - 'USDD': 'usdd', - 'WTRX': 'tron', - 'BTT': 'bittorrent', - 'NEAR': 'near', - 'AURORA': 'aurora-near', - 'USDC': 'usd-coin', -}; - -const dummyPrices = { - 'BTC': '18000', - 'ETH': '1200', - 'USDT': '1', - 'USDD': '1', - 'WTRX': '0.006', - 'BTT': '0.0000008', - 'NEAR': '3.2', - 'AURORA': '0.8', - 'USDC': '1', -}; - function DataProvider({ children }: any) { const [isDataReady, setIsDataReady] = React.useState(false); @@ -123,6 +99,8 @@ function DataProvider({ children }: any) { Promise.all(requests).then(async (res) => { _pairs = res[0].data.data; setPairs(_pairs); + subscribePairHistory(_pairs); + // fetchPairData(_pairs, chain); // fetchPairStatus(_pairs, chain); @@ -147,7 +125,7 @@ function DataProvider({ children }: any) { } fetchOrders(_pairs, chain) fetchExecutedPairData(_pairs, chain); - if(loop) setTimeout(() => fetchData(address, chain, loop, false, _tokens, _pairs), 20000); + // if(loop) setTimeout(() => fetchData(address, chain, loop, false, _tokens, _pairs), 20000); }) } catch (error) { setDataFetchError(error.message); @@ -155,6 +133,21 @@ function DataProvider({ children }: any) { setIsFetchingData(false); }; + const subscribePairHistory = (_pairs: any[]) => { + socket.on('PAIR_HISTORY', ({pair, amount, buy, exchangeRate}) => { + for(let i in _pairs) { + if(_pairs[i].id === pair) { + _pairs[i].priceDiff = Big(_pairs[i].exchangeRate).minus(exchangeRate).toString(); + _pairs[i].exchangeRate = exchangeRate; + console.log('found pair', _pairs[i]); + } + } + setPairs(_pairs); + }) + + + } + const fetchOrders = (pairs: any[], chain: number) => { let orderRequests = pairs.map((pair) => ( axios.get(Endpoints[chain]+`pair/orders/${pair.id}`, { diff --git a/src/utils/const.ts b/src/utils/const.ts index 05ad096..3c4baaf 100644 --- a/src/utils/const.ts +++ b/src/utils/const.ts @@ -28,9 +28,33 @@ export const ADDRESSES = { export const Endpoints = { [ChainID.NILE]: 'https://api.zexe.io/', [ChainID.AURORA]: 'https://aurora.api.zexe.io/', - [ChainID.ARB_GOERLI]: 'http://localhost:3010/', + [ChainID.ARB_GOERLI]: 'http://localhost:3010/' // 'http://65.20.81.124:8090/', }; +// list of tokens +export const coingeckoIds = { + 'BTC': 'bitcoin', + 'ETH': 'ethereum', + 'USDT': 'tether', + 'USDD': 'usdd', + 'WTRX': 'tron', + 'BTT': 'bittorrent', + 'NEAR': 'near', + 'AURORA': 'aurora-near', + 'USDC': 'usd-coin', +}; + +export const dummyPrices = { + 'BTC': '18000', + 'ETH': '1200', + 'USDT': '1', + 'USDD': '1', + 'WTRX': '0.006', + 'BTT': '0.0000008', + 'NEAR': '3.2', + 'AURORA': '0.8', + 'USDC': '1', +}; export const imageIds = { ETH: "1027", diff --git a/yarn.lock b/yarn.lock index d644114..57b4a6d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1550,6 +1550,11 @@ resolved "https://registry.npmjs.org/@react-icons/all-files/-/all-files-4.1.0.tgz" integrity sha512-hxBI2UOuVaI3O/BhQfhtb4kcGn9ft12RWAFVMUeNjqqhLsHvFtzIkFaptBJpFDANTKoDfdVoHTKZDlwKCACbMQ== +"@socket.io/component-emitter@~3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz#96116f2a912e0c02817345b3c10751069920d553" + integrity sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg== + "@solana/buffer-layout@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@solana/buffer-layout/-/buffer-layout-4.0.0.tgz#75b1b11adc487234821c81dfae3119b73a5fd734" @@ -2496,7 +2501,7 @@ csstype@^3.0.11, csstype@^3.0.2, csstype@^3.0.7: resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz" integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw== -debug@^4.1.1: +debug@^4.1.1, debug@~4.3.1, debug@~4.3.2: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -2593,6 +2598,22 @@ encode-utf8@^1.0.3: resolved "https://registry.yarnpkg.com/encode-utf8/-/encode-utf8-1.0.3.tgz#f30fdd31da07fb596f281beb2f6b027851994cda" integrity sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw== +engine.io-client@~6.2.3: + version "6.2.3" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-6.2.3.tgz#a8cbdab003162529db85e9de31575097f6d29458" + integrity sha512-aXPtgF1JS3RuuKcpSrBtimSjYvrbhKW9froICH4s0F3XQWLxsKNxqzG39nnvQZQnva4CMvUK63T7shevxRyYHw== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.1" + engine.io-parser "~5.0.3" + ws "~8.2.3" + xmlhttprequest-ssl "~2.0.0" + +engine.io-parser@~5.0.3: + version "5.0.4" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.0.4.tgz#0b13f704fa9271b3ec4f33112410d8f3f41d0fc0" + integrity sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg== + enhanced-resolve@^5.10.0: version "5.10.0" resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz" @@ -3847,6 +3868,24 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" +socket.io-client@^4.5.4: + version "4.5.4" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-4.5.4.tgz#d3cde8a06a6250041ba7390f08d2468ccebc5ac9" + integrity sha512-ZpKteoA06RzkD32IbqILZ+Cnst4xewU7ZYK12aS1mzHftFFjpoMz69IuhP/nL25pJfao/amoPI527KnuhFm01g== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.2" + engine.io-client "~6.2.3" + socket.io-parser "~4.2.1" + +socket.io-parser@~4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.1.tgz#01c96efa11ded938dcb21cbe590c26af5eff65e5" + integrity sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.1" + source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" @@ -4200,6 +4239,16 @@ ws@^8.5.0: resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143" integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg== +ws@~8.2.3: + version "8.2.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.2.3.tgz#63a56456db1b04367d0b721a0b80cae6d8becbba" + integrity sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA== + +xmlhttprequest-ssl@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz#91360c86b914e67f44dce769180027c0da618c67" + integrity sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A== + xtend@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" From 8153c8ceb8f59b33a7ab8185fd1b30f93afff118 Mon Sep 17 00:00:00 2001 From: prasad-kumkar Date: Fri, 16 Dec 2022 19:53:05 +0530 Subject: [PATCH 17/37] socket --- src/utils/socket.ts | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 src/utils/socket.ts diff --git a/src/utils/socket.ts b/src/utils/socket.ts new file mode 100644 index 0000000..b3b1470 --- /dev/null +++ b/src/utils/socket.ts @@ -0,0 +1,19 @@ +import {io, Socket} from 'socket.io-client'; + +class ClientSocket { + private socket: Socket; + + constructor() { + this.socket = io('http://localhost:3010'); + } + + public on(eventName: string, callback: Function) { + this.socket.on(eventName, callback as any); + } + + public emit(eventName: string, data: any) { + this.socket.emit(eventName, data); + } +} + +export default new ClientSocket(); \ No newline at end of file From 31bb06f4628c6aedc975440c320e5d2ca38d6373 Mon Sep 17 00:00:00 2001 From: prasad-kumkar Date: Sat, 17 Dec 2022 23:49:10 +0530 Subject: [PATCH 18/37] money markets --- public/BuildOnArbitrum.png | Bin 0 -> 13910 bytes public/assets/crypto_logos/zexe.png | Bin 0 -> 2752 bytes src/components/Footer.tsx | 92 +++++--- src/components/Header.tsx | 8 +- src/components/TVChartContainer/index.jsx | 26 +++ src/components/lever/borrow/BorrowModal.tsx | 19 +- src/components/lever/borrow/BorrowTable.tsx | 53 +++-- src/components/lever/borrow/RepayModal.tsx | 19 +- src/components/lever/lend/LendModal.tsx | 27 ++- src/components/lever/lend/LendTable.tsx | 56 +++-- src/components/lever/lend/WithdrawModal.tsx | 20 +- src/components/trade/GraphPanel.tsx | 6 - src/components/trade/Margin.tsx | 0 src/components/trade/Orders/OrderBook.tsx | 18 +- src/components/trade/Orders/OrderHistory.tsx | 2 +- .../trade/UserOrders/CancelOrder.tsx | 4 +- .../trade/UserOrders/PlacedOrders.tsx | 23 +- src/components/trade/UserOrders/index.tsx | 46 ++-- .../trade/new_orders/BuySellModal.tsx | 219 +++++++++--------- src/components/trade/new_orders/Limit.tsx | 2 +- src/components/trade/new_orders/Market.tsx | 2 +- .../trade/new_orders/OrdersToExecute.tsx | 114 ++++----- .../trade/new_orders/PlaceOrder.tsx | 4 +- src/context/DataProvider.tsx | 125 +++++----- src/context/LeverDataProvider.tsx | 4 + src/pages/_margin/[pairId].tsx | 90 +++++++ src/pages/_margin/index.tsx | 28 +++ src/pages/faucet.tsx | 1 + src/pages/graph.tsx | 4 +- src/pages/index.tsx | 114 ++++----- src/pages/lend.tsx | 164 ++++++++----- src/pages/portfolio.tsx | 49 +--- src/pages/trade/[pairId].tsx | 10 +- 33 files changed, 789 insertions(+), 560 deletions(-) create mode 100644 public/BuildOnArbitrum.png create mode 100644 public/assets/crypto_logos/zexe.png create mode 100644 src/components/trade/Margin.tsx create mode 100644 src/pages/_margin/[pairId].tsx create mode 100644 src/pages/_margin/index.tsx diff --git a/public/BuildOnArbitrum.png b/public/BuildOnArbitrum.png new file mode 100644 index 0000000000000000000000000000000000000000..bd2f8ec3b44f6612cb58f1e714715eaf6a464761 GIT binary patch literal 13910 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 Zli?Jo^3ksMLAX3I%zZT{{TXssPg~- literal 0 HcmV?d00001 diff --git a/public/assets/crypto_logos/zexe.png b/public/assets/crypto_logos/zexe.png new file mode 100644 index 0000000000000000000000000000000000000000..d2e364bb2d909076764e56a11bfa9cb886c46ae7 GIT binary patch literal 2752 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 ( - - - Join the revolution - - - + + + + + - - - + + Join the revolution + + + + + - - - + + + - - -) + + + + + + +); diff --git a/src/components/Header.tsx b/src/components/Header.tsx index c02f2d9..e4303ba 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -6,6 +6,7 @@ import { Button, useDisclosure, Tooltip, + Divider, } from '@chakra-ui/react'; import Link from 'next/link'; import { useEffect, useContext, useState } from 'react'; @@ -317,9 +318,12 @@ const DesktopNav = () => { return ( + {/* */} - - + {/* */} + + {/* */} + {/* */} ); diff --git a/src/components/TVChartContainer/index.jsx b/src/components/TVChartContainer/index.jsx index af5ea0c..7210df4 100644 --- a/src/components/TVChartContainer/index.jsx +++ b/src/components/TVChartContainer/index.jsx @@ -31,10 +31,35 @@ export class TVChartContainer extends React.PureComponent { tvWidget = null; constructor(props) { + console.log(props.symbol); super(props); this.ref = React.createRef(); } + componentDidUpdate() { + const widgetOptions = { + symbol: this.props.symbol, + // BEWARE: no trailing slash is expected in feed URL + datafeed: DataFeed, + interval: this.props.interval, + container: this.ref.current, + library_path: this.props.libraryPath, + + locale: getLanguageFromURL() || "en", + disabled_features: ["use_localstorage_for_settings", "header_symbol_search", "header_compare", "header_undo_redo", "header_screenshot"], + + theme: 'dark', + toolbar_bg: '#130B25', + + width: '100%', + height: '600', + header_widget_buttons_mode: 'compact' + }; + + const tvWidget = new widget(widgetOptions); + this.tvWidget = tvWidget; + } + componentDidMount() { const widgetOptions = { symbol: this.props.symbol, @@ -59,6 +84,7 @@ export class TVChartContainer extends React.PureComponent { width: '100%', height: '600', + header_widget_buttons_mode: 'compact' }; const tvWidget = new widget(widgetOptions); diff --git a/src/components/lever/borrow/BorrowModal.tsx b/src/components/lever/borrow/BorrowModal.tsx index 2ff3824..b9f7262 100644 --- a/src/components/lever/borrow/BorrowModal.tsx +++ b/src/components/lever/borrow/BorrowModal.tsx @@ -168,13 +168,9 @@ export default function LendModal({ market, token }) { return ( <> - } - variant={"ghost"} - onClick={onOpen} - aria-label={""} - /> + @@ -204,11 +200,8 @@ export default function LendModal({ market, token }) { borderRadius={0} > {amountExceedsBalance() ? "Insufficient Balance" - : "Submit"} + : "Borrow"} {response && ( diff --git a/src/components/lever/borrow/BorrowTable.tsx b/src/components/lever/borrow/BorrowTable.tsx index 92acd3e..6f9c6f3 100644 --- a/src/components/lever/borrow/BorrowTable.tsx +++ b/src/components/lever/borrow/BorrowTable.tsx @@ -17,7 +17,7 @@ import { import Image from "next/image"; import { LeverDataContext } from "../../../context/LeverDataProvider"; -import { dollarFormatter } from "../../../utils/formatters"; +import { dollarFormatter, tokenFormatter } from '../../../utils/formatters'; import RepayModal from "./RepayModal"; import BorrowModal from "./BorrowModal"; @@ -48,12 +48,14 @@ export default function LendingTable() {
AssetTrading BalanceWallet BalanceActionsAssetTrading BalanceWallet Balance
+ @@ -166,7 +166,7 @@ export default function wallet() { + {tokenFormatter( @@ -191,7 +191,7 @@ export default function wallet() { + {tokenFormatter( @@ -217,7 +217,7 @@ export default function wallet() { + - + - - -
- + + + @@ -64,13 +66,7 @@ export default function LendingTable() { + + + - + + @@ -68,13 +71,7 @@ export default function LendingTable() { - + + + - + - - + {/* */} + @@ -166,7 +135,7 @@ export default function wallet() { - + */}
AssetBorrow Asset Borrow APR (%) Balance Liquidity
{""} {parseFloat( - market.rates[1].rate + market.rates[0].rate ).toFixed(2)}{" "} % +{" "} - {parseFloat("0.0").toFixed( - 2 - )}{" "} + {parseFloat( + market.rewardTokenEmissionsUSD + ? ( + (100 * + (market + .rewardTokenEmissionsUSD[0] * + 365)) / + market.totalDepositBalanceUSD + ).toString() + : "0" + ).toFixed(2)}{" "} % + + {tokenFormatter(null).format( + market.borrowBalance / 10**market.inputToken.decimals + )} {market.inputToken.symbol} + + + + {dollarFormatter(null).format( + market.borrowBalance / 10**market.inputToken.decimals * market.inputToken.lastPriceUSD + )} + + + + {tokenFormatter(null).format( + market.totalDepositBalanceUSD / market.inputToken.lastPriceUSD + )} {market.inputToken.symbol} + + + {dollarFormatter(null).format( market.totalDepositBalanceUSD )} + - } - variant={"ghost"} + @@ -201,11 +201,8 @@ export default function LendModal({ market, token }) { borderRadius={0} > {""} {amountExceedsBalance() ? "Insufficient Balance" - : "Submit"} + : "Repay"} {response && ( diff --git a/src/components/lever/lend/LendModal.tsx b/src/components/lever/lend/LendModal.tsx index 080cf87..abfc44c 100644 --- a/src/components/lever/lend/LendModal.tsx +++ b/src/components/lever/lend/LendModal.tsx @@ -75,6 +75,7 @@ export default function LendModal({ market, token }) { const updateSliderValue = (value: number) => { setSliderValue(value); + if(!token?.balance) return setInputAmount( ( (value * (token?.balance / 10 ** token?.decimals)) / @@ -94,6 +95,7 @@ export default function LendModal({ market, token }) { }; const amountExceedsBalance = () => { + if(!token?.balance) return true return Number(inputAmount) > token?.balance / 10 ** token?.decimals; }; @@ -182,7 +184,9 @@ export default function LendModal({ market, token }) { return ( <> - } variant={'ghost'} onClick={onOpen} aria-label={""}/> + @@ -193,7 +197,7 @@ export default function LendModal({ market, token }) { - {Number(inputAmount) < Number(market?.allowance) ? ( + {Number(inputAmount +1) < Number(market?.allowance) ? ( Balance{" "} - {token?.balance / 10 ** token?.decimals} + {token?.balance ? token?.balance / 10 ** token?.decimals : 0} @@ -212,11 +216,7 @@ export default function LendModal({ market, token }) { borderRadius={0} > {""} - {amountExceedsBalance() + {inputAmount == '0' ? 'Enter Amount' : amountExceedsBalance() ? "Insufficient Balance" - : "Submit"} + : "Deposit"} {response && ( @@ -372,9 +372,8 @@ export default function LendModal({ market, token }) { {""}
Asset + Supply Asset + Supply APR (%) Balance Total Deposits {""} {parseFloat( - market.rates[0].rate + market.rates[1].rate ).toFixed(2)}{" "} % +{" "} - {parseFloat("0.0").toFixed( - 2 - )}{" "} + {parseFloat( + market.rewardTokenEmissionsUSD + ? ( + (100 * + (market + .rewardTokenEmissionsUSD[1] * + 365)) / + market.totalDepositBalanceUSD + ).toString() + : "0" + ).toFixed(2)}{" "} % + + {tokenFormatter( + null + ).format( + market.collateralBalance + )}{" "} + {market.inputToken.symbol} + + + + {dollarFormatter( + null + ).format( + market.collateralBalance * + market.inputToken + .lastPriceUSD + )} + + {dollarFormatter(null).format( market.totalDepositBalanceUSD )} - } - variant={"ghost"} + @@ -217,11 +217,7 @@ export default function WithdrawModal({ market, token }) { borderRadius={0} > {""} {amountExceedsBalance() ? "Insufficient Balance" - : "Submit"} + : inputAmount == '0' ? 'Enter Amount' : "Withdraw"} {response && ( diff --git a/src/components/trade/GraphPanel.tsx b/src/components/trade/GraphPanel.tsx index b9ead70..ee9c0a0 100644 --- a/src/components/trade/GraphPanel.tsx +++ b/src/components/trade/GraphPanel.tsx @@ -2,12 +2,6 @@ import { Box, Flex, Text } from '@chakra-ui/react' import React from 'react' import dynamic from "next/dynamic"; -// const Graph = dynamic(() => import("./Graph"), { -// ssr: false -// }); - -// import dynamic from 'next/dynamic'; - const TVChartContainer = dynamic( () => import('../TVChartContainer').then(mod => mod.TVChartContainer), diff --git a/src/components/trade/Margin.tsx b/src/components/trade/Margin.tsx new file mode 100644 index 0000000..e69de29 diff --git a/src/components/trade/Orders/OrderBook.tsx b/src/components/trade/Orders/OrderBook.tsx index d16b7e0..0d5ba21 100644 --- a/src/components/trade/Orders/OrderBook.tsx +++ b/src/components/trade/Orders/OrderBook.tsx @@ -11,9 +11,9 @@ const Order = ({ order, index, total, pair, orderType }) => { const {setExchangeRate} = useContext(AppDataContext); return ( setExchangeRate(order.exchangeRate/(10**18))} _hover={{ cursor: 'pointer' }} - bgGradient={'linear(to-r,' + (orderType == 'BUY' ? 'rgba(24, 176, 95, 100%), rgba(24, 176, 95, 100%))' : 'rgba(200, 50, 50, 100%), rgba(200, 50, 50, 100%))')} - bgSize={'1%'} - bgRepeat='no-repeat' + // bgGradient={'linear(to-r,' + (orderType == 'BUY' ? 'rgba(24, 176, 95, 100%), rgba(24, 176, 95, 100%))' : 'rgba(200, 50, 50, 100%), rgba(200, 50, 50, 100%))')} + // bgSize={'1%'} + // bgRepeat='no-repeat' > { px={4} _hover={{ bgColor: orderType == 'BUY' ? 'rgba(24, 176, 95, 10%)' : 'rgba(200, 50, 50, 10%)' }} bgGradient={'linear(to-r,' + (orderType == 'BUY' ? 'rgba(24, 176, 95, 20%), rgba(24, 176, 95, 20%))' : 'rgba(200, 50, 50, 20%), rgba(200, 50, 50, 20%))')} - bgSize={600*order.amount/total + '%'} + bgSize={700*order.amount/total + '%'} bgRepeat='no-repeat' > @@ -62,10 +62,10 @@ export default function OrderBook({ pair }) { return ( - - Amount {pair?.tokens[0].symbol} - Amount {pair?.tokens[1].symbol} - Price {pair?.tokens[1].symbol} + + Amount {pair?.tokens[0].symbol} + Amount {pair?.tokens[1].symbol} + Price {pair?.tokens[1].symbol} {[...sellOrders].slice(0, 22).reverse().map((order: any, index: number) => { return ( @@ -98,7 +98,7 @@ export default function OrderBook({ pair }) { - {buyOrders.map((order: any, index: number) => { + {buyOrders.slice(0, 22).map((order: any, index: number) => { return ( diff --git a/src/components/trade/Orders/OrderHistory.tsx b/src/components/trade/Orders/OrderHistory.tsx index e760193..3a2eac2 100644 --- a/src/components/trade/Orders/OrderHistory.tsx +++ b/src/components/trade/Orders/OrderHistory.tsx @@ -35,7 +35,7 @@ export default function OrderHistory({pair}) { Amount {pair?.tokens[1].symbol} Price {pair?.tokens[1].symbol} - {(pairExecutedData[pair?.id]) && pairExecutedData[pair?.id].slice(0,45).map((order: any, index: number) => { + {(pairExecutedData[pair?.id]) && pairExecutedData[pair?.id].slice(0,47).map((order: any, index: number) => { return ; })} diff --git a/src/components/trade/UserOrders/CancelOrder.tsx b/src/components/trade/UserOrders/CancelOrder.tsx index 41d1de7..88174c0 100644 --- a/src/components/trade/UserOrders/CancelOrder.tsx +++ b/src/components/trade/UserOrders/CancelOrder.tsx @@ -65,7 +65,7 @@ export default function CancelOrder({ let exchange = await getContract('Exchange', chain); send( exchange, - 'updateLimitOrder', + 'cancelOrder', [ (chain == ChainID.NILE ? '0x' : '') + order.id, '0', @@ -148,7 +148,7 @@ export default function CancelOrder({ Order Amount {order.amount/(10**token0?.decimals)} {token0?.symbol} Exchange Rate - {order.exchangeRate/(10**pair?.exchangeRateDecimals)} {token1?.symbol}/{token0?.symbol} + {order.exchangeRate/(10**18)} {token1?.symbol}/{token0?.symbol} Order Type {order.orderType == '0' ? 'Buy' : 'Sell'} diff --git a/src/components/trade/UserOrders/PlacedOrders.tsx b/src/components/trade/UserOrders/PlacedOrders.tsx index b290da4..381481b 100644 --- a/src/components/trade/UserOrders/PlacedOrders.tsx +++ b/src/components/trade/UserOrders/PlacedOrders.tsx @@ -21,7 +21,7 @@ import UpdateOrder from './UpdateOrder'; import { tokenFormatter } from '../../../utils/formatters'; export default function PlacedOrders({ pair }) { - const { tokens } = useContext(DataContext); + const { tokens, placedOrders } = useContext(DataContext); const [token0, setToken0] = React.useState(null); const [token1, setToken1] = React.useState(null); const [pairNow, setPairNow] = React.useState(null); @@ -36,14 +36,14 @@ export default function PlacedOrders({ pair }) { tokens.find((token) => token.symbol === pair.tokens[1].symbol) ); setPairNow(pair.id) - }} + } + } }); - const { placedOrders } = useContext(DataContext); return ( - {placedOrders[pair?.id]?.length > 0 ? + {pair && placedOrders[pair?.id]?.length > 0 ? @@ -80,27 +80,26 @@ export default function PlacedOrders({ pair }) { @@ -109,8 +108,8 @@ export default function PlacedOrders({ pair }) { )}
{tokenFormatter(pair?.exchangeRateDecimals).format( order.exchangeRate / - 10 ** - pair?.exchangeRateDecimals + 10 ** 18 )}{' '} {token1?.symbol}/{token0?.symbol} - - */} + {/* + /> */}
-
: - +
+ : No orders placed } diff --git a/src/components/trade/UserOrders/index.tsx b/src/components/trade/UserOrders/index.tsx index 02499c2..75f3f0a 100644 --- a/src/components/trade/UserOrders/index.tsx +++ b/src/components/trade/UserOrders/index.tsx @@ -1,31 +1,31 @@ -import React from 'react' -import { Tabs, TabList, TabPanels, Tab, TabPanel } from '@chakra-ui/react' -import PlacedOrders from './PlacedOrders' -import ExecutedOrders from './ExecutedOrders'; -import CancelledOrders from './CancelledOrders'; +import React from "react"; +import { Tabs, TabList, TabPanels, Tab, TabPanel } from "@chakra-ui/react"; +import PlacedOrders from "./PlacedOrders"; +import ExecutedOrders from "./ExecutedOrders"; +import CancelledOrders from "./CancelledOrders"; -export default function index({pair}) { - return ( - <> - - - Placed Orders - Order History - Cancelled Orders - +export default function index({ pair }) { + return ( + <> + + + Placed Orders + Order History + Cancelled Orders + - - - - - + + + + + - - - - ) + + + + ); } diff --git a/src/components/trade/new_orders/BuySellModal.tsx b/src/components/trade/new_orders/BuySellModal.tsx index bf4e458..dae5ed7 100644 --- a/src/components/trade/new_orders/BuySellModal.tsx +++ b/src/components/trade/new_orders/BuySellModal.tsx @@ -41,11 +41,11 @@ export default function BuySellModal({ token0Amount, price, // needed for limit orders buy, - limit + limit, }) { - if(token0Amount == '') token0Amount = '0'; - if(token1Amount == '') token1Amount = '0'; - if(price == '') price = '0'; + if (token0Amount == "") token0Amount = "0"; + if (token1Amount == "") token1Amount = "0"; + if (price == "") price = "0"; const { isOpen, onOpen, onClose } = useDisclosure(); const [orders, setOrders] = React.useState(null); @@ -82,25 +82,28 @@ export default function BuySellModal({ let _amount = Big(token0Amount) .times(10 ** token0.decimals) .toFixed(0); - if(buy && !limit){ + if (buy && !limit) { _amount = Big(token1Amount) - .times(10 ** token1.decimals) - .toFixed(0); + .times(10 ** token1.decimals) + .toFixed(0); } - console.log(_amount); - axios - .get(Endpoints[chain] + `order/${limit ? 'limit' : 'market'}/matched/` + pair.id, { - params: { - amount: _amount, - exchangeRate: Big(price) - .times(10 ** 18) - .toFixed(0), - buy, - chainId: chain, - }, - }) + .get( + Endpoints[chain] + + `order/${limit ? "limit" : "market"}/matched/` + + pair.id, + { + params: { + amount: _amount, + exchangeRate: Big(price) + .times(10 ** 18) + .toFixed(0), + buy, + chainId: chain, + }, + } + ) .then((resp) => { let _orders = resp.data.data; setOrders(_orders); @@ -111,7 +114,7 @@ export default function BuySellModal({ initialStep: 0, }); - const _onClose = () => { + const _onClose = () => { setOrderToPlace(null); setOrders(null); onClose(); @@ -135,7 +138,8 @@ export default function BuySellModal({ > {!(isConnected || isEvmConnected) ? "Connect Wallet" - : !Big(token0Amount).gt(0) ? "Enter Amount" + : !Big(token0Amount).gt(0) + ? "Enter Amount" : amountExceedsBalance() ? "Insufficient Trading Balance" : buy @@ -162,97 +166,100 @@ export default function BuySellModal({ - {orders ? limit ? ( - orders.length > 0 ? ( - - - - - - - - - - - - - + {orders ? ( + limit ? ( + orders.length > 0 ? ( + + + + + + + + + + + + + ) : ( + + ) ) : ( - ) - ) : - - - - : ( - ( - <> - - - - - ) + ) : ( + <> + + + + )} diff --git a/src/components/trade/new_orders/Limit.tsx b/src/components/trade/new_orders/Limit.tsx index 1403326..8bc641e 100644 --- a/src/components/trade/new_orders/Limit.tsx +++ b/src/components/trade/new_orders/Limit.tsx @@ -6,7 +6,7 @@ import BuyModule from './Buy'; const LimitOrder = ({ pair }) => { return ( - + diff --git a/src/components/trade/new_orders/Market.tsx b/src/components/trade/new_orders/Market.tsx index 99bef9a..e568924 100644 --- a/src/components/trade/new_orders/Market.tsx +++ b/src/components/trade/new_orders/Market.tsx @@ -6,7 +6,7 @@ import BuyModule from './Buy'; const MarketOrder = ({ pair }) => { return ( - + diff --git a/src/components/trade/new_orders/OrdersToExecute.tsx b/src/components/trade/new_orders/OrdersToExecute.tsx index 1ce3e4f..a5974df 100644 --- a/src/components/trade/new_orders/OrdersToExecute.tsx +++ b/src/components/trade/new_orders/OrdersToExecute.tsx @@ -30,13 +30,15 @@ export default function OrdersToExecute({ pair, amountToFill, nextStep, + close, token0, token1, buy, setOrderToPlace, price, - limit + limit, }) { + const [remainingAmount, setRemainingAmount] = React.useState(amountToFill); const [totalSize, setTotalSize] = React.useState(0); const [tokenAmountToSpend, setTokenAmountToSpend] = React.useState("0"); const [amountExecuted, setAmountExecuted] = React.useState("0"); @@ -90,6 +92,7 @@ export default function OrdersToExecute({ } catch (err) {} }); setOrderToPlace(Big(_amount).sub(total).toFixed(0)); + setRemainingAmount(Big(_amount).sub(total).toFixed(0)); setAmountExecuted(total.toFixed(0)); setConfirmed(true); setResponse("Transaction Successful!"); @@ -114,15 +117,19 @@ export default function OrdersToExecute({ "approve", [getAddress("Exchange", chain), ethers.constants.MaxUint256], chain - ).then(async(res: any) => { - await res.wait(1); - setLoading(false); - incrementAllowance(tokenToSpend.id, ethers.constants.MaxUint256.toString()); - }) - .catch((err: any) => { - setLoading(false); - console.log(err); - }) + ) + .then(async (res: any) => { + await res.wait(1); + setLoading(false); + incrementAllowance( + tokenToSpend.id, + ethers.constants.MaxUint256.toString() + ); + }) + .catch((err: any) => { + setLoading(false); + console.log(err); + }); }; const checkResponse = (tx_id: string) => { @@ -211,46 +218,47 @@ export default function OrdersToExecute({ ) : ( <> - - - {orders.map((o: any) => { - if (Number(o.value.amount) > 0) - return ( - - - {o.signature} - + + {[...orders].slice(0, 2).map((o: any) => { + if (Number(o.value.amount) > 0) + return ( + + + {o.signature} + - - {tokenFormatter(null).format( - o.value.amount / - 10 ** - pair.tokens[0] - .decimals - )}{" "} - {pair.tokens[0].symbol} @{" "} - {tokenFormatter(null).format( - o.value.exchangeRate / - 10 ** 18 - )}{" "} - {pair.tokens[1].symbol} - - - ); - else return null; - })} - {orders.length == 0 && ( - - No orders to execute - - )} - - + + {tokenFormatter(null).format( + o.value.amount / + 10 ** + pair.tokens[0].decimals + )}{" "} + {pair.tokens[0].symbol} @{" "} + {tokenFormatter(null).format( + o.value.exchangeRate / 10 ** 18 + )}{" "} + {pair.tokens[1].symbol} + + + ); + else return null; + })} + {orders.length == 0 ? ( + + No orders to execute + + ) : (orders.length > 2) ? ( + + ... {orders.length - 2} more orders + + ) : <> + } + Amount to fill @@ -315,19 +323,19 @@ export default function OrdersToExecute({ <> ) : status == "success" || orders.length == 0 ? ( - ) : ( )}
diff --git a/src/components/trade/new_orders/PlaceOrder.tsx b/src/components/trade/new_orders/PlaceOrder.tsx index d883ad6..6cfe90c 100644 --- a/src/components/trade/new_orders/PlaceOrder.tsx +++ b/src/components/trade/new_orders/PlaceOrder.tsx @@ -166,8 +166,8 @@ export default function PlaceOrder({ {amountToPlace == 0 ? ( <> - - + + Limit order was executed successfully! diff --git a/src/context/DataProvider.tsx b/src/context/DataProvider.tsx index ded8b93..fc169fb 100644 --- a/src/context/DataProvider.tsx +++ b/src/context/DataProvider.tsx @@ -99,10 +99,9 @@ function DataProvider({ children }: any) { Promise.all(requests).then(async (res) => { _pairs = res[0].data.data; setPairs(_pairs); - subscribePairHistory(_pairs); + fetchPairData(_pairs, chain); - // fetchPairData(_pairs, chain); - // fetchPairStatus(_pairs, chain); + subscribePairHistory(_pairs); if(firstTime) { _tokens = res[1].data.data; @@ -118,10 +117,7 @@ function DataProvider({ children }: any) { if(address) { console.log('Fetching data...'); getWalletBalances(address, _tokens, chain); - // fetchPlacedOrders(address, _pairs, chain) - // fetchCancelledOrders(address, _pairs, chain) - // fetchExecutedOrders(address, _pairs, chain) - // fetchUserDepositsWithdraws(address, chain) + fetchPlacedOrders(address, _pairs, chain); } fetchOrders(_pairs, chain) fetchExecutedPairData(_pairs, chain); @@ -144,8 +140,6 @@ function DataProvider({ children }: any) { } setPairs(_pairs); }) - - } const fetchOrders = (pairs: any[], chain: number) => { @@ -166,29 +160,65 @@ function DataProvider({ children }: any) { } const fetchPlacedOrders = (address: string, pairs: any[], chain: number) => { - let orderRequests = pairs.map((pair) => { - return axios.get(Endpoints[chain]+`orders_placed/${address}/${pair.id}`); - }) + let orderRequests = []; + for(let i in pairs){ + orderRequests.push(axios.get(Endpoints[chain]+`user/orders/placed/${address}/pair/${pairs[i].id}`, { + params: { + chainId: chain + } + })); + orderRequests.push(axios.get(Endpoints[chain]+`user/orders/cancelled/${address}/pair/${pairs[i].id}`, { + params: { + chainId: chain + } + })); + orderRequests.push(axios.get(Endpoints[chain]+`user/orders/history/${address}/pair/${pairs[i].id}`, { + params: { + chainId: chain + } + })); + } Promise.all(orderRequests).then((res) => { - let newOrders = {}; - res.forEach((order, index) => { - return newOrders[pairs[index].id] = order.data.data; - }) - setPlacedOrders(newOrders); + console.log(res); + let _placedOrders = {}; + let _cancelledOrders = {}; + let _executedOrders = {}; + for(let i = 0; i < pairs.length; i++){ + _placedOrders[pairs[i].id] = res[i*3].data.data; + _cancelledOrders[pairs[i].id] = res[i*3+1].data.data; + _executedOrders[pairs[i].id] = res[i*3+2].data.data; + } + setCancelledOrders(_cancelledOrders); + setOrderHistory(_executedOrders); + setPlacedOrders(_placedOrders); }) } // api.zexe.io/pair/pricetrend/{pair}?interval=300000 const fetchPairData = (pairs: any[], chain: number) => { - let pairRequests = pairs.map((pair) => { - return axios.get(Endpoints[chain]+`pair/pricetrend/${pair.id}?interval=300000`); - }) + let pairRequests = [] + for(let i in pairs){ + pairRequests.push(axios.get(Endpoints[chain]+`pair/pricetrend/${pairs[i].id}`, { + params: { + chainId: chain, + interval: 300000 + } + })); + pairRequests.push(axios.get(Endpoints[chain]+`pair/trading/status/${pairs[i].id}`, { + params: { + chainId: chain + } + })) + } Promise.all(pairRequests).then((res) => { let newPairs = {}; - res.forEach((pair, index) => { - return newPairs[pairs[index].id] = pair.data.data; - }) + let _pairStatus = {}; + for(let i = 0; i < pairs.length; i++){ + newPairs[pairs[i].id] = res[i*2].data.data; + _pairStatus[pairs[i].id] = res[i*2+1].data.data; + } setPairData(newPairs); + setPairStats(_pairStatus); }) } @@ -210,55 +240,6 @@ function DataProvider({ children }: any) { }) } - // /orders_history/:taker/:pairId - const fetchExecutedOrders = async (address: string, pairs: any[], chain: number) => { - let pairRequests = pairs.map((pair) => { - return axios.get(Endpoints[chain]+`orders_history/${address}/${pair.id}`); - }) - Promise.all(pairRequests).then((res) => { - let newPairs = {}; - res.forEach((pair, index) => { - return newPairs[pairs[index].id] = pair.data.data; - }) - setOrderHistory(newPairs); - }) - } - - // /user/order/cancelled/:maker/:pairId - const fetchCancelledOrders = async (address: string, pairs: any[], chain: number) => { - let pairRequests = pairs.map((pair) => { - return axios.get(Endpoints[chain]+`user/order/cancelled/${address}/${pair.id}`); - }) - Promise.all(pairRequests).then((res) => { - let newPairs = {}; - res.forEach((pair, index) => { - return newPairs[pairs[index].id] = pair.data.data; - }) - setCancelledOrders(newPairs); - }) - } - - // /pair/trading/status/:pairId - const fetchPairStatus = async (pairs: any[], chain: number) => { - let pairRequests = pairs.map((pair) => { - return axios.get(Endpoints[chain]+`pair/trading/status/${pair.id}`); - }) - Promise.all(pairRequests).then((res) => { - let newPairs = {}; - res.forEach((pair, index) => { - return newPairs[pairs[index].id] = pair.data.data; - }) - setPairStats(newPairs); - }) - } - - // /user/deposits/withdraws/:id - const fetchUserDepositsWithdraws = async (address: string, chain: number) => { - axios.get(Endpoints[chain]+'user/deposits/withdraws/' + address).then((res) => { - setUserDepositWithdraws(res.data.data); - }) - } - const value: DataValue = { isDataReady, pairs, diff --git a/src/context/LeverDataProvider.tsx b/src/context/LeverDataProvider.tsx index 1d8d81d..32086fc 100644 --- a/src/context/LeverDataProvider.tsx +++ b/src/context/LeverDataProvider.tsx @@ -25,6 +25,7 @@ const coingeckoIds = { NEAR: "near", AURORA: "aurora-near", USDC: "usd-coin", + ZEXE: "zexe" }; const dummyPrices = { @@ -37,6 +38,7 @@ const dummyPrices = { NEAR: "3.2", AURORA: "0.8", USDC: "1", + ZEXE: "0.01" }; import erc20 from "../abis/ERC20.json"; @@ -159,6 +161,7 @@ function LeverDataProvider({ children }: any) { id name symbol + decimals lastPriceUSD } rates { @@ -169,6 +172,7 @@ function LeverDataProvider({ children }: any) { totalDepositBalanceUSD totalBorrowBalanceUSD maximumLTV + rewardTokenEmissionsUSD } }`, } diff --git a/src/pages/_margin/[pairId].tsx b/src/pages/_margin/[pairId].tsx new file mode 100644 index 0000000..53a6f0b --- /dev/null +++ b/src/pages/_margin/[pairId].tsx @@ -0,0 +1,90 @@ +import { Box, Flex, Tag, Text, useColorMode } from '@chakra-ui/react'; +import { Header } from '../../components/Header'; +import GraphPanel from '../../components/trade/GraphPanel'; +import TokensPanel from '../../components/trade/TokensPanel/TokensPanel'; +import OrdersPanel from '../../components/trade/Orders/OrdersPanel'; +import TitlePanel from '../../components/trade/TitlePanel'; +import Swap from '../../components/trade/new_orders/Limit'; +import { useContext } from 'react'; +import { DataContext } from '../../context/DataProvider'; +import { useRouter } from 'next/router'; +import PlacedOrders from '../../components/trade/UserOrders'; +import { useEffect, useState } from 'react'; +import Exchange from '../../components/trade/Exchange'; +import { WalletContext } from '../../context/Wallet'; +import Head from 'next/head'; +import { useAccount } from 'wagmi'; + +const Trade = () => { + const { pairs } = useContext(DataContext); + const { isConnected } = useContext(WalletContext); + + const { isConnected: isEvmConnected } = useAccount(); + + const router = useRouter(); + const { pairId } = router.query; + const [pair, setPair] = useState(null); + + // pairId = USD_ETH + + useEffect(() => { + if (pairs.length > 0) { + let _pair = pairs.find( + (pair) => + pair.tokens[0].symbol + '_' + pair.tokens[1].symbol === + pairId + ); + setPair(_pair); + if(!_pair) router.push('/trade/' + pairs[0].tokens[0].symbol + '_' + pairs[0].tokens[1].symbol) + } + }); + + return ( + <> + + + {pair?.exchangeRate / 10 ** 18}{' '} + {pair?.tokens[1].symbol}/{pair?.tokens[0].symbol} | ZEXE | + Buy & Sell Crypto on TRON + + + + + + + + + + + + + + + + + + + + + + + + + ); +}; + +export default Trade; diff --git a/src/pages/_margin/index.tsx b/src/pages/_margin/index.tsx new file mode 100644 index 0000000..5c316fb --- /dev/null +++ b/src/pages/_margin/index.tsx @@ -0,0 +1,28 @@ +import React from 'react' +import { useRouter } from 'next/router' +import { Box, Text, Flex } from '@chakra-ui/react' +import { useContext, useEffect } from 'react'; +import { DataContext } from '../../context/DataProvider'; +import { WalletContext } from '../../context/Wallet'; + +export default function trade() { + + const router = useRouter(); + const {pairs} = useContext(DataContext); + const {isConnecting} = useContext(WalletContext); + + useEffect(() => { + if(pairs.length > 0){ + router.push('/margin/' + pairs[0].tokens[0].symbol + '_' + pairs[0].tokens[1].symbol) + } + }) + return ( + <> + + {/* {(!isConnecting && !isConnecting) && + Please connect your wallet to continue + } */} + + + ) +} diff --git a/src/pages/faucet.tsx b/src/pages/faucet.tsx index 4117eef..38af48b 100644 --- a/src/pages/faucet.tsx +++ b/src/pages/faucet.tsx @@ -28,6 +28,7 @@ const mintAmount = { AURORA: 1000, NEAR: 100, USDC: 10000, + ZEXE: 1000000 }; const Big = require('big.js'); diff --git a/src/pages/graph.tsx b/src/pages/graph.tsx index 86f1659..1b77597 100644 --- a/src/pages/graph.tsx +++ b/src/pages/graph.tsx @@ -7,8 +7,8 @@ const TVChartContainer = dynamic( { ssr: false }, ); -const Index = () => { - return (); +const Index = ({symbol}) => { + return (); }; export default Index; diff --git a/src/pages/index.tsx b/src/pages/index.tsx index 9b5404f..49115a9 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -10,88 +10,87 @@ import { Button, Box, Divider, -} from '@chakra-ui/react'; +} from "@chakra-ui/react"; -import { Footer } from '../components/Footer'; -import { useColorMode } from '@chakra-ui/react'; -import Link from 'next/link'; -import Head from 'next/head'; -import { BsCurrencyExchange } from 'react-icons/bs'; -import { RiExchangeFundsFill } from 'react-icons/ri'; -import { GiBank, GiCardExchange } from 'react-icons/gi'; +import { Footer } from "../components/Footer"; +import { useColorMode } from "@chakra-ui/react"; +import Link from "next/link"; +import Head from "next/head"; +import { + BsCurrencyExchange, + BsDiscord, + BsGithub, + BsTwitter, +} from "react-icons/bs"; +import { RiExchangeFundsFill } from "react-icons/ri"; +import { GiBank, GiCardExchange } from "react-icons/gi"; const featuresTitle = { - fontSize: 'xl', - fontWeight: 'bold', + fontSize: "xl", + fontWeight: "bold", mt: 2, }; const featuresText = { - fontSize: 'sm', + fontSize: "sm", }; const featuresIcon = { - size: '25', + size: "25", }; const Index = () => { - return ( <> - - ZEXE | Buy & Sell Crypto on TRON - + ZEXE | Buy & Sell Crypto on TRON - + bgRepeat={"no-repeat"} + bgPosition={{ sm: "70vw 40vh", md: "70vw -160px" }} + bgSize={{ sm: "600px", md: "contain" }} + > + + bgClip="text" + > + > zexe - - - Professional trading platform on-chain: Transparent. - Secure. Better + + + Orderbook DEX with onchain spot and derivatives + market - {/* */} + {/* + Transparent. Secure. Better + */} - - + + Spot Trading @@ -101,11 +100,11 @@ const Index = () => { - + Margin and Futures @@ -115,11 +114,11 @@ const Index = () => { - + Perpetuals @@ -129,35 +128,38 @@ const Index = () => { - + - Option Calls + Money Markets - Buy puts or calls on tokens + Lend/Borrow assets with upto 32% APY - - - + + {/* none */} diff --git a/src/pages/lend.tsx b/src/pages/lend.tsx index 4f992df..e5a12b2 100644 --- a/src/pages/lend.tsx +++ b/src/pages/lend.tsx @@ -1,59 +1,119 @@ -import { Box, Flex, Heading, Text } from '@chakra-ui/react'; -import React from 'react' -import LendingTable from '../components/lever/lend/LendTable'; -import BorrowTable from '../components/lever/borrow/BorrowTable'; +import { Box, Flex, Heading, Text } from "@chakra-ui/react"; +import React from "react"; +import LendingTable from "../components/lever/lend/LendTable"; +import BorrowTable from "../components/lever/borrow/BorrowTable"; -import { LeverDataContext } from '../context/LeverDataProvider' -import { dollarFormatter } from '../utils/formatters'; +import { LeverDataContext } from "../context/LeverDataProvider"; +import { dollarFormatter, tokenFormatter } from '../utils/formatters'; // https://s2.coinmarketcap.com/static/img/coins/64x64/1027.png const imageIds = { - "ETH": "1027", - "BTC": "1", - "USDC": "3408", - "DAI": "4943" -} + ETH: "1027", + BTC: "1", + USDC: "3408", + DAI: "4943", +}; export default function lend() { - const {markets} = React.useContext(LeverDataContext); - const { availableToBorrow, totalBorrowBalance, totalCollateralBalance } = React.useContext(LeverDataContext); - - - return ( - <> - - Lend your assets - Earn with high APR % - - - - - Collateral - {dollarFormatter(null).format(parseFloat(totalCollateralBalance))} - - - - Borrowed - {dollarFormatter(null).format(parseFloat(totalBorrowBalance))} - - - - Available to borrow - {dollarFormatter(null).format(parseFloat(availableToBorrow))} - - - - - - - - - - - - - - - - ) + const { markets } = React.useContext(LeverDataContext); + const { availableToBorrow, totalBorrowBalance, totalCollateralBalance } = + React.useContext(LeverDataContext); + + const boxStyle = { + px: 4, + py: 10, + my: 2, + bgColor: "background2", + width: "33%" + } + return ( + <> + + Lend your assets + + Earn with high APR % + + + + + + + + My Balance + + {dollarFormatter(null).format( + parseFloat(totalCollateralBalance) + )} + + + + + Yield Accrued + + {dollarFormatter(null).format( + parseFloat(availableToBorrow) + )} + + + + + Earning APR (%) + + {tokenFormatter(null).format( + 0 + )} + + + + + + + + + + Borrow Balance + + {dollarFormatter(null).format( + parseFloat(totalCollateralBalance) + )} + + + + + + + Available to borrow + + {dollarFormatter(null).format( + parseFloat(availableToBorrow) + )} + + + + + Interest APR (%) + + {tokenFormatter(null).format( + 0 + )} + + + + + + + + ); } diff --git a/src/pages/portfolio.tsx b/src/pages/portfolio.tsx index b60db9c..1151e0a 100644 --- a/src/pages/portfolio.tsx +++ b/src/pages/portfolio.tsx @@ -37,38 +37,7 @@ export default function wallet() { const { tokens } = useContext(DataContext); const [balance, setBalance] = React.useState(0); const [tradingBalancesUSD, setTradingBalancesUSD] = React.useState([]); - const [totalTradingBalanceUSD, setTotalTradingBalanceUSD] = - React.useState(0); - - React.useEffect(() => { - if (isConnected) _setBalance(); - if (tokens[0]) - if ( - tradingBalancesUSD.length == 0 && - tokens[0].price && - tokens[0].tradingBalance - ) - _setTradingBalanceUSD(); - }); - - const _setTradingBalanceUSD = () => { - let _tradingBalancesUSD = []; - let _totalTradingBalanceUSD = 0; - for (let i in tokens) { - let _amount = - (tokens[i].tradingBalance * tokens[i].price) / - 10 ** tokens[i].decimals; - if (isNaN(_amount)) _amount = 0; - _tradingBalancesUSD.push(_amount); - _totalTradingBalanceUSD += _amount; - } - setTradingBalancesUSD(_tradingBalancesUSD); - setTotalTradingBalanceUSD(_totalTradingBalanceUSD); - }; - const _setBalance = async () => { - let _balance = await (window as any).tronWeb.trx.getBalance(address); - setBalance(_balance); - }; + const [totalTradingBalanceUSD, setTotalTradingBalanceUSD] = React.useState(0); return ( <> @@ -77,7 +46,7 @@ export default function wallet() { - {(isConnected || isEvmConnected) ? ( + {(isEvmConnected) ? ( - {address??evmAddress} + {evmAddress} - Trading Balance + Balance {dollarFormatter(null).format( - totalTradingBalanceUSD + 0 // totalTradingBalanceUSD )} @@ -133,8 +102,8 @@ export default function wallet() {
AssetTrading BalanceWallet BalanceTrading BalanceBalance
+ {/* {tokenFormatter( @@ -190,7 +159,7 @@ export default function wallet() { )} - diff --git a/src/pages/trade/[pairId].tsx b/src/pages/trade/[pairId].tsx index c5f834d..53a6f0b 100644 --- a/src/pages/trade/[pairId].tsx +++ b/src/pages/trade/[pairId].tsx @@ -77,11 +77,11 @@ const Trade = () => { - {/* {(isConnected || isEvmConnected) && ( - - - - )} */} + + + + + ); From d42cb2d45159c481c54454705e27d78fb1ecf979 Mon Sep 17 00:00:00 2001 From: prasad-kumkar Date: Sat, 17 Dec 2022 23:51:04 +0530 Subject: [PATCH 19/37] money markets --- src/components/trade/Margin.tsx | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/components/trade/Margin.tsx diff --git a/src/components/trade/Margin.tsx b/src/components/trade/Margin.tsx deleted file mode 100644 index e69de29..0000000 From 2fc775a4745bbe094d2a3f10971160f4bdc62187 Mon Sep 17 00:00:00 2001 From: prasad-kumkar Date: Sun, 18 Dec 2022 14:54:08 +0530 Subject: [PATCH 20/37] directory restructure, minor fixes --- package.json | 2 - src/components/ConnectButton.tsx | 386 ------ src/components/Header.tsx | 19 +- src/components/archieve/Market/Buy.tsx | 263 ----- src/components/archieve/Market/BuyModal.tsx | 357 ------ src/components/archieve/Market/Sell.tsx | 260 ---- src/components/archieve/Market/SellModal.tsx | 352 ------ src/components/archieve/Market/index.tsx | 13 - src/components/archieve/SellModal.tsx | 423 ------- .../{TVChartContainer => graph}/index.jsx | 6 +- .../index.module.css | 0 src/components/{ => landing}/CTA.tsx | 0 src/components/{ => landing}/Container.tsx | 0 .../{ => landing}/DarkModeSwitch.tsx | 0 src/components/{ => landing}/Footer.tsx | 13 +- src/components/{ => landing}/Hero.tsx | 0 src/components/{ => landing}/Main.tsx | 0 src/components/lever/borrow/BorrowModal.tsx | 2 - src/components/lever/borrow/RepayModal.tsx | 2 - src/components/lever/lend/LendModal.tsx | 2 - src/components/lever/lend/WithdrawModal.tsx | 2 - src/components/trade/Graph.tsx | 120 -- src/components/trade/GraphPanel.tsx | 8 +- src/components/trade/Orders/OrderBook.tsx | 2 +- src/components/trade/Orders/OrderHistory.tsx | 11 +- src/components/trade/Orders/OrdersPanel.tsx | 91 +- .../trade/{new_orders => exchange}/Buy.tsx | 0 .../{new_orders => exchange}/BuySellModal.tsx | 7 +- .../trade/{new_orders => exchange}/Limit.tsx | 0 .../trade/{new_orders => exchange}/Market.tsx | 0 .../OrdersToExecute.tsx | 0 .../{new_orders => exchange}/PlaceOrder.tsx | 4 +- .../trade/{new_orders => exchange}/Sell.tsx | 0 .../{Exchange.tsx => exchange/index.tsx} | 4 +- src/components/trade/priceData.ts | 1046 ----------------- src/components/trade/styles.css | 17 - .../{TokensPanel => tokens}/AllTokens.tsx | 0 .../{TokensPanel => tokens}/NewTokens.tsx | 0 .../{TokensPanel => tokens}/TokensPanel.tsx | 0 .../TrendingTokens.tsx | 0 .../CancelOrder.tsx | 0 .../CancelledOrders.tsx | 0 .../ExecutedOrders.tsx | 0 .../PlacedOrders.tsx | 0 .../UpdateOrder.tsx | 0 .../{UserOrders => user_orders}/index.tsx | 10 +- src/components/trade/volumeData.ts | 157 --- src/context/DataProvider.tsx | 3 +- src/context/LeverDataProvider.tsx | 1 - src/context/Wallet.tsx | 115 -- src/pages/_app.tsx | 108 +- src/pages/_margin/[pairId].tsx | 12 +- src/pages/_margin/index.tsx | 2 - src/pages/graph.tsx | 2 +- src/pages/index.tsx | 2 +- src/pages/portfolio.tsx | 2 - src/pages/trade/[pairId].tsx | 20 +- src/pages/trade/index.tsx | 2 - src/styles/rainbowTheme.tsx | 123 ++ src/{ => styles}/theme.tsx | 8 +- yarn.lock | 66 +- 61 files changed, 282 insertions(+), 3763 deletions(-) delete mode 100644 src/components/ConnectButton.tsx delete mode 100644 src/components/archieve/Market/Buy.tsx delete mode 100644 src/components/archieve/Market/BuyModal.tsx delete mode 100644 src/components/archieve/Market/Sell.tsx delete mode 100644 src/components/archieve/Market/SellModal.tsx delete mode 100644 src/components/archieve/Market/index.tsx delete mode 100644 src/components/archieve/SellModal.tsx rename src/components/{TVChartContainer => graph}/index.jsx (98%) rename src/components/{TVChartContainer => graph}/index.module.css (100%) rename src/components/{ => landing}/CTA.tsx (100%) rename src/components/{ => landing}/Container.tsx (100%) rename src/components/{ => landing}/DarkModeSwitch.tsx (100%) rename src/components/{ => landing}/Footer.tsx (88%) rename src/components/{ => landing}/Hero.tsx (100%) rename src/components/{ => landing}/Main.tsx (100%) delete mode 100644 src/components/trade/Graph.tsx rename src/components/trade/{new_orders => exchange}/Buy.tsx (100%) rename src/components/trade/{new_orders => exchange}/BuySellModal.tsx (96%) rename src/components/trade/{new_orders => exchange}/Limit.tsx (100%) rename src/components/trade/{new_orders => exchange}/Market.tsx (100%) rename src/components/trade/{new_orders => exchange}/OrdersToExecute.tsx (100%) rename src/components/trade/{new_orders => exchange}/PlaceOrder.tsx (97%) rename src/components/trade/{new_orders => exchange}/Sell.tsx (100%) rename src/components/trade/{Exchange.tsx => exchange/index.tsx} (91%) delete mode 100644 src/components/trade/priceData.ts delete mode 100644 src/components/trade/styles.css rename src/components/trade/{TokensPanel => tokens}/AllTokens.tsx (100%) rename src/components/trade/{TokensPanel => tokens}/NewTokens.tsx (100%) rename src/components/trade/{TokensPanel => tokens}/TokensPanel.tsx (100%) rename src/components/trade/{TokensPanel => tokens}/TrendingTokens.tsx (100%) rename src/components/trade/{UserOrders => user_orders}/CancelOrder.tsx (100%) rename src/components/trade/{UserOrders => user_orders}/CancelledOrders.tsx (100%) rename src/components/trade/{UserOrders => user_orders}/ExecutedOrders.tsx (100%) rename src/components/trade/{UserOrders => user_orders}/PlacedOrders.tsx (100%) rename src/components/trade/{UserOrders => user_orders}/UpdateOrder.tsx (100%) rename src/components/trade/{UserOrders => user_orders}/index.tsx (82%) delete mode 100644 src/components/trade/volumeData.ts delete mode 100644 src/context/Wallet.tsx create mode 100644 src/styles/rainbowTheme.tsx rename src/{ => styles}/theme.tsx (94%) diff --git a/package.json b/package.json index c744344..b015a9f 100644 --- a/package.json +++ b/package.json @@ -27,9 +27,7 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "react-icons": "^4.6.0", - "react-twitter-widgets": "^1.11.0", "socket.io-client": "^4.5.4", - "tronweb": "^4.4.0", "wagmi": "^0.8.3" }, "devDependencies": { diff --git a/src/components/ConnectButton.tsx b/src/components/ConnectButton.tsx deleted file mode 100644 index 61d9d9a..0000000 --- a/src/components/ConnectButton.tsx +++ /dev/null @@ -1,386 +0,0 @@ -import React, { useContext, useEffect, useState } from 'react'; -import { - Button, - Box, - Text, - Flex, - useDisclosure, - Input, - IconButton, - InputRightElement, - InputGroup, - Spinner, - Image, - Menu, - MenuButton, - MenuList, - MenuItem, - Fade, - Divider, -} from '@chakra-ui/react'; - -import { - Modal, - ModalOverlay, - ModalContent, - ModalHeader, - ModalFooter, - ModalBody, - ModalCloseButton, -} from '@chakra-ui/react'; - -import { BsPlusCircle } from 'react-icons/bs'; -import { AiOutlineDisconnect, AiOutlineInfoCircle } from 'react-icons/ai'; - -import { WalletContext } from '../context/Wallet'; -import { DataContext } from '../context/DataProvider'; -import { Avatar } from '@chakra-ui/react'; -import { BiLogOut, BiMoney } from 'react-icons/bi'; -import { MdCopyAll, MdLogout } from 'react-icons/md'; -import { ChevronDownIcon, ChevronUpIcon } from '@chakra-ui/icons'; -import Link from 'next/link'; -import { useAccount, useConnect, useDisconnect } from 'wagmi'; -import { chains, ChainID, chainIndex } from '../utils/chains'; -import { LeverDataContext } from '../context/LeverDataProvider'; - -const ConnectButton = ({}) => { - const {address: evmAddress, isConnected: isEvmConnected, isConnecting: isEvmConnecting} = useAccount(); - const {connectAsync: connectEvm, connectors} = useConnect(); - const { disconnect: disconnectEvm } = useDisconnect() - - const { - isConnected: isTronConnected, - isConnecting, - address: tronAddress, - connect: connectTron, - disconnect, - setConnectionError - } = useContext(WalletContext); - - const { isDataReady, isFetchingData, fetchData, setChain, chain } = useContext(DataContext); - const { fetchData: fetchLeverData } = useContext(LeverDataContext); - - const { isOpen, onOpen, onClose } = useDisclosure(); - const { - isOpen: isConnectOpen, - onOpen: onConnectOpen, - onClose: onConnectClose, - } = useDisclosure(); - - const _connectTron = () => { - connectTron((_address: string | null, _err: string) => { - if (!isDataReady && !isFetchingData && _address) { - fetchData(_address, ChainID.NILE); - fetchLeverData(_address, ChainID.NILE); - setChain(ChainID.NILE); - } - }); - onConnectClose(); - }; - - const _copy = () => { - navigator.clipboard.writeText(tronAddress as string); - }; - - const _connectEvm = (chain: number) => { - connectEvm({chainId: chains[chain].id, connector: connectors[0]}).then((res) => { - fetchData(res.account, chain); - fetchLeverData(res.account, chain); - setChain(chain); - localStorage.setItem("address", res.account) - localStorage.setItem("chain", ChainID.AURORA.toString()); - }) - .catch((err: any) => { - err = JSON.stringify(err); - if(err.includes('ChainNotConfigured')){ - window.ethereum.request({method: 'wallet_addEthereumChain', params: [{ - chainId: '0x' + ChainID.AURORA.toString(16), - chainName: 'Aurora Testnet', - nativeCurrency: { - name: 'Aurora', - symbol: 'ETH', - decimals: 18 - }, - rpcUrls: [chains[chainIndex[ChainID.AURORA]].rpcUrls.default], - blockExplorerUrls: [chains[chainIndex[ChainID.AURORA]].blockExplorers.default.url] - }]}) - .then((res: any) => { - _connectEvm(chain); - }) - } else if (err.includes("ConnectorNotFoundError")) { - setConnectionError("Please install Metamask wallet extension."); - } else { - setConnectionError(err); - } - }) - onConnectClose(); - }; - - const _disconnect = () => { - if(chain == ChainID.NILE) { - disconnect(); - // reload - window.location.reload(); - } else { - localStorage.removeItem("address"); - localStorage.removeItem("chain"); - disconnectEvm(); - window.location.reload(); - } - onClose(); - }; - - const address = () => { - if (isEvmConnected) return evmAddress; - if (isTronConnected) return tronAddress; - return ''; - } - - return ( - - {isTronConnected || isEvmConnected ? ( - // - // - // - - - - - - My Wallet - {isOpen ? : } - - - - - - - - - {address().slice(0, 5) + - '....' + - address().slice(-5)} - - - - - - - - - {/* */} - - - - {/* */} - - ) : ( - - )} - - - - - - - - Choose a network - - - - - {/* */} -{/* - */} - - {/* */} - - - - - - ); -}; - -export default ConnectButton; \ No newline at end of file diff --git a/src/components/Header.tsx b/src/components/Header.tsx index e4303ba..edb30b4 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -10,8 +10,6 @@ import { } from '@chakra-ui/react'; import Link from 'next/link'; import { useEffect, useContext, useState } from 'react'; -import { MdArrowDropDown } from 'react-icons/md'; -import { DarkModeSwitch } from './DarkModeSwitch'; import { Menu, MenuButton, @@ -28,7 +26,6 @@ import { useRouter } from 'next/router'; // import ConnectButton from './ConnectButton'; import { ConnectButton } from '@rainbow-me/rainbowkit'; -import { WalletContext } from '../context/Wallet'; import { DataContext } from '../context/DataProvider'; import { @@ -51,8 +48,6 @@ export const Header = ({ title }: { title: string }) => { const router = useRouter(); const { isOpen, onToggle } = useDisclosure(); - const { connectionError, connect, isConnected, isConnecting, setConnectionError } = - useContext(WalletContext); const { isFetchingData, isDataReady, fetchData, setChain } = useContext(DataContext); const [init, setInit] = useState(false); const { fetchData: fetchLeverData } = useContext(LeverDataContext); @@ -132,17 +127,6 @@ export const Header = ({ title }: { title: string }) => { } return ( <> - {connectionError && ( - - ⚠️ {connectionError} - - )} { bgColor={'background2'} // color={"white"} py={1} - px={6}> + pl={6} + pr={2}> { - const _token0 = tokens.find((t) => t.id === pair?.tokens[0].id); - const _token1 = tokens.find((t) => t.id === pair?.tokens[1].id); - - setToken0(_token0); - setToken1(_token1); - if (pair && pairNow !== pair?.id) { - const _token0 = tokens.find((t) => t.id === pair?.tokens[0].id); - const _token1 = tokens.find((t) => t.id === pair?.tokens[1].id); - - setToken0(_token0); - setToken1(_token1); - const newExchangeRate = - pair?.exchangeRate / 10 ** 18; - - setPrice(newExchangeRate.toFixed(pair?.exchangeRateDecimals)); - newExchangeRate > 0 - ? settoken0Amount( - Big(amount) - .div(newExchangeRate) - .toNumber() - .toFixed(pair?.exchangeRateDecimals ?? 0) - ) - : settoken0Amount('0'); - setPairNow(pair?.id); - } - - if ( - pair?.exchangeRate > 0 && - token1?.balance && - token0?.balance && - isNaN(sliderValue) - ) { - const _price = Big(pair.exchangeRate).div( - 10 ** 18 - ); - setPrice(_price.toString()); - setSliderValue(20); - if (_price.toNumber() > 0) { - const token1Amount = Big(30) - .times(token1.balance) - .div(100) - .div(10 ** token1.decimals); - - setAmount( - token1Amount.toNumber().toFixed(pair.exchangeRateDecimals) - ); - settoken0Amount( - token1Amount - .div(_price) - .toNumber() - .toFixed(pair.exchangeRateDecimals) - ); - } - } - }); - - const setSlider = (e: any) => { - setSliderValue(e); - if(!token0 || !price) return; - const token1Amount = Big(e) - .times(token1?.balance ?? 0) - .div(100) - .div(10 ** token1?.decimals); - setAmount(token1Amount.toString()); - if (price != '0' && price != '' && Number(price)) - if (Number(price) > 0) - settoken0Amount(token1Amount.div(price).toString()); - }; - - const updateToken1Amount = (e) => { - setAmount(e); - if ( - price != '0' && - price != '' && - Number(price) && - e != '0' && - e != '' && - Number(e) - ) - settoken0Amount(Big(e).div(price).toString()); - }; - - const updateToken0Amount = (e) => { - settoken0Amount(e); - if ( - price != '0' && - price != '' && - Number(price) && - e != '0' && - e != '' && - Number(e) - ) - setAmount(Big(e).times(price).toString()); - }; - - const onPriceChange = (e) => { - setPrice(e); - if (amount != '0' && amount != '' && e != '0' && e != '' && Number(e)) - settoken0Amount(Big(amount).div(e).toString()); - }; - - const labelStyles = { - mt: '2', - ml: '-2.5', - fontSize: 'xs', - color: 'gray.500', - }; - - return ( - - - Price ({token1?.symbol}) - - - - - - - - - - {/* - Amount ({token0?.symbol}) - - - - - - - - */} - - - - Total ({token1?.symbol}) - - Balance{' '} - {tokenFormatter(null).format( - (token1?.balance ?? 0) / - 10 ** token1?.decimals - )} - - - - - - - - - - - - - - 25% - - - 50% - - - 75% - - - {isNaN(sliderValue) ? 0 : sliderValue}% - - - - - - - - - - - ); -} diff --git a/src/components/archieve/Market/BuyModal.tsx b/src/components/archieve/Market/BuyModal.tsx deleted file mode 100644 index 5584f5e..0000000 --- a/src/components/archieve/Market/BuyModal.tsx +++ /dev/null @@ -1,357 +0,0 @@ -import { - Alert, - AlertIcon, - Box, - Button, - Flex, - Text, - useDisclosure, -} from '@chakra-ui/react'; -import React, { useContext } from 'react'; -const Big = require('big.js'); - -import axios from 'axios'; -import { getABI, getAddress, getContract, send } from '../../../utils/contract'; - -import { - Modal, - ModalOverlay, - ModalContent, - ModalHeader, - ModalFooter, - ModalBody, - ModalCloseButton, -} from '@chakra-ui/react'; - -import { DataContext } from '../../../context/DataProvider'; -import Link from 'next/link'; -import { AiOutlineLoading } from 'react-icons/ai'; -import { CheckIcon } from '@chakra-ui/icons'; -import { tokenFormatter } from '../../../utils/formatters'; -import { WalletContext } from '../../../context/Wallet'; -import { useAccount } from 'wagmi'; -import { ChainID } from '../../../utils/chains'; -import { Endpoints } from '../../../utils/const'; - -export default function BuyModal({ - pair, - token1, - token0, - token0Amount, - amount, - price, -}) { - const { isOpen, onOpen, onClose } = useDisclosure(); - const [loading, setLoading] = React.useState(false); - const [response, setResponse] = React.useState(null); - const [hash, setHash] = React.useState(null); - const [confirmed, setConfirmed] = React.useState(false); - const [orders, setOrders] = React.useState([]); - const [orderToPlace, setOrderToPlace] = React.useState(0); - const [expectedOutput, setExpectedOutput] = React.useState(0); - - const { isConnected } = useContext(WalletContext); - const { isConnected: isEvmConnected } = useAccount(); - const { chain, explorer } = useContext(DataContext); - - const amountExceedsBalance = () => { - if (amount == '0' || amount == '' || !token1?.tradingBalance) - return false; - if (Number(amount) && token1?.tradingBalance) - return Big(amount).gt( - Big(token1?.tradingBalance).div(10 ** token1?.decimals) - ); - }; - - const amountExceedsMin = () => { - if (token0Amount == '0' || token0Amount == '' || !token0 || !pair) - return false; - if (Number(token0Amount) && pair?.minToken0Order && token0.decimals) - return Big(token0Amount).lt( - Big(pair?.minToken0Order).div(10 ** token0.decimals) - ); - }; - - const buy = async () => { - setLoading(true); - setConfirmed(false); - setHash(null); - setResponse(''); - let _amount = Big(token0Amount) - .times(10 ** token0.decimals) - .toFixed(0); - - let exchange = await getContract('Exchange', chain); - send( - exchange, - 'executeAndPlaceOrder', - [ - pair.tokens[0].id, - pair.tokens[1].id, - _amount, - Number.MAX_SAFE_INTEGER.toString(), - 1, - orders.map((o) => (chain == ChainID.NILE ? '0x' : '') + o.id), - ], - chain - ) - .then(async (res: any) => { - setLoading(false); - setResponse('Transaction sent! Waiting for confirmation...'); - if (chain == ChainID.NILE) { - setHash(res); - checkResponse(res); - } else { - setHash(res.hash); - await res.wait(1); - setConfirmed(true); - setResponse('Transaction Successful!'); - } - }) - .catch((err: any) => { - setLoading(false); - setConfirmed(true); - setResponse('Transaction failed. Please try again!'); - }); - }; - - // check response in intervals - const checkResponse = (tx_id: string) => { - axios - .get( - 'https://nile.trongrid.io/wallet/gettransactionbyid?value=' + - tx_id - ) - .then((res) => { - if (!res.data.ret) { - setTimeout(() => { - checkResponse(tx_id); - }, 2000); - } else { - setConfirmed(true); - if (res.data.ret[0].contractRet == 'SUCCESS') { - setResponse('Transaction Successful!'); - } else { - setResponse('Transaction Failed. Please try again.'); - } - } - }) - .catch((err: any) => { - setLoading(false); - }); - }; - - const _onOpen = () => { - onOpen(); - let _amount = Big(token0Amount) - .times(10 ** token0.decimals) - .toFixed(0); - - axios - .get(Endpoints[chain] + 'market/matched/orders/' + pair.id, { - params: { - amount: _amount, - exchange_rate: Big(price).times( - 10 ** pair.exchangeRateDecimals - ), - order_type: 1, - }, - }) - .then((resp) => { - let orders = resp.data.data; - let ordersToExecute = []; - let _orderToPlace = token0Amount * 10 ** token0.decimals; - let _expectedOutput = Big(0); - for (let i in orders) { - let execAmount = Math.min(_orderToPlace, orders[i].amount); - orders[i].amount = execAmount; - ordersToExecute.push(orders[i]); - _orderToPlace = Big(_orderToPlace) - .minus(execAmount) - .toFixed(0); - _expectedOutput = _expectedOutput.plus( - Big(execAmount) - .times(orders[i].exchangeRate) - .div(10 ** pair.exchangeRateDecimals) - ); - } - _expectedOutput = _expectedOutput.plus( - Big(_orderToPlace).times(price) - ); - - setOrderToPlace( - Number(_orderToPlace) > Number(pair?.minToken0Order) - ? _orderToPlace - : 0 - ); - setOrders(ordersToExecute); - setExpectedOutput(_expectedOutput.toFixed(0)); - }); - }; - - const _onClose = () => { - setOrderToPlace(0); - setLoading(false); - setResponse(null); - setOrders([]); - onClose(); - }; - - return ( - <> - - - - - - Review - - - Executing Orders - {orders.map((o) => { - if (o.amount > 0) - return ( - - {/* Order ID */} - ID: {o.id} - - - {tokenFormatter(null).format( - o.amount / - 10 ** - pair.tokens[0].decimals - )}{' '} - {pair.tokens[0].symbol} @{' '} - {tokenFormatter(null).format( - o.exchangeRate / - 10 ** - pair.exchangeRateDecimals - )}{' '} - {pair.tokens[1].symbol} - - - ); - else return null; - })} - {orders.length == 0 && ( - - No orders to execute - - )} - Placing Orders - {orderToPlace > 0 ? ( - - OrderType: BUY - - {orderToPlace / 10 ** token0?.decimals}{' '} - {token0?.symbol} @ {price} {token1?.symbol} - - - ) : ( - - No limit order to place - - )} - - - Estimated Output: {token0Amount} {token0?.symbol} - - - Total Amount:{' '} - {expectedOutput / 10 ** token1?.decimals}{' '} - {token1?.symbol} - - - - - - {response ? ( - - - - - - - {response} - - {hash && - - View on explorer - - } - - - - - - ) : ( - <> - - {' '} - - )} - - - - - - ); -} diff --git a/src/components/archieve/Market/Sell.tsx b/src/components/archieve/Market/Sell.tsx deleted file mode 100644 index a167be2..0000000 --- a/src/components/archieve/Market/Sell.tsx +++ /dev/null @@ -1,260 +0,0 @@ -import { - NumberInput, - NumberInputField, - NumberInputStepper, - NumberIncrementStepper, - NumberDecrementStepper, -} from '@chakra-ui/react'; - -import { - Slider, - SliderTrack, - SliderFilledTrack, - SliderThumb, - SliderMark, -} from '@chakra-ui/react'; - -import { Box, Button, Flex, Heading, Input, Text } from '@chakra-ui/react'; -import React from 'react'; -import { useContext } from 'react'; -import { DataContext } from '../../../context/DataProvider'; -import { useEffect } from 'react'; -import axios from 'axios'; -import { getABI, getAddress } from '../../../utils/contract'; -import SellModal from './SellModal'; -import { tokenFormatter } from '../../../utils/formatters'; -import { AppDataContext } from '../../../context/AppData'; -const Big = require('big.js'); - -const MIN_T0_ORDER = '10000000000000000'; - -export default function BuyModule({ pair }) { - const [pairNow, setPairNow] = React.useState(null); - const [amount, setAmount] = React.useState('0'); - const [token1Amount, settoken1Amount] = React.useState('0'); - const [loading, setLoading] = React.useState(false); - const [response, setResponse] = React.useState(null); - - const [sliderValue, setSliderValue] = React.useState(NaN); - - const [token0, setToken0] = React.useState(null); - const [token1, setToken1] = React.useState(null); - - const { tokens } = useContext(DataContext); - - const {exchangeRate: price, setExchangeRate: setPrice} = useContext(AppDataContext); - - useEffect(() => { - const _token0 = tokens.find((t) => t.id === pair?.tokens[0].id); - const _token1 = tokens.find((t) => t.id === pair?.tokens[1].id); - setToken0(_token0); - setToken1(_token1); - // if there is change in pair - if(pair && pairNow !== pair?.id) { - const _token0 = tokens.find((t) => t.id === pair?.tokens[0].id); - const _token1 = tokens.find((t) => t.id === pair?.tokens[1].id); - setToken0(_token0); - setToken1(_token1); - const newExchangeRate = (pair?.exchangeRate/(10**18)) - setPrice(newExchangeRate.toFixed(pair?.exchangeRateDecimals)); - settoken1Amount(Big(amount).mul(newExchangeRate).toNumber().toFixed(pair?.exchangeRateDecimals ?? 0)); - setPairNow(pair?.id); - } - - if ( - pair?.exchangeRate > 0 && - token1?.balance && - token0?.balance && - isNaN(sliderValue) - ) { - const _price = Big(pair.exchangeRate).div( - 10 ** 18 - ); - setPrice(_price.toString()); - setSliderValue(20); - if (_price.toNumber() > 0) { - const token0Amount = Big(30) - .times(token0.balance) - .div(100) - .div(10 ** token1.decimals); - setAmount(token0Amount.toNumber().toFixed(pair.exchangeRateDecimals)); - settoken1Amount( - token0Amount.times(_price).toNumber().toFixed(pair.exchangeRateDecimals) - ); - } - } - }); - - // check response in intervals - const checkResponse = (tx_id: string) => { - axios.get('https://nile.trongrid.io/wallet/gettransactionbyid?value=' + tx_id) - .then(res => { - if(!res.data.ret){ - setTimeout(() => { - checkResponse(tx_id); - }, 2000); - } else { - setLoading(false) - if(res.data.ret[0].contractRet == 'SUCCESS') { - setResponse('Transaction Successful!') - } else { - setResponse('Transaction Failed. Please try again.') - } - } - }) - } - - const setSlider = (e) => { - setSliderValue(e); - if(!token0 || !price) return; - const token0Amount = Big(e) - .times(token0?.balance ?? 0) - .div(100) - .div(10 ** token1?.decimals); - setAmount(token0Amount.toNumber().toString()); - if (price != '0' && price != '' && Number(price)) - if (Number(price) > 0) - settoken1Amount(token0Amount.times(price).toString()); - }; - - const updateToken0Amount = (e) => { - setAmount(e); - if ( - price != '0' && - price != '' && - Number(price) && - e != '0' && - e != '' && - Number(e) - ) - settoken1Amount(Big(e).times(price).toString()); - }; - - const updateToken1Amount = (e) => { - settoken1Amount(e); - if ( - price != '0' && - price != '' && - Number(price) && - e != '0' && - e != '' && - Number(e) - ) - setAmount(Big(e).div(price).toString()); - }; - - const onPriceChange = (e) => { - setPrice(e); - if (amount != '0' && amount != '' && e != '0' && e != '' && Number(e)) - settoken1Amount(Big(amount).times(e).toString()); - }; - - - - const labelStyles = { - mt: '2', - ml: '-2.5', - fontSize: 'xs', - color: 'gray.500', - }; - - return ( - - - Price ({pair?.tokens[1].symbol}) - - - - - - - - - - {/* - Amount ({pair?.tokens[1].symbol}) - - - - - - - - */} - - - - Total ({pair?.tokens[0].symbol}) - Balance {tokenFormatter(null).format((token0?.balance ?? 0)/(10**token0?.decimals))} - - - - - - - - - - - - 25% - - - 50% - - - 75% - - - {isNaN(sliderValue) ? 0 : sliderValue}% - - - - - - - - - - - - ); -} diff --git a/src/components/archieve/Market/SellModal.tsx b/src/components/archieve/Market/SellModal.tsx deleted file mode 100644 index e2b5e92..0000000 --- a/src/components/archieve/Market/SellModal.tsx +++ /dev/null @@ -1,352 +0,0 @@ -import { - Alert, - AlertIcon, - Box, - Button, - Flex, - Text, - useDisclosure, -} from '@chakra-ui/react'; -import React, { useContext } from 'react'; -const Big = require('big.js'); - -const MIN_T0_ORDER = '10000000000000000'; -import axios from 'axios'; -import { getABI, getAddress, getContract, send } from '../../../utils/contract'; - -import { - Modal, - ModalOverlay, - ModalContent, - ModalHeader, - ModalFooter, - ModalBody, - ModalCloseButton, -} from '@chakra-ui/react'; - -import { DataContext } from '../../../context/DataProvider'; -import Link from 'next/link'; -import { AiOutlineLoading } from 'react-icons/ai'; -import { CheckIcon } from '@chakra-ui/icons'; -import { tokenFormatter } from '../../../utils/formatters'; -import { WalletContext } from '../../../context/Wallet'; -import { ChainID } from '../../../utils/chains'; -import { useAccount } from 'wagmi'; -import { Endpoints } from '../../../utils/const'; - -export default function SellModal({ - pair, - token1, - token0, - token1Amount, - amount, - price, -}) { - const { isOpen, onOpen, onClose } = useDisclosure(); - const [loading, setLoading] = React.useState(false); - const [response, setResponse] = React.useState(null); - const [hash, setHash] = React.useState(null); - const [confirmed, setConfirmed] = React.useState(false); - const [orders, setOrders] = React.useState([]); - const [orderToPlace, setOrderToPlace] = React.useState(0); - const [expectedOutput, setExpectedOutput] = React.useState(0); - - const { isConnected } = useContext(WalletContext); - const { chain, explorer } = useContext(DataContext); - const { address: evmAddress, isConnected: isEvmConnected } = useAccount(); - - - const sell = async () => { - setLoading(true); - let _amount = Big(amount) - .times(10 ** token0.decimals) - .toFixed(0); - - let exchange = await getContract('Exchange', chain); - - send( - exchange, - 'executeAndPlaceOrder', - [ - pair.tokens[0].id, - pair.tokens[1].id, - _amount, - pair.exchangeRate, - 0, - orders.map((o) => (chain == ChainID.NILE ? '0x' : '') + o.id), - ], - chain - ) - .then(async (res: any) => { - setLoading(false); - setResponse('Transaction sent! Waiting for confirmation...'); - if (chain == ChainID.NILE) { - setHash(res); - checkResponse(res); - } else { - setHash(res.hash); - await res.wait(1); - setConfirmed(true); - setResponse('Transaction Successful!'); - } - }) - .catch((err: any) => { - console.log(err) - setLoading(false); - setConfirmed(true); - setResponse('Transaction failed. Please try again!'); - }); - }; - - // check response in intervals - const checkResponse = (tx_id: string) => { - axios - .get( - 'https://nile.trongrid.io/wallet/gettransactionbyid?value=' + - tx_id - ) - .then((res) => { - if (!res.data.ret) { - setTimeout(() => { - checkResponse(tx_id); - }, 2000); - } else { - setConfirmed(true); - if (res.data.ret[0].contractRet == 'SUCCESS') { - setResponse('Transaction Successful!'); - } else { - setResponse('Transaction Failed. Please try again.'); - } - } - }); - }; - - const _onOpen = () => { - onOpen(); - let _amount = Big(amount) - .times(10 ** token0.decimals) - .toFixed(0); - - axios - .get(Endpoints[chain] + 'market/matched/orders/' + pair.id, { - params: { - amount: _amount, - exchange_rate: Big(price).times( - 10 ** pair.exchangeRateDecimals - ), - order_type: 0, - }, - }) - .then((resp) => { - let orders = resp.data.data; - let ordersToExecute = []; - let _orderToPlace = amount * 10 ** token0.decimals; - let _expectedOutput = Big(0); - for (let i in orders) { - let execAmount = Math.min(_orderToPlace, orders[i].amount); - orders[i].amount = execAmount; - ordersToExecute.push(orders[i]); - _orderToPlace = Big(_orderToPlace) - .minus(execAmount) - .toFixed(0); - _expectedOutput = _expectedOutput.plus( - Big(execAmount) - .div(orders[i].exchangeRate) - .times(10 ** pair.exchangeRateDecimals) - ); - } - _expectedOutput = _expectedOutput.plus( - Big(_orderToPlace).div(price) - ); - setOrderToPlace( - Number(_orderToPlace) > Number(pair?.minToken0Order) - ? _orderToPlace - : 0 - ); - setOrders(ordersToExecute); - setExpectedOutput(_expectedOutput.toFixed(0)); - }); - }; - - const _onClose = () => { - setOrderToPlace(0); - setLoading(false); - setResponse(null); - setOrders([]); - onClose(); - }; - - const amountExceedsBalance = () => { - if (amount == '0' || amount == '' || !token0 || !token1) return false; - if (Number(amount) && token0.tradingBalance && token1.decimals) - return Big(amount).gt( - Big(token0.tradingBalance).div(10 ** token1.decimals) - ); - }; - - const amountExceedsMin = () => { - if (amount == '0' || amount == '' || !pair || !token0) return false; - if (Number(amount) && pair?.minToken0Order && token0.decimals) - return Big(amount).lt( - Big(pair?.minToken0Order).div(10 ** token0.decimals) - ); - }; - - return ( - <> - - - - - - Review - - - Executing Orders - - {orders.map((o) => { - if (o.amount > 0) - return ( - - {/* Order ID */} - - ID: {o.id} - - - - {tokenFormatter(null).format( - o.amount / - 10 ** - pair.tokens[0] - .decimals - )}{' '} - {pair.tokens[0].symbol} @{' '} - {tokenFormatter(null).format( - o.exchangeRate / - 10 ** - pair.exchangeRateDecimals - )}{' '} - {pair.tokens[1].symbol} - - - ); - else return null; - })} - - {orders.length == 0 && ( - - No orders to execute - - )} - Placing Orders - {orderToPlace > 0 ? ( - - OrderType: SELL - - {orderToPlace / 10 ** token0?.decimals}{' '} - {token0?.symbol} @ {price} {token1?.symbol} - - - ) : ( - - No limit order to place - - )} - - - Estimated Output: {amount} {token0?.symbol} - - - Total Amount: {token1Amount} {token1?.symbol} - - - - - - {response ? ( - - - - - - - {response} - - - - View on explorer - - - - - - - - ) : ( - <> - - {' '} - - )} - - - - - - ); -} diff --git a/src/components/archieve/Market/index.tsx b/src/components/archieve/Market/index.tsx deleted file mode 100644 index 4982b9c..0000000 --- a/src/components/archieve/Market/index.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import { Flex } from '@chakra-ui/react' -import React from 'react' -import BuyModule from './Buy' -import SellModule from './Sell' - -export default function MarketOrder({pair}) { - return ( - - - - - ) -} diff --git a/src/components/archieve/SellModal.tsx b/src/components/archieve/SellModal.tsx deleted file mode 100644 index b9e9be2..0000000 --- a/src/components/archieve/SellModal.tsx +++ /dev/null @@ -1,423 +0,0 @@ -import { - Alert, - AlertIcon, - Box, - Button, - Flex, - Text, - useDisclosure, -} from '@chakra-ui/react'; -import React, { useContext } from 'react'; -const Big = require('big.js'); - -const MIN_T0_ORDER = '10000000000000000'; -import axios from 'axios'; -import { getABI, getAddress, getContract, send } from '../../utils/contract'; - -import { - Modal, - ModalOverlay, - ModalContent, - ModalHeader, - ModalFooter, - ModalBody, - ModalCloseButton, -} from '@chakra-ui/react'; - -import { DataContext } from '../../context/DataProvider'; -import Link from 'next/link'; -import { AiOutlineLoading } from 'react-icons/ai'; -import { CheckIcon } from '@chakra-ui/icons'; -import { tokenFormatter } from '../../utils/formatters'; -import { WalletContext } from '../../context/Wallet'; -import { ChainID } from '../../utils/chains'; -import { useAccount, useSignTypedData } from 'wagmi'; -import { ADDRESSES, Endpoints } from '../../utils/const'; -import { ethers, TypedDataDomain, BigNumber } from 'ethers'; - -export default function SellModal({ - pair, - token1, - token0, - token1Amount, - amount, - price, -}) { - const { isOpen, onOpen, onClose } = useDisclosure(); - const [loading, setLoading] = React.useState(false); - const [response, setResponse] = React.useState(null); - const [hash, setHash] = React.useState(null); - const [confirmed, setConfirmed] = React.useState(false); - const [orders, setOrders] = React.useState([]); - const [orderToPlace, setOrderToPlace] = React.useState(0); - const [expectedOutput, setExpectedOutput] = React.useState(0); - const [offsetAmount, setOffsetAmount] = React.useState(0); - const { address: EvmAddress, isConnected: isEvmConnected } = useAccount(); - const { data, isError, isLoading, isSuccess, signTypedDataAsync } = useSignTypedData() - - const { isConnected, address: TronAddress } = useContext(WalletContext); - const { chain, explorer } = useContext(DataContext); - - const sell2 = async () => { - setLoading(true); - let _amount = Big(amount) - .times(10 ** token0.decimals) - .minus(offsetAmount) - .toFixed(0); - - let exchange = await getContract('Exchange', chain); - - send( - exchange, - 'executeAndPlaceOrder', - [ - pair.tokens[0].id, - pair.tokens[1].id, - _amount, - (Number(price) * 10 ** pair.exchangeRateDecimals).toFixed(0), - 0, - orders.map((o) => (chain == ChainID.NILE ? '0x' : '') + o.id), - ], - chain - ) - .then(async (res: any) => { - setLoading(false); - setResponse('Transaction sent! Waiting for confirmation...'); - if (chain == ChainID.NILE) { - setHash(res); - checkResponse(res); - } else { - setHash(res.hash); - await res.wait(1); - setConfirmed(true); - setResponse('Transaction Successful!'); - } - }) - .catch((err: any) => { - console.log(err) - setLoading(false); - setConfirmed(true); - setResponse('Transaction failed. Please try again!'); - }); - }; - - const sell = async () => { - setLoading(true); - setConfirmed(false); - setHash(null); - setResponse(''); - - let _amount = Big(amount) - .times(10 ** token0.decimals) - .minus(offsetAmount) - .toFixed(0); - - const domain: any = { - name: 'zexe', - version: '1', - chainId: chain.toString(), - verifyingContract: ADDRESSES[chain].Exchange, - }; - - // The named list of all type definitions - const types = { - Order: [ - { name: 'maker', type: 'address' }, - { name: 'token0', type: 'address' }, - { name: 'token1', type: 'address' }, - { name: 'amount', type: 'uint256' }, - { name: 'buy', type: 'bool' }, - { name: 'salt', type: 'uint32' }, - { name: 'exchangeRate', type: 'uint216' } - ], - }; - - console.log(price); - const value = { - maker: TronAddress ?? EvmAddress, - token0: token0.id, - token1: token1.id, - amount: _amount, - buy: false, - salt: (Math.random()*1000000).toFixed(0), - exchangeRate: ethers.utils.parseEther(price).toString(), - }; - - signTypedDataAsync({ - domain, - types, - value, - }) - .then((signature) => { - console.log(signature) - axios.post("http://localhost:3010/order/create", { - signature, - data: value, - chainId: chain.toString() - }) - .then((res) => { - setLoading(false); - setConfirmed(true); - setResponse('Order created successfully!'); - console.log(res) - }) - .catch((err) => { - setLoading(false); - setConfirmed(true); - setResponse('Order failed. Please try again!'); - console.log("err", err) - }) - }) - } - - // check response in intervals - const checkResponse = (tx_id: string) => { - axios - .get( - 'https://nile.trongrid.io/wallet/gettransactionbyid?value=' + - tx_id - ) - .then((res) => { - if (!res.data.ret) { - setTimeout(() => { - checkResponse(tx_id); - }, 2000); - } else { - setConfirmed(true); - if (res.data.ret[0].contractRet == 'SUCCESS') { - setResponse('Transaction Successful!'); - } else { - setResponse('Transaction Failed. Please try again.'); - } - } - }); - }; - - const _onOpen = () => { - onOpen(); - let _amount = Big(amount) - .times(10 ** token0.decimals) - .toFixed(0); - - // axios - // .get(Endpoints[chain]+'matchedorders/' + pair.id, { - // params: { - // amount: _amount, - // exchange_rate: Big(price).times( - // 10 ** pair.exchangeRateDecimals - // ), - // order_type: 0, - // }, - // }) - // .then((resp) => { - // let orders = resp.data.data; - // let ordersToExecute = []; - // let _orderToPlace = amount * 10 ** token0.decimals; - // let _expectedOutput = Big(0); - // for (let i in orders) { - // let execAmount = Math.min(_orderToPlace, orders[i].amount); - // orders[i].amount = execAmount; - // ordersToExecute.push(orders[i]); - // _orderToPlace = Big(_orderToPlace) - // .minus(execAmount) - // .toFixed(0); - // _expectedOutput = _expectedOutput.plus( - // Big(execAmount) - // .div(orders[i].exchangeRate) - // .times(10 ** pair.exchangeRateDecimals) - // ); - // } - // _expectedOutput = _expectedOutput.plus( - // Big(_orderToPlace).div(price) - // ); - // if (Number(_orderToPlace) < Number(pair?.minToken0Order)) { - // setOffsetAmount(Number(_orderToPlace)); - // } - // setOrderToPlace( - // Number(_orderToPlace) > Number(pair?.minToken0Order) - // ? _orderToPlace - // : 0 - // ); - // setOrders(ordersToExecute); - // setExpectedOutput(_expectedOutput.toFixed(0)); - // }); - }; - - const _onClose = () => { - setOrderToPlace(0); - setLoading(false); - setResponse(null); - setOrders([]); - setOffsetAmount(0); - onClose(); - }; - - const amountExceedsBalance = () => { - if (amount == '0' || amount == '' || !token0 || !token1) return false; - if (Number(amount) && token0.tradingBalance && token1.decimals) - return Big(amount).gt( - Big(token0.tradingBalance).div(10 ** token1.decimals) - ); - }; - - const amountExceedsMin = () => { - if (amount == '0' || amount == '' || !pair || !token0) return false; - if (Number(amount) && pair?.minToken0Order && token0.decimals) - return Big(amount).lt( - Big(pair?.minToken0Order).div(10 ** token0.decimals) - ); - }; - - return ( - <> - - - - - - Review - - - Executing Orders - {orders.map((o) => { - if (o.amount > 0) - return ( - - {/* Order ID */} - ID: {o.id} - - - {tokenFormatter(null).format( - o.amount / - 10 ** - pair.tokens[0].decimals - )}{' '} - {pair.tokens[0].symbol} @{' '} - {tokenFormatter(null).format( - o.exchangeRate / - 10 ** - pair.exchangeRateDecimals - )}{' '} - {pair.tokens[1].symbol} - - - ); - else return null; - })} - {orders.length == 0 && ( - - No orders to execute - - )} - Placing Orders - {orderToPlace > 0 ? ( - - OrderType: SELL - - {orderToPlace / 10 ** token0?.decimals}{' '} - {token0?.symbol} @ {price} {token1?.symbol} - - - ) : ( - - No limit order to place - - )} - - - Estimated Output: {amount} {token0?.symbol} - - - Total Amount: {token1Amount} {token1?.symbol} - - - - - - {response ? ( - - - - - - - {response} - - {hash && - - View on explorer - - } - - - - - - ) : ( - <> - - {' '} - - )} - - - - - - ); -} diff --git a/src/components/TVChartContainer/index.jsx b/src/components/graph/index.jsx similarity index 98% rename from src/components/TVChartContainer/index.jsx rename to src/components/graph/index.jsx index 7210df4..bd30138 100644 --- a/src/components/TVChartContainer/index.jsx +++ b/src/components/graph/index.jsx @@ -1,6 +1,7 @@ import * as React from "react"; import styles from "./index.module.css"; import { widget, version } from "../../../public/static/charting_library"; + import axios from "axios"; import { Endpoints } from "../../utils/const"; import { ChainID } from "../../utils/chains"; @@ -13,7 +14,7 @@ function getLanguageFromURL() { : decodeURIComponent(results[1].replace(/\+/g, " ")); } -export class TVChartContainer extends React.PureComponent { +export class Graph extends React.PureComponent { static defaultProps = { symbol: "BTC_USDC", interval: "15", @@ -31,7 +32,6 @@ export class TVChartContainer extends React.PureComponent { tvWidget = null; constructor(props) { - console.log(props.symbol); super(props); this.ref = React.createRef(); } @@ -53,7 +53,6 @@ export class TVChartContainer extends React.PureComponent { width: '100%', height: '600', - header_widget_buttons_mode: 'compact' }; const tvWidget = new widget(widgetOptions); @@ -86,7 +85,6 @@ export class TVChartContainer extends React.PureComponent { height: '600', header_widget_buttons_mode: 'compact' }; - const tvWidget = new widget(widgetOptions); this.tvWidget = tvWidget; diff --git a/src/components/TVChartContainer/index.module.css b/src/components/graph/index.module.css similarity index 100% rename from src/components/TVChartContainer/index.module.css rename to src/components/graph/index.module.css diff --git a/src/components/CTA.tsx b/src/components/landing/CTA.tsx similarity index 100% rename from src/components/CTA.tsx rename to src/components/landing/CTA.tsx diff --git a/src/components/Container.tsx b/src/components/landing/Container.tsx similarity index 100% rename from src/components/Container.tsx rename to src/components/landing/Container.tsx diff --git a/src/components/DarkModeSwitch.tsx b/src/components/landing/DarkModeSwitch.tsx similarity index 100% rename from src/components/DarkModeSwitch.tsx rename to src/components/landing/DarkModeSwitch.tsx diff --git a/src/components/Footer.tsx b/src/components/landing/Footer.tsx similarity index 88% rename from src/components/Footer.tsx rename to src/components/landing/Footer.tsx index 659b8fa..fdbf6c6 100644 --- a/src/components/Footer.tsx +++ b/src/components/landing/Footer.tsx @@ -13,11 +13,15 @@ import { CheckCircleIcon, LinkIcon } from "@chakra-ui/icons"; import { BsDiscord, BsGithub, BsTwitter } from "react-icons/bs"; export const Footer = () => ( + + + + @@ -58,4 +62,5 @@ export const Footer = () => ( + ); diff --git a/src/components/Hero.tsx b/src/components/landing/Hero.tsx similarity index 100% rename from src/components/Hero.tsx rename to src/components/landing/Hero.tsx diff --git a/src/components/Main.tsx b/src/components/landing/Main.tsx similarity index 100% rename from src/components/Main.tsx rename to src/components/landing/Main.tsx diff --git a/src/components/lever/borrow/BorrowModal.tsx b/src/components/lever/borrow/BorrowModal.tsx index b9f7262..b1c80e9 100644 --- a/src/components/lever/borrow/BorrowModal.tsx +++ b/src/components/lever/borrow/BorrowModal.tsx @@ -54,7 +54,6 @@ import { import { getContract, send } from "../../../utils/contract"; import { DataContext } from "../../../context/DataProvider"; import { useAccount } from "wagmi"; -import { WalletContext } from "../../../context/Wallet"; import { ethers } from "ethers"; import { ADDRESSES } from "../../../utils/const"; import Big from "big.js"; @@ -76,7 +75,6 @@ export default function LendModal({ market, token }) { const { chain, explorer } = useContext(DataContext); const { isConnected: isEvmConnected, address: EvmAddress } = useAccount(); - const { isConnected, address: TronAddress } = useContext(WalletContext); const { availableToBorrow } = useContext(LeverDataContext); const updateSliderValue = (value: number) => { diff --git a/src/components/lever/borrow/RepayModal.tsx b/src/components/lever/borrow/RepayModal.tsx index a803f6f..47fbff4 100644 --- a/src/components/lever/borrow/RepayModal.tsx +++ b/src/components/lever/borrow/RepayModal.tsx @@ -54,7 +54,6 @@ import { import { getContract, send } from "../../../utils/contract"; import { DataContext } from "../../../context/DataProvider"; import { useAccount } from "wagmi"; -import { WalletContext } from "../../../context/Wallet"; import { ethers } from "ethers"; import { ADDRESSES } from "../../../utils/const"; import Big from "big.js"; @@ -75,7 +74,6 @@ export default function LendModal({ market, token }) { const { chain, explorer } = useContext(DataContext); const { isConnected: isEvmConnected, address: EvmAddress } = useAccount(); - const { isConnected, address: TronAddress } = useContext(WalletContext); const updateSliderValue = (value: number) => { setSliderValue(value); diff --git a/src/components/lever/lend/LendModal.tsx b/src/components/lever/lend/LendModal.tsx index abfc44c..abfb6d3 100644 --- a/src/components/lever/lend/LendModal.tsx +++ b/src/components/lever/lend/LendModal.tsx @@ -47,7 +47,6 @@ import { import { getContract, send } from "../../../utils/contract"; import { DataContext } from "../../../context/DataProvider"; import { useAccount } from "wagmi"; -import { WalletContext } from "../../../context/Wallet"; import { ethers } from "ethers"; import { ADDRESSES, imageIds } from "../../../utils/const"; import Big from "big.js"; @@ -71,7 +70,6 @@ export default function LendModal({ market, token }) { const { incrementAllowance } = useContext(LeverDataContext); const { isConnected: isEvmConnected, address: EvmAddress } = useAccount(); - const { isConnected, address: TronAddress } = useContext(WalletContext); const updateSliderValue = (value: number) => { setSliderValue(value); diff --git a/src/components/lever/lend/WithdrawModal.tsx b/src/components/lever/lend/WithdrawModal.tsx index 2706b71..aa26b6b 100644 --- a/src/components/lever/lend/WithdrawModal.tsx +++ b/src/components/lever/lend/WithdrawModal.tsx @@ -54,7 +54,6 @@ import { import { getContract, send } from "../../../utils/contract"; import { DataContext } from "../../../context/DataProvider"; import { useAccount } from "wagmi"; -import { WalletContext } from "../../../context/Wallet"; import { ethers } from "ethers"; import Big from "big.js"; import { ChainID } from "../../../utils/chains"; @@ -75,7 +74,6 @@ export default function WithdrawModal({ market, token }) { const { chain, explorer } = useContext(DataContext); const { isConnected: isEvmConnected, address: EvmAddress } = useAccount(); - const { isConnected, address: TronAddress } = useContext(WalletContext); const updateSliderValue = (value: number) => { setSliderValue(value); diff --git a/src/components/trade/Graph.tsx b/src/components/trade/Graph.tsx deleted file mode 100644 index 242ada1..0000000 --- a/src/components/trade/Graph.tsx +++ /dev/null @@ -1,120 +0,0 @@ -import React, { useEffect, useRef } from 'react'; -import { createChart, CrosshairMode } from 'lightweight-charts'; -import { priceData } from './priceData'; -import { volumeData } from './volumeData'; -import { useContext } from 'react'; -import { DataContext } from '../../context/DataProvider'; - -const Graph = ({ pair }) => { - const chartContainerRef = useRef(); - const chart = useRef(); - const resizeObserver = useRef(); - - const { pairData } = useContext(DataContext); - - const [_candleSeries, setCandleSeries] = React.useState(); - const [_volumeSeries, setVolumeSeries] = React.useState(); - - if (chart.current && pair) { - let exchangeData = pairData[pair?.id]?.exchangeRate ?? []; - if(!Array.isArray(exchangeData)) { - exchangeData = [] - } - _candleSeries.setData(exchangeData); - let volumeData = pairData[pair?.id]?.volume ?? []; - if(!Array.isArray(volumeData)) { - volumeData = [] - } - _volumeSeries.setData(volumeData); - } - - useEffect(() => { - chart.current = createChart(chartContainerRef.current, { - width: chartContainerRef.current.clientWidth, - height: 500, //"300px", //chartContainerRef.current.clientHeight, - layout: { - backgroundColor: '#09001F', - textColor: 'rgba(255, 255, 255, 0.9)', - }, - grid: { - vertLines: { - color: '#334158', - }, - horzLines: { - color: '#334158', - }, - }, - crosshair: { - mode: CrosshairMode.Normal, - }, - // priceScale: { - // borderColor: '#485c7b', - // }, - timeScale: { - borderColor: '#485c7b', - }, - }); - - const candleSeries = chart.current.addCandlestickSeries({ - upColor: '#4bffb5', - downColor: '#ff4976', - borderDownColor: '#ff4976', - borderUpColor: '#4bffb5', - wickDownColor: '#838ca1', - wickUpColor: '#838ca1', - }); - setCandleSeries(candleSeries); - candleSeries.setData(pairData[pair?.id]?.exchangeRate ?? []); - - // const areaSeries = chart.current.addAreaSeries({ - // topColor: 'rgba(38,198,218, 0.56)', - // bottomColor: 'rgba(38,198,218, 0.04)', - // lineColor: 'rgba(38,198,218, 1)', - // lineWidth: 2 - // }); - - // areaSeries.setData(areaData); - - const volumeSeries = chart.current.addHistogramSeries({ - color: '#182233', - lineWidth: 2, - priceFormat: { - type: 'volume', - }, - overlay: true, - scaleMargins: { - top: 0.8, - bottom: 0, - }, - }); - setVolumeSeries(volumeSeries); - volumeSeries.setData(pairData[pair?.id]?.volume ?? []); - }, []); - - // Resize chart on container resizes. - useEffect(() => { - resizeObserver.current = new ResizeObserver((entries) => { - const { width, height } = entries[0].contentRect; - chart.current.applyOptions({ width, height }); - setTimeout(() => { - chart.current.timeScale().fitContent(); - }, 0); - }); - - resizeObserver.current.observe(chartContainerRef.current); - - return () => resizeObserver.current.disconnect(); - }, []); - - return ( -
-
-
- ); -}; - -export default Graph; diff --git a/src/components/trade/GraphPanel.tsx b/src/components/trade/GraphPanel.tsx index ee9c0a0..d87b609 100644 --- a/src/components/trade/GraphPanel.tsx +++ b/src/components/trade/GraphPanel.tsx @@ -2,17 +2,17 @@ import { Box, Flex, Text } from '@chakra-ui/react' import React from 'react' import dynamic from "next/dynamic"; -const TVChartContainer = dynamic( +const Graph = dynamic( () => - import('../TVChartContainer').then(mod => mod.TVChartContainer), + import('../graph/index.jsx').then(mod => mod.Graph), { ssr: false }, ); export default function GraphPanel({pair}) { return ( <> - - {pair && } + + {pair && } ) diff --git a/src/components/trade/Orders/OrderBook.tsx b/src/components/trade/Orders/OrderBook.tsx index 0d5ba21..9270288 100644 --- a/src/components/trade/Orders/OrderBook.tsx +++ b/src/components/trade/Orders/OrderBook.tsx @@ -62,7 +62,7 @@ export default function OrderBook({ pair }) { return ( - + Amount {pair?.tokens[0].symbol} Amount {pair?.tokens[1].symbol} Price {pair?.tokens[1].symbol} diff --git a/src/components/trade/Orders/OrderHistory.tsx b/src/components/trade/Orders/OrderHistory.tsx index 3a2eac2..479b977 100644 --- a/src/components/trade/Orders/OrderHistory.tsx +++ b/src/components/trade/Orders/OrderHistory.tsx @@ -10,7 +10,8 @@ const Order = ({ order, pair, index }) => { {tokenFormatter(null).format(order.fillAmount/(10**pair?.tokens[0].decimals))} @@ -30,10 +31,10 @@ export default function OrderHistory({pair}) { return ( - - Amount {pair?.tokens[0].symbol} - Amount {pair?.tokens[1].symbol} - Price {pair?.tokens[1].symbol} + + Amount {pair?.tokens[0].symbol} + Amount {pair?.tokens[1].symbol} + Price {pair?.tokens[1].symbol} {(pairExecutedData[pair?.id]) && pairExecutedData[pair?.id].slice(0,47).map((order: any, index: number) => { return ; diff --git a/src/components/trade/Orders/OrdersPanel.tsx b/src/components/trade/Orders/OrdersPanel.tsx index 5d0d62b..c760383 100644 --- a/src/components/trade/Orders/OrdersPanel.tsx +++ b/src/components/trade/Orders/OrdersPanel.tsx @@ -1,47 +1,60 @@ -import React from 'react'; -import { Tabs, TabList, TabPanels, Tab, TabPanel, Box, Flex, Text } from '@chakra-ui/react'; -import OrderBook from './OrderBook'; -import OrderHistory from './OrderHistory'; +import React from "react"; +import { + Tabs, + TabList, + TabPanels, + Tab, + TabPanel, + Box, + Flex, + Text, +} from "@chakra-ui/react"; +import OrderBook from "../orders/OrderBook"; +import OrderHistory from "../orders/OrderHistory"; export default function OrdersPanel({ pair }) { - return ( <> - - - - Order Book - Order History - - - - - - - - - - - - - - - - - + + + + Order Book + Order History + + + + + + + + + + - - {/* Order History */} - - + + + + + + + - - + ); } diff --git a/src/components/trade/new_orders/Buy.tsx b/src/components/trade/exchange/Buy.tsx similarity index 100% rename from src/components/trade/new_orders/Buy.tsx rename to src/components/trade/exchange/Buy.tsx diff --git a/src/components/trade/new_orders/BuySellModal.tsx b/src/components/trade/exchange/BuySellModal.tsx similarity index 96% rename from src/components/trade/new_orders/BuySellModal.tsx rename to src/components/trade/exchange/BuySellModal.tsx index dae5ed7..803cf85 100644 --- a/src/components/trade/new_orders/BuySellModal.tsx +++ b/src/components/trade/exchange/BuySellModal.tsx @@ -24,7 +24,6 @@ import { } from "@chakra-ui/react"; import { DataContext } from "../../../context/DataProvider"; -import { WalletContext } from "../../../context/Wallet"; import { useAccount } from "wagmi"; import { Endpoints } from "../../../utils/const"; import OrdersToExecute from "./OrdersToExecute"; @@ -51,8 +50,6 @@ export default function BuySellModal({ const [orders, setOrders] = React.useState(null); const [orderToPlace, setOrderToPlace] = React.useState(null); - const { isConnected } = useContext(WalletContext); - const { isConnected: isEvmConnected } = useAccount(); const { chain } = useContext(DataContext); @@ -130,13 +127,13 @@ export default function BuySellModal({ onClick={_onOpen} disabled={ !Big(token0Amount).gt(0) || - !(isConnected || isEvmConnected) || + !(isEvmConnected) || amountExceedsBalance() || price == "" || Number(price) <= 0 } > - {!(isConnected || isEvmConnected) + {!(isEvmConnected) ? "Connect Wallet" : !Big(token0Amount).gt(0) ? "Enter Amount" diff --git a/src/components/trade/new_orders/Limit.tsx b/src/components/trade/exchange/Limit.tsx similarity index 100% rename from src/components/trade/new_orders/Limit.tsx rename to src/components/trade/exchange/Limit.tsx diff --git a/src/components/trade/new_orders/Market.tsx b/src/components/trade/exchange/Market.tsx similarity index 100% rename from src/components/trade/new_orders/Market.tsx rename to src/components/trade/exchange/Market.tsx diff --git a/src/components/trade/new_orders/OrdersToExecute.tsx b/src/components/trade/exchange/OrdersToExecute.tsx similarity index 100% rename from src/components/trade/new_orders/OrdersToExecute.tsx rename to src/components/trade/exchange/OrdersToExecute.tsx diff --git a/src/components/trade/new_orders/PlaceOrder.tsx b/src/components/trade/exchange/PlaceOrder.tsx similarity index 97% rename from src/components/trade/new_orders/PlaceOrder.tsx rename to src/components/trade/exchange/PlaceOrder.tsx index 6cfe90c..e75298d 100644 --- a/src/components/trade/new_orders/PlaceOrder.tsx +++ b/src/components/trade/exchange/PlaceOrder.tsx @@ -6,7 +6,6 @@ import Link from "next/link"; import React, { useContext, useEffect } from "react"; import { useAccount, useSignTypedData } from "wagmi"; import { DataContext } from "../../../context/DataProvider"; -import { WalletContext } from "../../../context/Wallet"; import { getAddress, getContract, send } from "../../../utils/contract"; import Image from "next/image"; import { imageIds } from "../../../utils/const"; @@ -30,7 +29,6 @@ export default function PlaceOrder({ useSignTypedData(); const { chain, explorer, incrementAllowance } = useContext(DataContext); - const { address: TronAddress } = useContext(WalletContext); const { address: EvmAddress } = useAccount(); const tokenToSpend = buy ? token1 : token0; @@ -106,7 +104,7 @@ export default function PlaceOrder({ }; const value = { - maker: TronAddress ?? EvmAddress, + maker: EvmAddress, token0: token0.id, token1: token1.id, amount: _amount, diff --git a/src/components/trade/new_orders/Sell.tsx b/src/components/trade/exchange/Sell.tsx similarity index 100% rename from src/components/trade/new_orders/Sell.tsx rename to src/components/trade/exchange/Sell.tsx diff --git a/src/components/trade/Exchange.tsx b/src/components/trade/exchange/index.tsx similarity index 91% rename from src/components/trade/Exchange.tsx rename to src/components/trade/exchange/index.tsx index ad3f4a8..22c52b7 100644 --- a/src/components/trade/Exchange.tsx +++ b/src/components/trade/exchange/index.tsx @@ -2,8 +2,8 @@ import { Box, Tooltip } from '@chakra-ui/react'; import React from 'react'; import { Tabs, TabList, TabPanels, Tab, TabPanel } from '@chakra-ui/react'; -import LimitOrder from './new_orders/Limit'; -import MarketOrder from './new_orders/Market'; +import LimitOrder from './Limit'; +import MarketOrder from './Market'; const Exchange = ({pair}) => { const [hydrated, setHydrated] = React.useState(false); diff --git a/src/components/trade/priceData.ts b/src/components/trade/priceData.ts deleted file mode 100644 index be10ae2..0000000 --- a/src/components/trade/priceData.ts +++ /dev/null @@ -1,1046 +0,0 @@ -export const priceData = [ - { - time: '2018-10-19', - open: 180.34, - high: 180.99, - low: 178.57, - close: 179.85 - }, - { - time: '2018-10-22', - open: 180.82, - high: 181.4, - low: 177.56, - close: 178.75 - }, - { - time: '2018-10-23', - open: 175.77, - high: 179.49, - low: 175.44, - close: 178.53 - }, - { - time: '2018-10-24', - open: 178.58, - high: 182.37, - low: 176.31, - close: 176.97 - }, - { - time: '2018-10-25', - open: 177.52, - high: 180.5, - low: 176.83, - close: 179.07 - }, - { - time: '2018-10-26', - open: 176.88, - high: 177.34, - low: 170.91, - close: 172.23 - }, - { - time: '2018-10-29', - open: 173.74, - high: 175.99, - low: 170.95, - close: 173.2 - }, - { - time: '2018-10-30', - open: 173.16, - high: 176.43, - low: 172.64, - close: 176.24 - }, - { - time: '2018-10-31', - open: 177.98, - high: 178.85, - low: 175.59, - close: 175.88 - }, - { - time: '2018-11-01', - open: 176.84, - high: 180.86, - low: 175.9, - close: 180.46 - }, - { - time: '2018-11-02', - open: 182.47, - high: 183.01, - low: 177.39, - close: 179.93 - }, - { - time: '2018-11-05', - open: 181.02, - high: 182.41, - low: 179.3, - close: 182.19 - }, - { - time: '2018-11-06', - open: 181.93, - high: 182.65, - low: 180.05, - close: 182.01 - }, - { - time: '2018-11-07', - open: 183.79, - high: 187.68, - low: 182.06, - close: 187.23 - }, - { - time: '2018-11-08', - open: 187.13, - high: 188.69, - low: 185.72, - close: 188.0 - }, - { - time: '2018-11-09', - open: 188.32, - high: 188.48, - low: 184.96, - close: 185.99 - }, - { - time: '2018-11-12', - open: 185.23, - high: 186.95, - low: 179.02, - close: 179.43 - }, - { - time: '2018-11-13', - open: 177.3, - high: 181.62, - low: 172.85, - close: 179.0 - }, - { - time: '2018-11-14', - open: 182.61, - high: 182.9, - low: 179.15, - close: 179.9 - }, - { - time: '2018-11-15', - open: 179.01, - high: 179.67, - low: 173.61, - close: 177.36 - }, - { - time: '2018-11-16', - open: 173.99, - high: 177.6, - low: 173.51, - close: 177.02 - }, - { - time: '2018-11-19', - open: 176.71, - high: 178.88, - low: 172.3, - close: 173.59 - }, - { - time: '2018-11-20', - open: 169.25, - high: 172.0, - low: 167.0, - close: 169.05 - }, - { - time: '2018-11-21', - open: 170.0, - high: 170.93, - low: 169.15, - close: 169.3 - }, - { - time: '2018-11-23', - open: 169.39, - high: 170.33, - low: 168.47, - close: 168.85 - }, - { - time: '2018-11-26', - open: 170.2, - high: 172.39, - low: 168.87, - close: 169.82 - }, - { - time: '2018-11-27', - open: 169.11, - high: 173.38, - low: 168.82, - close: 173.22 - }, - { - time: '2018-11-28', - open: 172.91, - high: 177.65, - low: 170.62, - close: 177.43 - }, - { - time: '2018-11-29', - open: 176.8, - high: 177.27, - low: 174.92, - close: 175.66 - }, - { - time: '2018-11-30', - open: 175.75, - high: 180.37, - low: 175.11, - close: 180.32 - }, - { - time: '2018-12-03', - open: 183.29, - high: 183.5, - low: 179.35, - close: 181.74 - }, - { - time: '2018-12-04', - open: 181.06, - high: 182.23, - low: 174.55, - close: 175.3 - }, - { - time: '2018-12-06', - open: 173.5, - high: 176.04, - low: 170.46, - close: 175.96 - }, - { - time: '2018-12-07', - open: 175.35, - high: 178.36, - low: 172.24, - close: 172.79 - }, - { - time: '2018-12-10', - open: 173.39, - high: 173.99, - low: 167.73, - close: 171.69 - }, - { - time: '2018-12-11', - open: 174.3, - high: 175.6, - low: 171.24, - close: 172.21 - }, - { - time: '2018-12-12', - open: 173.75, - high: 176.87, - low: 172.81, - close: 174.21 - }, - { - time: '2018-12-13', - open: 174.31, - high: 174.91, - low: 172.07, - close: 173.87 - }, - { - time: '2018-12-14', - open: 172.98, - high: 175.14, - low: 171.95, - close: 172.29 - }, - { - time: '2018-12-17', - open: 171.51, - high: 171.99, - low: 166.93, - close: 167.97 - }, - { - time: '2018-12-18', - open: 168.9, - high: 171.95, - low: 168.5, - close: 170.04 - }, - { - time: '2018-12-19', - open: 170.92, - high: 174.95, - low: 166.77, - close: 167.56 - }, - { - time: '2018-12-20', - open: 166.28, - high: 167.31, - low: 162.23, - close: 164.16 - }, - { - time: '2018-12-21', - open: 162.81, - high: 167.96, - low: 160.17, - close: 160.48 - }, - { - time: '2018-12-24', - open: 160.16, - high: 161.4, - low: 158.09, - close: 158.14 - }, - { - time: '2018-12-26', - open: 159.46, - high: 168.28, - low: 159.44, - close: 168.28 - }, - { - time: '2018-12-27', - open: 166.44, - high: 170.46, - low: 163.36, - close: 170.32 - }, - { - time: '2018-12-28', - open: 171.22, - high: 173.12, - low: 168.6, - close: 170.22 - }, - { - time: '2018-12-31', - open: 171.47, - high: 173.24, - low: 170.65, - close: 171.82 - }, - { - time: '2019-01-02', - open: 169.71, - high: 173.18, - low: 169.05, - close: 172.41 - }, - { - time: '2019-01-03', - open: 171.84, - high: 171.84, - low: 168.21, - close: 168.61 - }, - { - time: '2019-01-04', - open: 170.18, - high: 174.74, - low: 169.52, - close: 173.62 - }, - { - time: '2019-01-07', - open: 173.83, - high: 178.18, - low: 173.83, - close: 177.04 - }, - { - time: '2019-01-08', - open: 178.57, - high: 179.59, - low: 175.61, - close: 177.89 - }, - { - time: '2019-01-09', - open: 177.87, - high: 181.27, - low: 177.1, - close: 179.73 - }, - { - time: '2019-01-10', - open: 178.03, - high: 179.24, - low: 176.34, - close: 179.06 - }, - { - time: '2019-01-11', - open: 177.93, - high: 180.26, - low: 177.12, - close: 179.41 - }, - { - time: '2019-01-14', - open: 177.59, - high: 179.23, - low: 176.9, - close: 178.81 - }, - { - time: '2019-01-15', - open: 176.08, - high: 177.82, - low: 175.2, - close: 176.47 - }, - { - time: '2019-01-16', - open: 177.09, - high: 177.93, - low: 175.86, - close: 177.04 - }, - { - time: '2019-01-17', - open: 174.01, - high: 175.46, - low: 172.0, - close: 174.87 - }, - { - time: '2019-01-18', - open: 176.98, - high: 180.04, - low: 176.18, - close: 179.58 - }, - { - time: '2019-01-22', - open: 177.49, - high: 178.6, - low: 175.36, - close: 177.11 - }, - { - time: '2019-01-23', - open: 176.59, - high: 178.06, - low: 174.53, - close: 176.89 - }, - { - time: '2019-01-24', - open: 177.0, - high: 177.53, - low: 175.3, - close: 177.29 - }, - { - time: '2019-01-25', - open: 179.78, - high: 180.87, - low: 178.61, - close: 180.4 - }, - { - time: '2019-01-28', - open: 178.97, - high: 179.99, - low: 177.41, - close: 179.83 - }, - { - time: '2019-01-29', - open: 178.96, - high: 180.15, - low: 178.09, - close: 179.69 - }, - { - time: '2019-01-30', - open: 180.47, - high: 184.2, - low: 179.78, - close: 182.18 - }, - { - time: '2019-01-31', - open: 181.5, - high: 184.67, - low: 181.06, - close: 183.53 - }, - { - time: '2019-02-01', - open: 184.03, - high: 185.15, - low: 182.83, - close: 184.37 - }, - { - time: '2019-02-04', - open: 184.3, - high: 186.43, - low: 183.84, - close: 186.43 - }, - { - time: '2019-02-05', - open: 186.89, - high: 186.99, - low: 184.69, - close: 186.39 - }, - { - time: '2019-02-06', - open: 186.69, - high: 186.69, - low: 184.06, - close: 184.72 - }, - { - time: '2019-02-07', - open: 183.74, - high: 184.92, - low: 182.45, - close: 184.07 - }, - { - time: '2019-02-08', - open: 183.05, - high: 184.58, - low: 182.72, - close: 184.54 - }, - { - time: '2019-02-11', - open: 185.0, - high: 185.42, - low: 182.75, - close: 182.92 - }, - { - time: '2019-02-12', - open: 183.84, - high: 186.4, - low: 183.52, - close: 185.52 - }, - { - time: '2019-02-13', - open: 186.3, - high: 188.68, - low: 185.92, - close: 188.41 - }, - { - time: '2019-02-14', - open: 187.5, - high: 188.93, - low: 186.0, - close: 187.71 - }, - { - time: '2019-02-15', - open: 189.87, - high: 192.62, - low: 189.05, - close: 192.39 - }, - { - time: '2019-02-19', - open: 191.71, - high: 193.19, - low: 191.28, - close: 192.33 - }, - { - time: '2019-02-20', - open: 192.39, - high: 192.4, - low: 191.11, - close: 191.85 - }, - { - time: '2019-02-21', - open: 191.85, - high: 192.37, - low: 190.61, - close: 191.82 - }, - { - time: '2019-02-22', - open: 191.69, - high: 192.54, - low: 191.62, - close: 192.39 - }, - { - time: '2019-02-25', - open: 192.75, - high: 193.42, - low: 189.96, - close: 189.98 - }, - { - time: '2019-02-26', - open: 185.59, - high: 188.47, - low: 182.8, - close: 188.3 - }, - { - time: '2019-02-27', - open: 187.9, - high: 188.5, - low: 183.21, - close: 183.67 - }, - { - time: '2019-02-28', - open: 183.6, - high: 185.19, - low: 183.11, - close: 185.14 - }, - { - time: '2019-03-01', - open: 185.82, - high: 186.56, - low: 182.86, - close: 185.17 - }, - { - time: '2019-03-04', - open: 186.2, - high: 186.24, - low: 182.1, - close: 183.81 - }, - { - time: '2019-03-05', - open: 184.24, - high: 185.12, - low: 183.25, - close: 184.0 - }, - { - time: '2019-03-06', - open: 184.53, - high: 184.97, - low: 183.84, - close: 184.45 - }, - { - time: '2019-03-07', - open: 184.39, - high: 184.62, - low: 181.58, - close: 182.51 - }, - { - time: '2019-03-08', - open: 181.49, - high: 181.91, - low: 179.52, - close: 181.23 - }, - { - time: '2019-03-11', - open: 182.0, - high: 183.2, - low: 181.2, - close: 182.44 - }, - { - time: '2019-03-12', - open: 183.43, - high: 184.27, - low: 182.33, - close: 184.0 - }, - { - time: '2019-03-13', - open: 183.24, - high: 183.78, - low: 181.08, - close: 181.14 - }, - { - time: '2019-03-14', - open: 181.28, - high: 181.74, - low: 180.5, - close: 181.61 - }, - { - time: '2019-03-15', - open: 182.3, - high: 182.49, - low: 179.57, - close: 182.23 - }, - { - time: '2019-03-18', - open: 182.53, - high: 183.48, - low: 182.33, - close: 183.42 - }, - { - time: '2019-03-19', - open: 184.19, - high: 185.82, - low: 183.48, - close: 184.13 - }, - { - time: '2019-03-20', - open: 184.3, - high: 187.12, - low: 183.43, - close: 186.1 - }, - { - time: '2019-03-21', - open: 185.5, - high: 190.0, - low: 185.5, - close: 189.97 - }, - { - time: '2019-03-22', - open: 189.31, - high: 192.05, - low: 188.67, - close: 188.75 - }, - { - time: '2019-03-25', - open: 188.75, - high: 191.71, - low: 188.51, - close: 189.68 - }, - { - time: '2019-03-26', - open: 190.69, - high: 192.19, - low: 188.74, - close: 189.34 - }, - { - time: '2019-03-27', - open: 189.65, - high: 191.61, - low: 188.39, - close: 189.25 - }, - { - time: '2019-03-28', - open: 189.91, - high: 191.4, - low: 189.16, - close: 190.06 - }, - { - time: '2019-03-29', - open: 190.85, - high: 192.04, - low: 190.14, - close: 191.89 - }, - { - time: '2019-04-01', - open: 192.99, - high: 195.9, - low: 192.85, - close: 195.64 - }, - { - time: '2019-04-02', - open: 195.5, - high: 195.5, - low: 194.01, - close: 194.31 - }, - { - time: '2019-04-03', - open: 194.98, - high: 198.78, - low: 194.11, - close: 198.61 - }, - { - time: '2019-04-04', - open: 199.0, - high: 200.49, - low: 198.02, - close: 200.45 - }, - { - time: '2019-04-05', - open: 200.86, - high: 203.13, - low: 200.61, - close: 202.06 - }, - { - time: '2019-04-08', - open: 201.37, - high: 203.79, - low: 201.24, - close: 203.55 - }, - { - time: '2019-04-09', - open: 202.26, - high: 202.71, - low: 200.46, - close: 200.9 - }, - { - time: '2019-04-10', - open: 201.26, - high: 201.6, - low: 198.02, - close: 199.43 - }, - { - time: '2019-04-11', - open: 199.9, - high: 201.5, - low: 199.03, - close: 201.48 - }, - { - time: '2019-04-12', - open: 202.13, - high: 204.26, - low: 202.13, - close: 203.85 - }, - { - time: '2019-04-15', - open: 204.16, - high: 205.14, - low: 203.4, - close: 204.86 - }, - { - time: '2019-04-16', - open: 205.25, - high: 205.99, - low: 204.29, - close: 204.47 - }, - { - time: '2019-04-17', - open: 205.34, - high: 206.84, - low: 205.32, - close: 206.55 - }, - { - time: '2019-04-18', - open: 206.02, - high: 207.78, - low: 205.1, - close: 205.66 - }, - { - time: '2019-04-22', - open: 204.11, - high: 206.25, - low: 204.0, - close: 204.78 - }, - { - time: '2019-04-23', - open: 205.14, - high: 207.33, - low: 203.43, - close: 206.05 - }, - { - time: '2019-04-24', - open: 206.16, - high: 208.29, - low: 205.54, - close: 206.72 - }, - { - time: '2019-04-25', - open: 206.01, - high: 207.72, - low: 205.06, - close: 206.5 - }, - { - time: '2019-04-26', - open: 205.88, - high: 206.14, - low: 203.34, - close: 203.61 - }, - { - time: '2019-04-29', - open: 203.31, - high: 203.8, - low: 200.34, - close: 202.16 - }, - { - time: '2019-04-30', - open: 201.55, - high: 203.75, - low: 200.79, - close: 203.7 - }, - { - time: '2019-05-01', - open: 203.2, - high: 203.52, - low: 198.66, - close: 198.8 - }, - { - time: '2019-05-02', - open: 199.3, - high: 201.06, - low: 198.8, - close: 201.01 - }, - { - time: '2019-05-03', - open: 202.0, - high: 202.31, - low: 200.32, - close: 200.56 - }, - { - time: '2019-05-06', - open: 198.74, - high: 199.93, - low: 198.31, - close: 199.63 - }, - { - time: '2019-05-07', - open: 196.75, - high: 197.65, - low: 192.96, - close: 194.77 - }, - { - time: '2019-05-08', - open: 194.49, - high: 196.61, - low: 193.68, - close: 195.17 - }, - { - time: '2019-05-09', - open: 193.31, - high: 195.08, - low: 191.59, - close: 194.58 - }, - { - time: '2019-05-10', - open: 193.21, - high: 195.49, - low: 190.01, - close: 194.58 - }, - { - time: '2019-05-13', - open: 191.0, - high: 191.66, - low: 189.14, - close: 190.34 - }, - { - time: '2019-05-14', - open: 190.5, - high: 192.76, - low: 190.01, - close: 191.62 - }, - { - time: '2019-05-15', - open: 190.81, - high: 192.81, - low: 190.27, - close: 191.76 - }, - { - time: '2019-05-16', - open: 192.47, - high: 194.96, - low: 192.2, - close: 192.38 - }, - { - time: '2019-05-17', - open: 190.86, - high: 194.5, - low: 190.75, - close: 192.58 - }, - { - time: '2019-05-20', - open: 191.13, - high: 192.86, - low: 190.61, - close: 190.95 - }, - { - time: '2019-05-21', - open: 187.13, - high: 192.52, - low: 186.34, - close: 191.45 - }, - { - time: '2019-05-22', - open: 190.49, - high: 192.22, - low: 188.05, - close: 188.91 - }, - { - time: '2019-05-23', - open: 188.45, - high: 192.54, - low: 186.27, - close: 192.0 - }, - { - time: '2019-05-24', - open: 192.54, - high: 193.86, - low: 190.41, - close: 193.59 - } - ]; - \ No newline at end of file diff --git a/src/components/trade/styles.css b/src/components/trade/styles.css deleted file mode 100644 index 1236fd4..0000000 --- a/src/components/trade/styles.css +++ /dev/null @@ -1,17 +0,0 @@ -html, -body, -#root, -.App { - margin: 0; - height: 100%; -} - -.App { - display: flex; - flex-direction: column; - flex: 1; -} - -.chart-container { - flex: 1; -} diff --git a/src/components/trade/TokensPanel/AllTokens.tsx b/src/components/trade/tokens/AllTokens.tsx similarity index 100% rename from src/components/trade/TokensPanel/AllTokens.tsx rename to src/components/trade/tokens/AllTokens.tsx diff --git a/src/components/trade/TokensPanel/NewTokens.tsx b/src/components/trade/tokens/NewTokens.tsx similarity index 100% rename from src/components/trade/TokensPanel/NewTokens.tsx rename to src/components/trade/tokens/NewTokens.tsx diff --git a/src/components/trade/TokensPanel/TokensPanel.tsx b/src/components/trade/tokens/TokensPanel.tsx similarity index 100% rename from src/components/trade/TokensPanel/TokensPanel.tsx rename to src/components/trade/tokens/TokensPanel.tsx diff --git a/src/components/trade/TokensPanel/TrendingTokens.tsx b/src/components/trade/tokens/TrendingTokens.tsx similarity index 100% rename from src/components/trade/TokensPanel/TrendingTokens.tsx rename to src/components/trade/tokens/TrendingTokens.tsx diff --git a/src/components/trade/UserOrders/CancelOrder.tsx b/src/components/trade/user_orders/CancelOrder.tsx similarity index 100% rename from src/components/trade/UserOrders/CancelOrder.tsx rename to src/components/trade/user_orders/CancelOrder.tsx diff --git a/src/components/trade/UserOrders/CancelledOrders.tsx b/src/components/trade/user_orders/CancelledOrders.tsx similarity index 100% rename from src/components/trade/UserOrders/CancelledOrders.tsx rename to src/components/trade/user_orders/CancelledOrders.tsx diff --git a/src/components/trade/UserOrders/ExecutedOrders.tsx b/src/components/trade/user_orders/ExecutedOrders.tsx similarity index 100% rename from src/components/trade/UserOrders/ExecutedOrders.tsx rename to src/components/trade/user_orders/ExecutedOrders.tsx diff --git a/src/components/trade/UserOrders/PlacedOrders.tsx b/src/components/trade/user_orders/PlacedOrders.tsx similarity index 100% rename from src/components/trade/UserOrders/PlacedOrders.tsx rename to src/components/trade/user_orders/PlacedOrders.tsx diff --git a/src/components/trade/UserOrders/UpdateOrder.tsx b/src/components/trade/user_orders/UpdateOrder.tsx similarity index 100% rename from src/components/trade/UserOrders/UpdateOrder.tsx rename to src/components/trade/user_orders/UpdateOrder.tsx diff --git a/src/components/trade/UserOrders/index.tsx b/src/components/trade/user_orders/index.tsx similarity index 82% rename from src/components/trade/UserOrders/index.tsx rename to src/components/trade/user_orders/index.tsx index 75f3f0a..d3aed5b 100644 --- a/src/components/trade/UserOrders/index.tsx +++ b/src/components/trade/user_orders/index.tsx @@ -19,11 +19,11 @@ export default function index({ pair }) { - - - - - + + + + + diff --git a/src/components/trade/volumeData.ts b/src/components/trade/volumeData.ts deleted file mode 100644 index 038ed8e..0000000 --- a/src/components/trade/volumeData.ts +++ /dev/null @@ -1,157 +0,0 @@ -// Bars can be individually coloured with 'color' prop. -// const green = 'rgba(75, 255, 181, 0.4)'; -// const red = 'rgba(255, 73, 118, 0.4)'; - -export const volumeData = [ - { time: '2018-10-19', value: 19103293.0 }, - { time: '2018-10-22', value: 21737523.0 }, - { time: '2018-10-23', value: 29328713.0 }, - { time: '2018-10-24', value: 37435638.0 }, - { time: '2018-10-25', value: 25269995.0 }, - { time: '2018-10-26', value: 24973311.0 }, - { time: '2018-10-29', value: 22103692.0 }, - { time: '2018-10-30', value: 25231199.0 }, - { time: '2018-10-31', value: 24214427.0 }, - { time: '2018-11-01', value: 22533201.0 }, - { time: '2018-11-02', value: 14734412.0 }, - { time: '2018-11-05', value: 12733842.0 }, - { time: '2018-11-06', value: 12371207.0 }, - { time: '2018-11-07', value: 14891287.0 }, - { time: '2018-11-08', value: 12482392.0 }, - { time: '2018-11-09', value: 17365762.0 }, - { time: '2018-11-12', value: 13236769.0 }, - { time: '2018-11-13', value: 13047907.0 }, - { time: '2018-11-14', value: 18288710.0 }, - { time: '2018-11-15', value: 17147123.0 }, - { time: '2018-11-16', value: 19470986.0 }, - { time: '2018-11-19', value: 18405731.0 }, - { time: '2018-11-20', value: 22028957.0 }, - { time: '2018-11-21', value: 18482233.0 }, - { time: '2018-11-23', value: 7009050.0 }, - { time: '2018-11-26', value: 12308876.0 }, - { time: '2018-11-27', value: 14118867.0 }, - { time: '2018-11-28', value: 18662989.0 }, - { time: '2018-11-29', value: 14763658.0 }, - { time: '2018-11-30', value: 31142818.0 }, - { time: '2018-12-03', value: 27795428.0 }, - { time: '2018-12-04', value: 21727411.0 }, - { time: '2018-12-06', value: 26880429.0 }, - { time: '2018-12-07', value: 16948126.0 }, - { time: '2018-12-10', value: 16603356.0 }, - { time: '2018-12-11', value: 14991438.0 }, - { time: '2018-12-12', value: 18892182.0 }, - { time: '2018-12-13', value: 15454706.0 }, - { time: '2018-12-14', value: 13960870.0 }, - { time: '2018-12-17', value: 18902523.0 }, - { time: '2018-12-18', value: 18895777.0 }, - { time: '2018-12-19', value: 20968473.0 }, - { time: '2018-12-20', value: 26897008.0 }, - { time: '2018-12-21', value: 55413082.0 }, - { time: '2018-12-24', value: 15077207.0 }, - { time: '2018-12-26', value: 17970539.0 }, - { time: '2018-12-27', value: 17530977.0 }, - { time: '2018-12-28', value: 14771641.0 }, - { time: '2018-12-31', value: 15331758.0 }, - { time: '2019-01-02', value: 13969691.0 }, - { time: '2019-01-03', value: 19245411.0 }, - { time: '2019-01-04', value: 17035848.0 }, - { time: '2019-01-07', value: 16348982.0 }, - { time: '2019-01-08', value: 21425008.0 }, - { time: '2019-01-09', value: 18136000.0 }, - { time: '2019-01-10', value: 14259910.0 }, - { time: '2019-01-11', value: 15801548.0 }, - { time: '2019-01-14', value: 11342293.0 }, - { time: '2019-01-15', value: 10074386.0 }, - { time: '2019-01-16', value: 13411691.0 }, - { time: '2019-01-17', value: 15223854.0 }, - { time: '2019-01-18', value: 16802516.0 }, - { time: '2019-01-22', value: 18284771.0 }, - { time: '2019-01-23', value: 15109007.0 }, - { time: '2019-01-24', value: 12494109.0 }, - { time: '2019-01-25', value: 17806822.0 }, - { time: '2019-01-28', value: 25955718.0 }, - { time: '2019-01-29', value: 33789235.0 }, - { time: '2019-01-30', value: 27260036.0 }, - { time: '2019-01-31', value: 28585447.0 }, - { time: '2019-02-01', value: 13778392.0 }, - { time: '2019-02-04', value: 15818901.0 }, - { time: '2019-02-05', value: 14124794.0 }, - { time: '2019-02-06', value: 11391442.0 }, - { time: '2019-02-07', value: 12436168.0 }, - { time: '2019-02-08', value: 12011657.0 }, - { time: '2019-02-11', value: 9802798.0 }, - { time: '2019-02-12', value: 11227550.0 }, - { time: '2019-02-13', value: 11884803.0 }, - { time: '2019-02-14', value: 11190094.0 }, - { time: '2019-02-15', value: 15719416.0 }, - { time: '2019-02-19', value: 12272877.0 }, - { time: '2019-02-20', value: 11379006.0 }, - { time: '2019-02-21', value: 14680547.0 }, - { time: '2019-02-22', value: 12534431.0 }, - { time: '2019-02-25', value: 15051182.0 }, - { time: '2019-02-26', value: 12005571.0 }, - { time: '2019-02-27', value: 8962776.0 }, - { time: '2019-02-28', value: 15742971.0 }, - { time: '2019-03-01', value: 10942737.0 }, - { time: '2019-03-04', value: 13674737.0 }, - { time: '2019-03-05', value: 15749545.0 }, - { time: '2019-03-06', value: 13935530.0 }, - { time: '2019-03-07', value: 12644171.0 }, - { time: '2019-03-08', value: 10646710.0 }, - { time: '2019-03-11', value: 13627431.0 }, - { time: '2019-03-12', value: 12812980.0 }, - { time: '2019-03-13', value: 14168350.0 }, - { time: '2019-03-14', value: 12148349.0 }, - { time: '2019-03-15', value: 23715337.0 }, - { time: '2019-03-18', value: 12168133.0 }, - { time: '2019-03-19', value: 13462686.0 }, - { time: '2019-03-20', value: 11903104.0 }, - { time: '2019-03-21', value: 10920129.0 }, - { time: '2019-03-22', value: 25125385.0 }, - { time: '2019-03-25', value: 15463411.0 }, - { time: '2019-03-26', value: 12316901.0 }, - { time: '2019-03-27', value: 13290298.0 }, - { time: '2019-03-28', value: 20547060.0 }, - { time: '2019-03-29', value: 17283871.0 }, - { time: '2019-04-01', value: 16331140.0 }, - { time: '2019-04-02', value: 11408146.0 }, - { time: '2019-04-03', value: 15491724.0 }, - { time: '2019-04-04', value: 8776028.0 }, - { time: '2019-04-05', value: 11497780.0 }, - { time: '2019-04-08', value: 11680538.0 }, - { time: '2019-04-09', value: 10414416.0 }, - { time: '2019-04-10', value: 8782061.0 }, - { time: '2019-04-11', value: 9219930.0 }, - { time: '2019-04-12', value: 10847504.0 }, - { time: '2019-04-15', value: 7741472.0 }, - { time: '2019-04-16', value: 10239261.0 }, - { time: '2019-04-17', value: 15498037.0 }, - { time: '2019-04-18', value: 13189013.0 }, - { time: '2019-04-22', value: 11950365.0 }, - { time: '2019-04-23', value: 23488682.0 }, - { time: '2019-04-24', value: 13227084.0 }, - { time: '2019-04-25', value: 17425466.0 }, - { time: '2019-04-26', value: 16329727.0 }, - { time: '2019-04-29', value: 13984965.0 }, - { time: '2019-04-30', value: 15469002.0 }, - { time: '2019-05-01', value: 11627436.0 }, - { time: '2019-05-02', value: 14435436.0 }, - { time: '2019-05-03', value: 9388228.0 }, - { time: '2019-05-06', value: 10066145.0 }, - { time: '2019-05-07', value: 12963827.0 }, - { time: '2019-05-08', value: 12086743.0 }, - { time: '2019-05-09', value: 14835326.0 }, - { time: '2019-05-10', value: 10707335.0 }, - { time: '2019-05-13', value: 13759350.0 }, - { time: '2019-05-14', value: 12776175.0 }, - { time: '2019-05-15', value: 10806379.0 }, - { time: '2019-05-16', value: 11695064.0 }, - { time: '2019-05-17', value: 14436662.0 }, - { time: '2019-05-20', value: 20910590.0 }, - { time: '2019-05-21', value: 14016315.0 }, - { time: '2019-05-22', value: 11487448.0 }, - { time: '2019-05-23', value: 11707083.0 }, - { time: '2019-05-24', value: 8755506.0 }, - { time: '2019-05-28', value: 3097125.0 } - ]; - \ No newline at end of file diff --git a/src/context/DataProvider.tsx b/src/context/DataProvider.tsx index fc169fb..99ff466 100644 --- a/src/context/DataProvider.tsx +++ b/src/context/DataProvider.tsx @@ -1,11 +1,10 @@ import * as React from 'react'; import { DUMMY_ADDRESS, HELPER, Endpoints, ADDRESSES, coingeckoIds, dummyPrices } from '../utils/const'; const { Big } = require('big.js'); -import tronWeb from '../utils/tronWeb'; import axios from 'axios'; import { call, getABI, getAddress, getContract } from '../utils/contract'; import { ChainID, chains, chainMapping } from '../utils/chains'; -import Exchange from '../components/trade/Exchange'; +import Exchange from '../components/trade/exchange'; import { getBalancesAndApprovals } from '../utils/balances'; import { BigNumber } from 'ethers'; import socket from '../utils/socket'; diff --git a/src/context/LeverDataProvider.tsx b/src/context/LeverDataProvider.tsx index 32086fc..8c41d2e 100644 --- a/src/context/LeverDataProvider.tsx +++ b/src/context/LeverDataProvider.tsx @@ -1,7 +1,6 @@ import * as React from "react"; import { DUMMY_ADDRESS, HELPER, Endpoints, ADDRESSES } from "../utils/const"; const { Big } = require("big.js"); -import tronWeb from "../utils/tronWeb"; import axios from "axios"; import { call, getABI, getAddress, getContract } from "../utils/contract"; import { ChainID, chains, chainMapping } from "../utils/chains"; diff --git a/src/context/Wallet.tsx b/src/context/Wallet.tsx deleted file mode 100644 index 12fea05..0000000 --- a/src/context/Wallet.tsx +++ /dev/null @@ -1,115 +0,0 @@ -import * as React from 'react' -const {Big} = require('big.js'); - -const WalletContext = React.createContext({} as WalletValue); - -const TronWeb = require('tronweb') -const HttpProvider = TronWeb.providers.HttpProvider; -const node = "https://nile.trongrid.io"; -const fullNode = new HttpProvider(node); -const solidityNode = new HttpProvider(node); -const eventServer = new HttpProvider(node); -const privateKey = '52641f54dc5e1951657523c8e7a1c44ac76229a4b14db076dce6a6ce9ae9293d'; -const tronWebObject = new TronWeb(fullNode,solidityNode,eventServer,privateKey); - - -function WalletProvider({children}: any) { - const [address, setAddress] = React.useState(null); - const [tronWeb, setTronWeb] = React.useState({}); - const [isConnected, setIsConnected] = React.useState(false); - const [isConnecting, setIsConnecting] = React.useState(false); - const [isDisconnected, setIsDisconnected] = React.useState(true); - const [connectionError, setConnectionError] = React.useState(null); - const [chain, setChain] = React.useState(null); - - const connect = (callback: (address: string|null, err: string|null) => void = (__: string|null, _: string|null) => {}, options: {errRetryCount: number} = {errRetryCount: 0}) => { - setIsConnecting(true); - console.log("connecting", options.errRetryCount); - if((window as any).tronWeb){ - setTronWeb((window as any).tronWeb); - (window as any).tronWeb.trx.getAccount((window as any).tronWeb.defaultAddress.base58).then((account: any) => { - let _addr = ''; - if(!account.address){ - _addr = (window as any).tronWeb.address.fromHex(account.__payload__.address); - } else { - _addr = (window as any).tronWeb.address.fromHex(account.address); - } - if((window as any).tronWeb.fullNode.host != 'https://api.nileex.io'){ - setConnectionError('Please connect to Nile Testnet'); - callback(null, 'ERROR: Not connected to Nile Testnet') - } - setAddress(_addr) - setChain((window as any).tronWeb.fullNode.host) - callback(_addr, null) - setIsConnected(true); - setIsDisconnected(false); - setIsConnecting(false); - localStorage.setItem("address", _addr) - localStorage.setItem("chain", '-3'); - }) - .catch((err: any) => { - if(options.errRetryCount >= 3){ - setConnectionError('Unlock your TronLink wallet to connect'); - setIsConnecting(false); - let __tronWeb = (window as any).tronWeb - if(!__tronWeb){ - setTronWeb(tronWebObject) - } - callback(null, 'ERROR: TronLink wallet is locked'); - } else { - setTimeout(() => {connect(callback, {errRetryCount: options.errRetryCount + 1})}, 1000); - } - }) - } else { - // if(typeof window !== 'undefined'){ - if(options.errRetryCount >= 3){ - setConnectionError('Please install TronLink wallet extension'); - setIsConnecting(false); - let __tronWeb = (window as any).tronWeb - if(!__tronWeb){ - setTronWeb(tronWebObject) - } - callback(null, 'ERROR: TronLink wallet is not installed'); - } else { - setTimeout(() => {connect(callback, {errRetryCount: options.errRetryCount + 1})}, 1000); - } - // } - } - } - - const disconnect = () => { - setAddress(null); - setConnectionError(''); - setChain(null); - setIsConnected(false); - setIsConnecting(false); - localStorage.removeItem("address"); - localStorage.removeItem("chain"); - } - - const value: WalletValue = { - address, tronWeb, isConnected, isConnecting, isDisconnected, chain, - connect, - connectionError, - disconnect, - setConnectionError - }; - - return {children} -} - -interface WalletValue { - address: string|null; - tronWeb: {}; - isConnected: boolean; - isConnecting: boolean; - isDisconnected: boolean; - chain: null; - connect: (callback: any, options?: any) => void; - disconnect: () => void; - connectionError: string|null; - setConnectionError: (error: string) => void - -} - -export {WalletProvider, WalletContext} \ No newline at end of file diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index 209430a..db332df 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -1,72 +1,64 @@ -import { ChakraProvider, extendTheme } from '@chakra-ui/react'; -import '@rainbow-me/rainbowkit/styles.css'; -import '../styles/globals.css' +import { ChakraProvider, extendTheme } from "@chakra-ui/react"; +import "@rainbow-me/rainbowkit/styles.css"; +import "../styles/globals.css"; import { - darkTheme, - getDefaultWallets, - RainbowKitProvider, -} from '@rainbow-me/rainbowkit'; -import { - chain, - configureChains, - createClient, - WagmiConfig, -} from 'wagmi'; -import { alchemyProvider } from 'wagmi/providers/alchemy'; -import { publicProvider } from 'wagmi/providers/public'; - + darkTheme, + getDefaultWallets, + lightTheme, + midnightTheme, + RainbowKitProvider, +} from "@rainbow-me/rainbowkit"; +import { Chain, chain, configureChains, createClient, WagmiConfig } from "wagmi"; +import { alchemyProvider } from "wagmi/providers/alchemy"; +import { publicProvider } from "wagmi/providers/public"; -import theme from '../theme' -import { AppProps } from 'next/app' -import { DataProvider } from '../context/DataProvider'; -import { AppDataProvider } from '../context/AppData'; -import { Header } from '../components/Header'; -import { WalletProvider } from '../context/Wallet'; -import { LeverDataProvider } from '../context/LeverDataProvider'; +import theme from "../styles/theme"; +import { AppProps } from "next/app"; +import { DataProvider } from "../context/DataProvider"; +import { AppDataProvider } from "../context/AppData"; +import { Header } from "../components/Header"; +import { LeverDataProvider } from "../context/LeverDataProvider"; +import rainbowTheme from "../styles/rainbowTheme"; const { chains, provider } = configureChains( - [{ - ...chain.arbitrumGoerli, - iconUrl: 'https://arbitrum.io/wp-content/uploads/2021/01/Arbitrum_Symbol-Full-color-White-background.png', - }, - chain.goerli -], - [ - alchemyProvider({ apiKey: process.env.ALCHEMY_ID }), - publicProvider() - ] + [ + { + ...chain.arbitrumGoerli, + iconUrl: + "https://arbitrum.io/wp-content/uploads/2021/01/Arbitrum_Symbol-Full-color-White-background.png", + } as Chain + ], + [alchemyProvider({ apiKey: process.env.ALCHEMY_ID }), publicProvider()] ); const { connectors } = getDefaultWallets({ - appName: 'My RainbowKit App', - chains + appName: "My RainbowKit App", + chains, }); const wagmiClient = createClient({ - autoConnect: true, - connectors, - provider -}) + autoConnect: true, + connectors, + provider, +}); function MyApp({ Component, pageProps }: AppProps) { - return ( - - - - - - - -
- - - - - - - - - ) + return ( + + + + + + +
+ + + + + + + + ); } -export default MyApp \ No newline at end of file +export default MyApp; diff --git a/src/pages/_margin/[pairId].tsx b/src/pages/_margin/[pairId].tsx index 53a6f0b..0bdf4df 100644 --- a/src/pages/_margin/[pairId].tsx +++ b/src/pages/_margin/[pairId].tsx @@ -1,23 +1,21 @@ import { Box, Flex, Tag, Text, useColorMode } from '@chakra-ui/react'; import { Header } from '../../components/Header'; import GraphPanel from '../../components/trade/GraphPanel'; -import TokensPanel from '../../components/trade/TokensPanel/TokensPanel'; -import OrdersPanel from '../../components/trade/Orders/OrdersPanel'; +import TokensPanel from '../../components/trade/tokens/TokensPanel'; +import OrdersPanel from '../../components/trade/orders/OrdersPanel'; import TitlePanel from '../../components/trade/TitlePanel'; -import Swap from '../../components/trade/new_orders/Limit'; +import Swap from '../../components/trade/exchange/Limit'; import { useContext } from 'react'; import { DataContext } from '../../context/DataProvider'; import { useRouter } from 'next/router'; -import PlacedOrders from '../../components/trade/UserOrders'; +import PlacedOrders from '../../components/trade/user_orders/PlacedOrders'; import { useEffect, useState } from 'react'; -import Exchange from '../../components/trade/Exchange'; -import { WalletContext } from '../../context/Wallet'; +import Exchange from '../../components/trade/exchange'; import Head from 'next/head'; import { useAccount } from 'wagmi'; const Trade = () => { const { pairs } = useContext(DataContext); - const { isConnected } = useContext(WalletContext); const { isConnected: isEvmConnected } = useAccount(); diff --git a/src/pages/_margin/index.tsx b/src/pages/_margin/index.tsx index 5c316fb..7bfa96d 100644 --- a/src/pages/_margin/index.tsx +++ b/src/pages/_margin/index.tsx @@ -3,13 +3,11 @@ import { useRouter } from 'next/router' import { Box, Text, Flex } from '@chakra-ui/react' import { useContext, useEffect } from 'react'; import { DataContext } from '../../context/DataProvider'; -import { WalletContext } from '../../context/Wallet'; export default function trade() { const router = useRouter(); const {pairs} = useContext(DataContext); - const {isConnecting} = useContext(WalletContext); useEffect(() => { if(pairs.length > 0){ diff --git a/src/pages/graph.tsx b/src/pages/graph.tsx index 1b77597..00b8b54 100644 --- a/src/pages/graph.tsx +++ b/src/pages/graph.tsx @@ -3,7 +3,7 @@ import dynamic from 'next/dynamic'; const TVChartContainer = dynamic( () => - import('../components/TVChartContainer').then(mod => mod.TVChartContainer), + import('../components/graph').then(mod => mod.TVChartContainer), { ssr: false }, ); diff --git a/src/pages/index.tsx b/src/pages/index.tsx index 49115a9..5daf15b 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -12,7 +12,7 @@ import { Divider, } from "@chakra-ui/react"; -import { Footer } from "../components/Footer"; +import { Footer } from "../components/landing/Footer"; import { useColorMode } from "@chakra-ui/react"; import Link from "next/link"; import Head from "next/head"; diff --git a/src/pages/portfolio.tsx b/src/pages/portfolio.tsx index 1151e0a..ac4c9c4 100644 --- a/src/pages/portfolio.tsx +++ b/src/pages/portfolio.tsx @@ -1,7 +1,6 @@ import React from 'react'; import { Header } from '../components/Header'; import { useContext } from 'react'; -import { WalletContext } from '../context/Wallet'; import { Avatar, Box, Button, Flex, Progress, Text } from '@chakra-ui/react'; import { @@ -31,7 +30,6 @@ import Image from 'next/image'; import { useAccount } from 'wagmi'; export default function wallet() { - const { address, isConnected } = useContext(WalletContext); const { address: evmAddress, isConnected: isEvmConnected } = useAccount(); const { tokens } = useContext(DataContext); diff --git a/src/pages/trade/[pairId].tsx b/src/pages/trade/[pairId].tsx index 53a6f0b..504b0bc 100644 --- a/src/pages/trade/[pairId].tsx +++ b/src/pages/trade/[pairId].tsx @@ -1,25 +1,21 @@ import { Box, Flex, Tag, Text, useColorMode } from '@chakra-ui/react'; import { Header } from '../../components/Header'; import GraphPanel from '../../components/trade/GraphPanel'; -import TokensPanel from '../../components/trade/TokensPanel/TokensPanel'; -import OrdersPanel from '../../components/trade/Orders/OrdersPanel'; +import TokensPanel from '../../components/trade/tokens/TokensPanel'; +import OrdersPanel from '../../components/trade/orders/OrdersPanel'; import TitlePanel from '../../components/trade/TitlePanel'; -import Swap from '../../components/trade/new_orders/Limit'; +import Swap from '../../components/trade/exchange/Limit'; import { useContext } from 'react'; import { DataContext } from '../../context/DataProvider'; import { useRouter } from 'next/router'; -import PlacedOrders from '../../components/trade/UserOrders'; +import PlacedOrders from '../../components/trade/user_orders/PlacedOrders'; import { useEffect, useState } from 'react'; -import Exchange from '../../components/trade/Exchange'; -import { WalletContext } from '../../context/Wallet'; +import Exchange from '../../components/trade/exchange'; import Head from 'next/head'; import { useAccount } from 'wagmi'; const Trade = () => { const { pairs } = useContext(DataContext); - const { isConnected } = useContext(WalletContext); - - const { isConnected: isEvmConnected } = useAccount(); const router = useRouter(); const { pairId } = router.query; @@ -53,8 +49,8 @@ const Trade = () => { + gap={1} + mt={1}> { + mb={{ sm: '1', md: 1, lg: 0 }}> diff --git a/src/pages/trade/index.tsx b/src/pages/trade/index.tsx index f15f038..525adb0 100644 --- a/src/pages/trade/index.tsx +++ b/src/pages/trade/index.tsx @@ -3,13 +3,11 @@ import { useRouter } from 'next/router' import { Box, Text, Flex } from '@chakra-ui/react' import { useContext, useEffect } from 'react'; import { DataContext } from '../../context/DataProvider'; -import { WalletContext } from '../../context/Wallet'; export default function trade() { const router = useRouter(); const {pairs} = useContext(DataContext); - const {isConnecting} = useContext(WalletContext); useEffect(() => { if(pairs.length > 0){ diff --git a/src/styles/rainbowTheme.tsx b/src/styles/rainbowTheme.tsx new file mode 100644 index 0000000..6149119 --- /dev/null +++ b/src/styles/rainbowTheme.tsx @@ -0,0 +1,123 @@ +var systemFontStack = '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"'; +var fontStacks = { + rounded: `SFRounded, ui-rounded, "SF Pro Rounded", ${systemFontStack}`, + system: systemFontStack +}; +var radiusScales = { + large: { + actionButton: "9999px", + connectButton: "12px", + modal: "24px", + modalMobile: "28px" + }, + medium: { + actionButton: "10px", + connectButton: "8px", + modal: "16px", + modalMobile: "18px" + }, + none: { + actionButton: "0px", + connectButton: "0px", + modal: "0px", + modalMobile: "0px" + }, + small: { + actionButton: "4px", + connectButton: "4px", + modal: "8px", + modalMobile: "8px" + } +}; +var blurs = { + large: { + modalOverlay: "blur(20px)" + }, + none: { + modalOverlay: "blur(0px)" + }, + small: { + modalOverlay: "blur(4px)" + } +}; +var baseTheme = ({ + borderRadius = "small", + fontStack = "rounded", + overlayBlur = "none" +}) => ({ + blurs: { + modalOverlay: blurs[overlayBlur].modalOverlay + }, + fonts: { + body: fontStacks[fontStack] + }, + radii: { + actionButton: radiusScales[borderRadius].actionButton, + connectButton: radiusScales[borderRadius].connectButton, + menuButton: radiusScales[borderRadius].connectButton, + modal: radiusScales[borderRadius].modal, + modalMobile: radiusScales[borderRadius].modalMobile + } +}); + +var darkGrey = "#1A1B1F"; +var accentColors = { + blue: { accentColor: "#3898FF", accentColorForeground: "#FFF" }, + green: { accentColor: "#4BD166", accentColorForeground: darkGrey }, + orange: { accentColor: "#FF983D", accentColorForeground: darkGrey }, + pink: { accentColor: "#FF7AB8", accentColorForeground: darkGrey }, + purple: { accentColor: "#7A70FF", accentColorForeground: "#FFF" }, + red: { accentColor: "#FF6257", accentColorForeground: "#FFF" } +}; +var defaultAccentColor = accentColors.blue; + +var rainbowTheme = ({ + accentColor = defaultAccentColor.accentColor, + accentColorForeground = defaultAccentColor.accentColorForeground, + ...baseThemeOptions + } = {}) => ({ + ...baseTheme(baseThemeOptions), + colors: { + accentColor, + accentColorForeground, + actionButtonBorder: "rgba(255, 255, 255, 0.04)", + actionButtonBorderMobile: "rgba(255, 255, 255, 0.08)", + actionButtonSecondaryBackground: "rgba(255, 255, 255, 0.08)", + closeButton: "rgba(224, 232, 255, 0.6)", + closeButtonBackground: "rgba(255, 255, 255, 0.08)", + connectButtonBackground: '#130B25', + connectButtonBackgroundError: "#FF494A", + connectButtonInnerBackground: "linear-gradient(0deg, rgba(255, 255, 255, 0.075), rgba(255, 255, 255, 0.15))", + connectButtonText: "#FFF", + connectButtonTextError: "#FFF", + connectionIndicator: "#30E000", + downloadBottomCardBackground: "linear-gradient(126deg, rgba(0, 0, 0, 0) 9.49%, rgba(120, 120, 120, 0.2) 71.04%), #1A1B1F", + downloadTopCardBackground: "linear-gradient(126deg, rgba(120, 120, 120, 0.2) 9.49%, rgba(0, 0, 0, 0) 71.04%), #1A1B1F", + error: "#FF494A", + generalBorder: "rgba(255, 255, 255, 0.08)", + generalBorderDim: "rgba(255, 255, 255, 0.04)", + menuItemBackground: "rgba(224, 232, 255, 0.1)", + modalBackdrop: "rgba(0, 0, 0, 0.5)", + modalBackground: "#0E0020", + modalBorder: "rgba(255, 255, 255, 0.08)", + modalText: "#FFF", + modalTextDim: "rgba(224, 232, 255, 0.3)", + modalTextSecondary: "rgba(255, 255, 255, 0.6)", + profileAction: "rgba(224, 232, 255, 0.1)", + profileActionHover: "rgba(224, 232, 255, 0.2)", + profileForeground: "rgba(224, 232, 255, 0.05)", + selectedOptionBorder: "rgba(224, 232, 255, 0.1)", + standby: "#FFD641" + }, + shadows: { + connectButton: "0px 4px 12px rgba(0, 0, 0, 0.1)", + dialog: "0px 8px 32px rgba(0, 0, 0, 0.32)", + profileDetailsAction: "0px 2px 6px rgba(37, 41, 46, 0.04)", + selectedOption: "0px 2px 6px rgba(0, 0, 0, 0.24)", + selectedWallet: "0px 2px 6px rgba(0, 0, 0, 0.24)", + walletLogo: "0px 2px 16px rgba(0, 0, 0, 0.16)" + } + }); + + export default rainbowTheme; + \ No newline at end of file diff --git a/src/theme.tsx b/src/styles/theme.tsx similarity index 94% rename from src/theme.tsx rename to src/styles/theme.tsx index 7217232..bbb10f7 100644 --- a/src/theme.tsx +++ b/src/styles/theme.tsx @@ -82,22 +82,22 @@ const theme = extendTheme({ }, Input: { baseStyle: { - borderRadius: '0px' + borderRadius: '2px' } }, NumberInput: { baseStyle: { - borderRadius: '0px' + borderRadius: '2px', } }, InputGroup: { baseStyle: { - borderRadius: '0px' + borderRadius: '2px' } }, InputLeftElement: { baseStyle: { - borderRadius: '0px' + borderRadius: '2px' } } } diff --git a/yarn.lock b/yarn.lock index 57b4a6d..79fb992 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2049,13 +2049,6 @@ axios@^0.21.0: dependencies: follow-redirects "^1.14.0" -axios@^0.26.1: - version "0.26.1" - resolved "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz" - integrity sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA== - dependencies: - follow-redirects "^1.14.8" - axios@^1.1.3: version "1.1.3" resolved "https://registry.npmjs.org/axios/-/axios-1.1.3.tgz" @@ -2127,11 +2120,6 @@ bigint-buffer@^1.1.5: dependencies: bindings "^1.3.0" -bignumber.js@^9.0.1: - version "9.1.0" - resolved "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.0.tgz" - integrity sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A== - bind-decorator@^1.0.11: version "1.0.11" resolved "https://registry.yarnpkg.com/bind-decorator/-/bind-decorator-1.0.11.tgz#e41bc06a1f65dd9cec476c91c5daf3978488252f" @@ -2788,7 +2776,7 @@ ethereumjs-util@^6.0.0: ethjs-util "0.1.6" rlp "^2.2.3" -ethers@^5.4.4, ethers@^5.7.2: +ethers@^5.7.2: version "5.7.2" resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== @@ -2837,11 +2825,6 @@ eventemitter3@4.0.7, eventemitter3@^4.0.7: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== -eventemitter3@^3.1.0: - version "3.1.2" - resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz" - integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== - events@^3.0.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" @@ -2907,7 +2890,7 @@ focus-lock@^0.11.2: dependencies: tslib "^2.0.3" -follow-redirects@^1.14.0, follow-redirects@^1.14.8, follow-redirects@^1.15.0: +follow-redirects@^1.14.0, follow-redirects@^1.15.0: version "1.15.2" resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz" integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== @@ -3077,11 +3060,6 @@ inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.4: resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -injectpromise@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/injectpromise/-/injectpromise-1.0.0.tgz" - integrity sha512-qNq5wy4qX4uWHcVFOEU+RqZkoVG65FhvGkyDWbuBxILMjK6A1LFf5A1mgXZkD4nRx5FCorD81X/XvPKp/zVfPA== - invariant@^2.2.4: version "2.2.4" resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz" @@ -3265,11 +3243,6 @@ lines-and-columns@^1.1.6: resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== -loadjs@^4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/loadjs/-/loadjs-4.2.0.tgz" - integrity sha512-AgQGZisAlTPbTEzrHPb6q+NYBMD+DP9uvGSIjSUM5uG+0jG15cb8axWpxuOIqrmQjn6scaaH8JwloiP27b2KXA== - locate-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" @@ -3295,7 +3268,7 @@ lodash.mergewith@4.6.2: resolved "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz" integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ== -lodash@^4.17.20, lodash@^4.17.21: +lodash@^4.17.20: version "4.17.21" resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -3706,13 +3679,6 @@ react-style-singleton@^2.2.1: invariant "^2.2.4" tslib "^2.0.0" -react-twitter-widgets@^1.11.0: - version "1.11.0" - resolved "https://registry.npmjs.org/react-twitter-widgets/-/react-twitter-widgets-1.11.0.tgz" - integrity sha512-PMCLJQc30iqy01y1b2+HnMfCX+ZkOxWaPKJb4BhHgOgjSjoZb68K5T0nq3q+3YbX9K7OH0bhptgDihtBG/BqRQ== - dependencies: - loadjs "^4.2.0" - react@^18.2.0: version "18.2.0" resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz" @@ -3831,11 +3797,6 @@ secp256k1@^4.0.1, secp256k1@^4.0.2: node-addon-api "^2.0.0" node-gyp-build "^4.2.0" -semver@^5.6.0: - version "5.7.1" - resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: version "6.3.0" resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" @@ -4039,22 +4000,6 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== -tronweb@^4.4.0: - version "4.4.0" - resolved "https://registry.npmjs.org/tronweb/-/tronweb-4.4.0.tgz" - integrity sha512-0yPmjQE1drPcDtW4YCXFjtvDQmKc/utjKB2J6U5GDcWWhsGqE8yFjdIMJRa1yj1a/oFQNlthKMzw4Jd7lkWbYA== - dependencies: - "@babel/runtime" "^7.0.0" - axios "^0.26.1" - bignumber.js "^9.0.1" - elliptic "^6.5.4" - ethers "^5.4.4" - eventemitter3 "^3.1.0" - injectpromise "^1.0.0" - lodash "^4.17.21" - semver "^5.6.0" - validator "^13.7.0" - tslib@^1.9.0: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" @@ -4138,11 +4083,6 @@ uuid@^8.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -validator@^13.7.0: - version "13.7.0" - resolved "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz" - integrity sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw== - wagmi@^0.8.3: version "0.8.3" resolved "https://registry.yarnpkg.com/wagmi/-/wagmi-0.8.3.tgz#01184de1e3dfb3d6ae674060e370425d28c03105" From 71ee5ae370489b4d257f44fe5eae20020aac89fc Mon Sep 17 00:00:00 2001 From: prasad-kumkar Date: Mon, 19 Dec 2022 12:37:48 +0530 Subject: [PATCH 21/37] buy sell --- src/components/trade/exchange/Buy.tsx | 2 +- .../trade/exchange/BuySellModal.tsx | 1 + .../trade/exchange/BuySellModal2.tsx | 482 ++++++++++++++++++ .../trade/exchange/OrdersToExecute.tsx | 71 +-- src/components/trade/exchange/Sell.tsx | 25 +- src/context/DataProvider.tsx | 19 +- src/pages/faucet.tsx | 8 +- src/styles/theme.tsx | 1 + src/utils/const.ts | 2 +- 9 files changed, 529 insertions(+), 82 deletions(-) create mode 100644 src/components/trade/exchange/BuySellModal2.tsx diff --git a/src/components/trade/exchange/Buy.tsx b/src/components/trade/exchange/Buy.tsx index 005738b..12381eb 100644 --- a/src/components/trade/exchange/Buy.tsx +++ b/src/components/trade/exchange/Buy.tsx @@ -21,7 +21,7 @@ import { DataContext } from '../../../context/DataProvider'; import { useEffect } from 'react'; import axios from 'axios'; import { getABI, getAddress } from '../../../utils/contract'; -import BuySellModal from './BuySellModal'; +import BuySellModal from './BuySellModal2'; import { tokenFormatter } from '../../../utils/formatters'; import { AppDataContext } from '../../../context/AppData'; const Big = require('big.js'); diff --git a/src/components/trade/exchange/BuySellModal.tsx b/src/components/trade/exchange/BuySellModal.tsx index 803cf85..7689d00 100644 --- a/src/components/trade/exchange/BuySellModal.tsx +++ b/src/components/trade/exchange/BuySellModal.tsx @@ -103,6 +103,7 @@ export default function BuySellModal({ ) .then((resp) => { let _orders = resp.data.data; + console.log(_orders); setOrders(_orders); }); }; diff --git a/src/components/trade/exchange/BuySellModal2.tsx b/src/components/trade/exchange/BuySellModal2.tsx new file mode 100644 index 0000000..06db93a --- /dev/null +++ b/src/components/trade/exchange/BuySellModal2.tsx @@ -0,0 +1,482 @@ +import { + Alert, + AlertIcon, + Box, + Button, + Flex, + Skeleton, + Text, + useDisclosure, +} from "@chakra-ui/react"; +import React, { useContext } from "react"; +const Big = require("big.js"); + +import axios from "axios"; + +import { + Modal, + ModalOverlay, + ModalContent, + ModalHeader, + ModalFooter, + ModalBody, + ModalCloseButton, +} from "@chakra-ui/react"; + +import { DataContext } from "../../../context/DataProvider"; +import { useAccount, useSignTypedData } from "wagmi"; +import { Endpoints } from "../../../utils/const"; +import OrdersToExecute from "./OrdersToExecute"; + +import { Step, Steps, useSteps } from "chakra-ui-steps"; +import PlaceOrder from "./PlaceOrder"; +import { useEffect } from "react"; +import { useToast } from "@chakra-ui/react"; +import { + getAddress, + getContract, + getInterface, + send, +} from "../../../utils/contract"; +import { ethers } from "ethers"; + +export default function BuySellModal2({ + pair, + token1, + token0, + token1Amount, // needed for market orders + token0Amount, + price, // needed for limit orders + buy, + limit, +}) { + if (token0Amount == "") token0Amount = "0"; + if (token1Amount == "") token1Amount = "0"; + if (price == "") price = "0"; + + const toast = useToast(); + const toastIdRef = React.useRef(); + + const { isOpen, onOpen, onClose } = useDisclosure(); + const [orders, setOrders] = React.useState(null); + const [orderToPlace, setOrderToPlace] = React.useState(null); + + const [loading, setLoading] = React.useState(false); + + const { address, isConnected: isEvmConnected } = useAccount(); + + const { chain, incrementAllowance } = useContext(DataContext); + const { data, isError, isLoading, isSuccess, signTypedDataAsync } = + useSignTypedData(); + + const amountExceedsBalance = () => { + const amount = buy ? token0Amount * price : token0Amount; + const balance = buy + ? token1?.balance / 10 ** token1?.decimals + : token0?.balance / 10 ** token0?.decimals; + + if (isNaN(Number(amount))) return false; + return Big(amount).gt(balance); + }; + + useEffect(() => { + if (token0Amount > 0 && token0 && !orderToPlace) { + setOrderToPlace( + Big(token0Amount) + .times(10 ** token0?.decimals) + .toFixed(0) + ); + } + }); + + const approve = async () => { + setLoading(true); + const token = await getContract("ERC20", chain, tokenToSpend.id); + send( + token, + "approve", + [getAddress("Exchange", chain), ethers.constants.MaxUint256], + chain + ) + .then(async (res: any) => { + await res.wait(1); + setLoading(false); + incrementAllowance( + tokenToSpend.id, + ethers.constants.MaxUint256.toString() + ); + }) + .catch((err: any) => { + setLoading(false); + console.log(err); + }); + }; + + const _onOpen = () => { + onOpen(); + let _amount = Big(token0Amount) + .times(10 ** token0.decimals) + .toFixed(0); + if (buy && !limit) { + _amount = Big(token1Amount) + .times(10 ** token1.decimals) + .toFixed(0); + } + + axios + .get( + Endpoints[chain] + + `order/${limit ? "limit" : "market"}/matched/` + + pair.id, + { + params: { + amount: _amount, + exchangeRate: Big(price) + .times(10 ** 18) + .toFixed(0), + buy, + chainId: chain, + }, + } + ) + .then((resp) => { + let _orders = resp.data.data; + console.log(_orders); + setOrders(_orders); + }); + }; + + const execute = async () => { + setLoading(true); + let _amount = Big(token0Amount) + .times(10 ** token0.decimals) + .toFixed(0); + if (buy && !limit) { + _amount = Big(token1Amount) + .times(10 ** token1.decimals) + .toFixed(0); + } + + try{ + const _orders = ( + await axios.get( + Endpoints[chain] + + `order/${limit ? "limit" : "market"}/matched/` + + pair.id, + { + params: { + amount: _amount, + exchangeRate: Big(price) + .times(10 ** 18) + .toFixed(0), + buy, + chainId: chain, + }, + } + ) + ).data.data; + + console.log(_orders) + + if (_orders.length > 0) { + const exchange = await getContract("Exchange", chain); + toast.close(toastIdRef.current); + toastIdRef.current = toast({ + title: "Sending transaction...", + description: "Executing orders within limit", + status: "loading", + duration: null, + }); + const res = await send( + exchange, + "executeMultipleLimitOrders", + [ + _orders.map((order: any) => order.signature), + _orders.map((order: any) => order.value), + _amount, + ], + chain + ); + const receipt = await res.wait(1); + const exchangeItf = await getInterface("Exchange", chain); + let total = Big(0); + receipt.logs.forEach((log: any) => { + try { + const parsed = exchangeItf.parseLog(log); + if (parsed.name == "OrderExecuted") { + console.log(parsed); + total = total.plus(parsed.args.fillAmount); + } + } catch (err) {} + }); + + _amount = Big(_amount).sub(total).toFixed(0); + } + if (Big(_amount).gt(0)) { + + toastIdRef.current = toast({ + title: "Placing order...", + description: "Placing limit order offchain", + status: "loading", + duration: null, + }); + const domain: any = { + name: "zexe", + version: "1", + chainId: chain.toString(), + verifyingContract: getAddress("Exchange", chain), + }; + + // The named list of all type definitions + const types = { + Order: [ + { name: "maker", type: "address" }, + { name: "token0", type: "address" }, + { name: "token1", type: "address" }, + { name: "amount", type: "uint256" }, + { name: "buy", type: "bool" }, + { name: "salt", type: "uint32" }, + { name: "exchangeRate", type: "uint216" }, + ], + }; + + const value = { + maker: address, + token0: token0.id, + token1: token1.id, + amount: _amount, + buy, + salt: (Math.random() * 1000000).toFixed(0), + exchangeRate: ethers.utils + .parseEther(price.toString()) + .toString(), + }; + + signTypedDataAsync({ + domain, + types, + value, + }).then((signature) => { + console.log(signature); + axios + .post("http://localhost:3010/order/create", { + signature, + data: value, + chainId: chain.toString(), + }) + .then((res) => { + setLoading(false); + toast.close(toastIdRef.current); + toast({ + title: "Order created successfully!", + description: "Order created successfully!", + status: "success", + }); + }) + .catch((err) => { + setLoading(false); + toast.close(toastIdRef.current); + toast({ + title: "Order failed. Please try again!", + description: err.response.data.error, + status: "error", + }); + }); + }); + } else { + setLoading(false); + toast.close(toastIdRef.current); + toast({ + title: "Order executed successfully!", + description: "Order was executed within limit!", + status: "success", + }); + } + } catch(err) { + console.log(err); + setLoading(false); + toast.close(toastIdRef.current); + toast({ + title: "Order failed. Please try again!", + description: 'Order failed', + status: "error", + }); + } + }; + + const { nextStep, prevStep, setStep, reset, activeStep } = useSteps({ + initialStep: 0, + }); + + const _onClose = () => { + setOrderToPlace(null); + setOrders(null); + onClose(); + reset(); + }; + + const tokenAmountToSpend = buy ? token1Amount : token0Amount; + const tokenToSpend = buy ? token1 : token0; + + return ( + <> + {Big(tokenAmountToSpend).lt(tokenToSpend?.allowance ?? 1e50) ? ( + + ) : ( + + )} + + + + + + {orders + ? orders.length > 0 && !(activeStep >= 1) + ? "Execute orders within limit" + : "Place order" + : "Review Order"} + + + + + {orders ? ( + limit ? ( + orders.length > 0 ? ( + + + + + + + + + + + + + ) : ( + + ) + ) : ( + + ) + ) : ( + <> + + + + + )} + + + + + + ); +} diff --git a/src/components/trade/exchange/OrdersToExecute.tsx b/src/components/trade/exchange/OrdersToExecute.tsx index a5974df..3dedeb1 100644 --- a/src/components/trade/exchange/OrdersToExecute.tsx +++ b/src/components/trade/exchange/OrdersToExecute.tsx @@ -57,7 +57,7 @@ export default function OrdersToExecute({ let _amount = Big(amountToFill) .times(10 ** pair.tokens[0].decimals) .toFixed(0); - console.log(_amount); + console.log(orders); const exchange = await getContract("Exchange", chain); send( exchange, @@ -72,31 +72,27 @@ export default function OrdersToExecute({ .then(async (res: any) => { setLoading(false); setResponse("Transaction sent! Waiting for confirmation..."); - if (chain == ChainID.NILE) { - setHash(res); - checkResponse(res); - } else { - setHash(res.hash); - const receipt = await res.wait(1); - const exchangeItf = await getInterface("Exchange", chain); - // parse orders from receipt.logs - let total = Big(0); + setHash(res.hash); + const receipt = await res.wait(1); + const exchangeItf = await getInterface("Exchange", chain); + // parse orders from receipt.logs + let total = Big(0); - receipt.logs.forEach((log: any) => { - try { - const parsed = exchangeItf.parseLog(log); - if (parsed.name == "OrderExecuted") { - console.log(parsed); - total = total.plus(parsed.args.fillAmount); - } - } catch (err) {} - }); - setOrderToPlace(Big(_amount).sub(total).toFixed(0)); - setRemainingAmount(Big(_amount).sub(total).toFixed(0)); - setAmountExecuted(total.toFixed(0)); - setConfirmed(true); - setResponse("Transaction Successful!"); - } + receipt.logs.forEach((log: any) => { + try { + const parsed = exchangeItf.parseLog(log); + if (parsed.name == "OrderExecuted") { + console.log(parsed); + total = total.plus(parsed.args.fillAmount); + } + } catch (err) {} + }); + setOrderToPlace(Big(_amount).sub(total).toFixed(0)); + setRemainingAmount(Big(_amount).sub(total).toFixed(0)); + setAmountExecuted(total.toFixed(0)); + setConfirmed(true); + setResponse("Transaction Successful!"); + }) .catch((err: any) => { console.log(err); @@ -132,31 +128,6 @@ export default function OrdersToExecute({ }); }; - const checkResponse = (tx_id: string) => { - axios - .get( - "https://nile.trongrid.io/wallet/gettransactionbyid?value=" + - tx_id - ) - .then((res) => { - if (!res.data.ret) { - setTimeout(() => { - checkResponse(tx_id); - }, 2000); - } else { - setConfirmed(true); - if (res.data.ret[0].contractRet == "SUCCESS") { - setResponse("Transaction Successful!"); - } else { - setResponse("Transaction Failed. Please try again."); - } - } - }) - .catch((err: any) => { - setLoading(false); - }); - }; - useEffect(() => { if (orders) { // calculate total size diff --git a/src/components/trade/exchange/Sell.tsx b/src/components/trade/exchange/Sell.tsx index ea75e6f..92c5c9c 100644 --- a/src/components/trade/exchange/Sell.tsx +++ b/src/components/trade/exchange/Sell.tsx @@ -22,7 +22,7 @@ import { useEffect } from "react"; import axios from "axios"; import { tokenFormatter } from "../../../utils/formatters"; import { AppDataContext } from "../../../context/AppData"; -import BuySellModal from "./BuySellModal"; +import BuySellModal from "./BuySellModal2"; const Big = require("big.js"); @@ -91,29 +91,6 @@ export default function BuyModule({ pair, limit }) { } }); - // check response in intervals - const checkResponse = (tx_id: string) => { - axios - .get( - "https://nile.trongrid.io/wallet/gettransactionbyid?value=" + - tx_id - ) - .then((res) => { - if (!res.data.ret) { - setTimeout(() => { - checkResponse(tx_id); - }, 2000); - } else { - setLoading(false); - if (res.data.ret[0].contractRet == "SUCCESS") { - setResponse("Transaction Successful!"); - } else { - setResponse("Transaction Failed. Please try again."); - } - } - }); - }; - const setSlider = (e) => { setSliderValue(e); if (!token0 || !price) return; diff --git a/src/context/DataProvider.tsx b/src/context/DataProvider.tsx index 99ff466..6918f7c 100644 --- a/src/context/DataProvider.tsx +++ b/src/context/DataProvider.tsx @@ -50,7 +50,7 @@ function DataProvider({ children }: any) { const explorer = () => { - return chain === ChainID.NILE ? 'https://nile.explorer.org/#/transaction/' : chainMapping[chain]?.blockExplorers.default.url+'tx/'; + return chainMapping[chain]?.blockExplorers.default.url+'tx/'; } const incrementAllowance = async (marketId: any, amount: string) => { @@ -101,6 +101,7 @@ function DataProvider({ children }: any) { fetchPairData(_pairs, chain); subscribePairHistory(_pairs); + subscribePairOrders(_pairs); if(firstTime) { _tokens = res[1].data.data; @@ -137,10 +138,26 @@ function DataProvider({ children }: any) { console.log('found pair', _pairs[i]); } } + console.log('pairs', _pairs); setPairs(_pairs); }) } + const subscribePairOrders = (_pairs: any[]) => { + socket.on('PAIR_ORDERS', (res) => { + console.log('PAIR_ORDERS', res); + // for(let i in _pairs) { + // if(_pairs[i].id === pair) { + // _pairs[i].priceDiff = Big(_pairs[i].exchangeRate).minus(exchangeRate).toString(); + // _pairs[i].exchangeRate = exchangeRate; + // console.log('found pair', _pairs[i]); + // } + // } + // console.log('pairs', _pairs); + // setPairs(_pairs); + }) + } + const fetchOrders = (pairs: any[], chain: number) => { let orderRequests = pairs.map((pair) => ( axios.get(Endpoints[chain]+`pair/orders/${pair.id}`, { diff --git a/src/pages/faucet.tsx b/src/pages/faucet.tsx index 38af48b..8cf01c7 100644 --- a/src/pages/faucet.tsx +++ b/src/pages/faucet.tsx @@ -15,7 +15,6 @@ import Image from 'next/image'; import React from 'react'; import { useContext } from 'react'; import { DataContext } from '../context/DataProvider'; -import { WalletContext } from '../context/Wallet'; import { getABI, getContract, send } from '../utils/contract'; const mintAmount = { @@ -80,7 +79,6 @@ function RadioCard(props) { export default function faucets() { const { tokens, chain, explorer } = useContext(DataContext); - const { address, isConnected } = useContext(WalletContext); const { address: evmAddress, isConnected: isEvmConnected } = useAccount(); const [hydrated, setHydrated] = React.useState(false); @@ -115,7 +113,7 @@ export default function faucets() { tokenContract, 'mint', [ - address ?? evmAddress, + evmAddress, Big(mintAmount[token.symbol]).times(1e18).toFixed(0), ], chain @@ -276,8 +274,8 @@ export default function faucets() { bgGradient={'linear(to-r, #E11860, #CB1DC3)'} size="lg" isLoading={loading} - disabled={!(isConnected || isEvmConnected) || loading}> - {isConnected || isEvmConnected + disabled={!isEvmConnected || loading}> + {isEvmConnected ? 'Mint' : 'Connect Wallet'} diff --git a/src/styles/theme.tsx b/src/styles/theme.tsx index bbb10f7..5c9b70b 100644 --- a/src/styles/theme.tsx +++ b/src/styles/theme.tsx @@ -103,4 +103,5 @@ const theme = extendTheme({ } }) + export default theme diff --git a/src/utils/const.ts b/src/utils/const.ts index 3c4baaf..454bbf0 100644 --- a/src/utils/const.ts +++ b/src/utils/const.ts @@ -19,7 +19,7 @@ export const ADDRESSES = { Vault: '0x4811419e3c5e1d91Ac83427562a455C22B5eA95F', }, [ChainID.ARB_GOERLI]: { - Exchange: '0xD3D3A8146Cb6E5045eFb4739Ae88592744aE81BA', + Exchange: '0x46C9Ad9bA79783017790fc4Bed4364aBB98c22Dd', Multicall: '0x511f64296fa72526231E5A55615d8e4eE5a2d4cF', Lever: '0x7861292fd666f7c744a694D3B83B708b13a419f7' } From 2c328458ef7ea58b613e43414f518b9689ac9097 Mon Sep 17 00:00:00 2001 From: prasad-kumkar Date: Mon, 19 Dec 2022 14:55:50 +0530 Subject: [PATCH 22/37] update --- src/abis/Exchange.json | 92 ++- src/abis/Lever.json | 555 +++++++++++++++++- .../trade/exchange/BuySellModal2.tsx | 5 +- src/pages/lend.tsx | 77 ++- src/styles/theme.tsx | 6 +- src/utils/const.ts | 4 +- src/utils/contract.ts | 3 +- 7 files changed, 703 insertions(+), 39 deletions(-) diff --git a/src/abis/Exchange.json b/src/abis/Exchange.json index 9461fcf..0e52d5a 100644 --- a/src/abis/Exchange.json +++ b/src/abis/Exchange.json @@ -441,7 +441,7 @@ }, { "internalType": "uint256", - "name": "amountToFill", + "name": "token0AmountToFill", "type": "uint256" } ], @@ -450,6 +450,66 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "bytes[]", + "name": "signatures", + "type": "bytes[]" + }, + { + "components": [ + { + "internalType": "address", + "name": "maker", + "type": "address" + }, + { + "internalType": "address", + "name": "token0", + "type": "address" + }, + { + "internalType": "address", + "name": "token1", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "buy", + "type": "bool" + }, + { + "internalType": "uint32", + "name": "salt", + "type": "uint32" + }, + { + "internalType": "uint216", + "name": "exchangeRate", + "type": "uint216" + } + ], + "internalType": "struct IExchange.Order[]", + "name": "orders", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "token1AmountToFill", + "type": "uint256" + } + ], + "name": "executeMultipleMarketOrders", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -588,6 +648,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "makerFee", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -724,6 +797,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "takerFee", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -857,8 +943,8 @@ "type": "function" } ], - "bytecode": "0x610140346200018157601f620024b838819003918201601f19168301926001600160401b03929091838511838610176200016b5781602092849260409788528339810103126200018157516001600160a01b0381169081900362000181578251906200006b8262000186565b60048252600160208301637a65786560e01b8152602086516200008e8162000186565b8381520193603160f81b855251902092208260e052610100948186524660a05280519060208201927f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f958685528284015260608301524660808301523060a083015260a0825260c0820195828710908711176200016b578590525190206080523060c052610120918252600080546001600160a01b0319169190911790556123159283620001a3843960805183611f39015260a05183612004015260c05183611f03015260e05183611f8801525182611fae01525181611f650152f35b634e487b7160e01b600052604160045260246000fd5b600080fd5b604081019081106001600160401b038211176200016b5760405256fe6080604052600436101561001257600080fd5b60003560e01c80630b5d301714610d775780630f20019114610b2d5780631251cd4514610b095780631e41be5a14610a0357806327a74150146109ab5780634b3bb0a2146109925780634d6688e1146105335780635728e161146105075780635d3f535614610388578063611fbb60146102ae57806395bf75fd14610285578063bb30ef1614610259578063bed29b631461022d578063caea68b014610131578063d7b7961c146100fd5763f7213db6146100cc57600080fd5b346100f85760203660031901126100f85760043560005260036020526020604060002054604051908152f35b600080fd5b346100f85760403660031901126100f857602061012961011b61129e565b6101236112b4565b906119b9565b604051908152f35b346100f8576101403660031901126100f8576004356001600160401b0381116100f857610162903690600401611257565b6101203660231901126100f85760405161017b816111ff565b6001600160a01b0360243581811681036100f857825260443581811681036100f857602083015260643590811681036100f8576040820152608435606082015260a43580151581036100f857608082015263ffffffff60c43581811681036100f85760a083015260e4356001600160b01b03811681036100f85760c08301526101043590811681036100f85760e0820152610124359060ff821682036100f8576020926101299261010083015261202a565b346100f85760203660031901126100f85760043560005260046020526020604060002054604051908152f35b346100f85760203660031901126100f85760043560005260026020526020604060002054604051908152f35b346100f85760003660031901126100f8576000546040516001600160a01b039091168152602090f35b346100f8576101203660031901126100f8576004356001600160401b0381116100f8576102df903690600401611257565b60e03660231901126100f857604051906102f8826111ce565b6001600160a01b0360243581811681036100f857835260443581811681036100f857602084015260643590811681036100f8576040830152608435606083015260a43580151581036100f857608083015260c43563ffffffff811681036100f85760a083015260e435906001600160d81b03821682036100f857826101299260c0602095015261010435916114c4565b346100f85760403660031901126100f8576103a161129e565b6103a96112b4565b600054604051638da5cb5b60e01b8152602093926001600160a01b039290919085908290600490829087165afa80156104a95783916000916104ea575b501633036104b5578382806004931694169384600052600682526040600020816bffffffffffffffffffffffff60a01b82541617905560405192838092636f307dc360e01b82525afa9081156104a95760009161047c575b50160361044757005b6064906040519062461bcd60e51b82526004820152600e60248201526d24b73b30b634b21031aa37b5b2b760911b6044820152fd5b61049c9150843d86116104a2575b610494818361121b565b81019061199a565b8461043e565b503d61048a565b6040513d6000823e3d90fd5b60405162461bcd60e51b815260048101859052600d60248201526c139bdd105d5d1a1bdc9a5e9959609a1b6044820152606490fd5b6105019150863d88116104a257610494818361121b565b866103e6565b346100f85760203660031901126100f85760043560005260056020526020604060002054604051908152f35b346100f857610541366112de565b6020808301516001600160a01b03908116600090815260069092526040808320548186015183168452922054939492939181169291169061059990859061058985151561194e565b61059484151561194e565b61202a565b918260005260056020526040600020545b600160ff610100880151160160ff81116108735760ff16811015610985576105e281606088015163ffffffff60e08a015116906122ab565b948460005260046020526105fb604060002054876118f5565b808210156109805750805b875160808901513393916001600160a01b03169015610978575b60208a8101516040516323b872dd60e01b81526001600160a01b0387811660048301528481166024830152604482018790529093929184916064918391600091165af180156104a9576106eb956020938d9261095b575b50604082015160c0909201516001600160a01b0390921691600090670de0b6b3a7640000906106af906001600160b01b031689611902565b6040516323b872dd60e01b81526001600160a01b0396871660048201529390951660248401529093046044820152958692839182906064820190565b03925af19283156104a9576107209361092c575b5086600052600460205260406000206107198382546118e8565b90556118f5565b94846000526004602052604060002054148061091a575b610760575b84156107505761074b90611915565b6105aa565b5050505060209150604051908152f35b620f424061077e60406000205463ffffffff60e08a01511690611902565b0483670de0b6b3a764000061079f60018060b01b0360c08b01511684611902565b0484918360808b01516108df575b5089516040516361d8983f60e01b81526001600160a01b0390911660048201526024810192909252602090829081600081604481015b03926001600160a01b03165af180156104a9576108b4575b508751604051635267b05560e11b81526001600160a01b039182166004820152602481019390935260209183916044918391600091165af180156104a957610889575b50836000526005602052604060002080546001810181116108735760010190558360005260046020526000604081205561073c565b634e487b7160e01b600052601160045260246000fd5b602090813d83116108ad575b61089f818361121b565b810103126100f8578661083e565b503d610895565b602090813d83116108d8575b6108ca818361121b565b810103126100f857886107fb565b503d6108c0565b60c08b01518795508894506107e3935060209250670de0b6b3a764000090610910906001600160b01b031683611902565b04949150916107ad565b5060ff61010087015116811415610737565b61094d9060203d602011610954575b610945818361121b565b8101906114ac565b50896106ff565b503d61093b565b61097190853d871161095457610945818361121b565b508d610677565b925033610620565b610606565b5050505060209150610129565b346100f85760206101296109a5366113e7565b90611b7d565b346100f8577f5152abf959f6564662358c2e52b702259b78bac5ee7842a0f01937e670efcc7d60206109e960606109e1366113e7565b809391611b7d565b9101518160005260038352604060002055604051908152a1005b346100f85760203660031901126100f857600060c0604051610a24816111ce565b8281528260208201528260408201528260608201528260808201528260a08201520152600435600052600160205260e06040600020604051610a65816111ce565b60018060a01b03908183541692838252826001820154169060208301918252836002820154169060408401918252600460038201549160608601928352015494608085019260ff8716151584528160a087019560c063ffffffff98898b60081c168952019860281c8952604051998a5251166020890152511660408701525160608601525115156080850152511660a083015260018060d81b0390511660c0820152f35b346100f85760603660031901126100f85760206101296044356024356004356122ab565b346100f8576060806003193601126100f8576001600160401b03906004358281116100f857366023820112156100f857806004013590610b6c826113d0565b92610b7a604051948561121b565b8284526020918285016024809560051b830101913683116100f857858101915b838310610d51575050505082359485116100f857366023860112156100f857846004013594610bc8866113d0565b95610bd6604051978861121b565b8087528460e08589019202830101913683116100f8578501905b828210610cb05750505050604435918351855103610c595750506000905b8351821015610c575780610c3b610c4192610c298587611924565b51610c348689611924565b51906114c4565b906118f5565b908115610c5757610c5190611915565b90610c0e565b005b90602b6084926040519262461bcd60e51b845260048401528201527f7369676e61747572657320616e64206f7264657273206d75737420686176652060448201526a0e6c2daca40d8cadccee8d60ab1b6064820152fd5b60e0823603126100f85760405190610cc7826111ce565b610cd0836112ca565b8252610cdd8684016112ca565b86830152610ced604084016112ca565b604083015284830135858301526080808401359081151582036100f85783015260a0808401359063ffffffff821682036100f85783015260c083810135929091906001600160d81b03841684036100f85760e0938893820152815201910190610bf0565b82358981116100f8578691610d6c83928a3691870101611257565b815201920191610b9a565b346100f857610d85366112de565b6020828101516001600160a01b0390811660009081526006909252604080832054818601518316845292205481169491169290610dc390829061202a565b908160005260056020526040600020545b60ff610100830151168110156111c057606082015163ffffffff60e0840151169060018301831161087357610e0d9160018401916122ab565b93836000526004602052604060002054948515611037575b610e2f86826118f5565b808310156110315750815b602085015160408601518651608088015160c08901516000946001600160b01b0391909116936001600160a01b039384169390811692339290911690849015611024575b506040516323b872dd60e01b81526001600160a01b03808416600483015285166024820152604481018a9052956020918791829081606481015b03925af19384156104a957670de0b6b3a7640000610ee5600092610f2198602098611007575b508b611902565b6040516323b872dd60e01b81526001600160a01b0396871660048201529390951660248401529093046044820152938492839182906064820190565b03925af180156104a957610f5c92610f54928692610fe8575b5088600052600460205260406000206107198382546118e8565b9283976118e8565b14610fb4575b60208301516040840151610f82916001600160a01b0391821691166119b9565b600052600260205260406000205411610fa357610f9e90611915565b610dd4565b505050905060209150604051908152f35b8360005260056020526040600020805460018101811161087357600101905583600052600460205260006040812055610f62565b6110009060203d60201161095457610945818361121b565b508c610f3a565b61101d90893d8b1161095457610945818361121b565b5038610ede565b3394509150610eb8610e7e565b91610e3a565b60c0840180516001600160b01b03918a9184918b91670de0b6b3a764000090819061106490881686611902565b049560808b01511561119e575b505050620f42409082828102048214831517156108735763ffffffff60e08a0151169081156111885789516040516361d8983f60e01b81526001600160a01b03919091166004820152939092020460248301526020908290816000816044810103926001600160a01b03165af180156104a95761115d575b508551604051635267b05560e11b81526001600160a01b039182166004820152602481019390935260209183916044918391600091165af180156104a957611132575b50610e25565b602090813d8311611156575b611148818361121b565b810103126100f8578861112c565b503d61113e565b602090813d8311611181575b611173818361121b565b810103126100f8578a6110e9565b503d611169565b634e487b7160e01b600052601260045260246000fd5b9250935093506111b391508b93511684611902565b04889083928c8080611071565b505050905060209150610129565b60e081019081106001600160401b038211176111e957604052565b634e487b7160e01b600052604160045260246000fd5b61012081019081106001600160401b038211176111e957604052565b90601f801991011681019081106001600160401b038211176111e957604052565b6001600160401b0381116111e957601f01601f191660200190565b81601f820112156100f85780359061126e8261123c565b9261127c604051948561121b565b828452602083830101116100f857816000926020809301838601378301015290565b600435906001600160a01b03821682036100f857565b602435906001600160a01b03821682036100f857565b35906001600160a01b03821682036100f857565b906101606003198301126100f8576004356001600160401b0381116100f85761130d8361012092600401611257565b9260231901126100f857604051611323816111ff565b6001600160a01b0360243581811681036100f857825260443581811681036100f857602083015260643590811681036100f8576040820152608435606082015260a43580151581036100f857608082015263ffffffff60c43581811681036100f85760a083015260e4356001600160b01b03811681036100f85760c08301526101043590811681036100f85760e08201526101243560ff811681036100f857610100820152906101443590565b6001600160401b0381116111e95760051b60200190565b906101006003198301126100f8576004356001600160401b0381116100f8576114158360e092600401611257565b9260231901126100f85760405161142b816111ce565b6001600160a01b0360243581811681036100f857825260443581811681036100f857602083015260643590811681036100f8576040820152608435606082015260a43580151581036100f857608082015260c43563ffffffff811681036100f85760a082015260e4356001600160d81b03811681036100f85760c082015290565b908160209103126100f8575180151581036100f85790565b919081156118995760608101908151156118485760c08101805190936001600160d81b039390918416156117f757602083810180516001600160a01b039792959291908816156117bd5760409687840199898b51161561178457898351168a8c5116146117345789855116156116fc578461153e91611b7d565b986000968a8852600389526115588a8920548098516118f5565b808210156116f457509a5b8b156116e557908b959493929161157a87896118e8565b8c8a5260038b528b8a20558186511693608033970151156116db575b518b516323b872dd60e01b8082526001600160a01b038981166004840152871660248301526044820199909952908b90829060649082908e9088165af180156116d1578b979695948f9194670de0b6b3a764000094611602948e976116b4575b50511696511690611902565b8b519788526001600160a01b0393841660048901529490921660248701529204604485015283916064918391905af180156116aa57928561167289606098957fe96da7d7f9b1253f3f855c25f35f32d0a83a96c1a75acdecf0f3bc7cc3bb1ccf9a9895829861168d575b506118e8565b9186815260038452205581519384523390840152820152a190565b6116a390873d891161095457610945818361121b565b503861166c565b85513d85823e3d90fd5b6116ca908c8d3d1061095457610945818361121b565b50386115f6565b8c513d8c823e3d90fd5b9395503393611596565b50505050505050935050505090565b90509a611563565b885162461bcd60e51b81526004810189905260116024820152701b585ad95c881b5d5cdd081899481cd95d607a1b6044820152606490fd5b885162461bcd60e51b815260048101899052602360248201527f746f6b656e3020616e6420746f6b656e31206d75737420626520646966666572604482015262195b9d60ea1b6064820152608490fd5b885162461bcd60e51b81526004810189905260126024820152711d1bdad95b8c481b5d5cdd081899481cd95d60721b6044820152606490fd5b60405162461bcd60e51b81526004810187905260126024820152711d1bdad95b8c081b5d5cdd081899481cd95d60721b6044820152606490fd5b60405162461bcd60e51b8152602060048201526024808201527f65786368616e67652072617465206d75737420626520677265617465722074686044820152630616e20360e41b6064820152608490fd5b60405162461bcd60e51b815260206004820152602360248201527f6f7264657220616d6f756e74206d75737420626520677265617465722074686160448201526206e20360ec1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602160248201527f66696c6c416d6f756e74206d7573742062652067726561746572207468616e206044820152600360fc1b6064820152608490fd5b9190820180921161087357565b9190820391821161087357565b8181029291811591840414171561087357565b60001981146108735760010190565b80518210156119385760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b1561195557565b60405162461bcd60e51b815260206004820152601a60248201527f4d617267696e2074726164696e67206e6f7420656e61626c65640000000000006044820152606490fd5b908160209103126100f857516001600160a01b03811681036100f85790565b6040519060208201926bffffffffffffffffffffffff19809260601b16845260601b16603482015260288152606081018181106001600160401b038211176111e95760405251902090565b15611a0b57565b60405162461bcd60e51b815260206004820152602260248201527f6f72646572416d6f756e74206d7573742062652067726561746572207468616e604482015261020360f41b6064820152608490fd5b15611a6257565b60405162461bcd60e51b815260206004820152602360248201527f65786368616e676552617465206d75737420626520677265617465722074686160448201526206e20360ec1b6064820152608490fd5b15611aba57565b60405162461bcd60e51b8152602060048201526016602482015275496e76616c696420746f6b656e30206164647265737360501b6044820152606490fd5b15611aff57565b60405162461bcd60e51b8152602060048201526016602482015275496e76616c696420746f6b656e31206164647265737360501b6044820152606490fd5b15611b4457565b60405162461bcd60e51b8152602060048201526011602482015270696e76616c6964207369676e617475726560781b6044820152606490fd5b906060810190611b8f82511515611a04565b60c081019260018060d81b0391611baa838651161515611a5b565b602081019360018060a01b0395611bc5878751161515611ab3565b6040830194611bd8888751161515611af8565b8780808651169851169651169251608085015115159163ffffffff60a087015116935116936040519760208901997f72947dbb8d2ba67a74e333a748b7a9619ef219198f5cec602fd6d3211397dfbf8b5260408a01526060890152608088015260a087015260c086015260e08501526101009081850152835261012083018381106001600160401b038211176111e957611c8e94611c8994611c7f92604052519020611eb9565b9485915116611c91565b611b3d565b90565b611c9b8383611dcc565b6005811015611db657159081611da0575b50611d98576040519260209384810191630b135d3f60e11b948584526024830152604060448301528051908160648401528660005b838110611d83575050509181611d1760848286600083819a9899829a010152601f8019910116810103606481018452018261121b565b51915afa913d15611d7c573d611d2c8161123c565b90611d3a604051928361121b565b81523d60008383013e5b83611d71575b83611d56575b50505090565b9080929350818051810103126100f857015114388080611d50565b805182149350611d4a565b6060611d44565b81818401015160848287010152018790611ce1565b505050600190565b6001600160a01b03838116911614905038611cac565b634e487b7160e01b600052602160045260246000fd5b906041815114600014611dfa57611df6916020820151906060604084015193015160001a90611e04565b9091565b5050600090600290565b9291907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311611ead5760ff16601b81141580611ea2575b611e96579160809493916020936040519384528484015260408301526060820152600093849182805260015afa15611e895781516001600160a01b03811615611e83579190565b50600190565b50604051903d90823e3d90fd5b50505050600090600490565b50601c811415611e3c565b50505050600090600390565b611ec1611f00565b9060405190602082019261190160f01b84526022830152604282015260428152608081018181106001600160401b038211176111e95760405251902090565b307f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161480612001575b15611f5b577f000000000000000000000000000000000000000000000000000000000000000090565b60405160208101907f000000000000000000000000000000000000000000000000000000000000000082527f000000000000000000000000000000000000000000000000000000000000000060408201527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260a0815260c081018181106001600160401b038211176111e95760405251902090565b507f00000000000000000000000000000000000000000000000000000000000000004614611f32565b606082019161203b83511515611a04565b60c0810180516001600160b01b03906120579082161515611a5b565b60e083019163ffffffff91828451161561225b57620f424083855116101561220c576101009687860160ff815116156121c7576020870180516001600160a01b039a91978b969092916120ad9088161515611ab3565b8960409687820199898b511615156120c490611af8565b898c51169960009a8b526006602052808a8c20541615156120e49061194e565b808c51168b526006602052808a8c20541615156121009061194e565b80808551169d51169b511697519181608085015115159460a0015116945116955116955160ff169688519a60208c019c7f4b5ce9bff05b2eb1b04a66685b9bbe715805ee88470a2d38bc2068b29b9566618e528a8d015260608c015260808b015260a08a015260c089015260e0880152860152610120850152610140908185015283526101608301918383106001600160401b038411176121b3575052519020611c8e92611c89929091611c7f90611eb9565b634e487b7160e01b81526041600452602490fd5b60405162461bcd60e51b815260206004820152601f60248201527f6c65766572616765206d7573742062652067726561746572207468616e2030006044820152606490fd5b60405162461bcd60e51b815260206004820152602160248201527f626f72726f774c696d6974206d757374206265206c657373207468616e2031656044820152601b60f91b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f626f72726f774c696d6974206d7573742062652067726561746572207468616e604482015261020360f41b6064820152608490fd5b916000915b8183106122bd5750505090565b909192620f42406122d1836122d893611902565b0493611915565b91906122b056fea2646970667358221220109b16b2501f5e20521c2d0cc72dbefab310bdb0d7d5d49ad18da58b4ef4af5c64736f6c63430008110033", - "deployedBytecode": "0x6080604052600436101561001257600080fd5b60003560e01c80630b5d301714610d775780630f20019114610b2d5780631251cd4514610b095780631e41be5a14610a0357806327a74150146109ab5780634b3bb0a2146109925780634d6688e1146105335780635728e161146105075780635d3f535614610388578063611fbb60146102ae57806395bf75fd14610285578063bb30ef1614610259578063bed29b631461022d578063caea68b014610131578063d7b7961c146100fd5763f7213db6146100cc57600080fd5b346100f85760203660031901126100f85760043560005260036020526020604060002054604051908152f35b600080fd5b346100f85760403660031901126100f857602061012961011b61129e565b6101236112b4565b906119b9565b604051908152f35b346100f8576101403660031901126100f8576004356001600160401b0381116100f857610162903690600401611257565b6101203660231901126100f85760405161017b816111ff565b6001600160a01b0360243581811681036100f857825260443581811681036100f857602083015260643590811681036100f8576040820152608435606082015260a43580151581036100f857608082015263ffffffff60c43581811681036100f85760a083015260e4356001600160b01b03811681036100f85760c08301526101043590811681036100f85760e0820152610124359060ff821682036100f8576020926101299261010083015261202a565b346100f85760203660031901126100f85760043560005260046020526020604060002054604051908152f35b346100f85760203660031901126100f85760043560005260026020526020604060002054604051908152f35b346100f85760003660031901126100f8576000546040516001600160a01b039091168152602090f35b346100f8576101203660031901126100f8576004356001600160401b0381116100f8576102df903690600401611257565b60e03660231901126100f857604051906102f8826111ce565b6001600160a01b0360243581811681036100f857835260443581811681036100f857602084015260643590811681036100f8576040830152608435606083015260a43580151581036100f857608083015260c43563ffffffff811681036100f85760a083015260e435906001600160d81b03821682036100f857826101299260c0602095015261010435916114c4565b346100f85760403660031901126100f8576103a161129e565b6103a96112b4565b600054604051638da5cb5b60e01b8152602093926001600160a01b039290919085908290600490829087165afa80156104a95783916000916104ea575b501633036104b5578382806004931694169384600052600682526040600020816bffffffffffffffffffffffff60a01b82541617905560405192838092636f307dc360e01b82525afa9081156104a95760009161047c575b50160361044757005b6064906040519062461bcd60e51b82526004820152600e60248201526d24b73b30b634b21031aa37b5b2b760911b6044820152fd5b61049c9150843d86116104a2575b610494818361121b565b81019061199a565b8461043e565b503d61048a565b6040513d6000823e3d90fd5b60405162461bcd60e51b815260048101859052600d60248201526c139bdd105d5d1a1bdc9a5e9959609a1b6044820152606490fd5b6105019150863d88116104a257610494818361121b565b866103e6565b346100f85760203660031901126100f85760043560005260056020526020604060002054604051908152f35b346100f857610541366112de565b6020808301516001600160a01b03908116600090815260069092526040808320548186015183168452922054939492939181169291169061059990859061058985151561194e565b61059484151561194e565b61202a565b918260005260056020526040600020545b600160ff610100880151160160ff81116108735760ff16811015610985576105e281606088015163ffffffff60e08a015116906122ab565b948460005260046020526105fb604060002054876118f5565b808210156109805750805b875160808901513393916001600160a01b03169015610978575b60208a8101516040516323b872dd60e01b81526001600160a01b0387811660048301528481166024830152604482018790529093929184916064918391600091165af180156104a9576106eb956020938d9261095b575b50604082015160c0909201516001600160a01b0390921691600090670de0b6b3a7640000906106af906001600160b01b031689611902565b6040516323b872dd60e01b81526001600160a01b0396871660048201529390951660248401529093046044820152958692839182906064820190565b03925af19283156104a9576107209361092c575b5086600052600460205260406000206107198382546118e8565b90556118f5565b94846000526004602052604060002054148061091a575b610760575b84156107505761074b90611915565b6105aa565b5050505060209150604051908152f35b620f424061077e60406000205463ffffffff60e08a01511690611902565b0483670de0b6b3a764000061079f60018060b01b0360c08b01511684611902565b0484918360808b01516108df575b5089516040516361d8983f60e01b81526001600160a01b0390911660048201526024810192909252602090829081600081604481015b03926001600160a01b03165af180156104a9576108b4575b508751604051635267b05560e11b81526001600160a01b039182166004820152602481019390935260209183916044918391600091165af180156104a957610889575b50836000526005602052604060002080546001810181116108735760010190558360005260046020526000604081205561073c565b634e487b7160e01b600052601160045260246000fd5b602090813d83116108ad575b61089f818361121b565b810103126100f8578661083e565b503d610895565b602090813d83116108d8575b6108ca818361121b565b810103126100f857886107fb565b503d6108c0565b60c08b01518795508894506107e3935060209250670de0b6b3a764000090610910906001600160b01b031683611902565b04949150916107ad565b5060ff61010087015116811415610737565b61094d9060203d602011610954575b610945818361121b565b8101906114ac565b50896106ff565b503d61093b565b61097190853d871161095457610945818361121b565b508d610677565b925033610620565b610606565b5050505060209150610129565b346100f85760206101296109a5366113e7565b90611b7d565b346100f8577f5152abf959f6564662358c2e52b702259b78bac5ee7842a0f01937e670efcc7d60206109e960606109e1366113e7565b809391611b7d565b9101518160005260038352604060002055604051908152a1005b346100f85760203660031901126100f857600060c0604051610a24816111ce565b8281528260208201528260408201528260608201528260808201528260a08201520152600435600052600160205260e06040600020604051610a65816111ce565b60018060a01b03908183541692838252826001820154169060208301918252836002820154169060408401918252600460038201549160608601928352015494608085019260ff8716151584528160a087019560c063ffffffff98898b60081c168952019860281c8952604051998a5251166020890152511660408701525160608601525115156080850152511660a083015260018060d81b0390511660c0820152f35b346100f85760603660031901126100f85760206101296044356024356004356122ab565b346100f8576060806003193601126100f8576001600160401b03906004358281116100f857366023820112156100f857806004013590610b6c826113d0565b92610b7a604051948561121b565b8284526020918285016024809560051b830101913683116100f857858101915b838310610d51575050505082359485116100f857366023860112156100f857846004013594610bc8866113d0565b95610bd6604051978861121b565b8087528460e08589019202830101913683116100f8578501905b828210610cb05750505050604435918351855103610c595750506000905b8351821015610c575780610c3b610c4192610c298587611924565b51610c348689611924565b51906114c4565b906118f5565b908115610c5757610c5190611915565b90610c0e565b005b90602b6084926040519262461bcd60e51b845260048401528201527f7369676e61747572657320616e64206f7264657273206d75737420686176652060448201526a0e6c2daca40d8cadccee8d60ab1b6064820152fd5b60e0823603126100f85760405190610cc7826111ce565b610cd0836112ca565b8252610cdd8684016112ca565b86830152610ced604084016112ca565b604083015284830135858301526080808401359081151582036100f85783015260a0808401359063ffffffff821682036100f85783015260c083810135929091906001600160d81b03841684036100f85760e0938893820152815201910190610bf0565b82358981116100f8578691610d6c83928a3691870101611257565b815201920191610b9a565b346100f857610d85366112de565b6020828101516001600160a01b0390811660009081526006909252604080832054818601518316845292205481169491169290610dc390829061202a565b908160005260056020526040600020545b60ff610100830151168110156111c057606082015163ffffffff60e0840151169060018301831161087357610e0d9160018401916122ab565b93836000526004602052604060002054948515611037575b610e2f86826118f5565b808310156110315750815b602085015160408601518651608088015160c08901516000946001600160b01b0391909116936001600160a01b039384169390811692339290911690849015611024575b506040516323b872dd60e01b81526001600160a01b03808416600483015285166024820152604481018a9052956020918791829081606481015b03925af19384156104a957670de0b6b3a7640000610ee5600092610f2198602098611007575b508b611902565b6040516323b872dd60e01b81526001600160a01b0396871660048201529390951660248401529093046044820152938492839182906064820190565b03925af180156104a957610f5c92610f54928692610fe8575b5088600052600460205260406000206107198382546118e8565b9283976118e8565b14610fb4575b60208301516040840151610f82916001600160a01b0391821691166119b9565b600052600260205260406000205411610fa357610f9e90611915565b610dd4565b505050905060209150604051908152f35b8360005260056020526040600020805460018101811161087357600101905583600052600460205260006040812055610f62565b6110009060203d60201161095457610945818361121b565b508c610f3a565b61101d90893d8b1161095457610945818361121b565b5038610ede565b3394509150610eb8610e7e565b91610e3a565b60c0840180516001600160b01b03918a9184918b91670de0b6b3a764000090819061106490881686611902565b049560808b01511561119e575b505050620f42409082828102048214831517156108735763ffffffff60e08a0151169081156111885789516040516361d8983f60e01b81526001600160a01b03919091166004820152939092020460248301526020908290816000816044810103926001600160a01b03165af180156104a95761115d575b508551604051635267b05560e11b81526001600160a01b039182166004820152602481019390935260209183916044918391600091165af180156104a957611132575b50610e25565b602090813d8311611156575b611148818361121b565b810103126100f8578861112c565b503d61113e565b602090813d8311611181575b611173818361121b565b810103126100f8578a6110e9565b503d611169565b634e487b7160e01b600052601260045260246000fd5b9250935093506111b391508b93511684611902565b04889083928c8080611071565b505050905060209150610129565b60e081019081106001600160401b038211176111e957604052565b634e487b7160e01b600052604160045260246000fd5b61012081019081106001600160401b038211176111e957604052565b90601f801991011681019081106001600160401b038211176111e957604052565b6001600160401b0381116111e957601f01601f191660200190565b81601f820112156100f85780359061126e8261123c565b9261127c604051948561121b565b828452602083830101116100f857816000926020809301838601378301015290565b600435906001600160a01b03821682036100f857565b602435906001600160a01b03821682036100f857565b35906001600160a01b03821682036100f857565b906101606003198301126100f8576004356001600160401b0381116100f85761130d8361012092600401611257565b9260231901126100f857604051611323816111ff565b6001600160a01b0360243581811681036100f857825260443581811681036100f857602083015260643590811681036100f8576040820152608435606082015260a43580151581036100f857608082015263ffffffff60c43581811681036100f85760a083015260e4356001600160b01b03811681036100f85760c08301526101043590811681036100f85760e08201526101243560ff811681036100f857610100820152906101443590565b6001600160401b0381116111e95760051b60200190565b906101006003198301126100f8576004356001600160401b0381116100f8576114158360e092600401611257565b9260231901126100f85760405161142b816111ce565b6001600160a01b0360243581811681036100f857825260443581811681036100f857602083015260643590811681036100f8576040820152608435606082015260a43580151581036100f857608082015260c43563ffffffff811681036100f85760a082015260e4356001600160d81b03811681036100f85760c082015290565b908160209103126100f8575180151581036100f85790565b919081156118995760608101908151156118485760c08101805190936001600160d81b039390918416156117f757602083810180516001600160a01b039792959291908816156117bd5760409687840199898b51161561178457898351168a8c5116146117345789855116156116fc578461153e91611b7d565b986000968a8852600389526115588a8920548098516118f5565b808210156116f457509a5b8b156116e557908b959493929161157a87896118e8565b8c8a5260038b528b8a20558186511693608033970151156116db575b518b516323b872dd60e01b8082526001600160a01b038981166004840152871660248301526044820199909952908b90829060649082908e9088165af180156116d1578b979695948f9194670de0b6b3a764000094611602948e976116b4575b50511696511690611902565b8b519788526001600160a01b0393841660048901529490921660248701529204604485015283916064918391905af180156116aa57928561167289606098957fe96da7d7f9b1253f3f855c25f35f32d0a83a96c1a75acdecf0f3bc7cc3bb1ccf9a9895829861168d575b506118e8565b9186815260038452205581519384523390840152820152a190565b6116a390873d891161095457610945818361121b565b503861166c565b85513d85823e3d90fd5b6116ca908c8d3d1061095457610945818361121b565b50386115f6565b8c513d8c823e3d90fd5b9395503393611596565b50505050505050935050505090565b90509a611563565b885162461bcd60e51b81526004810189905260116024820152701b585ad95c881b5d5cdd081899481cd95d607a1b6044820152606490fd5b885162461bcd60e51b815260048101899052602360248201527f746f6b656e3020616e6420746f6b656e31206d75737420626520646966666572604482015262195b9d60ea1b6064820152608490fd5b885162461bcd60e51b81526004810189905260126024820152711d1bdad95b8c481b5d5cdd081899481cd95d60721b6044820152606490fd5b60405162461bcd60e51b81526004810187905260126024820152711d1bdad95b8c081b5d5cdd081899481cd95d60721b6044820152606490fd5b60405162461bcd60e51b8152602060048201526024808201527f65786368616e67652072617465206d75737420626520677265617465722074686044820152630616e20360e41b6064820152608490fd5b60405162461bcd60e51b815260206004820152602360248201527f6f7264657220616d6f756e74206d75737420626520677265617465722074686160448201526206e20360ec1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602160248201527f66696c6c416d6f756e74206d7573742062652067726561746572207468616e206044820152600360fc1b6064820152608490fd5b9190820180921161087357565b9190820391821161087357565b8181029291811591840414171561087357565b60001981146108735760010190565b80518210156119385760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b1561195557565b60405162461bcd60e51b815260206004820152601a60248201527f4d617267696e2074726164696e67206e6f7420656e61626c65640000000000006044820152606490fd5b908160209103126100f857516001600160a01b03811681036100f85790565b6040519060208201926bffffffffffffffffffffffff19809260601b16845260601b16603482015260288152606081018181106001600160401b038211176111e95760405251902090565b15611a0b57565b60405162461bcd60e51b815260206004820152602260248201527f6f72646572416d6f756e74206d7573742062652067726561746572207468616e604482015261020360f41b6064820152608490fd5b15611a6257565b60405162461bcd60e51b815260206004820152602360248201527f65786368616e676552617465206d75737420626520677265617465722074686160448201526206e20360ec1b6064820152608490fd5b15611aba57565b60405162461bcd60e51b8152602060048201526016602482015275496e76616c696420746f6b656e30206164647265737360501b6044820152606490fd5b15611aff57565b60405162461bcd60e51b8152602060048201526016602482015275496e76616c696420746f6b656e31206164647265737360501b6044820152606490fd5b15611b4457565b60405162461bcd60e51b8152602060048201526011602482015270696e76616c6964207369676e617475726560781b6044820152606490fd5b906060810190611b8f82511515611a04565b60c081019260018060d81b0391611baa838651161515611a5b565b602081019360018060a01b0395611bc5878751161515611ab3565b6040830194611bd8888751161515611af8565b8780808651169851169651169251608085015115159163ffffffff60a087015116935116936040519760208901997f72947dbb8d2ba67a74e333a748b7a9619ef219198f5cec602fd6d3211397dfbf8b5260408a01526060890152608088015260a087015260c086015260e08501526101009081850152835261012083018381106001600160401b038211176111e957611c8e94611c8994611c7f92604052519020611eb9565b9485915116611c91565b611b3d565b90565b611c9b8383611dcc565b6005811015611db657159081611da0575b50611d98576040519260209384810191630b135d3f60e11b948584526024830152604060448301528051908160648401528660005b838110611d83575050509181611d1760848286600083819a9899829a010152601f8019910116810103606481018452018261121b565b51915afa913d15611d7c573d611d2c8161123c565b90611d3a604051928361121b565b81523d60008383013e5b83611d71575b83611d56575b50505090565b9080929350818051810103126100f857015114388080611d50565b805182149350611d4a565b6060611d44565b81818401015160848287010152018790611ce1565b505050600190565b6001600160a01b03838116911614905038611cac565b634e487b7160e01b600052602160045260246000fd5b906041815114600014611dfa57611df6916020820151906060604084015193015160001a90611e04565b9091565b5050600090600290565b9291907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311611ead5760ff16601b81141580611ea2575b611e96579160809493916020936040519384528484015260408301526060820152600093849182805260015afa15611e895781516001600160a01b03811615611e83579190565b50600190565b50604051903d90823e3d90fd5b50505050600090600490565b50601c811415611e3c565b50505050600090600390565b611ec1611f00565b9060405190602082019261190160f01b84526022830152604282015260428152608081018181106001600160401b038211176111e95760405251902090565b307f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161480612001575b15611f5b577f000000000000000000000000000000000000000000000000000000000000000090565b60405160208101907f000000000000000000000000000000000000000000000000000000000000000082527f000000000000000000000000000000000000000000000000000000000000000060408201527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260a0815260c081018181106001600160401b038211176111e95760405251902090565b507f00000000000000000000000000000000000000000000000000000000000000004614611f32565b606082019161203b83511515611a04565b60c0810180516001600160b01b03906120579082161515611a5b565b60e083019163ffffffff91828451161561225b57620f424083855116101561220c576101009687860160ff815116156121c7576020870180516001600160a01b039a91978b969092916120ad9088161515611ab3565b8960409687820199898b511615156120c490611af8565b898c51169960009a8b526006602052808a8c20541615156120e49061194e565b808c51168b526006602052808a8c20541615156121009061194e565b80808551169d51169b511697519181608085015115159460a0015116945116955116955160ff169688519a60208c019c7f4b5ce9bff05b2eb1b04a66685b9bbe715805ee88470a2d38bc2068b29b9566618e528a8d015260608c015260808b015260a08a015260c089015260e0880152860152610120850152610140908185015283526101608301918383106001600160401b038411176121b3575052519020611c8e92611c89929091611c7f90611eb9565b634e487b7160e01b81526041600452602490fd5b60405162461bcd60e51b815260206004820152601f60248201527f6c65766572616765206d7573742062652067726561746572207468616e2030006044820152606490fd5b60405162461bcd60e51b815260206004820152602160248201527f626f72726f774c696d6974206d757374206265206c657373207468616e2031656044820152601b60f91b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f626f72726f774c696d6974206d7573742062652067726561746572207468616e604482015261020360f41b6064820152608490fd5b916000915b8183106122bd5750505090565b909192620f42406122d1836122d893611902565b0493611915565b91906122b056fea2646970667358221220109b16b2501f5e20521c2d0cc72dbefab310bdb0d7d5d49ad18da58b4ef4af5c64736f6c63430008110033", + "bytecode": "0x610140346200018d57601f620026ff38819003918201601f19168301926001600160401b0392909183851183861017620001775781602092849260409788528339810103126200018d57516001600160a01b038116908190036200018d578251906200006b8262000192565b60048252600160208301637a65786560e01b8152602086516200008e8162000192565b8381520193603160f81b855251902092208260e052610100948186524660a05280519060208201927f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f958685528284015260608301524660808301523060a083015260a0825260c08201958287109087111762000177578590525190206080523060c052610120918252670de0b6b3a76400008060075560085560018060a01b031960005416176000556125509283620001af843960805183612174015260a0518361223f015260c0518361213e015260e051836121c3015251826121e9015251816121a00152f35b634e487b7160e01b600052604160045260246000fd5b600080fd5b604081019081106001600160401b03821117620001775760405256fe6080604052600436101561001257600080fd5b60003560e01c80630b5d301714610ead5780630f20019114610d565780631251cd4514610d325780631e41be5a14610c2c57806327a7415014610bd457806343f0179b14610bb65780634b3bb0a214610b9d5780634d6688e1146107435780635728e161146107175780635d3f535614610598578063611fbb60146104be5780638ef9f003146102ed57806395bf75fd146102c4578063bb30ef1614610298578063bed29b631461026c578063caea68b014610170578063d7b7961c1461013c578063f7213db6146101105763fc741c7c146100ed57600080fd5b3461010b57600036600319011261010b576020600754604051908152f35b600080fd5b3461010b57602036600319011261010b5760043560005260036020526020604060002054604051908152f35b3461010b57604036600319011261010b57602061016861015a6113bf565b6101626113d5565b90611bf4565b604051908152f35b3461010b5761014036600319011261010b576004356001600160401b03811161010b576101a1903690600401611378565b61012036602319011261010b576040516101ba81611320565b6001600160a01b03602435818116810361010b578252604435818116810361010b576020830152606435908116810361010b576040820152608435606082015260a435801515810361010b57608082015263ffffffff60c435818116810361010b5760a083015260e4356001600160b01b038116810361010b5760c083015261010435908116810361010b5760e0820152610124359060ff8216820361010b5760209261016892610100830152612265565b3461010b57602036600319011261010b5760043560005260046020526020604060002054604051908152f35b3461010b57602036600319011261010b5760043560005260026020526020604060002054604051908152f35b3461010b57600036600319011261010b576000546040516001600160a01b039091168152602090f35b3461010b57606036600319011261010b576001600160401b0360043581811161010b573660238201121561010b578060040135610329816114f1565b92610337604051948561133c565b8184526020928385016024809460051b8301019136831161010b57848101915b8383106104985750505050813590811161010b573660238201121561010b57806004013592610385846114f1565b93610393604051958661133c565b8085528360e083870192028401019236841161010b578401905b83821061047f5750505050604435926103c98151845114611af0565b60005b835181101561046857670de0b6b3a76400008086029580870482149015171561046a5761045360018060d81b0361043e61041860c099838b61040e898d611b5f565b5101511690611ad0565b61043881610426888a611b5f565b51610431898d611b5f565b519061167f565b90611ab0565b976104498589611b5f565b5101511687611abd565b0494156104685761046390611b50565b6103cc565b005b83634e487b7160e01b60005260116004526000fd5b8260e09161048d3685611508565b8152019101906103ad565b823585811161010b5787916104b38392893691870101611378565b815201920191610357565b3461010b5761012036600319011261010b576004356001600160401b03811161010b576104ef903690600401611378565b60e036602319011261010b5760405190610508826112ef565b6001600160a01b03602435818116810361010b578352604435818116810361010b576020840152606435908116810361010b576040830152608435606083015260a435801515810361010b57608083015260c43563ffffffff8116810361010b5760a083015260e435906001600160d81b038216820361010b57826101689260c06020950152610104359161167f565b3461010b57604036600319011261010b576105b16113bf565b6105b96113d5565b600054604051638da5cb5b60e01b8152602093926001600160a01b039290919085908290600490829087165afa80156106b95783916000916106fa575b501633036106c5578382806004931694169384600052600682526040600020816bffffffffffffffffffffffff60a01b82541617905560405192838092636f307dc360e01b82525afa9081156106b95760009161068c575b50160361065757005b6064906040519062461bcd60e51b82526004820152600e60248201526d24b73b30b634b21031aa37b5b2b760911b6044820152fd5b6106ac9150843d86116106b2575b6106a4818361133c565b810190611bd5565b8461064e565b503d61069a565b6040513d6000823e3d90fd5b60405162461bcd60e51b815260048101859052600d60248201526c139bdd105d5d1a1bdc9a5e9959609a1b6044820152606490fd5b6107119150863d88116106b2576106a4818361133c565b866105f6565b3461010b57602036600319011261010b5760043560005260056020526020604060002054604051908152f35b3461010b57610751366113ff565b6020808301516001600160a01b03908116600090815260069092526040808320548186015183168452922054918116949293929116906107a8908390610798871515611b89565b6107a3841515611b89565b612265565b908160005260056020526040600020545b600160ff610100860151160160ff8111610a7e5760ff16811015610b90576107f181606086015163ffffffff60e088015116906124e6565b9483600052600460205261080a60406000205487611ab0565b80821015610b8b5750805b60018060a01b038651169133608088015115610b83575b6020888101516040516323b872dd60e01b81526001600160a01b0384811660048301528781166024830152604482018790529096929187916064918391600091165af19182156106b9576108f695602093610b66575b5060408a015160c08b01516001600160a01b039091169190600090670de0b6b3a7640000906108ba906001600160b01b031689611abd565b6040516323b872dd60e01b81526001600160a01b0396871660048201529390951660248401529093046044820152958692839182906064820190565b03925af19283156106b95761092b93610b37575b508560005260046020526040600020610924838254611aa3565b9055611ab0565b80958460005260046020526040600020541480610b25575b61096b575b1561095b5761095690611b50565b6107b9565b5050505060209150604051908152f35b620f424061098960406000205463ffffffff60e08901511690611abd565b0483670de0b6b3a76400006109aa60018060b01b0360c08a01511684611abd565b0489918360808a0151610aea575b5088516040516361d8983f60e01b81526001600160a01b0390911660048201526024810192909252602090829081600081604481015b03926001600160a01b03165af180156106b957610abf575b508651604051635267b05560e11b81526001600160a01b039182166004820152602481019390935260209183916044918391600091165af180156106b957610a94575b5083600052600560205260406000208054600181018111610a7e57600101905583600052600460205260006040812055610948565b634e487b7160e01b600052601160045260246000fd5b602090813d8311610ab8575b610aaa818361133c565b8101031261010b5787610a49565b503d610aa0565b602090813d8311610ae3575b610ad5818361133c565b8101031261010b5789610a06565b503d610acb565b60c08a01518c95508894506109ee935060209250670de0b6b3a764000090610b1b906001600160b01b031683611abd565b04949150916109b8565b5060ff61010086015116821415610943565b610b589060203d602011610b5f575b610b50818361133c565b810190611667565b508961090a565b503d610b46565b610b7c90843d8611610b5f57610b50818361133c565b508c610882565b50339261082c565b610815565b5050505060209150610168565b3461010b576020610168610bb0366115a2565b90611db8565b3461010b57600036600319011261010b576020600854604051908152f35b3461010b577f5152abf959f6564662358c2e52b702259b78bac5ee7842a0f01937e670efcc7d6020610c126060610c0a366115a2565b809391611db8565b9101518160005260038352604060002055604051908152a1005b3461010b57602036600319011261010b57600060c0604051610c4d816112ef565b8281528260208201528260408201528260608201528260808201528260a08201520152600435600052600160205260e06040600020604051610c8e816112ef565b60018060a01b03908183541692838252826001820154169060208301918252836002820154169060408401918252600460038201549160608601928352015494608085019260ff8716151584528160a087019560c063ffffffff98898b60081c168952019860281c8952604051998a5251166020890152511660408701525160608601525115156080850152511660a083015260018060d81b0390511660c0820152f35b3461010b57606036600319011261010b5760206101686044356024356004356124e6565b3461010b57606036600319011261010b576001600160401b0360043581811161010b573660238201121561010b57806004013591610d93836114f1565b91610da1604051938461133c565b8383526020908184016024809660051b8301019136831161010b57868101915b838310610e875750505050833591821161010b573660238301121561010b578160040135610dee816114f1565b94610dfc604051968761133c565b8186528060e084880193028501019336851161010b5701905b838210610e6e578585604435610e2e8251845114611af0565b6000905b83518210156104685780610438610e5892610e4d8587611b5f565b516104318689611b5f565b90811561046857610e6890611b50565b90610e32565b8260e091610e7c3685611508565b815201910190610e15565b823586811161010b578591610ea283928b3691870101611378565b815201920191610dc1565b3461010b57610ebb366113ff565b6020828101516001600160a01b0390811660009081526006909252604080832054818601518316845292205492949181169392169190610efc908290612265565b918260005260056020526040600020545b60ff610100840151168110156112e257606083015163ffffffff60e08501511690600183018311610a7e57610f469160018401916124e6565b846000526004602052604060002054968715611162575b610f678883611ab0565b8082101561115d5750805b602086015160408701518751608089015160c08a01516001600160a01b03948516946001600160b01b03909116939281169216903390839015611152575b506040516323b872dd60e01b81526001600160a01b038281166004830152841660248201526044810187905294602090869060649082906000905af19384156106b957670de0b6b3a764000061101560009261105198602098611135575b5089611abd565b6040516323b872dd60e01b81526001600160a01b0396871660048201529390951660248401529093046044820152938492839182906064820190565b03925af180156106b95761108a93611084928492611116575b508960005260046020526040600020610924838254611aa3565b98611aa3565b146110e2575b602083015160408401516110b0916001600160a01b039182169116611bf4565b600052600260205260406000205486106110d2576110cd90611b50565b610f0d565b5050505050602090604051908152f35b83600052600560205260406000208054600181018111610a7e57600101905583600052600460205260006040812055611090565b61112e9060203d602011610b5f57610b50818361133c565b508c61106a565b61114b90893d8b11610b5f57610b50818361133c565b503861100e565b33935090508e610fb0565b610f72565b60c0850180516001600160b01b039186918a918691670de0b6b3a764000090819061118f90881685611abd565b049560808c0151156112bf575b505050620f4240918183810204831482151715610a7e576111cf6020926112089463ffffffff60e08e0151169102611ad0565b8a516040516361d8983f60e01b81526001600160a01b039091166004820152602481019190915292839190829060009082906044820190565b03926001600160a01b03165af180156106b957611294575b508651604051635267b05560e11b81526001600160a01b039182166004820152602481019390935260209183916044918391600091165af180156106b957611269575b50610f5d565b602090813d831161128d575b61127f818361133c565b8101031261010b5788611263565b503d611275565b602090813d83116112b8575b6112aa818361133c565b8101031261010b578a611220565b503d6112a0565b9250935093506112d491508793511685611abd565b0490889084928c808061119c565b5050505050602090610168565b60e081019081106001600160401b0382111761130a57604052565b634e487b7160e01b600052604160045260246000fd5b61012081019081106001600160401b0382111761130a57604052565b90601f801991011681019081106001600160401b0382111761130a57604052565b6001600160401b03811161130a57601f01601f191660200190565b81601f8201121561010b5780359061138f8261135d565b9261139d604051948561133c565b8284526020838301011161010b57816000926020809301838601378301015290565b600435906001600160a01b038216820361010b57565b602435906001600160a01b038216820361010b57565b35906001600160a01b038216820361010b57565b9061016060031983011261010b576004356001600160401b03811161010b5761142e8361012092600401611378565b92602319011261010b5760405161144481611320565b6001600160a01b03602435818116810361010b578252604435818116810361010b576020830152606435908116810361010b576040820152608435606082015260a435801515810361010b57608082015263ffffffff60c435818116810361010b5760a083015260e4356001600160b01b038116810361010b5760c083015261010435908116810361010b5760e08201526101243560ff8116810361010b57610100820152906101443590565b6001600160401b03811161130a5760051b60200190565b91908260e091031261010b57604051611520816112ef565b809261152b816113eb565b8252611539602082016113eb565b602083015261154a604082016113eb565b6040830152606081013560608301526080810135801515810361010b57608083015260a08101359063ffffffff8216820361010b5760a083019190915260c00135906001600160d81b038216820361010b5760c00152565b9061010060031983011261010b576004356001600160401b03811161010b576115d08360e092600401611378565b92602319011261010b576040516115e6816112ef565b6001600160a01b03602435818116810361010b578252604435818116810361010b576020830152606435908116810361010b576040820152608435606082015260a435801515810361010b57608082015260c43563ffffffff8116810361010b5760a082015260e4356001600160d81b038116810361010b5760c082015290565b9081602091031261010b5751801515810361010b5790565b91908115611a54576060810190815115611a035760c08101805190936001600160d81b039390918416156119b257602083810180516001600160a01b039792959291908816156119785760409687840199898b51161561193f57898351168a8c5116146118ef5789855116156118b757846116f991611db8565b986000968a8852600389526117138a892054809851611ab0565b808210156118af57509a5b8b156118a057908b95949392916117358789611aa3565b8c8a5260038b528b8a2055818651169360803397015115611896575b518b516323b872dd60e01b8082526001600160a01b038981166004840152871660248301526044820199909952908b90829060649082908e9088165af1801561188c578b979695948f9194670de0b6b3a7640000946117bd948e9761186f575b50511696511690611abd565b8b519788526001600160a01b0393841660048901529490921660248701529204604485015283916064918391905af1801561186557928561182d89606098957fe96da7d7f9b1253f3f855c25f35f32d0a83a96c1a75acdecf0f3bc7cc3bb1ccf9a98958298611848575b50611aa3565b9186815260038452205581519384523390840152820152a190565b61185e90873d8911610b5f57610b50818361133c565b5038611827565b85513d85823e3d90fd5b611885908c8d3d10610b5f57610b50818361133c565b50386117b1565b8c513d8c823e3d90fd5b9395503393611751565b50505050505050935050505090565b90509a61171e565b885162461bcd60e51b81526004810189905260116024820152701b585ad95c881b5d5cdd081899481cd95d607a1b6044820152606490fd5b885162461bcd60e51b815260048101899052602360248201527f746f6b656e3020616e6420746f6b656e31206d75737420626520646966666572604482015262195b9d60ea1b6064820152608490fd5b885162461bcd60e51b81526004810189905260126024820152711d1bdad95b8c481b5d5cdd081899481cd95d60721b6044820152606490fd5b60405162461bcd60e51b81526004810187905260126024820152711d1bdad95b8c081b5d5cdd081899481cd95d60721b6044820152606490fd5b60405162461bcd60e51b8152602060048201526024808201527f65786368616e67652072617465206d75737420626520677265617465722074686044820152630616e20360e41b6064820152608490fd5b60405162461bcd60e51b815260206004820152602360248201527f6f7264657220616d6f756e74206d75737420626520677265617465722074686160448201526206e20360ec1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602160248201527f66696c6c416d6f756e74206d7573742062652067726561746572207468616e206044820152600360fc1b6064820152608490fd5b91908201809211610a7e57565b91908203918211610a7e57565b81810292918115918404141715610a7e57565b8115611ada570490565b634e487b7160e01b600052601260045260246000fd5b15611af757565b60405162461bcd60e51b815260206004820152602b60248201527f7369676e61747572657320616e64206f7264657273206d75737420686176652060448201526a0e6c2daca40d8cadccee8d60ab1b6064820152608490fd5b6000198114610a7e5760010190565b8051821015611b735760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b15611b9057565b60405162461bcd60e51b815260206004820152601a60248201527f4d617267696e2074726164696e67206e6f7420656e61626c65640000000000006044820152606490fd5b9081602091031261010b57516001600160a01b038116810361010b5790565b6040519060208201926bffffffffffffffffffffffff19809260601b16845260601b16603482015260288152606081018181106001600160401b0382111761130a5760405251902090565b15611c4657565b60405162461bcd60e51b815260206004820152602260248201527f6f72646572416d6f756e74206d7573742062652067726561746572207468616e604482015261020360f41b6064820152608490fd5b15611c9d57565b60405162461bcd60e51b815260206004820152602360248201527f65786368616e676552617465206d75737420626520677265617465722074686160448201526206e20360ec1b6064820152608490fd5b15611cf557565b60405162461bcd60e51b8152602060048201526016602482015275496e76616c696420746f6b656e30206164647265737360501b6044820152606490fd5b15611d3a57565b60405162461bcd60e51b8152602060048201526016602482015275496e76616c696420746f6b656e31206164647265737360501b6044820152606490fd5b15611d7f57565b60405162461bcd60e51b8152602060048201526011602482015270696e76616c6964207369676e617475726560781b6044820152606490fd5b906060810190611dca82511515611c3f565b60c081019260018060d81b0391611de5838651161515611c96565b602081019360018060a01b0395611e00878751161515611cee565b6040830194611e13888751161515611d33565b8780808651169851169651169251608085015115159163ffffffff60a087015116935116936040519760208901997f72947dbb8d2ba67a74e333a748b7a9619ef219198f5cec602fd6d3211397dfbf8b5260408a01526060890152608088015260a087015260c086015260e08501526101009081850152835261012083018381106001600160401b0382111761130a57611ec994611ec494611eba926040525190206120f4565b9485915116611ecc565b611d78565b90565b611ed68383612007565b6005811015611ff157159081611fdb575b50611fd3576040519260209384810191630b135d3f60e11b948584526024830152604060448301528051908160648401528660005b838110611fbe575050509181611f5260848286600083819a9899829a010152601f8019910116810103606481018452018261133c565b51915afa913d15611fb7573d611f678161135d565b90611f75604051928361133c565b81523d60008383013e5b83611fac575b83611f91575b50505090565b90809293508180518101031261010b57015114388080611f8b565b805182149350611f85565b6060611f7f565b81818401015160848287010152018790611f1c565b505050600190565b6001600160a01b03838116911614905038611ee7565b634e487b7160e01b600052602160045260246000fd5b90604181511460001461203557612031916020820151906060604084015193015160001a9061203f565b9091565b5050600090600290565b9291907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083116120e85760ff16601b811415806120dd575b6120d1579160809493916020936040519384528484015260408301526060820152600093849182805260015afa156120c45781516001600160a01b038116156120be579190565b50600190565b50604051903d90823e3d90fd5b50505050600090600490565b50601c811415612077565b50505050600090600390565b6120fc61213b565b9060405190602082019261190160f01b84526022830152604282015260428152608081018181106001600160401b0382111761130a5760405251902090565b307f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316148061223c575b15612196577f000000000000000000000000000000000000000000000000000000000000000090565b60405160208101907f000000000000000000000000000000000000000000000000000000000000000082527f000000000000000000000000000000000000000000000000000000000000000060408201527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260a0815260c081018181106001600160401b0382111761130a5760405251902090565b507f0000000000000000000000000000000000000000000000000000000000000000461461216d565b606082019161227683511515611c3f565b60c0810180516001600160b01b03906122929082161515611c96565b60e083019163ffffffff91828451161561249657620f4240838551161015612447576101009687860160ff81511615612402576020870180516001600160a01b039a91978b969092916122e89088161515611cee565b8960409687820199898b511615156122ff90611d33565b898c51169960009a8b526006602052808a8c205416151561231f90611b89565b808c51168b526006602052808a8c205416151561233b90611b89565b80808551169d51169b511697519181608085015115159460a0015116945116955116955160ff169688519a60208c019c7f4b5ce9bff05b2eb1b04a66685b9bbe715805ee88470a2d38bc2068b29b9566618e528a8d015260608c015260808b015260a08a015260c089015260e0880152860152610120850152610140908185015283526101608301918383106001600160401b038411176123ee575052519020611ec992611ec4929091611eba906120f4565b634e487b7160e01b81526041600452602490fd5b60405162461bcd60e51b815260206004820152601f60248201527f6c65766572616765206d7573742062652067726561746572207468616e2030006044820152606490fd5b60405162461bcd60e51b815260206004820152602160248201527f626f72726f774c696d6974206d757374206265206c657373207468616e2031656044820152601b60f91b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f626f72726f774c696d6974206d7573742062652067726561746572207468616e604482015261020360f41b6064820152608490fd5b916000915b8183106124f85750505090565b909192620f424061250c8361251393611abd565b0493611b50565b91906124eb56fea2646970667358221220ee1c14466d8255269e56c7ef14764ef4991c4ecf4157eb50f99ad70124db6fc964736f6c63430008110033", + "deployedBytecode": "0x6080604052600436101561001257600080fd5b60003560e01c80630b5d301714610ead5780630f20019114610d565780631251cd4514610d325780631e41be5a14610c2c57806327a7415014610bd457806343f0179b14610bb65780634b3bb0a214610b9d5780634d6688e1146107435780635728e161146107175780635d3f535614610598578063611fbb60146104be5780638ef9f003146102ed57806395bf75fd146102c4578063bb30ef1614610298578063bed29b631461026c578063caea68b014610170578063d7b7961c1461013c578063f7213db6146101105763fc741c7c146100ed57600080fd5b3461010b57600036600319011261010b576020600754604051908152f35b600080fd5b3461010b57602036600319011261010b5760043560005260036020526020604060002054604051908152f35b3461010b57604036600319011261010b57602061016861015a6113bf565b6101626113d5565b90611bf4565b604051908152f35b3461010b5761014036600319011261010b576004356001600160401b03811161010b576101a1903690600401611378565b61012036602319011261010b576040516101ba81611320565b6001600160a01b03602435818116810361010b578252604435818116810361010b576020830152606435908116810361010b576040820152608435606082015260a435801515810361010b57608082015263ffffffff60c435818116810361010b5760a083015260e4356001600160b01b038116810361010b5760c083015261010435908116810361010b5760e0820152610124359060ff8216820361010b5760209261016892610100830152612265565b3461010b57602036600319011261010b5760043560005260046020526020604060002054604051908152f35b3461010b57602036600319011261010b5760043560005260026020526020604060002054604051908152f35b3461010b57600036600319011261010b576000546040516001600160a01b039091168152602090f35b3461010b57606036600319011261010b576001600160401b0360043581811161010b573660238201121561010b578060040135610329816114f1565b92610337604051948561133c565b8184526020928385016024809460051b8301019136831161010b57848101915b8383106104985750505050813590811161010b573660238201121561010b57806004013592610385846114f1565b93610393604051958661133c565b8085528360e083870192028401019236841161010b578401905b83821061047f5750505050604435926103c98151845114611af0565b60005b835181101561046857670de0b6b3a76400008086029580870482149015171561046a5761045360018060d81b0361043e61041860c099838b61040e898d611b5f565b5101511690611ad0565b61043881610426888a611b5f565b51610431898d611b5f565b519061167f565b90611ab0565b976104498589611b5f565b5101511687611abd565b0494156104685761046390611b50565b6103cc565b005b83634e487b7160e01b60005260116004526000fd5b8260e09161048d3685611508565b8152019101906103ad565b823585811161010b5787916104b38392893691870101611378565b815201920191610357565b3461010b5761012036600319011261010b576004356001600160401b03811161010b576104ef903690600401611378565b60e036602319011261010b5760405190610508826112ef565b6001600160a01b03602435818116810361010b578352604435818116810361010b576020840152606435908116810361010b576040830152608435606083015260a435801515810361010b57608083015260c43563ffffffff8116810361010b5760a083015260e435906001600160d81b038216820361010b57826101689260c06020950152610104359161167f565b3461010b57604036600319011261010b576105b16113bf565b6105b96113d5565b600054604051638da5cb5b60e01b8152602093926001600160a01b039290919085908290600490829087165afa80156106b95783916000916106fa575b501633036106c5578382806004931694169384600052600682526040600020816bffffffffffffffffffffffff60a01b82541617905560405192838092636f307dc360e01b82525afa9081156106b95760009161068c575b50160361065757005b6064906040519062461bcd60e51b82526004820152600e60248201526d24b73b30b634b21031aa37b5b2b760911b6044820152fd5b6106ac9150843d86116106b2575b6106a4818361133c565b810190611bd5565b8461064e565b503d61069a565b6040513d6000823e3d90fd5b60405162461bcd60e51b815260048101859052600d60248201526c139bdd105d5d1a1bdc9a5e9959609a1b6044820152606490fd5b6107119150863d88116106b2576106a4818361133c565b866105f6565b3461010b57602036600319011261010b5760043560005260056020526020604060002054604051908152f35b3461010b57610751366113ff565b6020808301516001600160a01b03908116600090815260069092526040808320548186015183168452922054918116949293929116906107a8908390610798871515611b89565b6107a3841515611b89565b612265565b908160005260056020526040600020545b600160ff610100860151160160ff8111610a7e5760ff16811015610b90576107f181606086015163ffffffff60e088015116906124e6565b9483600052600460205261080a60406000205487611ab0565b80821015610b8b5750805b60018060a01b038651169133608088015115610b83575b6020888101516040516323b872dd60e01b81526001600160a01b0384811660048301528781166024830152604482018790529096929187916064918391600091165af19182156106b9576108f695602093610b66575b5060408a015160c08b01516001600160a01b039091169190600090670de0b6b3a7640000906108ba906001600160b01b031689611abd565b6040516323b872dd60e01b81526001600160a01b0396871660048201529390951660248401529093046044820152958692839182906064820190565b03925af19283156106b95761092b93610b37575b508560005260046020526040600020610924838254611aa3565b9055611ab0565b80958460005260046020526040600020541480610b25575b61096b575b1561095b5761095690611b50565b6107b9565b5050505060209150604051908152f35b620f424061098960406000205463ffffffff60e08901511690611abd565b0483670de0b6b3a76400006109aa60018060b01b0360c08a01511684611abd565b0489918360808a0151610aea575b5088516040516361d8983f60e01b81526001600160a01b0390911660048201526024810192909252602090829081600081604481015b03926001600160a01b03165af180156106b957610abf575b508651604051635267b05560e11b81526001600160a01b039182166004820152602481019390935260209183916044918391600091165af180156106b957610a94575b5083600052600560205260406000208054600181018111610a7e57600101905583600052600460205260006040812055610948565b634e487b7160e01b600052601160045260246000fd5b602090813d8311610ab8575b610aaa818361133c565b8101031261010b5787610a49565b503d610aa0565b602090813d8311610ae3575b610ad5818361133c565b8101031261010b5789610a06565b503d610acb565b60c08a01518c95508894506109ee935060209250670de0b6b3a764000090610b1b906001600160b01b031683611abd565b04949150916109b8565b5060ff61010086015116821415610943565b610b589060203d602011610b5f575b610b50818361133c565b810190611667565b508961090a565b503d610b46565b610b7c90843d8611610b5f57610b50818361133c565b508c610882565b50339261082c565b610815565b5050505060209150610168565b3461010b576020610168610bb0366115a2565b90611db8565b3461010b57600036600319011261010b576020600854604051908152f35b3461010b577f5152abf959f6564662358c2e52b702259b78bac5ee7842a0f01937e670efcc7d6020610c126060610c0a366115a2565b809391611db8565b9101518160005260038352604060002055604051908152a1005b3461010b57602036600319011261010b57600060c0604051610c4d816112ef565b8281528260208201528260408201528260608201528260808201528260a08201520152600435600052600160205260e06040600020604051610c8e816112ef565b60018060a01b03908183541692838252826001820154169060208301918252836002820154169060408401918252600460038201549160608601928352015494608085019260ff8716151584528160a087019560c063ffffffff98898b60081c168952019860281c8952604051998a5251166020890152511660408701525160608601525115156080850152511660a083015260018060d81b0390511660c0820152f35b3461010b57606036600319011261010b5760206101686044356024356004356124e6565b3461010b57606036600319011261010b576001600160401b0360043581811161010b573660238201121561010b57806004013591610d93836114f1565b91610da1604051938461133c565b8383526020908184016024809660051b8301019136831161010b57868101915b838310610e875750505050833591821161010b573660238301121561010b578160040135610dee816114f1565b94610dfc604051968761133c565b8186528060e084880193028501019336851161010b5701905b838210610e6e578585604435610e2e8251845114611af0565b6000905b83518210156104685780610438610e5892610e4d8587611b5f565b516104318689611b5f565b90811561046857610e6890611b50565b90610e32565b8260e091610e7c3685611508565b815201910190610e15565b823586811161010b578591610ea283928b3691870101611378565b815201920191610dc1565b3461010b57610ebb366113ff565b6020828101516001600160a01b0390811660009081526006909252604080832054818601518316845292205492949181169392169190610efc908290612265565b918260005260056020526040600020545b60ff610100840151168110156112e257606083015163ffffffff60e08501511690600183018311610a7e57610f469160018401916124e6565b846000526004602052604060002054968715611162575b610f678883611ab0565b8082101561115d5750805b602086015160408701518751608089015160c08a01516001600160a01b03948516946001600160b01b03909116939281169216903390839015611152575b506040516323b872dd60e01b81526001600160a01b038281166004830152841660248201526044810187905294602090869060649082906000905af19384156106b957670de0b6b3a764000061101560009261105198602098611135575b5089611abd565b6040516323b872dd60e01b81526001600160a01b0396871660048201529390951660248401529093046044820152938492839182906064820190565b03925af180156106b95761108a93611084928492611116575b508960005260046020526040600020610924838254611aa3565b98611aa3565b146110e2575b602083015160408401516110b0916001600160a01b039182169116611bf4565b600052600260205260406000205486106110d2576110cd90611b50565b610f0d565b5050505050602090604051908152f35b83600052600560205260406000208054600181018111610a7e57600101905583600052600460205260006040812055611090565b61112e9060203d602011610b5f57610b50818361133c565b508c61106a565b61114b90893d8b11610b5f57610b50818361133c565b503861100e565b33935090508e610fb0565b610f72565b60c0850180516001600160b01b039186918a918691670de0b6b3a764000090819061118f90881685611abd565b049560808c0151156112bf575b505050620f4240918183810204831482151715610a7e576111cf6020926112089463ffffffff60e08e0151169102611ad0565b8a516040516361d8983f60e01b81526001600160a01b039091166004820152602481019190915292839190829060009082906044820190565b03926001600160a01b03165af180156106b957611294575b508651604051635267b05560e11b81526001600160a01b039182166004820152602481019390935260209183916044918391600091165af180156106b957611269575b50610f5d565b602090813d831161128d575b61127f818361133c565b8101031261010b5788611263565b503d611275565b602090813d83116112b8575b6112aa818361133c565b8101031261010b578a611220565b503d6112a0565b9250935093506112d491508793511685611abd565b0490889084928c808061119c565b5050505050602090610168565b60e081019081106001600160401b0382111761130a57604052565b634e487b7160e01b600052604160045260246000fd5b61012081019081106001600160401b0382111761130a57604052565b90601f801991011681019081106001600160401b0382111761130a57604052565b6001600160401b03811161130a57601f01601f191660200190565b81601f8201121561010b5780359061138f8261135d565b9261139d604051948561133c565b8284526020838301011161010b57816000926020809301838601378301015290565b600435906001600160a01b038216820361010b57565b602435906001600160a01b038216820361010b57565b35906001600160a01b038216820361010b57565b9061016060031983011261010b576004356001600160401b03811161010b5761142e8361012092600401611378565b92602319011261010b5760405161144481611320565b6001600160a01b03602435818116810361010b578252604435818116810361010b576020830152606435908116810361010b576040820152608435606082015260a435801515810361010b57608082015263ffffffff60c435818116810361010b5760a083015260e4356001600160b01b038116810361010b5760c083015261010435908116810361010b5760e08201526101243560ff8116810361010b57610100820152906101443590565b6001600160401b03811161130a5760051b60200190565b91908260e091031261010b57604051611520816112ef565b809261152b816113eb565b8252611539602082016113eb565b602083015261154a604082016113eb565b6040830152606081013560608301526080810135801515810361010b57608083015260a08101359063ffffffff8216820361010b5760a083019190915260c00135906001600160d81b038216820361010b5760c00152565b9061010060031983011261010b576004356001600160401b03811161010b576115d08360e092600401611378565b92602319011261010b576040516115e6816112ef565b6001600160a01b03602435818116810361010b578252604435818116810361010b576020830152606435908116810361010b576040820152608435606082015260a435801515810361010b57608082015260c43563ffffffff8116810361010b5760a082015260e4356001600160d81b038116810361010b5760c082015290565b9081602091031261010b5751801515810361010b5790565b91908115611a54576060810190815115611a035760c08101805190936001600160d81b039390918416156119b257602083810180516001600160a01b039792959291908816156119785760409687840199898b51161561193f57898351168a8c5116146118ef5789855116156118b757846116f991611db8565b986000968a8852600389526117138a892054809851611ab0565b808210156118af57509a5b8b156118a057908b95949392916117358789611aa3565b8c8a5260038b528b8a2055818651169360803397015115611896575b518b516323b872dd60e01b8082526001600160a01b038981166004840152871660248301526044820199909952908b90829060649082908e9088165af1801561188c578b979695948f9194670de0b6b3a7640000946117bd948e9761186f575b50511696511690611abd565b8b519788526001600160a01b0393841660048901529490921660248701529204604485015283916064918391905af1801561186557928561182d89606098957fe96da7d7f9b1253f3f855c25f35f32d0a83a96c1a75acdecf0f3bc7cc3bb1ccf9a98958298611848575b50611aa3565b9186815260038452205581519384523390840152820152a190565b61185e90873d8911610b5f57610b50818361133c565b5038611827565b85513d85823e3d90fd5b611885908c8d3d10610b5f57610b50818361133c565b50386117b1565b8c513d8c823e3d90fd5b9395503393611751565b50505050505050935050505090565b90509a61171e565b885162461bcd60e51b81526004810189905260116024820152701b585ad95c881b5d5cdd081899481cd95d607a1b6044820152606490fd5b885162461bcd60e51b815260048101899052602360248201527f746f6b656e3020616e6420746f6b656e31206d75737420626520646966666572604482015262195b9d60ea1b6064820152608490fd5b885162461bcd60e51b81526004810189905260126024820152711d1bdad95b8c481b5d5cdd081899481cd95d60721b6044820152606490fd5b60405162461bcd60e51b81526004810187905260126024820152711d1bdad95b8c081b5d5cdd081899481cd95d60721b6044820152606490fd5b60405162461bcd60e51b8152602060048201526024808201527f65786368616e67652072617465206d75737420626520677265617465722074686044820152630616e20360e41b6064820152608490fd5b60405162461bcd60e51b815260206004820152602360248201527f6f7264657220616d6f756e74206d75737420626520677265617465722074686160448201526206e20360ec1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602160248201527f66696c6c416d6f756e74206d7573742062652067726561746572207468616e206044820152600360fc1b6064820152608490fd5b91908201809211610a7e57565b91908203918211610a7e57565b81810292918115918404141715610a7e57565b8115611ada570490565b634e487b7160e01b600052601260045260246000fd5b15611af757565b60405162461bcd60e51b815260206004820152602b60248201527f7369676e61747572657320616e64206f7264657273206d75737420686176652060448201526a0e6c2daca40d8cadccee8d60ab1b6064820152608490fd5b6000198114610a7e5760010190565b8051821015611b735760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b15611b9057565b60405162461bcd60e51b815260206004820152601a60248201527f4d617267696e2074726164696e67206e6f7420656e61626c65640000000000006044820152606490fd5b9081602091031261010b57516001600160a01b038116810361010b5790565b6040519060208201926bffffffffffffffffffffffff19809260601b16845260601b16603482015260288152606081018181106001600160401b0382111761130a5760405251902090565b15611c4657565b60405162461bcd60e51b815260206004820152602260248201527f6f72646572416d6f756e74206d7573742062652067726561746572207468616e604482015261020360f41b6064820152608490fd5b15611c9d57565b60405162461bcd60e51b815260206004820152602360248201527f65786368616e676552617465206d75737420626520677265617465722074686160448201526206e20360ec1b6064820152608490fd5b15611cf557565b60405162461bcd60e51b8152602060048201526016602482015275496e76616c696420746f6b656e30206164647265737360501b6044820152606490fd5b15611d3a57565b60405162461bcd60e51b8152602060048201526016602482015275496e76616c696420746f6b656e31206164647265737360501b6044820152606490fd5b15611d7f57565b60405162461bcd60e51b8152602060048201526011602482015270696e76616c6964207369676e617475726560781b6044820152606490fd5b906060810190611dca82511515611c3f565b60c081019260018060d81b0391611de5838651161515611c96565b602081019360018060a01b0395611e00878751161515611cee565b6040830194611e13888751161515611d33565b8780808651169851169651169251608085015115159163ffffffff60a087015116935116936040519760208901997f72947dbb8d2ba67a74e333a748b7a9619ef219198f5cec602fd6d3211397dfbf8b5260408a01526060890152608088015260a087015260c086015260e08501526101009081850152835261012083018381106001600160401b0382111761130a57611ec994611ec494611eba926040525190206120f4565b9485915116611ecc565b611d78565b90565b611ed68383612007565b6005811015611ff157159081611fdb575b50611fd3576040519260209384810191630b135d3f60e11b948584526024830152604060448301528051908160648401528660005b838110611fbe575050509181611f5260848286600083819a9899829a010152601f8019910116810103606481018452018261133c565b51915afa913d15611fb7573d611f678161135d565b90611f75604051928361133c565b81523d60008383013e5b83611fac575b83611f91575b50505090565b90809293508180518101031261010b57015114388080611f8b565b805182149350611f85565b6060611f7f565b81818401015160848287010152018790611f1c565b505050600190565b6001600160a01b03838116911614905038611ee7565b634e487b7160e01b600052602160045260246000fd5b90604181511460001461203557612031916020820151906060604084015193015160001a9061203f565b9091565b5050600090600290565b9291907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083116120e85760ff16601b811415806120dd575b6120d1579160809493916020936040519384528484015260408301526060820152600093849182805260015afa156120c45781516001600160a01b038116156120be579190565b50600190565b50604051903d90823e3d90fd5b50505050600090600490565b50601c811415612077565b50505050600090600390565b6120fc61213b565b9060405190602082019261190160f01b84526022830152604282015260428152608081018181106001600160401b0382111761130a5760405251902090565b307f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316148061223c575b15612196577f000000000000000000000000000000000000000000000000000000000000000090565b60405160208101907f000000000000000000000000000000000000000000000000000000000000000082527f000000000000000000000000000000000000000000000000000000000000000060408201527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260a0815260c081018181106001600160401b0382111761130a5760405251902090565b507f0000000000000000000000000000000000000000000000000000000000000000461461216d565b606082019161227683511515611c3f565b60c0810180516001600160b01b03906122929082161515611c96565b60e083019163ffffffff91828451161561249657620f4240838551161015612447576101009687860160ff81511615612402576020870180516001600160a01b039a91978b969092916122e89088161515611cee565b8960409687820199898b511615156122ff90611d33565b898c51169960009a8b526006602052808a8c205416151561231f90611b89565b808c51168b526006602052808a8c205416151561233b90611b89565b80808551169d51169b511697519181608085015115159460a0015116945116955116955160ff169688519a60208c019c7f4b5ce9bff05b2eb1b04a66685b9bbe715805ee88470a2d38bc2068b29b9566618e528a8d015260608c015260808b015260a08a015260c089015260e0880152860152610120850152610140908185015283526101608301918383106001600160401b038411176123ee575052519020611ec992611ec4929091611eba906120f4565b634e487b7160e01b81526041600452602490fd5b60405162461bcd60e51b815260206004820152601f60248201527f6c65766572616765206d7573742062652067726561746572207468616e2030006044820152606490fd5b60405162461bcd60e51b815260206004820152602160248201527f626f72726f774c696d6974206d757374206265206c657373207468616e2031656044820152601b60f91b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f626f72726f774c696d6974206d7573742062652067726561746572207468616e604482015261020360f41b6064820152608490fd5b916000915b8183106124f85750505090565b909192620f424061250c8361251393611abd565b0493611b50565b91906124eb56fea2646970667358221220ee1c14466d8255269e56c7ef14764ef4991c4ecf4157eb50f99ad70124db6fc964736f6c63430008110033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/src/abis/Lever.json b/src/abis/Lever.json index 456095e..3e1600a 100644 --- a/src/abis/Lever.json +++ b/src/abis/Lever.json @@ -9,6 +9,11 @@ "internalType": "contract System", "name": "__system", "type": "address" + }, + { + "internalType": "contract ZEXE", + "name": "_zexe", + "type": "address" } ], "stateMutability": "nonpayable", @@ -58,6 +63,194 @@ "name": "ActionPausedGlobally", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "oldCompAccrued", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newCompAccrued", + "type": "uint256" + } + ], + "name": "CompAccruedAdjusted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "contract LendingMarket", + "name": "cToken", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newSpeed", + "type": "uint256" + } + ], + "name": "CompBorrowSpeedUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "CompGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "oldCompReceivable", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newCompReceivable", + "type": "uint256" + } + ], + "name": "CompReceivableUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "contract LendingMarket", + "name": "cToken", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newSpeed", + "type": "uint256" + } + ], + "name": "CompSupplySpeedUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "contributor", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newSpeed", + "type": "uint256" + } + ], + "name": "ContributorCompSpeedUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "contract LendingMarket", + "name": "cToken", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "borrower", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "compDelta", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "compBorrowIndex", + "type": "uint256" + } + ], + "name": "DistributedBorrowerComp", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "contract LendingMarket", + "name": "cToken", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "supplier", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "compDelta", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "compSupplyIndex", + "type": "uint256" + } + ], + "name": "DistributedSupplierComp", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -299,6 +492,24 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "_grantComp", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [], "name": "_mintGuardianPaused", @@ -392,6 +603,47 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "contract LendingMarket[]", + "name": "cTokens", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "supplySpeeds", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "borrowSpeeds", + "type": "uint256[]" + } + ], + "name": "_setCompSpeeds", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "contributor", + "type": "address" + }, + { + "internalType": "uint256", + "name": "compSpeed", + "type": "uint256" + } + ], + "name": "_setContributorCompSpeed", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -744,6 +996,65 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "holder", + "type": "address" + }, + { + "internalType": "contract LendingMarket[]", + "name": "cTokens", + "type": "address[]" + } + ], + "name": "claimComp", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "holders", + "type": "address[]" + }, + { + "internalType": "contract LendingMarket[]", + "name": "cTokens", + "type": "address[]" + }, + { + "internalType": "bool", + "name": "borrowers", + "type": "bool" + }, + { + "internalType": "bool", + "name": "suppliers", + "type": "bool" + } + ], + "name": "claimComp", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "holder", + "type": "address" + } + ], + "name": "claimComp", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [], "name": "closeFactorMantissa", @@ -757,6 +1068,191 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "compAccrued", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "compBorrowSpeeds", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "compBorrowState", + "outputs": [ + { + "internalType": "uint224", + "name": "index", + "type": "uint224" + }, + { + "internalType": "uint32", + "name": "block", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "compBorrowerIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "compContributorSpeeds", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "compInitialIndex", + "outputs": [ + { + "internalType": "uint224", + "name": "", + "type": "uint224" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "compSupplierIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "compSupplySpeeds", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "compSupplyState", + "outputs": [ + { + "internalType": "uint224", + "name": "index", + "type": "uint224" + }, + { + "internalType": "uint32", + "name": "block", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "comptrollerImplementation", @@ -958,6 +1454,25 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "lastContributorBlock", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -1145,7 +1660,7 @@ "type": "uint256" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { @@ -1273,7 +1788,7 @@ "type": "uint256" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { @@ -1335,7 +1850,7 @@ "type": "uint256" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { @@ -1407,7 +1922,7 @@ "type": "uint256" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { @@ -1500,7 +2015,7 @@ "type": "uint256" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { @@ -1543,10 +2058,36 @@ "outputs": [], "stateMutability": "nonpayable", "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "contributor", + "type": "address" + } + ], + "name": "updateContributorRewards", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "zexe", + "outputs": [ + { + "internalType": "contract ZEXE", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" } ], - "bytecode": "0x6080346200008057601f62003d2038819003918201601f19168301916001600160401b0383118484101762000085578084926020946040528339810103126200008057516001600160a01b03811690819003620000805760018060a01b0319338160005416176000556004541617600455604051613c8490816200009c8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe608060408181526004918236101561001657600080fd5b600092833560e01c9182627e3dd2146115955750816318c882a5146114975781631d504dc61461130c5781631ededc91146112dc57816321af4569146112b357816324008a621461129557816324a3d6221461126c57816326782247146112435781632d70db7814611175578163317b0b77146110ca578163391957d714610fef5781633bcf7ec114610ef65781633c94786f14610ecf57816341c728b914610ec057816342cbb15c14610ea557816347ef3b3b14610e635781634a58443214610e2b5781634ada90af14610e0c5781634e79238f14610de75781634ef4c3e114610dca5781634fd42e1714610daa57816351dff98914610d4457816352d84d1e14610cff57816355ee1fe114610cce5781635c77860514610cb95781635ec88c7914610c5c5781635f5af1aa14610c365781635fc7e71e14610c16578163607ef6c114610a665781636a56947e14610a505781636d154ea514610a125781636d35bf91146109fb578163731f0c2b146109bd5781637dc0d1d01461099457816387f763031461096d5781638e8f294b146109265781638ebf636414610855578163929fe9a11461080557816394543c15146107d657816394b2294b146107b757816395bf75fd14610451578163a76b3fda14610791578163abfceffc14610718578163ac0b0bb7146106f1578163b0772d0b14610672578163bb82aa5e14610649578163bdcdc2581461062b578163c2998238146104a3578163c488847b1461047d578163c6ac8a4b1461045157508063d02f735114610433578063da3d454c14610418578063dce15449146103bd578063dcfbc0c714610395578063e4028eee1461036d578063e6653f3d14610347578063e875544614610329578063eabe7d911461030e578063ede4edd0146102e25763f851a440146102b857600080fd5b346102de57816003193601126102de57905490516001600160a01b039091168152602090f35b5080fd5b50346102de5760203660031901126102de576020906103076103026115b0565b6119cb565b9051908152f35b50346102de576020906103076103233661168f565b91611d4f565b50346102de57816003193601126102de576020906006549051908152f35b50346102de57816003193601126102de5760209060ff600b5460a81c1690519015158152f35b50346102de57806003193601126102de5760209061030761038c6115b0565b60243590613524565b50346102de57816003193601126102de5760035490516001600160a01b039091168152602090f35b50346102de57806003193601126102de576103d66115b0565b6001600160a01b0390811683526009602052818320805460243594908510156104155750602093610406916116c4565b92905490519260031b1c168152f35b80fd5b50346102de5760209061030761042d3661168f565b91611df2565b50346102de57602090610307610448366116f2565b505050906122c3565b9050346104795782600319360112610479575490516001600160a01b03909116815260209150f35b8280fd5b82843461041557506104976104913661168f565b91613266565b82519182526020820152f35b839150346102de576020806003193601126104795781359267ffffffffffffffff841161041557366023850112156104155783830135926104e384611827565b946104f087519687611805565b8486528386016024809660051b83010191368311610627579580949598979601905b8282106105f65750505083519061052882611827565b9261053587519485611805565b82845261054183611827565b8489019690601f1901368837855b84811061059657505050505083519485948186019282875251809352850193925b82811061057f57505050500390f35b835185528695509381019392810192600101610570565b97989697949695946105bb336001600160a01b036105b48486611864565b5116611878565b60128110156105e457906105d9916105d3828b611864565b5261183f565b98979694959861054f565b634e487b7160e01b8752602185528387fd5b969795969395949381356001600160a01b0381168103610623578152949796959394908801908801610512565b8580fd5b8480fd5b5050346102de5760209061030761064136611615565b929050612411565b5050346102de57816003193601126102de5760025490516001600160a01b039091168152602090f35b8284346104155780600319360112610415578151918291600e54808552602080950194600e8352600080516020613c2f83398151915292905b8282106106d1576106cd86866106c3828b0383611805565b5191829182611772565b0390f35b83546001600160a01b0316875295860195600193840193909101906106ab565b5050346102de57816003193601126102de5760209060ff600b5460b81c1690519015158152f35b5050346102de5760209081600319360112610479576001600160a01b03928361073f6115b0565b16815260098352818120938251908194808754938481520196845280842093915b838310610778576106cd87876106c3828c0383611805565b8454811688529681019660019485019490920191610760565b5050346102de5760203660031901126102de576020906103076107b26115b0565b61376c565b5050346102de57816003193601126102de576020906008549051908152f35b5050346102de5760203660031901126102de576020906107fc6107f76115b0565b613b3f565b90519015158152f35b5050346102de57806003193601126102de5760ff816020936108256115b0565b6001600160a01b03806108366115cb565b168352600a875260028484200191168252855220541690519015158152f35b5050346102de5760203660031901126102de57906020916108746115f0565b600b54926001600160a01b03903382861614801561091a575b61089690613a9e565b54163314801561090e575b6108aa90613afa565b15159160ff60b01b8360b01b169060ff60b01b191617600b557f27ee2b767de43e8b48d1666d8c451a273fbf857e760fda6e95d0d582f68534bc60808251838152600884820152672a3930b739b332b960c11b60608201528486820152a151908152f35b508015156001146108a1565b5080548216331461088d565b5050346102de5760203660031901126102de579081906001600160a01b0361094c6115b0565b168152600a60205220600160ff825416910154825191151582526020820152f35b5050346102de57816003193601126102de5760209060ff600b5460b01c1690519015158152f35b5050346102de57816003193601126102de5760055490516001600160a01b039091168152602090f35b5050346102de5760203660031901126102de5760209160ff9082906001600160a01b036109e86115b0565b168152600c855220541690519015158152f35b833461041557610a0a366116f2565b505050505080f35b5050346102de5760203660031901126102de5760209160ff9082906001600160a01b03610a3d6115b0565b168152600d855220541690519015158152f35b833461041557610a5f36611615565b5050505080f35b9190503461047957806003193601126104795767ffffffffffffffff91803583811161062757610a999036908301611741565b909360243590811161062357610ab29036908401611741565b909160018060a01b03938488541633148015610c09575b15610ba85781151580610b9f575b15610b6c5750865b818110610aea578780f35b80610af9610b6792858761397e565b3586610b0e610b0984878d61397e565b61398e565b168a5260209060108252888b20557f6f1951b2aad10f3fc81b86d91105b413a5b3f847a34bbc5ce1904201b14438f6610b4b610b0984878d61397e565b9188610b5885898b61397e565b35938b519485521692a261183f565b610adf565b606490602087519162461bcd60e51b8352820152600d60248201526c1a5b9d985b1a59081a5b9c1d5d609a1b6044820152fd5b50828214610ad7565b608490602087519162461bcd60e51b8352820152603560248201527f6f6e6c792061646d696e206f7220626f72726f772063617020677561726469616044820152746e2063616e2073657420626f72726f77206361707360581b6064820152fd5b5084600f54163314610ac9565b5050346102de57602090610307610c2c366116f2565b93909291506120b2565b5050346102de5760203660031901126102de57602090610307610c576115b0565b6139a2565b8383346102de5760203660031901126102de57610c7f610c7a6115b0565b612463565b919290936012841015610ca657505191825260208201929092526040810191909152606090f35b634e487b7160e01b815260218652602490fd5b833461041557610cc83661168f565b50505080f35b9050346104795760203660031901126104795735916001600160a01b0383168303610415575061030760209261348e565b9050346104795760203660031901126104795735600e5481101561047957600e6020935260018060a01b0390600080516020613c2f8339815191520154169051908152f35b9190503461047957610d5536611656565b159250905081610da0575b50610d69578280f35b906020606492519162461bcd60e51b8352820152601160248201527072656465656d546f6b656e73207a65726f60781b6044820152fd5b9050151538610d60565b8284346104155760203660031901126104155750610307602092356136f1565b5050346102de57602090610307610de03661168f565b5050611cda565b8383346102de57610c7f610dfa36611656565b9290916001600160a01b031690612ec3565b5050346102de57816003193601126102de576020906007549051908152f35b5050346102de5760203660031901126102de5760209181906001600160a01b03610e536115b0565b1681526010845220549051908152f35b83346104155760c036600319011261041557610e7d6115b0565b50610e866115cb565b50610e8f6115ff565b506064356001600160a01b038116036104155780f35b5050346102de57816003193601126102de5760209051438152f35b833461041557610a5f36611656565b5050346102de57816003193601126102de5760209060ff600b5460a01c1690519015158152f35b8383346102de57806003193601126102de577f71aec636243f9709bb0007ae15e9afb8150ab01716d75fd7573be5cc096e03b060a082602095610fab610f3a6115b0565b96610f436115e1565b938491600180881b03809a16998a8252600a8c52610f6660ff8484205416613a41565b80600b541633148015610fe3575b610f7d90613a9e565b81541633148015610fd7575b610f9290613afa565b898152600c8b52209060ff801983541691151516179055565b8451958652606087870152606086015263135a5b9d60e21b60808601521515938484820152a151908152f35b50821515600114610f89565b50815481163314610f74565b839150346102de5760203660031901126102de5761100b6115b0565b82546001600160a01b039290831633036110785750600f80546001600160a01b031981168484161790915593516001600160a01b039290941682168452166020830152907feda98690e518e9a05f8ec6837663e188211b2da8f4906648b323f2c1d4434e2990604090a180f35b608490602086519162461bcd60e51b8352820152602660248201527f6f6e6c792061646d696e2063616e2073657420626f72726f772063617020677560448201526530b93234b0b760d11b6064820152fd5b839150346102de5760203660031901126102de578154813591906001600160a01b031633036111325750917f3b9670cf975d26958e754b57098eaa2ac914d8d2a31b83257997b9f346110fd9816020946006549080600655825191825286820152a151908152f35b606490602085519162461bcd60e51b8352820152601f60248201527f6f6e6c792061646d696e2063616e2073657420636c6f736520666163746f72006044820152fd5b5050346102de5760203660031901126102de57906020916111946115f0565b600b54926001600160a01b039033828616148015611237575b6111b690613a9e565b54163314801561122b575b6111ca90613afa565b15159160ff60b81b8360b81b169060ff60b81b191617600b557f27ee2b767de43e8b48d1666d8c451a273fbf857e760fda6e95d0d582f68534bc60808251838152600584820152645365697a6560d81b60608201528486820152a151908152f35b508015156001146111c1565b508054821633146111ad565b5050346102de57816003193601126102de5760015490516001600160a01b039091168152602090f35b5050346102de57816003193601126102de57600b5490516001600160a01b039091168152602090f35b5050346102de576020906103076112ab36611615565b50505061208d565b5050346102de57816003193601126102de57600f5490516001600160a01b039091168152602090f35b83346104155760a0366003190112610415576112f66115b0565b506112ff6115cb565b506113086115ff565b5080f35b9190503461047957602090816003193601126114935782356001600160a01b03818116918290036106235782516303e1469160e61b815284818781865afa90811561148957879161144f575b501633036113fd578285918584518094819363307a00cd60e21b83525af19081156113f35785916113c6575b5061138d578380f35b5162461bcd60e51b815291820152601560248201527418da185b99d9481b9bdd08185d5d1a1bdc9a5e9959605a1b604482015260649150fd5b90508281813d83116113ec575b6113dd8183611805565b81010312610627575138611384565b503d6113d3565b82513d87823e3d90fd5b505162461bcd60e51b815291820152602760248201527f6f6e6c7920756e6974726f6c6c65722061646d696e2063616e206368616e676560448201526620627261696e7360c81b606482015260849150fd5b90508481813d8311611482575b6114668183611805565b8101031261147e5751818116810361147e5738611358565b8680fd5b503d61145c565b84513d89823e3d90fd5b8380fd5b5050346102de57806003193601126102de5790817f71aec636243f9709bb0007ae15e9afb8150ab01716d75fd7573be5cc096e03b060a060209461154d6114dc6115b0565b956114e56115e1565b928391600180871b0380991698898252600a8b5261150860ff8484205416613a41565b80600b541633148015611589575b61151f90613a9e565b8154163314801561157d575b61153490613afa565b888152600d8a52209060ff801983541691151516179055565b83519485526060868601526006606086015265426f72726f7760d01b60808601521515938484820152a151908152f35b5082151560011461152b565b50815481163314611516565b8490346102de57816003193601126102de5780600160209252f35b600435906001600160a01b03821682036115c657565b600080fd5b602435906001600160a01b03821682036115c657565b6024359081151582036115c657565b6004359081151582036115c657565b604435906001600160a01b03821682036115c657565b60809060031901126115c6576001600160a01b0360043581811681036115c6579160243582811681036115c6579160443590811681036115c6579060643590565b60809060031901126115c6576001600160a01b039060043582811681036115c6579160243590811681036115c657906044359060643590565b60609060031901126115c6576001600160a01b039060043582811681036115c6579160243590811681036115c6579060443590565b80548210156116dc5760005260206000200190600090565b634e487b7160e01b600052603260045260246000fd5b60a09060031901126115c6576001600160a01b039060043582811681036115c6579160243581811681036115c6579160443582811681036115c6579160643590811681036115c6579060843590565b9181601f840112156115c65782359167ffffffffffffffff83116115c6576020808501948460051b0101116115c657565b6020908160408183019282815285518094520193019160005b828110611799575050505090565b83516001600160a01b03168552938101939281019260010161178b565b6020810190811067ffffffffffffffff8211176117d257604052565b634e487b7160e01b600052604160045260246000fd5b610140810190811067ffffffffffffffff8211176117d257604052565b90601f8019910116810190811067ffffffffffffffff8211176117d257604052565b67ffffffffffffffff81116117d25760051b60200190565b600019811461184e5760010190565b634e487b7160e01b600052601160045260246000fd5b80518210156116dc5760209160051b010190565b6001600160a01b038082166000908152600a602052604081208054919493929160ff1615611975576002918416855201602052600160ff604085205416151514611970576040808420805460ff1916600117905560096020528320805490600160401b82101561195c57826119198361193d9360017f3ab23ab0d51cccc0c3085aec51f99228625aa1a922b3a8ca89a26b0f2027a1a59897960181556116c4565b90919082549060031b9160018060a01b039283811b93849216901b16911916179055565b604080516001600160a01b03928316815292909116602083015290a190565b634e487b7160e01b85526041600452602485fd5b505090565b5050505050600990565b91908260809103126115c6578151916020810151916060604083015192015190565b156119a857565b634e487b7160e01b600052600160045260246000fd5b9190820391821161184e57565b604080516361bfb47160e11b815233600482015290916001600160a01b03818116929091608082602481875afa8015611ccf57600080938192611c99575b50611c4757611c185790611a1e913390611d68565b80611bec575081600052602091600a83526002846000200133600052835260ff84600020541615611be3578360002060ff1981541690556009835283600020938051808686829854938481520190600052866000209260005b88828210611bcb57505050611a8e92500386611805565b845193849560005b878110611b9c575b5050611ab18596600993949596106119a1565b336000525280600020928354946000199586810190811161184e57611b129183611ade611ae893896116c4565b93905492896116c4565b92909360031b1c169082549060031b9160018060a01b039283811b93849216901b16911916179055565b8354938415611b86577fe699a64c18b07ac5b7301aa273f36a2287239eb9501d81950672794afba29a0d95611b7e950191611b4d83836116c4565b815460039190911b9290921b19909116905555516001600160a01b0390911681523360208201529081906040820190565b0390a1600090565b634e487b7160e01b600052603160045260246000fd5b8486611ba88385611864565b511614611bbd57611bb89061183f565b611a96565b9550611ab190506009611a9e565b8554891684526001958601958b955093019201611a77565b50505050600090565b8351600e8152600360208201529384015250600080516020613c0f8339815191529160609150a1600e90565b505050506060816000600080516020613c0f833981519152935191600c835260026020840152820152a1600c90565b855162461bcd60e51b815260206004820152602560248201527f657869744d61726b65743a206765744163636f756e74536e617073686f742066604482015264185a5b195960da1b6064820152608490fd5b915050611cbe91925060803d8111611cc8575b611cb68183611805565b81019061197f565b5090929138611a09565b503d611cac565b85513d6000823e3d90fd5b6001600160a01b03166000818152600c602052604090205460ff16611d1957600052600a60205260ff6040600020541615611d1457600090565b600990565b60405162461bcd60e51b815260206004820152600e60248201526d1b5a5b9d081a5cc81c185d5cd95960921b6044820152606490fd5b90611d5a9291611d68565b80611d655750600090565b90565b6001600160a01b039081166000818152600a60205260408120549094929060ff16156119755760026040862001908416855260205260ff60408520541615611dec57611db39261281b565b9190506012811015611dd85780611dd25750611dcc5790565b50600490565b91505090565b634e487b7160e01b83526021600452602483fd5b50505090565b929160018060a01b038094166000928184526020600d815260409660ff888720541661204957838652600a825260ff88872054161561203d578160028988200182851690818952825260ff8a8920541615611f94575b506024916005541689519283809263fc57d4df60e01b82528860048301525afa908115611f8a578691611f5d575b5015611f5257828552601081528685205480611e9b575b5050611db393949550612b9b565b87516308f7a6e360e31b81528281600481885afa8015611f485786908890611f17575b611ec89250612080565b1015611ed45780611e8d565b60649087519062461bcd60e51b82526004820152601960248201527f6d61726b657420626f72726f77206361702072656163686564000000000000006044820152fd5b50508281813d8311611f41575b611f2e8183611805565b8101031261147e5785611ec89151611ebe565b503d611f24565b89513d89823e3d90fd5b50600d955050505050565b90508181813d8311611f83575b611f748183611805565b81010312610623575138611e76565b503d611f6a565b88513d88823e3d90fd5b905084330361200157611fa78433611878565b6012811015611fed5780611fe257506024918391868952600a835260028b8a20019089528252611fdc60ff8b8a2054166119a1565b91611e48565b985050505050505050565b634e487b7160e01b88526021600452602488fd5b885162461bcd60e51b815260048101849052601560248201527439b2b73232b91036bab9ba1031329031aa37b5b2b760591b6044820152606490fd5b50600996505050505050565b875162461bcd60e51b815260048101839052601060248201526f189bdc9c9bddc81a5cc81c185d5cd95960821b6044820152606490fd5b9190820180921161184e57565b6001600160a01b03166000908152600a602052604090205460ff1615611d1457600090565b919260018060a01b0380931692600094848652602094600a86526040948360ff878a20541615918215612243575b50506122375784516395dd919360e01b815292821660048401528583602481845afa92831561222d5787936121fc575b5061211a90613b3f565b1561217e57501061212a57505090565b60849250519062461bcd60e51b82526004820152602860248201527f43616e206e6f74207265706179206d6f7265207468616e2074686520746f74616044820152676c20626f72726f7760c01b6064820152fd5b61218b9193929450612463565b91905060128110156121e857806121df5750156121d657670de0b6b3a7640000916121c6916006549051906121bf826117b6565b8152612256565b5104106121d05790565b50601190565b50505050600390565b94505050505090565b634e487b7160e01b86526021600452602486fd5b9092508581813d8311612226575b6122148183611805565b8101031261147e57519161211a612110565b503d61220a565b85513d89823e3d90fd5b50505050505050600990565b168852508487205460ff161583386120e0565b90612270916000604051612269816117b6565b5251612291565b6040519061227d826117b6565b815290565b90600160009215171561184e57565b8181029291811591840414171561184e57565b908160209103126115c657516001600160a01b03811681036115c65790565b60ff600b5460b81c166123da5760018060a01b03809116906000928284526020600a815260409160ff83872054161580156123c7575b6123bc578251948286600481635fe3b56760e01b948582525afa958615611489578796612391575b5091809160048694865195869384928352165afa928315612388575090839291869261235b575b5050169116036123555790565b50600290565b61237a9250803d10612381575b6123728183611805565b8101906122a4565b3880612348565b503d612368565b513d87823e3d90fd5b839290839297506123b160049188963d8611612381576123728183611805565b979250509192612321565b505050505050600990565b50838116865260ff8387205416156122f9565b60405162461bcd60e51b815260206004820152600f60248201526e1cd95a5e99481a5cc81c185d5cd959608a1b6044820152606490fd5b919060ff600b5460b01c1661242957611d5a92611d68565b60405162461bcd60e51b81526020600482015260126024820152711d1c985b9cd9995c881a5cc81c185d5cd95960721b6044820152606490fd5b60405161246f816117e8565b6000815260006020820152600060408201526000606082015260006080820152600060a08201526040516124a2816117b6565b6000815260c08201526040516124b7816117b6565b6000815260e08201526040516124cc816117b6565b600081526101008201526040516124e2816117b6565b6000815261012082015260018060a01b03821660005260096020526040600020916040518084602082965493848152019060005260206000209260005b8181106127f957505061253492500384611805565b6005546001600160a01b031660005b84518110156127b6576001600160a01b0361255e8287611864565b516040516361bfb47160e11b81526001600160a01b038616600482015291169190608081602481865afa801561277657600091600091600091600091612793575b506080890152606088015260408701526127825781600052600a602052600160406000200154604051906125d2826117b6565b815260c08601526080850151604051906125eb826117b6565b815260e086015260405163fc57d4df60e01b81526004810183905291602083602481875afa92831561277657600093612742575b508260a08701528215612730576040516126c79361263c826117b6565b815261010087015261266661265a60c088015160e089015190613232565b61010088015190613232565b8061012088015261269460408801519188519061268d670de0b6b3a7640000948592612256565b5104612080565b87526126b36101008801518261268d60608b015160208c015193612256565b91826020890152156126cc575b505061183f565b612543565b61270661272492826126f26101208b015160006040516126eb816117b6565b5251612282565b806040516126ff816117b6565b5204612080565b908160208901526126f261010089015160006040516126eb816117b6565b602086015238806126c0565b50505050505050600d90600090600090565b9092506020813d60201161276e575b8161275e60209383611805565b810103126115c65751913861261f565b3d9150612751565b6040513d6000823e3d90fd5b505050505050600f90600090600090565b925050506127b0915060803d608011611cc857611cb68183611805565b3861259f565b5050509050805160208201518082116000146127e65750508060206127df9251910151906119be565b6000918290565b6127f092506119be565b60009160009190565b84546001600160a01b031683526001948501948894506020909301920161251f565b9160405191612829836117e8565b6000835260006020840152600060408401526000606084015260006080840152600060a084015260405161285c816117b6565b6000815260c0840152604051612871816117b6565b6000815260e0840152604051612886816117b6565b6000815261010084015260405161289c816117b6565b6000815261012084015260018060a01b03841660005260096020526040600020936040518086602082985493848152019060005260206000209260005b818110612b795750506128ee92500386611805565b6005546001600160a01b031660005b8651811015612b4e576001600160a01b036129188289611864565b516040516361bfb47160e11b81526001600160a01b038616600482015291169190608081602481865afa801561277657600091600091600091600091612b2b575b5060808b015260608a01526040890152612b185781600052600a6020526001604060002001546040519061298c826117b6565b815260c08801526080870151604051906129a5826117b6565b815260e088015260405163fc57d4df60e01b815260048101839052602081602481875afa90811561277657600091612ae6575b508060a08901528015612ad257612a8b928791604051906129f8826117b6565b81526101008a015288612a23612a1760c083015160e084015190613232565b61010083015190613232565b9182610120830152612a4b60408301519383519061268d670de0b6b3a7640000968792612256565b8252612a6a6101008301518461268d6060860151602087015193612256565b60208301819052906001600160a01b038a1614612a90575b5050505061183f565b6128fd565b8261268d612ac495610120612aa6950151612256565b908160208b01526126f26101008b015160006040516126eb816117b6565b602088015285388881612a82565b505050505050505050600d90600090600090565b90506020813d602011612b10575b81612b0160209383611805565b810103126115c65751386129d8565b3d9150612af4565b5050505050505050600f90600090600090565b92505050612b48915060803d608011611cc857611cb68183611805565b38612959565b50505050509050805160208201518082116000146127e65750508060206127df9251910151906119be565b84546001600160a01b031683526001948501948a9450602090930192016128d9565b60405191612ba8836117e8565b6000835260006020840152600060408401526000606084015260006080840152600060a0840152604051612bdb816117b6565b6000815260c0840152604051612bf0816117b6565b6000815260e0840152604051612c05816117b6565b60008152610100840152604051612c1b816117b6565b6000815261012084015260018060a01b03821660005260096020526040600020936040518086602082985493848152019060005260206000209260005b818110612ea1575050612c6d92500386611805565b6005546001600160a01b031660005b8651811015612b4e576001600160a01b03612c978289611864565b516040516361bfb47160e11b81526001600160a01b038816600482015291169190608081602481865afa801561277657600091600091600091600091612e7e575b5060808b015260608a01526040890152612b185781600052600a60205260016040600020015460405190612d0b826117b6565b815260c0880152608087015160405190612d24826117b6565b815260e088015260405163fc57d4df60e01b81526004810183905291602083602481875afa92831561277657600093612e4a575b508260a08901528215612ad257604051612e0493612d75826117b6565b8152610100890152612d9f612d9360c08a015160e08b015190613232565b6101008a015190613232565b806101208a0152612dc660408a0151918a519061268d670de0b6b3a7640000948592612256565b8952612de66101008a01518261268d8c6020606082015191015193612256565b60208a01819052916001600160a01b03881614612e0957505061183f565b612c7c565b612e28612e3e92826126f26101208d015160006040516126eb816117b6565b908160208b015261268d876101008c0151612256565b602088015238806126c0565b9092506020813d602011612e76575b81612e6660209383611805565b810103126115c657519138612d58565b3d9150612e59565b92505050612e9b915060803d608011611cc857611cb68183611805565b38612cd8565b84546001600160a01b031683526001948501948a945060209093019201612c58565b929160405192612ed2846117e8565b6000845260006020850152600060408501526000606085015260006080850152600060a0850152604051612f05816117b6565b6000815260c0850152604051612f1a816117b6565b6000815260e0850152604051612f2f816117b6565b60008152610100850152604051612f45816117b6565b6000815261012085015260018060a01b03851660005260096020526040600020946040518087602082995493848152019060005260206000209260005b818110613210575050612f9792500387611805565b6005546001600160a01b031660005b87518110156131e4576001600160a01b03612fc1828a611864565b516040516361bfb47160e11b81526001600160a01b038616600482015291169190608081602481865afa8015612776576000916000916000916000916131c1575b5060808c015260608b015260408a01526131ad5781600052600a60205260016040600020015460405190613035826117b6565b815260c089015260808801516040519061304e826117b6565b815260e089015260405163fc57d4df60e01b815260048101839052602081602481875afa9081156127765760009161317b575b508060a08a0152801561316657613127928791604051906130a1826117b6565b81526101008b0152896130c0612a1760c083015160e084015190613232565b91826101208301526130e860408301519383519061268d670de0b6b3a7640000968792612256565b82526131076101008301518461268d6060860151602087015193612256565b60208301819052906001600160a01b038c161461312c575050505061183f565b612fa6565b8261268d61315895610120613142950151612256565b908160208c015261268d886101008d0151612256565b602089015285388981612a82565b50505050505050505050600d90600090600090565b90506020813d6020116131a5575b8161319660209383611805565b810103126115c6575138613081565b3d9150613189565b505050505050505050600f90600090600090565b925050506131de915060803d608011611cc857611cb68183611805565b38613002565b5050505050509050805160208201518082116000146127e65750508060206127df9251910151906119be565b84546001600160a01b031683526001948501948b945060209093019201612f82565b670de0b6b3a76400009161325891600060405161324e816117b6565b5251905190612291565b046040519061227d826117b6565b909160018060a01b038060055416936040938451928063fc57d4df60e01b9283865216600485015260209283856024818b5afa94851561348357600095613454575b509083911691602487518099819382528560048301525afa958615611ccf57600096613425575b508215801561341d575b61340f578160049186519283809263182df0f560e01b82525afa918215611ccf576000926133dc575b50506133596133749260008651613318816117b6565b5260008651613326816117b6565b5260008651613334816117b6565b52600754865190613344826117b6565b8152865191613352836117b6565b8252613232565b94845190613366826117b6565b8152845191613352836117b6565b9260008351613382816117b6565b5251670de0b6b3a7640000938482029180830486149015171561184e575180156133c6576133bd9351916133b5836117b6565b048152612256565b51049060009190565b634e487b7160e01b600052601260045260246000fd5b81819392933d8311613408575b6133f38183611805565b81010312610415575051613359613374613302565b503d6133e9565b505050505050600d90600090565b5085156132d9565b90958282813d831161344d575b61343c8183611805565b8101031261041557505194386132cf565b503d613432565b90948482813d831161347c575b61346b8183611805565b8101031261041557505193836132a8565b503d613461565b87513d6000823e3d90fd5b6000546001600160a01b0390811633036134f6577fd52b2b9b7e9ee655fcb95d2e5b9e0c9f69e7ef2b8e9d2d0ea78402d576d22e229181604092600554921690816bffffffffffffffffffffffff60a01b8416176005558351921682526020820152a1600090565b5050600080516020613c0f8339815191526060604051600181526010602082015260006040820152a1600190565b6000805490926001600160a01b03929091831633036136c2578216918284526020600a81526040918286209060ff82541615613694578351613565816117b6565b858152845190613574826117b6565b670c7d713b49da0000809252511161366657828515159182613602575b50506135d5576001018054908490558251948552908401528201527f70483e6592cd5182d45ac970e05bc62cdcc90e9d8ef2c2dbe686cf383bcd7fc590606090a190565b5091506060925092836009600080516020613c0f833981519152955193600d8552840152820152a1600d90565b602492506005541685519283809263fc57d4df60e01b82528a60048301525afa908115611489578791613639575b50158238613591565b90508281813d831161365f575b6136508183611805565b8101031261147e575138613630565b503d613646565b505091506060925092836008600080516020613c0f83398151915295519360068552840152820152a1600690565b505091506060925092836007600080516020613c0f83398151915295519360098552840152820152a1600990565b5050506060600080516020613c0f833981519152916040519060018252600660208301526040820152a1600190565b6000546001600160a01b0316330361373f5760407faeba5a6c40a8ac138134bff1aaa65debf25971188a58804bad717f82f0ec131691600754908060075582519182526020820152a1600090565b50600080516020613c0f833981519152606060405160018152600b602082015260006040820152a1600190565b600080546001600160a01b039392908416330361394e578316808252602090600a8252604060ff8185205416613922578051637f4e225760e11b81526004969084818981875afa8015613918576138e5575b50828552600a8452818520805460ff19166001908117825501859055600e805491865b838110613880575050600160401b82101561386d576001820180825582101561385a57857fcf583bb0c569eb967f806b11601c4cb93c10310485c67add5f8362c2f212321f9697985052600080516020613c2f83398151915201826bffffffffffffffffffffffff60a01b82541617905551908152a190565b634e487b7160e01b865260328852602486fd5b634e487b7160e01b865260418852602486fd5b828852858282600080516020613c2f833981519152015416146138ab576138a69061183f565b6137e1565b845162461bcd60e51b8152808b0188905260146024820152731b585c9ad95d08185b1c9958591e48185919195960621b6044820152606490fd5b8481813d8311613911575b6138fa8183611805565b8101031261062357518015150361062757386137be565b503d6138f0565b83513d88823e3d90fd5b600080516020613c0f83398151915294955060609391506011815193600a8552840152820152a1600a90565b50600080516020613c0f8339815191529192506060906040519060018252601260208301526040820152a1600190565b91908110156116dc5760051b0190565b356001600160a01b03811681036115c65790565b6000546001600160a01b039081163303613a1357600b80549282166001600160a01b03198416811790915560408051929093166001600160a01b0390811683521660208201527f0613b6ee6a04f0d09f390e4d9318894b9f6ac7fd83897cd8d18896ba579c401e9181908101611b7e565b5050600080516020613c0f8339815191526060604051600181526013602082015260006040820152a1600190565b15613a4857565b60405162461bcd60e51b815260206004820152602860248201527f63616e6e6f742070617573652061206d61726b65742074686174206973206e6f6044820152671d081b1a5cdd195960c21b6064820152608490fd5b15613aa557565b60405162461bcd60e51b815260206004820152602760248201527f6f6e6c7920706175736520677561726469616e20616e642061646d696e2063616044820152666e20706175736560c81b6064820152608490fd5b15613b0157565b60405162461bcd60e51b81526020600482015260166024820152756f6e6c792061646d696e2063616e20756e706175736560501b6044820152606490fd5b6001600160a01b03166000818152600a60209081526040822060010154159290919083613bf6575b83613b725750505090565b6040516305cee64160e21b815293508290849060049082905afa918215613be9578192613bb0575b5050670de0b6b3a7640000915014388080611dec565b90915082813d8311613be2575b613bc78183611805565b810103126104155750670de0b6b3a764000090513880613b9a565b503d613bbd565b50604051903d90823e3d90fd5b600d8352604082205460ff1615156001149350613b6756fe45b96fe442630264581b197e84bbada861235052c5a1aadfff9ea4e40a969aa0bb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fda2646970667358221220965ea7488497509ed579883a27f6b9ecf39c79fb7aebcbf119b66234f027fe6864736f6c63430008110033", - "deployedBytecode": "0x608060408181526004918236101561001657600080fd5b600092833560e01c9182627e3dd2146115955750816318c882a5146114975781631d504dc61461130c5781631ededc91146112dc57816321af4569146112b357816324008a621461129557816324a3d6221461126c57816326782247146112435781632d70db7814611175578163317b0b77146110ca578163391957d714610fef5781633bcf7ec114610ef65781633c94786f14610ecf57816341c728b914610ec057816342cbb15c14610ea557816347ef3b3b14610e635781634a58443214610e2b5781634ada90af14610e0c5781634e79238f14610de75781634ef4c3e114610dca5781634fd42e1714610daa57816351dff98914610d4457816352d84d1e14610cff57816355ee1fe114610cce5781635c77860514610cb95781635ec88c7914610c5c5781635f5af1aa14610c365781635fc7e71e14610c16578163607ef6c114610a665781636a56947e14610a505781636d154ea514610a125781636d35bf91146109fb578163731f0c2b146109bd5781637dc0d1d01461099457816387f763031461096d5781638e8f294b146109265781638ebf636414610855578163929fe9a11461080557816394543c15146107d657816394b2294b146107b757816395bf75fd14610451578163a76b3fda14610791578163abfceffc14610718578163ac0b0bb7146106f1578163b0772d0b14610672578163bb82aa5e14610649578163bdcdc2581461062b578163c2998238146104a3578163c488847b1461047d578163c6ac8a4b1461045157508063d02f735114610433578063da3d454c14610418578063dce15449146103bd578063dcfbc0c714610395578063e4028eee1461036d578063e6653f3d14610347578063e875544614610329578063eabe7d911461030e578063ede4edd0146102e25763f851a440146102b857600080fd5b346102de57816003193601126102de57905490516001600160a01b039091168152602090f35b5080fd5b50346102de5760203660031901126102de576020906103076103026115b0565b6119cb565b9051908152f35b50346102de576020906103076103233661168f565b91611d4f565b50346102de57816003193601126102de576020906006549051908152f35b50346102de57816003193601126102de5760209060ff600b5460a81c1690519015158152f35b50346102de57806003193601126102de5760209061030761038c6115b0565b60243590613524565b50346102de57816003193601126102de5760035490516001600160a01b039091168152602090f35b50346102de57806003193601126102de576103d66115b0565b6001600160a01b0390811683526009602052818320805460243594908510156104155750602093610406916116c4565b92905490519260031b1c168152f35b80fd5b50346102de5760209061030761042d3661168f565b91611df2565b50346102de57602090610307610448366116f2565b505050906122c3565b9050346104795782600319360112610479575490516001600160a01b03909116815260209150f35b8280fd5b82843461041557506104976104913661168f565b91613266565b82519182526020820152f35b839150346102de576020806003193601126104795781359267ffffffffffffffff841161041557366023850112156104155783830135926104e384611827565b946104f087519687611805565b8486528386016024809660051b83010191368311610627579580949598979601905b8282106105f65750505083519061052882611827565b9261053587519485611805565b82845261054183611827565b8489019690601f1901368837855b84811061059657505050505083519485948186019282875251809352850193925b82811061057f57505050500390f35b835185528695509381019392810192600101610570565b97989697949695946105bb336001600160a01b036105b48486611864565b5116611878565b60128110156105e457906105d9916105d3828b611864565b5261183f565b98979694959861054f565b634e487b7160e01b8752602185528387fd5b969795969395949381356001600160a01b0381168103610623578152949796959394908801908801610512565b8580fd5b8480fd5b5050346102de5760209061030761064136611615565b929050612411565b5050346102de57816003193601126102de5760025490516001600160a01b039091168152602090f35b8284346104155780600319360112610415578151918291600e54808552602080950194600e8352600080516020613c2f83398151915292905b8282106106d1576106cd86866106c3828b0383611805565b5191829182611772565b0390f35b83546001600160a01b0316875295860195600193840193909101906106ab565b5050346102de57816003193601126102de5760209060ff600b5460b81c1690519015158152f35b5050346102de5760209081600319360112610479576001600160a01b03928361073f6115b0565b16815260098352818120938251908194808754938481520196845280842093915b838310610778576106cd87876106c3828c0383611805565b8454811688529681019660019485019490920191610760565b5050346102de5760203660031901126102de576020906103076107b26115b0565b61376c565b5050346102de57816003193601126102de576020906008549051908152f35b5050346102de5760203660031901126102de576020906107fc6107f76115b0565b613b3f565b90519015158152f35b5050346102de57806003193601126102de5760ff816020936108256115b0565b6001600160a01b03806108366115cb565b168352600a875260028484200191168252855220541690519015158152f35b5050346102de5760203660031901126102de57906020916108746115f0565b600b54926001600160a01b03903382861614801561091a575b61089690613a9e565b54163314801561090e575b6108aa90613afa565b15159160ff60b01b8360b01b169060ff60b01b191617600b557f27ee2b767de43e8b48d1666d8c451a273fbf857e760fda6e95d0d582f68534bc60808251838152600884820152672a3930b739b332b960c11b60608201528486820152a151908152f35b508015156001146108a1565b5080548216331461088d565b5050346102de5760203660031901126102de579081906001600160a01b0361094c6115b0565b168152600a60205220600160ff825416910154825191151582526020820152f35b5050346102de57816003193601126102de5760209060ff600b5460b01c1690519015158152f35b5050346102de57816003193601126102de5760055490516001600160a01b039091168152602090f35b5050346102de5760203660031901126102de5760209160ff9082906001600160a01b036109e86115b0565b168152600c855220541690519015158152f35b833461041557610a0a366116f2565b505050505080f35b5050346102de5760203660031901126102de5760209160ff9082906001600160a01b03610a3d6115b0565b168152600d855220541690519015158152f35b833461041557610a5f36611615565b5050505080f35b9190503461047957806003193601126104795767ffffffffffffffff91803583811161062757610a999036908301611741565b909360243590811161062357610ab29036908401611741565b909160018060a01b03938488541633148015610c09575b15610ba85781151580610b9f575b15610b6c5750865b818110610aea578780f35b80610af9610b6792858761397e565b3586610b0e610b0984878d61397e565b61398e565b168a5260209060108252888b20557f6f1951b2aad10f3fc81b86d91105b413a5b3f847a34bbc5ce1904201b14438f6610b4b610b0984878d61397e565b9188610b5885898b61397e565b35938b519485521692a261183f565b610adf565b606490602087519162461bcd60e51b8352820152600d60248201526c1a5b9d985b1a59081a5b9c1d5d609a1b6044820152fd5b50828214610ad7565b608490602087519162461bcd60e51b8352820152603560248201527f6f6e6c792061646d696e206f7220626f72726f772063617020677561726469616044820152746e2063616e2073657420626f72726f77206361707360581b6064820152fd5b5084600f54163314610ac9565b5050346102de57602090610307610c2c366116f2565b93909291506120b2565b5050346102de5760203660031901126102de57602090610307610c576115b0565b6139a2565b8383346102de5760203660031901126102de57610c7f610c7a6115b0565b612463565b919290936012841015610ca657505191825260208201929092526040810191909152606090f35b634e487b7160e01b815260218652602490fd5b833461041557610cc83661168f565b50505080f35b9050346104795760203660031901126104795735916001600160a01b0383168303610415575061030760209261348e565b9050346104795760203660031901126104795735600e5481101561047957600e6020935260018060a01b0390600080516020613c2f8339815191520154169051908152f35b9190503461047957610d5536611656565b159250905081610da0575b50610d69578280f35b906020606492519162461bcd60e51b8352820152601160248201527072656465656d546f6b656e73207a65726f60781b6044820152fd5b9050151538610d60565b8284346104155760203660031901126104155750610307602092356136f1565b5050346102de57602090610307610de03661168f565b5050611cda565b8383346102de57610c7f610dfa36611656565b9290916001600160a01b031690612ec3565b5050346102de57816003193601126102de576020906007549051908152f35b5050346102de5760203660031901126102de5760209181906001600160a01b03610e536115b0565b1681526010845220549051908152f35b83346104155760c036600319011261041557610e7d6115b0565b50610e866115cb565b50610e8f6115ff565b506064356001600160a01b038116036104155780f35b5050346102de57816003193601126102de5760209051438152f35b833461041557610a5f36611656565b5050346102de57816003193601126102de5760209060ff600b5460a01c1690519015158152f35b8383346102de57806003193601126102de577f71aec636243f9709bb0007ae15e9afb8150ab01716d75fd7573be5cc096e03b060a082602095610fab610f3a6115b0565b96610f436115e1565b938491600180881b03809a16998a8252600a8c52610f6660ff8484205416613a41565b80600b541633148015610fe3575b610f7d90613a9e565b81541633148015610fd7575b610f9290613afa565b898152600c8b52209060ff801983541691151516179055565b8451958652606087870152606086015263135a5b9d60e21b60808601521515938484820152a151908152f35b50821515600114610f89565b50815481163314610f74565b839150346102de5760203660031901126102de5761100b6115b0565b82546001600160a01b039290831633036110785750600f80546001600160a01b031981168484161790915593516001600160a01b039290941682168452166020830152907feda98690e518e9a05f8ec6837663e188211b2da8f4906648b323f2c1d4434e2990604090a180f35b608490602086519162461bcd60e51b8352820152602660248201527f6f6e6c792061646d696e2063616e2073657420626f72726f772063617020677560448201526530b93234b0b760d11b6064820152fd5b839150346102de5760203660031901126102de578154813591906001600160a01b031633036111325750917f3b9670cf975d26958e754b57098eaa2ac914d8d2a31b83257997b9f346110fd9816020946006549080600655825191825286820152a151908152f35b606490602085519162461bcd60e51b8352820152601f60248201527f6f6e6c792061646d696e2063616e2073657420636c6f736520666163746f72006044820152fd5b5050346102de5760203660031901126102de57906020916111946115f0565b600b54926001600160a01b039033828616148015611237575b6111b690613a9e565b54163314801561122b575b6111ca90613afa565b15159160ff60b81b8360b81b169060ff60b81b191617600b557f27ee2b767de43e8b48d1666d8c451a273fbf857e760fda6e95d0d582f68534bc60808251838152600584820152645365697a6560d81b60608201528486820152a151908152f35b508015156001146111c1565b508054821633146111ad565b5050346102de57816003193601126102de5760015490516001600160a01b039091168152602090f35b5050346102de57816003193601126102de57600b5490516001600160a01b039091168152602090f35b5050346102de576020906103076112ab36611615565b50505061208d565b5050346102de57816003193601126102de57600f5490516001600160a01b039091168152602090f35b83346104155760a0366003190112610415576112f66115b0565b506112ff6115cb565b506113086115ff565b5080f35b9190503461047957602090816003193601126114935782356001600160a01b03818116918290036106235782516303e1469160e61b815284818781865afa90811561148957879161144f575b501633036113fd578285918584518094819363307a00cd60e21b83525af19081156113f35785916113c6575b5061138d578380f35b5162461bcd60e51b815291820152601560248201527418da185b99d9481b9bdd08185d5d1a1bdc9a5e9959605a1b604482015260649150fd5b90508281813d83116113ec575b6113dd8183611805565b81010312610627575138611384565b503d6113d3565b82513d87823e3d90fd5b505162461bcd60e51b815291820152602760248201527f6f6e6c7920756e6974726f6c6c65722061646d696e2063616e206368616e676560448201526620627261696e7360c81b606482015260849150fd5b90508481813d8311611482575b6114668183611805565b8101031261147e5751818116810361147e5738611358565b8680fd5b503d61145c565b84513d89823e3d90fd5b8380fd5b5050346102de57806003193601126102de5790817f71aec636243f9709bb0007ae15e9afb8150ab01716d75fd7573be5cc096e03b060a060209461154d6114dc6115b0565b956114e56115e1565b928391600180871b0380991698898252600a8b5261150860ff8484205416613a41565b80600b541633148015611589575b61151f90613a9e565b8154163314801561157d575b61153490613afa565b888152600d8a52209060ff801983541691151516179055565b83519485526060868601526006606086015265426f72726f7760d01b60808601521515938484820152a151908152f35b5082151560011461152b565b50815481163314611516565b8490346102de57816003193601126102de5780600160209252f35b600435906001600160a01b03821682036115c657565b600080fd5b602435906001600160a01b03821682036115c657565b6024359081151582036115c657565b6004359081151582036115c657565b604435906001600160a01b03821682036115c657565b60809060031901126115c6576001600160a01b0360043581811681036115c6579160243582811681036115c6579160443590811681036115c6579060643590565b60809060031901126115c6576001600160a01b039060043582811681036115c6579160243590811681036115c657906044359060643590565b60609060031901126115c6576001600160a01b039060043582811681036115c6579160243590811681036115c6579060443590565b80548210156116dc5760005260206000200190600090565b634e487b7160e01b600052603260045260246000fd5b60a09060031901126115c6576001600160a01b039060043582811681036115c6579160243581811681036115c6579160443582811681036115c6579160643590811681036115c6579060843590565b9181601f840112156115c65782359167ffffffffffffffff83116115c6576020808501948460051b0101116115c657565b6020908160408183019282815285518094520193019160005b828110611799575050505090565b83516001600160a01b03168552938101939281019260010161178b565b6020810190811067ffffffffffffffff8211176117d257604052565b634e487b7160e01b600052604160045260246000fd5b610140810190811067ffffffffffffffff8211176117d257604052565b90601f8019910116810190811067ffffffffffffffff8211176117d257604052565b67ffffffffffffffff81116117d25760051b60200190565b600019811461184e5760010190565b634e487b7160e01b600052601160045260246000fd5b80518210156116dc5760209160051b010190565b6001600160a01b038082166000908152600a602052604081208054919493929160ff1615611975576002918416855201602052600160ff604085205416151514611970576040808420805460ff1916600117905560096020528320805490600160401b82101561195c57826119198361193d9360017f3ab23ab0d51cccc0c3085aec51f99228625aa1a922b3a8ca89a26b0f2027a1a59897960181556116c4565b90919082549060031b9160018060a01b039283811b93849216901b16911916179055565b604080516001600160a01b03928316815292909116602083015290a190565b634e487b7160e01b85526041600452602485fd5b505090565b5050505050600990565b91908260809103126115c6578151916020810151916060604083015192015190565b156119a857565b634e487b7160e01b600052600160045260246000fd5b9190820391821161184e57565b604080516361bfb47160e11b815233600482015290916001600160a01b03818116929091608082602481875afa8015611ccf57600080938192611c99575b50611c4757611c185790611a1e913390611d68565b80611bec575081600052602091600a83526002846000200133600052835260ff84600020541615611be3578360002060ff1981541690556009835283600020938051808686829854938481520190600052866000209260005b88828210611bcb57505050611a8e92500386611805565b845193849560005b878110611b9c575b5050611ab18596600993949596106119a1565b336000525280600020928354946000199586810190811161184e57611b129183611ade611ae893896116c4565b93905492896116c4565b92909360031b1c169082549060031b9160018060a01b039283811b93849216901b16911916179055565b8354938415611b86577fe699a64c18b07ac5b7301aa273f36a2287239eb9501d81950672794afba29a0d95611b7e950191611b4d83836116c4565b815460039190911b9290921b19909116905555516001600160a01b0390911681523360208201529081906040820190565b0390a1600090565b634e487b7160e01b600052603160045260246000fd5b8486611ba88385611864565b511614611bbd57611bb89061183f565b611a96565b9550611ab190506009611a9e565b8554891684526001958601958b955093019201611a77565b50505050600090565b8351600e8152600360208201529384015250600080516020613c0f8339815191529160609150a1600e90565b505050506060816000600080516020613c0f833981519152935191600c835260026020840152820152a1600c90565b855162461bcd60e51b815260206004820152602560248201527f657869744d61726b65743a206765744163636f756e74536e617073686f742066604482015264185a5b195960da1b6064820152608490fd5b915050611cbe91925060803d8111611cc8575b611cb68183611805565b81019061197f565b5090929138611a09565b503d611cac565b85513d6000823e3d90fd5b6001600160a01b03166000818152600c602052604090205460ff16611d1957600052600a60205260ff6040600020541615611d1457600090565b600990565b60405162461bcd60e51b815260206004820152600e60248201526d1b5a5b9d081a5cc81c185d5cd95960921b6044820152606490fd5b90611d5a9291611d68565b80611d655750600090565b90565b6001600160a01b039081166000818152600a60205260408120549094929060ff16156119755760026040862001908416855260205260ff60408520541615611dec57611db39261281b565b9190506012811015611dd85780611dd25750611dcc5790565b50600490565b91505090565b634e487b7160e01b83526021600452602483fd5b50505090565b929160018060a01b038094166000928184526020600d815260409660ff888720541661204957838652600a825260ff88872054161561203d578160028988200182851690818952825260ff8a8920541615611f94575b506024916005541689519283809263fc57d4df60e01b82528860048301525afa908115611f8a578691611f5d575b5015611f5257828552601081528685205480611e9b575b5050611db393949550612b9b565b87516308f7a6e360e31b81528281600481885afa8015611f485786908890611f17575b611ec89250612080565b1015611ed45780611e8d565b60649087519062461bcd60e51b82526004820152601960248201527f6d61726b657420626f72726f77206361702072656163686564000000000000006044820152fd5b50508281813d8311611f41575b611f2e8183611805565b8101031261147e5785611ec89151611ebe565b503d611f24565b89513d89823e3d90fd5b50600d955050505050565b90508181813d8311611f83575b611f748183611805565b81010312610623575138611e76565b503d611f6a565b88513d88823e3d90fd5b905084330361200157611fa78433611878565b6012811015611fed5780611fe257506024918391868952600a835260028b8a20019089528252611fdc60ff8b8a2054166119a1565b91611e48565b985050505050505050565b634e487b7160e01b88526021600452602488fd5b885162461bcd60e51b815260048101849052601560248201527439b2b73232b91036bab9ba1031329031aa37b5b2b760591b6044820152606490fd5b50600996505050505050565b875162461bcd60e51b815260048101839052601060248201526f189bdc9c9bddc81a5cc81c185d5cd95960821b6044820152606490fd5b9190820180921161184e57565b6001600160a01b03166000908152600a602052604090205460ff1615611d1457600090565b919260018060a01b0380931692600094848652602094600a86526040948360ff878a20541615918215612243575b50506122375784516395dd919360e01b815292821660048401528583602481845afa92831561222d5787936121fc575b5061211a90613b3f565b1561217e57501061212a57505090565b60849250519062461bcd60e51b82526004820152602860248201527f43616e206e6f74207265706179206d6f7265207468616e2074686520746f74616044820152676c20626f72726f7760c01b6064820152fd5b61218b9193929450612463565b91905060128110156121e857806121df5750156121d657670de0b6b3a7640000916121c6916006549051906121bf826117b6565b8152612256565b5104106121d05790565b50601190565b50505050600390565b94505050505090565b634e487b7160e01b86526021600452602486fd5b9092508581813d8311612226575b6122148183611805565b8101031261147e57519161211a612110565b503d61220a565b85513d89823e3d90fd5b50505050505050600990565b168852508487205460ff161583386120e0565b90612270916000604051612269816117b6565b5251612291565b6040519061227d826117b6565b815290565b90600160009215171561184e57565b8181029291811591840414171561184e57565b908160209103126115c657516001600160a01b03811681036115c65790565b60ff600b5460b81c166123da5760018060a01b03809116906000928284526020600a815260409160ff83872054161580156123c7575b6123bc578251948286600481635fe3b56760e01b948582525afa958615611489578796612391575b5091809160048694865195869384928352165afa928315612388575090839291869261235b575b5050169116036123555790565b50600290565b61237a9250803d10612381575b6123728183611805565b8101906122a4565b3880612348565b503d612368565b513d87823e3d90fd5b839290839297506123b160049188963d8611612381576123728183611805565b979250509192612321565b505050505050600990565b50838116865260ff8387205416156122f9565b60405162461bcd60e51b815260206004820152600f60248201526e1cd95a5e99481a5cc81c185d5cd959608a1b6044820152606490fd5b919060ff600b5460b01c1661242957611d5a92611d68565b60405162461bcd60e51b81526020600482015260126024820152711d1c985b9cd9995c881a5cc81c185d5cd95960721b6044820152606490fd5b60405161246f816117e8565b6000815260006020820152600060408201526000606082015260006080820152600060a08201526040516124a2816117b6565b6000815260c08201526040516124b7816117b6565b6000815260e08201526040516124cc816117b6565b600081526101008201526040516124e2816117b6565b6000815261012082015260018060a01b03821660005260096020526040600020916040518084602082965493848152019060005260206000209260005b8181106127f957505061253492500384611805565b6005546001600160a01b031660005b84518110156127b6576001600160a01b0361255e8287611864565b516040516361bfb47160e11b81526001600160a01b038616600482015291169190608081602481865afa801561277657600091600091600091600091612793575b506080890152606088015260408701526127825781600052600a602052600160406000200154604051906125d2826117b6565b815260c08601526080850151604051906125eb826117b6565b815260e086015260405163fc57d4df60e01b81526004810183905291602083602481875afa92831561277657600093612742575b508260a08701528215612730576040516126c79361263c826117b6565b815261010087015261266661265a60c088015160e089015190613232565b61010088015190613232565b8061012088015261269460408801519188519061268d670de0b6b3a7640000948592612256565b5104612080565b87526126b36101008801518261268d60608b015160208c015193612256565b91826020890152156126cc575b505061183f565b612543565b61270661272492826126f26101208b015160006040516126eb816117b6565b5251612282565b806040516126ff816117b6565b5204612080565b908160208901526126f261010089015160006040516126eb816117b6565b602086015238806126c0565b50505050505050600d90600090600090565b9092506020813d60201161276e575b8161275e60209383611805565b810103126115c65751913861261f565b3d9150612751565b6040513d6000823e3d90fd5b505050505050600f90600090600090565b925050506127b0915060803d608011611cc857611cb68183611805565b3861259f565b5050509050805160208201518082116000146127e65750508060206127df9251910151906119be565b6000918290565b6127f092506119be565b60009160009190565b84546001600160a01b031683526001948501948894506020909301920161251f565b9160405191612829836117e8565b6000835260006020840152600060408401526000606084015260006080840152600060a084015260405161285c816117b6565b6000815260c0840152604051612871816117b6565b6000815260e0840152604051612886816117b6565b6000815261010084015260405161289c816117b6565b6000815261012084015260018060a01b03841660005260096020526040600020936040518086602082985493848152019060005260206000209260005b818110612b795750506128ee92500386611805565b6005546001600160a01b031660005b8651811015612b4e576001600160a01b036129188289611864565b516040516361bfb47160e11b81526001600160a01b038616600482015291169190608081602481865afa801561277657600091600091600091600091612b2b575b5060808b015260608a01526040890152612b185781600052600a6020526001604060002001546040519061298c826117b6565b815260c08801526080870151604051906129a5826117b6565b815260e088015260405163fc57d4df60e01b815260048101839052602081602481875afa90811561277657600091612ae6575b508060a08901528015612ad257612a8b928791604051906129f8826117b6565b81526101008a015288612a23612a1760c083015160e084015190613232565b61010083015190613232565b9182610120830152612a4b60408301519383519061268d670de0b6b3a7640000968792612256565b8252612a6a6101008301518461268d6060860151602087015193612256565b60208301819052906001600160a01b038a1614612a90575b5050505061183f565b6128fd565b8261268d612ac495610120612aa6950151612256565b908160208b01526126f26101008b015160006040516126eb816117b6565b602088015285388881612a82565b505050505050505050600d90600090600090565b90506020813d602011612b10575b81612b0160209383611805565b810103126115c65751386129d8565b3d9150612af4565b5050505050505050600f90600090600090565b92505050612b48915060803d608011611cc857611cb68183611805565b38612959565b50505050509050805160208201518082116000146127e65750508060206127df9251910151906119be565b84546001600160a01b031683526001948501948a9450602090930192016128d9565b60405191612ba8836117e8565b6000835260006020840152600060408401526000606084015260006080840152600060a0840152604051612bdb816117b6565b6000815260c0840152604051612bf0816117b6565b6000815260e0840152604051612c05816117b6565b60008152610100840152604051612c1b816117b6565b6000815261012084015260018060a01b03821660005260096020526040600020936040518086602082985493848152019060005260206000209260005b818110612ea1575050612c6d92500386611805565b6005546001600160a01b031660005b8651811015612b4e576001600160a01b03612c978289611864565b516040516361bfb47160e11b81526001600160a01b038816600482015291169190608081602481865afa801561277657600091600091600091600091612e7e575b5060808b015260608a01526040890152612b185781600052600a60205260016040600020015460405190612d0b826117b6565b815260c0880152608087015160405190612d24826117b6565b815260e088015260405163fc57d4df60e01b81526004810183905291602083602481875afa92831561277657600093612e4a575b508260a08901528215612ad257604051612e0493612d75826117b6565b8152610100890152612d9f612d9360c08a015160e08b015190613232565b6101008a015190613232565b806101208a0152612dc660408a0151918a519061268d670de0b6b3a7640000948592612256565b8952612de66101008a01518261268d8c6020606082015191015193612256565b60208a01819052916001600160a01b03881614612e0957505061183f565b612c7c565b612e28612e3e92826126f26101208d015160006040516126eb816117b6565b908160208b015261268d876101008c0151612256565b602088015238806126c0565b9092506020813d602011612e76575b81612e6660209383611805565b810103126115c657519138612d58565b3d9150612e59565b92505050612e9b915060803d608011611cc857611cb68183611805565b38612cd8565b84546001600160a01b031683526001948501948a945060209093019201612c58565b929160405192612ed2846117e8565b6000845260006020850152600060408501526000606085015260006080850152600060a0850152604051612f05816117b6565b6000815260c0850152604051612f1a816117b6565b6000815260e0850152604051612f2f816117b6565b60008152610100850152604051612f45816117b6565b6000815261012085015260018060a01b03851660005260096020526040600020946040518087602082995493848152019060005260206000209260005b818110613210575050612f9792500387611805565b6005546001600160a01b031660005b87518110156131e4576001600160a01b03612fc1828a611864565b516040516361bfb47160e11b81526001600160a01b038616600482015291169190608081602481865afa8015612776576000916000916000916000916131c1575b5060808c015260608b015260408a01526131ad5781600052600a60205260016040600020015460405190613035826117b6565b815260c089015260808801516040519061304e826117b6565b815260e089015260405163fc57d4df60e01b815260048101839052602081602481875afa9081156127765760009161317b575b508060a08a0152801561316657613127928791604051906130a1826117b6565b81526101008b0152896130c0612a1760c083015160e084015190613232565b91826101208301526130e860408301519383519061268d670de0b6b3a7640000968792612256565b82526131076101008301518461268d6060860151602087015193612256565b60208301819052906001600160a01b038c161461312c575050505061183f565b612fa6565b8261268d61315895610120613142950151612256565b908160208c015261268d886101008d0151612256565b602089015285388981612a82565b50505050505050505050600d90600090600090565b90506020813d6020116131a5575b8161319660209383611805565b810103126115c6575138613081565b3d9150613189565b505050505050505050600f90600090600090565b925050506131de915060803d608011611cc857611cb68183611805565b38613002565b5050505050509050805160208201518082116000146127e65750508060206127df9251910151906119be565b84546001600160a01b031683526001948501948b945060209093019201612f82565b670de0b6b3a76400009161325891600060405161324e816117b6565b5251905190612291565b046040519061227d826117b6565b909160018060a01b038060055416936040938451928063fc57d4df60e01b9283865216600485015260209283856024818b5afa94851561348357600095613454575b509083911691602487518099819382528560048301525afa958615611ccf57600096613425575b508215801561341d575b61340f578160049186519283809263182df0f560e01b82525afa918215611ccf576000926133dc575b50506133596133749260008651613318816117b6565b5260008651613326816117b6565b5260008651613334816117b6565b52600754865190613344826117b6565b8152865191613352836117b6565b8252613232565b94845190613366826117b6565b8152845191613352836117b6565b9260008351613382816117b6565b5251670de0b6b3a7640000938482029180830486149015171561184e575180156133c6576133bd9351916133b5836117b6565b048152612256565b51049060009190565b634e487b7160e01b600052601260045260246000fd5b81819392933d8311613408575b6133f38183611805565b81010312610415575051613359613374613302565b503d6133e9565b505050505050600d90600090565b5085156132d9565b90958282813d831161344d575b61343c8183611805565b8101031261041557505194386132cf565b503d613432565b90948482813d831161347c575b61346b8183611805565b8101031261041557505193836132a8565b503d613461565b87513d6000823e3d90fd5b6000546001600160a01b0390811633036134f6577fd52b2b9b7e9ee655fcb95d2e5b9e0c9f69e7ef2b8e9d2d0ea78402d576d22e229181604092600554921690816bffffffffffffffffffffffff60a01b8416176005558351921682526020820152a1600090565b5050600080516020613c0f8339815191526060604051600181526010602082015260006040820152a1600190565b6000805490926001600160a01b03929091831633036136c2578216918284526020600a81526040918286209060ff82541615613694578351613565816117b6565b858152845190613574826117b6565b670c7d713b49da0000809252511161366657828515159182613602575b50506135d5576001018054908490558251948552908401528201527f70483e6592cd5182d45ac970e05bc62cdcc90e9d8ef2c2dbe686cf383bcd7fc590606090a190565b5091506060925092836009600080516020613c0f833981519152955193600d8552840152820152a1600d90565b602492506005541685519283809263fc57d4df60e01b82528a60048301525afa908115611489578791613639575b50158238613591565b90508281813d831161365f575b6136508183611805565b8101031261147e575138613630565b503d613646565b505091506060925092836008600080516020613c0f83398151915295519360068552840152820152a1600690565b505091506060925092836007600080516020613c0f83398151915295519360098552840152820152a1600990565b5050506060600080516020613c0f833981519152916040519060018252600660208301526040820152a1600190565b6000546001600160a01b0316330361373f5760407faeba5a6c40a8ac138134bff1aaa65debf25971188a58804bad717f82f0ec131691600754908060075582519182526020820152a1600090565b50600080516020613c0f833981519152606060405160018152600b602082015260006040820152a1600190565b600080546001600160a01b039392908416330361394e578316808252602090600a8252604060ff8185205416613922578051637f4e225760e11b81526004969084818981875afa8015613918576138e5575b50828552600a8452818520805460ff19166001908117825501859055600e805491865b838110613880575050600160401b82101561386d576001820180825582101561385a57857fcf583bb0c569eb967f806b11601c4cb93c10310485c67add5f8362c2f212321f9697985052600080516020613c2f83398151915201826bffffffffffffffffffffffff60a01b82541617905551908152a190565b634e487b7160e01b865260328852602486fd5b634e487b7160e01b865260418852602486fd5b828852858282600080516020613c2f833981519152015416146138ab576138a69061183f565b6137e1565b845162461bcd60e51b8152808b0188905260146024820152731b585c9ad95d08185b1c9958591e48185919195960621b6044820152606490fd5b8481813d8311613911575b6138fa8183611805565b8101031261062357518015150361062757386137be565b503d6138f0565b83513d88823e3d90fd5b600080516020613c0f83398151915294955060609391506011815193600a8552840152820152a1600a90565b50600080516020613c0f8339815191529192506060906040519060018252601260208301526040820152a1600190565b91908110156116dc5760051b0190565b356001600160a01b03811681036115c65790565b6000546001600160a01b039081163303613a1357600b80549282166001600160a01b03198416811790915560408051929093166001600160a01b0390811683521660208201527f0613b6ee6a04f0d09f390e4d9318894b9f6ac7fd83897cd8d18896ba579c401e9181908101611b7e565b5050600080516020613c0f8339815191526060604051600181526013602082015260006040820152a1600190565b15613a4857565b60405162461bcd60e51b815260206004820152602860248201527f63616e6e6f742070617573652061206d61726b65742074686174206973206e6f6044820152671d081b1a5cdd195960c21b6064820152608490fd5b15613aa557565b60405162461bcd60e51b815260206004820152602760248201527f6f6e6c7920706175736520677561726469616e20616e642061646d696e2063616044820152666e20706175736560c81b6064820152608490fd5b15613b0157565b60405162461bcd60e51b81526020600482015260166024820152756f6e6c792061646d696e2063616e20756e706175736560501b6044820152606490fd5b6001600160a01b03166000818152600a60209081526040822060010154159290919083613bf6575b83613b725750505090565b6040516305cee64160e21b815293508290849060049082905afa918215613be9578192613bb0575b5050670de0b6b3a7640000915014388080611dec565b90915082813d8311613be2575b613bc78183611805565b810103126104155750670de0b6b3a764000090513880613b9a565b503d613bbd565b50604051903d90823e3d90fd5b600d8352604082205460ff1615156001149350613b6756fe45b96fe442630264581b197e84bbada861235052c5a1aadfff9ea4e40a969aa0bb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fda2646970667358221220965ea7488497509ed579883a27f6b9ecf39c79fb7aebcbf119b66234f027fe6864736f6c63430008110033", + "bytecode": "0x6080346200009b57601f6200540d38819003918201601f19168301916001600160401b03831184841017620000a05780849260409485528339810103126200009b5780516001600160a01b0391828216918290036200009b57602001519182168092036200009b5760018060a01b0319903382600054161760005581600454161760045560065416176006556040516153569081620000b78239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe608080604052600436101561001357600080fd5b60003560e01c9081627e3dd214611f455750806318c882a514611e405780631c3db2e014611e035780631d504dc614611c8c5780631ededc9114611c6157806321af456914611c3857806324008a6214611c1c57806324a3d62214611bf35780632678224714611bca57806327efe3cb14611ac45780632d70db78146119f3578063317b0b7714611945578063391957d7146118655780633bcf7ec1146117625780633c94786f1461173c57806341c728b91461172e57806342cbb15c14611713578063467050f9146116ea57806347ef3b3b146116aa5780634a584432146116705780634ada90af146116525780634e79238f1461162f5780634ef4c3e1146116155780634fd42e17146115f757806351dff9891461159457806352d84d1e1461154b57806355ee1fe11461151c578063598ee1cb146114685780635c7786051461145a5780635ec88c791461140d5780635f5af1aa146113ea5780635fc7e71e146113cd578063607ef6c1146112185780636810dfa614610fa75780636a56947e14610f995780636aa875b514610f5f5780636b79c38d14610f0d5780636d154ea514610ece5780636d35bf9114610ec0578063731f0c2b14610e81578063741b252514610e605780637dc0d1d014610e3757806387f7630314610e115780638c57804e14610dbf5780638e8f294b14610d775780638ebf636414610ca3578063929fe9a114610c4b57806394543c1514610c1e57806394b2294b14610c0057806395bf75fd146105fe578063986ab83814610bc6578063a76b3fda14610ba3578063a7f0e23114610b7a578063a8b43948146108af578063abfceffc14610875578063ac0b0bb71461084f578063b0772d0b14610823578063b21be7fd146107d2578063bb82aa5e146107a9578063bdcdc2581461078d578063bea6b8b814610753578063c29982381461064c578063c488847b14610627578063c6ac8a4b146105fe578063ca0af043146105ad578063cc7ebdc414610573578063d02f735114610556578063da3d454c1461053d578063dce15449146104e4578063dcfbc0c7146104bb578063e4028eee14610494578063e6653f3d1461046e578063e875544614610450578063e9af029214610424578063eabe7d911461040b578063ede4edd0146103e0578063f4a433c0146103a65763f851a4401461037857600080fd5b346103a15760003660031901126103a1576000546040516001600160a01b039091168152602090f35b600080fd5b346103a15760203660031901126103a1576001600160a01b036103c7611f5f565b1660005260176020526020604060002054604051908152f35b346103a15760203660031901126103a15760206104036103fe611f5f565b61251b565b604051908152f35b346103a157602061040361041e3661214c565b91612875565b346103a15760203660031901126103a15761044e610440611f5f565b6104486122d1565b90614e60565b005b346103a15760003660031901126103a1576020600754604051908152f35b346103a15760003660031901126103a157602060ff600c5460a81c166040519015158152f35b346103a15760403660031901126103a15760206104036104b2611f5f565b602435906140de565b346103a15760003660031901126103a1576003546040516001600160a01b039091168152602090f35b346103a15760403660031901126103a1576104fd611f5f565b6024359060018060a01b03809116600052600a602052604060002080548310156103a15760209261052d91612181565b9190546040519260031b1c168152f35b346103a15760206104036105503661214c565b9161291f565b346103a1576020610403610569366121af565b5092919091612f71565b346103a15760203660031901126103a1576001600160a01b03610594611f5f565b1660005260166020526020604060002054604051908152f35b346103a15760403660031901126103a1576105c6611f5f565b6105ce611f75565b9060018060a01b038091166000526015602052604060002091166000526020526020604060002054604051908152f35b346103a15760003660031901126103a1576004546040516001600160a01b039091168152602090f35b346103a157604061064061063a3661214c565b91613e2a565b82519182526020820152f35b346103a1576020806003193601126103a15760043567ffffffffffffffff81116103a15761067e903690600401612064565b80516106898161204c565b90610697604051928361202a565b8082526106a38161204c565b8285019390601f190136853760005b8281106106fd5750505090604051928392818401908285525180915260408401929160005b8281106106e657505050500390f35b8351855286955093810193928101926001016106d7565b61071a336001600160a01b0361071384866123b4565b51166123c8565b90601282101561073d576107389161073282876123b4565b5261238f565b6106b2565b634e487b7160e01b600052602160045260246000fd5b346103a15760203660031901126103a1576001600160a01b03610774611f5f565b16600052601a6020526020604060002054604051908152f35b346103a15760206104036107a0366120d2565b929190916130e6565b346103a15760003660031901126103a1576002546040516001600160a01b039091168152602090f35b346103a15760403660031901126103a1576107eb611f5f565b6107f3611f75565b9060018060a01b038091166000526014602052604060002091166000526020526020604060002054604051908152f35b346103a15760003660031901126103a15761084b61083f6122d1565b6040519182918261228d565b0390f35b346103a15760003660031901126103a157602060ff600c5460b81c166040519015158152f35b346103a15760203660031901126103a1576001600160a01b03610896611f5f565b16600052600a60205261084b61083f6040600020612337565b346103a15760603660031901126103a15767ffffffffffffffff6004358181116103a1576108e1903690600401612064565b602480358381116103a1576108fa90369060040161222f565b9060449384359081116103a15761091590369060040161222f565b61092561092061519f565b6151c5565b8351938351851480610b70575b15610b1b5760005b85811061094357005b6001600160a01b0361095582846123b4565b51169061096281876123b4565b519161096e82866123b4565b519281600052602090600b825260ff6040600020541615610ad857829081600052826018918282528060406000205403610a90575b50505060005260179384825280604060002054036109ce575b5050506109c9915061238f565b61093a565b60405163aa5af0fd60e01b81528281600481875afa908115610a8457600091610a4f575b50906109c995610a337f20af8e791cc98f74b2d7a391c80980ca8e5aebf3d4060bf581997b6acae2e537949360405190610a2b82611fbf565b8152866149c4565b84600052825280604060002055604051908152a28880806109bc565b928092915083813d8311610a7d575b610a68818361202a565b810103126103a15791519091906109c96109f2565b503d610a5e565b6040513d6000823e3d90fd5b7fdeafccd0c0b768b2529f7dcbbe58e155d6023059150b7490ed4535cc3744b92d92610abb85614715565b84600052825280604060002055604051908152a2818b82816109a3565b60405162461bcd60e51b8152600481018390526019818a01527f636f6d70206d61726b6574206973206e6f74206c697374656400000000000000818d0152606490fd5b60405162461bcd60e51b8152602060048201526029818501527f436f6d7074726f6c6c65723a3a5f736574436f6d7053706565647320696e766181880152681b1a59081a5b9c1d5d60ba1b6064820152608490fd5b5081518514610932565b346103a15760003660031901126103a15760206040516a0c097ce7bc90715b34b9f160241b8152f35b346103a15760203660031901126103a1576020610403610bc1611f5f565b614348565b346103a15760203660031901126103a1576001600160a01b03610be7611f5f565b1660005260196020526020604060002054604051908152f35b346103a15760003660031901126103a1576020600954604051908152f35b346103a15760203660031901126103a1576020610c41610c3c611f5f565b615211565b6040519015158152f35b346103a15760403660031901126103a157610c64611f5f565b6001600160a01b0380610c75611f75565b16600052600b60205260026040600020019116600052602052602060ff604060002054166040519015158152f35b346103a15760203660031901126103a1576020610cbe611f9a565b600c54906001600160a01b0333818416148015610d6a575b610cdf90614674565b6000541633148015610d5e575b610cf5906146d0565b15159060ff60b01b8260b01b169060ff60b01b191617600c557f27ee2b767de43e8b48d1666d8c451a273fbf857e760fda6e95d0d582f68534bc60806040516040815260086040820152672a3930b739b332b960c11b60608201528385820152a1604051908152f35b50801515600114610cec565b5060005481163314610cd6565b346103a15760203660031901126103a1576001600160a01b03610d98611f5f565b16600052600b602052604080600020600160ff825416910154825191151582526020820152f35b346103a15760203660031901126103a1576001600160a01b03610de0611f5f565b166000908152601360209081526040918290205482516001600160e01b038216815260e09190911c91810191909152f35b346103a15760003660031901126103a157602060ff600c5460b01c166040519015158152f35b346103a15760003660031901126103a1576005546040516001600160a01b039091168152602090f35b346103a15760203660031901126103a15761044e610e7c611f5f565b614dd8565b346103a15760203660031901126103a1576001600160a01b03610ea2611f5f565b16600052600d602052602060ff604060002054166040519015158152f35b346103a15761044e366121af565b346103a15760203660031901126103a1576001600160a01b03610eef611f5f565b16600052600e602052602060ff604060002054166040519015158152f35b346103a15760203660031901126103a1576001600160a01b03610f2e611f5f565b166000908152601260209081526040918290205482516001600160e01b038216815260e09190911c91810191909152f35b346103a15760203660031901126103a1576001600160a01b03610f80611f5f565b1660005260186020526020604060002054604051908152f35b346103a15761044e366120d2565b346103a15760803660031901126103a15767ffffffffffffffff6004358181116103a157610fd9903690600401612064565b906024359081116103a157610ff2903690600401612064565b604435918215158093036103a1576064358015158091036103a15760005b83518110156111a9576001600160a01b0361102b82866123b4565b511680600052600b60205260ff604060002054161561116c57600186146110b5575b60018314611065575b506110609061238f565b611010565b94909361107186614715565b60005b84518110156110a8576110a39061109e6001600160a01b0361109683896123b4565b511689614b0b565b61238f565b611074565b5090945092611060611056565b949291936040519363aa5af0fd60e01b85526020856004818a5afa948515610a8457600095611138575b50604051946110ed86611fbf565b85526110f985886149c4565b60005b845181101561112c576111279061109e876001600160a01b0361111f848a6123b4565b51168b614c6c565b6110fc565b5095909492935061104d565b9094506020813d602011611164575b816111546020938361202a565b810103126103a1575193876110df565b3d9150611147565b60405162461bcd60e51b81526020600482015260156024820152741b585c9ad95d081b5d5cdd081899481b1a5cdd1959605a1b6044820152606490fd5b8260005b815181101561044e57611213906001600160a01b03806111cd83866123b4565b5116816111da84876123b4565b51166000526016906111f7602091838352604060002054906150ae565b9261120285886123b4565b51166000525260406000205561238f565b6111ad565b346103a15760403660031901126103a15767ffffffffffffffff6004358181116103a15761124a9036906004016121fe565b916024359081116103a1576112639036906004016121fe565b9260018060a01b03928360005416331480156113c0575b1561135d5781151580611354575b1561131f5760005b82811061129957005b806112a861131a928887614554565b35866112bd6112b8848888614554565b614564565b16600052602090601182526040600020557f6f1951b2aad10f3fc81b86d91105b413a5b3f847a34bbc5ce1904201b14438f66112fd6112b8848888614554565b918861130a858c8b614554565b35936040519485521692a261238f565b611290565b60405162461bcd60e51b815260206004820152600d60248201526c1a5b9d985b1a59081a5b9c1d5d609a1b6044820152606490fd5b50848214611288565b60405162461bcd60e51b815260206004820152603560248201527f6f6e6c792061646d696e206f7220626f72726f772063617020677561726469616044820152746e2063616e2073657420626f72726f77206361707360581b6064820152608490fd5b508360105416331461127a565b346103a15760206104036113e0366121af565b9390929150612d3c565b346103a15760203660031901126103a1576020610403611408611f5f565b614578565b346103a15760203660031901126103a15761142e611429611f5f565b613157565b6012839293101561073d5761084b90604051938493846040919493926060820195825260208201520152565b346103a15761044e3661214c565b346103a15760403660031901126103a157611481611f5f565b7f386537fa92edc3319af95f1f904dcf1900021e4f3f4e08169a577a09076e66b36020602435926114b361092061519f565b6114bc81614dd8565b836114fd576001600160a01b0381166000908152601a835260408120555b6001600160a01b03166000818152601983526040908190208590555193845292a2005b6001600160a01b0381166000908152601a8352604090204390556114da565b346103a15760203660031901126103a1576004356001600160a01b03811681036103a157610403602091614048565b346103a15760203660031901126103a157600435600f548110156103a157600f60005260008051602061530183398151915201546040516001600160a01b039091168152602090f35b346103a1576115a236612113565b1592509050816115ed575b506115b457005b60405162461bcd60e51b815260206004820152601160248201527072656465656d546f6b656e73207a65726f60781b6044820152606490fd5b90501515816115ad565b346103a15760203660031901126103a15760206104036004356142b5565b346103a15760206104036116283661214c565b50906127e8565b346103a15761142e61164036612113565b9290916001600160a01b031690613ad0565b346103a15760003660031901126103a1576020600854604051908152f35b346103a15760203660031901126103a1576001600160a01b03611691611f5f565b1660005260116020526020604060002054604051908152f35b346103a15760c03660031901126103a1576116c3611f5f565b506116cc611f75565b506116d5611fa9565b506064356001600160a01b038116036103a157005b346103a15760003660031901126103a1576006546040516001600160a01b039091168152602090f35b346103a15760003660031901126103a1576020604051438152f35b346103a15761044e36612113565b346103a15760003660031901126103a157602060ff600c5460a01c166040519015158152f35b346103a15760403660031901126103a157602061177d611f5f565b7f71aec636243f9709bb0007ae15e9afb8150ab01716d75fd7573be5cc096e03b060a06117a8611f8b565b600180831b038094169384600052600b86526117cb60ff60406000205416614617565b80600c541633148015611858575b6117e290614674565b600054163314801561184c575b6117f8906146d0565b83600052600d855261181a8160406000209060ff801983541691151516179055565b6040519384526060858501526004606085015263135a5b9d60e21b6080850152151592836040820152a1604051908152f35b508015156001146117ef565b50600054811633146117d9565b346103a15760203660031901126103a15761187e611f5f565b6000546001600160a01b0390811633036118f157601080548383166001600160a01b031982161790915560408051929091166001600160a01b03908116835290921660208201527feda98690e518e9a05f8ec6837663e188211b2da8f4906648b323f2c1d4434e2991819081015b0390a1005b60405162461bcd60e51b815260206004820152602660248201527f6f6e6c792061646d696e2063616e2073657420626f72726f772063617020677560448201526530b93234b0b760d11b6064820152608490fd5b346103a15760203660031901126103a157600054600435906001600160a01b031633036119ae5760407f3b9670cf975d26958e754b57098eaa2ac914d8d2a31b83257997b9f346110fd991600754908060075582519182526020820152a1602060405160008152f35b60405162461bcd60e51b815260206004820152601f60248201527f6f6e6c792061646d696e2063616e2073657420636c6f736520666163746f72006044820152606490fd5b346103a15760203660031901126103a1576020611a0e611f9a565b600c54906001600160a01b0333818416148015611ab7575b611a2f90614674565b6000541633148015611aab575b611a45906146d0565b15159060ff60b81b8260b81b169060ff60b81b191617600c557f27ee2b767de43e8b48d1666d8c451a273fbf857e760fda6e95d0d582f68534bc60806040516040815260056040820152645365697a6560d81b60608201528385820152a1604051908152f35b50801515600114611a3c565b5060005481163314611a26565b346103a15760403660031901126103a157611add611f5f565b602435611ae861519f565b15611b8557611af781836150ae565b611b4057604080516001600160a01b03909316835260208301919091527f98b2f82a3a07f223a0be64b3d0f47711c64dccd1feafb94aa28156b38cd9695c9190819081016118ec565b60405162461bcd60e51b815260206004820152601b60248201527f696e73756666696369656e7420636f6d7020666f72206772616e7400000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601960248201527f6f6e6c792061646d696e2063616e206772616e7420636f6d70000000000000006044820152606490fd5b346103a15760003660031901126103a1576001546040516001600160a01b039091168152602090f35b346103a15760003660031901126103a157600c546040516001600160a01b039091168152602090f35b346103a1576020610403611c2f366120d2565b50919050612c97565b346103a15760003660031901126103a1576010546040516001600160a01b039091168152602090f35b346103a15760a03660031901126103a157611c7a611f5f565b50611c83611f75565b5061044e611fa9565b346103a1576020806003193601126103a1576004356001600160a01b03818116918290036103a1576040516303e1469160e61b81528381600481865afa908115610a8457600091611dcd575b50163303611d78578160009160046040518094819363307a00cd60e21b83525af1908115610a8457600091611d4b575b50611d0f57005b6064906040519062461bcd60e51b82526004820152601560248201527418da185b99d9481b9bdd08185d5d1a1bdc9a5e9959605a1b6044820152fd5b90508181813d8311611d71575b611d62818361202a565b810103126103a1575182611d08565b503d611d58565b60405162461bcd60e51b815260048101839052602760248201527f6f6e6c7920756e6974726f6c6c65722061646d696e2063616e206368616e676560448201526620627261696e7360c81b6064820152608490fd5b90508381813d8311611dfc575b611de4818361202a565b810103126103a1575181811681036103a15784611cd8565b503d611dda565b346103a15760403660031901126103a157611e1c611f5f565b6024359067ffffffffffffffff82116103a15761044861044e923690600401612064565b346103a15760403660031901126103a1576020611e5b611f5f565b7f71aec636243f9709bb0007ae15e9afb8150ab01716d75fd7573be5cc096e03b060a0611e86611f8b565b600180831b038094169384600052600b8652611ea960ff60406000205416614617565b80600c541633148015611f38575b611ec090614674565b6000541633148015611f2c575b611ed6906146d0565b83600052600e8552611ef88160406000209060ff801983541691151516179055565b6040519384526060858501526006606085015265426f72726f7760d01b6080850152151592836040820152a1604051908152f35b50801515600114611ecd565b5060005481163314611eb7565b346103a15760003660031901126103a15780600160209252f35b600435906001600160a01b03821682036103a157565b602435906001600160a01b03821682036103a157565b6024359081151582036103a157565b6004359081151582036103a157565b604435906001600160a01b03821682036103a157565b6020810190811067ffffffffffffffff821117611fdb57604052565b634e487b7160e01b600052604160045260246000fd5b610140810190811067ffffffffffffffff821117611fdb57604052565b6040810190811067ffffffffffffffff821117611fdb57604052565b90601f8019910116810190811067ffffffffffffffff821117611fdb57604052565b67ffffffffffffffff8111611fdb5760051b60200190565b81601f820112156103a15780359161207b8361204c565b92612089604051948561202a565b808452602092838086019260051b8201019283116103a1578301905b8282106120b3575050505090565b81356001600160a01b03811681036103a15781529083019083016120a5565b60809060031901126103a1576001600160a01b0360043581811681036103a1579160243582811681036103a1579160443590811681036103a1579060643590565b60809060031901126103a1576001600160a01b039060043582811681036103a1579160243590811681036103a157906044359060643590565b60609060031901126103a1576001600160a01b039060043582811681036103a1579160243590811681036103a1579060443590565b80548210156121995760005260206000200190600090565b634e487b7160e01b600052603260045260246000fd5b60a09060031901126103a1576001600160a01b039060043582811681036103a1579160243581811681036103a1579160443582811681036103a1579160643590811681036103a1579060843590565b9181601f840112156103a15782359167ffffffffffffffff83116103a1576020808501948460051b0101116103a157565b81601f820112156103a1578035916122468361204c565b92612254604051948561202a565b808452602092838086019260051b8201019283116103a1578301905b82821061227e575050505090565b81358152908301908301612270565b6020908160408183019282815285518094520193019160005b8281106122b4575050505090565b83516001600160a01b0316855293810193928101926001016122a6565b60405190600f548083528260209182820190600f600052600080516020615301833981519152936000905b828210612314575050506123129250038361202a565b565b85546001600160a01b0316845260019586019588955093810193909101906122fc565b9060405191828154918282526020928383019160005283600020936000905b82821061236c575050506123129250038361202a565b85546001600160a01b031684526001958601958895509381019390910190612356565b600019811461239e5760010190565b634e487b7160e01b600052601160045260246000fd5b80518210156121995760209160051b010190565b6001600160a01b038082166000908152600b602052604081208054919493929160ff16156124c5576002918416855201602052600160ff6040852054161515146124c0576040808420805460ff19166001179055600a6020528320805490600160401b8210156124ac57826124698361248d9360017f3ab23ab0d51cccc0c3085aec51f99228625aa1a922b3a8ca89a26b0f2027a1a5989796018155612181565b90919082549060031b9160018060a01b039283811b93849216901b16911916179055565b604080516001600160a01b03928316815292909116602083015290a190565b634e487b7160e01b85526041600452602485fd5b505090565b5050505050600990565b91908260809103126103a1578151916020810151916060604083015192015190565b156124f857565b634e487b7160e01b600052600160045260246000fd5b9190820391821161239e57565b604080516361bfb47160e11b81523360048201526001600160a01b0383811693909190608082602481885afa80156127dd576000809381926127a7575b5061275557612725579061256d913390612895565b806126f9575082600052600b602052600282600020013360005260205260ff826000205416156126f1578160002060ff198154169055600a6020526125b482600020612337565b928351928360005b8181106126c4575b50846125d5929394959650106124f1565b33600052600a60205280600020928354946000199586810190811161239e5761263a91836126066126109389612181565b9390549289612181565b92909360031b1c169082549060031b9160018060a01b039283811b93849216901b16911916179055565b83549384156126ae577fe699a64c18b07ac5b7301aa273f36a2287239eb9501d81950672794afba29a0d956126a69501916126758383612181565b815460039190911b9290921b19909116905555516001600160a01b0390911681523360208201529081906040820190565b0390a1600090565b634e487b7160e01b600052603160045260246000fd5b83856126d0838a6123b4565b5116146126e5576126e09061238f565b6125bc565b909550935084386125c4565b505050600090565b8251600e81526003602082015292830152506000805160206152e18339815191529150606090a1600e90565b5050506000805160206152e183398151915291508060006060925191600c835260026020840152820152a1600c90565b845162461bcd60e51b815260206004820152602560248201527f657869744d61726b65743a206765744163636f756e74536e617073686f742066604482015264185a5b195960da1b6064820152608490fd5b9150506127cc91925060803d81116127d6575b6127c4818361202a565b8101906124cf565b5090929138612558565b503d6127ba565b84513d6000823e3d90fd5b6001600160a01b0381166000818152600d602052604090205491929160ff1661283f57600052600b60205260ff6040600020541615612838578161282e61283393614715565b614b0b565b600090565b5050600990565b60405162461bcd60e51b815260206004820152600e60248201526d1b5a5b9d081a5cc81c185d5cd95960921b6044820152606490fd5b91612881908284612895565b91826124c057612833925061282e81614715565b6001600160a01b039081166000818152600b60205260408120549094929060ff16156124c55760026040862001908416855260205260ff60408520541615612919576128e0926134ba565b919050601281101561290557806128ff57506128f95790565b50600490565b91505090565b634e487b7160e01b83526021600452602483fd5b50505090565b929160018060a01b039182851694600093868552602093600e855260409160ff8388205416612c5357888752600b865260ff838820541615612c4657908589926002858a200181881690818b52835260ff868b20541615612b98575b50906024916005541685519283809263fc57d4df60e01b825260049e8f8301525afa908115612b8e578891612b5d575b5015612b5057818752601186528287205480612a96575b506129ce9082866137f1565b9190506012811015612a835780612a785750612a7057849082519889809263aa5af0fd60e01b82525afa938415612a66578594612a2d575b50612a2a949596505192612a1984611fbf565b8352612a2583826149c4565b614c6c565b90565b90935086813d8311612a5f575b612a44818361202a565b81010312612a5b5794519394859492612a2a612a06565b8380fd5b503d612a3a565b81513d87823e3d90fd5b505050505050565b985050505050505050565b634e487b7160e01b885260218a52602488fd5b83516308f7a6e360e31b815287818c81875afa8015612b465783908a90612b11575b612ac29250612c8a565b1015612ace57386129c2565b825162461bcd60e51b8152808a01879052601960248201527f6d61726b657420626f72726f77206361702072656163686564000000000000006044820152606490fd5b50508781813d8311612b3f575b612b28818361202a565b81010312612b3b5782612ac29151612ab8565b8880fd5b503d612b1e565b85513d8b823e3d90fd5b50600d9750505050505050565b90508681813d8311612b87575b612b74818361202a565b81010312612b835751386129ab565b8780fd5b503d612b6a565b84513d8a823e3d90fd5b915091923303612c0a57612bac86336123c8565b6012811015612bf65780612bea5750868a9392602492858b52600b83526002878c2001908b528252612be360ff878c2054166124f1565b909161297b565b99505050505050505050565b634e487b7160e01b89526021600452602489fd5b835162461bcd60e51b815260048101889052601560248201527439b2b73232b91036bab9ba1031329031aa37b5b2b760591b6044820152606490fd5b5060099750505050505050565b825162461bcd60e51b815260048101879052601060248201526f189bdc9c9bddc81a5cc81c185d5cd95960821b6044820152606490fd5b9190820180921161239e57565b6001600160a01b0381166000818152600b602052604081205490939060ff1615612d335760206004926040519384809263aa5af0fd60e01b82525afa918215612d28578492612cf3575b50612a2a9260405192612a1984611fbf565b9091506020813d8211612d20575b81612d0e6020938361202a565b81010312612a5b575190612a2a612ce1565b3d9150612d01565b6040513d86823e3d90fd5b50505050600990565b919260018060a01b0380931692600094848652602094600b86526040948360ff878a20541615918215612ed1575b5050612ec55784516395dd919360e01b815292821660048401528583602481845afa928315612ebb578793612e86575b50612da490615211565b15612e08575010612db457505090565b60849250519062461bcd60e51b82526004820152602860248201527f43616e206e6f74207265706179206d6f7265207468616e2074686520746f74616044820152676c20626f72726f7760c01b6064820152fd5b612e159193929450613157565b9190506012811015612e725780612e69575015612e6057670de0b6b3a764000091612e5091600754905190612e4982611fbf565b8152612f04565b510410612e5a5790565b50601190565b50505050600390565b94505050505090565b634e487b7160e01b86526021600452602486fd5b9092508581813d8311612eb4575b612e9e818361202a565b81010312612eb0575191612da4612d9a565b8680fd5b503d612e94565b85513d89823e3d90fd5b50505050505050600990565b168852508487205460ff16158338612d6a565b8115612eee570490565b634e487b7160e01b600052601260045260246000fd5b90612f1e916000604051612f1781611fbf565b5251612f3f565b60405190612f2b82611fbf565b815290565b90600160009215171561239e57565b8181029291811591840414171561239e57565b908160209103126103a157516001600160a01b03811681036103a15790565b9291909260ff600c5460b81c166130af5760018060a01b03808216906000958287526020600b815260409160ff838a20541615801561309c575b61308e578251948286600481635fe3b56760e01b948582525afa958615613084578a96613059575b5091809160048694865195869384928352165afa9283156130505750908392918992613023575b50501691160361301a5761282e612a2a9361301483614715565b82614b0b565b50505050600290565b6130429250803d10613049575b61303a818361202a565b810190612f52565b3880612ffa565b503d613030565b513d8a823e3d90fd5b8392908392975061307960049188963d86116130495761303a818361202a565b979250509192612fd3565b84513d8c823e3d90fd5b505050505050505050600990565b50838116895260ff838a20541615612fab565b60405162461bcd60e51b815260206004820152600f60248201526e1cd95a5e99481a5cc81c185d5cd959608a1b6044820152606490fd5b909260ff600c5460b01c1661311d57613100908483612895565b80613116575061282e6128339361301483614715565b9250505090565b60405162461bcd60e51b81526020600482015260126024820152711d1c985b9cd9995c881a5cc81c185d5cd95960721b6044820152606490fd5b60405161316381611ff1565b6000815260006020820152600060408201526000606082015260006080820152600060a082015260405161319681611fbf565b6000815260c08201526040516131ab81611fbf565b6000815260e08201526040516131c081611fbf565b600081526101008201526040516131d681611fbf565b6000815261012082015260018060a01b038216600052600a6020526131fe6040600020612337565b6005549092906001600160a01b031660005b8451811015613477576001600160a01b0361322b82876123b4565b516040516361bfb47160e11b81526001600160a01b038616600482015291169190608081602481865afa8015610a8457600091600091600091600091613454575b506080890152606088015260408701526134435781600052600b6020526001604060002001546040519061329f82611fbf565b815260c08601526080850151604051906132b882611fbf565b815260e086015260405163fc57d4df60e01b81526004810183905291602083602481875afa928315610a845760009361340f575b508260a087015282156133fd576040516133949361330982611fbf565b815261010087015261333361332760c088015160e089015190613df6565b61010088015190613df6565b8061012088015261336160408801519188519061335a670de0b6b3a7640000948592612f04565b5104612c8a565b87526133806101008801518261335a60608b015160208c015193612f04565b9182602089015215613399575b505061238f565b613210565b6133d36133f192826133bf6101208b015160006040516133b881611fbf565b5251612f30565b806040516133cc81611fbf565b5204612c8a565b908160208901526133bf61010089015160006040516133b881611fbf565b6020860152388061338d565b50505050505050600d90600090600090565b9092506020813d60201161343b575b8161342b6020938361202a565b810103126103a1575191386132ec565b3d915061341e565b505050505050600f90600090600090565b92505050613471915060803d6080116127d6576127c4818361202a565b3861326c565b5050509050805160208201518082116000146134a75750508060206134a092519101519061250e565b6000918290565b6134b1925061250e565b60009160009190565b91604051916134c883611ff1565b6000835260006020840152600060408401526000606084015260006080840152600060a08401526040516134fb81611fbf565b6000815260c084015260405161351081611fbf565b6000815260e084015260405161352581611fbf565b6000815261010084015260405161353b81611fbf565b6000815261012084015260018060a01b038416600052600a6020526135636040600020612337565b6005549094906001600160a01b031660005b86518110156137c6576001600160a01b0361359082896123b4565b516040516361bfb47160e11b81526001600160a01b038616600482015291169190608081602481865afa8015610a84576000916000916000916000916137a3575b5060808b015260608a015260408901526137905781600052600b6020526001604060002001546040519061360482611fbf565b815260c088015260808701516040519061361d82611fbf565b815260e088015260405163fc57d4df60e01b815260048101839052602081602481875afa908115610a845760009161375e575b508060a0890152801561374a576137039287916040519061367082611fbf565b81526101008a01528861369b61368f60c083015160e084015190613df6565b61010083015190613df6565b91826101208301526136c360408301519383519061335a670de0b6b3a7640000968792612f04565b82526136e26101008301518461335a6060860151602087015193612f04565b60208301819052906001600160a01b038a1614613708575b5050505061238f565b613575565b8261335a61373c9561012061371e950151612f04565b908160208b01526133bf6101008b015160006040516133b881611fbf565b6020880152853888816136fa565b505050505050505050600d90600090600090565b90506020813d602011613788575b816137796020938361202a565b810103126103a1575138613650565b3d915061376c565b5050505050505050600f90600090600090565b925050506137c0915060803d6080116127d6576127c4818361202a565b386135d1565b50505050509050805160208201518082116000146134a75750508060206134a092519101519061250e565b604051916137fe83611ff1565b6000835260006020840152600060408401526000606084015260006080840152600060a084015260405161383181611fbf565b6000815260c084015260405161384681611fbf565b6000815260e084015260405161385b81611fbf565b6000815261010084015260405161387181611fbf565b6000815261012084015260018060a01b038216600052600a6020526138996040600020612337565b6005549094906001600160a01b031660005b86518110156137c6576001600160a01b036138c682896123b4565b516040516361bfb47160e11b81526001600160a01b038816600482015291169190608081602481865afa8015610a8457600091600091600091600091613aad575b5060808b015260608a015260408901526137905781600052600b6020526001604060002001546040519061393a82611fbf565b815260c088015260808701516040519061395382611fbf565b815260e088015260405163fc57d4df60e01b81526004810183905291602083602481875afa928315610a8457600093613a79575b508260a0890152821561374a57604051613a33936139a482611fbf565b81526101008901526139ce6139c260c08a015160e08b015190613df6565b6101008a015190613df6565b806101208a01526139f560408a0151918a519061335a670de0b6b3a7640000948592612f04565b8952613a156101008a01518261335a8c6020606082015191015193612f04565b60208a01819052916001600160a01b03881614613a3857505061238f565b6138ab565b613a57613a6d92826133bf6101208d015160006040516133b881611fbf565b908160208b015261335a876101008c0151612f04565b6020880152388061338d565b9092506020813d602011613aa5575b81613a956020938361202a565b810103126103a157519138613987565b3d9150613a88565b92505050613aca915060803d6080116127d6576127c4818361202a565b38613907565b929160405192613adf84611ff1565b6000845260006020850152600060408501526000606085015260006080850152600060a0850152604051613b1281611fbf565b6000815260c0850152604051613b2781611fbf565b6000815260e0850152604051613b3c81611fbf565b60008152610100850152604051613b5281611fbf565b6000815261012085015260018060a01b038516600052600a602052613b7a6040600020612337565b6005549095906001600160a01b031660005b8751811015613dca576001600160a01b03613ba7828a6123b4565b516040516361bfb47160e11b81526001600160a01b038616600482015291169190608081602481865afa8015610a8457600091600091600091600091613da7575b5060808c015260608b015260408a0152613d935781600052600b60205260016040600020015460405190613c1b82611fbf565b815260c0890152608088015160405190613c3482611fbf565b815260e089015260405163fc57d4df60e01b815260048101839052602081602481875afa908115610a8457600091613d61575b508060a08a01528015613d4c57613d0d92879160405190613c8782611fbf565b81526101008b015289613ca661368f60c083015160e084015190613df6565b9182610120830152613cce60408301519383519061335a670de0b6b3a7640000968792612f04565b8252613ced6101008301518461335a6060860151602087015193612f04565b60208301819052906001600160a01b038c1614613d12575050505061238f565b613b8c565b8261335a613d3e95610120613d28950151612f04565b908160208c015261335a886101008d0151612f04565b6020890152853889816136fa565b50505050505050505050600d90600090600090565b90506020813d602011613d8b575b81613d7c6020938361202a565b810103126103a1575138613c67565b3d9150613d6f565b505050505050505050600f90600090600090565b92505050613dc4915060803d6080116127d6576127c4818361202a565b38613be8565b5050505050509050805160208201518082116000146134a75750508060206134a092519101519061250e565b670de0b6b3a764000091613e1c916000604051613e1281611fbf565b5251905190612f3f565b0460405190612f2b82611fbf565b909160018060a01b038060055416936040938451928063fc57d4df60e01b9283865216600485015260209283856024818b5afa94851561403d5760009561400e575b509083911691602487518099819382528560048301525afa958615613fbe57600096613fdf575b5082158015613fd7575b613fc9578160049186519283809263182df0f560e01b82525afa918215613fbe57600092613f88575b5050613f1d613f389260008651613edc81611fbf565b5260008651613eea81611fbf565b5260008651613ef881611fbf565b52600854865190613f0882611fbf565b8152865191613f1683611fbf565b8252613df6565b94845190613f2a82611fbf565b8152845191613f1683611fbf565b9260008351613f4681611fbf565b525191670de0b6b3a7640000938484029380850486149015171561239e57613f7f93613f73915190612ee4565b905190612e4982611fbf565b51049060009190565b81819392933d8311613fb7575b613f9f818361202a565b81010312613fb4575051613f1d613f38613ec6565b80fd5b503d613f95565b85513d6000823e3d90fd5b505050505050600d90600090565b508515613e9d565b90958282813d8311614007575b613ff6818361202a565b81010312613fb45750519438613e93565b503d613fec565b90948482813d8311614036575b614025818361202a565b81010312613fb45750519383613e6c565b503d61401b565b87513d6000823e3d90fd5b6000546001600160a01b0390811633036140b0577fd52b2b9b7e9ee655fcb95d2e5b9e0c9f69e7ef2b8e9d2d0ea78402d576d22e229181604092600554921690816bffffffffffffffffffffffff60a01b8416176005558351921682526020820152a1600090565b50506000805160206152e18339815191526060604051600181526010602082015260006040820152a1600190565b6000805490926001600160a01b0392909183163303614286578216918284526020600b81526040918286209060ff8254161561425857835161411f81611fbf565b85815284519061412e82611fbf565b670c7d713b49da0000809252511161422a578285151591826141bc575b505061418f576001018054908490558251948552908401528201527f70483e6592cd5182d45ac970e05bc62cdcc90e9d8ef2c2dbe686cf383bcd7fc590606090a190565b50915060609250928360096000805160206152e1833981519152955193600d8552840152820152a1600d90565b602492506005541685519283809263fc57d4df60e01b82528a60048301525afa9081156142205787916141f3575b5015823861414b565b90508281813d8311614219575b61420a818361202a565b81010312612eb05751386141ea565b503d614200565b84513d89823e3d90fd5b5050915060609250928360086000805160206152e183398151915295519360068552840152820152a1600690565b5050915060609250928360076000805160206152e183398151915295519360098552840152820152a1600990565b50505060606000805160206152e1833981519152916040519060018252600660208301526040820152a1600190565b6000546001600160a01b031633036143035760407faeba5a6c40a8ac138134bff1aaa65debf25971188a58804bad717f82f0ec131691600854908060085582519182526020820152a1600090565b506000805160206152e1833981519152606060405160018152600b602082015260006040820152a1600190565b908160209103126103a1575180151581036103a15790565b600080546001600160a01b0393929084163303614524578316808252602090600b8252604060ff81852054166144f8578051637f4e225760e11b81526004969084818981875afa80156144ee576144c1575b50828552600b8452818520805460ff19166001908117825501859055600f805491865b83811061445c575050600160401b821015614449576001820180825582101561443657857fcf583bb0c569eb967f806b11601c4cb93c10310485c67add5f8362c2f212321f969798505260008051602061530183398151915201826bffffffffffffffffffffffff60a01b82541617905551908152a190565b634e487b7160e01b865260328852602486fd5b634e487b7160e01b865260418852602486fd5b82885285828260008051602061530183398151915201541614614487576144829061238f565b6143bd565b845162461bcd60e51b8152808b0188905260146024820152731b585c9ad95d08185b1c9958591e48185919195960621b6044820152606490fd5b6144e090853d87116144e7575b6144d8818361202a565b810190614330565b503861439a565b503d6144ce565b83513d88823e3d90fd5b6000805160206152e183398151915294955060609391506011815193600a8552840152820152a1600a90565b506000805160206152e18339815191529192506060906040519060018252601260208301526040820152a1600190565b91908110156121995760051b0190565b356001600160a01b03811681036103a15790565b6000546001600160a01b0390811633036145e957600c80549282166001600160a01b03198416811790915560408051929093166001600160a01b0390811683521660208201527f0613b6ee6a04f0d09f390e4d9318894b9f6ac7fd83897cd8d18896ba579c401e91819081016126a6565b50506000805160206152e18339815191526060604051600181526013602082015260006040820152a1600190565b1561461e57565b60405162461bcd60e51b815260206004820152602860248201527f63616e6e6f742070617573652061206d61726b65742074686174206973206e6f6044820152671d081b1a5cdd195960c21b6064820152608490fd5b1561467b57565b60405162461bcd60e51b815260206004820152602760248201527f6f6e6c7920706175736520677561726469616e20616e642061646d696e2063616044820152666e20706175736560c81b6064820152608490fd5b156146d757565b60405162461bcd60e51b81526020600482015260166024820152756f6e6c792061646d696e2063616e20756e706175736560501b6044820152606490fd5b60018060a01b0316906000918083526020601281526040908185209160188252808620549561477e82516147488161200e565b601c81527f626c6f636b206e756d6265722065786365656473203332206269747300000000858201526401000000004310614907565b63ffffffff431694614794855460e01c8761250e565b9081151580806148fe575b156148cd575090846004928551938480926318160ddd60e01b82525afa9182156148c357839261488e575b5061231297986147d991612f3f565b8115614878576147e9925061498b565b905b6148548454937f6e657720696e646578206578636565647320323234206269747300000000000061483484519561482187611fbf565b6001600160e01b0388811688529661496e565b519351916148418361200e565b601a8352820152600160e01b8310614907565b6001600160e01b0391161660e09390931b6001600160e01b03191692909217905550565b505081519061488682611fbf565b8152906147eb565b9091508481813d83116148bc575b6148a6818361202a565b810103126148b85751906123126147ca565b8280fd5b503d61489c565b84513d85823e3d90fd5b9597985050505050506148de575050565b81546001600160e01b031660e09190911b6001600160e01b031916179055565b5089151561479f565b1561490f5750565b6040519062461bcd60e51b82528160208060048301528251908160248401526000935b828510614955575050604492506000838284010152601f80199101168101030190fd5b8481018201518686016044015293810193859350614932565b90612f1e91600060405161498181611fbf565b5251905190612c8a565b90600060405161499a81611fbf565b526a0c097ce7bc90715b34b9f160241b9182810292818404149015171561239e57612f1e91612ee4565b91909160018060a01b0316916000838152602060138152604080832092601783528181205496614a2e83516149f88161200e565b601c81527f626c6f636b206e756d6265722065786365656473203332206269747300000000868201526401000000004310614907565b63ffffffff431695614a44865460e01c8861250e565b918215158080614add575b15614acb5750856004918651928380926308f7a6e360e31b82525afa908115614ac1578491614a92575b5098614a8c6147d9926123129a9b614ae6565b92612f3f565b90508581813d8311614aba575b614aa9818361202a565b81010312612a5b5751614a8c614a79565b503d614a9f565b85513d86823e3d90fd5b969899505050505050506148de575050565b508a1515614a4f565b670de0b6b3a76400009081810291818304149015171561239e57612a2a915190612ee4565b6001600160a01b03908116600081815260126020908152604080832054601483528184209690951680845295825280832080546001600160e01b03909616908190559196959490929190801580614c54575b614c3f575b614b6c908261250e565b96835197614b7989611fbf565b885283516370a0823160e01b8152600481018790528181602481895afa908115614ac1578491614c10575b50614be46a0c097ce7bc90715b34b9f160241b917f2caecd17d02f56fa897705dcc740da2d237c373f70686f4e0d9bd3bf0400ea7a9798999a5190612f3f565b04928781526016825284614bfb8582842054612c8a565b918981526016845220558351928352820152a3565b90508181813d8311614c38575b614c27818361202a565b81010312612a5b5751614be4614ba4565b503d614c1d565b506a0c097ce7bc90715b34b9f160241b614b62565b506a0c097ce7bc90715b34b9f160241b821015614b5d565b6001600160a01b03908116600081815260136020908152604080832054601583528184209690951680845295825280832080546001600160e01b0390961690819055969796939490939190801580614dc0575b614dab575b614cce908361250e565b97845198614cdb8a611fbf565b895284516395dd919360e01b81526004810188905282816024818a5afa908115614da1578591614d50575b507f1fc3ecc087d8d2d15e23d0032af5a47059c3892d003d8e139fdcb6bb327c99a696979899614d486a0c097ce7bc90715b34b9f160241b93614be493614ae6565b905190612f3f565b90508281813d8311614d9a575b614d67818361202a565b81010312614d9657517f1fc3ecc087d8d2d15e23d0032af5a47059c3892d003d8e139fdcb6bb327c99a6614d06565b8480fd5b503d614d5d565b86513d87823e3d90fd5b506a0c097ce7bc90715b34b9f160241b614cc4565b506a0c097ce7bc90715b34b9f160241b831015614cbf565b60018060a01b031660009080825260196020526040822054601a602052614e0360408420544361250e565b80151580614e57575b614e17575b50505050565b614e3691614e2491612f3f565b82845260166020526040842054612c8a565b90825260166020526040822055601a60205260404391205538808080614e11565b50811515614e0c565b604080519181830183811067ffffffffffffffff821117611fdb5782526001938484526020908185019082368337855115612199576001600160a01b039384169091526000865b614f25575b5050846000905b614ebf57505050505050565b8451811015614f20578083614ed7614f1a93886123b4565b511684614ee483896123b4565b5116600052614efd6016918286528760002054906150ae565b9085614f09848a6123b4565b51166000528452856000205561238f565b85614eb3565b612a70565b81518110156150a95783614f3982846123b4565b511680600052600b845260ff8660002054161561506d57855163aa5af0fd60e01b81528481600481855afa90811561403d57600091615040575b5086518994939291614f8482611fbf565b8152614f9081836149c4565b886000865b614ffd575b505050614fa681614715565b6000845b614fc1575b5050614fba9061238f565b9091614ea7565b88949192939451811015614ff3578061109e88614fe1614fe9948d6123b4565b511685614b0b565b8194939291614faa565b8194939250614faf565b888297939495969751821015615034578461109e9161501f84615027966123b4565b511687614c6c565b8990829695949392614f95565b50829695949350614f9a565b908582813d8311615066575b615056818361202a565b81010312613fb457505138614f73565b503d61504c565b855162461bcd60e51b81526004810185905260156024820152741b585c9ad95d081b5d5cdd081899481b1a5cdd1959605a1b6044820152606490fd5b614eac565b6006546040516370a0823160e01b8152306004820152602093926001600160a01b0390921691908481602481865afa908115610a8457600091615172575b508315159081615167575b50615103575050905090565b60405163a9059cbb60e01b81526001600160a01b0391909116600482015260248101929092528290829060449082906000905af18015610a8457615149575b5050600090565b8161515f92903d106144e7576144d8818361202a565b503880615142565b9050831115386150f7565b908582813d8311615198575b615188818361202a565b81010312613fb4575051386150ec565b503d61517e565b600054336001600160a01b03918216149081156151ba575090565b905060025416331490565b156151cc57565b60405162461bcd60e51b815260206004820152601d60248201527f6f6e6c792061646d696e2063616e2073657420636f6d702073706565640000006044820152606490fd5b6001600160a01b03166000818152600b602090815260408220600101541592909190836152c8575b836152445750505090565b6040516305cee64160e21b815293508290849060049082905afa9182156152bb578192615282575b5050670de0b6b3a7640000915014388080612919565b90915082813d83116152b4575b615299818361202a565b81010312613fb45750670de0b6b3a76400009051388061526c565b503d61528f565b50604051903d90823e3d90fd5b600e8352604082205460ff161515600114935061523956fe45b96fe442630264581b197e84bbada861235052c5a1aadfff9ea4e40a969aa08d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac802a26469706673582212202f3aaff42855ba80d9fe3532e9c9cd3d6e0730d79586fd186c3de7a8b6744de364736f6c63430008110033", + "deployedBytecode": "0x608080604052600436101561001357600080fd5b60003560e01c9081627e3dd214611f455750806318c882a514611e405780631c3db2e014611e035780631d504dc614611c8c5780631ededc9114611c6157806321af456914611c3857806324008a6214611c1c57806324a3d62214611bf35780632678224714611bca57806327efe3cb14611ac45780632d70db78146119f3578063317b0b7714611945578063391957d7146118655780633bcf7ec1146117625780633c94786f1461173c57806341c728b91461172e57806342cbb15c14611713578063467050f9146116ea57806347ef3b3b146116aa5780634a584432146116705780634ada90af146116525780634e79238f1461162f5780634ef4c3e1146116155780634fd42e17146115f757806351dff9891461159457806352d84d1e1461154b57806355ee1fe11461151c578063598ee1cb146114685780635c7786051461145a5780635ec88c791461140d5780635f5af1aa146113ea5780635fc7e71e146113cd578063607ef6c1146112185780636810dfa614610fa75780636a56947e14610f995780636aa875b514610f5f5780636b79c38d14610f0d5780636d154ea514610ece5780636d35bf9114610ec0578063731f0c2b14610e81578063741b252514610e605780637dc0d1d014610e3757806387f7630314610e115780638c57804e14610dbf5780638e8f294b14610d775780638ebf636414610ca3578063929fe9a114610c4b57806394543c1514610c1e57806394b2294b14610c0057806395bf75fd146105fe578063986ab83814610bc6578063a76b3fda14610ba3578063a7f0e23114610b7a578063a8b43948146108af578063abfceffc14610875578063ac0b0bb71461084f578063b0772d0b14610823578063b21be7fd146107d2578063bb82aa5e146107a9578063bdcdc2581461078d578063bea6b8b814610753578063c29982381461064c578063c488847b14610627578063c6ac8a4b146105fe578063ca0af043146105ad578063cc7ebdc414610573578063d02f735114610556578063da3d454c1461053d578063dce15449146104e4578063dcfbc0c7146104bb578063e4028eee14610494578063e6653f3d1461046e578063e875544614610450578063e9af029214610424578063eabe7d911461040b578063ede4edd0146103e0578063f4a433c0146103a65763f851a4401461037857600080fd5b346103a15760003660031901126103a1576000546040516001600160a01b039091168152602090f35b600080fd5b346103a15760203660031901126103a1576001600160a01b036103c7611f5f565b1660005260176020526020604060002054604051908152f35b346103a15760203660031901126103a15760206104036103fe611f5f565b61251b565b604051908152f35b346103a157602061040361041e3661214c565b91612875565b346103a15760203660031901126103a15761044e610440611f5f565b6104486122d1565b90614e60565b005b346103a15760003660031901126103a1576020600754604051908152f35b346103a15760003660031901126103a157602060ff600c5460a81c166040519015158152f35b346103a15760403660031901126103a15760206104036104b2611f5f565b602435906140de565b346103a15760003660031901126103a1576003546040516001600160a01b039091168152602090f35b346103a15760403660031901126103a1576104fd611f5f565b6024359060018060a01b03809116600052600a602052604060002080548310156103a15760209261052d91612181565b9190546040519260031b1c168152f35b346103a15760206104036105503661214c565b9161291f565b346103a1576020610403610569366121af565b5092919091612f71565b346103a15760203660031901126103a1576001600160a01b03610594611f5f565b1660005260166020526020604060002054604051908152f35b346103a15760403660031901126103a1576105c6611f5f565b6105ce611f75565b9060018060a01b038091166000526015602052604060002091166000526020526020604060002054604051908152f35b346103a15760003660031901126103a1576004546040516001600160a01b039091168152602090f35b346103a157604061064061063a3661214c565b91613e2a565b82519182526020820152f35b346103a1576020806003193601126103a15760043567ffffffffffffffff81116103a15761067e903690600401612064565b80516106898161204c565b90610697604051928361202a565b8082526106a38161204c565b8285019390601f190136853760005b8281106106fd5750505090604051928392818401908285525180915260408401929160005b8281106106e657505050500390f35b8351855286955093810193928101926001016106d7565b61071a336001600160a01b0361071384866123b4565b51166123c8565b90601282101561073d576107389161073282876123b4565b5261238f565b6106b2565b634e487b7160e01b600052602160045260246000fd5b346103a15760203660031901126103a1576001600160a01b03610774611f5f565b16600052601a6020526020604060002054604051908152f35b346103a15760206104036107a0366120d2565b929190916130e6565b346103a15760003660031901126103a1576002546040516001600160a01b039091168152602090f35b346103a15760403660031901126103a1576107eb611f5f565b6107f3611f75565b9060018060a01b038091166000526014602052604060002091166000526020526020604060002054604051908152f35b346103a15760003660031901126103a15761084b61083f6122d1565b6040519182918261228d565b0390f35b346103a15760003660031901126103a157602060ff600c5460b81c166040519015158152f35b346103a15760203660031901126103a1576001600160a01b03610896611f5f565b16600052600a60205261084b61083f6040600020612337565b346103a15760603660031901126103a15767ffffffffffffffff6004358181116103a1576108e1903690600401612064565b602480358381116103a1576108fa90369060040161222f565b9060449384359081116103a15761091590369060040161222f565b61092561092061519f565b6151c5565b8351938351851480610b70575b15610b1b5760005b85811061094357005b6001600160a01b0361095582846123b4565b51169061096281876123b4565b519161096e82866123b4565b519281600052602090600b825260ff6040600020541615610ad857829081600052826018918282528060406000205403610a90575b50505060005260179384825280604060002054036109ce575b5050506109c9915061238f565b61093a565b60405163aa5af0fd60e01b81528281600481875afa908115610a8457600091610a4f575b50906109c995610a337f20af8e791cc98f74b2d7a391c80980ca8e5aebf3d4060bf581997b6acae2e537949360405190610a2b82611fbf565b8152866149c4565b84600052825280604060002055604051908152a28880806109bc565b928092915083813d8311610a7d575b610a68818361202a565b810103126103a15791519091906109c96109f2565b503d610a5e565b6040513d6000823e3d90fd5b7fdeafccd0c0b768b2529f7dcbbe58e155d6023059150b7490ed4535cc3744b92d92610abb85614715565b84600052825280604060002055604051908152a2818b82816109a3565b60405162461bcd60e51b8152600481018390526019818a01527f636f6d70206d61726b6574206973206e6f74206c697374656400000000000000818d0152606490fd5b60405162461bcd60e51b8152602060048201526029818501527f436f6d7074726f6c6c65723a3a5f736574436f6d7053706565647320696e766181880152681b1a59081a5b9c1d5d60ba1b6064820152608490fd5b5081518514610932565b346103a15760003660031901126103a15760206040516a0c097ce7bc90715b34b9f160241b8152f35b346103a15760203660031901126103a1576020610403610bc1611f5f565b614348565b346103a15760203660031901126103a1576001600160a01b03610be7611f5f565b1660005260196020526020604060002054604051908152f35b346103a15760003660031901126103a1576020600954604051908152f35b346103a15760203660031901126103a1576020610c41610c3c611f5f565b615211565b6040519015158152f35b346103a15760403660031901126103a157610c64611f5f565b6001600160a01b0380610c75611f75565b16600052600b60205260026040600020019116600052602052602060ff604060002054166040519015158152f35b346103a15760203660031901126103a1576020610cbe611f9a565b600c54906001600160a01b0333818416148015610d6a575b610cdf90614674565b6000541633148015610d5e575b610cf5906146d0565b15159060ff60b01b8260b01b169060ff60b01b191617600c557f27ee2b767de43e8b48d1666d8c451a273fbf857e760fda6e95d0d582f68534bc60806040516040815260086040820152672a3930b739b332b960c11b60608201528385820152a1604051908152f35b50801515600114610cec565b5060005481163314610cd6565b346103a15760203660031901126103a1576001600160a01b03610d98611f5f565b16600052600b602052604080600020600160ff825416910154825191151582526020820152f35b346103a15760203660031901126103a1576001600160a01b03610de0611f5f565b166000908152601360209081526040918290205482516001600160e01b038216815260e09190911c91810191909152f35b346103a15760003660031901126103a157602060ff600c5460b01c166040519015158152f35b346103a15760003660031901126103a1576005546040516001600160a01b039091168152602090f35b346103a15760203660031901126103a15761044e610e7c611f5f565b614dd8565b346103a15760203660031901126103a1576001600160a01b03610ea2611f5f565b16600052600d602052602060ff604060002054166040519015158152f35b346103a15761044e366121af565b346103a15760203660031901126103a1576001600160a01b03610eef611f5f565b16600052600e602052602060ff604060002054166040519015158152f35b346103a15760203660031901126103a1576001600160a01b03610f2e611f5f565b166000908152601260209081526040918290205482516001600160e01b038216815260e09190911c91810191909152f35b346103a15760203660031901126103a1576001600160a01b03610f80611f5f565b1660005260186020526020604060002054604051908152f35b346103a15761044e366120d2565b346103a15760803660031901126103a15767ffffffffffffffff6004358181116103a157610fd9903690600401612064565b906024359081116103a157610ff2903690600401612064565b604435918215158093036103a1576064358015158091036103a15760005b83518110156111a9576001600160a01b0361102b82866123b4565b511680600052600b60205260ff604060002054161561116c57600186146110b5575b60018314611065575b506110609061238f565b611010565b94909361107186614715565b60005b84518110156110a8576110a39061109e6001600160a01b0361109683896123b4565b511689614b0b565b61238f565b611074565b5090945092611060611056565b949291936040519363aa5af0fd60e01b85526020856004818a5afa948515610a8457600095611138575b50604051946110ed86611fbf565b85526110f985886149c4565b60005b845181101561112c576111279061109e876001600160a01b0361111f848a6123b4565b51168b614c6c565b6110fc565b5095909492935061104d565b9094506020813d602011611164575b816111546020938361202a565b810103126103a1575193876110df565b3d9150611147565b60405162461bcd60e51b81526020600482015260156024820152741b585c9ad95d081b5d5cdd081899481b1a5cdd1959605a1b6044820152606490fd5b8260005b815181101561044e57611213906001600160a01b03806111cd83866123b4565b5116816111da84876123b4565b51166000526016906111f7602091838352604060002054906150ae565b9261120285886123b4565b51166000525260406000205561238f565b6111ad565b346103a15760403660031901126103a15767ffffffffffffffff6004358181116103a15761124a9036906004016121fe565b916024359081116103a1576112639036906004016121fe565b9260018060a01b03928360005416331480156113c0575b1561135d5781151580611354575b1561131f5760005b82811061129957005b806112a861131a928887614554565b35866112bd6112b8848888614554565b614564565b16600052602090601182526040600020557f6f1951b2aad10f3fc81b86d91105b413a5b3f847a34bbc5ce1904201b14438f66112fd6112b8848888614554565b918861130a858c8b614554565b35936040519485521692a261238f565b611290565b60405162461bcd60e51b815260206004820152600d60248201526c1a5b9d985b1a59081a5b9c1d5d609a1b6044820152606490fd5b50848214611288565b60405162461bcd60e51b815260206004820152603560248201527f6f6e6c792061646d696e206f7220626f72726f772063617020677561726469616044820152746e2063616e2073657420626f72726f77206361707360581b6064820152608490fd5b508360105416331461127a565b346103a15760206104036113e0366121af565b9390929150612d3c565b346103a15760203660031901126103a1576020610403611408611f5f565b614578565b346103a15760203660031901126103a15761142e611429611f5f565b613157565b6012839293101561073d5761084b90604051938493846040919493926060820195825260208201520152565b346103a15761044e3661214c565b346103a15760403660031901126103a157611481611f5f565b7f386537fa92edc3319af95f1f904dcf1900021e4f3f4e08169a577a09076e66b36020602435926114b361092061519f565b6114bc81614dd8565b836114fd576001600160a01b0381166000908152601a835260408120555b6001600160a01b03166000818152601983526040908190208590555193845292a2005b6001600160a01b0381166000908152601a8352604090204390556114da565b346103a15760203660031901126103a1576004356001600160a01b03811681036103a157610403602091614048565b346103a15760203660031901126103a157600435600f548110156103a157600f60005260008051602061530183398151915201546040516001600160a01b039091168152602090f35b346103a1576115a236612113565b1592509050816115ed575b506115b457005b60405162461bcd60e51b815260206004820152601160248201527072656465656d546f6b656e73207a65726f60781b6044820152606490fd5b90501515816115ad565b346103a15760203660031901126103a15760206104036004356142b5565b346103a15760206104036116283661214c565b50906127e8565b346103a15761142e61164036612113565b9290916001600160a01b031690613ad0565b346103a15760003660031901126103a1576020600854604051908152f35b346103a15760203660031901126103a1576001600160a01b03611691611f5f565b1660005260116020526020604060002054604051908152f35b346103a15760c03660031901126103a1576116c3611f5f565b506116cc611f75565b506116d5611fa9565b506064356001600160a01b038116036103a157005b346103a15760003660031901126103a1576006546040516001600160a01b039091168152602090f35b346103a15760003660031901126103a1576020604051438152f35b346103a15761044e36612113565b346103a15760003660031901126103a157602060ff600c5460a01c166040519015158152f35b346103a15760403660031901126103a157602061177d611f5f565b7f71aec636243f9709bb0007ae15e9afb8150ab01716d75fd7573be5cc096e03b060a06117a8611f8b565b600180831b038094169384600052600b86526117cb60ff60406000205416614617565b80600c541633148015611858575b6117e290614674565b600054163314801561184c575b6117f8906146d0565b83600052600d855261181a8160406000209060ff801983541691151516179055565b6040519384526060858501526004606085015263135a5b9d60e21b6080850152151592836040820152a1604051908152f35b508015156001146117ef565b50600054811633146117d9565b346103a15760203660031901126103a15761187e611f5f565b6000546001600160a01b0390811633036118f157601080548383166001600160a01b031982161790915560408051929091166001600160a01b03908116835290921660208201527feda98690e518e9a05f8ec6837663e188211b2da8f4906648b323f2c1d4434e2991819081015b0390a1005b60405162461bcd60e51b815260206004820152602660248201527f6f6e6c792061646d696e2063616e2073657420626f72726f772063617020677560448201526530b93234b0b760d11b6064820152608490fd5b346103a15760203660031901126103a157600054600435906001600160a01b031633036119ae5760407f3b9670cf975d26958e754b57098eaa2ac914d8d2a31b83257997b9f346110fd991600754908060075582519182526020820152a1602060405160008152f35b60405162461bcd60e51b815260206004820152601f60248201527f6f6e6c792061646d696e2063616e2073657420636c6f736520666163746f72006044820152606490fd5b346103a15760203660031901126103a1576020611a0e611f9a565b600c54906001600160a01b0333818416148015611ab7575b611a2f90614674565b6000541633148015611aab575b611a45906146d0565b15159060ff60b81b8260b81b169060ff60b81b191617600c557f27ee2b767de43e8b48d1666d8c451a273fbf857e760fda6e95d0d582f68534bc60806040516040815260056040820152645365697a6560d81b60608201528385820152a1604051908152f35b50801515600114611a3c565b5060005481163314611a26565b346103a15760403660031901126103a157611add611f5f565b602435611ae861519f565b15611b8557611af781836150ae565b611b4057604080516001600160a01b03909316835260208301919091527f98b2f82a3a07f223a0be64b3d0f47711c64dccd1feafb94aa28156b38cd9695c9190819081016118ec565b60405162461bcd60e51b815260206004820152601b60248201527f696e73756666696369656e7420636f6d7020666f72206772616e7400000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601960248201527f6f6e6c792061646d696e2063616e206772616e7420636f6d70000000000000006044820152606490fd5b346103a15760003660031901126103a1576001546040516001600160a01b039091168152602090f35b346103a15760003660031901126103a157600c546040516001600160a01b039091168152602090f35b346103a1576020610403611c2f366120d2565b50919050612c97565b346103a15760003660031901126103a1576010546040516001600160a01b039091168152602090f35b346103a15760a03660031901126103a157611c7a611f5f565b50611c83611f75565b5061044e611fa9565b346103a1576020806003193601126103a1576004356001600160a01b03818116918290036103a1576040516303e1469160e61b81528381600481865afa908115610a8457600091611dcd575b50163303611d78578160009160046040518094819363307a00cd60e21b83525af1908115610a8457600091611d4b575b50611d0f57005b6064906040519062461bcd60e51b82526004820152601560248201527418da185b99d9481b9bdd08185d5d1a1bdc9a5e9959605a1b6044820152fd5b90508181813d8311611d71575b611d62818361202a565b810103126103a1575182611d08565b503d611d58565b60405162461bcd60e51b815260048101839052602760248201527f6f6e6c7920756e6974726f6c6c65722061646d696e2063616e206368616e676560448201526620627261696e7360c81b6064820152608490fd5b90508381813d8311611dfc575b611de4818361202a565b810103126103a1575181811681036103a15784611cd8565b503d611dda565b346103a15760403660031901126103a157611e1c611f5f565b6024359067ffffffffffffffff82116103a15761044861044e923690600401612064565b346103a15760403660031901126103a1576020611e5b611f5f565b7f71aec636243f9709bb0007ae15e9afb8150ab01716d75fd7573be5cc096e03b060a0611e86611f8b565b600180831b038094169384600052600b8652611ea960ff60406000205416614617565b80600c541633148015611f38575b611ec090614674565b6000541633148015611f2c575b611ed6906146d0565b83600052600e8552611ef88160406000209060ff801983541691151516179055565b6040519384526060858501526006606085015265426f72726f7760d01b6080850152151592836040820152a1604051908152f35b50801515600114611ecd565b5060005481163314611eb7565b346103a15760003660031901126103a15780600160209252f35b600435906001600160a01b03821682036103a157565b602435906001600160a01b03821682036103a157565b6024359081151582036103a157565b6004359081151582036103a157565b604435906001600160a01b03821682036103a157565b6020810190811067ffffffffffffffff821117611fdb57604052565b634e487b7160e01b600052604160045260246000fd5b610140810190811067ffffffffffffffff821117611fdb57604052565b6040810190811067ffffffffffffffff821117611fdb57604052565b90601f8019910116810190811067ffffffffffffffff821117611fdb57604052565b67ffffffffffffffff8111611fdb5760051b60200190565b81601f820112156103a15780359161207b8361204c565b92612089604051948561202a565b808452602092838086019260051b8201019283116103a1578301905b8282106120b3575050505090565b81356001600160a01b03811681036103a15781529083019083016120a5565b60809060031901126103a1576001600160a01b0360043581811681036103a1579160243582811681036103a1579160443590811681036103a1579060643590565b60809060031901126103a1576001600160a01b039060043582811681036103a1579160243590811681036103a157906044359060643590565b60609060031901126103a1576001600160a01b039060043582811681036103a1579160243590811681036103a1579060443590565b80548210156121995760005260206000200190600090565b634e487b7160e01b600052603260045260246000fd5b60a09060031901126103a1576001600160a01b039060043582811681036103a1579160243581811681036103a1579160443582811681036103a1579160643590811681036103a1579060843590565b9181601f840112156103a15782359167ffffffffffffffff83116103a1576020808501948460051b0101116103a157565b81601f820112156103a1578035916122468361204c565b92612254604051948561202a565b808452602092838086019260051b8201019283116103a1578301905b82821061227e575050505090565b81358152908301908301612270565b6020908160408183019282815285518094520193019160005b8281106122b4575050505090565b83516001600160a01b0316855293810193928101926001016122a6565b60405190600f548083528260209182820190600f600052600080516020615301833981519152936000905b828210612314575050506123129250038361202a565b565b85546001600160a01b0316845260019586019588955093810193909101906122fc565b9060405191828154918282526020928383019160005283600020936000905b82821061236c575050506123129250038361202a565b85546001600160a01b031684526001958601958895509381019390910190612356565b600019811461239e5760010190565b634e487b7160e01b600052601160045260246000fd5b80518210156121995760209160051b010190565b6001600160a01b038082166000908152600b602052604081208054919493929160ff16156124c5576002918416855201602052600160ff6040852054161515146124c0576040808420805460ff19166001179055600a6020528320805490600160401b8210156124ac57826124698361248d9360017f3ab23ab0d51cccc0c3085aec51f99228625aa1a922b3a8ca89a26b0f2027a1a5989796018155612181565b90919082549060031b9160018060a01b039283811b93849216901b16911916179055565b604080516001600160a01b03928316815292909116602083015290a190565b634e487b7160e01b85526041600452602485fd5b505090565b5050505050600990565b91908260809103126103a1578151916020810151916060604083015192015190565b156124f857565b634e487b7160e01b600052600160045260246000fd5b9190820391821161239e57565b604080516361bfb47160e11b81523360048201526001600160a01b0383811693909190608082602481885afa80156127dd576000809381926127a7575b5061275557612725579061256d913390612895565b806126f9575082600052600b602052600282600020013360005260205260ff826000205416156126f1578160002060ff198154169055600a6020526125b482600020612337565b928351928360005b8181106126c4575b50846125d5929394959650106124f1565b33600052600a60205280600020928354946000199586810190811161239e5761263a91836126066126109389612181565b9390549289612181565b92909360031b1c169082549060031b9160018060a01b039283811b93849216901b16911916179055565b83549384156126ae577fe699a64c18b07ac5b7301aa273f36a2287239eb9501d81950672794afba29a0d956126a69501916126758383612181565b815460039190911b9290921b19909116905555516001600160a01b0390911681523360208201529081906040820190565b0390a1600090565b634e487b7160e01b600052603160045260246000fd5b83856126d0838a6123b4565b5116146126e5576126e09061238f565b6125bc565b909550935084386125c4565b505050600090565b8251600e81526003602082015292830152506000805160206152e18339815191529150606090a1600e90565b5050506000805160206152e183398151915291508060006060925191600c835260026020840152820152a1600c90565b845162461bcd60e51b815260206004820152602560248201527f657869744d61726b65743a206765744163636f756e74536e617073686f742066604482015264185a5b195960da1b6064820152608490fd5b9150506127cc91925060803d81116127d6575b6127c4818361202a565b8101906124cf565b5090929138612558565b503d6127ba565b84513d6000823e3d90fd5b6001600160a01b0381166000818152600d602052604090205491929160ff1661283f57600052600b60205260ff6040600020541615612838578161282e61283393614715565b614b0b565b600090565b5050600990565b60405162461bcd60e51b815260206004820152600e60248201526d1b5a5b9d081a5cc81c185d5cd95960921b6044820152606490fd5b91612881908284612895565b91826124c057612833925061282e81614715565b6001600160a01b039081166000818152600b60205260408120549094929060ff16156124c55760026040862001908416855260205260ff60408520541615612919576128e0926134ba565b919050601281101561290557806128ff57506128f95790565b50600490565b91505090565b634e487b7160e01b83526021600452602483fd5b50505090565b929160018060a01b039182851694600093868552602093600e855260409160ff8388205416612c5357888752600b865260ff838820541615612c4657908589926002858a200181881690818b52835260ff868b20541615612b98575b50906024916005541685519283809263fc57d4df60e01b825260049e8f8301525afa908115612b8e578891612b5d575b5015612b5057818752601186528287205480612a96575b506129ce9082866137f1565b9190506012811015612a835780612a785750612a7057849082519889809263aa5af0fd60e01b82525afa938415612a66578594612a2d575b50612a2a949596505192612a1984611fbf565b8352612a2583826149c4565b614c6c565b90565b90935086813d8311612a5f575b612a44818361202a565b81010312612a5b5794519394859492612a2a612a06565b8380fd5b503d612a3a565b81513d87823e3d90fd5b505050505050565b985050505050505050565b634e487b7160e01b885260218a52602488fd5b83516308f7a6e360e31b815287818c81875afa8015612b465783908a90612b11575b612ac29250612c8a565b1015612ace57386129c2565b825162461bcd60e51b8152808a01879052601960248201527f6d61726b657420626f72726f77206361702072656163686564000000000000006044820152606490fd5b50508781813d8311612b3f575b612b28818361202a565b81010312612b3b5782612ac29151612ab8565b8880fd5b503d612b1e565b85513d8b823e3d90fd5b50600d9750505050505050565b90508681813d8311612b87575b612b74818361202a565b81010312612b835751386129ab565b8780fd5b503d612b6a565b84513d8a823e3d90fd5b915091923303612c0a57612bac86336123c8565b6012811015612bf65780612bea5750868a9392602492858b52600b83526002878c2001908b528252612be360ff878c2054166124f1565b909161297b565b99505050505050505050565b634e487b7160e01b89526021600452602489fd5b835162461bcd60e51b815260048101889052601560248201527439b2b73232b91036bab9ba1031329031aa37b5b2b760591b6044820152606490fd5b5060099750505050505050565b825162461bcd60e51b815260048101879052601060248201526f189bdc9c9bddc81a5cc81c185d5cd95960821b6044820152606490fd5b9190820180921161239e57565b6001600160a01b0381166000818152600b602052604081205490939060ff1615612d335760206004926040519384809263aa5af0fd60e01b82525afa918215612d28578492612cf3575b50612a2a9260405192612a1984611fbf565b9091506020813d8211612d20575b81612d0e6020938361202a565b81010312612a5b575190612a2a612ce1565b3d9150612d01565b6040513d86823e3d90fd5b50505050600990565b919260018060a01b0380931692600094848652602094600b86526040948360ff878a20541615918215612ed1575b5050612ec55784516395dd919360e01b815292821660048401528583602481845afa928315612ebb578793612e86575b50612da490615211565b15612e08575010612db457505090565b60849250519062461bcd60e51b82526004820152602860248201527f43616e206e6f74207265706179206d6f7265207468616e2074686520746f74616044820152676c20626f72726f7760c01b6064820152fd5b612e159193929450613157565b9190506012811015612e725780612e69575015612e6057670de0b6b3a764000091612e5091600754905190612e4982611fbf565b8152612f04565b510410612e5a5790565b50601190565b50505050600390565b94505050505090565b634e487b7160e01b86526021600452602486fd5b9092508581813d8311612eb4575b612e9e818361202a565b81010312612eb0575191612da4612d9a565b8680fd5b503d612e94565b85513d89823e3d90fd5b50505050505050600990565b168852508487205460ff16158338612d6a565b8115612eee570490565b634e487b7160e01b600052601260045260246000fd5b90612f1e916000604051612f1781611fbf565b5251612f3f565b60405190612f2b82611fbf565b815290565b90600160009215171561239e57565b8181029291811591840414171561239e57565b908160209103126103a157516001600160a01b03811681036103a15790565b9291909260ff600c5460b81c166130af5760018060a01b03808216906000958287526020600b815260409160ff838a20541615801561309c575b61308e578251948286600481635fe3b56760e01b948582525afa958615613084578a96613059575b5091809160048694865195869384928352165afa9283156130505750908392918992613023575b50501691160361301a5761282e612a2a9361301483614715565b82614b0b565b50505050600290565b6130429250803d10613049575b61303a818361202a565b810190612f52565b3880612ffa565b503d613030565b513d8a823e3d90fd5b8392908392975061307960049188963d86116130495761303a818361202a565b979250509192612fd3565b84513d8c823e3d90fd5b505050505050505050600990565b50838116895260ff838a20541615612fab565b60405162461bcd60e51b815260206004820152600f60248201526e1cd95a5e99481a5cc81c185d5cd959608a1b6044820152606490fd5b909260ff600c5460b01c1661311d57613100908483612895565b80613116575061282e6128339361301483614715565b9250505090565b60405162461bcd60e51b81526020600482015260126024820152711d1c985b9cd9995c881a5cc81c185d5cd95960721b6044820152606490fd5b60405161316381611ff1565b6000815260006020820152600060408201526000606082015260006080820152600060a082015260405161319681611fbf565b6000815260c08201526040516131ab81611fbf565b6000815260e08201526040516131c081611fbf565b600081526101008201526040516131d681611fbf565b6000815261012082015260018060a01b038216600052600a6020526131fe6040600020612337565b6005549092906001600160a01b031660005b8451811015613477576001600160a01b0361322b82876123b4565b516040516361bfb47160e11b81526001600160a01b038616600482015291169190608081602481865afa8015610a8457600091600091600091600091613454575b506080890152606088015260408701526134435781600052600b6020526001604060002001546040519061329f82611fbf565b815260c08601526080850151604051906132b882611fbf565b815260e086015260405163fc57d4df60e01b81526004810183905291602083602481875afa928315610a845760009361340f575b508260a087015282156133fd576040516133949361330982611fbf565b815261010087015261333361332760c088015160e089015190613df6565b61010088015190613df6565b8061012088015261336160408801519188519061335a670de0b6b3a7640000948592612f04565b5104612c8a565b87526133806101008801518261335a60608b015160208c015193612f04565b9182602089015215613399575b505061238f565b613210565b6133d36133f192826133bf6101208b015160006040516133b881611fbf565b5251612f30565b806040516133cc81611fbf565b5204612c8a565b908160208901526133bf61010089015160006040516133b881611fbf565b6020860152388061338d565b50505050505050600d90600090600090565b9092506020813d60201161343b575b8161342b6020938361202a565b810103126103a1575191386132ec565b3d915061341e565b505050505050600f90600090600090565b92505050613471915060803d6080116127d6576127c4818361202a565b3861326c565b5050509050805160208201518082116000146134a75750508060206134a092519101519061250e565b6000918290565b6134b1925061250e565b60009160009190565b91604051916134c883611ff1565b6000835260006020840152600060408401526000606084015260006080840152600060a08401526040516134fb81611fbf565b6000815260c084015260405161351081611fbf565b6000815260e084015260405161352581611fbf565b6000815261010084015260405161353b81611fbf565b6000815261012084015260018060a01b038416600052600a6020526135636040600020612337565b6005549094906001600160a01b031660005b86518110156137c6576001600160a01b0361359082896123b4565b516040516361bfb47160e11b81526001600160a01b038616600482015291169190608081602481865afa8015610a84576000916000916000916000916137a3575b5060808b015260608a015260408901526137905781600052600b6020526001604060002001546040519061360482611fbf565b815260c088015260808701516040519061361d82611fbf565b815260e088015260405163fc57d4df60e01b815260048101839052602081602481875afa908115610a845760009161375e575b508060a0890152801561374a576137039287916040519061367082611fbf565b81526101008a01528861369b61368f60c083015160e084015190613df6565b61010083015190613df6565b91826101208301526136c360408301519383519061335a670de0b6b3a7640000968792612f04565b82526136e26101008301518461335a6060860151602087015193612f04565b60208301819052906001600160a01b038a1614613708575b5050505061238f565b613575565b8261335a61373c9561012061371e950151612f04565b908160208b01526133bf6101008b015160006040516133b881611fbf565b6020880152853888816136fa565b505050505050505050600d90600090600090565b90506020813d602011613788575b816137796020938361202a565b810103126103a1575138613650565b3d915061376c565b5050505050505050600f90600090600090565b925050506137c0915060803d6080116127d6576127c4818361202a565b386135d1565b50505050509050805160208201518082116000146134a75750508060206134a092519101519061250e565b604051916137fe83611ff1565b6000835260006020840152600060408401526000606084015260006080840152600060a084015260405161383181611fbf565b6000815260c084015260405161384681611fbf565b6000815260e084015260405161385b81611fbf565b6000815261010084015260405161387181611fbf565b6000815261012084015260018060a01b038216600052600a6020526138996040600020612337565b6005549094906001600160a01b031660005b86518110156137c6576001600160a01b036138c682896123b4565b516040516361bfb47160e11b81526001600160a01b038816600482015291169190608081602481865afa8015610a8457600091600091600091600091613aad575b5060808b015260608a015260408901526137905781600052600b6020526001604060002001546040519061393a82611fbf565b815260c088015260808701516040519061395382611fbf565b815260e088015260405163fc57d4df60e01b81526004810183905291602083602481875afa928315610a8457600093613a79575b508260a0890152821561374a57604051613a33936139a482611fbf565b81526101008901526139ce6139c260c08a015160e08b015190613df6565b6101008a015190613df6565b806101208a01526139f560408a0151918a519061335a670de0b6b3a7640000948592612f04565b8952613a156101008a01518261335a8c6020606082015191015193612f04565b60208a01819052916001600160a01b03881614613a3857505061238f565b6138ab565b613a57613a6d92826133bf6101208d015160006040516133b881611fbf565b908160208b015261335a876101008c0151612f04565b6020880152388061338d565b9092506020813d602011613aa5575b81613a956020938361202a565b810103126103a157519138613987565b3d9150613a88565b92505050613aca915060803d6080116127d6576127c4818361202a565b38613907565b929160405192613adf84611ff1565b6000845260006020850152600060408501526000606085015260006080850152600060a0850152604051613b1281611fbf565b6000815260c0850152604051613b2781611fbf565b6000815260e0850152604051613b3c81611fbf565b60008152610100850152604051613b5281611fbf565b6000815261012085015260018060a01b038516600052600a602052613b7a6040600020612337565b6005549095906001600160a01b031660005b8751811015613dca576001600160a01b03613ba7828a6123b4565b516040516361bfb47160e11b81526001600160a01b038616600482015291169190608081602481865afa8015610a8457600091600091600091600091613da7575b5060808c015260608b015260408a0152613d935781600052600b60205260016040600020015460405190613c1b82611fbf565b815260c0890152608088015160405190613c3482611fbf565b815260e089015260405163fc57d4df60e01b815260048101839052602081602481875afa908115610a8457600091613d61575b508060a08a01528015613d4c57613d0d92879160405190613c8782611fbf565b81526101008b015289613ca661368f60c083015160e084015190613df6565b9182610120830152613cce60408301519383519061335a670de0b6b3a7640000968792612f04565b8252613ced6101008301518461335a6060860151602087015193612f04565b60208301819052906001600160a01b038c1614613d12575050505061238f565b613b8c565b8261335a613d3e95610120613d28950151612f04565b908160208c015261335a886101008d0151612f04565b6020890152853889816136fa565b50505050505050505050600d90600090600090565b90506020813d602011613d8b575b81613d7c6020938361202a565b810103126103a1575138613c67565b3d9150613d6f565b505050505050505050600f90600090600090565b92505050613dc4915060803d6080116127d6576127c4818361202a565b38613be8565b5050505050509050805160208201518082116000146134a75750508060206134a092519101519061250e565b670de0b6b3a764000091613e1c916000604051613e1281611fbf565b5251905190612f3f565b0460405190612f2b82611fbf565b909160018060a01b038060055416936040938451928063fc57d4df60e01b9283865216600485015260209283856024818b5afa94851561403d5760009561400e575b509083911691602487518099819382528560048301525afa958615613fbe57600096613fdf575b5082158015613fd7575b613fc9578160049186519283809263182df0f560e01b82525afa918215613fbe57600092613f88575b5050613f1d613f389260008651613edc81611fbf565b5260008651613eea81611fbf565b5260008651613ef881611fbf565b52600854865190613f0882611fbf565b8152865191613f1683611fbf565b8252613df6565b94845190613f2a82611fbf565b8152845191613f1683611fbf565b9260008351613f4681611fbf565b525191670de0b6b3a7640000938484029380850486149015171561239e57613f7f93613f73915190612ee4565b905190612e4982611fbf565b51049060009190565b81819392933d8311613fb7575b613f9f818361202a565b81010312613fb4575051613f1d613f38613ec6565b80fd5b503d613f95565b85513d6000823e3d90fd5b505050505050600d90600090565b508515613e9d565b90958282813d8311614007575b613ff6818361202a565b81010312613fb45750519438613e93565b503d613fec565b90948482813d8311614036575b614025818361202a565b81010312613fb45750519383613e6c565b503d61401b565b87513d6000823e3d90fd5b6000546001600160a01b0390811633036140b0577fd52b2b9b7e9ee655fcb95d2e5b9e0c9f69e7ef2b8e9d2d0ea78402d576d22e229181604092600554921690816bffffffffffffffffffffffff60a01b8416176005558351921682526020820152a1600090565b50506000805160206152e18339815191526060604051600181526010602082015260006040820152a1600190565b6000805490926001600160a01b0392909183163303614286578216918284526020600b81526040918286209060ff8254161561425857835161411f81611fbf565b85815284519061412e82611fbf565b670c7d713b49da0000809252511161422a578285151591826141bc575b505061418f576001018054908490558251948552908401528201527f70483e6592cd5182d45ac970e05bc62cdcc90e9d8ef2c2dbe686cf383bcd7fc590606090a190565b50915060609250928360096000805160206152e1833981519152955193600d8552840152820152a1600d90565b602492506005541685519283809263fc57d4df60e01b82528a60048301525afa9081156142205787916141f3575b5015823861414b565b90508281813d8311614219575b61420a818361202a565b81010312612eb05751386141ea565b503d614200565b84513d89823e3d90fd5b5050915060609250928360086000805160206152e183398151915295519360068552840152820152a1600690565b5050915060609250928360076000805160206152e183398151915295519360098552840152820152a1600990565b50505060606000805160206152e1833981519152916040519060018252600660208301526040820152a1600190565b6000546001600160a01b031633036143035760407faeba5a6c40a8ac138134bff1aaa65debf25971188a58804bad717f82f0ec131691600854908060085582519182526020820152a1600090565b506000805160206152e1833981519152606060405160018152600b602082015260006040820152a1600190565b908160209103126103a1575180151581036103a15790565b600080546001600160a01b0393929084163303614524578316808252602090600b8252604060ff81852054166144f8578051637f4e225760e11b81526004969084818981875afa80156144ee576144c1575b50828552600b8452818520805460ff19166001908117825501859055600f805491865b83811061445c575050600160401b821015614449576001820180825582101561443657857fcf583bb0c569eb967f806b11601c4cb93c10310485c67add5f8362c2f212321f969798505260008051602061530183398151915201826bffffffffffffffffffffffff60a01b82541617905551908152a190565b634e487b7160e01b865260328852602486fd5b634e487b7160e01b865260418852602486fd5b82885285828260008051602061530183398151915201541614614487576144829061238f565b6143bd565b845162461bcd60e51b8152808b0188905260146024820152731b585c9ad95d08185b1c9958591e48185919195960621b6044820152606490fd5b6144e090853d87116144e7575b6144d8818361202a565b810190614330565b503861439a565b503d6144ce565b83513d88823e3d90fd5b6000805160206152e183398151915294955060609391506011815193600a8552840152820152a1600a90565b506000805160206152e18339815191529192506060906040519060018252601260208301526040820152a1600190565b91908110156121995760051b0190565b356001600160a01b03811681036103a15790565b6000546001600160a01b0390811633036145e957600c80549282166001600160a01b03198416811790915560408051929093166001600160a01b0390811683521660208201527f0613b6ee6a04f0d09f390e4d9318894b9f6ac7fd83897cd8d18896ba579c401e91819081016126a6565b50506000805160206152e18339815191526060604051600181526013602082015260006040820152a1600190565b1561461e57565b60405162461bcd60e51b815260206004820152602860248201527f63616e6e6f742070617573652061206d61726b65742074686174206973206e6f6044820152671d081b1a5cdd195960c21b6064820152608490fd5b1561467b57565b60405162461bcd60e51b815260206004820152602760248201527f6f6e6c7920706175736520677561726469616e20616e642061646d696e2063616044820152666e20706175736560c81b6064820152608490fd5b156146d757565b60405162461bcd60e51b81526020600482015260166024820152756f6e6c792061646d696e2063616e20756e706175736560501b6044820152606490fd5b60018060a01b0316906000918083526020601281526040908185209160188252808620549561477e82516147488161200e565b601c81527f626c6f636b206e756d6265722065786365656473203332206269747300000000858201526401000000004310614907565b63ffffffff431694614794855460e01c8761250e565b9081151580806148fe575b156148cd575090846004928551938480926318160ddd60e01b82525afa9182156148c357839261488e575b5061231297986147d991612f3f565b8115614878576147e9925061498b565b905b6148548454937f6e657720696e646578206578636565647320323234206269747300000000000061483484519561482187611fbf565b6001600160e01b0388811688529661496e565b519351916148418361200e565b601a8352820152600160e01b8310614907565b6001600160e01b0391161660e09390931b6001600160e01b03191692909217905550565b505081519061488682611fbf565b8152906147eb565b9091508481813d83116148bc575b6148a6818361202a565b810103126148b85751906123126147ca565b8280fd5b503d61489c565b84513d85823e3d90fd5b9597985050505050506148de575050565b81546001600160e01b031660e09190911b6001600160e01b031916179055565b5089151561479f565b1561490f5750565b6040519062461bcd60e51b82528160208060048301528251908160248401526000935b828510614955575050604492506000838284010152601f80199101168101030190fd5b8481018201518686016044015293810193859350614932565b90612f1e91600060405161498181611fbf565b5251905190612c8a565b90600060405161499a81611fbf565b526a0c097ce7bc90715b34b9f160241b9182810292818404149015171561239e57612f1e91612ee4565b91909160018060a01b0316916000838152602060138152604080832092601783528181205496614a2e83516149f88161200e565b601c81527f626c6f636b206e756d6265722065786365656473203332206269747300000000868201526401000000004310614907565b63ffffffff431695614a44865460e01c8861250e565b918215158080614add575b15614acb5750856004918651928380926308f7a6e360e31b82525afa908115614ac1578491614a92575b5098614a8c6147d9926123129a9b614ae6565b92612f3f565b90508581813d8311614aba575b614aa9818361202a565b81010312612a5b5751614a8c614a79565b503d614a9f565b85513d86823e3d90fd5b969899505050505050506148de575050565b508a1515614a4f565b670de0b6b3a76400009081810291818304149015171561239e57612a2a915190612ee4565b6001600160a01b03908116600081815260126020908152604080832054601483528184209690951680845295825280832080546001600160e01b03909616908190559196959490929190801580614c54575b614c3f575b614b6c908261250e565b96835197614b7989611fbf565b885283516370a0823160e01b8152600481018790528181602481895afa908115614ac1578491614c10575b50614be46a0c097ce7bc90715b34b9f160241b917f2caecd17d02f56fa897705dcc740da2d237c373f70686f4e0d9bd3bf0400ea7a9798999a5190612f3f565b04928781526016825284614bfb8582842054612c8a565b918981526016845220558351928352820152a3565b90508181813d8311614c38575b614c27818361202a565b81010312612a5b5751614be4614ba4565b503d614c1d565b506a0c097ce7bc90715b34b9f160241b614b62565b506a0c097ce7bc90715b34b9f160241b821015614b5d565b6001600160a01b03908116600081815260136020908152604080832054601583528184209690951680845295825280832080546001600160e01b0390961690819055969796939490939190801580614dc0575b614dab575b614cce908361250e565b97845198614cdb8a611fbf565b895284516395dd919360e01b81526004810188905282816024818a5afa908115614da1578591614d50575b507f1fc3ecc087d8d2d15e23d0032af5a47059c3892d003d8e139fdcb6bb327c99a696979899614d486a0c097ce7bc90715b34b9f160241b93614be493614ae6565b905190612f3f565b90508281813d8311614d9a575b614d67818361202a565b81010312614d9657517f1fc3ecc087d8d2d15e23d0032af5a47059c3892d003d8e139fdcb6bb327c99a6614d06565b8480fd5b503d614d5d565b86513d87823e3d90fd5b506a0c097ce7bc90715b34b9f160241b614cc4565b506a0c097ce7bc90715b34b9f160241b831015614cbf565b60018060a01b031660009080825260196020526040822054601a602052614e0360408420544361250e565b80151580614e57575b614e17575b50505050565b614e3691614e2491612f3f565b82845260166020526040842054612c8a565b90825260166020526040822055601a60205260404391205538808080614e11565b50811515614e0c565b604080519181830183811067ffffffffffffffff821117611fdb5782526001938484526020908185019082368337855115612199576001600160a01b039384169091526000865b614f25575b5050846000905b614ebf57505050505050565b8451811015614f20578083614ed7614f1a93886123b4565b511684614ee483896123b4565b5116600052614efd6016918286528760002054906150ae565b9085614f09848a6123b4565b51166000528452856000205561238f565b85614eb3565b612a70565b81518110156150a95783614f3982846123b4565b511680600052600b845260ff8660002054161561506d57855163aa5af0fd60e01b81528481600481855afa90811561403d57600091615040575b5086518994939291614f8482611fbf565b8152614f9081836149c4565b886000865b614ffd575b505050614fa681614715565b6000845b614fc1575b5050614fba9061238f565b9091614ea7565b88949192939451811015614ff3578061109e88614fe1614fe9948d6123b4565b511685614b0b565b8194939291614faa565b8194939250614faf565b888297939495969751821015615034578461109e9161501f84615027966123b4565b511687614c6c565b8990829695949392614f95565b50829695949350614f9a565b908582813d8311615066575b615056818361202a565b81010312613fb457505138614f73565b503d61504c565b855162461bcd60e51b81526004810185905260156024820152741b585c9ad95d081b5d5cdd081899481b1a5cdd1959605a1b6044820152606490fd5b614eac565b6006546040516370a0823160e01b8152306004820152602093926001600160a01b0390921691908481602481865afa908115610a8457600091615172575b508315159081615167575b50615103575050905090565b60405163a9059cbb60e01b81526001600160a01b0391909116600482015260248101929092528290829060449082906000905af18015610a8457615149575b5050600090565b8161515f92903d106144e7576144d8818361202a565b503880615142565b9050831115386150f7565b908582813d8311615198575b615188818361202a565b81010312613fb4575051386150ec565b503d61517e565b600054336001600160a01b03918216149081156151ba575090565b905060025416331490565b156151cc57565b60405162461bcd60e51b815260206004820152601d60248201527f6f6e6c792061646d696e2063616e2073657420636f6d702073706565640000006044820152606490fd5b6001600160a01b03166000818152600b602090815260408220600101541592909190836152c8575b836152445750505090565b6040516305cee64160e21b815293508290849060049082905afa9182156152bb578192615282575b5050670de0b6b3a7640000915014388080612919565b90915082813d83116152b4575b615299818361202a565b81010312613fb45750670de0b6b3a76400009051388061526c565b503d61528f565b50604051903d90823e3d90fd5b600e8352604082205460ff161515600114935061523956fe45b96fe442630264581b197e84bbada861235052c5a1aadfff9ea4e40a969aa08d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac802a26469706673582212202f3aaff42855ba80d9fe3532e9c9cd3d6e0730d79586fd186c3de7a8b6744de364736f6c63430008110033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/src/components/trade/exchange/BuySellModal2.tsx b/src/components/trade/exchange/BuySellModal2.tsx index 06db93a..ef24d24 100644 --- a/src/components/trade/exchange/BuySellModal2.tsx +++ b/src/components/trade/exchange/BuySellModal2.tsx @@ -151,6 +151,7 @@ export default function BuySellModal2({ let _amount = Big(token0Amount) .times(10 ** token0.decimals) .toFixed(0); + // if we're buying && market order: use token1Amount if (buy && !limit) { _amount = Big(token1Amount) .times(10 ** token1.decimals) @@ -187,9 +188,10 @@ export default function BuySellModal2({ status: "loading", duration: null, }); + console.log(_amount); const res = await send( exchange, - "executeMultipleLimitOrders", + (buy && !limit) ? "executeMultipleMarketOrders": "executeMultipleLimitOrders", [ _orders.map((order: any) => order.signature), _orders.map((order: any) => order.value), @@ -213,7 +215,6 @@ export default function BuySellModal2({ _amount = Big(_amount).sub(total).toFixed(0); } if (Big(_amount).gt(0)) { - toastIdRef.current = toast({ title: "Placing order...", description: "Placing limit order offchain", diff --git a/src/pages/lend.tsx b/src/pages/lend.tsx index e5a12b2..41c43d8 100644 --- a/src/pages/lend.tsx +++ b/src/pages/lend.tsx @@ -1,10 +1,16 @@ -import { Box, Flex, Heading, Text } from "@chakra-ui/react"; +import { Box, Button, Flex, Heading, Text } from "@chakra-ui/react"; import React from "react"; import LendingTable from "../components/lever/lend/LendTable"; import BorrowTable from "../components/lever/borrow/BorrowTable"; import { LeverDataContext } from "../context/LeverDataProvider"; import { dollarFormatter, tokenFormatter } from '../utils/formatters'; +import {useEffect} from 'react'; +import { AppDataContext } from "../context/AppData"; +import { DataContext } from "../context/DataProvider"; +import { call, getContract, send } from "../utils/contract"; +import { useAccount } from 'wagmi'; +import { ChainID } from '../utils/chains'; // https://s2.coinmarketcap.com/static/img/coins/64x64/1027.png const imageIds = { @@ -15,23 +21,48 @@ const imageIds = { }; export default function lend() { - const { markets } = React.useContext(LeverDataContext); - const { availableToBorrow, totalBorrowBalance, totalCollateralBalance } = - React.useContext(LeverDataContext); + const { markets, availableToBorrow, totalBorrowBalance, totalCollateralBalance } = React.useContext(LeverDataContext); + const { chain } = React.useContext(DataContext); + const {address} = useAccount(); + const [claimLoading, setClaimLoading] = React.useState(false); - const boxStyle = { - px: 4, - py: 10, - my: 2, - bgColor: "background2", - width: "33%" - } + const [zexeAccrued, setZexeAccrued] = React.useState(null); + const boxStyle = { + px: 4, + py: 10, + my: 2, + bgColor: "background2", + width: "33%" + } + + useEffect(() => { + if(!zexeAccrued){ + getContract('Lever', chain) + .then(lever => { + call(lever, 'compAccrued', [address], chain ?? ChainID.ARB_GOERLI) + .then((res: any) => { + setZexeAccrued(res.toString()); + }) + }) + } + }) + + const claim = () => { + setClaimLoading(true); + getContract('Lever', chain) + .then(lever => { + send(lever, 'claimComp(address)', [address], chain ?? ChainID.ARB_GOERLI) + .then((res: any) => { + setClaimLoading(false); + }) + }) + } return ( <> Lend your assets - Earn with high APR % + Earn with high APR % 💰 @@ -41,7 +72,7 @@ export default function lend() { - My Balance + My Balance {dollarFormatter(null).format( parseFloat(totalCollateralBalance) @@ -52,18 +83,22 @@ export default function lend() { - Yield Accrued + $ZEXE Rewards + + - {dollarFormatter(null).format( - parseFloat(availableToBorrow) - )} + {tokenFormatter(null).format( + zexeAccrued / 10 ** 18 + )} ZEXE + + - Earning APR (%) + Earning APR (%) {tokenFormatter(null).format( 0 @@ -79,7 +114,7 @@ export default function lend() { - Borrow Balance + Borrow Balance {dollarFormatter(null).format( parseFloat(totalCollateralBalance) @@ -92,7 +127,7 @@ export default function lend() { - Available to borrow + Available to borrow {dollarFormatter(null).format( parseFloat(availableToBorrow) @@ -103,7 +138,7 @@ export default function lend() { - Interest APR (%) + Interest APR (%) {tokenFormatter(null).format( 0 diff --git a/src/styles/theme.tsx b/src/styles/theme.tsx index 5c9b70b..a48a779 100644 --- a/src/styles/theme.tsx +++ b/src/styles/theme.tsx @@ -87,17 +87,17 @@ const theme = extendTheme({ }, NumberInput: { baseStyle: { - borderRadius: '2px', + borderRadius: '0px', } }, InputGroup: { baseStyle: { - borderRadius: '2px' + borderRadius: '0px' } }, InputLeftElement: { baseStyle: { - borderRadius: '2px' + borderRadius: '0px' } } } diff --git a/src/utils/const.ts b/src/utils/const.ts index 454bbf0..786923e 100644 --- a/src/utils/const.ts +++ b/src/utils/const.ts @@ -19,9 +19,9 @@ export const ADDRESSES = { Vault: '0x4811419e3c5e1d91Ac83427562a455C22B5eA95F', }, [ChainID.ARB_GOERLI]: { - Exchange: '0x46C9Ad9bA79783017790fc4Bed4364aBB98c22Dd', + Exchange: '0x9117596d6203a71802803a18a9588C0Af67E762d', Multicall: '0x511f64296fa72526231E5A55615d8e4eE5a2d4cF', - Lever: '0x7861292fd666f7c744a694D3B83B708b13a419f7' + Lever: '0x164b3876d65a71881Bd2D661c3506f4845C374E0' } }; diff --git a/src/utils/contract.ts b/src/utils/contract.ts index 65c3dcd..919ee11 100644 --- a/src/utils/contract.ts +++ b/src/utils/contract.ts @@ -7,7 +7,8 @@ export function getABI(contractName: string) { return contractBuild.abi; } -export function getAddress(contractName: string, chain: number = ChainID.NILE) { +export function getAddress(contractName: string, chain: number = ChainID.ARB_GOERLI) { + if(!chain) chain = ChainID.ARB_GOERLI; return ADDRESSES[chain][contractName] } From 81e803968f3ff920183398516d2e2114b9219edf Mon Sep 17 00:00:00 2001 From: prasad-kumkar Date: Mon, 19 Dec 2022 15:12:26 +0530 Subject: [PATCH 23/37] buy sell --- src/components/trade/exchange/BuySellModal2.tsx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/components/trade/exchange/BuySellModal2.tsx b/src/components/trade/exchange/BuySellModal2.tsx index ef24d24..2984763 100644 --- a/src/components/trade/exchange/BuySellModal2.tsx +++ b/src/components/trade/exchange/BuySellModal2.tsx @@ -39,6 +39,7 @@ import { send, } from "../../../utils/contract"; import { ethers } from "ethers"; +import { tokenFormatter } from "../../../utils/formatters"; export default function BuySellModal2({ pair, @@ -177,14 +178,12 @@ export default function BuySellModal2({ ) ).data.data; - console.log(_orders) - if (_orders.length > 0) { const exchange = await getContract("Exchange", chain); toast.close(toastIdRef.current); toastIdRef.current = toast({ title: "Sending transaction...", - description: "Executing orders within limit", + description: `Executing orders within ${tokenFormatter(null).format(price)} ${token1.symbol}/${token0.symbol} limit`, status: "loading", duration: null, }); @@ -214,10 +213,11 @@ export default function BuySellModal2({ _amount = Big(_amount).sub(total).toFixed(0); } - if (Big(_amount).gt(0)) { + if (Big(_amount).gt(0) && limit) { + toast.close(toastIdRef.current); toastIdRef.current = toast({ title: "Placing order...", - description: "Placing limit order offchain", + description: `Creating limit order of ${tokenFormatter(null).format(_amount/1e18)} ${token0.symbol} at ${tokenFormatter(null).format(price)} ${token1.symbol}/${token0.symbol}`, status: "loading", duration: null, }); @@ -289,7 +289,7 @@ export default function BuySellModal2({ toast.close(toastIdRef.current); toast({ title: "Order executed successfully!", - description: "Order was executed within limit!", + description: "Amount was filled within limit!", status: "success", }); } From dc32323d97df4dfba1364caae5e0ee2a29e7db54 Mon Sep 17 00:00:00 2001 From: prasad-kumkar Date: Mon, 19 Dec 2022 15:50:12 +0530 Subject: [PATCH 24/37] chart color --- public/css/style.css | 3 + public/favicon.png | Bin 6580 -> 4603 bytes src/components/graph/index.jsx | 89 ++++++++++++++++++++++++-- src/components/graph/index.module.css | 8 +-- 4 files changed, 90 insertions(+), 10 deletions(-) create mode 100644 public/css/style.css diff --git a/public/css/style.css b/public/css/style.css new file mode 100644 index 0000000..edd1308 --- /dev/null +++ b/public/css/style.css @@ -0,0 +1,3 @@ +.theme-dark:root { + --tv-color-pane-background: #130B25; +} \ No newline at end of file diff --git a/public/favicon.png b/public/favicon.png index af425abf5b45329ae275d21684e4a28c835b829d..8321f525003538f0b69e4a5f59257e104215aa79 100644 GIT binary patch literal 4603 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 S7T5Q`G?e8v_>IMGNK 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 md)4NJ2wmcyWndU4HU1wt)JxWSJhbot0000oC4 diff --git a/src/components/graph/index.jsx b/src/components/graph/index.jsx index bd30138..878edf1 100644 --- a/src/components/graph/index.jsx +++ b/src/components/graph/index.jsx @@ -14,6 +14,9 @@ function getLanguageFromURL() { : decodeURIComponent(results[1].replace(/\+/g, " ")); } +const GREEN = "#18B05F"; +const RED = "#C83232"; + export class Graph extends React.PureComponent { static defaultProps = { symbol: "BTC_USDC", @@ -46,13 +49,54 @@ export class Graph extends React.PureComponent { library_path: this.props.libraryPath, locale: getLanguageFromURL() || "en", - disabled_features: ["use_localstorage_for_settings", "header_symbol_search", "header_compare", "header_undo_redo", "header_screenshot"], - + disabled_features: [ + "use_localstorage_for_settings", + "header_symbol_search", "header_compare", + "header_undo_redo", + "header_screenshot", + "link_to_tradingview", + "chart_property_page_trading", + "chart_crosshair_menu", + "hide_last_na_study_output" + ], + enabled_features: [ + "minimalistic_logo", + "narrow_chart_enabled", + "study_templates", + "show_logo_on_all_charts" + ], + logo: { + image: "/favicon.png", + link: "https://www.zexe.io/" + }, + theme: 'dark', + toolbar_bg: 'transparent', + loading_screen: { + backgroundColor: "transparent", + }, + client_id: 'zexe.io', + overrides: { + "paneProperties.background": "#09001F", + "paneProperties.backgroundType": "solid", + "mainSeriesProperties.candleStyle.wickUpColor": GREEN, + "mainSeriesProperties.candleStyle.wickDownColor": '#C83232', + "paneProperties.vertGridProperties.color": "#363c4e", + "paneProperties.horzGridProperties.color": "#363c4e", + }, + // enabled_features: ["study_templates"], + // charts_storage_url: this.props.chartsStorageUrl, + // charts_storage_api_version: this.props.chartsStorageApiVersion, + // client_id: this.props.clientId, + // user_id: this.props.userId, + // fullscreen: this.props.fullscreen, + // autosize: this.props.autosize, + // studies_overrides: this.props.studiesOverrides, theme: 'dark', toolbar_bg: '#130B25', width: '100%', height: '600', + header_widget_buttons_mode: 'compact' }; const tvWidget = new widget(widgetOptions); @@ -67,9 +111,46 @@ export class Graph extends React.PureComponent { interval: this.props.interval, container: this.ref.current, library_path: this.props.libraryPath, - + custom_css_url: '/css/style.css', locale: getLanguageFromURL() || "en", - disabled_features: ["use_localstorage_for_settings", "header_symbol_search", "header_compare", "header_undo_redo", "header_screenshot"], + disabled_features: [ + "use_localstorage_for_settings", + "header_symbol_search", "header_compare", + "header_undo_redo", + "header_screenshot", + "link_to_tradingview", + "chart_property_page_trading", + "chart_crosshair_menu", + "hide_last_na_study_output" + ], + enabled_features: [ + "minimalistic_logo", + "narrow_chart_enabled", + "study_templates", + "show_logo_on_all_charts" + ], + logo: { + image: "/favicon.png", + link: "https://www.zexe.io/" + }, + theme: 'dark', + toolbar_bg: 'transparent', + loading_screen: { + backgroundColor: "transparent", + }, + client_id: 'zexe.io', + overrides: { + "paneProperties.background": "#09001F", + "paneProperties.backgroundType": "solid", + "mainSeriesProperties.candleStyle.wickUpColor": GREEN, + "mainSeriesProperties.candleStyle.wickDownColor": RED, + "mainSeriesProperties.candleStyle.upColor": GREEN, + "mainSeriesProperties.candleStyle.downColor": RED, + "mainSeriesProperties.candleStyle.borderUpColor": GREEN, + "mainSeriesProperties.candleStyle.borderDownColor": RED, + "paneProperties.vertGridProperties.color": "#363c4e", + "paneProperties.horzGridProperties.color": "#363c4e", + }, // enabled_features: ["study_templates"], // charts_storage_url: this.props.chartsStorageUrl, // charts_storage_api_version: this.props.chartsStorageApiVersion, diff --git a/src/components/graph/index.module.css b/src/components/graph/index.module.css index fe18452..019174d 100644 --- a/src/components/graph/index.module.css +++ b/src/components/graph/index.module.css @@ -1,4 +1,4 @@ -.VersionHeader { +/* .VersionHeader { text-align: center; display: flex; justify-content: center; @@ -6,8 +6,4 @@ background-color: #222; color: #fff; font-family: Arial, Helvetica, sans-serif; -} - -.TVChartContainer { - height: calc(100vh - 80px); -} +} */ From 8d5a8a1003df1ab3313d32839884b8780a516b5f Mon Sep 17 00:00:00 2001 From: prasad-kumkar Date: Mon, 19 Dec 2022 16:56:30 +0530 Subject: [PATCH 25/37] cancel order --- src/components/graph/index.jsx | 8 +- src/components/trade/Orders/OrderBook.tsx | 10 +- src/components/trade/Orders/OrderHistory.tsx | 10 +- src/components/trade/Orders/OrdersPanel.tsx | 2 +- .../trade/exchange/BuySellModal2.tsx | 5 +- .../trade/user_orders/CancelOrder.tsx | 56 ++----- .../trade/user_orders/CancelledOrders.tsx | 99 ----------- .../trade/user_orders/ExecutedOrders.tsx | 157 +++++++++++------- .../trade/user_orders/PlacedOrders.tsx | 54 +++--- src/components/trade/user_orders/index.tsx | 8 +- src/context/DataProvider.tsx | 1 + src/pages/graph.tsx | 14 -- src/pages/index.tsx | 8 +- src/pages/lend.tsx | 10 +- src/pages/trade/[pairId].tsx | 4 +- src/styles/globals.css | 2 +- 16 files changed, 185 insertions(+), 263 deletions(-) delete mode 100644 src/components/trade/user_orders/CancelledOrders.tsx delete mode 100644 src/pages/graph.tsx diff --git a/src/components/graph/index.jsx b/src/components/graph/index.jsx index 878edf1..384e43e 100644 --- a/src/components/graph/index.jsx +++ b/src/components/graph/index.jsx @@ -47,7 +47,7 @@ export class Graph extends React.PureComponent { interval: this.props.interval, container: this.ref.current, library_path: this.props.libraryPath, - + custom_css_url: '/css/style.css', locale: getLanguageFromURL() || "en", disabled_features: [ "use_localstorage_for_settings", @@ -79,7 +79,11 @@ export class Graph extends React.PureComponent { "paneProperties.background": "#09001F", "paneProperties.backgroundType": "solid", "mainSeriesProperties.candleStyle.wickUpColor": GREEN, - "mainSeriesProperties.candleStyle.wickDownColor": '#C83232', + "mainSeriesProperties.candleStyle.wickDownColor": RED, + "mainSeriesProperties.candleStyle.upColor": GREEN, + "mainSeriesProperties.candleStyle.downColor": RED, + "mainSeriesProperties.candleStyle.borderUpColor": GREEN, + "mainSeriesProperties.candleStyle.borderDownColor": RED, "paneProperties.vertGridProperties.color": "#363c4e", "paneProperties.horzGridProperties.color": "#363c4e", }, diff --git a/src/components/trade/Orders/OrderBook.tsx b/src/components/trade/Orders/OrderBook.tsx index 9270288..b4665da 100644 --- a/src/components/trade/Orders/OrderBook.tsx +++ b/src/components/trade/Orders/OrderBook.tsx @@ -63,9 +63,9 @@ export default function OrderBook({ pair }) { return ( - Amount {pair?.tokens[0].symbol} - Amount {pair?.tokens[1].symbol} - Price {pair?.tokens[1].symbol} + {pair?.tokens[0].symbol} + {pair?.tokens[1].symbol} + {pair?.tokens[1].symbol}/{pair?.tokens[0].symbol} {[...sellOrders].slice(0, 22).reverse().map((order: any, index: number) => { return ( @@ -81,7 +81,7 @@ export default function OrderBook({ pair }) { ); })} - + @@ -97,7 +97,7 @@ export default function OrderBook({ pair }) { {tokenFormatter(pair?.exchangeRateDecimals).format(pair?.exchangeRate / (10**18))} - + {buyOrders.slice(0, 22).map((order: any, index: number) => { return ( diff --git a/src/components/trade/Orders/OrderHistory.tsx b/src/components/trade/Orders/OrderHistory.tsx index 479b977..e984649 100644 --- a/src/components/trade/Orders/OrderHistory.tsx +++ b/src/components/trade/Orders/OrderHistory.tsx @@ -8,8 +8,8 @@ const Order = ({ order, pair, index }) => { return ( @@ -32,9 +32,9 @@ export default function OrderHistory({pair}) { return ( - Amount {pair?.tokens[0].symbol} - Amount {pair?.tokens[1].symbol} - Price {pair?.tokens[1].symbol} + {pair?.tokens[0].symbol} + {pair?.tokens[1].symbol} + {pair?.tokens[1].symbol}/{pair?.tokens[0].symbol} {(pairExecutedData[pair?.id]) && pairExecutedData[pair?.id].slice(0,47).map((order: any, index: number) => { return ; diff --git a/src/components/trade/Orders/OrdersPanel.tsx b/src/components/trade/Orders/OrdersPanel.tsx index c760383..01b5f46 100644 --- a/src/components/trade/Orders/OrdersPanel.tsx +++ b/src/components/trade/Orders/OrdersPanel.tsx @@ -45,7 +45,7 @@ export default function OrdersPanel({ pair }) { diff --git a/src/components/trade/exchange/BuySellModal2.tsx b/src/components/trade/exchange/BuySellModal2.tsx index 2984763..6fc3b3f 100644 --- a/src/components/trade/exchange/BuySellModal2.tsx +++ b/src/components/trade/exchange/BuySellModal2.tsx @@ -178,6 +178,7 @@ export default function BuySellModal2({ ) ).data.data; + console.log(_orders); if (_orders.length > 0) { const exchange = await getContract("Exchange", chain); toast.close(toastIdRef.current); @@ -344,9 +345,7 @@ export default function BuySellModal2({ ? "Enter Amount" : amountExceedsBalance() ? "Insufficient Trading Balance" - : buy - ? "Limit Buy" - : "Limit Sell"} + : (limit ? "Limit " : "Market ") + (buy ? "Buy" : "Sell")} ) : ( @@ -146,11 +119,11 @@ export default function CancelOrder({ You are about to cancel the following order: Order Amount - {order.amount/(10**token0?.decimals)} {token0?.symbol} + {order.value.amount/(10**token0?.decimals)} {token0?.symbol} Exchange Rate - {order.exchangeRate/(10**18)} {token1?.symbol}/{token0?.symbol} + {order.value.exchangeRate/(10**18)} {token1?.symbol}/{token0?.symbol} Order Type - {order.orderType == '0' ? 'Buy' : 'Sell'} + {order.value.buy ? 'Buy' : 'Sell'} @@ -196,7 +169,8 @@ export default function CancelOrder({ ) : ( <>
+ + ) : ( + + No executed orders + + )} ); } diff --git a/src/components/trade/user_orders/PlacedOrders.tsx b/src/components/trade/user_orders/PlacedOrders.tsx index 381481b..9e3831a 100644 --- a/src/components/trade/user_orders/PlacedOrders.tsx +++ b/src/components/trade/user_orders/PlacedOrders.tsx @@ -1,4 +1,4 @@ -import { Box, Text, IconButton, Flex } from '@chakra-ui/react'; +import { Box, Text, IconButton, Flex, Tag } from '@chakra-ui/react'; import React from 'react'; import { Table, @@ -43,14 +43,14 @@ export default function PlacedOrders({ pair }) { return ( - {pair && placedOrders[pair?.id]?.length > 0 ? + {placedOrders[pair?.id] ? - - - - + + + + @@ -60,31 +60,45 @@ export default function PlacedOrders({ pair }) { - - - diff --git a/src/components/trade/user_orders/index.tsx b/src/components/trade/user_orders/index.tsx index d3aed5b..6abba2a 100644 --- a/src/components/trade/user_orders/index.tsx +++ b/src/components/trade/user_orders/index.tsx @@ -9,9 +9,9 @@ export default function index({ pair }) { <> - Placed Orders + Active Orders Order History - Cancelled Orders + {/* Cancelled Orders */} @@ -21,9 +21,9 @@ export default function index({ pair }) { - + {/* - + */} diff --git a/src/context/DataProvider.tsx b/src/context/DataProvider.tsx index 6918f7c..cfeed88 100644 --- a/src/context/DataProvider.tsx +++ b/src/context/DataProvider.tsx @@ -200,6 +200,7 @@ function DataProvider({ children }: any) { let _cancelledOrders = {}; let _executedOrders = {}; for(let i = 0; i < pairs.length; i++){ + console.log('placed', res[i*3].data); _placedOrders[pairs[i].id] = res[i*3].data.data; _cancelledOrders[pairs[i].id] = res[i*3+1].data.data; _executedOrders[pairs[i].id] = res[i*3+2].data.data; diff --git a/src/pages/graph.tsx b/src/pages/graph.tsx deleted file mode 100644 index 00b8b54..0000000 --- a/src/pages/graph.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import React from 'react'; -import dynamic from 'next/dynamic'; - -const TVChartContainer = dynamic( - () => - import('../components/graph').then(mod => mod.TVChartContainer), - { ssr: false }, -); - -const Index = ({symbol}) => { - return (); -}; - -export default Index; diff --git a/src/pages/index.tsx b/src/pages/index.tsx index 5daf15b..1bcb3be 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -94,7 +94,7 @@ const Index = () => { Spot Trading - Market and limit orders with stop losses + Market and limit orders with conditional execution @@ -108,7 +108,7 @@ const Index = () => { Margin and Futures - With upto 10x leverage + With upto 25x leverage with upto 50+ token pairs @@ -120,9 +120,9 @@ const Index = () => { - Perpetuals + Option Calls - Take advantage of upswings in the market + Take advantage of up/down swings in the market diff --git a/src/pages/lend.tsx b/src/pages/lend.tsx index 41c43d8..fa1af21 100644 --- a/src/pages/lend.tsx +++ b/src/pages/lend.tsx @@ -30,9 +30,9 @@ export default function lend() { const boxStyle = { px: 4, py: 10, - my: 2, + my: 1, bgColor: "background2", - width: "33%" + width: 100/3 + "%" } useEffect(() => { @@ -59,7 +59,7 @@ export default function lend() { } return ( <> - + Lend your assets Earn with high APR % 💰 @@ -68,7 +68,7 @@ export default function lend() { - + @@ -110,7 +110,7 @@ export default function lend() { - + diff --git a/src/pages/trade/[pairId].tsx b/src/pages/trade/[pairId].tsx index 504b0bc..3ff56f3 100644 --- a/src/pages/trade/[pairId].tsx +++ b/src/pages/trade/[pairId].tsx @@ -8,7 +8,7 @@ import Swap from '../../components/trade/exchange/Limit'; import { useContext } from 'react'; import { DataContext } from '../../context/DataProvider'; import { useRouter } from 'next/router'; -import PlacedOrders from '../../components/trade/user_orders/PlacedOrders'; +import PlacedOrders from '../../components/trade/user_orders'; import { useEffect, useState } from 'react'; import Exchange from '../../components/trade/exchange'; import Head from 'next/head'; @@ -74,7 +74,7 @@ const Trade = () => { - + diff --git a/src/styles/globals.css b/src/styles/globals.css index 679d147..d4a495b 100644 --- a/src/styles/globals.css +++ b/src/styles/globals.css @@ -1 +1 @@ -@import url('https://fonts.googleapis.com/css2?family=Zen+Dots&display=swap'); \ No newline at end of file +@import url('https://fonts.googleapis.com/css2?family=Zen+Dots&display=swap'); From bdf13069c1972cf1f4f1a561cb324deea9b480d1 Mon Sep 17 00:00:00 2001 From: prasad-kumkar Date: Mon, 19 Dec 2022 18:58:03 +0530 Subject: [PATCH 26/37] update --- .../trade/exchange/BuySellModal2.tsx | 10 +- .../trade/user_orders/ExecutedOrders.tsx | 3 +- src/context/DataProvider.tsx | 107 +++++++++--------- src/utils/const.ts | 4 +- 4 files changed, 65 insertions(+), 59 deletions(-) diff --git a/src/components/trade/exchange/BuySellModal2.tsx b/src/components/trade/exchange/BuySellModal2.tsx index 6fc3b3f..43960fa 100644 --- a/src/components/trade/exchange/BuySellModal2.tsx +++ b/src/components/trade/exchange/BuySellModal2.tsx @@ -71,12 +71,13 @@ export default function BuySellModal2({ useSignTypedData(); const amountExceedsBalance = () => { + if(!token1 || !token0) return true const amount = buy ? token0Amount * price : token0Amount; const balance = buy - ? token1?.balance / 10 ** token1?.decimals - : token0?.balance / 10 ** token0?.decimals; + ? token1.balance / 10 ** token1.decimals + : token0.balance / 10 ** token0.decimals; - if (isNaN(Number(amount))) return false; + if (isNaN(Number(amount)) || isNaN(Number(balance))) return true; return Big(amount).gt(balance); }; @@ -330,6 +331,7 @@ export default function BuySellModal2({ onClick={execute} disabled={ loading || + isNaN(Number(token0Amount)) || !Big(token0Amount).gt(0) || !isEvmConnected || amountExceedsBalance() || @@ -341,7 +343,7 @@ export default function BuySellModal2({ > {!isEvmConnected ? "Connect Wallet" - : !Big(token0Amount).gt(0) + : (isNaN(Number(token0Amount)) || !Big(token0Amount).gt(0)) ? "Enter Amount" : amountExceedsBalance() ? "Insufficient Trading Balance" diff --git a/src/components/trade/user_orders/ExecutedOrders.tsx b/src/components/trade/user_orders/ExecutedOrders.tsx index 529ce51..9d11f6e 100644 --- a/src/components/trade/user_orders/ExecutedOrders.tsx +++ b/src/components/trade/user_orders/ExecutedOrders.tsx @@ -40,6 +40,7 @@ export default function ExecutedOrders({ pair }) { } for(let i in cancelledOrders[pair?.id]){ cancelledOrders[pair?.id][i].cancelled = true; + cancelledOrders[pair?.id][i].fillAmount = cancelledOrders[pair?.id][i].balanceAmount; orders.push(cancelledOrders[pair?.id][i]); } return orders; @@ -93,7 +94,7 @@ export default function ExecutedOrders({ pair }) { - {placedOrders[pair?.id]?.slice(0, 10).map( + {placedOrders[pair?.id]?.slice(0, 3).map( (order: any, index: number) => { return ( diff --git a/src/context/DataProvider.tsx b/src/context/DataProvider.tsx index 0e51951..d9c2fbd 100644 --- a/src/context/DataProvider.tsx +++ b/src/context/DataProvider.tsx @@ -34,6 +34,8 @@ function DataProvider({ children }: any) { const [chain, setChain] = React.useState(null); const [block, setBlock] = React.useState(null); const [refresh, setRefresh] = React.useState(false); + const [refresh2, setRefresh2] = React.useState(false); + const [refresh3, setRefresh3] = React.useState(false); React.useEffect(() => {}, []) @@ -88,7 +90,6 @@ function DataProvider({ children }: any) { _pairs = res[0].data.data; setPairs(_pairs); fetchPairData(_pairs, chain); - subscribePairHistory(_pairs); if(firstTime) { @@ -117,19 +118,22 @@ function DataProvider({ children }: any) { setIsFetchingData(false); }; - const subscribePairHistory = (_pairs: any[]) => { - // const socket = io('http://localhost:3010') - // socket.on('PAIR_HISTORY', ({pair, amount, buy, exchangeRate}) => { - // for(let i in _pairs) { - // if(_pairs[i].id === pair) { - // _pairs[i].priceDiff = Big(_pairs[i].exchangeRate).minus(exchangeRate).toString(); - // _pairs[i].exchangeRate = exchangeRate; - // console.log('found pair', _pairs[i]); - // } - // } - // console.log('pairs', _pairs); - // setPairs(_pairs); - // }) + const subscribePairHistory = (__pairs: any[]) => { + const _pairs = __pairs; + let _refresh3 = refresh3; + socket.on('PAIR_HISTORY', ({pair, amount, buy, exchangeRate}) => { + for(let i in _pairs) { + if(_pairs[i].id === pair) { + _pairs[i].priceDiff = Big(exchangeRate).minus(_pairs[i].exchangeRate).toString(); + _pairs[i].exchangeRate = exchangeRate; + console.log('found pair', _pairs[i]); + } + } + console.log('pairs', _pairs); + setPairs(_pairs); + _refresh3 = !_refresh3; + setRefresh3(_refresh3); + }) } const fetchOrders = (pairs: any[], chain: number) => { @@ -149,11 +153,11 @@ function DataProvider({ children }: any) { let _refresh = refresh; socket.on('PAIR_ORDER', ({amount, buy, exchangeRate, pair}) => { let _orders = buy ? newOrders[pair.toLowerCase()].buyOrders : newOrders[pair.toLowerCase()].sellOrders.reverse(); + console.log(_orders); for(let i = 0; i < _orders.length; i++){ console.log(exchangeRate, _orders[i].exchangeRate); if(_orders[i].exchangeRate === exchangeRate){ - console.log('Found order'); _orders[i].amount = Big(_orders[i].amount).plus(amount).toString(); break; } @@ -172,6 +176,11 @@ function DataProvider({ children }: any) { if(_orders.length === 0){ _orders.push({amount, exchangeRate}); } + for(let i in _orders){ + if(Big(_orders[i].amount).lt(1e10)){ + _orders.splice(i, 1); + } + } if(buy){ newOrders[pair.toLowerCase()].buyOrders = _orders; } else { @@ -219,6 +228,13 @@ function DataProvider({ children }: any) { setPlacedOrders(_placedOrders); }) } + + const addPlacedOrder = (order: any) => { + let _placedOrders = placedOrders; + _placedOrders[order.pair.toLowerCase()].splice(0, 0, order); + setPlacedOrders(_placedOrders); + setRefresh2(!refresh2); + } // GRAPH const fetchPairData = (pairs: any[], chain: number) => { @@ -282,7 +298,8 @@ function DataProvider({ children }: any) { pairStats, chain, setChain, explorer, - incrementAllowance + incrementAllowance, + addPlacedOrder }; return ( @@ -306,7 +323,8 @@ interface DataValue { pairStats: any, chain: number, setChain: (chain: number) => void, explorer: () => string, - incrementAllowance: (token: string, amount: string) => Promise + incrementAllowance: (token: string, amount: string) => Promise, + addPlacedOrder: (order: any) => void } export { DataProvider, DataContext }; diff --git a/src/utils/const.ts b/src/utils/const.ts index e28e613..b74bdf1 100644 --- a/src/utils/const.ts +++ b/src/utils/const.ts @@ -19,16 +19,16 @@ export const ADDRESSES = { Vault: '0x4811419e3c5e1d91Ac83427562a455C22B5eA95F', }, [ChainID.ARB_GOERLI]: { - Exchange: '0xf0eeA3DC35CDAB740D04A8E08E32d184F6918Fe6', + Exchange: '0x24c987fa29f40BA629FB47e8fd9d929Dee4b5760', Multicall: '0x511f64296fa72526231E5A55615d8e4eE5a2d4cF', - Lever: '0x93DF85a2B89DbC443D9AbbBa9216Ce066127dC0B' + Lever: '0xdE6C331910163C16EaF6F6BCc0E184CBC0CE0853' } }; export const Endpoints = { [ChainID.NILE]: 'https://api.zexe.io/', [ChainID.AURORA]: 'https://aurora.api.zexe.io/', - [ChainID.ARB_GOERLI]: 'http://localhost:3010/' // 'http://65.20.81.124:8090/', + [ChainID.ARB_GOERLI]: 'http://65.20.81.124:8090/', }; // list of tokens From 40bb49b3f7eae7fe94a7a76dac2177c51728de6a Mon Sep 17 00:00:00 2001 From: prasad-kumkar Date: Tue, 20 Dec 2022 12:55:21 +0530 Subject: [PATCH 28/37] fixed build issues --- src/components/trade/exchange/BuySellModal2.tsx | 6 +++--- src/components/trade/user_orders/index.tsx | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/components/trade/exchange/BuySellModal2.tsx b/src/components/trade/exchange/BuySellModal2.tsx index d2eda17..e158eb8 100644 --- a/src/components/trade/exchange/BuySellModal2.tsx +++ b/src/components/trade/exchange/BuySellModal2.tsx @@ -56,7 +56,7 @@ export default function BuySellModal2({ if (price == "") price = "0"; const toast = useToast(); - const toastIdRef = React.useRef(); + const toastIdRef = React.useRef(); const [orderToPlace, setOrderToPlace] = React.useState(null); @@ -147,7 +147,7 @@ export default function BuySellModal2({ if (_orders.length > 0) { const exchange = await getContract("Exchange", chain); toast.close(toastIdRef.current); - toastIdRef.current = toast({ + (toastIdRef as any).current = toast({ title: "Sending transaction...", description: `Executing orders within ${tokenFormatter(null).format(price)} ${token1.symbol}/${token0.symbol} limit`, status: "loading", @@ -181,7 +181,7 @@ export default function BuySellModal2({ } if (Big(_amount).gt(0) && limit) { toast.close(toastIdRef.current); - toastIdRef.current = toast({ + (toastIdRef as any).current = toast({ title: "Placing order...", description: `Creating limit order of ${tokenFormatter(null).format(_amount/1e18)} ${token0.symbol} at ${tokenFormatter(null).format(price)} ${token1.symbol}/${token0.symbol}`, status: "loading", diff --git a/src/components/trade/user_orders/index.tsx b/src/components/trade/user_orders/index.tsx index 6abba2a..409b431 100644 --- a/src/components/trade/user_orders/index.tsx +++ b/src/components/trade/user_orders/index.tsx @@ -2,7 +2,6 @@ import React from "react"; import { Tabs, TabList, TabPanels, Tab, TabPanel } from "@chakra-ui/react"; import PlacedOrders from "./PlacedOrders"; import ExecutedOrders from "./ExecutedOrders"; -import CancelledOrders from "./CancelledOrders"; export default function index({ pair }) { return ( From 0c729aaf279a48679976e473a8f907b994f80b59 Mon Sep 17 00:00:00 2001 From: prasad-kumkar Date: Tue, 20 Dec 2022 13:07:10 +0530 Subject: [PATCH 29/37] fixed build issues --- src/components/trade/Orders/OrdersPanel.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/trade/Orders/OrdersPanel.tsx b/src/components/trade/Orders/OrdersPanel.tsx index 01b5f46..b0f4ad6 100644 --- a/src/components/trade/Orders/OrdersPanel.tsx +++ b/src/components/trade/Orders/OrdersPanel.tsx @@ -9,8 +9,8 @@ import { Flex, Text, } from "@chakra-ui/react"; -import OrderBook from "../orders/OrderBook"; -import OrderHistory from "../orders/OrderHistory"; +import OrderBook from "./OrderBook"; +import OrderHistory from "./OrderHistory"; export default function OrdersPanel({ pair }) { return ( From 12680c318364f5dcb018979ec4c83cc18a4a43e1 Mon Sep 17 00:00:00 2001 From: prasad-kumkar Date: Tue, 20 Dec 2022 13:28:42 +0530 Subject: [PATCH 30/37] api address fix --- .../trade/exchange/BuySellModal2.tsx | 2 +- src/components/trade/exchange/PlaceOrder.tsx | 4 +- src/pages/_margin/[pairId].tsx | 88 ------------------- src/pages/_margin/index.tsx | 26 ------ src/utils/socket.ts | 4 +- 5 files changed, 6 insertions(+), 118 deletions(-) delete mode 100644 src/pages/_margin/[pairId].tsx delete mode 100644 src/pages/_margin/index.tsx diff --git a/src/components/trade/exchange/BuySellModal2.tsx b/src/components/trade/exchange/BuySellModal2.tsx index e158eb8..d2d7346 100644 --- a/src/components/trade/exchange/BuySellModal2.tsx +++ b/src/components/trade/exchange/BuySellModal2.tsx @@ -226,7 +226,7 @@ export default function BuySellModal2({ }).then((signature) => { console.log(signature); axios - .post("http://localhost:3010/order/create", { + .post(Endpoints[chain] + "order/create", { signature, data: value, chainId: chain.toString(), diff --git a/src/components/trade/exchange/PlaceOrder.tsx b/src/components/trade/exchange/PlaceOrder.tsx index e75298d..6dfdf0a 100644 --- a/src/components/trade/exchange/PlaceOrder.tsx +++ b/src/components/trade/exchange/PlaceOrder.tsx @@ -8,7 +8,7 @@ import { useAccount, useSignTypedData } from "wagmi"; import { DataContext } from "../../../context/DataProvider"; import { getAddress, getContract, send } from "../../../utils/contract"; import Image from "next/image"; -import { imageIds } from "../../../utils/const"; +import { imageIds, Endpoints } from '../../../utils/const'; export default function PlaceOrder({ orderAmount, amountToPlace, @@ -120,7 +120,7 @@ export default function PlaceOrder({ }).then((signature) => { console.log(signature); axios - .post("http://localhost:3010/order/create", { + .post(Endpoints[chain] + "order/create", { signature, data: value, chainId: chain.toString(), diff --git a/src/pages/_margin/[pairId].tsx b/src/pages/_margin/[pairId].tsx deleted file mode 100644 index 0bdf4df..0000000 --- a/src/pages/_margin/[pairId].tsx +++ /dev/null @@ -1,88 +0,0 @@ -import { Box, Flex, Tag, Text, useColorMode } from '@chakra-ui/react'; -import { Header } from '../../components/Header'; -import GraphPanel from '../../components/trade/GraphPanel'; -import TokensPanel from '../../components/trade/tokens/TokensPanel'; -import OrdersPanel from '../../components/trade/orders/OrdersPanel'; -import TitlePanel from '../../components/trade/TitlePanel'; -import Swap from '../../components/trade/exchange/Limit'; -import { useContext } from 'react'; -import { DataContext } from '../../context/DataProvider'; -import { useRouter } from 'next/router'; -import PlacedOrders from '../../components/trade/user_orders/PlacedOrders'; -import { useEffect, useState } from 'react'; -import Exchange from '../../components/trade/exchange'; -import Head from 'next/head'; -import { useAccount } from 'wagmi'; - -const Trade = () => { - const { pairs } = useContext(DataContext); - - const { isConnected: isEvmConnected } = useAccount(); - - const router = useRouter(); - const { pairId } = router.query; - const [pair, setPair] = useState(null); - - // pairId = USD_ETH - - useEffect(() => { - if (pairs.length > 0) { - let _pair = pairs.find( - (pair) => - pair.tokens[0].symbol + '_' + pair.tokens[1].symbol === - pairId - ); - setPair(_pair); - if(!_pair) router.push('/trade/' + pairs[0].tokens[0].symbol + '_' + pairs[0].tokens[1].symbol) - } - }); - - return ( - <> - - - {pair?.exchangeRate / 10 ** 18}{' '} - {pair?.tokens[1].symbol}/{pair?.tokens[0].symbol} | ZEXE | - Buy & Sell Crypto on TRON - - - - - - - - - - - - - - - - - - - - - - - - - ); -}; - -export default Trade; diff --git a/src/pages/_margin/index.tsx b/src/pages/_margin/index.tsx deleted file mode 100644 index 7bfa96d..0000000 --- a/src/pages/_margin/index.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import React from 'react' -import { useRouter } from 'next/router' -import { Box, Text, Flex } from '@chakra-ui/react' -import { useContext, useEffect } from 'react'; -import { DataContext } from '../../context/DataProvider'; - -export default function trade() { - - const router = useRouter(); - const {pairs} = useContext(DataContext); - - useEffect(() => { - if(pairs.length > 0){ - router.push('/margin/' + pairs[0].tokens[0].symbol + '_' + pairs[0].tokens[1].symbol) - } - }) - return ( - <> - - {/* {(!isConnecting && !isConnecting) && - Please connect your wallet to continue - } */} - - - ) -} diff --git a/src/utils/socket.ts b/src/utils/socket.ts index b3b1470..d8ec388 100644 --- a/src/utils/socket.ts +++ b/src/utils/socket.ts @@ -1,10 +1,12 @@ import {io, Socket} from 'socket.io-client'; +import { Endpoints } from './const'; +import { ChainID } from './chains'; class ClientSocket { private socket: Socket; constructor() { - this.socket = io('http://localhost:3010'); + this.socket = io(Endpoints[ChainID.ARB_GOERLI]); } public on(eventName: string, callback: Function) { From 6c80170ad6af4ab665432e33a0697406cdb422fa Mon Sep 17 00:00:00 2001 From: prasad-kumkar Date: Wed, 21 Dec 2022 12:56:20 +0530 Subject: [PATCH 31/37] paginate, inorder balance, market --- package.json | 1 + src/components/graph/index.jsx | 43 ++-- src/components/lever/borrow/BorrowModal.tsx | 11 +- src/components/lever/borrow/BorrowTable.tsx | 18 +- src/components/lever/lend/LendTable.tsx | 12 +- src/components/trade/exchange/Buy.tsx | 6 +- src/components/trade/exchange/Sell.tsx | 6 +- .../trade/user_orders/ExecutedOrders.tsx | 230 ++++++++++++------ .../trade/user_orders/PlacedOrders.tsx | 69 +++++- src/context/DataProvider.tsx | 6 + src/context/LeverDataProvider.tsx | 2 + src/pages/lend.tsx | 45 +++- src/utils/contract.ts | 2 +- yarn.lock | 15 +- 14 files changed, 321 insertions(+), 145 deletions(-) diff --git a/package.json b/package.json index b015a9f..1716778 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "start": "next start" }, "dependencies": { + "@ajna/pagination": "^1.4.19", "@chakra-ui/icons": "^2.0.2", "@chakra-ui/react": "^2.2.1", "@chakra-ui/theme-tools": "^2.0.2", diff --git a/src/components/graph/index.jsx b/src/components/graph/index.jsx index 384e43e..095b8c2 100644 --- a/src/components/graph/index.jsx +++ b/src/components/graph/index.jsx @@ -5,6 +5,8 @@ import { widget, version } from "../../../public/static/charting_library"; import axios from "axios"; import { Endpoints } from "../../utils/const"; import { ChainID } from "../../utils/chains"; +import socket from "../../utils/socket"; +import { id } from "ethers/lib/utils.js"; function getLanguageFromURL() { const regex = new RegExp("[\\?&]lang=([^&#]*)"); @@ -217,12 +219,13 @@ const configurationData = { // supports_marks: false, // supports_timescale_marks: false, // supports_time: true, - supported_resolutions: ["5", "15", "30"], + supported_resolutions: ["5", "15", "30", "60", "240", "360", "720", "1D", "1W", "1M"], }; +let lastData = {}; + const DataFeed = { onReady: (callback) => { - console.log("[onReady]: Method call"); setTimeout(() => callback(configurationData)); // callback must be called asynchronously. }, @@ -273,7 +276,6 @@ const DataFeed = { onErrorCallback ) => { // console.log("[getBars]: Method call", firstDataRequest); - // console.log(symbolInfo.pairId, from, to, resolution); axios .get( Endpoints[ChainID.ARB_GOERLI] + @@ -289,6 +291,7 @@ const DataFeed = { } ) .then((resp) => { + if(firstDataRequest) lastData = resp.data.data.exchangeRate[resp.data.data.exchangeRate.length - 1]; if (resp.data.data.length == 0) { onHistoryCallback([], { noData: true }); return; @@ -315,21 +318,25 @@ const DataFeed = { "[subscribeBars]: Method call with subscribeUID:", subscribeUID ); - // window.interval = setInterval( - // () => - // console.log(Date.now() - 100000) - // onRealtimeCallback([{ - // time: '1671087897000', - // open: 1, - // high: 2, - // low: 1, - // close: 2, - // volume: 100, - // }]) - // 10000 - // ); - - // subscribeKline({ symbol: symbolInfo.name, interval, uniqueID: subscribeUID, }, cb => onRealtimeCallback(cb)) + socket.on('PAIR_HISTORY', ({pair, amount, buy, exchangeRate}) => { + if (pair.toLowerCase() == symbolInfo.pairId.toLowerCase()) { + let time = Date.now(); + console.log(lastData.time, parseInt(interval)*60*1000, time, lastData.time + parseInt(interval)*60*1000 < time); + if(lastData.time + parseInt(interval)*60*1000 < time) lastData.close = exchangeRate/1e18; + else { + lastData = { + time, + open: exchangeRate/1e18, + close: exchangeRate/1e18, + high: exchangeRate/1e18, + low: exchangeRate/1e18, + } + } + + console.log('bar', lastData); + onRealtimeCallback(lastData); + } + }) }, unsubscribeBars: (subscriberUID) => { console.log( diff --git a/src/components/lever/borrow/BorrowModal.tsx b/src/components/lever/borrow/BorrowModal.tsx index b1c80e9..9d7e2c9 100644 --- a/src/components/lever/borrow/BorrowModal.tsx +++ b/src/components/lever/borrow/BorrowModal.tsx @@ -61,6 +61,7 @@ import { ChainID } from "../../../utils/chains"; import axios from "axios"; import { PlusSquareIcon } from "@chakra-ui/icons"; import { LeverDataContext } from "../../../context/LeverDataProvider"; +import { tokenFormatter } from '../../../utils/formatters'; export default function LendModal({ market, token }) { const { isOpen, onOpen, onClose } = useDisclosure(); @@ -81,14 +82,14 @@ export default function LendModal({ market, token }) { setSliderValue(value); setInputAmount( ( - (value * (parseFloat(availableToBorrow)/market.inputTokenPriceUSD)) / + (value * maxBorrow/market.inputTokenPriceUSD) / 100 ).toString() ); }; const updateMax = () => { - setInputAmount((parseFloat(availableToBorrow)/market.inputTokenPriceUSD).toString()); + setInputAmount((maxBorrow/market.inputTokenPriceUSD).toString()); setSliderValue(100); }; @@ -98,7 +99,7 @@ export default function LendModal({ market, token }) { }; const amountExceedsBalance = () => { - return Number(inputAmount) > parseFloat(availableToBorrow)/market.inputTokenPriceUSD + return Number(inputAmount) > maxBorrow/market.inputTokenPriceUSD }; const borrow = async () => { @@ -163,6 +164,8 @@ export default function LendModal({ market, token }) { onClose(); }; + const maxBorrow = Math.min(parseFloat(availableToBorrow), market?.totalDepositBalanceUSD - market?.totalBorrowBalanceUSD) + return ( <> @@ -188,7 +191,7 @@ export default function LendModal({ market, token }) { mt={-2} > Max{" "} - {parseFloat(availableToBorrow)/market.inputTokenPriceUSD} + {tokenFormatter(null).format(maxBorrow/market.inputTokenPriceUSD)} {market.inputToken.symbol} diff --git a/src/components/lever/borrow/BorrowTable.tsx b/src/components/lever/borrow/BorrowTable.tsx index 6f9c6f3..02374b9 100644 --- a/src/components/lever/borrow/BorrowTable.tsx +++ b/src/components/lever/borrow/BorrowTable.tsx @@ -113,19 +113,7 @@ export default function LendingTable() { % - +{" "} - {parseFloat( - market.rewardTokenEmissionsUSD - ? ( - (100 * - (market - .rewardTokenEmissionsUSD[0] * - 365)) / - market.totalDepositBalanceUSD - ).toString() - : "0" - ).toFixed(2)}{" "} - % + +{" "}{tokenFormatter(2).format(market.rewardsAPR ? market.rewardsAPR[0] : '0')}{" "}% @@ -147,13 +135,13 @@ export default function LendingTable() { diff --git a/src/components/lever/lend/LendTable.tsx b/src/components/lever/lend/LendTable.tsx index 04f902e..a6e7b63 100644 --- a/src/components/lever/lend/LendTable.tsx +++ b/src/components/lever/lend/LendTable.tsx @@ -118,17 +118,7 @@ export default function LendingTable() { +{" "} - {parseFloat( - market.rewardTokenEmissionsUSD - ? ( - (100 * - (market - .rewardTokenEmissionsUSD[1] * - 365)) / - market.totalDepositBalanceUSD - ).toString() - : "0" - ).toFixed(2)}{" "} + {tokenFormatter(2).format(market.rewardsAPR ? market.rewardsAPR[0] : '0')}{" "} % diff --git a/src/components/trade/exchange/Buy.tsx b/src/components/trade/exchange/Buy.tsx index 12381eb..8568291 100644 --- a/src/components/trade/exchange/Buy.tsx +++ b/src/components/trade/exchange/Buy.tsx @@ -100,7 +100,7 @@ export default function BuyModule({ pair, limit }) { setSliderValue(e); if(!token1 || !price) return; const token1Amount = Big(e) - .times(token1.balance ?? 0) + .times((token1.balance ?? 0) - (token1.inOrderBalance ?? 0)) .div(100) .div(10 ** token1.decimals); setAmount(token1Amount.toString()); @@ -195,9 +195,9 @@ export default function BuyModule({ pair, limit }) { Balance{' '} {tokenFormatter(null).format( - (token1?.balance ?? 0) / + ((token1?.balance ?? 0) - (token1?.inOrderBalance ?? 0)) / 10 ** token1?.decimals - )} + )} {token1?.symbol} diff --git a/src/components/trade/exchange/Sell.tsx b/src/components/trade/exchange/Sell.tsx index 92c5c9c..2a6b448 100644 --- a/src/components/trade/exchange/Sell.tsx +++ b/src/components/trade/exchange/Sell.tsx @@ -95,7 +95,7 @@ export default function BuyModule({ pair, limit }) { setSliderValue(e); if (!token0 || !price) return; const token0Amount = Big(e) - .times(token0?.balance ?? 0) + .times((token0?.balance ?? 0) - (token0?.inOrderBalance ?? 0)) .div(100) .div(10 ** token1?.decimals); setAmount(token0Amount.toNumber().toString()); @@ -194,8 +194,8 @@ export default function BuyModule({ pair, limit }) { Balance{" "} {tokenFormatter(null).format( - (token0?.balance ?? 0) / 10 ** token0?.decimals - )} + ((token0?.balance ?? 0) - (token0?.inOrderBalance ?? 0)) / 10 ** token0?.decimals + )} {token0?.symbol} { let orders = []; let _orderHistory = orderHistory[pair?.id]; - for(let i in _orderHistory){ + for (let i in _orderHistory) { _orderHistory[i].cancelled = false; orders.push(_orderHistory[i]); } - for(let i in cancelledOrders[pair?.id]){ + for (let i in cancelledOrders[pair?.id]) { cancelledOrders[pair?.id][i].cancelled = true; - cancelledOrders[pair?.id][i].fillAmount = cancelledOrders[pair?.id][i].balanceAmount; + cancelledOrders[pair?.id][i].fillAmount = + cancelledOrders[pair?.id][i].balanceAmount; orders.push(cancelledOrders[pair?.id][i]); } return orders; }; + const { currentPage, setCurrentPage, pagesCount, pages } = usePagination({ + initialState: { currentPage: 1 }, + pagesCount: Math.ceil(getOrders().length / 3), + }); + return ( - {getOrders() ? ( - -
OrderAmountExchange RateOrderAmountExchange Rate
- - {order.orderType == '0' - ? 'SELL' - : 'BUY'} - + } + borderColor='gray.900' + > + + {order.value.buy ? + "BUY" + : "SELL"} + + {tokenFormatter(null).format( - order.amount / + order.value.amount / 10 ** token0?.decimals )}{' '} {token0?.symbol} + {tokenFormatter(pair?.exchangeRateDecimals).format( - order.exchangeRate / + order.value.exchangeRate / 10 ** 18 )}{' '} {token1?.symbol}/{token0?.symbol} + {/* */} - {/* */} + />
{tokenFormatter( - pair?.exchangeRateDecimals + null ).format( order.exchangeRate / 10 ** 18 )}{" "} diff --git a/src/context/DataProvider.tsx b/src/context/DataProvider.tsx index cfeed88..0e51951 100644 --- a/src/context/DataProvider.tsx +++ b/src/context/DataProvider.tsx @@ -8,6 +8,7 @@ import Exchange from '../components/trade/exchange'; import { getBalancesAndApprovals } from '../utils/balances'; import { BigNumber } from 'ethers'; import socket from '../utils/socket'; +import { io } from 'socket.io-client'; const DataContext = React.createContext({} as DataValue); @@ -30,21 +31,9 @@ function DataProvider({ children }: any) { const [cancelledOrders, setCancelledOrders] = React.useState({}); const [tokens, setTokens] = React.useState([]); - const [userDepositWithdraws, setUserDepositWithdraws] = React.useState([]); const [chain, setChain] = React.useState(null); const [block, setBlock] = React.useState(null); - - const [dollarFormatter, setDollarFormatter] = React.useState( - new Intl.NumberFormat('en-US', { - style: 'currency', - currency: 'USD', - }) - ); - const [tokenFormatter, setTokenFormatter] = React.useState( - new Intl.NumberFormat('en-US', { - minimumFractionDigits: 2, - }) - ); + const [refresh, setRefresh] = React.useState(false); React.useEffect(() => {}, []) @@ -101,7 +90,6 @@ function DataProvider({ children }: any) { fetchPairData(_pairs, chain); subscribePairHistory(_pairs); - subscribePairOrders(_pairs); if(firstTime) { _tokens = res[1].data.data; @@ -130,32 +118,18 @@ function DataProvider({ children }: any) { }; const subscribePairHistory = (_pairs: any[]) => { - socket.on('PAIR_HISTORY', ({pair, amount, buy, exchangeRate}) => { - for(let i in _pairs) { - if(_pairs[i].id === pair) { - _pairs[i].priceDiff = Big(_pairs[i].exchangeRate).minus(exchangeRate).toString(); - _pairs[i].exchangeRate = exchangeRate; - console.log('found pair', _pairs[i]); - } - } - console.log('pairs', _pairs); - setPairs(_pairs); - }) - } - - const subscribePairOrders = (_pairs: any[]) => { - socket.on('PAIR_ORDERS', (res) => { - console.log('PAIR_ORDERS', res); - // for(let i in _pairs) { - // if(_pairs[i].id === pair) { - // _pairs[i].priceDiff = Big(_pairs[i].exchangeRate).minus(exchangeRate).toString(); - // _pairs[i].exchangeRate = exchangeRate; - // console.log('found pair', _pairs[i]); - // } - // } - // console.log('pairs', _pairs); - // setPairs(_pairs); - }) + // const socket = io('http://localhost:3010') + // socket.on('PAIR_HISTORY', ({pair, amount, buy, exchangeRate}) => { + // for(let i in _pairs) { + // if(_pairs[i].id === pair) { + // _pairs[i].priceDiff = Big(_pairs[i].exchangeRate).minus(exchangeRate).toString(); + // _pairs[i].exchangeRate = exchangeRate; + // console.log('found pair', _pairs[i]); + // } + // } + // console.log('pairs', _pairs); + // setPairs(_pairs); + // }) } const fetchOrders = (pairs: any[], chain: number) => { @@ -169,9 +143,45 @@ function DataProvider({ children }: any) { Promise.all(orderRequests).then((res) => { let newOrders = {}; res.forEach((order, index) => { - return newOrders[order.data.data.pair] = order.data.data; + return newOrders[order.data.data.pair.toLowerCase()] = order.data.data; }) setOrders(newOrders); + let _refresh = refresh; + socket.on('PAIR_ORDER', ({amount, buy, exchangeRate, pair}) => { + let _orders = buy ? newOrders[pair.toLowerCase()].buyOrders : newOrders[pair.toLowerCase()].sellOrders.reverse(); + + for(let i = 0; i < _orders.length; i++){ + console.log(exchangeRate, _orders[i].exchangeRate); + if(_orders[i].exchangeRate === exchangeRate){ + console.log('Found order'); + _orders[i].amount = Big(_orders[i].amount).plus(amount).toString(); + break; + } + else if(_orders[i].exchangeRate < exchangeRate){ + if(i === 0){ + _orders.splice(i, 0, {amount, exchangeRate}); + } else if(_orders[i-1].exchangeRate > exchangeRate){ + _orders.splice(i, 0, {amount, exchangeRate}); + } + break; + } else if(i === _orders.length - 1){ + _orders.push({amount, exchangeRate}); + break + } + } + if(_orders.length === 0){ + _orders.push({amount, exchangeRate}); + } + if(buy){ + newOrders[pair.toLowerCase()].buyOrders = _orders; + } else { + newOrders[pair.toLowerCase()].sellOrders = _orders.reverse(); + } + setOrders(newOrders); + _refresh = !_refresh; + setRefresh(_refresh); + return; + }) }) } @@ -195,12 +205,11 @@ function DataProvider({ children }: any) { })); } Promise.all(orderRequests).then((res) => { - console.log(res); let _placedOrders = {}; let _cancelledOrders = {}; let _executedOrders = {}; for(let i = 0; i < pairs.length; i++){ - console.log('placed', res[i*3].data); + console.log('cancelled', res[i*3+1].data.data); _placedOrders[pairs[i].id] = res[i*3].data.data; _cancelledOrders[pairs[i].id] = res[i*3+1].data.data; _executedOrders[pairs[i].id] = res[i*3+2].data.data; @@ -211,7 +220,7 @@ function DataProvider({ children }: any) { }) } - // api.zexe.io/pair/pricetrend/{pair}?interval=300000 + // GRAPH const fetchPairData = (pairs: any[], chain: number) => { let pairRequests = [] for(let i in pairs){ @@ -239,7 +248,7 @@ function DataProvider({ children }: any) { }) } - // /pair/orders/history/:id + // ORDER_HISTORY const fetchExecutedPairData = async (pairs: any[], chain: number) => { let pairRequests = pairs.map((pair) => { return axios.get(Endpoints[chain]+`pair/orders/history/${pair.id}`, { @@ -251,7 +260,7 @@ function DataProvider({ children }: any) { Promise.all(pairRequests).then((res) => { let newPairs = {}; res.forEach((pair, index) => { - return newPairs[pairs[index].id] = pair.data.data; + return newPairs[pairs[index].id.toLowerCase()] = pair.data.data; }) setPairExecutedData(newPairs); }) @@ -263,8 +272,6 @@ function DataProvider({ children }: any) { pairData, tokens, dataFetchError, - dollarFormatter, - tokenFormatter, isFetchingData, fetchData, orders, @@ -273,7 +280,6 @@ function DataProvider({ children }: any) { cancelledOrders, orderHistory, pairStats, - userDepositWithdraws, chain, setChain, explorer, incrementAllowance @@ -290,8 +296,6 @@ interface DataValue { pairData: any[]; tokens: any[]; dataFetchError: string | null; - dollarFormatter: any; - tokenFormatter: any; isFetchingData: boolean; orders: any; fetchData: (address :string, chainId: ChainID, loop?: boolean) => void; @@ -300,7 +304,6 @@ interface DataValue { cancelledOrders: any, orderHistory: any, pairStats: any, - userDepositWithdraws: any, chain: number, setChain: (chain: number) => void, explorer: () => string, incrementAllowance: (token: string, amount: string) => Promise diff --git a/src/utils/const.ts b/src/utils/const.ts index 786923e..e28e613 100644 --- a/src/utils/const.ts +++ b/src/utils/const.ts @@ -19,9 +19,9 @@ export const ADDRESSES = { Vault: '0x4811419e3c5e1d91Ac83427562a455C22B5eA95F', }, [ChainID.ARB_GOERLI]: { - Exchange: '0x9117596d6203a71802803a18a9588C0Af67E762d', + Exchange: '0xf0eeA3DC35CDAB740D04A8E08E32d184F6918Fe6', Multicall: '0x511f64296fa72526231E5A55615d8e4eE5a2d4cF', - Lever: '0x164b3876d65a71881Bd2D661c3506f4845C374E0' + Lever: '0x93DF85a2B89DbC443D9AbbBa9216Ce066127dC0B' } }; From cf41c397abe24ea5dbaa06632c48908476067e03 Mon Sep 17 00:00:00 2001 From: prasad-kumkar Date: Tue, 20 Dec 2022 12:25:47 +0530 Subject: [PATCH 27/37] new deployment --- public/css/style.css | 4 +- src/components/trade/Orders/OrderBook.tsx | 1 + src/components/trade/Orders/OrderHistory.tsx | 1 + .../trade/exchange/BuySellModal2.tsx | 175 +----------------- src/components/trade/tokens/AllTokens.tsx | 2 +- src/components/trade/tokens/TokensPanel.tsx | 8 +- .../trade/user_orders/PlacedOrders.tsx | 2 +- src/context/DataProvider.tsx | 52 ++++-- src/utils/const.ts | 6 +- 9 files changed, 54 insertions(+), 197 deletions(-) diff --git a/public/css/style.css b/public/css/style.css index edd1308..e989cdf 100644 --- a/public/css/style.css +++ b/public/css/style.css @@ -1,3 +1,5 @@ .theme-dark:root { - --tv-color-pane-background: #130B25; + --tv-color-platform-background: #0E0020; + --tv-color-pane-background: #0E0020; + --tv-color-pane-background-secondary: #0E0020; } \ No newline at end of file diff --git a/src/components/trade/Orders/OrderBook.tsx b/src/components/trade/Orders/OrderBook.tsx index b4665da..414b594 100644 --- a/src/components/trade/Orders/OrderBook.tsx +++ b/src/components/trade/Orders/OrderBook.tsx @@ -21,6 +21,7 @@ const Order = ({ order, index, total, pair, orderType }) => { color={orderType == 'BUY' ? 'green2' : 'red2'} py={'3px'} px={4} + mb={0.5} _hover={{ bgColor: orderType == 'BUY' ? 'rgba(24, 176, 95, 10%)' : 'rgba(200, 50, 50, 10%)' }} bgGradient={'linear(to-r,' + (orderType == 'BUY' ? 'rgba(24, 176, 95, 20%), rgba(24, 176, 95, 20%))' : 'rgba(200, 50, 50, 20%), rgba(200, 50, 50, 20%))')} bgSize={700*order.amount/total + '%'} diff --git a/src/components/trade/Orders/OrderHistory.tsx b/src/components/trade/Orders/OrderHistory.tsx index e984649..af2d921 100644 --- a/src/components/trade/Orders/OrderHistory.tsx +++ b/src/components/trade/Orders/OrderHistory.tsx @@ -12,6 +12,7 @@ const Order = ({ order, pair, index }) => { bgColor={order.buy ? "rgba(24, 176, 95, 10%)" : "rgba(200, 50, 50, 10%)"} py={'3px'} px={4} + mb={0.5} > {tokenFormatter(null).format(order.fillAmount/(10**pair?.tokens[0].decimals))} diff --git a/src/components/trade/exchange/BuySellModal2.tsx b/src/components/trade/exchange/BuySellModal2.tsx index 43960fa..d2eda17 100644 --- a/src/components/trade/exchange/BuySellModal2.tsx +++ b/src/components/trade/exchange/BuySellModal2.tsx @@ -58,17 +58,14 @@ export default function BuySellModal2({ const toast = useToast(); const toastIdRef = React.useRef(); - const { isOpen, onOpen, onClose } = useDisclosure(); - const [orders, setOrders] = React.useState(null); const [orderToPlace, setOrderToPlace] = React.useState(null); const [loading, setLoading] = React.useState(false); const { address, isConnected: isEvmConnected } = useAccount(); - const { chain, incrementAllowance } = useContext(DataContext); - const { data, isError, isLoading, isSuccess, signTypedDataAsync } = - useSignTypedData(); + const { chain, incrementAllowance, addPlacedOrder } = useContext(DataContext); + const { data, isError, isLoading, isSuccess, signTypedDataAsync } = useSignTypedData(); const amountExceedsBalance = () => { if(!token1 || !token0) return true @@ -114,40 +111,6 @@ export default function BuySellModal2({ }); }; - const _onOpen = () => { - onOpen(); - let _amount = Big(token0Amount) - .times(10 ** token0.decimals) - .toFixed(0); - if (buy && !limit) { - _amount = Big(token1Amount) - .times(10 ** token1.decimals) - .toFixed(0); - } - - axios - .get( - Endpoints[chain] + - `order/${limit ? "limit" : "market"}/matched/` + - pair.id, - { - params: { - amount: _amount, - exchangeRate: Big(price) - .times(10 ** 18) - .toFixed(0), - buy, - chainId: chain, - }, - } - ) - .then((resp) => { - let _orders = resp.data.data; - console.log(_orders); - setOrders(_orders); - }); - }; - const execute = async () => { setLoading(true); let _amount = Big(token0Amount) @@ -179,7 +142,8 @@ export default function BuySellModal2({ ) ).data.data; - console.log(_orders); + console.log(_orders) + if (_orders.length > 0) { const exchange = await getContract("Exchange", chain); toast.close(toastIdRef.current); @@ -268,6 +232,7 @@ export default function BuySellModal2({ chainId: chain.toString(), }) .then((res) => { + addPlacedOrder({signature: signature, pair: pair.id, value: value}) setLoading(false); toast.close(toastIdRef.current); toast({ @@ -307,17 +272,6 @@ export default function BuySellModal2({ } }; - const { nextStep, prevStep, setStep, reset, activeStep } = useSteps({ - initialStep: 0, - }); - - const _onClose = () => { - setOrderToPlace(null); - setOrders(null); - onClose(); - reset(); - }; - const tokenAmountToSpend = buy ? token1Amount : token0Amount; const tokenToSpend = buy ? token1 : token0; @@ -360,125 +314,6 @@ export default function BuySellModal2({ Approve {tokenToSpend?.symbol} )} - - - - - - {orders - ? orders.length > 0 && !(activeStep >= 1) - ? "Execute orders within limit" - : "Place order" - : "Review Order"} - - - - - {orders ? ( - limit ? ( - orders.length > 0 ? ( - - - - - - - - - - - - - ) : ( - - ) - ) : ( - - ) - ) : ( - <> - - - - - )} - - - - ); } diff --git a/src/components/trade/tokens/AllTokens.tsx b/src/components/trade/tokens/AllTokens.tsx index bcd645c..827046e 100644 --- a/src/components/trade/tokens/AllTokens.tsx +++ b/src/components/trade/tokens/AllTokens.tsx @@ -27,7 +27,7 @@ export default function AllTokens({search}) { align={'center'} justify="space-between" px={4} - py={3} + py={4} _hover={{ bgColor: 'whiteAlpha.100' }}> - - All - Trending - New + + All + Trending + New diff --git a/src/components/trade/user_orders/PlacedOrders.tsx b/src/components/trade/user_orders/PlacedOrders.tsx index 9e3831a..c19f578 100644 --- a/src/components/trade/user_orders/PlacedOrders.tsx +++ b/src/components/trade/user_orders/PlacedOrders.tsx @@ -54,7 +54,7 @@ export default function PlacedOrders({ pair }) {
{tokenFormatter(null).format( - market.totalDepositBalanceUSD / market.inputToken.lastPriceUSD + (market.totalDepositBalanceUSD - market.totalBorrowBalanceUSD) / market.inputToken.lastPriceUSD )} {market.inputToken.symbol} {dollarFormatter(null).format( - market.totalDepositBalanceUSD + market.totalDepositBalanceUSD - market.totalBorrowBalanceUSD )}
- - - - - - - - - - {getOrders().map((order: any, index: number) => { - return ( - - - - - + + ); + })} + +
OrderAmountExchange Rate
- - - {order.buy ? - "BUY" - : "SELL"} - - - - {tokenFormatter(null).format( - order.fillAmount / - 10 ** - pair.tokens[0]?.decimals - )}{" "} - {pair.tokens[0]?.symbol} - - {tokenFormatter( - null - ).format( - order.exchangeRate / 10 ** 18 - )}{" "} - {pair.tokens[1]?.symbol}/ - {pair.tokens[0]?.symbol} - - {order.cancelled ? ( - 0 ? ( + <> + + + + + + + + + + + + + {getOrders() + .slice(currentPage * 3, currentPage * 3 + 3) + .map((order: any, index: number) => { + return ( + + + + + - - ); - })} - -
OrderAmount + Exchange Rate +
+ + + {order.buy + ? "BUY" + : "SELL"} + + + + {tokenFormatter( + null + ).format( + order.fillAmount / + 10 ** + pair.tokens[0] + ?.decimals + )}{" "} + {pair.tokens[0]?.symbol} + + {tokenFormatter( + null + ).format( + order.exchangeRate / + 10 ** 18 + )}{" "} + {pair.tokens[1]?.symbol}/ + {pair.tokens[0]?.symbol} + - Cancelled - - ) : ( - - Executed - - )} -
-
+ {order.cancelled ? ( + + Cancelled + + ) : ( + + Executed + + )} +
+
+ + + + Previous + + + {pages.map((page: number) => ( + + ))} + + + Next + + + + ) : ( - No executed orders + No orders history found )}
diff --git a/src/components/trade/user_orders/PlacedOrders.tsx b/src/components/trade/user_orders/PlacedOrders.tsx index c19f578..87ce299 100644 --- a/src/components/trade/user_orders/PlacedOrders.tsx +++ b/src/components/trade/user_orders/PlacedOrders.tsx @@ -20,6 +20,17 @@ import { DataContext } from '../../../context/DataProvider'; import UpdateOrder from './UpdateOrder'; import { tokenFormatter } from '../../../utils/formatters'; +import { + Pagination, + usePagination, + PaginationNext, + PaginationPage, + PaginationPrevious, + PaginationContainer, + PaginationPageGroup, +} from "@ajna/pagination"; +import { AiOutlineArrowLeft, AiOutlineArrowRight } from 'react-icons/ai'; + export default function PlacedOrders({ pair }) { const { tokens, placedOrders } = useContext(DataContext); const [token0, setToken0] = React.useState(null); @@ -40,10 +51,16 @@ export default function PlacedOrders({ pair }) { } }); - + const { currentPage, setCurrentPage, pagesCount, pages } = usePagination({ + initialState: { currentPage: 1 }, + pagesCount: Math.ceil((placedOrders[pair?.id] ? placedOrders[pair?.id].length : 0) / 3), + }); + return ( - {placedOrders[pair?.id] ? + {placedOrders[pair?.id] && <>{placedOrders[pair?.id].length > 0 ? + <> + @@ -123,10 +140,54 @@ export default function PlacedOrders({ pair }) {
+ + + + + {" "} + Previous + + + {pages.map((page: number) => ( + + ))} + + + Next + + + + : - No orders placed + No active orders - } + } }
); } diff --git a/src/context/DataProvider.tsx b/src/context/DataProvider.tsx index d9c2fbd..1ef2cd5 100644 --- a/src/context/DataProvider.tsx +++ b/src/context/DataProvider.tsx @@ -97,6 +97,12 @@ function DataProvider({ children }: any) { for(let i in _tokens){ let token = _tokens[i]; token.price = await getPrice(token.symbol) + let resp = await axios.get(Endpoints[chain]+`user/inorder/balance/${address}/token/${token.id}`, { + params: { + chainId: chain + } + }); + token.inOrderBalance = resp.data.data[0]?.inOrderBalance.toString() ?? '0'; } setTokens(_tokens); console.log('pairs', _pairs); diff --git a/src/context/LeverDataProvider.tsx b/src/context/LeverDataProvider.tsx index 8c41d2e..3cd15b0 100644 --- a/src/context/LeverDataProvider.tsx +++ b/src/context/LeverDataProvider.tsx @@ -115,6 +115,7 @@ function LeverDataProvider({ children }: any) { .div(1e18) .toString(); _markets[i / 4].borrowBalance = BigNumber.from(res[1][i + 3]).toString(); + _markets[i / 4].rewardsAPR = [((100 * (_markets[i / 4].rewardTokenEmissionsUSD[0] * 365)) / _markets[i / 4].totalDepositBalanceUSD), ((100 * (_markets[i / 4].rewardTokenEmissionsUSD[1] * 365)) / _markets[i / 4].totalDepositBalanceUSD)]; _totalCollateralBalance = _totalCollateralBalance.add( Big(_markets[i / 4].collateralBalance).mul(_markets[i / 4].inputTokenPriceUSD) @@ -122,6 +123,7 @@ function LeverDataProvider({ children }: any) { _totalBorrowBalance = _totalBorrowBalance.add( Big(_markets[i / 4].borrowBalance).mul(_markets[i / 4].inputTokenPriceUSD).div(1e18) ); + _availableToBorrow = _availableToBorrow.add( Big(_markets[i / 4].collateralBalance).mul(_markets[i / 4].inputTokenPriceUSD).mul(_markets[i / 4].maximumLTV).div(100) ); diff --git a/src/pages/lend.tsx b/src/pages/lend.tsx index fa1af21..5746977 100644 --- a/src/pages/lend.tsx +++ b/src/pages/lend.tsx @@ -57,6 +57,33 @@ export default function lend() { }) }) } + + const interestAPR = () => { + if(!markets[0]) return; + if(!markets[0].rewardsAPR) return; + let apr = 0; + let totalBorrow = 0; + for(let i in markets){ + let borrow = markets[i].inputToken.lastPriceUSD * markets[i].borrowBalance/1e18 + apr += (parseFloat(markets[i].rewardsAPR[0]) - parseFloat(markets[i].rates[0].rate)) * borrow; + totalBorrow += borrow; + } + return apr/totalBorrow + } + + const yieldAPR = () => { + if(!markets[0]) return; + if(!markets[0].rewardsAPR) return; + let apr = 0; + let totalCollateral = 0; + for(let i in markets){ + let collateral = markets[i].inputToken.lastPriceUSD * markets[i].collateralBalance; + apr += (parseFloat(markets[i].rates[1].rate) + parseFloat(markets[i].rewardsAPR[1])) * collateral; + totalCollateral += collateral; + } + return apr/totalCollateral + } + return ( <> @@ -83,15 +110,15 @@ export default function lend() { - $ZEXE Rewards - + Liquidity Incentives + {tokenFormatter(null).format( zexeAccrued / 10 ** 18 )} ZEXE - + @@ -101,8 +128,8 @@ export default function lend() { Earning APR (%) {tokenFormatter(null).format( - 0 - )} + yieldAPR() + )} % @@ -117,13 +144,11 @@ export default function lend() { Borrow Balance {dollarFormatter(null).format( - parseFloat(totalCollateralBalance) + parseFloat(totalBorrowBalance) )} - - @@ -141,8 +166,8 @@ export default function lend() { Interest APR (%) {tokenFormatter(null).format( - 0 - )} + interestAPR() + )} % diff --git a/src/utils/contract.ts b/src/utils/contract.ts index 919ee11..bcf3e75 100644 --- a/src/utils/contract.ts +++ b/src/utils/contract.ts @@ -47,6 +47,6 @@ export function send(contract: any, method: string, params: any[], chain: number if(chain == ChainID.NILE){ return contract[method](...params).send(); } else { - return contract[method](...params); + return contract[method](...params, { gasPrice: ethers.utils.parseUnits('1.6', 'gwei') }); } } \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 79fb992..8a63614 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,14 @@ # yarn lockfile v1 +"@ajna/pagination@^1.4.19": + version "1.4.19" + resolved "https://registry.yarnpkg.com/@ajna/pagination/-/pagination-1.4.19.tgz#2eae0f9321a540490918395a40ad21531035e561" + integrity sha512-QnrERhw1fhAVst1pBrXyPruJphbrLnIYcHf5bpWS7IhtK3tKljTPQ8/UbUsroJ6oAqHCp9X9nLi49PT+xw/hXw== + dependencies: + framer-motion "^6.3.11" + lodash.union "^4.6.0" + "@babel/code-frame@^7.0.0": version "7.18.6" resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz" @@ -2911,7 +2919,7 @@ form-data@^4.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" -framer-motion@^6.3.0: +framer-motion@^6.3.0, framer-motion@^6.3.11: version "6.5.1" resolved "https://registry.npmjs.org/framer-motion/-/framer-motion-6.5.1.tgz" integrity sha512-o1BGqqposwi7cgDrtg0dNONhkmPsUFDaLcKXigzuTFC5x58mE8iyTazxSudFzmT6MEyJKfjjU8ItoMe3W+3fiw== @@ -3268,6 +3276,11 @@ lodash.mergewith@4.6.2: resolved "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz" integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ== +lodash.union@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88" + integrity sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw== + lodash@^4.17.20: version "4.17.21" resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" From 32fb3a3f6f8b961c7affa3ab6ed1808f599ce2dd Mon Sep 17 00:00:00 2001 From: prasad-kumkar Date: Wed, 21 Dec 2022 13:05:08 +0530 Subject: [PATCH 32/37] build fix --- tsconfig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tsconfig.json b/tsconfig.json index 4b16b1f..d70310f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,7 +9,7 @@ "allowJs": true, "skipLibCheck": true, "strict": false, - "forceConsistentCasingInFileNames": true, + "forceConsistentCasingInFileNames": false, "noEmit": true, "esModuleInterop": true, "module": "esnext", From 1f53339e45de7f28c0cc6f24c47fcfa441e7dd48 Mon Sep 17 00:00:00 2001 From: prasad-kumkar Date: Wed, 21 Dec 2022 13:13:02 +0530 Subject: [PATCH 33/37] build fix --- src/pages/trade/[pairId].tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/pages/trade/[pairId].tsx b/src/pages/trade/[pairId].tsx index 3ff56f3..8c435f0 100644 --- a/src/pages/trade/[pairId].tsx +++ b/src/pages/trade/[pairId].tsx @@ -1,10 +1,9 @@ import { Box, Flex, Tag, Text, useColorMode } from '@chakra-ui/react'; -import { Header } from '../../components/Header'; import GraphPanel from '../../components/trade/GraphPanel'; import TokensPanel from '../../components/trade/tokens/TokensPanel'; +//@ts-ignore import OrdersPanel from '../../components/trade/orders/OrdersPanel'; import TitlePanel from '../../components/trade/TitlePanel'; -import Swap from '../../components/trade/exchange/Limit'; import { useContext } from 'react'; import { DataContext } from '../../context/DataProvider'; import { useRouter } from 'next/router'; @@ -12,7 +11,6 @@ import PlacedOrders from '../../components/trade/user_orders'; import { useEffect, useState } from 'react'; import Exchange from '../../components/trade/exchange'; import Head from 'next/head'; -import { useAccount } from 'wagmi'; const Trade = () => { const { pairs } = useContext(DataContext); From 69b85a7abef4ab50a37fa6a07023d370e77b8027 Mon Sep 17 00:00:00 2001 From: prasad-kumkar Date: Wed, 21 Dec 2022 13:18:08 +0530 Subject: [PATCH 34/37] missed files --- src/components/trade/orders/OrderBook.tsx | 119 +++++++++++++++++++ src/components/trade/orders/OrderHistory.tsx | 45 +++++++ src/components/trade/orders/OrdersPanel.tsx | 60 ++++++++++ src/pages/trade/[pairId].tsx | 2 +- tsconfig.json | 2 +- 5 files changed, 226 insertions(+), 2 deletions(-) create mode 100644 src/components/trade/orders/OrderBook.tsx create mode 100644 src/components/trade/orders/OrderHistory.tsx create mode 100644 src/components/trade/orders/OrdersPanel.tsx diff --git a/src/components/trade/orders/OrderBook.tsx b/src/components/trade/orders/OrderBook.tsx new file mode 100644 index 0000000..414b594 --- /dev/null +++ b/src/components/trade/orders/OrderBook.tsx @@ -0,0 +1,119 @@ +import { ArrowDownIcon, ArrowUpIcon } from '@chakra-ui/icons'; +import { Box, Flex, Spacer, Text, Divider } from '@chakra-ui/react'; +import React from 'react'; +import { useContext } from 'react'; +import { DataContext } from '../../../context/DataProvider'; +import {useEffect, useState} from 'react'; +import { tokenFormatter } from '../../../utils/formatters'; +import { AppDataContext } from '../../../context/AppData'; + +const Order = ({ order, index, total, pair, orderType }) => { + const {setExchangeRate} = useContext(AppDataContext); + return ( + setExchangeRate(order.exchangeRate/(10**18))} _hover={{ cursor: 'pointer' }} + // bgGradient={'linear(to-r,' + (orderType == 'BUY' ? 'rgba(24, 176, 95, 100%), rgba(24, 176, 95, 100%))' : 'rgba(200, 50, 50, 100%), rgba(200, 50, 50, 100%))')} + // bgSize={'1%'} + // bgRepeat='no-repeat' + > + + + {tokenFormatter(null).format(order.amount/(10**pair?.tokens[0].decimals))} + + + {tokenFormatter(null).format((order.amount/(10**(pair?.tokens[0].decimals)))*(order.exchangeRate/(10**18)))} + + + {tokenFormatter(pair?.exchangeRateDecimals).format(order.exchangeRate/(10**18))} + + + + + ); +}; + +export default function OrderBook({ pair }) { + const {orders} = useContext(DataContext); + const [buyOrders, setBuyOrders] = useState([]); + const [sellOrders, setSellOrders] = useState([]); + const [totalBuy, setTotalBuy] = useState(0); + const [totalSell, setTotalSell] = useState(0); + + + useEffect(() => { + if(orders[pair?.id]){ + setBuyOrders(orders[pair.id].buyOrders); + setSellOrders(orders[pair.id].sellOrders); + // calculate total buy + setTotalBuy(orders[pair.id].buyOrders.reduce((acc: any, order: any) => acc + parseFloat(order.amount), 0)); + // calculate total sell + setTotalSell(orders[pair.id].sellOrders.reduce((acc: any, order: any) => acc + parseFloat(order.amount), 0)); + } + }) + + return ( + + + {pair?.tokens[0].symbol} + {pair?.tokens[1].symbol} + {pair?.tokens[1].symbol}/{pair?.tokens[0].symbol} + + {[...sellOrders].slice(0, 22).reverse().map((order: any, index: number) => { + return ( + + + + ); + })} + + + + + {pair?.priceDiff < 0 ? : } + {pair?.priceDiff/ (10**18)} + + + + {tokenFormatter(pair?.exchangeRateDecimals).format(pair?.exchangeRate / (10**18))} + + + + {buyOrders.slice(0, 22).map((order: any, index: number) => { + return ( + + + + + ); + })} + + ); +} diff --git a/src/components/trade/orders/OrderHistory.tsx b/src/components/trade/orders/OrderHistory.tsx new file mode 100644 index 0000000..af2d921 --- /dev/null +++ b/src/components/trade/orders/OrderHistory.tsx @@ -0,0 +1,45 @@ +import { Box, Flex, Spacer, Text } from '@chakra-ui/react'; +import React from 'react'; +import { useContext } from 'react'; +import { DataContext } from '../../../context/DataProvider'; +import { tokenFormatter } from '../../../utils/formatters'; + +const Order = ({ order, pair, index }) => { + + return ( + + + {tokenFormatter(null).format(order.fillAmount/(10**pair?.tokens[0].decimals))} + + + {tokenFormatter(null).format(order.fillAmount*(order.exchangeRate/(10**18))/(10**pair?.tokens[0].decimals))} + + + {tokenFormatter(pair.exchangeRateDecimals).format(order.exchangeRate/(10**18))} + + + ); +}; + +export default function OrderHistory({pair}) { + const {pairExecutedData} = useContext(DataContext); + + return ( + + + {pair?.tokens[0].symbol} + {pair?.tokens[1].symbol} + {pair?.tokens[1].symbol}/{pair?.tokens[0].symbol} + + {(pairExecutedData[pair?.id]) && pairExecutedData[pair?.id].slice(0,47).map((order: any, index: number) => { + return ; + })} + + ); +} diff --git a/src/components/trade/orders/OrdersPanel.tsx b/src/components/trade/orders/OrdersPanel.tsx new file mode 100644 index 0000000..b0f4ad6 --- /dev/null +++ b/src/components/trade/orders/OrdersPanel.tsx @@ -0,0 +1,60 @@ +import React from "react"; +import { + Tabs, + TabList, + TabPanels, + Tab, + TabPanel, + Box, + Flex, + Text, +} from "@chakra-ui/react"; +import OrderBook from "./OrderBook"; +import OrderHistory from "./OrderHistory"; + +export default function OrdersPanel({ pair }) { + return ( + <> + + + + Order Book + Order History + + + + + + + + + + + + + + + + + + + + + ); +} diff --git a/src/pages/trade/[pairId].tsx b/src/pages/trade/[pairId].tsx index 8c435f0..08c2cba 100644 --- a/src/pages/trade/[pairId].tsx +++ b/src/pages/trade/[pairId].tsx @@ -16,7 +16,7 @@ const Trade = () => { const { pairs } = useContext(DataContext); const router = useRouter(); - const { pairId } = router.query; + const { pairId } = router.query; const [pair, setPair] = useState(null); // pairId = USD_ETH diff --git a/tsconfig.json b/tsconfig.json index d70310f..4b16b1f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,7 +9,7 @@ "allowJs": true, "skipLibCheck": true, "strict": false, - "forceConsistentCasingInFileNames": false, + "forceConsistentCasingInFileNames": true, "noEmit": true, "esModuleInterop": true, "module": "esnext", From 152d2970fcf0649da631e9df05495a4f418ca3f0 Mon Sep 17 00:00:00 2001 From: prasad-kumkar Date: Wed, 21 Dec 2022 13:36:04 +0530 Subject: [PATCH 35/37] build fix --- .../trade/user_orders/ExecutedOrders.tsx | 81 ++++++++++--------- src/pages/trade/[pairId].tsx | 1 - tsconfig.json | 2 +- 3 files changed, 42 insertions(+), 42 deletions(-) diff --git a/src/components/trade/user_orders/ExecutedOrders.tsx b/src/components/trade/user_orders/ExecutedOrders.tsx index d6919c9..52f742e 100644 --- a/src/components/trade/user_orders/ExecutedOrders.tsx +++ b/src/components/trade/user_orders/ExecutedOrders.tsx @@ -158,46 +158,47 @@ export default function ExecutedOrders({ pair }) { - - - Previous - - - {pages.map((page: number) => ( - - ))} - - - Next - - - + pagesCount={pagesCount} + currentPage={currentPage} + onPageChange={setCurrentPage} + > + + + {" "} + Previous + + + {pages.map((page: number) => ( + + ))} + + + Next + + + ) : ( diff --git a/src/pages/trade/[pairId].tsx b/src/pages/trade/[pairId].tsx index 08c2cba..ec6861b 100644 --- a/src/pages/trade/[pairId].tsx +++ b/src/pages/trade/[pairId].tsx @@ -1,7 +1,6 @@ import { Box, Flex, Tag, Text, useColorMode } from '@chakra-ui/react'; import GraphPanel from '../../components/trade/GraphPanel'; import TokensPanel from '../../components/trade/tokens/TokensPanel'; -//@ts-ignore import OrdersPanel from '../../components/trade/orders/OrdersPanel'; import TitlePanel from '../../components/trade/TitlePanel'; import { useContext } from 'react'; diff --git a/tsconfig.json b/tsconfig.json index 4b16b1f..b84d1d6 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -23,7 +23,7 @@ "next-env.d.ts", "**/*.ts", "**/*.tsx" -, "next.config.js", "next.config.js", "src/components/trade/TVChartContainer/index.tsx", "src/components/trade/TVChartContainer/index.tsx" ], +, "next.config.js", "next.config.js", "src/components/graph/index.jsx"], "exclude": [ "node_modules" ] From 5fb57006eae754e342dcf2837b7af866957994db Mon Sep 17 00:00:00 2001 From: prasad-kumkar Date: Wed, 21 Dec 2022 13:41:54 +0530 Subject: [PATCH 36/37] build fix --- src/pages/trade/[pairId].tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/pages/trade/[pairId].tsx b/src/pages/trade/[pairId].tsx index ec6861b..f54945d 100644 --- a/src/pages/trade/[pairId].tsx +++ b/src/pages/trade/[pairId].tsx @@ -1,7 +1,5 @@ import { Box, Flex, Tag, Text, useColorMode } from '@chakra-ui/react'; import GraphPanel from '../../components/trade/GraphPanel'; -import TokensPanel from '../../components/trade/tokens/TokensPanel'; -import OrdersPanel from '../../components/trade/orders/OrdersPanel'; import TitlePanel from '../../components/trade/TitlePanel'; import { useContext } from 'react'; import { DataContext } from '../../context/DataProvider'; From 8e63a8208f3d60669c5ac5e1c9c479cde37dd97b Mon Sep 17 00:00:00 2001 From: prasad-kumkar Date: Wed, 21 Dec 2022 13:41:59 +0530 Subject: [PATCH 37/37] build fix --- src/pages/trade/[pairId].tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/pages/trade/[pairId].tsx b/src/pages/trade/[pairId].tsx index f54945d..ec6861b 100644 --- a/src/pages/trade/[pairId].tsx +++ b/src/pages/trade/[pairId].tsx @@ -1,5 +1,7 @@ import { Box, Flex, Tag, Text, useColorMode } from '@chakra-ui/react'; import GraphPanel from '../../components/trade/GraphPanel'; +import TokensPanel from '../../components/trade/tokens/TokensPanel'; +import OrdersPanel from '../../components/trade/orders/OrdersPanel'; import TitlePanel from '../../components/trade/TitlePanel'; import { useContext } from 'react'; import { DataContext } from '../../context/DataProvider';