From b89f70371e92d1e53ae80f8b93c53c757c4d9197 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20S=C3=A1nchez?= Date: Wed, 1 Jan 2025 21:12:39 -0300 Subject: [PATCH] gateio implemented --- __pycache__/balance_accounts.cpython-311.pyc | Bin 889 -> 0 bytes __pycache__/credentials.cpython-311.pyc | Bin 1081 -> 0 bytes __pycache__/earn_binance.cpython-311.pyc | Bin 10457 -> 0 bytes __pycache__/earn_gateio.cpython-311.pyc | Bin 3914 -> 0 bytes __pycache__/earn_kucoin.cpython-311.pyc | Bin 8402 -> 0 bytes __pycache__/earn_okx.cpython-311.pyc | Bin 5986 -> 0 bytes .../__pycache__/earn_gateio.cpython-311.pyc | Bin 4263 -> 8468 bytes .../__pycache__/earn_kucoin.cpython-311.pyc | Bin 8421 -> 8421 bytes libraries/wrappers/earn_binance.py | 2 +- libraries/wrappers/earn_gateio.py | 121 ++++++++++++++++-- libraries/wrappers/earn_kucoin.py | 2 +- libraries/wrappers/earn_okx.py | 8 +- main.py | 2 +- 13 files changed, 119 insertions(+), 16 deletions(-) delete mode 100644 __pycache__/balance_accounts.cpython-311.pyc delete mode 100644 __pycache__/credentials.cpython-311.pyc delete mode 100644 __pycache__/earn_binance.cpython-311.pyc delete mode 100644 __pycache__/earn_gateio.cpython-311.pyc delete mode 100644 __pycache__/earn_kucoin.cpython-311.pyc delete mode 100644 __pycache__/earn_okx.cpython-311.pyc diff --git a/__pycache__/balance_accounts.cpython-311.pyc b/__pycache__/balance_accounts.cpython-311.pyc deleted file mode 100644 index 0ee08675b64c54a6e4cc0f6b9478e69bb8d2512e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 889 zcma)4zi-n(6u!&vp6ybVLfR%EA_WDb2Db|=kfG{=geoK^SS;5$1rsNZ&W?a6l^7T@ zvNaMr6tQINpK-PrA}=5z1~#LJr4#Smq^TeSC;9xn=kI;r^WFQXCoGgQYlGZMU0@IWn^tU|>R>Z3mHLD*0AfOVMmW;!B=`sp4x zet_KP^L#(qjP=+(@x2K=gqQ?4*;7CP^Z?}n;r2?*5RQnEm?83K48g_!?=}){iK$yr zcuc#vy2$wgH#6ss1b3#91&q%+uH!>2qDDfT*8We?uZqK@ap0<%P&<)dcx;C|aW8|s; diff --git a/__pycache__/credentials.cpython-311.pyc b/__pycache__/credentials.cpython-311.pyc deleted file mode 100644 index 4acc2f7f82be99dce04187e40e3d28f80d3a837e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1081 zcmZvbO>f&q5Qa%fmSj0LTLW?I1ZdneK;fdQ$mMdmM2o_bY{y7k*|kz7au3FGcPZ17 zNSTxn*^q!7dJuBTtvwaJ75yVU3poiq1?V3z;9E{vs-iPshPIG=7vd@9;R4kI2Y@KIVU+KvNy!MAaa6O_!n{Ox<6YK z#L|cUOc7gtREajdo8?w{%wet{(2W(PsSz-7yZ#O4#1rE7j@l;}@-RrQA3yKB_*d7lY>}d4iuc zN=J6*sZnlt-=AvR#lWpJ&VnX2d!14xmos+z88 z7J?TKO<)lnm@MyTrkRI^uH~^~vph6yjW~vlsO3ai?yp)_U)G2<-umx z^*w}8lx~nN7gN^7ZrHG(!qKB4J_6r@c1!x?$lU z@J~4v0pI?Lt;&HJo#Tu2TJXCpeN*ZB^I7od$J1q#D&`n1zH>?>#Xcx55Sng7eP9|89Yf!w%e2*{hJc=I5M(F&7xg zPXk|i3dXJ}w^?AO17)WDGT}D_wM*|D-ZqSq8+K~EVI~EFV{&S|33cMgSeimK+ljhU z>O>VfwK&<9mY%S%Px1So^-h@?t=G^MGc8-aL#C3;zzeW?j}UVj-m%rIXy@rP^x`{| zydL3QIx$Jo4c(Tc{KnvP^^~$vc&$DlZ!>qg`#;}*yL}_B=3`VOpo*>K-5ZlUK^Y>s9z) z^E2kS0*FeRpB`e~+%(4*Kyb==1@;W>k;EaNFXt-&rxE78HZ=m1F64h17ro=CX6J}u ziT0ExP7qBK<#V#0mdDeYI4-9VFrqmj%A#WGh6pE?vx%(g#-u1KikUNPvD+jxUpt%A z&&g?+dH}h(vE(lGk!x4874RC9taX29URzt&t;xj*SXA> z%9HibdPoRjkU@pO0p>DOy9O~Ru&5PP{(9spJoPnva(bXZj4+*y?dLGeR)*}J2 z@vXTXZWaikss+;-&9dZ4nw5;Xa?^#cIiRnliL`cJ2XU6N#8h*NEv0qKCivuzkR>{d zBRXM{jBGn~Zif=~;>777T)x5Oz1}>DBnfOHMl>)HhNU?IEp(4qwo(I8LR4u8R=%@B zGJV+jg%G^f?|^`CazgDUkhDv0eVN#|kl1(2F1~rXs7)1fv&F=|+ll;QB0s-xsil4X z@OO8bo-o*B6_Izid9X(0r_T{N&>C$)av7>a)ur18j=>7B7dnZy2WK2qu66 z-|%zffkG*uOD&0u&zFAR!LckrA8@tso&M^n4(6kH>KXoef2xbW*(Crw3g+<0;Zenx zF(~KD{y!kGR@pCb1-=kb+3Va@XzQBa-keYns!D$}B>nsf(jN^-e>5Qd(do5Ie`GFt zA&M$hrCdPzh5T2(s*`iJIg%T<6rzu7V)wXdrZw5vA(~lRHw`(R8~}})13gQ`2{~

Mdu(`UN9y3gavPZKH&Mo#*bSl|sy_;v z9ke$LM3D`{v_%-~B++DWhd{f_hWNrxI8f!5n|l)8V^VNxJ#6h)ov55ao8UBrp4w>$ z4W5Wlk30=zxP;p$tkMisAeMrabYhjQNV<@0L$V!6vc@$K@e;mumGnTq(}*LG{AQg- zcL89CUybJHf0fIKpzo$?^5)Noy^Da)U*6&{i$vI&20j(1igqKD|Y21 zSgx{=YpSMYQt9-ALDzJ_>^I}$LhPPMn{pU<`h-aQK6I<31iT86k&z8mhCpT3Z%oxJ z`w=Swe=NjR0^~W67^l{M5*LJZfss~0eZnpNpFy7d1bYPk0pE`#r_*kiE!ZW*dZ=92 z0`^9)0Z)JA+e1hX-`oj3mSEmkhWWrkV&KMD@uXHXY{2&*cN}4^aFYP@0fhM!h56K@ zf;o8s(Hsmh&=S|d|L)&_pe5!)erP$CQ+XZSgFmppVb|zwvMbozhv98<)Y}A~SEXFQ z-bUoMAZBSqA$EsNq%X0)wOX-+=b}~`$wAk570>20GK(=#7W~g1am1F14e^ti5&L?? zA=i8l^!Yuar(4;WUv8&(NIpN%w{xdo;b9wUYHL4*wGr1#eiHrC3ePxeS~{X;b%Xn< z7m-EJ%*bTY3fR#I$Wqye)?*)~Ci86}R0VJCfm+u4K)`f1Q%t>l(Z2N7V&dgu;sBgC zUU09E)I_$lGVjMzTlf$AQ*HdsHUU_w_o|0>iyo-%AK@3+>-Q|UtPy71{}5(8g&7Yp zqg)VX`G@IC`qGYTW+?H}42=WBo?)XG&6WH%3;+yJa^A<_56nPQ^vcH+Qd;y_3&Stz#5l{VcOw!l#<01Hl4qpnCO z>RL%WBY~(Z5{SAY4-j?nbCC+YlZA(D@&b(#;h-Zl;v>H zRgiQA-vH`@hZf8ZX;Cqa+o{ys+*qWdY? z()Oz>x+SZ-HL!d|>`^^a#nU)8Iw;z32a05}xQv^ze0*qz`rws*m=4k^`oW9%>5`2E zw#p>x>iU7C5Vv8&Llr@lmZ~U%Dy1f{!9Tl-pw%@V z+)q3h+}*(P|6upmKv#=~X!sIB=a!K5#>ve5ci7yB4OX<1@2D`*6=lu`aJj+7Wy&?s zsbb=FIB)EAua7A%9Uc~pe+0haKYf#D&t}0$!s-Alz0<|=S4<;k?GTT?nmRbT|In+* zok$%W8u4q~-+Vtlw%Li`^HuS9H{XL9h~HI9nu7f>SX*4(n!)BgZo`seNLKfD=~gV! zLXB71ioK`Ay9lDc00A#|oeQEpE{OIN6Qgk6KyvH2n|KV7bP&d__*Y}!go2_ujno#`N@a8@&(@$;KDRr8m0WR|A&-WFUM#o?JFM1EzN^C0R4aA`+Oz%&1Xs&koD8`*87d~MTlwPn6kPF46PJ1X zu;T6+x3)3Aji;XGKkiR$=5KBmfQ7F=M#;1Aa7liY?m)Q-*4<)Y$q3$R!f$pAIipFE z6PKh6?CQhrzU0(P5Vp%{_YPSHMG0=9lV_0p6v-|mgGlxvc^%1NBu9~)Kr)5|R|)8c z8+132;PxOTwZK^a0`j*1Tjn_7CD>{&k$8;&ABy;7LsWo`c%L-aVKPiM*JECoY-z+i zpLE0oTvn=}t(7@Vv}Ay8ZKOE?+EGt)D(IF5nqQr|(}6QFoUC#eRS4?U(S&TPF+0^r@@o%9{QPt3o1IX;mQ6!_LBQTcaw3b1}-&Y{Tj$J y&$8??$Fq@T21$%zw-%Ys;JL(XFNV)0rmGk}mm{Y*7Uy#1%Qx=5Z&xWoC*$ApnG1FR diff --git a/__pycache__/earn_gateio.cpython-311.pyc b/__pycache__/earn_gateio.cpython-311.pyc deleted file mode 100644 index 6f2d743a7d7094a7dbf18fc8251704db42db9ef2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3914 zcmb_f&2Jk;6rcU@N1QlLu-lpzf}0>(^HD>aP})X;(gGDK0nxz00#=)yiL>o`*UYXH zVmYWtJs4C02c&Y~5D=7B<-m!*BZ(|ETG10HZbspNIPu=@dht4;w1~0y?R?K~-h00{ zv)`xFDFP`!U$0mRLVm$QH_1U}`y6Dh5lYI03REQ|hkD7yovYx)^OXQtz(&sgSyUa51{(Jj+WyaZjL)lFgM zEmMblQE&$<%u!%6ngLD|=5Zy~hpe0R5p)^b%fKBfM7_d*>QgA<-(1Rle zc?q8FPdyk;Pa74kL+Msn^A12>6;?$D`v<8hG{qmpsHRsX2WJhE19t7ErWBnqT51xd zYjdzRz?Np+xR1Lix)LbRjoVD)%qhk=&dRYnkE1|HZW4Eg$_7KpHZvC7M4)*$g&BXa z8`nI;**LlY>Cfj%i&mADOkJ}K)h?a2w0adRY?t2P) zjxfE+oH{q{g0sj93!Jfnx}@rcI&ZMTylSYX#tPO#K`m&OZWiE={T!}R-K-Q;O|$Bz zQ#fpKub#bM*OycSbP_fNBiIMpqH0!HF!C^5f!y1iQDO+>>ba(Lf!q{l z-K19MoSE86QRc%it(!G;+fg7!DM5?QY&YRp3e`2ojjOd9Gbs=Twa4=~BHf)r!J+OT z5DGlSFUY#Xsy1p7eJHTjUN44q-AAc$i`Ib^jq!eig)SEMK?B(o#AULTf9R|9?fi+& z{E3bHsdoNUE4{Th-x}P?9qbTs;Fu>`XSXuh&zhe!KmPFQhhJW7XNouGHZ#wxXP(&_ zIdFSqd~;-cZSwo+Z>GPV`F3Vw+q zp&iX*u>Lj%GEhz?+j2bo93AN2(DTQjQ!jpg2rAqZXOyw3q8bK2j1^hRY)3b}6Y8H} z4+nz+1vK{eVve?rYiGQE;j@?Vh*g@}8 zNN;`sp!d<*X58a8#9nH1bQt~!_KNrL83?Q`Da*P^tz~`?THOKfm_l}QG?|Sy@%S7N z+P{?eLB6rCU*&;&KaL~uasuAz^ECg(YqxV#o4Kit-0^nqcxzxQ_i!I|uQtDYwVgS1 zBe$7(YCZGRy^=N(!|&=!Makbe`a3^{5YY?5P_@tV8Mwe%rfMh#TX2;3>z1Q7Ci-`Y zx4gbiINg77Z+;YUpvQD0rUxV7dkr010UKGI?u4;Rr{n({j6J9gq;NF?;$Xinc62!v zf#6D~&!4|<6S=ap0!rR#Bk%C%3_=05l|^t;i?8fF{QEjQA3+qM{@wjW?(r9li9R41 za^N%pAM&WDh$U*AE$M8z@o2xQcI$N}f^D`a&hbZ~swmBQ!Q3whd^9CK#1i!Br1~8qSxA2mkcNP z$Eo^9L?`WQ-EEB!mA`S^^K5azO(+U{-hpyl)715I!v^+;Mf) zu>J1~Piav_{+XQijWxqxgOTWab^}C55(J?mih>Lg5k!&*XM}a~;@$sSWMVz~@5s{v QsCTFM4eNg2rNP_lUuJ!nxc~qF diff --git a/__pycache__/earn_kucoin.cpython-311.pyc b/__pycache__/earn_kucoin.cpython-311.pyc deleted file mode 100644 index e87ee8caccc3a815d552182e6976b1d939228e49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8402 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 QYHRurTK~_7aH%K$8&P@N!~g&Q diff --git a/__pycache__/earn_okx.cpython-311.pyc b/__pycache__/earn_okx.cpython-311.pyc deleted file mode 100644 index 1c61d9567ef0650431b3ae8e4dbc3472564d3459..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5986 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 diff --git a/libraries/wrappers/__pycache__/earn_gateio.cpython-311.pyc b/libraries/wrappers/__pycache__/earn_gateio.cpython-311.pyc index e724e5ad8675b470a8db557176b5eb38cbdfffb8..bc7504f3b5724f51bdfc85b2942c2e88bed280de 100644 GIT binary patch literal 8468 zcmeHMUvLx08Nbt=q|+Z;7#VD^2?{tA1+ba`1rkU~FmZ^f;{+#wA-SHlhb@qF%HA1c zRi2?Ud2myvp(!o-LneC2P42vW)}>BR3VM;!WYjjvyR;G@ zjlcV2Oew>aNBEoYbjx{j7CKPiWak;uwJveQ15a2FJBR>Jwb6oc0;`I{me1B9zpiFo zFcPzFO6#B2^M15w;^LmTmtsYhziLA(hzVUyQq{1;NliB_UyiEhQkTHkqOPXT>8Mid z!BApS%czNLDygLvJu#pqr!s2R&=Vt6JFg}okyI}+3nbF1ajMXiswbwYl4HY(mXU1@ z`*SmvB+IF6%8=!Jr^|HxwYO`aMg2(-m$@&u@4o#~Y5Sq__CqD%UY(8wX?5Qjj-?u`1~$6o*lAV03xJL|ZtO7D)l%RZ-bQ;B z0z|wa0Q9~2)4^Ev7*w+=1y|H#N=#2pWEEqIsA@gmhS zu|Ycqu@5i~Ik^^>_f8q-cI~(LU|g_-p`)j*z-TH1H7J>!C7w7oI2;dIq5-cg|D>W% z0`x7PKB??|>S@b2l_OBI&QoTe{6Hpi&Eu$nYA*)VP>@CG%u>{?q@gNOj z+Luv{NsU;-6ir)U(3#H2ke$j-SnWAwCao!?_RJd=pRwApb(P4~OpDjSd%*-c2K<_R zVlj%qu%rn!D`Re>`_4dDIIvZeBk9j5B_Pm6gg9loVgcK??%*8WTG6Im=h~qJ=Y3<*m_&}-L~IvyVGYz z2Jw;xX#~2IbRm^Pe?xrUKgA*h;b%R>Gb<20#T%YkvA`7}yY(Pmz-c{Hd-Cu}LAcp~ z_gQa2EV^5Bs%geD&l!%7g8w+t1KMyRg1bG|TD8rBxaezY7oyX7U#&6Xzrb{$yCJ@~ zTB+r8O%ZT_dvoKgzu+g*2IrFkU#%lt;2|ea&q?t~4-XU2l^zl#p%j0DBSC20i8A;m z9?t*R@u=5SaLKIB{P7%B)tGWoNu`zXv>F>%(n>a|##eLeFVNqFRSeJD_(D*1+tPP9+s1 zrDYT6buGK#v3!S4n=4P1=`V)sv$|Y1fVt)-PH;~d@-hU znS~7z6@wU~UNYj69UVk84~?-;?byKdqTj_gVRUS{svuSm9nb2jC8i8DqvO!j!hszO zqR6PKHkPY{kl*Z{mRI=T38+TD2jVifEOC+8oKRWcJr}BMN|=XFm}^Jjn)8DrUY~t` zw)pz|z~a!7u<**#nNruWa@VoBa7Bu|*Zyw%)j~&jqdUy#j!JK=*jM~fdCP9IXOG!gy_N;8bLU?>d(2I{%xJ$E?uYaT zr*6Cn1KVWVDe^hG0|ojX-G!nb#ZxHupx6r{?q?XM&*F<13Pd$Mh~f~6=RoKf z$*M56QM{h53u?hc&QXm_0V&OIX$G?6q0Tq^vBF=1xXe}B`vA#}AZED!Mv$B|qofoi z?Yp1ZxA(#@|}RUlnySQ4N^Y@{cuRuQC59;_eq!-0dt9vwbIAE%I#P;`l%pe$j5>#jfRfl@#+3$Y@lSN{=7sp@EAZ|WR-tLNQxJ%k_-=^6Ex4k? zoS;tUfH8EfxC$a;IlhAbCTMZX(PUNvOrRbuM?q@Ar?Zj(R^?_=4m)zU$l9}8l?whv zsVPDS3W54ciUb^l28s^u+$!CKhx)pb@uEO|Wy5$;X!t>-j!@t+q&Y}hBEDS^>C;e~ zzhL1dtPZ_7`Evq0~d_LXbWNWt&I`{T|jQ=3uqY2nWRw zNDrWR1_TtsMTi}OUxt(=VsrIqTw9S;*^oG{kr`KTUTMkEp-+wLNtzm0YhIGy{p>({kI@6DsOJ}iVffay|LdMx$RpRS{%AFYMwZ4M#kV`3joGD-k2XUOOJo=wqAPtnLEeLlV{B6*;4duIePa0o&y5`+f(%z z{VjVA9Rz(`ksK+7<)bQ5)eJp`c|SlgjG`XdNAU4A5G$^V+wI~GJ~z7Y*_bC|9ghUg zGiKy0T>lf`bcbJD9O7c+J~}Pz`ofMc2B!sKm{GEP$EX$?S7WJ6F0JBzpGp=uh&A>m z#f52wPUt$;QQKMwvw2X{Q@Ezece_pK&dFet?I6Ir*L0a1cAAl0rnJkZ-ERFbY_n-+ zZEe~C4XZQEwoG{u4VHo7w4?Sg3v;9#DZ9NAyTI~ z;;Lzm*g|ufU4aqn0qC&{_>5S4?Wi8ZEXJwpYzD2&*o;kP>`iuixt;H79>eMy`fVtq z{}coUXj}j`(&lfGwz%nmgP&LpKLTuG0D^FP$JywC?VKX?r1fap=n-s^&_oSqO=t=XGc?6LjB(H*Fi1VfTHcYvqeot9 z3aatu9SxgYcyo%8oLq@rR5vkfcEMVRVKc9zXo6+yW<^keAVe7Z$**?;Wzv8^AXV0)$RK>W4p(Kn%7!(6~rsS>*!&IdA8lNu$h zs;uzQ&%RMr)?tTn4$m|w@_4gNT0VKdK@CedeEfLB7V_7cr8;W#I9Aj;Tx|D^sxXlf zU7k$ohDK*vci);m_*H{aNq4;adVNHD8kod7klfo!iIBn>zy?t_nyX<@;6K5ODRnyE z*KDzszWS&^zqn@@{<)=Dco|=dfBj{_S!LM@%5nyFY0{Vu%YafPZRb!V2KJKW`=C@NWzG@d zu=gc?nQM`ct?}+$<{Ysth>wog7{EtIbcgWK5xq`|z3b(@{mYyqB&QgwpxddGRlm{s zj+Kxe<#DAFPP?{!&@}OY<(Fmn4@{OR{tHCAQ1qg}B_mrRS|Rwam;e<_DQTVknQU9N z(b5m3gZAJ)M=wE1j3oLM5X%D3^UEF&FT!puh%m>8FNg4~aP61bS>f0-zKL9Br|ZpD ZlWVw^eaAgK*l=a}clQ1t56NZy{ukPTZMgsd literal 4263 zcmb_f&2JmW6`x%$KSX_yl4zN=8-IyRg`PW?MXfq;bteCjF4g@sz6$f@tmE>~Pi5$vKv z?%VmEH^2AZZ)U$79ZeHVf2vphoh0NRq7Vorc<;UinFoZDGNBTcO{prEKTTm6>*pai^r!jMcf)EYrAEw~X{RI7w0QhOXC)8>Yc5*BiZITgyhJ&NbJt zEid^7bcI$gjhSCq2IPy9H(X(^3X`dK*t#C5B3?bkb}1Ae5Jt)pY*D7tJyMQQ8KgpE zAmg~1a)Rb)@}5*q(j#;T-YJ@f+95hcN1&9Zqfi>AV<1Op2IMF`O2?sPj7~r)LnmSD zc~Ay+YuGC8N|*Yyi9N%w;bb;P0g|;}7-{x-g%EqYIF}d#AKwS6Rt2blcRN(oI{hSHaFs>3weBW;$ea z_K|?DWEx9c;|6m|Yh0@de-VrNYM!aBdnr{lEW=gRMy?O@Grig&Sk$==;x2hMU3_$^ zJ$=42eZHMK-b()A*t7BJ%}ZZj*&3g3kI#3;=Ua(q`I*06e)P-s>|AGduARTo$zNzG z_eWds+l5Jp-g71_prwQ@5fX?S2{4o!zfI#NF@3z>ZJOdd|!8IIIzEI$kSTl*?60D{M>NH;Nhwy+7IG2Nv-X+}>$xgN$egsMp zR6-Bmf|duQNp8d2Pn)4{_iFI{5S}Mt#fDrV8?mN*ll=P44W+4U_9GtlijJYu55ktF zbVrQfC!4X&zQ_qXkms8-8Y>dH|5h`0i#(PWyp&$&oLTyMQQ>1Stv6{Jj;jKBsX+_) ztCw_bl^VM1CD3mz3NeJ}@jQ+g?MGib2T#lk*lAcumuOLp=<{Nw1;{N?TZ<#zsRCx5jyx-*q;4e#VmbcsB4UWnGs zoy_EC%}<-Z`}qFHU)=6wijNkzGp}xCUfszaf0~`y&dzMkeR=IK*Zw^J*ZFq#Tqk>O zD|_xgJDFo!sbl-y0Zkx+V3>j2KfXyng0mp;|MA0r_!2mx()T8m~AJ!WyFH z?nNmQXc6e~%0|2yza7%!3zA^`d17iG30_4K+f@t3hzqA%ir z=JZu{&9JDw#!o=2HzW>oAp8gg;zD6(c-z zRQL?se{D-MRg*2d>W6jP)f%&dyTnV+K&PL=bbCG)xnCZt6TgUhpvUw87HS0XUPH%L z!A3Tx`_(w0)3yJb8b=Tf4B=`-i4%iZ?CbJcLuzakBExEawX68eWLqxg{``~^ADS4e@}UOeOxr-&tLoUIyct?|kr zR0s9K@4G#}St!bjya-jr*rFhFzaa6;SSRr}@Rh|2wxv~>s(NWvt-`&-#QcZ~{;HXN z3(w)icn9NnRPa+MFf92T3gNEvn0pPy>nH?FLZ7#>h$ozXs^I06;}uhg6l9!lLEH_0 zT{#xN*d?JDQR0(b5{i*T{CJmyVnUAN-KHnfQaslsQIU!kMe9IaDx9xx=IF4&5r?)O zv_`0vj{`!mP#p4-stRAsfOrZmj9**g;ka@%Kokrp7z|c&`|5y_kMsfWv zb6JpVb2M1OSdf#}90N$Se7qySVPQbf8TZIRax|L>65t?0k2T$d!k_h9)?QU9;+ IX%)NvFLwUqWdHyG diff --git a/libraries/wrappers/__pycache__/earn_kucoin.cpython-311.pyc b/libraries/wrappers/__pycache__/earn_kucoin.cpython-311.pyc index ab955c08ada20f4b7a729cf220c5bb799e9ea192..556ba30922ffb00259b95e3fc82812717c9cbf8f 100644 GIT binary patch delta 136 zcmaFr_|%biIWI340}!NdEln5N$eSw3m^Zmtavo#RWFe_G#@%bY5-^jBoqJu diff --git a/libraries/wrappers/earn_binance.py b/libraries/wrappers/earn_binance.py index 9e5f316..3195580 100644 --- a/libraries/wrappers/earn_binance.py +++ b/libraries/wrappers/earn_binance.py @@ -19,7 +19,7 @@ class binance_earn: account = self.client.account() for item in account["balances"]: if item["asset"]==coin: - return item["free"] + return {coin: item["free"]} def get_available_products(self, coin): diff --git a/libraries/wrappers/earn_gateio.py b/libraries/wrappers/earn_gateio.py index 2bdcb39..9339d2f 100644 --- a/libraries/wrappers/earn_gateio.py +++ b/libraries/wrappers/earn_gateio.py @@ -4,49 +4,152 @@ https://www.gate.io/docs/developers/apiv4/#earnuni # Implement from scratch, gateio python connector is AWFUL. +import time +import hashlib +import hmac +import requests +import json from credentials import get_api_key + class gateio_earn: def __init__(self): - api_key, api_secret = get_api_key("gateio") + self.api_key, self.api_secret = get_api_key("gateio") + self.host = "https://api.gateio.ws" + self.prefix = "/api/v4" + + + def gen_sign(self, method, url, query_string=None, payload_string=None): + ''' + Generates a signature for the API request + From Gate.io API docs + ''' + + t = time.time() + m = hashlib.sha512() + m.update((payload_string or "").encode("utf-8")) + hashed_payload = m.hexdigest() + s = '%s\n%s\n%s\n%s\n%s' % (method, url, query_string or "", hashed_payload, t) + sign = hmac.new(self.api_secret.encode('utf-8'), s.encode('utf-8'), hashlib.sha512).hexdigest() + return {'KEY': self.api_key, 'Timestamp': str(t), 'SIGN': sign} def get_trading_balance(self, coin): ''' Returns the free available balance of a coin in the trading account (or the equivalent account in the exchange) ''' - return {"Error": "To be implemented"} + url = f"/spot/accounts" + query_param = "" + headers = {"Accept": "application/json", "Content-Type": "application/json"} + sign_headers = self.gen_sign("GET", self.prefix+url, query_param) + headers.update(sign_headers) + response = requests.get(self.host+self.prefix+url, params=query_param, headers=headers) + if response.status_code == 200: + for item in response.json(): + if item["currency"] == coin: + return {coin: item["available"]} + return {"Error": "Coin not found"} + else: + return {"Error": response.text} def get_available_products(self,coin): - return {"Error": "To be implemented"} + url = "/earn/uni/currencies" + headers = {"Accept": "application/json", "Content-Type": "application/json"} + query_param = "" + sign_headers = self.gen_sign("GET", self.prefix+url, query_param) + headers.update(sign_headers) + response = requests.get(self.host+self.prefix+url, params=query_param, headers=sign_headers) + if response.status_code == 200: + return response.json() + else: + return {"Error": response.text} + def get_product_detail(self,coin): - return {"Error": "To be implemented"} + url = f"/earn/uni/currencies/{coin}" + headers = {"Accept": "application/json", "Content-Type": "application/json"} + sign_headers = self.gen_sign("GET", self.prefix+url) + headers.update(sign_headers) + response = requests.get(self.host+self.prefix+url, headers=sign_headers) + if response.status_code == 200: + return response.json() + else: + return {"Error": response.text} + def subscribe_product(self, coin, amount, rate): - return {"Error": "To be implemented"} + url = "/earn/uni/lends" + headers = {"Accept": "application/json", "Content-Type": "application/json"} + query_params = "" + body = {"currency": coin, "amount": str(amount), "min_rate": rate, "type": "lend"} + sign_headers = self.gen_sign("POST", self.prefix+url, query_params, body) + headers.update(sign_headers) + response = requests.post(self.host+self.prefix+url, headers=sign_headers, data=body) + if response.status_code == 200: + return response.json() + else: + return {"Error": response.text} + + + def redeem_product(self, coin, amount, rate): + url = "/earn/uni/lends" + headers = {"Accept": "application/json", "Content-Type": "application/json"} + query_params = "" + body = {"currency": coin, "amount": str(amount), "min_rate": rate, "type": "redeem"} + sign_headers = self.gen_sign("POST", self.prefix+url, query_params, body) + headers.update(sign_headers) + response = requests.post(self.host+self.prefix+url, headers=sign_headers, data=body) + if response.status_code == 200: + return response.json() + else: + return {"Error": response.text} - def redeem_product(self, product_id, redeem_all=True, amount=0, destination_account="SPOT"): - return {"Error": "To be implemented"} def get_position(self, **kwargs): return {"Error": "To be implemented"} - def get_account(self, coin, recv_window=5000): - return {"Error": "To be implemented"} + + def get_account(self): + url = f"/earn/uni/lends" + headers = {"Accept": "application/json", "Content-Type": "application/json"} + sign_headers = self.gen_sign("GET", self.prefix+url) + headers.update(sign_headers) + response = requests.get(self.host+self.prefix+url, headers=sign_headers) + if response.status_code == 200: + return response.json() + else: + return {"Error": response.text} + + + def amend_rate(self,coin,min_rate): + url = f"/earn/uni/lends" + body = {"currency": coin, "min_rate": min_rate} + headers = {"Accept": "application/json", "Content-Type": "application/json"} + sign_headers = self.gen_sign("PATCH", self.prefix+url, body) + headers.update(sign_headers) + response = requests.patch(self.host+self.prefix+url, headers=headers, data=body) + if response.status_code == 200: + return response.json() + else: + return {"Error": response.text} + def get_personal_left_quota(self, product_id, **kwargs): return {"Error": "To be implemented"} + def get_subscription_record(self, **kwargs): return {"Error": "To be implemented"} + def get_redemption_record(self, **kwargs): return {"Error": "To be implemented"} + def get_rewards_history(self, type="ALL", **kwargs): return {"Error": "To be implemented"} + def get_subscription_preview(self, product_id, amount, **kwargs): return {"Error": "To be implemented"} \ No newline at end of file diff --git a/libraries/wrappers/earn_kucoin.py b/libraries/wrappers/earn_kucoin.py index e2c1a9d..d4cf826 100644 --- a/libraries/wrappers/earn_kucoin.py +++ b/libraries/wrappers/earn_kucoin.py @@ -51,7 +51,7 @@ class kucoin_earn: request = GetSpotAccountListReqBuilder().set_currency(coin).set_type("trade").build() response = self.account_api().get_spot_account_list(request) balance = response.to_dict()["data"][0]["available"] - return balance + return {coin: balance} def get_available_products(self, coin): diff --git a/libraries/wrappers/earn_okx.py b/libraries/wrappers/earn_okx.py index a2502fb..97721a7 100644 --- a/libraries/wrappers/earn_okx.py +++ b/libraries/wrappers/earn_okx.py @@ -26,16 +26,16 @@ class okx_earn: balances = self.account_api.get_account_balance() for item in balances["data"][0]["details"]: if item["ccy"] == coin: - return item["availBal"] - return 0.0 + return {coin: item["availBal"]} + return {"Error": "Coin not found"} def get_funding_balance(self, coin): balances = self.funding_api.get_balances() for item in balances["data"]: if item["ccy"] == coin: - return item["availBal"] - return 0.0 + return {coin: item["availBal"]} + return {"Error": "Coin not found"} def transfer_to_funding(self,coin,amount): diff --git a/main.py b/main.py index 3db1a07..fc032e6 100644 --- a/main.py +++ b/main.py @@ -12,6 +12,6 @@ gateio = earn_gateio.gateio_earn() if __name__=="__main__": #Available products - print(gateio.get_product_detail("USDT")) + print(gateio.get_trading_balance("USDT"))