From d187eb167306484c87d500d2d1d6befca66f9aad Mon Sep 17 00:00:00 2001 From: codingsh Date: Tue, 8 Mar 2022 13:52:47 +0000 Subject: [PATCH 01/33] feat(network): add harmony network --- packages/mask/shared/flags.ts | 1 + .../components/shared/ApplicationBoard.tsx | 1 + .../mask/src/plugins/EVM/assets/harmony.png | Bin 0 -> 13017 bytes packages/mask/src/plugins/EVM/constants.ts | 10 + packages/mask/src/plugins/ITO/base.ts | 1 + packages/mask/src/plugins/NextID/base.ts | 1 + packages/mask/src/plugins/RedPacket/base.ts | 1 + .../src/plugins/Trader/apis/trader/index.ts | 2 + packages/mask/src/plugins/Trader/base.ts | 1 + .../mask/src/plugins/Trader/constants/0x.ts | 1 + .../mask/src/plugins/Trader/constants/dodo.ts | 1 + .../src/plugins/Trader/constants/openocean.ts | 1 + .../src/plugins/Trader/constants/sushiswap.ts | 1 + .../src/plugins/Trader/constants/trader.ts | 2 + packages/mask/src/plugins/Trader/pipes.ts | 3 + .../src/plugins/Trader/trader/0x/useTrade.ts | 1 + .../src/plugins/Wallet/services/account.ts | 1 + packages/public-api/src/web.ts | 1 + packages/web3-constants/compile-constants.ts | 2 + packages/web3-constants/evm/airdrop.json | 4 +- packages/web3-constants/evm/artblocks.json | 4 +- packages/web3-constants/evm/coingecko.json | 8 +- .../web3-constants/evm/coinmarketcap.json | 4 +- packages/web3-constants/evm/cryptoartai.json | 12 +- packages/web3-constants/evm/debank.json | 4 +- packages/web3-constants/evm/dhedge.json | 8 +- packages/web3-constants/evm/ethereum.json | 16 +- packages/web3-constants/evm/explorer.json | 8 +- packages/web3-constants/evm/gitcoin.json | 16 +- .../web3-constants/evm/good-ghosting.json | 8 +- packages/web3-constants/evm/ito.json | 28 ++- packages/web3-constants/evm/lbp.json | 4 +- packages/web3-constants/evm/mask-box.json | 8 +- .../web3-constants/evm/nft-red-packet.json | 8 +- packages/web3-constants/evm/openocean.json | 4 +- packages/web3-constants/evm/opensea-api.json | 12 +- packages/web3-constants/evm/pooltogether.json | 8 +- packages/web3-constants/evm/red-packet.json | 24 ++- packages/web3-constants/evm/rpc.json | 8 +- packages/web3-constants/evm/savings.json | 12 +- .../evm/space-station-galaxy.json | 8 +- .../evm/token-asset-base-url.json | 4 +- packages/web3-constants/evm/token-list.json | 4 +- packages/web3-constants/evm/token.json | 188 ++++++++++++---- packages/web3-constants/evm/trader.json | 204 +++++++++++++----- packages/web3-constants/evm/trending.json | 12 +- packages/web3-constants/evm/zerion.json | 8 +- packages/web3-shared/evm/types/index.ts | 5 + .../web3-shared/evm/utils/chainDetailed.ts | 1 + 49 files changed, 515 insertions(+), 159 deletions(-) create mode 100644 packages/mask/src/plugins/EVM/assets/harmony.png diff --git a/packages/mask/shared/flags.ts b/packages/mask/shared/flags.ts index 3a02f63f634e..cc9ede036802 100644 --- a/packages/mask/shared/flags.ts +++ b/packages/mask/shared/flags.ts @@ -57,6 +57,7 @@ export const Flags = { flow_enabled: true, celo_enabled: true, aurora_enabled: true, + harmony_enabled: true, nft_airdrop_enabled: false, post_actions_enabled: false, next_id_tip_enabled: false, diff --git a/packages/mask/src/components/shared/ApplicationBoard.tsx b/packages/mask/src/components/shared/ApplicationBoard.tsx index d30e2849a02f..05ad62ac36bd 100644 --- a/packages/mask/src/components/shared/ApplicationBoard.tsx +++ b/packages/mask/src/components/shared/ApplicationBoard.tsx @@ -111,6 +111,7 @@ const SUPPORTED_CHAIN_ID_LIST = [ ChainId.Fantom, ChainId.Aurora, ChainId.Avalanche, + ChainId.Harmony, ] export interface MaskAppEntry { diff --git a/packages/mask/src/plugins/EVM/assets/harmony.png b/packages/mask/src/plugins/EVM/assets/harmony.png new file mode 100644 index 0000000000000000000000000000000000000000..253faa6665cb0da2190fc8a54d55d291407c1987 GIT binary patch literal 13017 zcmZX5by!qi)b1e^kQNaEhYlqLqy~@?q!C6^y1OKXPC-%W2FX!kXlZE`r5U;zLVDBVy`?~E;sdaRb!=bgQ;opTyR@NWi!cDu$R-K32V zqlg>^ooFG0BV~I!^CcW~GCE%OWwy5OOkk+zt#v2{T)o_ca=o5Vz8{r}5agJ0u*2_r zAI&$#lcAG{TPg$d_$z+Ip!Dg?eSgU(`(*Bf%532H5T3?ah2D|uKj+5-$MyfdU>&T6 zHa~)*bo>;Ott9R@4VbC$`*&Xq+qwBxi?`|C+NDR5i4ED-M8LO6HgzS8qe=(1lfuq( zPbJtc%2Tf;?XFxjhrjl{BfkaQqre8UgAG0DsSJsJ!-qRP{;h0URbe1#W)O$z5J!a& zk)x3Rm#=6`mqu&$^^~{5y!z*F*-O4Sqm)>flC`1Vz=f>$w2<9Zz4_bhJ^vgw8OZD3 zEI7v1LksPRL}${ev5c$k0E0XV@1&zOTmm=a&P-53etgRDrP$&jfQ){T=DKTEw2M+r zi@nBUj?tpTD*k$_?4L@ZE@RV~ZDGjpm}!JEPrlfQhy6V2G{F=4$@6lDHbJ3;5b>f- z)p>fDa_NUguD!GZb<6|>mhiJ(@%31k_^4PBmc+aLFC~u*lntlc`5~;Y(WV?%qX`m8a@$oU3X->ny-i&lIRy>)*rq$r%Q1 z8UU9PEcy3>BKEOR*S6Et!7dJx%tqC(8P#o9&g$Xg7wB8<^IrXK83h(@Q)|oH-W@X0 zn|drcDltNdg%1koT;10ezw3t9+KFtIy@ezzR*ks)R@go10x69DbooeV)eMvvw`~Pp zL_93WVCtZH#S9M_tuL&8m<09(>g#=uUUDI0G7qPjFbU2Mq)ix< z%VM7%&ixA_#X2%5OtnJrGF9l56h*TT-A#x{luyMgBJ}czf-5|>?!6E*BSW#yyrM%! zTM6Kh?Y<8?L#_|5urU%P%b+Y?S!bTw{d%}drn2x26eIZ)v%pluO7MwgcmvfYJX|dd z>IRvvcRPGc5lyRElRYmaD~}4L-GbfArEbmc@?aXF8ndlANu}M2OviJ5Ai99|_WMG3 zgbz;QIn~O|HS;E^S7E*~Q2niN&DQ%c-2C3VVrVyYLSz=9{uZp#wu>_i9+Qza8kphU z7m~ZY`dvLnBqleI*<1moP%>ywQ|f75gGZ5&Z*Qa9ph$_OG-r7jOr7y$V>(TdhE_&O zFiPi~kZJ)){4sS*NQsSmGFrbm`YiRV1{k0&I{rX`rF>$s+M(G>25==5T_W12+7wU( zy}gdoeG}rrpC4Mi_n#mH`f->3Rc53OFaX3`U>a+wxLJR8JFm04)zhw!B5^_wOY&*rZ~}m?*+iAv=sR7}k~b z6C;i`9KzqURNK{yQqNI-Z~H6(eEXruD)l{_1_hK~&Y-Np6d)XnB=S`AcaMa7 zeb{pc;^Lz0(Ywe7S(Jo1nT1cvR}GvOE4_!d?$V4!^kEHn)-n%!MuFd-jy9vesTrlE zQJheQkTIE8W?cph$Az)T7{yJ(S3Cq=9>BV9Pom@*k!896b*1*V5BEnCj%LNqqVJli zDn^jZ5-0ef&>}Sj_I?^HD4TX0h?NkKnv(pT_bvRmksTs51I{qjYk)-V*Ih0I@$1Ul zK#zI9w+i9WXUa7I{%Mo;n(n7D|J07Kef3luJ`_k4w6$(`Z!Muj8dFtShQbJf_X&?b z4+fTp5P5I}0Wjg}zYa2av#hufz*nTRw(=-PV+SXM45;}mKz+`ZQbQ-x%mS8`FirTu zP`a=jykKp7Ke;g96haRG{&T7R4&f0W#TtyQIKq|bXlvGKrA(wkynf3p%Vzez_59FgVc zwWZ(#zxG(ByJi*goS*7%g@Ox!zZy`b@z{qp=}giy0xvk{W!fjH(>}ZS@{vBOSyyu7 zJ3!87h~r%m{&o0H>NnVl$+` z?WCye0?kv-{OAhAX0=&Q2ootq7FJn21lXL~H^oG$&*eU}Xow0if%8@zhjASgejz)G zcJ%;YQ(DeyFKS$X2V1Q-`!Mg3EGF_RDn|Y*Tn#sUp^OS-z%q zjo+E*6xuj=;^O>zd9zVu@6XoeFPpiQAQr-M(0=y6yLfdAg003}>foPl+l;M>>djTJ zZdN-)iC0&`YS?6;UlIqa|wC^F)Qjtc7A>yWl~q z!{5y$@n0DJpU%ouhN$$~bA^Y6SmP4W2{pOzJ)|_-is=EH^-<4tSFAc^mnu|D4w%-% zsX%W=7TLT;A)DEZfh4%@f8{?^2nyX|Tg(ZUPV1V^8(^IiwyWxCv*2PIV4q;0Uzl+K ztL()-d!HkNd02QBN5Idn_lHy@k?0K~0WN*GfZ%$3YlsMXHI#44@niHQhfDP3I<#sT z^ErdTspY{CF&Xa&`v8HI_v5a(@)=O^fUS8I7A^=OSiTCqAYdJ3y}r!rRWrv#u24a z^b07bb#HEcA%(Fc1rq()!z;RJK>bfOiGJ=;T+K>{@zlMZ>B3A&$(GZfx|?dN@=qMb zWgj<3Q>``Ra!H@}^x>b~$*oM>SXzwsVUAOy2x)1$@Y<)jP=i($4BC^2@5(fT2IZaq zTxd!>2@w~qbe(Iba&NT1TPSUhQG5j$AxPeVpTCg0iC_i5zz5gt*OBOXk?zc-9 z|4J(h-}l54^;c}v+D=aN18gUYhcn5cLy|^YqIZU`+{dU;RDUZ#FF6z3+H6Qd59fQ$ z$WQvTRDZF|?&8N+dvpoHN8Um65p`ZJLgLX}MnoaTjD=rN6Dd0WH-@h!Qy-J^5Top-7*w!@naqzd^T6x>N{8Qy4gDAcq;V}W_+VQ>C z4*25Mw{PXGM&WwDtg|=ocDx+pBl1jU!jOA#m`<^dCxaoery=c{=kDKY) zXR^8RW>qph+{W)3>}>EW9Mn5=A-(*~eCr=N-#;rv$bS+#L8>sY)KxUVLcK;CbT>vo zV|*UgV5Gro{BLx4wpC61#}_F-erfRY1QSo7caJ`W#7Qr~X?i#Hq$gKHzm1Rl31j5N z?{flLy$#+u;Zw~qKmMAS){E^ zhwPcyt1Vr1KU)90f87!bALz}ZU6b@}AV71k}_d~RnJNN=heZR(~m*Dq>WCj?|yvfr@`6MO(tOmp08)MXv zM$mBIXO7iie3=SA05!Wz*W`93o!J`Q`7%vtJky17L$1|!Q93Hq`b4bpYL357thGxy zH6}nTfxvfKqoz7>dhR;*`r`V0yngfem*aTw^qzHn z*^p=QDe;sIrpN1LV7>>^dG?a|Je+gf(m}VrIC~{%hq0^m`kVZ*cKzj%L`S=kiTP?0 zRJ$QSL*RQx2#=F>{ZD%x74EnSue7M`{jhHjxF0b>W%dUijn?zCX)T}hFAt<#kag#Z z8_1G(`Uuo+xBVawuYLV=&U4%S_#m&3XR+hit%lh2^bBWqa{99N+B{+UX?bS8j=_k@ z*=M(W$M)dd7Sm-=p#$>!j>;C3WQ=2_5~PT+ylGDAx5c%MGo6+*6RSjKLo7*e#+?W6 z`_nF#hpJMz*Yv79Qy}ut&9nIz}9 zu(0DPN1}Zbzgb+PkN;I04-D?byNod_Z%q!Tr1=>*-|B9kW2IJ%;6ysBnSWKTQ|N#CZ}tPm3>k(iRvt7TAVD z9-I#&YM5^kbqq{>@vGY)rSEm&-yEkqgxWoO@qUK(PUpAB=Gukt!Bc?YjrdqB?y1!% zlvc$VR*?;`@4TuKrqegj;(oB7XG&#Kc)_FlDO{2FGx;@Z(_OPCV_KYjNRYvS4yyX`pB^V- z{$ls-0>cW_Zc%ryFzFk;V`c1+`dt-!5op&3$+=bjx9+pFYL$j=fW>3FsY>}}qwFTh z^cUP7$kVS+w_06FomKcPWwPZrjI6^7Mku)yZDcGu6*jWs#3m!HW5(FwM2O^y^#`xK zv1%2{{JpIwdK=OT4ZJNe2zvyTdDd3T-6(cvAFmiE3t`ktitz?_inTjgjNhd1r`snP zi~0QtL`4|g$+qHu`rap3do{YtJ$^mk6|GHClP#fAMG)l;h=*v*5o z-^cuU?NRJ(bmMK~$*8Sx(xO9xJs1R1%ipU)Ct0tTM|*x^t=`jhP~M_F9+f78jTWaSsQh_4#v~^a3N~2R&}z(%cZe zbTnmg+yGSI&ed>gT>nK>_+;R~AXJ7%x>DzG>WsAJnG@s5r1Nl~vV_O0$7mtN8o&9e zJ_*&th~D5*Sz~*0ggcX@Uo-dAXg?bblQl_@T$l2m!&eO(9tez`y%VH!E@IpM`Tjf;5d;|AQJQVD9Q8r@Nj0eDtF;(*p#0dQz0PrXsGyjfO z4*1^QN(=`MUTIMg`5(6mAQ_uH?04AEy#bR=Ia)oTn^(fVtY2X+Po+uKV- z*Ob9+;vWLQ=xF>`sc>*R&&FA$)!@zH0E#eP$PVOE!JnEp2#k_`5GZ(s;U15D3n5 zn*R2wI3c-P&Yd5L9{UF5nA#F2`I-kBA8qN}L5zXzlck-`=4z-%`R1X$p}?aDlMT^5 z8CgGz&VT5V9(9-E05G4%Y`y+bWz9ThXD$S=n^-;TrCC@|q=EK?VDs4rhDAJq;3UYz zshI9#qa>YF?ZT0?BQoF)+2-b=V1Y{M<;`;O(EB;F`n41|<#cmA)ou|`jmHBb*m?_x zUghZ*T!PaQzZ&8w@~|9}%~Wy&OjCM2ZQ3Ow%Q$-w=Z_S@HA&vYnq=y(2b%?`-b|G^ z7ZbQ?HMQ;iBih+3dEfw_EuOISyC0c@`Md86n**b|l5-oXe6b2TP zJF1rRl^74x8@$6Ya(;Rb$Z25ZKeQ<@_W5Mxu%@$a-<hI!@SR+)6yY_kRTS!Q z*Gm+MPK5#H6$UcX9w%t1xSO9+4j4a&pfxmwqqlw6f z9{M(uo*<6%&M|42xFMIeAr;s@VcO4Ul?bC2ACkr8U05OOYh98fXOVb<-~mvNxcuB# z7kv=up{L%tTCPU<8aCqe!E0UXb}kns{MS^3+M?6Haba4yTyu@h{N>$t6>aV{yml6n z5SSL*Z!hVptfGg5%p*8#&vE^KWVGp(%Om%m*@wSdlf4a2hbp8<-(^j%(&+N`8{h;D@zTL4R z1TSlF+4k+G-sV7xW&t1$HJN}KB_7@*a0wEBQ3P7v#_LD*vT=xZR-6WE{ zeDx=pN5ruN1x2B;Xqk^Ui4SO+D~&E4>;qU&=fuDH{tW7{cJ!+hE7|5j`zm?JYng7U z`T_dF&KRRJXf}py#14dC;0pU}O{+E*YeI8w0JVwCB3@@%oHZnP3U?NF0y2ih+#eXw=Ibi@#G_o1Gn^`8_rt$w}_2F!2nQ5z6W>bSYI;v{d0Dw4Bn2)AY?uZg)dJ?-01cn@3mqYGiZ<|%vo2fD3RQQ}Qd{|3~cx%LyR$(eL4thIic#feFK)Xw1k= z89=<=5_e`VMTBw%rHb1qCBZlY>f-61G~VkeW#qFzHL{|Xc2giS00QkvinffY|Kg9u z;e(Ynuhe2hh!BY^jjc-Q0p?2u_)x9{B4>Ok9J1wg7^&lTVfj!(h}^|-lK5W)T*2yK z^pt8cBs0dHk~g-f=7DVTvR>w=*wS=Wn1M6veV<^7^N79>BPAv}A?{{M8Ay_1ji>$E z<0AJ6wti!1GC#n<@e=>Bvx?uTE8wpGa=-Tuqc;3a0_%vYIX^IP~8z;A9WZz8&V$7w#sgWk6Lk299>4N4qW8^mV-4#y$ zerrztAlV2Au+1&pTIz`Ep)K?K{{7p#Cj`N>uL|45iS{j0S~z-fOo>1gX)3weipL?8 zw9;u~BD+k;nhX#|YJ@`zJIMpQGXo}Yaxyfu8@#J~uWfy+mGYwX6=Pf7u6Ay)Zrz4& z+t%r?lWUNIMeYDM*aGO#n0~3AE!>h2-Xu$NRmZ;F2kPM_bw$x-fQ8-%l7Qo%Wu)oa( z!qs?-*v>B6H4V@wEBPl|7i3qLJ1u@>@2J|!+5^X8IRE5C-bPB_u4x?0@ zRTvN|%{;RLfOP93$20kJh>?WnItL9YuvwH?V-yZeSRUfghIXKEgAqpR@jYBRSX$nH z9?b`$o>6$ftt7Wvdz6qK-*dsm%nA_kM-B&yqDH7ZlAAF&ur|v&i7slccV~yTnpsR- zm$0ynU!w;8zJRI8@~?XPyet9YXS_qcHg6vSD3s)Hj0#Hkb6WTlfn+kkK0^x|SAxsU!r@I(%A5TJjlp%OhtjcqMn-@yTxgf*>&_4@6>kg663fa~?EOx{6g zWA!rm?*PGJBc52hOeA_p1OOU@gruepD>ZB?K?fF7Skq%XE9}s8vV9E@lf{D?>oMGD!xl%nUF_m z7UH3D>&>WX$O^@DJ8<}jM;Wjya#@AvJAZ~ipuKI>)f7A~SYcx}KCH$;~rs>aa*>P-icuvGHCgv&3JsH^PelpW?t> zxrG(XPN_)*=oHn@5<6C1NK9lk+8ph4$d-_5PWxY2I2v{JNgTUWS6?%TRR3|#%d*#Y zl=vYtQa!_a?y=qYnm@CAw)UvO@qI%LO%#DqliBsk+~%TuW9$|IWV($@d-AGflI$DB zWMFVu(NwgaQDhBVls{K4(*ywS2HkK0e7ncy$c<#v?LKV*)SbPW$dTjU_kFICxGszNo3*A?`#@ybGLyS(9n`^ z3X#_q{S|erP%EpTKSL+fS3E!n6dj#EEtB&DEvRw{|H;^+=8|Ye)2#L=&l91I`YDb9 zCokTo9MU>@gU`J!&Tnr>v*HVS$u8myjU%%{T!-BUEeftA1h>ZhRhi(F4s{-xP=Nd(bo+bI>SC}o#?CQVF26l2`Kk6dI zxehVTmT%W*WSjmoXZ^dG?ZUhD-1lgcJ}&Ab(Z;)Xu1esgj1!Y7hhgHS;dFDNS%Y-C z>h(fwvJ`ZU;(|(Qf4*-Kx!p=?tnv}UZ?syKZnV0zQOqgOf8N*Xb&li{)idGjqJGMS z5ICNZPs(0ojf#%-@2`H=^Sh9DXN;%b_NPI6f4IjA>-Of39{*+!v8h8EXin{#8 zKA|!5<#mxql-^EcL2+s&!n?n_)>}Fv@^6)M?vupFt_Ub0_GX3*(W(VclTgrf_#?clzp^lZ22~u=ya;x ztmU7=o;iGka18?s`+z#BRN;P=VcZGoG)HyA=$)_E)Ss{XRr9>V7gkAJB4aOQKBbrF zynA%OEHgd10Rpr&+3cA3RGT)&0HleNq6)*6aHH=>4TJVEC8-g;S?lbJO8eT;=+^4T z-Ft|>bjN%#c_U6A!a>7T9;1W@9plSpau!4eAu!zqOR}`$=Ug1UdY=20#<$p$HbM6x z+Wsqr4}7qx>%F0PrWS*s*!@Y_T*+KpvOP;2vIBhEp^|?Zt861LYqpn23uMmaxqk+_ ztrb4v5V9li&A*_~5lw4D3Y(QNk;e((H{v&dHRJmu@C-}bMZ9{KA*uElmcol_kdlya zS!W^zIqVyg%jvPnyQI*mvq*6+x@!6&k?T74otF>SDC2@yyTMA6uAqYVj~*(041csi zZc0?2dBZ`r^{A-=D5(cwVK{jPx!&zdZPbAAy5@pe9oHL&W6^f%rTgc`9}cTaT8dudjoauSF8~0XO@#LdSocXI1~$ zd#}fX4Evpfu0zlI%hH=@qQ1(|#AiRAJJ@SIXVlq;ULP@L_XbHDJ~)3Pf4RUdppm!Z zb()+>7OYV^?X@{HjxK`fwFP3STRSGLl(KrzG9=o*&x;VcjSF3?-aikJjI>;_3y*bG zU{+$$To~wTTQ|CZTeEbUoqB#sI|fScH*@;i!bf}mk5lHsY)^dJnMUUIK~;c{&Cgqf zsk0aJDlTP8kgNSZFZ9%cdbxoW*Sta#R85P){`%y4BK0zxh9E;~zB_cW^`b-9=Y(WT ztb9ml{N^k#lW89_s-4+?X=psP^yhc}-*1s0RCoHfyrj^HMrT{_V-oThxR$*XW+N^pHw~6AjY;;O zdA6R^6O^<0&T6fvg(KB!%6`<1*>Wv$G@ita$3xqu3hEy|?m8jy-f`#Xm|WFP$~t{= z-b^L5fKXK7dv{!}zQiGMT(F^Z%h%evttVG;E#8?Tr0iGY7CK-vLfm9E1@|=X#17-V zsnIekcrN+d!b+B%{FP*N@q?4XE#qCj5pfrzaIMI~nzu%@=exf9qLXdeGxN+EA(E2y zVh7Bxj2VyXa1(+6(7Eb=oCu(CP)<^RfD@ojhhHEXX1@cA@zho$Lt-W6q^Ve(bTNnxF86*s?$jO5dC?+_y9nz~g+iu*a=t=)U+L8GyprmT=39qfeYo zJ46dveafIy4I?`A?ex9EL{{-DH(0wl5qfa41(ChmHxEUP5QEf>uRJ}sFTI8B;#gnC zG&ikxXbx&{kc)*+u%qe3iJUg;IoBv?E4R2Ce~YsxEJlazo68a-hz?^U!Hjl1ed)}b z0BN=1`!^^9l;*gL$fd(%YU$Foq4r7j;=3-8GZw+zJf9;Yl}>)VsFw^m1oONqxR-0h zmy=+EKfWHnGGG5!#&H4PX&E(nd|@nsd?7l`d;Q(GKZeZnG4uPg;KDI4?_IZej-?<8)Q}=!Fd)>&+O5B9@Eep z{$Ga9l{2Q7lpCRzt_^fHIexOWApwIYQP%gVEdOWYw{(Q2;Ih7_=QCq?Z**CFQ0w2B z)ac)88GYMqJ8!%|A$?WGe}Oq1>M$;)J@dxP#fYXi44M|{f!!BJ(2@zAfIPv$JXWlILuM+62293Qe`g%&gk-7OdO5!xT zT4I=$*Y~tcYOWOuV#HHZ8RU~kTYq~o7wRnz&+jyB852Ic8SG%JsmpO`x93rL*WA!R zvM_nG@addlvHt?8rgJ{%fydUYw)9-@99*McQb#2047Ll$Ts_!5xW1a-dIS3TmGoY% zL2G^^S8d#af2x*wa88e8z&VivD87HSe$4sJ&rZ?{cmbdrN~MxxBLL>c z)A6MlZ~?dw^$?Mx)e8hy_~h4?R#=peMC={ecBlgYx3V>3 z!kX-j9t%}E#NLc6XXhxjV^D&f5_@}N9EV9tp|9Oi=|iAuvnGi2o3)RN=TifJY5uqt zVH68B`c=>0T`u4-1uCHnl(|N#&d=KvYC@!ec^n~YDPK2<2o4(Tory zvTemii@i;?3bM1p&F4(5#g$$r8lVR4d&25l1zpL2FK<9jS=wO>n^L&1XHZA|36Up2 zsDD?Yy_9YF*bg1q_yoM^7dv;l@!|pNh`V)%_*)3@OUS}AQpGv{+&tc;)eB_O6;$y| zul94}0wwc*v}_vq-zztVrkVcK5CsTjD^nGIvSQ#(CRsGb-Lsc-R_vnq^(Y+zL#0T0Va(o=mWyFWWBH)O~FLFd2^u<_?8ZgANZDtRO_dg*V+ zLTdxG|6z~OERI5=(Ih+{8zki z_=JBu<#2rbOM5iC4-W9#Ryt(+eo_Mgc-J0J4_SU71i*J_ub%EWCB(3dNSSdAKx{G~ zFw<0uRm!QItS1g)CPJ-D0L5E#axYvA6-YuAkQnHSuahb?AqI>SNUhX%DNohBN>1E4Z&%{T~Ffj^I6)U~UhMmdrkqi&4JMiF7ET*=4oykd%439*LaZI~% zLA#G(V3LtCU4f?#tA4?QQ*pH2iiXF)KrWPR5h&reHLG!^=@W#huH`h7=J#Q@PA@}Y zF?dP7maorl=ddLg$$e0k610}wl&de%*p{5033@*Db8OHEsnMd8$Vydqp-nvf-kbgQm$dXf1&#OE&?hHg!diLajYY8 zLRCvvB>{}O_=L9$3Kwv~pbVyHN9kT~iFv8^zC8*VNQB@*;O9Nh9}+gI2=sSx29R8> zw=#3w7A7%2^Ih*tyYrjZcahN=s^1xH1R*)jGg>REZ`(eBZ0&Yc9~iY+bQvXfjc$SL z26Pq#A>Fh$b2h&+1-x=Z!^C~%K?=Ak3XhAm_Z7Viq(*Sz%3!P>kK5di&Rzl4cBcw` z$%}R+V2I6j;0sYpZM!W4(Lp#$H-;-A6ekiVakd{y{P@Ws1K~>53V+e1x6-<(>Tb(C zf{Y%MWD&J!@0rX0L*^6)%@8O(H8+QhO2~*h7wrrA$G>?852v9kt<~CUU0Bn_x9+Z< zDC}Oi1wyFn5ByTF0kP@?S@HH4Cy_~Qq98DDHFfZ3LSoD3dve`)+E21^)WK)I)q7K?S|SP`IDw3{4hRvZl-5I-oYQdo+2+Soe>L8z z3v!V0M8gS`_1V_E;DZJNH%~Qi?J2dlg}B{32Vw2sLg@XgrOCCbdeegH@696=U2tQ` zc~%+7x8IS&G~}KHQ9f+YgyXLV(o0i+8*M21paFk<16 = { [NetworkType.Fuse]: '', [NetworkType.Metis]: '', [NetworkType.Optimistic]: '', + [NetworkType.Harmony]: '', } export const ZRX_AFFILIATE_ADDRESS = '0x934B510D4C9103E6a87AEf13b816fb080286D649' diff --git a/packages/mask/src/plugins/Trader/constants/dodo.ts b/packages/mask/src/plugins/Trader/constants/dodo.ts index 7996fe13525e..1e558c6a6803 100644 --- a/packages/mask/src/plugins/Trader/constants/dodo.ts +++ b/packages/mask/src/plugins/Trader/constants/dodo.ts @@ -16,4 +16,5 @@ export const networkNames: Record = { [NetworkType.Fuse]: '', [NetworkType.Metis]: '', [NetworkType.Optimistic]: '', + [NetworkType.Harmony]: 'harmony', } diff --git a/packages/mask/src/plugins/Trader/constants/openocean.ts b/packages/mask/src/plugins/Trader/constants/openocean.ts index 862e158999b1..982c8ef0bd9b 100644 --- a/packages/mask/src/plugins/Trader/constants/openocean.ts +++ b/packages/mask/src/plugins/Trader/constants/openocean.ts @@ -16,4 +16,5 @@ export const networkNames: Record = { [NetworkType.Fuse]: '', [NetworkType.Metis]: '', [NetworkType.Optimistic]: '', + [NetworkType.Harmony]: 'harmony', } diff --git a/packages/mask/src/plugins/Trader/constants/sushiswap.ts b/packages/mask/src/plugins/Trader/constants/sushiswap.ts index 1c77a8e30c71..ffaf4b58249c 100644 --- a/packages/mask/src/plugins/Trader/constants/sushiswap.ts +++ b/packages/mask/src/plugins/Trader/constants/sushiswap.ts @@ -36,4 +36,5 @@ export const SUSHISWAP_BASE_AGAINST_TOKENS: ERC20AgainstToken = { [ChainId.Celo]: [WNATIVE, CUSD, CEUR].map((x) => x[ChainId.Celo]), [ChainId.Fantom]: [WNATIVE, DAI, USDC, fUSDT, WBTC].map((x) => x[ChainId.Fantom]), [ChainId.Avalanche]: [WNATIVE, DAI, USDC, WBTC, USDT].map((x) => x[ChainId.Avalanche]), + [ChainId.Harmony]: [WNATIVE, DAI, USDC, WBTC, USDT].map((x) => x[ChainId.Harmony]), } diff --git a/packages/mask/src/plugins/Trader/constants/trader.ts b/packages/mask/src/plugins/Trader/constants/trader.ts index 6f8cdc2d5594..dd671c90b462 100644 --- a/packages/mask/src/plugins/Trader/constants/trader.ts +++ b/packages/mask/src/plugins/Trader/constants/trader.ts @@ -77,6 +77,8 @@ export const WNATIVE_ONLY: ERC20AgainstToken = { [ChainId.Fantom]: [WNATIVE[ChainId.Fantom]], [ChainId.Aurora]: [WNATIVE[ChainId.Aurora]], [ChainId.Aurora_Testnet]: [WNATIVE[ChainId.Aurora_Testnet]], + [ChainId.Harmony]: [WNATIVE[ChainId.Harmony]], + [ChainId.Harmony_Test]: [WNATIVE[ChainId.Harmony_Test]], } export const BIPS_BASE = new BigNumber(10000) diff --git a/packages/mask/src/plugins/Trader/pipes.ts b/packages/mask/src/plugins/Trader/pipes.ts index ea9434a4858a..88313da16c62 100644 --- a/packages/mask/src/plugins/Trader/pipes.ts +++ b/packages/mask/src/plugins/Trader/pipes.ts @@ -98,6 +98,7 @@ export function resolveTradeProviderLink(tradeProvider: TradeProvider, networkTy case NetworkType.Metis: case NetworkType.Avalanche: case NetworkType.Optimistic: + case NetworkType.Harmony: console.error('To be implement network: ', networkType) return '' default: @@ -172,6 +173,8 @@ export function resolveTradePairLink(tradeProvider: TradeProvider, address: stri return `https://analytics-avx.sushi.com/pairs/${address}` case NetworkType.Aurora: return `https://analytics-aurora.sushi.com/pairs/${address}` + case NetworkType.Harmony: + return `https://analytics-harmony.sushi.com/pairs/${address}` case NetworkType.Boba: case NetworkType.Fuse: case NetworkType.Metis: diff --git a/packages/mask/src/plugins/Trader/trader/0x/useTrade.ts b/packages/mask/src/plugins/Trader/trader/0x/useTrade.ts index 8476309e06ed..336006310c2f 100644 --- a/packages/mask/src/plugins/Trader/trader/0x/useTrade.ts +++ b/packages/mask/src/plugins/Trader/trader/0x/useTrade.ts @@ -36,6 +36,7 @@ export function getNativeTokenLabel(networkType: NetworkType) { case NetworkType.Metis: case NetworkType.Avalanche: case NetworkType.Optimistic: + case NetworkType.Harmony: return NATIVE_TOKEN_ADDRESS default: safeUnreachable(networkType) diff --git a/packages/mask/src/plugins/Wallet/services/account.ts b/packages/mask/src/plugins/Wallet/services/account.ts index 2b3759fc6beb..a5c866b20fc9 100644 --- a/packages/mask/src/plugins/Wallet/services/account.ts +++ b/packages/mask/src/plugins/Wallet/services/account.ts @@ -128,5 +128,6 @@ export async function getSupportedNetworks() { Flags.fantom_enabled ? NetworkType.Fantom : undefined, Flags.avalanche_enabled ? NetworkType.Avalanche : undefined, Flags.aurora_enabled ? NetworkType.Aurora : undefined, + Flags.harmony_enabled ? NetworkType.Harmony : undefined, ].filter(Boolean) as NetworkType[] } diff --git a/packages/public-api/src/web.ts b/packages/public-api/src/web.ts index fb4d55ad81ed..7e745d960449 100644 --- a/packages/public-api/src/web.ts +++ b/packages/public-api/src/web.ts @@ -192,6 +192,7 @@ export enum NetworkType { Fuse = 'Fuse', Metis = 'Metis', Optimistic = 'Optimistic', + Harmony = 'Harmony', } export enum DataProvider { diff --git a/packages/web3-constants/compile-constants.ts b/packages/web3-constants/compile-constants.ts index cafdb8aa29af..b411a029e9e2 100644 --- a/packages/web3-constants/compile-constants.ts +++ b/packages/web3-constants/compile-constants.ts @@ -59,6 +59,8 @@ compileConstants(path.join(__dirname, 'evm'), [ 'Fantom', 'Aurora', 'Aurora_Testnet', + 'Harmony', + 'Harmony_Test', ]) compileConstants(path.join(__dirname, 'solana'), ['Mainnet', 'Testnet', 'Devnet']) diff --git a/packages/web3-constants/evm/airdrop.json b/packages/web3-constants/evm/airdrop.json index ab949267d4f5..936c63e44792 100644 --- a/packages/web3-constants/evm/airdrop.json +++ b/packages/web3-constants/evm/airdrop.json @@ -17,6 +17,8 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" } } diff --git a/packages/web3-constants/evm/artblocks.json b/packages/web3-constants/evm/artblocks.json index b626e1dae9f6..acef3f6a07f6 100644 --- a/packages/web3-constants/evm/artblocks.json +++ b/packages/web3-constants/evm/artblocks.json @@ -17,6 +17,8 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" } } diff --git a/packages/web3-constants/evm/coingecko.json b/packages/web3-constants/evm/coingecko.json index 6f3add83afa9..c920724feb19 100644 --- a/packages/web3-constants/evm/coingecko.json +++ b/packages/web3-constants/evm/coingecko.json @@ -17,7 +17,9 @@ "Celo": "celo", "Fantom": "fantom", "Aurora": "aurora", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "harmony-shard-0", + "Harmony_Test": "" }, "COIN_ID": { "Mainnet": "ethereum", @@ -37,6 +39,8 @@ "Celo": "celo", "Fantom": "fantom", "Aurora": "ethereum", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" } } diff --git a/packages/web3-constants/evm/coinmarketcap.json b/packages/web3-constants/evm/coinmarketcap.json index ffd32861a9a2..b53c8ddc75cb 100644 --- a/packages/web3-constants/evm/coinmarketcap.json +++ b/packages/web3-constants/evm/coinmarketcap.json @@ -17,6 +17,8 @@ "Celo": "5567", "Fantom": "3513", "Aurora": "1313161554", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" } } diff --git a/packages/web3-constants/evm/cryptoartai.json b/packages/web3-constants/evm/cryptoartai.json index edde7f04abdc..1b666ec9fe01 100644 --- a/packages/web3-constants/evm/cryptoartai.json +++ b/packages/web3-constants/evm/cryptoartai.json @@ -17,7 +17,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "ARTIST_ACCEPTING_BIDS_V2": { "Mainnet": "0x78C889749f29D2965a76Ede3BBb232A9729Ccf0b", @@ -37,7 +39,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "CANFT_MARKET": { "Mainnet": "0x72d081953957723e540780a0C6bA31725469238E", @@ -57,6 +61,8 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" } } diff --git a/packages/web3-constants/evm/debank.json b/packages/web3-constants/evm/debank.json index 070df0c683df..4e3d952ef3e7 100644 --- a/packages/web3-constants/evm/debank.json +++ b/packages/web3-constants/evm/debank.json @@ -17,6 +17,8 @@ "Celo": "celo", "Fantom": "ftm", "Aurora": "aurora", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" } } diff --git a/packages/web3-constants/evm/dhedge.json b/packages/web3-constants/evm/dhedge.json index 870f99083e7f..b9273f791e84 100644 --- a/packages/web3-constants/evm/dhedge.json +++ b/packages/web3-constants/evm/dhedge.json @@ -17,7 +17,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "API_URL": { "Mainnet": "https://api-v2.dhedge.org/graphql", @@ -37,6 +39,8 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" } } diff --git a/packages/web3-constants/evm/ethereum.json b/packages/web3-constants/evm/ethereum.json index f4ca94106031..c0b5f39166b4 100644 --- a/packages/web3-constants/evm/ethereum.json +++ b/packages/web3-constants/evm/ethereum.json @@ -17,7 +17,9 @@ "Celo": "0x8e28F1d64ceD52b9A09aB1AA3071Aa3c05802d1F", "Fantom": "0xc119574d5fb333f5ac018658d4d8b5035e16bf39", "Aurora": "0xC119574D5Fb333F5AC018658D4d8b5035E16bf39", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "MULTICALL_ADDRESS": { "Mainnet": "0x1F98415757620B543A52E61c46B32eB19261F984", @@ -37,7 +39,9 @@ "Celo": "0x072453AdEC16cFC7FB6Af1517c3f25407180cccC", "Fantom": "0x913975af2Bb8a6Be4100D7dc5e9765B77F6A5d6c", "Aurora": "0x6cc1b1058F9153358278C35E0b2D382f1585854B", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "ENS_REGISTRAR_ADDRESS": { "Mainnet": "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e", @@ -57,7 +61,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "ENS_REVERSE_RECORDS_ADDRESS": { "Mainnet": "0x3671aE578E63FdF66ad4F3E12CC0c0d71Ac7510C", @@ -77,6 +83,8 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" } } diff --git a/packages/web3-constants/evm/explorer.json b/packages/web3-constants/evm/explorer.json index a3c5bf0d117e..9057152928e5 100644 --- a/packages/web3-constants/evm/explorer.json +++ b/packages/web3-constants/evm/explorer.json @@ -17,7 +17,9 @@ "Celo": [], "Fantom": ["AST4WWPNEYDURUXG2GH32JZMYWEFDP999S"], "Aurora": [], - "Aurora_Testnet": [] + "Aurora_Testnet": [], + "Harmony": [], + "Harmony_Test": [] }, "EXPLORER_API": { "Mainnet": "https://api.etherscan.io/api", @@ -37,6 +39,8 @@ "Celo": "https://explorer.celo.org/api", "Fantom": "https://api.ftmscan.com/api", "Aurora": "https://explorer.mainnet.aurora.dev/api", - "Aurora_Testnet": "https://explorer.testnet.aurora.dev/api" + "Aurora_Testnet": "https://explorer.testnet.aurora.dev/api", + "Harmony": "", + "Harmony_Test": "" } } diff --git a/packages/web3-constants/evm/gitcoin.json b/packages/web3-constants/evm/gitcoin.json index 708e296ea6de..bbe828b501d3 100644 --- a/packages/web3-constants/evm/gitcoin.json +++ b/packages/web3-constants/evm/gitcoin.json @@ -17,7 +17,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "BULK_CHECKOUT_ADDRESS": { "Mainnet": "0x7d655c57f71464B6f83811C55D84009Cd9f5221C", @@ -37,7 +39,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "GITCOIN_ETH_ADDRESS": { "Mainnet": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", @@ -57,7 +61,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "GITCOIN_TIP_PERCENTAGE": { "Mainnet": 5, @@ -77,6 +83,8 @@ "Celo": 0, "Fantom": 0, "Aurora": 0, - "Aurora_Testnet": 0 + "Aurora_Testnet": 0, + "Harmony": 0, + "Harmony_Test": 0 } } diff --git a/packages/web3-constants/evm/good-ghosting.json b/packages/web3-constants/evm/good-ghosting.json index e54f1e6ba1bf..b2c8899a3031 100644 --- a/packages/web3-constants/evm/good-ghosting.json +++ b/packages/web3-constants/evm/good-ghosting.json @@ -17,7 +17,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "GOOD_GHOSTING_INCENTIVES_CONTRACT_ADDRESS": { "Mainnet": "", @@ -37,6 +39,8 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" } } diff --git a/packages/web3-constants/evm/ito.json b/packages/web3-constants/evm/ito.json index f0cbea49edfb..e19baf545074 100644 --- a/packages/web3-constants/evm/ito.json +++ b/packages/web3-constants/evm/ito.json @@ -17,7 +17,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "MASK_ITO_CONTRACT_ADDRESS": { "Mainnet": "0x86812da3A623ab9606976078588b80C315E55FA3", @@ -37,7 +39,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "ITO2_CONTRACT_ADDRESS": { "Mainnet": "0xc2CFbF22d6Dc87D0eE18d38d73733524c109Ff46", @@ -57,7 +61,9 @@ "Celo": "0xaA5bfd7355637eA7405CB194a55303e821c4c569", "Fantom": "0x981be454a930479d92C91a0092D204b64845A5D6", "Aurora": "0x2cf91AD8C175305EBe6970Bd8f81231585EFbd77", - "Aurora_Testnet": "0xdcA6F476EebCDE8FE8b072e3fC80dBC28dC209b3" + "Aurora_Testnet": "0xdcA6F476EebCDE8FE8b072e3fC80dBC28dC209b3", + "Harmony": "", + "Harmony_Test": "" }, "ITO2_CONTRACT_CREATION_BLOCK_HEIGHT": { "Mainnet": 12766513, @@ -77,7 +83,9 @@ "Celo": 10278776, "Fantom": 25071597, "Aurora": 57350598, - "Aurora_Testnet": 77919102 + "Aurora_Testnet": 77919102, + "Harmony": 0, + "Harmony_Test": 0 }, "DEFAULT_QUALIFICATION_ADDRESS": { "Mainnet": "0x81b6ae377e360dcad63611846a2516f4ba8c88ac", @@ -97,7 +105,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "DEFAULT_QUALIFICATION2_ADDRESS": { "Mainnet": "0x4dC5f343Fe57E4fbDA1B454d125D396A3181272c", @@ -117,7 +127,9 @@ "Celo": "0x2cB220F925E603A04BEE05F210252120deBA29d7", "Fantom": "0x83D6b366f21e413f214EB077D5378478e71a5eD2", "Aurora": "0x578a7Fee5f0D8CEc7d00578Bf37374C5b95C4b98", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "SUBGRAPH_URL": { "Mainnet": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-ito-mainnet", @@ -137,6 +149,8 @@ "Celo": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-ito-celo", "Fantom": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-ito-fantom", "Aurora": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-ito-aurora", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" } } diff --git a/packages/web3-constants/evm/lbp.json b/packages/web3-constants/evm/lbp.json index 051943e8a62d..a663e2fdd653 100644 --- a/packages/web3-constants/evm/lbp.json +++ b/packages/web3-constants/evm/lbp.json @@ -17,6 +17,8 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" } } diff --git a/packages/web3-constants/evm/mask-box.json b/packages/web3-constants/evm/mask-box.json index a391a2ea2256..ded609b1d518 100644 --- a/packages/web3-constants/evm/mask-box.json +++ b/packages/web3-constants/evm/mask-box.json @@ -17,7 +17,9 @@ "Celo": "", "Fantom": "", "Aurora": "0xf5056B96ab242C566002852d0b98ce0BcDf1af51", - "Aurora_Testnet": "0xB4D669bc117735FdA44e90e52795132187705B21" + "Aurora_Testnet": "0xB4D669bc117735FdA44e90e52795132187705B21", + "Harmony": "", + "Harmony_Test": "" }, "MASK_BOX_CONTRACT_FROM_BLOCK": { "Mainnet": 13687866, @@ -37,6 +39,8 @@ "Celo": 0, "Fantom": 0, "Aurora": 57259004, - "Aurora_Testnet": 77919118 + "Aurora_Testnet": 77919118, + "Harmony": 0, + "Harmony_Test": 0 } } diff --git a/packages/web3-constants/evm/nft-red-packet.json b/packages/web3-constants/evm/nft-red-packet.json index 14f892ec49c5..bf3bcbcdd136 100644 --- a/packages/web3-constants/evm/nft-red-packet.json +++ b/packages/web3-constants/evm/nft-red-packet.json @@ -17,7 +17,9 @@ "Celo": "", "Fantom": "", "Aurora": "0x05ee315E407C21a594f807D61d6CC11306D1F149", - "Aurora_Testnet": "0x97369fEE7db34E0BfE47861f2ec44b4378d13eB4" + "Aurora_Testnet": "0x97369fEE7db34E0BfE47861f2ec44b4378d13eB4", + "Harmony": "", + "Harmony_Test": "" }, "SUBGRAPH_URL": { "Mainnet": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-nft-red-packet-mainnet", @@ -37,6 +39,8 @@ "Celo": "", "Fantom": "", "Aurora": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-nft-red-packet-aurora", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" } } diff --git a/packages/web3-constants/evm/openocean.json b/packages/web3-constants/evm/openocean.json index 50fb7755a589..e583ccb1efdd 100644 --- a/packages/web3-constants/evm/openocean.json +++ b/packages/web3-constants/evm/openocean.json @@ -17,6 +17,8 @@ "Celo": "0x934B510D4C9103E6a87AEf13b816fb080286D649", "Fantom": "0x934B510D4C9103E6a87AEf13b816fb080286D649", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" } } diff --git a/packages/web3-constants/evm/opensea-api.json b/packages/web3-constants/evm/opensea-api.json index 8032d46e99ce..6d8c249cdb11 100644 --- a/packages/web3-constants/evm/opensea-api.json +++ b/packages/web3-constants/evm/opensea-api.json @@ -17,7 +17,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "GET_SINGLE_ASSET_URL": { "Mainnet": "https://api.opensea.io/api/v1/asset", @@ -37,7 +39,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "GET_ASSETS_URL": { "Mainnet": "https://api.opensea.io/api/v1/assets", @@ -57,6 +61,8 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" } } diff --git a/packages/web3-constants/evm/pooltogether.json b/packages/web3-constants/evm/pooltogether.json index 529a2e16bb28..bd0ce4fb7b3f 100644 --- a/packages/web3-constants/evm/pooltogether.json +++ b/packages/web3-constants/evm/pooltogether.json @@ -17,7 +17,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "MASK_POOL_ADDRESS": { "Mainnet": "", @@ -37,6 +39,8 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" } } diff --git a/packages/web3-constants/evm/red-packet.json b/packages/web3-constants/evm/red-packet.json index d587717e2cd6..2094410428d7 100644 --- a/packages/web3-constants/evm/red-packet.json +++ b/packages/web3-constants/evm/red-packet.json @@ -17,7 +17,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "HAPPY_RED_PACKET_ADDRESS_V2": { "Mainnet": "0x8D8912E1237F9FF3EF661F32743CFB276E052F98", @@ -37,7 +39,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "HAPPY_RED_PACKET_ADDRESS_V3": { "Mainnet": "", @@ -57,7 +61,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "HAPPY_RED_PACKET_ADDRESS_V4": { "Mainnet": "0xaBBe1101FD8fa5847c452A6D70C8655532B03C33", @@ -77,7 +83,9 @@ "Celo": "0xAb7B1bE4233A04e5C43a810E75657ECED8E5463B", "Fantom": "0x578a7Fee5f0D8CEc7d00578Bf37374C5b95C4b98", "Aurora": "0x19f179D7e0D7d9F9d5386afFF64271D98A91615B", - "Aurora_Testnet": "0xdB93cCd481012bB5D1E2c8d0aF7C5f2940c00fdC" + "Aurora_Testnet": "0xdB93cCd481012bB5D1E2c8d0aF7C5f2940c00fdC", + "Harmony": "", + "Harmony_Test": "" }, "HAPPY_RED_PACKET_ADDRESS_V4_BLOCK_HEIGHT": { "Mainnet": 12939427, @@ -97,7 +105,9 @@ "Celo": 10413552, "Fantom": 25112473, "Aurora": 57552338, - "Aurora_Testnet": 77918765 + "Aurora_Testnet": 77918765, + "Harmony": 0, + "Harmony_Test": 0 }, "SUBGRAPH_URL": { "Mainnet": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-red-packet-mainnet", @@ -117,6 +127,8 @@ "Celo": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-red-packet-celo", "Fantom": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-red-packet-fantom", "Aurora": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-red-packet-aurora", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" } } diff --git a/packages/web3-constants/evm/rpc.json b/packages/web3-constants/evm/rpc.json index 54cfb9185c13..a5dee7a13b68 100644 --- a/packages/web3-constants/evm/rpc.json +++ b/packages/web3-constants/evm/rpc.json @@ -59,7 +59,9 @@ "Celo": ["https://forno.celo.org"], "Fantom": ["https://rpc.ftm.tools/"], "Aurora": ["https://mainnet.aurora.dev"], - "Aurora_Testnet": ["https://testnet.aurora.dev"] + "Aurora_Testnet": ["https://testnet.aurora.dev"], + "Harmony": ["https://api.s0.t.hmny.io/"], + "Harmony_Test": ["https://api.s0.b.hmny.io/"] }, "RPC_WEIGHTS": { "Mainnet": [0, 1, 2, 3, 4], @@ -79,6 +81,8 @@ "Celo": [0, 0, 0, 0, 0], "Fantom": [0, 0, 0, 0, 0], "Aurora": [0, 0, 0, 0, 0], - "Aurora_Testnet": [0, 0, 0, 0, 0] + "Aurora_Testnet": [0, 0, 0, 0, 0], + "Harmony": [0, 0, 0, 0, 0], + "Harmony_Test": [0, 0, 0, 0, 0] } } diff --git a/packages/web3-constants/evm/savings.json b/packages/web3-constants/evm/savings.json index 0f58f923eb48..70a6173f09c3 100644 --- a/packages/web3-constants/evm/savings.json +++ b/packages/web3-constants/evm/savings.json @@ -17,7 +17,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "LIDO_STETH": { "Mainnet": "0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84", @@ -37,7 +39,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "LIDO_REFERRAL_ADDRESS": { "Mainnet": "0x278D7e418a28ff763eEeDf29238CD6dfcade3A3a", @@ -57,6 +61,8 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" } } diff --git a/packages/web3-constants/evm/space-station-galaxy.json b/packages/web3-constants/evm/space-station-galaxy.json index 86b85572cdcd..1d6d77de22c3 100644 --- a/packages/web3-constants/evm/space-station-galaxy.json +++ b/packages/web3-constants/evm/space-station-galaxy.json @@ -17,7 +17,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "SUBGRAPH_URL": { "Mainnet": "", @@ -37,6 +39,8 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" } } diff --git a/packages/web3-constants/evm/token-asset-base-url.json b/packages/web3-constants/evm/token-asset-base-url.json index 994c1a1189ae..5390c6a1db47 100644 --- a/packages/web3-constants/evm/token-asset-base-url.json +++ b/packages/web3-constants/evm/token-asset-base-url.json @@ -47,6 +47,8 @@ "Celo": [], "Fantom": [], "Aurora": [], - "Aurora_Testnet": [] + "Aurora_Testnet": [], + "Harmony": [], + "Harmony_Test": [] } } diff --git a/packages/web3-constants/evm/token-list.json b/packages/web3-constants/evm/token-list.json index 76b7b8870aee..62c059e8dd9d 100644 --- a/packages/web3-constants/evm/token-list.json +++ b/packages/web3-constants/evm/token-list.json @@ -17,6 +17,8 @@ "Celo": ["https://tokens.r2d2.to/latest/42220/tokens.json"], "Fantom": ["https://tokens.r2d2.to/latest/250/tokens.json"], "Aurora": ["https://tokens.r2d2.to/latest/1313161554/tokens.json"], - "Aurora_Testnet": [] + "Aurora_Testnet": [], + "Harmony": [], + "Harmony_Test": [] } } diff --git a/packages/web3-constants/evm/token.json b/packages/web3-constants/evm/token.json index f6fe2360d0d4..b6b9cc26c1d3 100644 --- a/packages/web3-constants/evm/token.json +++ b/packages/web3-constants/evm/token.json @@ -17,7 +17,9 @@ "Celo": "0x471EcE3750Da237f93B8E339c536989b8978a438", "Fantom": "0x21be370d5312f44cb42ce377bc9b8a0cef1a4c83", "Aurora": "0xC9BdeEd33CD01541e1eeD10f90519d2C06Fe3feB", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "USDC_ADDRESS": { "Mainnet": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", @@ -37,7 +39,9 @@ "Celo": "0x2A3684e9Dc20B857375EA04235F2F7edBe818FA7", "Fantom": "0x04068da6c83afcfa0e13ba15a6696662335d5b75", "Aurora": "0xb12bfca5a55806aaf64e99521918a4bf0fc40802", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "0x985458e523db3d53125813ed68c274899e9dfab4", + "Harmony_Test": "" }, "USDT_ADDRESS": { "Mainnet": "0xdAC17F958D2ee523a2206206994597C13D831ec7", @@ -57,7 +61,9 @@ "Celo": "0xb020d981420744f6b0fedd22bb67cd37ce18a1d5", "Fantom": "", "Aurora": "0x4988a896b1227218e4a686fde5eabdcabd91571f", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "0x3c2b8be99c50593081eaa2a724f0b8285f5aba8f", + "Harmony_Test": "" }, "HUSD_ADDRESS": { "Mainnet": "0xdf574c24545e5ffecb9a659c229253d4111d87e1", @@ -77,7 +83,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "BUSD_ADDRESS": { "Mainnet": "0x4fabb145d64652a948d72533023f6e7a623c7c53", @@ -97,7 +105,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "COMP_ADDRESS": { "Mainnet": "0xc00e94Cb662C3520282E6f5717214004A7f26888", @@ -117,7 +127,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "EASY_ADDRESS": { "Mainnet": "", @@ -137,7 +149,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "MKR_ADDRESS": { "Mainnet": "0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2", @@ -157,7 +171,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "MASK_ADDRESS": { "Mainnet": "0x69af81e73A73B40adF4f3d4223Cd9b1ECE623074", @@ -177,7 +193,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "MSKA_ADDRESS": { "Mainnet": "", @@ -197,7 +215,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "MSKB_ADDRESS": { "Mainnet": "", @@ -217,7 +237,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "MSKC_ADDRESS": { "Mainnet": "", @@ -237,7 +259,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "MSKD_ADDRESS": { "Mainnet": "", @@ -257,7 +281,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "MSKE_ADDRESS": { "Mainnet": "", @@ -277,7 +303,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "DAI_ADDRESS": { "Mainnet": "0x6B175474E89094C44Da98b954EedeAC495271d0F", @@ -297,7 +325,9 @@ "Celo": "", "Fantom": "0x8D11eC38a3EB5E956B052f67Da8Bdc9bef8Abf3E", "Aurora": "0xe3520349f477a5f6eb06107066048508498a291b", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "0xef977d2f931c1978db5f6747666fa1eacb0d0339", + "Harmony_Test": "" }, "AMPL_ADDRESS": { "Mainnet": "0xD46bA6D942050d489DBd938a2C909A5d5039A161", @@ -317,7 +347,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "OKB_ADDRESS": { "Mainnet": "0x75231F58b43240C9718Dd58B4967c5114342a86c", @@ -337,7 +369,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "UST_ADDRESS": { "Mainnet": "0xa47c8bf37f92aBed4A126BDA807A7b7498661acD", @@ -357,7 +391,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "eUSDC_ADDRESS": { "Mainnet": "", @@ -377,7 +413,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "eUSDT_ADDRESS": { "Mainnet": "", @@ -397,7 +435,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "fUSDT_ADDRESS": { "Mainnet": "", @@ -417,7 +457,9 @@ "Celo": "", "Fantom": "0x049d68029688eAbF473097a2fC38ef61633A3C7A", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "eDAI_ADDRESS": { "Mainnet": "", @@ -437,7 +479,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "UNITOKEN_ADDRESS": { "Mainnet": "", @@ -457,7 +501,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "TT01_ADDRESS": { "Mainnet": "", @@ -477,7 +523,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "TT02_ADDRESS": { "Mainnet": "", @@ -497,7 +545,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "QUICK_ADDRESS": { "Mainnet": "", @@ -517,7 +567,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "WANNA_ADDRESS": { "Mainnet": "", @@ -537,7 +589,9 @@ "Celo": "", "Fantom": "", "Aurora": "0x7faA64Faf54750a2E3eE621166635fEAF406Ab22", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "WBTC_ADDRESS": { "Mainnet": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", @@ -557,7 +611,9 @@ "Celo": "0xBe50a3013A1c94768A1ABb78c3cB79AB28fc1aCE", "Fantom": "0x321162Cd933E2Be498Cd2267a90534A804051b11", "Aurora": "0xf4eb217ba2454613b15dbdea6e5f22276410e89e", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "0x3095c7557bcb296ccc6e363de01b760ba031f2d9", + "Harmony_Test": "" }, "IGG_ADDRESS": { "Mainnet": "", @@ -577,7 +633,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "OM_ADDRESS": { "Mainnet": "", @@ -597,7 +655,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "SUSHI_ADDRESS": { "Mainnet": "0x6B3595068778DD592e39A122f4f5a5cF09C90fE2", @@ -617,7 +677,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "YAM_ADDRESS": { "Mainnet": "0x0e2298E3B3390e3b945a5456fBf59eCc3f55DA16", @@ -637,7 +699,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "RUNE_ADDRESS": { "Mainnet": "0x3155BA85D5F96b2d030a4966AF206230e46849cb", @@ -657,7 +721,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "YFI_ADDRESS": { "Mainnet": "0x0bc529c00C6401aEF6D220BE8C6Ea1667F6Ad93e", @@ -677,7 +743,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "sUSD_ADDRESS": { "Mainnet": "0x57ab1ec28d129707052df4df418d58a2d46d5f51", @@ -697,7 +765,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "BTCB_ADDRESS": { "Mainnet": "", @@ -717,7 +787,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "CAKE_ADDRESS": { "Mainnet": "", @@ -737,7 +809,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "maUSDC_ADDRESS": { "Mainnet": "", @@ -757,7 +831,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "stETH_ADDRESS": { "Mainnet": "0xDFe66B14D37C77F4E9b180cEb433d1b164f0281D", @@ -777,7 +853,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "NFTX_ADDRESS": { "Mainnet": "0x87d73E916D7057945c9BcD8cdd94e42A6F47f776", @@ -797,7 +875,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "cUSD_ADDRESS": { "Mainnet": "", @@ -817,7 +897,9 @@ "Celo": "0x765de816845861e75a25fca122bb6898b8b1282a", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "cEUR_ADDRESS": { "Mainnet": "", @@ -837,7 +919,9 @@ "Celo": "0x765de816845861e75a25fca122bb6898b8b1282a", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "xTRI_ADDRESS": { "Mainnet": "", @@ -857,7 +941,9 @@ "Celo": "", "Fantom": "", "Aurora": "0x802119e4e253D5C19aA06A5d567C5a41596D6803", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "JOE_ADDRESS": { "Mainnet": "", @@ -877,7 +963,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "PNG_ADDRESS": { "Mainnet": "", @@ -897,7 +985,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "ETHER_ADDRESS": { "Mainnet": "", @@ -917,7 +1007,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "NATIVE_TOKEN_ADDRESS": { "Mainnet": "0x0000000000000000000000000000000000000000", @@ -937,6 +1029,8 @@ "Celo": "0x471ece3750da237f93b8e339c536989b8978a438", "Fantom": "0x0000000000000000000000000000000000000000", "Aurora": "0x0000000000000000000000000000000000000000", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" } } diff --git a/packages/web3-constants/evm/trader.json b/packages/web3-constants/evm/trader.json index b656354c3839..2229bf113a29 100644 --- a/packages/web3-constants/evm/trader.json +++ b/packages/web3-constants/evm/trader.json @@ -17,7 +17,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "UNISWAP_V2_FACTORY_ADDRESS": { "Mainnet": "0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f", @@ -37,7 +39,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "UNISWAP_V2_THEGRAPH": { "Mainnet": "https://api.thegraph.com/subgraphs/name/uniswap/uniswap-v2", @@ -57,7 +61,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "UNISWAP_V2_INIT_CODE_HASH": { "Mainnet": "0x96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f", @@ -77,7 +83,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "UNISWAP_SWAP_ROUTER_ADDRESS": { "Mainnet": "0xe592427a0aece92de3edee1f18e0157c05861564", @@ -97,7 +105,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "UNISWAP_V3_FACTORY_ADDRESS": { "Mainnet": "0x1F98431c8aD98523631AE4a59f267346ea31F984", @@ -117,7 +127,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "UNISWAP_V3_QUOTER_ADDRESS": { "Mainnet": "0xb27308f9F90D607463bb33eA1BeBb41C27CE5AB6", @@ -137,7 +149,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "UNISWAP_V3_THEGRAPH": { "Mainnet": "https://api.thegraph.com/subgraphs/name/uniswap/uniswap-v3", @@ -157,7 +171,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "UNISWAP_V3_INIT_CODE_HASH": { "Mainnet": "0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54", @@ -177,7 +193,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "SUSHISWAP_ROUTER_ADDRESS": { "Mainnet": "0xd9e1cE17f2641f24aE83637ab66a2cca9C378B9F", @@ -197,7 +215,9 @@ "Celo": "0x1421bDe4B10e8dd459b3BCb598810B1337D56842", "Fantom": "0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506", "Aurora": "0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "SUSHISWAP_FACTORY_ADDRESS": { "Mainnet": "0xC0AEe478e3658e2610c5F7A4A2E1777cE9e4f2Ac", @@ -217,7 +237,9 @@ "Celo": "0xc35DADB65012eC5796536bD9864eD8773aBc74C4", "Fantom": "0xc35DADB65012eC5796536bD9864eD8773aBc74C4", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "SUSHISWAP_THEGRAPH": { "Mainnet": "https://api.thegraph.com/subgraphs/name/zippoxer/sushiswap-subgraph-fork", @@ -237,7 +259,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "SUSHISWAP_INIT_CODE_HASH": { "Mainnet": "0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303", @@ -257,7 +281,9 @@ "Celo": "0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303", "Fantom": "0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "SASHIMISWAP_ROUTER_ADDRESS": { "Mainnet": "0xe4fe6a45f354e845f954cddee6084603cedb9410", @@ -277,7 +303,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "SASHIMISWAP_FACTORY_ADDRESS": { "Mainnet": "0xF028F723ED1D0fE01cC59973C49298AA95c57472", @@ -297,7 +325,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "SASHIMISWAP_THEGRAPH": { "Mainnet": "https://api.thegraph.com/subgraphs/name/sashimiproject/sashimi", @@ -317,7 +347,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "SASHIMISWAP_INIT_CODE_HASH": { "Mainnet": "0xb465bbe4edb8c9b0da8ff0b2b36ce0065de9fcd5a33f32c6856ea821779c8b72", @@ -337,7 +369,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "QUICKSWAP_ROUTER_ADDRESS": { "Mainnet": "", @@ -357,7 +391,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "QUICKSWAP_FACTORY_ADDRESS": { "Mainnet": "", @@ -377,7 +413,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "QUICKSWAP_THEGRAPH": { "Mainnet": "", @@ -397,7 +435,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "QUICKSWAP_INIT_CODE_HASH": { "Mainnet": "", @@ -417,7 +457,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "PANCAKESWAP_ROUTER_ADDRESS": { "Mainnet": "", @@ -437,7 +479,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "PANCAKESWAP_FACTORY_ADDRESS": { "Mainnet": "", @@ -457,7 +501,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "PANCAKESWAP_THEGRAPH": { "Mainnet": "", @@ -477,7 +523,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "PANCAKESWAP_INIT_CODE_HASH": { "Mainnet": "", @@ -497,7 +545,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "BALANCER_ETH_ADDRESS": { "Mainnet": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", @@ -517,7 +567,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "BALANCER_EXCHANGE_PROXY_ADDRESS": { "Mainnet": "0x3E66B66Fd1d0b02fDa6C811Da9E0547970DB2f21", @@ -537,7 +589,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "BALANCER_POOLS_URL": { "Mainnet": "https://ipfs.fleek.co/ipns/balancer-bucket.storage.fleek.co/balancer-exchange/pools", @@ -557,7 +611,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "DODO_ETH_ADDRESS": { "Mainnet": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", @@ -577,7 +633,9 @@ "Celo": "", "Fantom": "", "Aurora": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "DODO_EXCHANGE_PROXY_ADDRESS": { "Mainnet": "0xCB859eA579b28e02B87A1FDE08d087ab9dbE5149", @@ -597,7 +655,9 @@ "Celo": "", "Fantom": "", "Aurora": "0x335aC99bb3E51BDbF22025f092Ebc1Cf2c5cC619", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "BANCOR_ETH_ADDRESS": { "Mainnet": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", @@ -617,7 +677,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "BANCOR_EXCHANGE_PROXY_ADDRESS": { "Mainnet": "0x2F9EC37d6CcFFf1caB21733BdaDEdE11c823cCB0", @@ -637,7 +699,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "TRADERJOE_ROUTER_ADDRESS": { "Mainnet": "", @@ -657,7 +721,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "TRADERJOE_FACTORY_ADDRESS": { "Mainnet": "", @@ -677,7 +743,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "TRADERJOE_THEGRAPH": { "Mainnet": "https://api.thegraph.com/subgraphs/name/traderjoe-xyz/exchange", @@ -697,7 +765,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "TRADERJOE_INIT_CODE_HASH": { "Mainnet": "", @@ -717,7 +787,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "OPENOCEAN_ETH_ADDRESS": { "Mainnet": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", @@ -737,7 +809,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "OPENOCEAN_EXCHANGE_PROXY_ADDRESS": { "Mainnet": "0x6352a56caadC4F1E25CD6c75970Fa768A3304e64", @@ -757,7 +831,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "PANGOLIN_ROUTER_ADDRESS": { "Mainnet": "", @@ -777,7 +853,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "PANGOLIN_FACTORY_ADDRESS": { "Mainnet": "", @@ -797,7 +875,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "PANGOLIN_THEGRAPH": { "Mainnet": "", @@ -817,7 +897,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "PANGOLIN_INIT_CODE_HASH": { "Mainnet": "", @@ -837,7 +919,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "WANNASWAP_ROUTER_V2_ADDRESS": { "Mainnet": "", @@ -857,7 +941,9 @@ "Celo": "", "Fantom": "", "Aurora": "0xa3a1eF5Ae6561572023363862e238aFA84C72ef5", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "WANNASWAP_ROUTER_ADDRESS": { "Mainnet": "", @@ -877,7 +963,9 @@ "Celo": "", "Fantom": "", "Aurora": "0x8f1E0Cf0f9f269Bc977C38635E560aa5b0E63323", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "WANNASWAP_FACTORY_ADDRESS": { "Mainnet": "", @@ -897,7 +985,9 @@ "Celo": "", "Fantom": "", "Aurora": "0x7928D4FeA7b2c90C732c10aFF59cf403f0C38246", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "WANNASWAP_THEGRAPH": { "Mainnet": "", @@ -917,7 +1007,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "WANNASWAP_INIT_CODE_HASH": { "Mainnet": "", @@ -937,7 +1029,9 @@ "Celo": "", "Fantom": "", "Aurora": "0xa06b8b0642cf6a9298322d0c8ac3c68c291ca24dc66245cf23aa2abc33b57e21", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "TRISOLARIS_ROUTER_ADDRESS": { "Mainnet": "", @@ -957,7 +1051,9 @@ "Celo": "", "Fantom": "", "Aurora": "0x2CB45Edb4517d5947aFdE3BEAbF95A582506858B", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "TRISOLARIS_FACTORY_ADDRESS": { "Mainnet": "", @@ -977,7 +1073,9 @@ "Celo": "", "Fantom": "", "Aurora": "0xc66F594268041dB60507F00703b152492fb176E7", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "TRISOLARIS_THEGRAPH": { "Mainnet": "", @@ -997,7 +1095,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "TRISOLARIS_INIT_CODE_HASH": { "Mainnet": "", @@ -1017,6 +1117,8 @@ "Celo": "", "Fantom": "", "Aurora": "0x754e1d90e536e4c1df81b7f030f47b4ca80c87120e145c294f098c83a6cb5ace", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" } } diff --git a/packages/web3-constants/evm/trending.json b/packages/web3-constants/evm/trending.json index a115fe46afe5..0c7c7b979411 100644 --- a/packages/web3-constants/evm/trending.json +++ b/packages/web3-constants/evm/trending.json @@ -17,7 +17,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "UNISWAP_V2_HEALTH_URL": { "Mainnet": "https://api.thegraph.com/index-node/graphql", @@ -37,7 +39,9 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "ETHEREUM_BLOCKS_SUBGRAPH_URL": { "Mainnet": "https://api.thegraph.com/subgraphs/name/blocklytics/ethereum-blocks", @@ -57,6 +61,8 @@ "Celo": "", "Fantom": "", "Aurora": "", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" } } diff --git a/packages/web3-constants/evm/zerion.json b/packages/web3-constants/evm/zerion.json index e0d70150b37f..87c8f41d1431 100644 --- a/packages/web3-constants/evm/zerion.json +++ b/packages/web3-constants/evm/zerion.json @@ -17,7 +17,9 @@ "Celo": "celo-assets", "Fantom": "fantom-assets", "Aurora": "aurora-assets", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" }, "TRANSACTIONS_SCOPE_NAME": { "Mainnet": "transactions", @@ -37,6 +39,8 @@ "Celo": "celo-transactions", "Fantom": "fantom-transactions", "Aurora": "aurora-transactions", - "Aurora_Testnet": "" + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" } } diff --git a/packages/web3-shared/evm/types/index.ts b/packages/web3-shared/evm/types/index.ts index 7840867421cc..b6393c222eba 100644 --- a/packages/web3-shared/evm/types/index.ts +++ b/packages/web3-shared/evm/types/index.ts @@ -78,6 +78,10 @@ export enum ChainId { // Optimistic Optimistic = 10, + + // Harmony + Harmony = 1666600000, + Harmony_Test = 1666700000, } export enum ProviderType { @@ -113,6 +117,7 @@ export enum NetworkType { Fuse = 'Fuse', Metis = 'Metis', Optimistic = 'Optimistic', + Harmony = 'Harmony', } export interface Wallet { diff --git a/packages/web3-shared/evm/utils/chainDetailed.ts b/packages/web3-shared/evm/utils/chainDetailed.ts index 1cceb01fa697..644f67e38c35 100644 --- a/packages/web3-shared/evm/utils/chainDetailed.ts +++ b/packages/web3-shared/evm/utils/chainDetailed.ts @@ -114,6 +114,7 @@ const chainNameMap: Record = { [NetworkType.Fuse]: 'Fuse', [NetworkType.Metis]: 'Metis', [NetworkType.Optimistic]: 'Optimistic', + [NetworkType.Harmony]: 'Harmony', } export function getNetworkTypeFromChainId(chainId: ChainId, value?: boolean) { const chainDetailed = getChainDetailed(chainId) From 79b19e4c321a929b87ac575822cc23921bd95512 Mon Sep 17 00:00:00 2001 From: codingsh Date: Wed, 16 Mar 2022 19:25:06 +0000 Subject: [PATCH 02/33] feat(harmony): add wrapped token address and coins apis id --- packages/web3-constants/evm/coingecko.json | 2 +- packages/web3-constants/evm/coinmarketcap.json | 2 +- packages/web3-constants/evm/debank.json | 2 +- packages/web3-constants/evm/token-list.json | 4 ++-- packages/web3-constants/evm/token.json | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/web3-constants/evm/coingecko.json b/packages/web3-constants/evm/coingecko.json index c920724feb19..dd26a66b8407 100644 --- a/packages/web3-constants/evm/coingecko.json +++ b/packages/web3-constants/evm/coingecko.json @@ -40,7 +40,7 @@ "Fantom": "fantom", "Aurora": "ethereum", "Aurora_Testnet": "", - "Harmony": "", + "Harmony": "harmony-shard-0", "Harmony_Test": "" } } diff --git a/packages/web3-constants/evm/coinmarketcap.json b/packages/web3-constants/evm/coinmarketcap.json index b53c8ddc75cb..bce83e5627ef 100644 --- a/packages/web3-constants/evm/coinmarketcap.json +++ b/packages/web3-constants/evm/coinmarketcap.json @@ -18,7 +18,7 @@ "Fantom": "3513", "Aurora": "1313161554", "Aurora_Testnet": "", - "Harmony": "", + "Harmony": "3945", "Harmony_Test": "" } } diff --git a/packages/web3-constants/evm/debank.json b/packages/web3-constants/evm/debank.json index 4e3d952ef3e7..5a8ec018af35 100644 --- a/packages/web3-constants/evm/debank.json +++ b/packages/web3-constants/evm/debank.json @@ -18,7 +18,7 @@ "Fantom": "ftm", "Aurora": "aurora", "Aurora_Testnet": "", - "Harmony": "", + "Harmony": "hym", "Harmony_Test": "" } } diff --git a/packages/web3-constants/evm/token-list.json b/packages/web3-constants/evm/token-list.json index 62c059e8dd9d..299cd620d64d 100644 --- a/packages/web3-constants/evm/token-list.json +++ b/packages/web3-constants/evm/token-list.json @@ -18,7 +18,7 @@ "Fantom": ["https://tokens.r2d2.to/latest/250/tokens.json"], "Aurora": ["https://tokens.r2d2.to/latest/1313161554/tokens.json"], "Aurora_Testnet": [], - "Harmony": [], - "Harmony_Test": [] + "Harmony": ["https://tokens.r2d2.to/latest/1666600000/tokens.json"], + "Harmony_Test": ["https://tokens.r2d2.to/latest/1666700000/tokens.json"] } } diff --git a/packages/web3-constants/evm/token.json b/packages/web3-constants/evm/token.json index b6b9cc26c1d3..b5f90e907ee0 100644 --- a/packages/web3-constants/evm/token.json +++ b/packages/web3-constants/evm/token.json @@ -18,7 +18,7 @@ "Fantom": "0x21be370d5312f44cb42ce377bc9b8a0cef1a4c83", "Aurora": "0xC9BdeEd33CD01541e1eeD10f90519d2C06Fe3feB", "Aurora_Testnet": "", - "Harmony": "", + "Harmony": "0xcF664087a5bB0237a0BAd6742852ec6c8d69A27a", "Harmony_Test": "" }, "USDC_ADDRESS": { From 75ae33d9c52e044c2cd937c9c45085813c87fb7d Mon Sep 17 00:00:00 2001 From: codingsh Date: Wed, 16 Mar 2022 20:24:54 +0000 Subject: [PATCH 03/33] feat(harmony): add venonswap and openswap dexs --- cspell.json | 5 + .../src/plugins/Trader/apis/trader/index.ts | 2 +- .../src/plugins/Trader/constants/index.ts | 2 + .../src/plugins/Trader/constants/openswap.ts | 14 ++ .../src/plugins/Trader/constants/venonswap.ts | 14 ++ packages/mask/src/plugins/Trader/pipes.ts | 2 + .../Trader/trader/useAllTradeComputed.ts | 16 ++ .../Trader/trader/useGetTradeContext.ts | 28 +++ .../plugins/Trader/trader/useTradeCallback.ts | 4 + .../plugins/Trader/trader/useTradeContext.ts | 28 +++ .../mask/src/plugins/Trader/types/trader.ts | 2 + packages/public-api/src/web.ts | 2 + packages/web3-constants/evm/token.json | 44 +++++ packages/web3-constants/evm/trader.json | 176 ++++++++++++++++++ packages/web3-shared/evm/constants/tokens.ts | 2 + 15 files changed, 340 insertions(+), 1 deletion(-) create mode 100644 packages/mask/src/plugins/Trader/constants/openswap.ts create mode 100644 packages/mask/src/plugins/Trader/constants/venonswap.ts diff --git a/cspell.json b/cspell.json index aa4c82a87783..46d8593ab063 100644 --- a/cspell.json +++ b/cspell.json @@ -113,6 +113,7 @@ "ipfsurl", "ittr", "jailbroken", + "jellyswap", "jsbi", "jsonml", "juicebox", @@ -164,6 +165,8 @@ "nowallet", "nums", "opensea", + "openswap", + "openx", "overridable", "overscan", "pageable", @@ -207,6 +210,7 @@ "sashimiswap", "scroller", "secp", + "seeswap", "serializers", "shink", "signup", @@ -247,6 +251,7 @@ "urlcat", "usermenu", "vcent", + "venonswap", "viet", "viewbox", "visualcompletion", diff --git a/packages/mask/src/plugins/Trader/apis/trader/index.ts b/packages/mask/src/plugins/Trader/apis/trader/index.ts index fe852295e9ec..2cb5bbbe7515 100644 --- a/packages/mask/src/plugins/Trader/apis/trader/index.ts +++ b/packages/mask/src/plugins/Trader/apis/trader/index.ts @@ -51,7 +51,7 @@ export async function getAvailableTraderProviders(chainId: ChainId) { case NetworkType.Aurora: return [TradeProvider.DODO, TradeProvider.WANNASWAP, TradeProvider.TRISOLARIS] case NetworkType.Harmony: - return [TradeProvider.SUSHISWAP] + return [TradeProvider.SUSHISWAP, TradeProvider.VENONSWAP, TradeProvider.OPENSWAP] case NetworkType.Boba: case NetworkType.Fuse: case NetworkType.Metis: diff --git a/packages/mask/src/plugins/Trader/constants/index.ts b/packages/mask/src/plugins/Trader/constants/index.ts index 7cde5749d988..7ad6c34ba464 100644 --- a/packages/mask/src/plugins/Trader/constants/index.ts +++ b/packages/mask/src/plugins/Trader/constants/index.ts @@ -13,4 +13,6 @@ export * from './traderjoe' export * from './pangolindex' export * from './wannaswap' export * from './trisolaris' +export * from './venonswap' +export * from './openswap' export type { ERC20TokenCustomizedBase, ERC20AgainstToken } from './types' diff --git a/packages/mask/src/plugins/Trader/constants/openswap.ts b/packages/mask/src/plugins/Trader/constants/openswap.ts new file mode 100644 index 000000000000..8cfd2850a991 --- /dev/null +++ b/packages/mask/src/plugins/Trader/constants/openswap.ts @@ -0,0 +1,14 @@ +import { ChainId, DAI, USDC, USDT, WBTC, WNATIVE, OPENX, WNATIVE_ONLY } from '@masknet/web3-shared-evm' + +import type { ERC20AgainstToken, ERC20TokenCustomizedBase } from './types' + +/** + * Some tokens can only be swapped via certain pairs, + * so we override the list of bases that are considered for these tokens. + */ +export const OPENSWAP_CUSTOM_BASES: ERC20TokenCustomizedBase = {} + +export const OPENSWAP_BASE_AGAINST_TOKENS: ERC20AgainstToken = { + ...WNATIVE_ONLY, + [ChainId.Harmony]: [WNATIVE, DAI, OPENX, USDC, WBTC, USDT].map((x) => x[ChainId.Harmony]), +} diff --git a/packages/mask/src/plugins/Trader/constants/venonswap.ts b/packages/mask/src/plugins/Trader/constants/venonswap.ts new file mode 100644 index 000000000000..dbd0ace755a6 --- /dev/null +++ b/packages/mask/src/plugins/Trader/constants/venonswap.ts @@ -0,0 +1,14 @@ +import { ChainId, DAI, USDC, USDT, WBTC, WNATIVE, VIPER, WNATIVE_ONLY } from '@masknet/web3-shared-evm' + +import type { ERC20AgainstToken, ERC20TokenCustomizedBase } from './types' + +/** + * Some tokens can only be swapped via certain pairs, + * so we override the list of bases that are considered for these tokens. + */ +export const VENONSWAP_CUSTOM_BASES: ERC20TokenCustomizedBase = {} + +export const VENONSWAP_BASE_AGAINST_TOKENS: ERC20AgainstToken = { + ...WNATIVE_ONLY, + [ChainId.Harmony]: [WNATIVE, DAI, VIPER, USDC, WBTC, USDT].map((x) => x[ChainId.Harmony]), +} diff --git a/packages/mask/src/plugins/Trader/pipes.ts b/packages/mask/src/plugins/Trader/pipes.ts index c5fa9424b3c1..8bae549e9c5a 100644 --- a/packages/mask/src/plugins/Trader/pipes.ts +++ b/packages/mask/src/plugins/Trader/pipes.ts @@ -40,6 +40,8 @@ export const resolveTradeProviderName = createLookupTableResolver { throw new Error(`Unknown provider type: ${tradeProvider}`) diff --git a/packages/mask/src/plugins/Trader/trader/useAllTradeComputed.ts b/packages/mask/src/plugins/Trader/trader/useAllTradeComputed.ts index 9f7b2d229a2b..463ada60b604 100644 --- a/packages/mask/src/plugins/Trader/trader/useAllTradeComputed.ts +++ b/packages/mask/src/plugins/Trader/trader/useAllTradeComputed.ts @@ -198,6 +198,20 @@ export function useAllTradeComputed( traderEstimateGas: wannaSwapEstimateGas, } = useUniswapV2Like(tradeProviders, TradeProvider.WANNASWAP, inputAmount_, inputToken, outputToken) + // VenonSwap + const { + trader_: venonswap_, + trader: venonswap, + traderEstimateGas: venonswapEstimateGas, + } = useUniswapV2Like(tradeProviders, TradeProvider.VENONSWAP, inputAmount_, inputToken, outputToken) + + // OpenSwap + const { + trader_: openswap_, + trader: openswap, + traderEstimateGas: openswapEstimateGas, + } = useUniswapV2Like(tradeProviders, TradeProvider.OPENSWAP, inputAmount_, inputToken, outputToken) + const allTradeResult = [ { provider: TradeProvider.UNISWAP_V2, ...uniswapV2_, value: uniswapV2, gas: uniswapV2EstimateGas }, { provider: TradeProvider.SUSHISWAP, ...sushiSwap_, value: sushiSwap, gas: sushiSwapEstimateGas }, @@ -214,6 +228,8 @@ export function useAllTradeComputed( { provider: TradeProvider.OPENOCEAN, ...openocean_, value: openocean, gas: openoceanSwapEstimateGas }, { provider: TradeProvider.WANNASWAP, ...wannaswap_, value: wannaswap, gas: wannaSwapEstimateGas }, { provider: TradeProvider.TRISOLARIS, ...trisolaris_, value: trisolaris, gas: trisolarisEstimateGas }, + { provider: TradeProvider.VENONSWAP, ...venonswap_, value: venonswap, gas: venonswapEstimateGas }, + { provider: TradeProvider.OPENSWAP, ...openswap_, value: openswap, gas: openswapEstimateGas }, ] return nativeToken_.value diff --git a/packages/mask/src/plugins/Trader/trader/useGetTradeContext.ts b/packages/mask/src/plugins/Trader/trader/useGetTradeContext.ts index 77533cc926e2..ca0b40fc9b4d 100644 --- a/packages/mask/src/plugins/Trader/trader/useGetTradeContext.ts +++ b/packages/mask/src/plugins/Trader/trader/useGetTradeContext.ts @@ -21,6 +21,10 @@ import { WANNASWAP_CUSTOM_BASES, TRISOLARIS_BASE_AGAINST_TOKENS, TRISOLARIS_CUSTOM_BASES, + VENONSWAP_BASE_AGAINST_TOKENS, + VENONSWAP_CUSTOM_BASES, + OPENSWAP_BASE_AGAINST_TOKENS, + OPENSWAP_CUSTOM_BASES, } from '../constants' import { unreachable } from '@dimensiondev/kit' import { TargetChainIdContext } from './useTargetChainIdContext' @@ -150,6 +154,30 @@ export function useGetTradeContext(tradeProvider?: TradeProvider) { ADDITIONAL_TOKENS: {}, CUSTOM_TOKENS: TRISOLARIS_CUSTOM_BASES, } + case TradeProvider.VENONSWAP: + return { + TYPE: tradeProvider, + IS_UNISWAP_V2_LIKE: true, + GRAPH_API: DEX_TRADE.VENONSWAP_THEGRAPH, + INIT_CODE_HASH: DEX_TRADE.VENONSWAP_INIT_CODE_HASH, + ROUTER_CONTRACT_ADDRESS: DEX_TRADE.VENONSWAP_ROUTER_ADDRESS, + FACTORY_CONTRACT_ADDRESS: DEX_TRADE.VENONSWAP_FACTORY_ADDRESS, + AGAINST_TOKENS: VENONSWAP_BASE_AGAINST_TOKENS, + ADDITIONAL_TOKENS: {}, + CUSTOM_TOKENS: VENONSWAP_CUSTOM_BASES, + } + case TradeProvider.OPENSWAP: + return { + TYPE: tradeProvider, + IS_UNISWAP_V2_LIKE: true, + GRAPH_API: DEX_TRADE.OPENSWAP_THEGRAPH, + INIT_CODE_HASH: DEX_TRADE.OPENSWAP_INIT_CODE_HASH, + ROUTER_CONTRACT_ADDRESS: DEX_TRADE.OPENSWAP_ROUTER_ADDRESS, + FACTORY_CONTRACT_ADDRESS: DEX_TRADE.OPENSWAP_FACTORY_ADDRESS, + AGAINST_TOKENS: OPENSWAP_BASE_AGAINST_TOKENS, + ADDITIONAL_TOKENS: {}, + CUSTOM_TOKENS: OPENSWAP_CUSTOM_BASES, + } case TradeProvider.ZRX: return { TYPE: tradeProvider, diff --git a/packages/mask/src/plugins/Trader/trader/useTradeCallback.ts b/packages/mask/src/plugins/Trader/trader/useTradeCallback.ts index c678a4013af9..23addac783cc 100644 --- a/packages/mask/src/plugins/Trader/trader/useTradeCallback.ts +++ b/packages/mask/src/plugins/Trader/trader/useTradeCallback.ts @@ -100,6 +100,10 @@ export function useTradeCallback( return uniswapV2Like case TradeProvider.TRISOLARIS: return uniswapV2Like + case TradeProvider.VENONSWAP: + return uniswapV2Like + case TradeProvider.OPENSWAP: + return uniswapV2Like case TradeProvider.ZRX: return zrx case TradeProvider.BALANCER: diff --git a/packages/mask/src/plugins/Trader/trader/useTradeContext.ts b/packages/mask/src/plugins/Trader/trader/useTradeContext.ts index 3db649333430..992c6cdd6602 100644 --- a/packages/mask/src/plugins/Trader/trader/useTradeContext.ts +++ b/packages/mask/src/plugins/Trader/trader/useTradeContext.ts @@ -21,6 +21,10 @@ import { WANNASWAP_CUSTOM_BASES, TRISOLARIS_CUSTOM_BASES, TRISOLARIS_BASE_AGAINST_TOKENS, + VENONSWAP_CUSTOM_BASES, + VENONSWAP_BASE_AGAINST_TOKENS, + OPENSWAP_CUSTOM_BASES, + OPENSWAP_BASE_AGAINST_TOKENS, } from '../constants' import type { TradeContext as TradeContext_ } from '../types' import { TargetChainIdContext } from './useTargetChainIdContext' @@ -128,6 +132,30 @@ export function useTradeContext(tradeProvider: TradeProvider) { ADDITIONAL_TOKENS: {}, CUSTOM_TOKENS: TRISOLARIS_CUSTOM_BASES, } + case TradeProvider.VENONSWAP: + return { + TYPE: tradeProvider, + IS_UNISWAP_V2_LIKE: true, + GRAPH_API: DEX_TRADE.VENONSWAP_THEGRAPH, + INIT_CODE_HASH: DEX_TRADE.VENONSWAP_INIT_CODE_HASH, + ROUTER_CONTRACT_ADDRESS: DEX_TRADE.VENONSWAP_ROUTER_ADDRESS, + FACTORY_CONTRACT_ADDRESS: DEX_TRADE.VENONSWAP_FACTORY_ADDRESS, + AGAINST_TOKENS: VENONSWAP_BASE_AGAINST_TOKENS, + ADDITIONAL_TOKENS: {}, + CUSTOM_TOKENS: VENONSWAP_CUSTOM_BASES, + } + case TradeProvider.OPENSWAP: + return { + TYPE: tradeProvider, + IS_UNISWAP_V2_LIKE: true, + GRAPH_API: DEX_TRADE.OPENSWAP_THEGRAPH, + INIT_CODE_HASH: DEX_TRADE.OPENSWAP_INIT_CODE_HASH, + ROUTER_CONTRACT_ADDRESS: DEX_TRADE.OPENSWAP_ROUTER_ADDRESS, + FACTORY_CONTRACT_ADDRESS: DEX_TRADE.OPENSWAP_FACTORY_ADDRESS, + AGAINST_TOKENS: OPENSWAP_BASE_AGAINST_TOKENS, + ADDITIONAL_TOKENS: {}, + CUSTOM_TOKENS: OPENSWAP_CUSTOM_BASES, + } case TradeProvider.ZRX: return { TYPE: tradeProvider, diff --git a/packages/mask/src/plugins/Trader/types/trader.ts b/packages/mask/src/plugins/Trader/types/trader.ts index fb0d655737ee..5304b3fa4214 100644 --- a/packages/mask/src/plugins/Trader/types/trader.ts +++ b/packages/mask/src/plugins/Trader/types/trader.ts @@ -75,6 +75,8 @@ export enum ZrxTradePool { PangolinDex = 'PangolinDex', Trisolaris = 'Trisolaris', WannaSwap = 'WannaSwap', + VenonSwap = 'VenonSwap', + OpenSwap = 'OpenSwap', } export interface TradeComputed { diff --git a/packages/public-api/src/web.ts b/packages/public-api/src/web.ts index 7e745d960449..c4f27483b996 100644 --- a/packages/public-api/src/web.ts +++ b/packages/public-api/src/web.ts @@ -217,6 +217,8 @@ export enum TradeProvider { TRISOLARIS = 12, TRADERJOE = 13, PANGOLIN = 14, + VENONSWAP = 15, + OPENSWAP = 16, } /** Supported language settings */ export enum LanguageOptions { diff --git a/packages/web3-constants/evm/token.json b/packages/web3-constants/evm/token.json index b5f90e907ee0..32ea157f41b9 100644 --- a/packages/web3-constants/evm/token.json +++ b/packages/web3-constants/evm/token.json @@ -989,6 +989,50 @@ "Harmony": "", "Harmony_Test": "" }, + "VIPER_ADDRESS": { + "Mainnet": "", + "Ropsten": "", + "Rinkeby": "", + "Kovan": "", + "Gorli": "", + "BSC": "", + "BSCT": "", + "Matic": "", + "Mumbai": "", + "Arbitrum": "", + "Arbitrum_Rinkeby": "", + "xDai": "", + "Avalanche": "", + "Avalanche_Fuji": "", + "Celo": "", + "Fantom": "", + "Aurora": "", + "Aurora_Testnet": "", + "Harmony": "0xEa589E93Ff18b1a1F1e9BaC7EF3E86Ab62addc79", + "Harmony_Test": "0x69A655c56087D927eb05247FB56495a0f19B9f70" + }, + "OPENX_ADDRESS": { + "Mainnet": "", + "Ropsten": "", + "Rinkeby": "", + "Kovan": "", + "Gorli": "", + "BSC": "", + "BSCT": "", + "Matic": "", + "Mumbai": "", + "Arbitrum": "", + "Arbitrum_Rinkeby": "", + "xDai": "", + "Avalanche": "", + "Avalanche_Fuji": "", + "Celo": "", + "Fantom": "", + "Aurora": "", + "Aurora_Testnet": "", + "Harmony": "0x01A4b054110d57069c1658AFBC46730529A3E326", + "Harmony_Test": "" + }, "ETHER_ADDRESS": { "Mainnet": "", "Ropsten": "", diff --git a/packages/web3-constants/evm/trader.json b/packages/web3-constants/evm/trader.json index 2229bf113a29..c67ca80cb1a9 100644 --- a/packages/web3-constants/evm/trader.json +++ b/packages/web3-constants/evm/trader.json @@ -1120,5 +1120,181 @@ "Aurora_Testnet": "", "Harmony": "", "Harmony_Test": "" + }, + "VENONSWAP_ROUTER_ADDRESS": { + "Mainnet": "", + "Ropsten": "", + "Rinkeby": "", + "Kovan": "", + "Gorli": "", + "BSC": "", + "BSCT": "", + "Matic": "", + "Mumbai": "", + "Arbitrum": "", + "Arbitrum_Rinkeby": "", + "xDai": "", + "Avalanche": "", + "Avalanche_Fuji": "", + "Celo": "", + "Fantom": "", + "Aurora": "", + "Aurora_Testnet": "", + "Harmony": "'0xf012702a5f0e54015362cBCA26a26fc90AA832a3", + "Harmony_Test": "0x8e9A3cE409B13ef459fE4448aE97a79d6Ecd8b4b" + }, + "VENONSWAP_FACTORY_ADDRESS": { + "Mainnet": "", + "Ropsten": "", + "Rinkeby": "", + "Kovan": "", + "Gorli": "", + "BSC": "", + "BSCT": "", + "Matic": "", + "Mumbai": "", + "Arbitrum": "", + "Arbitrum_Rinkeby": "", + "xDai": "", + "Avalanche": "", + "Avalanche_Fuji": "", + "Celo": "", + "Fantom": "", + "Aurora": "", + "Aurora_Testnet": "", + "Harmony": "0x7D02c116b98d0965ba7B642ace0183ad8b8D2196", + "Harmony_Test": "0x066bafafC84607a956967F6f050bD14A8347952F" + }, + "VENONSWAP_THEGRAPH": { + "Mainnet": "", + "Ropsten": "", + "Rinkeby": "", + "Kovan": "", + "Gorli": "", + "BSC": "", + "BSCT": "", + "Matic": "", + "Mumbai": "", + "Arbitrum": "", + "Arbitrum_Rinkeby": "", + "xDai": "", + "Avalanche": "", + "Avalanche_Fuji": "", + "Celo": "", + "Fantom": "", + "Aurora": "", + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" + }, + "VENONSWAP_INIT_CODE_HASH": { + "Mainnet": "", + "Ropsten": "", + "Rinkeby": "", + "Kovan": "", + "Gorli": "", + "BSC": "", + "BSCT": "", + "Matic": "", + "Mumbai": "", + "Arbitrum": "", + "Arbitrum_Rinkeby": "", + "xDai": "", + "Avalanche": "", + "Avalanche_Fuji": "", + "Celo": "", + "Fantom": "", + "Aurora": "", + "Aurora_Testnet": "", + "Harmony": "0x162f79e638367cd45a118c778971dfd8d96c625d2798d3b71994b035cfe9b6dc", + "Harmony_Test": "0x162f79e638367cd45a118c778971dfd8d96c625d2798d3b71994b035cfe9b6dc" + }, + "OPENSWAP_ROUTER_ADDRESS": { + "Mainnet": "", + "Ropsten": "", + "Rinkeby": "", + "Kovan": "", + "Gorli": "", + "BSC": "", + "BSCT": "", + "Matic": "", + "Mumbai": "", + "Arbitrum": "", + "Arbitrum_Rinkeby": "", + "xDai": "", + "Avalanche": "", + "Avalanche_Fuji": "", + "Celo": "", + "Fantom": "", + "Aurora": "", + "Aurora_Testnet": "", + "Harmony": "0x2F99992024DCC51324BA4956bB1c510F36FA54F5", + "Harmony_Test": "" + }, + "OPENSWAP_FACTORY_ADDRESS": { + "Mainnet": "", + "Ropsten": "", + "Rinkeby": "", + "Kovan": "", + "Gorli": "", + "BSC": "", + "BSCT": "", + "Matic": "", + "Mumbai": "", + "Arbitrum": "", + "Arbitrum_Rinkeby": "", + "xDai": "", + "Avalanche": "", + "Avalanche_Fuji": "", + "Celo": "", + "Fantom": "", + "Aurora": "", + "Aurora_Testnet": "", + "Harmony": "0x5d2F9817303b940C9bB4F47C8C566c5C034d9848", + "Harmony_Test": "" + }, + "OPENSWAP_THEGRAPH": { + "Mainnet": "", + "Ropsten": "", + "Rinkeby": "", + "Kovan": "", + "Gorli": "", + "BSC": "", + "BSCT": "", + "Matic": "", + "Mumbai": "", + "Arbitrum": "", + "Arbitrum_Rinkeby": "", + "xDai": "", + "Avalanche": "", + "Avalanche_Fuji": "", + "Celo": "", + "Fantom": "", + "Aurora": "", + "Aurora_Testnet": "", + "Harmony": "", + "Harmony_Test": "" + }, + "OPENSWAP_INIT_CODE_HASH": { + "Mainnet": "", + "Ropsten": "", + "Rinkeby": "", + "Kovan": "", + "Gorli": "", + "BSC": "", + "BSCT": "", + "Matic": "", + "Mumbai": "", + "Arbitrum": "", + "Arbitrum_Rinkeby": "", + "xDai": "", + "Avalanche": "", + "Avalanche_Fuji": "", + "Celo": "", + "Fantom": "", + "Aurora": "", + "Aurora_Testnet": "", + "Harmony": "0x613b6eaa34b43dcb7eb8881dd4b5af85805be104d5f2f385304ffa8bda5e219c", + "Harmony_Test": "" } } diff --git a/packages/web3-shared/evm/constants/tokens.ts b/packages/web3-shared/evm/constants/tokens.ts index 486f30fea1ca..31cc067ca1c7 100644 --- a/packages/web3-shared/evm/constants/tokens.ts +++ b/packages/web3-shared/evm/constants/tokens.ts @@ -50,6 +50,8 @@ export const CUSD = createERC20Tokens('cUSD_ADDRESS', 'Celo Dollar', 'cUSD', 18) export const CEUR = createERC20Tokens('cEUR_ADDRESS', 'Celo Euro', 'cEUR', 18) export const JOE = createERC20Tokens('JOE_ADDRESS', 'JoeToken', 'JOE', 18) export const PNG = createERC20Tokens('PNG_ADDRESS', 'Pangolin', 'PNG', 18) +export const VIPER = createERC20Tokens('VIPER_ADDRESS', 'VIPER', 'VIPER', 18) +export const OPENX = createERC20Tokens('OPENX_ADDRESS', 'Openswap', 'OPENX', 18) export const WNATIVE = createERC20Tokens( 'WNATIVE_ADDRESS', From 32582b9109c75ac444d579a210a973cae73fa55c Mon Sep 17 00:00:00 2001 From: codingsh Date: Mon, 21 Mar 2022 07:16:39 +0000 Subject: [PATCH 04/33] chore(harmony): add ito, mask-box and redpacket address --- packages/web3-constants/evm/ito.json | 14 +++++++------- packages/web3-constants/evm/mask-box.json | 8 ++++---- packages/web3-constants/evm/red-packet.json | 10 +++++----- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/packages/web3-constants/evm/ito.json b/packages/web3-constants/evm/ito.json index e19baf545074..87d6b9b62e1a 100644 --- a/packages/web3-constants/evm/ito.json +++ b/packages/web3-constants/evm/ito.json @@ -62,8 +62,8 @@ "Fantom": "0x981be454a930479d92C91a0092D204b64845A5D6", "Aurora": "0x2cf91AD8C175305EBe6970Bd8f81231585EFbd77", "Aurora_Testnet": "0xdcA6F476EebCDE8FE8b072e3fC80dBC28dC209b3", - "Harmony": "", - "Harmony_Test": "" + "Harmony": "0x5b966f3a32db9c180843bcb40267a66b73e4f022", + "Harmony_Test": "0x578a7fee5f0d8cec7d00578bf37374c5b95c4b98" }, "ITO2_CONTRACT_CREATION_BLOCK_HEIGHT": { "Mainnet": 12766513, @@ -84,8 +84,8 @@ "Fantom": 25071597, "Aurora": 57350598, "Aurora_Testnet": 77919102, - "Harmony": 0, - "Harmony_Test": 0 + "Harmony": 24133305, + "Harmony_Test": 22744597 }, "DEFAULT_QUALIFICATION_ADDRESS": { "Mainnet": "0x81b6ae377e360dcad63611846a2516f4ba8c88ac", @@ -128,8 +128,8 @@ "Fantom": "0x83D6b366f21e413f214EB077D5378478e71a5eD2", "Aurora": "0x578a7Fee5f0D8CEc7d00578Bf37374C5b95C4b98", "Aurora_Testnet": "", - "Harmony": "", - "Harmony_Test": "" + "Harmony": "0x02Ea0720254F7fa4eca7d09A1b9C783F1020EbEF", + "Harmony_Test": "0x812463356F58fc8194645A1838ee6C52D8ca2D26" }, "SUBGRAPH_URL": { "Mainnet": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-ito-mainnet", @@ -150,7 +150,7 @@ "Fantom": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-ito-fantom", "Aurora": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-ito-aurora", "Aurora_Testnet": "", - "Harmony": "", + "Harmony": "ttps://api.thegraph.com/subgraphs/name/dimensiondev/mask-ito-harmony", "Harmony_Test": "" } } diff --git a/packages/web3-constants/evm/mask-box.json b/packages/web3-constants/evm/mask-box.json index ded609b1d518..9da6f7fe7a92 100644 --- a/packages/web3-constants/evm/mask-box.json +++ b/packages/web3-constants/evm/mask-box.json @@ -18,8 +18,8 @@ "Fantom": "", "Aurora": "0xf5056B96ab242C566002852d0b98ce0BcDf1af51", "Aurora_Testnet": "0xB4D669bc117735FdA44e90e52795132187705B21", - "Harmony": "", - "Harmony_Test": "" + "Harmony": "0xDc0905F2Dac875E29A36f22F1Ea046e063875D3e", + "Harmony_Test": "0x4Fda6d9Bb68Af18E5d686555b18cCeA7C82E0A3F" }, "MASK_BOX_CONTRACT_FROM_BLOCK": { "Mainnet": 13687866, @@ -40,7 +40,7 @@ "Fantom": 0, "Aurora": 57259004, "Aurora_Testnet": 77919118, - "Harmony": 0, - "Harmony_Test": 0 + "Harmony": 24172689, + "Harmony_Test": 22787067 } } diff --git a/packages/web3-constants/evm/red-packet.json b/packages/web3-constants/evm/red-packet.json index 2094410428d7..3d5618c26db6 100644 --- a/packages/web3-constants/evm/red-packet.json +++ b/packages/web3-constants/evm/red-packet.json @@ -84,8 +84,8 @@ "Fantom": "0x578a7Fee5f0D8CEc7d00578Bf37374C5b95C4b98", "Aurora": "0x19f179D7e0D7d9F9d5386afFF64271D98A91615B", "Aurora_Testnet": "0xdB93cCd481012bB5D1E2c8d0aF7C5f2940c00fdC", - "Harmony": "", - "Harmony_Test": "" + "Harmony": "0x83d6b366f21e413f214eb077d5378478e71a5ed2", + "Harmony_Test": "0x981be454a930479d92c91a0092d204b64845a5d6" }, "HAPPY_RED_PACKET_ADDRESS_V4_BLOCK_HEIGHT": { "Mainnet": 12939427, @@ -106,8 +106,8 @@ "Fantom": 25112473, "Aurora": 57552338, "Aurora_Testnet": 77918765, - "Harmony": 0, - "Harmony_Test": 0 + "Harmony": 24134148, + "Harmony_Test": 22701086 }, "SUBGRAPH_URL": { "Mainnet": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-red-packet-mainnet", @@ -128,7 +128,7 @@ "Fantom": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-red-packet-fantom", "Aurora": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-red-packet-aurora", "Aurora_Testnet": "", - "Harmony": "", + "Harmony": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-red-packet-harmony", "Harmony_Test": "" } } From b26f9faef4315e41162703e4cf6665a79d5b56e3 Mon Sep 17 00:00:00 2001 From: codingsh Date: Mon, 4 Apr 2022 16:58:57 +0100 Subject: [PATCH 05/33] feat(harmony): add harmony address utils --- packages/web3-shared/evm/assets/chains.json | 4 +- .../evm/hooks/useERC721ContractDetailed.ts | 7 + packages/web3-shared/evm/package.json | 3 +- packages/web3-shared/evm/utils/GetAddress.ts | 174 +++++++ packages/web3-shared/evm/utils/bech32.ts | 240 +++++++++ packages/web3-shared/evm/utils/bytes.ts | 488 ++++++++++++++++++ packages/web3-shared/evm/utils/errors.ts | 289 +++++++++++ packages/web3-shared/evm/utils/index.ts | 1 + packages/web3-shared/evm/utils/keccak256.ts | 18 + packages/web3-shared/evm/utils/keyTool.ts | 45 ++ packages/web3-shared/evm/utils/validators.ts | 192 +++++++ 11 files changed, 1458 insertions(+), 3 deletions(-) create mode 100644 packages/web3-shared/evm/utils/GetAddress.ts create mode 100644 packages/web3-shared/evm/utils/bech32.ts create mode 100644 packages/web3-shared/evm/utils/bytes.ts create mode 100644 packages/web3-shared/evm/utils/errors.ts create mode 100644 packages/web3-shared/evm/utils/keccak256.ts create mode 100644 packages/web3-shared/evm/utils/keyTool.ts create mode 100644 packages/web3-shared/evm/utils/validators.ts diff --git a/packages/web3-shared/evm/assets/chains.json b/packages/web3-shared/evm/assets/chains.json index 7e8b9f9c89d7..dcb2a4e461dc 100644 --- a/packages/web3-shared/evm/assets/chains.json +++ b/packages/web3-shared/evm/assets/chains.json @@ -2685,7 +2685,7 @@ }, { "name": "Harmony Mainnet Shard 0", - "chain": "Harmony", + "chain": "harmony", "network": "mainnet", "rpc": ["https://api.harmony.one"], "faucets": [], @@ -2698,7 +2698,7 @@ }, { "name": "Harmony Mainnet Shard 1", - "chain": "Harmony", + "chain": "HarmonyShard1", "network": "mainnet", "rpc": ["https://s1.api.harmony.one"], "faucets": [], diff --git a/packages/web3-shared/evm/hooks/useERC721ContractDetailed.ts b/packages/web3-shared/evm/hooks/useERC721ContractDetailed.ts index 4ca404e8db20..98dbdfa3460c 100644 --- a/packages/web3-shared/evm/hooks/useERC721ContractDetailed.ts +++ b/packages/web3-shared/evm/hooks/useERC721ContractDetailed.ts @@ -6,6 +6,8 @@ import { useChainId } from './useChainId' import { useERC721TokenContract } from '../contracts/useERC721TokenContract' import { createERC721ContractDetailed, safeNonPayableTransactionCall } from '../utils' import { useOpenseaAPIConstants } from '../constants' +import { fromBech32 } from '../utils/bech32' +import { isBech32Address } from '../utils/validators' export function useERC721ContractDetailed(address?: string) { const chainId = useChainId() @@ -53,6 +55,11 @@ async function getERC721ContractDetailedFromChain(address: string, chainId: Chai result.status === 'fulfilled' ? result.value : '', ) as string[] + if (chainId === 1666600000) { + const addressONE = isBech32Address(address) ? fromBech32(address) : address + return createERC721ContractDetailed(chainId, addressONE, name, symbol, baseURI) + } + return createERC721ContractDetailed(chainId, address, name, symbol, baseURI) } diff --git a/packages/web3-shared/evm/package.json b/packages/web3-shared/evm/package.json index fd639cd57cfe..49cf7dd29079 100644 --- a/packages/web3-shared/evm/package.json +++ b/packages/web3-shared/evm/package.json @@ -25,7 +25,8 @@ "wallet.ts": "^1.0.1", "web3": "1.5.2", "web3-core-helpers": "1.5.2", - "web3-utils": "1.5.2" + "web3-utils": "1.5.2", + "js-sha3": "0.8.0" }, "devDependencies": { "@types/use-subscription": "^1.0.0" diff --git a/packages/web3-shared/evm/utils/GetAddress.ts b/packages/web3-shared/evm/utils/GetAddress.ts new file mode 100644 index 000000000000..fe028549b47d --- /dev/null +++ b/packages/web3-shared/evm/utils/GetAddress.ts @@ -0,0 +1,174 @@ +import { + isAddress, + isBech32Address, + isBech32TestNetAddress, +} from "./validators"; + +import { fromBech32, toBech32, HRP, tHRP } from "./bech32"; + +/** + * ### How to use it? + * + * ``` + * // Step 1: import the class + * const { HarmonyAddress } = require('@harmony-js/crypto'); + * + * // Step 2: call functions + * const addr = 'one103q7qe5t2505lypvltkqtddaef5tzfxwsse4z7' + * const res = HarmonyAddress.isValidBech32(addr); + * console.log(res); + * ``` + */ +export class HarmonyAddress { + /** + * @example + * ``` + * const addr = 'one103q7qe5t2505lypvltkqtddaef5tzfxwsse4z7' + * const res = HarmonyAddress.isValidBech32(addr); + * console.log(res); + * ``` + */ + static isValidBasic(str: string) { + const toTest = new HarmonyAddress(str); + return toTest.raw === toTest.basic; + } + + /** + * @example + * ``` + * const addr = 'one103q7qe5t2505lypvltkqtddaef5tzfxwsse4z7' + * const res = HarmonyAddress.isValidBech32(addr); + * console.log(res); + * ``` + */ + static isValidBech32(str: string) { + const toTest = new HarmonyAddress(str); + return toTest.raw === toTest.bech32; + } + + /** + * @example + * ``` + * const addr = 'one103q7qe5t2505lypvltkqtddaef5tzfxwsse4z7' + * const res = HarmonyAddress.isValidBech32TestNet(addr); + * console.log(res); + * ``` + */ + static isValidBech32TestNet(str: string) { + const toTest = new HarmonyAddress(str); + return toTest.raw === toTest.bech32TestNet; + } + + raw: string; + basic: string; + + /** + * get basicHex of the address + * + * @example + * ``` + * const addr = 'one103q7qe5t2505lypvltkqtddaef5tzfxwsse4z7' + * const instance = new HarmonyAddress(addr); + * console.log(instance.basicHex); + * ``` + */ + get basicHex() { + return `0x${this.basic}`; + } + + /** + * @example + * ``` + * const addr = 'one103q7qe5t2505lypvltkqtddaef5tzfxwsse4z7' + * const instance = new HarmonyAddress(addr); + * console.log(instance.bech32); + * ``` + */ + get bech32() { + return toBech32(this.basic, HRP); + } + + /** + * @example + * ``` + * const addr = 'one103q7qe5t2505lypvltkqtddaef5tzfxwsse4z7' + * const instance = new HarmonyAddress(addr); + * console.log(instance.bech32TestNet); + * ``` + */ + get bech32TestNet() { + return toBech32(this.basic, tHRP); + } + + constructor(raw: string) { + this.raw = raw; + this.basic = this.getBasic(this.raw); + } + + /** + * Check whether the address has an valid address format + * + * @param addr string, the address + * + * @example + * ``` + * const addr = 'one103q7qe5t2505lypvltkqtddaef5tzfxwsse4z7' + * const instance = new HarmonyAddress(addr); + * const res = instance.getBasic(addr); + * console.log(res) + * ``` + */ + private getBasic(addr: string) { + const basicBool = isAddress(addr); + const bech32Bool = isBech32Address(addr); + const bech32TestNetBool = isBech32TestNetAddress(addr); + + if (basicBool) { + return addr.replace("0x", "").toLowerCase(); + } + + if (bech32Bool) { + const fromB32 = fromBech32(addr, HRP); + return fromB32.replace("0x", "").toLowerCase(); + } + + if (bech32TestNetBool) { + const fromB32TestNet = fromBech32(addr, tHRP); + return fromB32TestNet.replace("0x", "").toLowerCase(); + } + + throw new Error(`"${addr}" is an invalid address format`); + } +} + +/** + * Using this function to get Harmony format address + * + * @param address + * + * @example + * ```javascript + * const { Harmony } = require('@harmony-js/core'); + * const { ChainID, ChainType } = require('@harmony-js/utils'); + * const { randomBytes } = require('@harmony-js/crypto') + * + * const hmy = new Harmony( + * 'http://localhost:9500', + * { + * chainType: ChainType.Harmony, + * chainId: ChainID.HmyLocal, + * }, + * ); + * + * const bytes = randomBytes(20); + * const hAddress = hmy.crypto.getAddress(bytes); + * console.log(hAddress) + * ``` + */ +export function getAddress(address: string) { + try { + return new HarmonyAddress(address); + } catch (error) { + throw error; + } +} diff --git a/packages/web3-shared/evm/utils/bech32.ts b/packages/web3-shared/evm/utils/bech32.ts new file mode 100644 index 000000000000..8e3d418c53e0 --- /dev/null +++ b/packages/web3-shared/evm/utils/bech32.ts @@ -0,0 +1,240 @@ +/* eslint-disable no-bitwise */ +/* eslint-disable @typescript-eslint/prefer-for-of */ +/** + * @packageDocumentation + * @module harmony-crypto + * @hidden + */ + +import { isAddress } from './validators' + +import { toChecksumAddress } from './keyTool' +// This code is taken from https://github.com/sipa/bech32/tree/bdc264f84014c234e908d72026b7b780122be11f/ref/javascript +// Copyright (c) 2017 Pieter Wuille +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +const CHARSET = 'qpzry9x8gf2tvdw0s3jn54khce6mua7l' +const GENERATOR = [0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3] + +const polymod = (values: Buffer): number => { + let chk = 1 + // tslint:disable-next-line + for (let p = 0; p < values.length; p += 1) { + // eslint-disable-next-line no-bitwise + const top = chk >> 25 + // eslint-disable-next-line no-bitwise + chk = ((chk & 0x1ffffff) << 5) ^ values[p] + for (let i = 0; i < 5; i += 1) { + // eslint-disable-next-line no-bitwise + if ((top >> i) & 1) { + // eslint-disable-next-line no-bitwise + chk ^= GENERATOR[i] + } + } + } + return chk +} + +const hrpExpand = (hrp: string): Buffer => { + const ret = [] + let p + for (p = 0; p < hrp.length; p += 1) { + // eslint-disable-next-line no-bitwise + ret.push(hrp.charCodeAt(p) >> 5) + } + ret.push(0) + for (p = 0; p < hrp.length; ++p) { + // eslint-disable-next-line no-bitwise + ret.push(hrp.charCodeAt(p) & 31) + } + return Buffer.from(ret) +} + +function verifyChecksum(hrp: string, data: Buffer) { + return polymod(Buffer.concat([hrpExpand(hrp), data])) === 1 +} + +function createChecksum(hrp: string, data: Buffer) { + const values = Buffer.concat([Buffer.from(hrpExpand(hrp)), data, Buffer.from([0, 0, 0, 0, 0, 0])]) + // var values = hrpExpand(hrp).concat(data).concat([0, 0, 0, 0, 0, 0]); + // eslint-disable-next-line no-bitwise + const mod = polymod(values) ^ 1 + const ret = [] + for (let p = 0; p < 6; p += 1) { + // eslint-disable-next-line no-bitwise + ret.push((mod >> (5 * (5 - p))) & 31) + } + return Buffer.from(ret) +} + +export const bech32Encode = (hrp: string, data: Buffer) => { + const combined = Buffer.concat([data, createChecksum(hrp, data)]) + let ret = hrp + '1' + // tslint:disable-next-line + for (let p = 0; p < combined.length; p += 1) { + ret += CHARSET.charAt(combined[p]) + } + return ret +} + +export const bech32Decode = (bechString: string) => { + let p + let hasLower = false + let hasUpper = false + for (p = 0; p < bechString.length; ++p) { + if (bechString.charCodeAt(p) < 33 || bechString.charCodeAt(p) > 126) { + return null + } + if (bechString.charCodeAt(p) >= 97 && bechString.charCodeAt(p) <= 122) { + hasLower = true + } + if (bechString.charCodeAt(p) >= 65 && bechString.charCodeAt(p) <= 90) { + hasUpper = true + } + } + if (hasLower && hasUpper) { + return null + } + bechString = bechString.toLowerCase() + const pos = bechString.lastIndexOf('1') + if (pos < 1 || pos + 7 > bechString.length || bechString.length > 90) { + return null + } + const hrp = bechString.substring(0, pos) + const data = [] + for (p = pos + 1; p < bechString.length; ++p) { + const d = CHARSET.indexOf(bechString.charAt(p)) + if (d === -1) { + return null + } + data.push(d) + } + + if (!verifyChecksum(hrp, Buffer.from(data))) { + return null + } + + return { hrp, data: Buffer.from(data.slice(0, data.length - 6)) } +} + +// HRP is the human-readable part of Harmony bech32 addresses +export const HRP = 'one' +export const tHRP = 'tone' + +/** + * convertBits + * + * groups buffers of a certain width to buffers of the desired width. + * + * For example, converts byte buffers to buffers of maximum 5 bit numbers, + * padding those numbers as necessary. Necessary for encoding Ethereum-style + * addresses as bech32 ones. + * + * @param {Buffer} data + * @param {number} fromWidth + * @param {number} toWidth + * @param {boolean} pad + * @returns {Buffer|null} + */ +export const convertBits = (data: Buffer, fromWidth: number, toWidth: number, pad = true) => { + let acc = 0 + let bits = 0 + const ret = [] + // eslint-disable-next-line no-bitwise + const maxv = (1 << toWidth) - 1 + // tslint:disable-next-line + for (let p = 0; p < data.length; p += 1) { + const value = data[p] + // eslint-disable-next-line no-bitwise + if (value < 0 || value >> fromWidth !== 0) { + return null + } + // eslint-disable-next-line no-bitwise + acc = (acc << fromWidth) | value + bits += fromWidth + while (bits >= toWidth) { + bits -= toWidth + ret.push((acc >> bits) & maxv) + } + } + + if (pad) { + if (bits > 0) { + ret.push((acc << (toWidth - bits)) & maxv) + } + } else if (bits >= fromWidth || (acc << (toWidth - bits)) & maxv) { + return null + } + + return Buffer.from(ret) +} + +/** + * toBech32Address + * + * bech32Encodes a canonical 20-byte Ethereum-style address as a bech32 Harmony + * address. + * + * The expected format is one1
where address and checksum + * are the result of bech32 encoding a Buffer containing the address bytes. + * + * @param {string} 20 byte canonical address + * @returns {string} 38 char bech32 bech32Encoded Harmony address + */ +export const toBech32 = (address: string, useHRP: string = HRP): string => { + if (!isAddress(address)) { + throw new Error('Invalid address format.') + } + + const addrBz = convertBits(Buffer.from(address.replace('0x', ''), 'hex'), 8, 5) + + if (addrBz === null) { + throw new Error('Could not convert byte Buffer to 5-bit Buffer') + } + + return bech32Encode(useHRP, addrBz) +} + +/** + * fromBech32Address + * + * @param {string} address - a valid Harmony bech32 address + * @returns {string} a canonical 20-byte Ethereum-style address + */ +export const fromBech32 = (address: string, useHRP: string = HRP): string => { + const res = bech32Decode(address) + + if (res === null) { + throw new Error('Invalid bech32 address') + } + + const { hrp, data } = res + + if (hrp !== useHRP) { + throw new Error(`Expected hrp to be ${useHRP} but got ${hrp}`) + } + + const buf = convertBits(data, 5, 8, false) + + if (buf === null) { + throw new Error('Could not convert buffer to bytes') + } + + return toChecksumAddress('0x' + buf.toString('hex')) +} diff --git a/packages/web3-shared/evm/utils/bytes.ts b/packages/web3-shared/evm/utils/bytes.ts new file mode 100644 index 000000000000..0919266e21fb --- /dev/null +++ b/packages/web3-shared/evm/utils/bytes.ts @@ -0,0 +1,488 @@ +/* eslint-disable no-plusplus */ +/** + * @packageDocumentation + * @module harmony-crypto + * @hidden + */ + +// This file is ported from ether.js/src.ts/utils/bytes.ts +// and done some fixes + +import * as errors from './errors' + +export type Arrayish = string | ArrayLike + +export interface Hexable { + toHexString(): string +} + +export interface Signature { + r: string + s: string + + /* At least one of the following MUST be specified; the other will be derived */ + recoveryParam?: number + v?: number +} + +/// //////////////////////////// + +export function isHexable(value: any): value is Hexable { + return !!value.toHexString +} + +function addSlice(array: Uint8Array): Uint8Array { + if (typeof array === 'object' && typeof array.slice === 'function') { + return array + } + + // tslint:disable-next-line: only-arrow-functions + array.slice = function () { + const args = Array.prototype.slice.call(arguments) + return addSlice(new Uint8Array(Array.prototype.slice.apply(array, [args[0], args[1]]))) + } + + return array +} + +export function isArrayish(value: any): value is Arrayish { + if ( + !value || + // tslint:disable-next-line: radix + Number.parseInt(String(value.length), 10) !== value.length || + typeof value === 'string' + ) { + return false + } + + // tslint:disable-next-line: prefer-for-of + // eslint-disable-next-line @typescript-eslint/prefer-for-of + for (let i = 0; i < value.length; i++) { + const v = value[i] + // tslint:disable-next-line: radix + if (v < 0 || v >= 256 || Number.parseInt(String(v), 10) !== v) { + return false + } + } + + return true +} + +export function arrayify(value: Arrayish | Hexable): Uint8Array | null { + if (value === null) { + errors.throwError('cannot convert null value to array', errors.INVALID_ARGUMENT, { + arg: 'value', + value, + }) + } + + if (isHexable(value)) { + value = value.toHexString() + } + + if (typeof value === 'string') { + const match = value.match(/^(0x)?[\dA-Fa-f]*$/) + + if (!match) { + errors.throwError('invalid hexidecimal string', errors.INVALID_ARGUMENT, { + arg: 'value', + value, + }) + } + + if (match !== null && match[1] !== '0x') { + errors.throwError('hex string must have 0x prefix', errors.INVALID_ARGUMENT, { + arg: 'value', + value, + }) + } + + value = value.substring(2) + if (value.length % 2) { + value = '0' + value + } + + const result = [] + for (let i = 0; i < value.length; i += 2) { + result.push(Number.parseInt(value.substr(i, 2), 16)) + } + + return addSlice(new Uint8Array(result)) + } + + if (isArrayish(value)) { + return addSlice(new Uint8Array(value)) + } + + errors.throwError('invalid arrayify value', null, { + arg: 'value', + value, + type: typeof value, + }) +} + +export function concat(objects: Arrayish[]): Uint8Array { + if (objects === null) { + throw new Error('concat objects is null') + } + const arrays = [] + let length = 0 + // tslint:disable-next-line: prefer-for-of + // eslint-disable-next-line @typescript-eslint/prefer-for-of + for (let i = 0; i < objects.length; i++) { + const object = arrayify(objects[i]) + if (object == null) { + throw new Error('arrayify failed') + } + arrays.push(object) + length += object.length + } + + const result = new Uint8Array(length) + let offset = 0 + // tslint:disable-next-line: prefer-for-of + // eslint-disable-next-line @typescript-eslint/prefer-for-of + for (let i = 0; i < arrays.length; i++) { + result.set(arrays[i], offset) + offset += arrays[i].length + } + + return addSlice(result) +} + +export function stripZeros(value: Arrayish): Uint8Array { + let result: Uint8Array | null = arrayify(value) + + if (result === null) { + throw new Error('arrayify failed') + } + + if (result.length === 0) { + return result + } + + // Find the first non-zero entry + let start = 0 + while (result[start] === 0) { + start++ + } + + // If we started with zeros, strip them + if (start) { + result = result.slice(start) + } + + return result +} + +export function padZeros(value: Arrayish, length: number): Uint8Array { + const arrayifyValue = arrayify(value) + if (arrayifyValue === null) { + throw new Error('arrayify failed') + } + if (length < arrayifyValue.length) { + throw new Error('cannot pad') + } + + const result = new Uint8Array(length) + result.set(arrayifyValue, length - arrayifyValue.length) + return addSlice(result) +} + +export function isHexString(value: any, length?: number): boolean { + if (typeof value !== 'string' || !value.match(/^0x[\dA-Fa-f]*$/)) { + return false + } + if (length && value.length !== 2 + 2 * length) { + return false + } + return true +} + +const HexCharacters = '0123456789abcdef' + +export function hexlify(value: Arrayish | Hexable | number): string { + if (isHexable(value)) { + return value.toHexString() + } + + if (typeof value === 'number') { + if (value < 0) { + errors.throwError('cannot hexlify negative value', errors.INVALID_ARGUMENT, { + arg: 'value', + value, + }) + } + + // @TODO: Roll this into the above error as a numeric fault (overflow); next version, not backward compatible + // We can about (value == MAX_INT) to as well, since that may indicate we underflowed already + if (value >= 9007199254740991) { + errors.throwError('out-of-range', errors.NUMERIC_FAULT, { + operartion: 'hexlify', + fault: 'out-of-safe-range', + }) + } + + let hex = '' + while (value) { + hex = HexCharacters[value & 0x0f] + hex + value = Math.floor(value / 16) + } + + if (hex.length) { + if (hex.length % 2) { + hex = '0' + hex + } + return '0x' + hex + } + + return '0x00' + } + + if (typeof value === 'string') { + const match = value.match(/^(0x)?[\dA-Fa-f]*$/) + + if (!match) { + errors.throwError('invalid hexidecimal string', errors.INVALID_ARGUMENT, { + arg: 'value', + value, + }) + } + + if (match !== null && match[1] !== '0x') { + errors.throwError('hex string must have 0x prefix', errors.INVALID_ARGUMENT, { + arg: 'value', + value, + }) + } + + if (value.length % 2) { + value = '0x0' + value.substring(2) + } + return value + } + + if (isArrayish(value)) { + const result = [] + // tslint:disable-next-line: prefer-for-of + // eslint-disable-next-line @typescript-eslint/prefer-for-of + // eslint-disable-next-line no-plusplus + // eslint-disable-next-line @typescript-eslint/prefer-for-of + for (let i = 0; i < value.length; i++) { + const v = value[i] + // eslint-disable-next-line no-bitwise + result.push(HexCharacters[(v & 0xf0) >> 4] + HexCharacters[v & 0x0f]) + } + return '0x' + result.join('') + } + + errors.throwError('invalid hexlify value', null, { + arg: 'value', + value, + }) +} + +export function hexDataLength(data: string) { + if (!isHexString(data) || data.length % 2 !== 0) { + return null + } + return (data.length - 2) / 2 +} + +export function hexDataSlice(data: string, offset: number, endOffset?: number): string { + if (!isHexString(data)) { + errors.throwError('invalid hex data', errors.INVALID_ARGUMENT, { + arg: 'value', + value: data, + }) + } + if (data.length % 2 !== 0) { + errors.throwError('hex data length must be even', errors.INVALID_ARGUMENT, { + arg: 'value', + value: data, + }) + } + offset = 2 + 2 * offset + + if (endOffset != null) { + return '0x' + data.substring(offset, 2 + 2 * endOffset) + } + + return '0x' + data.substring(offset) +} + +export function hexStripZeros(value: string): string { + if (!isHexString(value)) { + errors.throwError('invalid hex string', errors.INVALID_ARGUMENT, { + arg: 'value', + value, + }) + } + while (value.length > 3 && value.startsWith('0x0')) { + value = '0x' + value.substring(3) + } + return value +} + +export function hexZeroPad(value: string, length: number): string { + if (!isHexString(value)) { + errors.throwError('invalid hex string', errors.INVALID_ARGUMENT, { + arg: 'value', + value, + }) + } + + while (value.length < 2 * length + 2) { + value = '0x0' + value.substring(2) + } + return value +} + +export function bytesPadLeft(value: string, byteLength: number): string { + if (!isHexString(value)) { + errors.throwError('invalid hex string', errors.INVALID_ARGUMENT, { + arg: 'value', + value, + }) + } + + const striped = value.substring(2) + if (striped.length > byteLength * 2) { + throw new Error(`hex string length = ${striped.length} beyond byteLength=${byteLength}`) + } + const padLength = byteLength * 2 - striped.length + const returnValue = '0x' + '0'.repeat(padLength) + striped + return returnValue +} +export function bytesPadRight(value: string, byteLength: number): string { + if (!isHexString(value)) { + errors.throwError('invalid hex string', errors.INVALID_ARGUMENT, { + arg: 'value', + value, + }) + } + + const striped = value.substring(2) + if (striped.length > byteLength * 2) { + throw new Error(`hex string length = ${striped.length} beyond byteLength=${byteLength}`) + } + const padLength = byteLength * 2 - striped.length + const returnValue = '0x' + striped + '0'.repeat(padLength) + return returnValue +} + +export function isSignature(value: any): value is Signature { + return value && value.r != null && value.s != null +} + +export function splitSignature(signature: Arrayish | Signature): Signature { + if (signature !== undefined) { + let v = 0 + let r = '0x' + let s = '0x' + + if (isSignature(signature)) { + if (signature.v == null && signature.recoveryParam == null) { + errors.throwError('at least on of recoveryParam or v must be specified', errors.INVALID_ARGUMENT, { + argument: 'signature', + value: signature, + }) + } + r = hexZeroPad(signature.r, 32) + s = hexZeroPad(signature.s, 32) + + v = signature.v || 0 + if (typeof v === 'string') { + v = Number.parseInt(v, 16) + } + + let recoveryParam = signature.recoveryParam || 0 + if (recoveryParam === null && signature.v !== null) { + recoveryParam = 1 - (v % 2) + } + v = 27 + recoveryParam + } else { + const bytes: Uint8Array = arrayify(signature) || new Uint8Array() + if (bytes.length !== 65) { + throw new Error('invalid signature') + } + r = hexlify(bytes.slice(0, 32)) + s = hexlify(bytes.slice(32, 64)) + + v = bytes[64] + if (v !== 27 && v !== 28) { + v = 27 + (v % 2) + } + } + + return { + r, + s, + recoveryParam: v - 27, + v, + } + } else { + throw new Error('signature is not found') + } +} + +export function joinSignature(signature: Signature): string { + signature = splitSignature(signature) + + return hexlify(concat([signature.r, signature.s, signature.recoveryParam ? '0x1c' : '0x1b'])) +} + +/** + * hexToByteArray + * + * Convers a hex string to a Uint8Array + * + * @param {string} hex + * @returns {Uint8Array} + */ +export const hexToByteArray = (hex: string): Uint8Array => { + const res = new Uint8Array(hex.length / 2) + + for (let i = 0; i < hex.length; i += 2) { + res[i / 2] = Number.parseInt(hex.substring(i, i + 2), 16) + } + + return res +} + +/** + * hexToIntArray + * + * @param {string} hex + * @returns {number[]} + */ +export const hexToIntArray = (hex: string): number[] => { + if (!hex || !isHex(hex)) { + return [] + } + + const res = [] + + for (let i = 0; i < hex.length; i++) { + const c = hex.charCodeAt(i) + // eslint-disable-next-line no-bitwise + const hi = c >> 8 + // eslint-disable-next-line no-bitwise + const lo = c & 0xff + + hi ? res.push(hi, lo) : res.push(lo) + } + + return res +} + +/** + * isHex + * + * @param {string} str - string to be tested + * @returns {boolean} + */ +export const isHex = (str: string): boolean => { + const plain = str.replace('0x', '') + return /[\da-f]*$/i.test(plain) +} diff --git a/packages/web3-shared/evm/utils/errors.ts b/packages/web3-shared/evm/utils/errors.ts new file mode 100644 index 000000000000..6343cd254e7c --- /dev/null +++ b/packages/web3-shared/evm/utils/errors.ts @@ -0,0 +1,289 @@ +/** + # @harmony-js/crypto +This package provides a collection of apis related to address management, kestore, encoding, and encrypt/decrypt. +## Installation +``` +npm install @harmony-js/crypto +``` +## Usage +```javascript +* const { +* encode, +* decode, +* randomBytes, +* toBech32, +* fromBech32, +* HarmonyAddress, +* generatePrivateKey, +* getPubkeyFromPrivateKey, +* getAddressFromPublicKey, +* getAddressFromPrivateKey, +* encryptPhrase, +* decryptPhrase +* } = require('@harmony-js/crypto'); +* const { isPrivateKey, isAddress, isPublicKey } = require('@harmony-js/utils'); +``` +Address apis +```javascript +const bytes = randomBytes(20); +const addr = new HarmonyAddress(bytes); +console.log(addr.checksum); +console.log(addr.bech32); +console.log(HarmonyAddress.isValidBech32(addr.bech32)); +``` +RLP apis +```javascript +const encoded = '0x89010101010101010101'; +const decoded = '0x010101010101010101'; +console.log(encode(decoded)); +console.log(decode(encoded)); +``` +Keystore apis +```javascript +const prv = generatePrivateKey(); +const pub = getPubkeyFromPrivateKey(prv); +const addr = getAddressFromPublicKey(pub); +const addrPrv = getAddressFromPrivateKey(prv); +console.log(isPrivateKey(prv)); +console.log(isPublicKey(pub)); +console.log(isAddress(addr)); +console.log(isAddress(addrPrv)); +``` +Encrypt/decrypt apis +```javascript +* const { Wallet } = require('@harmony-js/account'); +* const myPhrase = new Wallet().newMnemonic(); +* console.log(myPhrase); +* const pwd = '1234'; +* encryptPhrase(myPhrase, pwd).then((value) => { +* console.log(value); +* decryptPhrase(JSON.parse(value), pwd).then(value => { +* console.log(value); +* }); +* }); +``` + * + * @packageDocumentation + * @module harmony-crypto + */ + +// This file is ported from ether.js/src.ts/errors.ts + +// Unknown Error +/** @hidden */ +export const UNKNOWN_ERROR = 'UNKNOWN_ERROR' + +// Not implemented +/** @hidden */ +export const NOT_IMPLEMENTED = 'NOT_IMPLEMENTED' + +// Missing new operator to an object +// - name: The name of the class +/** @hidden */ +export const MISSING_NEW = 'MISSING_NEW' + +// Call exception +// - transaction: the transaction +// - address?: the contract address +// - args?: The arguments passed into the function +// - method?: The Solidity method signature +// - errorSignature?: The EIP848 error signature +// - errorArgs?: The EIP848 error parameters +// - reason: The reason (only for EIP848 "Error(string)") +/** @hidden */ +export const CALL_EXCEPTION = 'CALL_EXCEPTION' + +// Invalid argument (e.g. value is incompatible with type) to a function: +// - argument: The argument name that was invalid +// - value: The value of the argument +/** @hidden */ +export const INVALID_ARGUMENT = 'INVALID_ARGUMENT' + +// Missing argument to a function: +// - count: The number of arguments received +// - expectedCount: The number of arguments expected +/** @hidden */ +export const MISSING_ARGUMENT = 'MISSING_ARGUMENT' + +// Too many arguments +// - count: The number of arguments received +// - expectedCount: The number of arguments expected +/** @hidden */ +export const UNEXPECTED_ARGUMENT = 'UNEXPECTED_ARGUMENT' + +// Numeric Fault +// - operation: the operation being executed +// - fault: the reason this faulted +/** @hidden */ +export const NUMERIC_FAULT = 'NUMERIC_FAULT' + +// Insufficien funds (< value + gasLimit * gasPrice) +// - transaction: the transaction attempted +/** @hidden */ +export const INSUFFICIENT_FUNDS = 'INSUFFICIENT_FUNDS' + +// Nonce has already been used +// - transaction: the transaction attempted +/** @hidden */ +export const NONCE_EXPIRED = 'NONCE_EXPIRED' + +// The replacement fee for the transaction is too low +// - transaction: the transaction attempted +/** @hidden */ +export const REPLACEMENT_UNDERPRICED = 'REPLACEMENT_UNDERPRICED' + +// Unsupported operation +// - operation +/** @hidden */ +export const UNSUPPORTED_OPERATION = 'UNSUPPORTED_OPERATION' + +// tslint:disable-next-line: variable-name +/** @hidden */ +let _permanentCensorErrors = false +// tslint:disable-next-line: variable-name +/** @hidden */ +let _censorErrors = false + +// @TODO: Enum +/** @hidden */ +export function throwError(message: string, code: string | null | undefined, params: any): never { + if (_censorErrors) { + throw new Error('unknown error') + } + + if (!code) { + code = UNKNOWN_ERROR + } + if (!params) { + params = {} + } + + const messageDetails: string[] = [] + Object.keys(params).forEach((key) => { + try { + messageDetails.push(key + '=' + JSON.stringify(params[key])) + } catch (error) { + messageDetails.push(key + '=' + JSON.stringify(params[key].toString())) + } + }) + // eslint-disable-next-line no-useless-concat + messageDetails.push('version=' + '#version') + + const reason = message + if (messageDetails.length) { + message += ' (' + messageDetails.join(', ') + ')' + } + + // @TODO: Any?? + const error: any = new Error(message) + error.reason = reason + error.code = code + + Object.keys(params).forEach((key) => { + error[key] = params[key] + }) + + throw error +} + +/** @hidden */ +export function checkNew(self: any, kind: any): void { + if (!(self instanceof kind)) { + throwError('missing new', MISSING_NEW, { name: kind.name }) + } +} + +/** @hidden */ +export function checkArgumentCount(count: number, expectedCount: number, suffix?: string): void { + if (!suffix) { + suffix = '' + } + if (count < expectedCount) { + throwError('missing argument' + suffix, MISSING_ARGUMENT, { + count, + expectedCount, + }) + } + if (count > expectedCount) { + throwError('too many arguments' + suffix, UNEXPECTED_ARGUMENT, { + count, + expectedCount, + }) + } +} + +/** @hidden */ +export function setCensorship(censorship: boolean, permanent?: boolean): void { + if (_permanentCensorErrors) { + throwError('error censorship permanent', UNSUPPORTED_OPERATION, { + operation: 'setCensorship', + }) + } + + _censorErrors = !!censorship + _permanentCensorErrors = !!permanent +} + +/** @hidden */ +export function checkNormalize(): void { + try { + // Make sure all forms of normalization are supported + ;['NFD', 'NFC', 'NFKD', 'NFKC'].forEach((form) => { + try { + 'test'.normalize(form) + } catch (error) { + throw new Error('missing ' + form) + } + }) + + if (String.fromCharCode(0xe9).normalize('NFD') !== String.fromCharCode(0x65, 0x0301)) { + throw new Error('broken implementation') + } + } catch (error) { + throwError('platform missing String.prototype.normalize', UNSUPPORTED_OPERATION, { + operation: 'String.prototype.normalize', + // @ts-ignore + form: error.message, + }) + } +} + +/** @hidden */ +const LogLevels: { [name: string]: number } = { + debug: 1, + default: 2, + info: 2, + warn: 3, + error: 4, + off: 5, +} +/** @hidden */ +let LogLevel = LogLevels.default + +/** @hidden */ +export function setLogLevel(logLevel: string): void { + const level = LogLevels[logLevel] + if (level === null) { + warn('invliad log level - ' + logLevel) + return + } + LogLevel = level +} + +/** @hidden */ +function log(logLevel: string, args: [any?, ...any[]]): void { + if (LogLevel > LogLevels[logLevel]) { + return + } + console.log.apply(console, args) +} + +/** @hidden */ +export function warn(...args: [any?, ...any[]]): void { + log('warn', args) +} + +/** @hidden */ +export function info(...args: [any?, ...any[]]): void { + log('info', args) +} diff --git a/packages/web3-shared/evm/utils/index.ts b/packages/web3-shared/evm/utils/index.ts index a74ca021754b..7fb19632caaa 100644 --- a/packages/web3-shared/evm/utils/index.ts +++ b/packages/web3-shared/evm/utils/index.ts @@ -8,3 +8,4 @@ export * from './transaction' export * from './domain' export * from './payload' export * from './provider' +export * from './GetAddress' diff --git a/packages/web3-shared/evm/utils/keccak256.ts b/packages/web3-shared/evm/utils/keccak256.ts new file mode 100644 index 000000000000..4916513f6fd6 --- /dev/null +++ b/packages/web3-shared/evm/utils/keccak256.ts @@ -0,0 +1,18 @@ +/** + * @packageDocumentation + * @module harmony-crypto + * @ignore + */ + +// this file is ported from 'ether.js' and done some fixes +import * as sha3 from 'js-sha3'; + +import { arrayify, Arrayish } from './bytes'; + +export function keccak256(data: Arrayish): string { + const arrayified = arrayify(data); + if (arrayified) { + return '0x' + sha3.keccak_256(arrayified); + } + throw new Error('arrayify failed'); +} \ No newline at end of file diff --git a/packages/web3-shared/evm/utils/keyTool.ts b/packages/web3-shared/evm/utils/keyTool.ts new file mode 100644 index 000000000000..127650f1846d --- /dev/null +++ b/packages/web3-shared/evm/utils/keyTool.ts @@ -0,0 +1,45 @@ +import { fromBech32 } from './bech32' +import * as bytes from './bytes' +import * as errors from './errors' +import { keccak256 } from './keccak256' +import { isBech32Address } from './validators' + +/** + * @function toChecksumAddress + * @param {string} address - raw address + * @return {string} checksumed address + */ +export const toChecksumAddress = (address: string): string => { + if (typeof address === 'string' && isBech32Address(address)) { + address = fromBech32(address) + } + if (typeof address !== 'string' || !address.match(/^0x[\dA-Fa-f]{40}$/)) { + errors.throwError('invalid address', errors.INVALID_ARGUMENT, { + arg: 'address', + value: address, + }) + } + + address = address.toLowerCase() + + const chars = address.substring(2).split('') + + let hashed = new Uint8Array(40) + for (let i = 0; i < 40; i += 1) { + hashed[i] = chars[i].charCodeAt(0) + } + hashed = bytes.arrayify(keccak256(hashed)) || hashed + + for (let i = 0; i < 40; i += 2) { + // eslint-disable-next-line no-bitwise + if (hashed[i >> 1] >> 4 >= 8) { + chars[i] = chars[i].toUpperCase() + } + // eslint-disable-next-line no-bitwise + if ((hashed[i >> 1] & 0x0f) >= 8) { + chars[i + 1] = chars[i + 1].toUpperCase() + } + } + + return '0x' + chars.join('') +} diff --git a/packages/web3-shared/evm/utils/validators.ts b/packages/web3-shared/evm/utils/validators.ts new file mode 100644 index 000000000000..c106c3a1fcca --- /dev/null +++ b/packages/web3-shared/evm/utils/validators.ts @@ -0,0 +1,192 @@ +/** + * @packageDocumentation + * @module harmony-utils + */ + +export const isKeyString = (keyString: string, lengh: number): boolean => { + return !!keyString.replace("0x", "").match(`^[0-9a-fA-F]{${lengh}}$`); +}; +isKeyString.validator = "isKeyString"; + +export const isAddress = (address: string): boolean => { + return isKeyString(address, 40); +}; +isAddress.validator = "isAddress"; + +export const isPrivateKey = (privateKey: string): boolean => { + return isKeyString(privateKey, 64); +}; +isPrivateKey.validator = "isPrivateKey"; + +export const isPublicKey = (publicKey: string): boolean => { + return isKeyString(publicKey, 66); +}; +isPublicKey.validator = "isPublicKey"; + +export const isHash = (hash: string): boolean => { + return isKeyString(hash, 64); +}; +isHash.validator = "isHash"; + +/** + * [isNumber verify param is a Number] + * @param {any} obj [value] + * @return {Boolean} [boolean] + */ +export const isNumber = (obj: any): boolean => { + return obj === +obj; +}; +isNumber.validator = "isNumber"; + +/** + * [isNumber verify param is a Number] + * @param {any} obj [value] + * @return {boolean} [boolean] + */ +export const isInt = (obj: any): boolean => { + return isNumber(obj) && Number.isInteger(obj); +}; + +isInt.validator = "isInt"; + +/** + * [isString verify param is a String] + * @param {any} obj [value] + * @return {Boolean} [boolean] + */ +export const isString = (obj: any): boolean => { + return obj === `${obj}`; +}; + +isString.validator = "isString"; +/** + * [isBoolean verify param is a Boolean] + * @param {any} obj [value] + * @return {Boolean} [boolean] + */ +export const isBoolean = (obj: any): boolean => { + return obj === !!obj; +}; + +isBoolean.validator = "isBoolean"; +/** + * [isArray verify param input is an Array] + * @param {any} obj [value] + * @return {Boolean} [boolean] + */ +export const isArray = (obj: any): boolean => { + return Array.isArray(obj); +}; + +isArray.validator = "isArray"; +/** + * [isJson verify param input is a Json] + * @param {any} obj [value] + * @return {Boolean} [boolean] + */ +export const isJsonString = (obj: any): boolean => { + try { + return !!JSON.parse(obj) && isObject(JSON.parse(obj)); + } catch (e) { + return false; + } +}; +isJsonString.validator = "isJsonString"; + +/** + * [isObject verify param is an Object] + * @param {any} obj [value] + * @return {Boolean} [boolean] + */ +export const isObject = (obj: any): boolean => { + return obj !== null && !Array.isArray(obj) && typeof obj === "object"; +}; +isObject.validator = "isObject"; + +/** + * [isFunction verify param is a Function] + * @param {any} obj [value] + * @return {Boolean} [description] + */ + +export const isFunction = (obj: any): boolean => { + return typeof obj === "function"; +}; +isFunction.validator = "isFunction"; + +export const isHex = (obj: any): boolean => { + if (!isString(obj)) { + throw new Error(`${obj} is not string`); + } + return ( + (obj.startsWith("0x") || obj.startsWith("-0x")) && + isNumber(Number.parseInt(`${obj}`.toLowerCase().replace("0x", ""), 16)) + ); +}; + +isHex.validator = "isHex"; + +export const isHttp = (obj: any): boolean => { + if (!isString(obj)) { + throw new Error(`${obj} is not valid url`); + } else { + return obj.startsWith("http://") || obj.startsWith("https://"); + } +}; +isHttp.validator = "isHttp"; + +export const isWs = (obj: any): boolean => { + if (!isString(obj)) { + throw new Error(`${obj} is not valid url`); + } else { + return obj.startsWith("ws://") || obj.startsWith("wss://"); + } +}; +isWs.validator = "isWs"; + +export enum DefaultBlockParams { + earliest = "earliest", + pending = "pending", + latest = "latest", +} + +export const isBlockNumber = (obj: any): boolean => { + const blockParams = [ + DefaultBlockParams.earliest, + DefaultBlockParams.pending, + DefaultBlockParams.latest, + ]; + + if (!isString(obj)) { + throw new Error(`${obj} is not valid blockNumber`); + } + + return isHex(obj) || blockParams.some((val) => val === obj); +}; +isBlockNumber.validator = "isBlockNumber"; + +export const isBech32Address = (raw: string): boolean => { + return !!raw.match(/^one1[qpzry9x8gf2tvdw0s3jn54khce6mua7l]{38}/); +}; +isBech32Address.validator = "isBech32Address"; + +export const isBech32TestNetAddress = (raw: string): boolean => { + return !!raw.match(/^tone1[qpzry9x8gf2tvdw0s3jn54khce6mua7l]{38}/); +}; +isBech32TestNetAddress.validator = "isBech32TestNetAddress"; + +export const isValidAddress = (address: string): boolean => { + if (!isString(address)) { + throw new Error(`${address} is not string`); + } + if ( + isAddress(address) || + isBech32Address(address) || + isBech32TestNetAddress(address) + ) { + return true; + } else { + return false; + } +}; +isValidAddress.validator = "isValidAddress"; From 88afb76574a81eb4de5b7e4126ca91067ef4289e Mon Sep 17 00:00:00 2001 From: codingsh Date: Mon, 4 Apr 2022 17:10:06 +0100 Subject: [PATCH 06/33] chore(harmony): enabled harmony on savings --- cspell.json | 8 + packages/mask/src/plugins/FindTruman/base.ts | 1 + packages/mask/src/plugins/Savings/base.ts | 1 + packages/web3-shared/evm/assets/chains.json | 2 +- packages/web3-shared/evm/utils/GetAddress.ts | 236 +++++++++---------- packages/web3-shared/evm/utils/bytes.ts | 7 +- packages/web3-shared/evm/utils/errors.ts | 6 +- packages/web3-shared/evm/utils/validators.ts | 192 ++++++++------- pnpm-lock.yaml | 2 + 9 files changed, 229 insertions(+), 226 deletions(-) diff --git a/cspell.json b/cspell.json index 491a5410ab8f..eed2fe9b8c45 100644 --- a/cspell.json +++ b/cspell.json @@ -13,6 +13,10 @@ "pnpm-lock.yaml" ], "words": [ + "hexable", + "underflowed", + "arrayish", + "arrayified", "aave", "adai", "addrs", @@ -24,10 +28,12 @@ "apikey", "arbitrum", "areth", + "arrayify", "artblocks", "arweave", "avalanche", "avax", + "bech", "betanet", "bgcolor", "bignumber", @@ -47,6 +53,7 @@ "canonify", "cashtag", "celo", + "checksumed", "checksummed", "choudhary", "cipherparams", @@ -127,6 +134,7 @@ "lamports", "languagedetector", "lendingpool", + "lengh", "leste", "linkedin", "linkswap", diff --git a/packages/mask/src/plugins/FindTruman/base.ts b/packages/mask/src/plugins/FindTruman/base.ts index e032674c6055..c33f6c6a3ddf 100644 --- a/packages/mask/src/plugins/FindTruman/base.ts +++ b/packages/mask/src/plugins/FindTruman/base.ts @@ -25,6 +25,7 @@ export const base: Plugin.Shared.Definition = { ChainId.Avalanche, ChainId.Aurora, ChainId.Conflux, + ChainId.Harmony, ], }, [NetworkPluginID.PLUGIN_FLOW]: { supportedChainIds: [] }, diff --git a/packages/mask/src/plugins/Savings/base.ts b/packages/mask/src/plugins/Savings/base.ts index bf5b5e4cc122..ccc9ab5a028d 100644 --- a/packages/mask/src/plugins/Savings/base.ts +++ b/packages/mask/src/plugins/Savings/base.ts @@ -27,6 +27,7 @@ export const base: Plugin.Shared.Definition = { ChainId.Aurora, ChainId.Avalanche, ChainId.Fantom, + ChainId.Harmony, ], }, [NetworkPluginID.PLUGIN_FLOW]: { supportedChainIds: [] }, diff --git a/packages/web3-shared/evm/assets/chains.json b/packages/web3-shared/evm/assets/chains.json index dcb2a4e461dc..784947355c1b 100644 --- a/packages/web3-shared/evm/assets/chains.json +++ b/packages/web3-shared/evm/assets/chains.json @@ -2692,7 +2692,7 @@ "features": [], "nativeCurrency": { "name": "ONE", "symbol": "ONE", "decimals": 18 }, "infoURL": "https://www.harmony.one/", - "shortName": "hmy-s0", + "shortName": "hmy", "chainId": 1666600000, "networkId": 1666600000 }, diff --git a/packages/web3-shared/evm/utils/GetAddress.ts b/packages/web3-shared/evm/utils/GetAddress.ts index fe028549b47d..de817f018be4 100644 --- a/packages/web3-shared/evm/utils/GetAddress.ts +++ b/packages/web3-shared/evm/utils/GetAddress.ts @@ -1,10 +1,6 @@ -import { - isAddress, - isBech32Address, - isBech32TestNetAddress, -} from "./validators"; +import { isAddress, isBech32Address, isBech32TestNetAddress } from './validators' -import { fromBech32, toBech32, HRP, tHRP } from "./bech32"; +import { fromBech32, toBech32, HRP, tHRP } from './bech32' /** * ### How to use it? @@ -14,131 +10,133 @@ import { fromBech32, toBech32, HRP, tHRP } from "./bech32"; * const { HarmonyAddress } = require('@harmony-js/crypto'); * * // Step 2: call functions - * const addr = 'one103q7qe5t2505lypvltkqtddaef5tzfxwsse4z7' + */ +// cspell:disable-next-line +/** const addr = 'one103q7qe5t2505lypvltkqtddaef5tzfxwsse4z7' * const res = HarmonyAddress.isValidBech32(addr); * console.log(res); * ``` */ export class HarmonyAddress { - /** - * @example - * ``` - * const addr = 'one103q7qe5t2505lypvltkqtddaef5tzfxwsse4z7' - * const res = HarmonyAddress.isValidBech32(addr); - * console.log(res); - * ``` - */ - static isValidBasic(str: string) { - const toTest = new HarmonyAddress(str); - return toTest.raw === toTest.basic; - } + /** + * @example + * ``` + * const addr = 'one103q7qe5t2505lypvltkqtddaef5tzfxwsse4z7' + * const res = HarmonyAddress.isValidBech32(addr); + * console.log(res); + * ``` + */ + static isValidBasic(str: string) { + const toTest = new HarmonyAddress(str) + return toTest.raw === toTest.basic + } - /** - * @example - * ``` - * const addr = 'one103q7qe5t2505lypvltkqtddaef5tzfxwsse4z7' - * const res = HarmonyAddress.isValidBech32(addr); - * console.log(res); - * ``` - */ - static isValidBech32(str: string) { - const toTest = new HarmonyAddress(str); - return toTest.raw === toTest.bech32; - } + /** + * @example + * ``` + * const addr = 'one103q7qe5t2505lypvltkqtddaef5tzfxwsse4z7' + * const res = HarmonyAddress.isValidBech32(addr); + * console.log(res); + * ``` + */ + static isValidBech32(str: string) { + const toTest = new HarmonyAddress(str) + return toTest.raw === toTest.bech32 + } - /** - * @example - * ``` - * const addr = 'one103q7qe5t2505lypvltkqtddaef5tzfxwsse4z7' - * const res = HarmonyAddress.isValidBech32TestNet(addr); - * console.log(res); - * ``` - */ - static isValidBech32TestNet(str: string) { - const toTest = new HarmonyAddress(str); - return toTest.raw === toTest.bech32TestNet; - } + /** + * @example + * ``` + * const addr = 'one103q7qe5t2505lypvltkqtddaef5tzfxwsse4z7' + * const res = HarmonyAddress.isValidBech32TestNet(addr); + * console.log(res); + * ``` + */ + static isValidBech32TestNet(str: string) { + const toTest = new HarmonyAddress(str) + return toTest.raw === toTest.bech32TestNet + } - raw: string; - basic: string; + raw: string + basic: string - /** - * get basicHex of the address - * - * @example - * ``` - * const addr = 'one103q7qe5t2505lypvltkqtddaef5tzfxwsse4z7' - * const instance = new HarmonyAddress(addr); - * console.log(instance.basicHex); - * ``` - */ - get basicHex() { - return `0x${this.basic}`; - } + /** + * get basicHex of the address + * + * @example + * ``` + * const addr = 'one103q7qe5t2505lypvltkqtddaef5tzfxwsse4z7' + * const instance = new HarmonyAddress(addr); + * console.log(instance.basicHex); + * ``` + */ + get basicHex() { + return `0x${this.basic}` + } - /** - * @example - * ``` - * const addr = 'one103q7qe5t2505lypvltkqtddaef5tzfxwsse4z7' - * const instance = new HarmonyAddress(addr); - * console.log(instance.bech32); - * ``` - */ - get bech32() { - return toBech32(this.basic, HRP); - } + /** + * @example + * ``` + * const addr = 'one103q7qe5t2505lypvltkqtddaef5tzfxwsse4z7' + * const instance = new HarmonyAddress(addr); + * console.log(instance.bech32); + * ``` + */ + get bech32() { + return toBech32(this.basic, HRP) + } - /** - * @example - * ``` - * const addr = 'one103q7qe5t2505lypvltkqtddaef5tzfxwsse4z7' - * const instance = new HarmonyAddress(addr); - * console.log(instance.bech32TestNet); - * ``` - */ - get bech32TestNet() { - return toBech32(this.basic, tHRP); - } + /** + * @example + * ``` + * const addr = 'one103q7qe5t2505lypvltkqtddaef5tzfxwsse4z7' + * const instance = new HarmonyAddress(addr); + * console.log(instance.bech32TestNet); + * ``` + */ + get bech32TestNet() { + return toBech32(this.basic, tHRP) + } - constructor(raw: string) { - this.raw = raw; - this.basic = this.getBasic(this.raw); - } + constructor(raw: string) { + this.raw = raw + this.basic = this.getBasic(this.raw) + } - /** - * Check whether the address has an valid address format - * - * @param addr string, the address - * - * @example - * ``` - * const addr = 'one103q7qe5t2505lypvltkqtddaef5tzfxwsse4z7' - * const instance = new HarmonyAddress(addr); - * const res = instance.getBasic(addr); - * console.log(res) - * ``` - */ - private getBasic(addr: string) { - const basicBool = isAddress(addr); - const bech32Bool = isBech32Address(addr); - const bech32TestNetBool = isBech32TestNetAddress(addr); + /** + * Check whether the address has an valid address format + * + * @param addr string, the address + * + * @example + * ``` + * const addr = 'one103q7qe5t2505lypvltkqtddaef5tzfxwsse4z7' + * const instance = new HarmonyAddress(addr); + * const res = instance.getBasic(addr); + * console.log(res) + * ``` + */ + private getBasic(addr: string) { + const basicBool = isAddress(addr) + const bech32Bool = isBech32Address(addr) + const bech32TestNetBool = isBech32TestNetAddress(addr) - if (basicBool) { - return addr.replace("0x", "").toLowerCase(); - } + if (basicBool) { + return addr.replace('0x', '').toLowerCase() + } - if (bech32Bool) { - const fromB32 = fromBech32(addr, HRP); - return fromB32.replace("0x", "").toLowerCase(); - } + if (bech32Bool) { + const fromB32 = fromBech32(addr, HRP) + return fromB32.replace('0x', '').toLowerCase() + } - if (bech32TestNetBool) { - const fromB32TestNet = fromBech32(addr, tHRP); - return fromB32TestNet.replace("0x", "").toLowerCase(); - } + if (bech32TestNetBool) { + const fromB32TestNet = fromBech32(addr, tHRP) + return fromB32TestNet.replace('0x', '').toLowerCase() + } - throw new Error(`"${addr}" is an invalid address format`); - } + throw new Error(`"${addr}" is an invalid address format`) + } } /** @@ -166,9 +164,9 @@ export class HarmonyAddress { * ``` */ export function getAddress(address: string) { - try { - return new HarmonyAddress(address); - } catch (error) { - throw error; - } + try { + return new HarmonyAddress(address) + } catch (error) { + throw error + } } diff --git a/packages/web3-shared/evm/utils/bytes.ts b/packages/web3-shared/evm/utils/bytes.ts index 0919266e21fb..d44f3de4a988 100644 --- a/packages/web3-shared/evm/utils/bytes.ts +++ b/packages/web3-shared/evm/utils/bytes.ts @@ -84,7 +84,7 @@ export function arrayify(value: Arrayish | Hexable): Uint8Array | null { const match = value.match(/^(0x)?[\dA-Fa-f]*$/) if (!match) { - errors.throwError('invalid hexidecimal string', errors.INVALID_ARGUMENT, { + errors.throwError('invalid hexadecimal string', errors.INVALID_ARGUMENT, { arg: 'value', value, }) @@ -218,13 +218,14 @@ export function hexlify(value: Arrayish | Hexable | number): string { // We can about (value == MAX_INT) to as well, since that may indicate we underflowed already if (value >= 9007199254740991) { errors.throwError('out-of-range', errors.NUMERIC_FAULT, { - operartion: 'hexlify', + operation: 'hexlify', fault: 'out-of-safe-range', }) } let hex = '' while (value) { + // eslint-disable-next-line no-bitwise hex = HexCharacters[value & 0x0f] + hex value = Math.floor(value / 16) } @@ -243,7 +244,7 @@ export function hexlify(value: Arrayish | Hexable | number): string { const match = value.match(/^(0x)?[\dA-Fa-f]*$/) if (!match) { - errors.throwError('invalid hexidecimal string', errors.INVALID_ARGUMENT, { + errors.throwError('invalid hexadecimal string', errors.INVALID_ARGUMENT, { arg: 'value', value, }) diff --git a/packages/web3-shared/evm/utils/errors.ts b/packages/web3-shared/evm/utils/errors.ts index 6343cd254e7c..410dbb26e0f5 100644 --- a/packages/web3-shared/evm/utils/errors.ts +++ b/packages/web3-shared/evm/utils/errors.ts @@ -1,6 +1,6 @@ /** # @harmony-js/crypto -This package provides a collection of apis related to address management, kestore, encoding, and encrypt/decrypt. +This package provides a collection of apis related to address management, keystore, encoding, and encrypt/decrypt. ## Installation ``` npm install @harmony-js/crypto @@ -117,7 +117,7 @@ export const UNEXPECTED_ARGUMENT = 'UNEXPECTED_ARGUMENT' /** @hidden */ export const NUMERIC_FAULT = 'NUMERIC_FAULT' -// Insufficien funds (< value + gasLimit * gasPrice) +// Insufficient funds (< value + gasLimit * gasPrice) // - transaction: the transaction attempted /** @hidden */ export const INSUFFICIENT_FUNDS = 'INSUFFICIENT_FUNDS' @@ -264,7 +264,7 @@ let LogLevel = LogLevels.default export function setLogLevel(logLevel: string): void { const level = LogLevels[logLevel] if (level === null) { - warn('invliad log level - ' + logLevel) + warn('invalid log level - ' + logLevel) return } LogLevel = level diff --git a/packages/web3-shared/evm/utils/validators.ts b/packages/web3-shared/evm/utils/validators.ts index c106c3a1fcca..940d6359764f 100644 --- a/packages/web3-shared/evm/utils/validators.ts +++ b/packages/web3-shared/evm/utils/validators.ts @@ -4,29 +4,29 @@ */ export const isKeyString = (keyString: string, lengh: number): boolean => { - return !!keyString.replace("0x", "").match(`^[0-9a-fA-F]{${lengh}}$`); -}; -isKeyString.validator = "isKeyString"; + return !!keyString.replace('0x', '').match(`^[0-9a-fA-F]{${lengh}}$`) +} +isKeyString.validator = 'isKeyString' export const isAddress = (address: string): boolean => { - return isKeyString(address, 40); -}; -isAddress.validator = "isAddress"; + return isKeyString(address, 40) +} +isAddress.validator = 'isAddress' export const isPrivateKey = (privateKey: string): boolean => { - return isKeyString(privateKey, 64); -}; -isPrivateKey.validator = "isPrivateKey"; + return isKeyString(privateKey, 64) +} +isPrivateKey.validator = 'isPrivateKey' export const isPublicKey = (publicKey: string): boolean => { - return isKeyString(publicKey, 66); -}; -isPublicKey.validator = "isPublicKey"; + return isKeyString(publicKey, 66) +} +isPublicKey.validator = 'isPublicKey' export const isHash = (hash: string): boolean => { - return isKeyString(hash, 64); -}; -isHash.validator = "isHash"; + return isKeyString(hash, 64) +} +isHash.validator = 'isHash' /** * [isNumber verify param is a Number] @@ -34,9 +34,9 @@ isHash.validator = "isHash"; * @return {Boolean} [boolean] */ export const isNumber = (obj: any): boolean => { - return obj === +obj; -}; -isNumber.validator = "isNumber"; + return obj === +obj +} +isNumber.validator = 'isNumber' /** * [isNumber verify param is a Number] @@ -44,10 +44,10 @@ isNumber.validator = "isNumber"; * @return {boolean} [boolean] */ export const isInt = (obj: any): boolean => { - return isNumber(obj) && Number.isInteger(obj); -}; + return isNumber(obj) && Number.isInteger(obj) +} -isInt.validator = "isInt"; +isInt.validator = 'isInt' /** * [isString verify param is a String] @@ -55,43 +55,43 @@ isInt.validator = "isInt"; * @return {Boolean} [boolean] */ export const isString = (obj: any): boolean => { - return obj === `${obj}`; -}; + return obj === obj +} -isString.validator = "isString"; +isString.validator = 'isString' /** * [isBoolean verify param is a Boolean] * @param {any} obj [value] * @return {Boolean} [boolean] */ export const isBoolean = (obj: any): boolean => { - return obj === !!obj; -}; + return obj === !!obj +} -isBoolean.validator = "isBoolean"; +isBoolean.validator = 'isBoolean' /** * [isArray verify param input is an Array] * @param {any} obj [value] * @return {Boolean} [boolean] */ export const isArray = (obj: any): boolean => { - return Array.isArray(obj); -}; + return Array.isArray(obj) +} -isArray.validator = "isArray"; +isArray.validator = 'isArray' /** * [isJson verify param input is a Json] * @param {any} obj [value] * @return {Boolean} [boolean] */ export const isJsonString = (obj: any): boolean => { - try { - return !!JSON.parse(obj) && isObject(JSON.parse(obj)); - } catch (e) { - return false; - } -}; -isJsonString.validator = "isJsonString"; + try { + return !!JSON.parse(obj) && isObject(JSON.parse(obj)) + } catch (error) { + return false + } +} +isJsonString.validator = 'isJsonString' /** * [isObject verify param is an Object] @@ -99,9 +99,9 @@ isJsonString.validator = "isJsonString"; * @return {Boolean} [boolean] */ export const isObject = (obj: any): boolean => { - return obj !== null && !Array.isArray(obj) && typeof obj === "object"; -}; -isObject.validator = "isObject"; + return obj !== null && !Array.isArray(obj) && typeof obj === 'object' +} +isObject.validator = 'isObject' /** * [isFunction verify param is a Function] @@ -110,83 +110,75 @@ isObject.validator = "isObject"; */ export const isFunction = (obj: any): boolean => { - return typeof obj === "function"; -}; -isFunction.validator = "isFunction"; + return typeof obj === 'function' +} +isFunction.validator = 'isFunction' export const isHex = (obj: any): boolean => { - if (!isString(obj)) { - throw new Error(`${obj} is not string`); - } - return ( - (obj.startsWith("0x") || obj.startsWith("-0x")) && - isNumber(Number.parseInt(`${obj}`.toLowerCase().replace("0x", ""), 16)) - ); -}; + if (!isString(obj)) { + throw new Error(`${obj} is not string`) + } + return ( + (obj.startsWith('0x') || obj.startsWith('-0x')) && + isNumber(Number.parseInt(obj.toLowerCase().replace('0x', ''), 16)) + ) +} -isHex.validator = "isHex"; +isHex.validator = 'isHex' export const isHttp = (obj: any): boolean => { - if (!isString(obj)) { - throw new Error(`${obj} is not valid url`); - } else { - return obj.startsWith("http://") || obj.startsWith("https://"); - } -}; -isHttp.validator = "isHttp"; + if (!isString(obj)) { + throw new Error(`${obj} is not valid url`) + } else { + return obj.startsWith('http://') || obj.startsWith('https://') + } +} +isHttp.validator = 'isHttp' export const isWs = (obj: any): boolean => { - if (!isString(obj)) { - throw new Error(`${obj} is not valid url`); - } else { - return obj.startsWith("ws://") || obj.startsWith("wss://"); - } -}; -isWs.validator = "isWs"; + if (!isString(obj)) { + throw new Error(`${obj} is not valid url`) + } else { + return obj.startsWith('ws://') || obj.startsWith('wss://') + } +} +isWs.validator = 'isWs' export enum DefaultBlockParams { - earliest = "earliest", - pending = "pending", - latest = "latest", + earliest = 'earliest', + pending = 'pending', + latest = 'latest', } export const isBlockNumber = (obj: any): boolean => { - const blockParams = [ - DefaultBlockParams.earliest, - DefaultBlockParams.pending, - DefaultBlockParams.latest, - ]; + const blockParams = [DefaultBlockParams.earliest, DefaultBlockParams.pending, DefaultBlockParams.latest] - if (!isString(obj)) { - throw new Error(`${obj} is not valid blockNumber`); - } + if (!isString(obj)) { + throw new Error(`${obj} is not valid blockNumber`) + } - return isHex(obj) || blockParams.some((val) => val === obj); -}; -isBlockNumber.validator = "isBlockNumber"; + return isHex(obj) || blockParams.some((val) => val === obj) +} +isBlockNumber.validator = 'isBlockNumber' export const isBech32Address = (raw: string): boolean => { - return !!raw.match(/^one1[qpzry9x8gf2tvdw0s3jn54khce6mua7l]{38}/); -}; -isBech32Address.validator = "isBech32Address"; + return !!raw.match(/^one1[02-9ac-hj-np-z]{38}/) +} +isBech32Address.validator = 'isBech32Address' export const isBech32TestNetAddress = (raw: string): boolean => { - return !!raw.match(/^tone1[qpzry9x8gf2tvdw0s3jn54khce6mua7l]{38}/); -}; -isBech32TestNetAddress.validator = "isBech32TestNetAddress"; + return !!raw.match(/^tone1[02-9ac-hj-np-z]{38}/) +} +isBech32TestNetAddress.validator = 'isBech32TestNetAddress' export const isValidAddress = (address: string): boolean => { - if (!isString(address)) { - throw new Error(`${address} is not string`); - } - if ( - isAddress(address) || - isBech32Address(address) || - isBech32TestNetAddress(address) - ) { - return true; - } else { - return false; - } -}; -isValidAddress.validator = "isValidAddress"; + if (!isString(address)) { + throw new Error(`${address} is not string`) + } + if (isAddress(address) || isBech32Address(address) || isBech32TestNetAddress(address)) { + return true + } else { + return false + } +} +isValidAddress.validator = 'isValidAddress' diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9a2d61ca17c3..1d4e2e27e68f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1263,6 +1263,7 @@ importers: ethereum-blockies: ^0.1.1 fortmatic: ^2.2.1 fuse.js: ^6.5.3 + js-sha3: 0.8.0 punycode: ^2.1.1 react-use: ^17.3.2 unstated-next: ^1.1.0 @@ -1285,6 +1286,7 @@ importers: ethereum-blockies: 0.1.1 fortmatic: 2.2.1 fuse.js: 6.5.3 + js-sha3: 0.8.0 punycode: 2.1.1 react-use: 17.3.2_react-dom@18.0.0+react@18.0.0 unstated-next: 1.1.0 From eb8f83534f93662f266e748492f453fd7a6b558f Mon Sep 17 00:00:00 2001 From: codingsh Date: Wed, 6 Apr 2022 11:23:55 +0100 Subject: [PATCH 07/33] chore(harmony-crypto): add codingsh package --- cspell.json | 9 +- .../evm/hooks/useERC721ContractDetailed.ts | 3 +- packages/web3-shared/evm/package.json | 5 +- packages/web3-shared/evm/utils/GetAddress.ts | 172 ------ packages/web3-shared/evm/utils/bech32.ts | 240 --------- packages/web3-shared/evm/utils/bytes.ts | 489 ------------------ packages/web3-shared/evm/utils/index.ts | 1 - packages/web3-shared/evm/utils/keccak256.ts | 18 - packages/web3-shared/evm/utils/keyTool.ts | 45 -- pnpm-lock.yaml | 89 +++- 10 files changed, 93 insertions(+), 978 deletions(-) delete mode 100644 packages/web3-shared/evm/utils/GetAddress.ts delete mode 100644 packages/web3-shared/evm/utils/bech32.ts delete mode 100644 packages/web3-shared/evm/utils/bytes.ts delete mode 100644 packages/web3-shared/evm/utils/keccak256.ts delete mode 100644 packages/web3-shared/evm/utils/keyTool.ts diff --git a/cspell.json b/cspell.json index eed2fe9b8c45..33328e42d881 100644 --- a/cspell.json +++ b/cspell.json @@ -13,10 +13,6 @@ "pnpm-lock.yaml" ], "words": [ - "hexable", - "underflowed", - "arrayish", - "arrayified", "aave", "adai", "addrs", @@ -28,7 +24,9 @@ "apikey", "arbitrum", "areth", + "arrayified", "arrayify", + "arrayish", "artblocks", "arweave", "avalanche", @@ -61,6 +59,7 @@ "clearfix", "clonable", "codegen", + "codingsh", "commentid", "consolas", "contenteditable", @@ -105,6 +104,7 @@ "goodghosting", "gundb", "hashmasks", + "hexable", "hexlify", "holoflows", "iconbar", @@ -254,6 +254,7 @@ "typechain", "typehash", "typeson", + "underflowed", "unencrypted", "unreviewed", "unstake", diff --git a/packages/web3-shared/evm/hooks/useERC721ContractDetailed.ts b/packages/web3-shared/evm/hooks/useERC721ContractDetailed.ts index 98dbdfa3460c..6143afafe4cd 100644 --- a/packages/web3-shared/evm/hooks/useERC721ContractDetailed.ts +++ b/packages/web3-shared/evm/hooks/useERC721ContractDetailed.ts @@ -6,8 +6,7 @@ import { useChainId } from './useChainId' import { useERC721TokenContract } from '../contracts/useERC721TokenContract' import { createERC721ContractDetailed, safeNonPayableTransactionCall } from '../utils' import { useOpenseaAPIConstants } from '../constants' -import { fromBech32 } from '../utils/bech32' -import { isBech32Address } from '../utils/validators' +import { fromBech32, isBech32Address } from '@codingsh/harmony-crypto' export function useERC721ContractDetailed(address?: string) { const chainId = useChainId() diff --git a/packages/web3-shared/evm/package.json b/packages/web3-shared/evm/package.json index 49cf7dd29079..800f5e2f0e3b 100644 --- a/packages/web3-shared/evm/package.json +++ b/packages/web3-shared/evm/package.json @@ -5,7 +5,9 @@ "types": "./dist/index.d.ts", "sideEffects": false, "dependencies": { + "@codingsh/harmony-crypto": "0.1.57", "@ensdomains/address-encoder": "^0.2.6", + "@harmony-js/utils": "^0.1.56", "@masknet/shared-base": "workspace:*", "@masknet/web3-constants": "workspace:*", "@masknet/web3-contracts": "workspace:*", @@ -25,8 +27,7 @@ "wallet.ts": "^1.0.1", "web3": "1.5.2", "web3-core-helpers": "1.5.2", - "web3-utils": "1.5.2", - "js-sha3": "0.8.0" + "web3-utils": "1.5.2" }, "devDependencies": { "@types/use-subscription": "^1.0.0" diff --git a/packages/web3-shared/evm/utils/GetAddress.ts b/packages/web3-shared/evm/utils/GetAddress.ts deleted file mode 100644 index de817f018be4..000000000000 --- a/packages/web3-shared/evm/utils/GetAddress.ts +++ /dev/null @@ -1,172 +0,0 @@ -import { isAddress, isBech32Address, isBech32TestNetAddress } from './validators' - -import { fromBech32, toBech32, HRP, tHRP } from './bech32' - -/** - * ### How to use it? - * - * ``` - * // Step 1: import the class - * const { HarmonyAddress } = require('@harmony-js/crypto'); - * - * // Step 2: call functions - */ -// cspell:disable-next-line -/** const addr = 'one103q7qe5t2505lypvltkqtddaef5tzfxwsse4z7' - * const res = HarmonyAddress.isValidBech32(addr); - * console.log(res); - * ``` - */ -export class HarmonyAddress { - /** - * @example - * ``` - * const addr = 'one103q7qe5t2505lypvltkqtddaef5tzfxwsse4z7' - * const res = HarmonyAddress.isValidBech32(addr); - * console.log(res); - * ``` - */ - static isValidBasic(str: string) { - const toTest = new HarmonyAddress(str) - return toTest.raw === toTest.basic - } - - /** - * @example - * ``` - * const addr = 'one103q7qe5t2505lypvltkqtddaef5tzfxwsse4z7' - * const res = HarmonyAddress.isValidBech32(addr); - * console.log(res); - * ``` - */ - static isValidBech32(str: string) { - const toTest = new HarmonyAddress(str) - return toTest.raw === toTest.bech32 - } - - /** - * @example - * ``` - * const addr = 'one103q7qe5t2505lypvltkqtddaef5tzfxwsse4z7' - * const res = HarmonyAddress.isValidBech32TestNet(addr); - * console.log(res); - * ``` - */ - static isValidBech32TestNet(str: string) { - const toTest = new HarmonyAddress(str) - return toTest.raw === toTest.bech32TestNet - } - - raw: string - basic: string - - /** - * get basicHex of the address - * - * @example - * ``` - * const addr = 'one103q7qe5t2505lypvltkqtddaef5tzfxwsse4z7' - * const instance = new HarmonyAddress(addr); - * console.log(instance.basicHex); - * ``` - */ - get basicHex() { - return `0x${this.basic}` - } - - /** - * @example - * ``` - * const addr = 'one103q7qe5t2505lypvltkqtddaef5tzfxwsse4z7' - * const instance = new HarmonyAddress(addr); - * console.log(instance.bech32); - * ``` - */ - get bech32() { - return toBech32(this.basic, HRP) - } - - /** - * @example - * ``` - * const addr = 'one103q7qe5t2505lypvltkqtddaef5tzfxwsse4z7' - * const instance = new HarmonyAddress(addr); - * console.log(instance.bech32TestNet); - * ``` - */ - get bech32TestNet() { - return toBech32(this.basic, tHRP) - } - - constructor(raw: string) { - this.raw = raw - this.basic = this.getBasic(this.raw) - } - - /** - * Check whether the address has an valid address format - * - * @param addr string, the address - * - * @example - * ``` - * const addr = 'one103q7qe5t2505lypvltkqtddaef5tzfxwsse4z7' - * const instance = new HarmonyAddress(addr); - * const res = instance.getBasic(addr); - * console.log(res) - * ``` - */ - private getBasic(addr: string) { - const basicBool = isAddress(addr) - const bech32Bool = isBech32Address(addr) - const bech32TestNetBool = isBech32TestNetAddress(addr) - - if (basicBool) { - return addr.replace('0x', '').toLowerCase() - } - - if (bech32Bool) { - const fromB32 = fromBech32(addr, HRP) - return fromB32.replace('0x', '').toLowerCase() - } - - if (bech32TestNetBool) { - const fromB32TestNet = fromBech32(addr, tHRP) - return fromB32TestNet.replace('0x', '').toLowerCase() - } - - throw new Error(`"${addr}" is an invalid address format`) - } -} - -/** - * Using this function to get Harmony format address - * - * @param address - * - * @example - * ```javascript - * const { Harmony } = require('@harmony-js/core'); - * const { ChainID, ChainType } = require('@harmony-js/utils'); - * const { randomBytes } = require('@harmony-js/crypto') - * - * const hmy = new Harmony( - * 'http://localhost:9500', - * { - * chainType: ChainType.Harmony, - * chainId: ChainID.HmyLocal, - * }, - * ); - * - * const bytes = randomBytes(20); - * const hAddress = hmy.crypto.getAddress(bytes); - * console.log(hAddress) - * ``` - */ -export function getAddress(address: string) { - try { - return new HarmonyAddress(address) - } catch (error) { - throw error - } -} diff --git a/packages/web3-shared/evm/utils/bech32.ts b/packages/web3-shared/evm/utils/bech32.ts deleted file mode 100644 index 8e3d418c53e0..000000000000 --- a/packages/web3-shared/evm/utils/bech32.ts +++ /dev/null @@ -1,240 +0,0 @@ -/* eslint-disable no-bitwise */ -/* eslint-disable @typescript-eslint/prefer-for-of */ -/** - * @packageDocumentation - * @module harmony-crypto - * @hidden - */ - -import { isAddress } from './validators' - -import { toChecksumAddress } from './keyTool' -// This code is taken from https://github.com/sipa/bech32/tree/bdc264f84014c234e908d72026b7b780122be11f/ref/javascript -// Copyright (c) 2017 Pieter Wuille -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -const CHARSET = 'qpzry9x8gf2tvdw0s3jn54khce6mua7l' -const GENERATOR = [0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3] - -const polymod = (values: Buffer): number => { - let chk = 1 - // tslint:disable-next-line - for (let p = 0; p < values.length; p += 1) { - // eslint-disable-next-line no-bitwise - const top = chk >> 25 - // eslint-disable-next-line no-bitwise - chk = ((chk & 0x1ffffff) << 5) ^ values[p] - for (let i = 0; i < 5; i += 1) { - // eslint-disable-next-line no-bitwise - if ((top >> i) & 1) { - // eslint-disable-next-line no-bitwise - chk ^= GENERATOR[i] - } - } - } - return chk -} - -const hrpExpand = (hrp: string): Buffer => { - const ret = [] - let p - for (p = 0; p < hrp.length; p += 1) { - // eslint-disable-next-line no-bitwise - ret.push(hrp.charCodeAt(p) >> 5) - } - ret.push(0) - for (p = 0; p < hrp.length; ++p) { - // eslint-disable-next-line no-bitwise - ret.push(hrp.charCodeAt(p) & 31) - } - return Buffer.from(ret) -} - -function verifyChecksum(hrp: string, data: Buffer) { - return polymod(Buffer.concat([hrpExpand(hrp), data])) === 1 -} - -function createChecksum(hrp: string, data: Buffer) { - const values = Buffer.concat([Buffer.from(hrpExpand(hrp)), data, Buffer.from([0, 0, 0, 0, 0, 0])]) - // var values = hrpExpand(hrp).concat(data).concat([0, 0, 0, 0, 0, 0]); - // eslint-disable-next-line no-bitwise - const mod = polymod(values) ^ 1 - const ret = [] - for (let p = 0; p < 6; p += 1) { - // eslint-disable-next-line no-bitwise - ret.push((mod >> (5 * (5 - p))) & 31) - } - return Buffer.from(ret) -} - -export const bech32Encode = (hrp: string, data: Buffer) => { - const combined = Buffer.concat([data, createChecksum(hrp, data)]) - let ret = hrp + '1' - // tslint:disable-next-line - for (let p = 0; p < combined.length; p += 1) { - ret += CHARSET.charAt(combined[p]) - } - return ret -} - -export const bech32Decode = (bechString: string) => { - let p - let hasLower = false - let hasUpper = false - for (p = 0; p < bechString.length; ++p) { - if (bechString.charCodeAt(p) < 33 || bechString.charCodeAt(p) > 126) { - return null - } - if (bechString.charCodeAt(p) >= 97 && bechString.charCodeAt(p) <= 122) { - hasLower = true - } - if (bechString.charCodeAt(p) >= 65 && bechString.charCodeAt(p) <= 90) { - hasUpper = true - } - } - if (hasLower && hasUpper) { - return null - } - bechString = bechString.toLowerCase() - const pos = bechString.lastIndexOf('1') - if (pos < 1 || pos + 7 > bechString.length || bechString.length > 90) { - return null - } - const hrp = bechString.substring(0, pos) - const data = [] - for (p = pos + 1; p < bechString.length; ++p) { - const d = CHARSET.indexOf(bechString.charAt(p)) - if (d === -1) { - return null - } - data.push(d) - } - - if (!verifyChecksum(hrp, Buffer.from(data))) { - return null - } - - return { hrp, data: Buffer.from(data.slice(0, data.length - 6)) } -} - -// HRP is the human-readable part of Harmony bech32 addresses -export const HRP = 'one' -export const tHRP = 'tone' - -/** - * convertBits - * - * groups buffers of a certain width to buffers of the desired width. - * - * For example, converts byte buffers to buffers of maximum 5 bit numbers, - * padding those numbers as necessary. Necessary for encoding Ethereum-style - * addresses as bech32 ones. - * - * @param {Buffer} data - * @param {number} fromWidth - * @param {number} toWidth - * @param {boolean} pad - * @returns {Buffer|null} - */ -export const convertBits = (data: Buffer, fromWidth: number, toWidth: number, pad = true) => { - let acc = 0 - let bits = 0 - const ret = [] - // eslint-disable-next-line no-bitwise - const maxv = (1 << toWidth) - 1 - // tslint:disable-next-line - for (let p = 0; p < data.length; p += 1) { - const value = data[p] - // eslint-disable-next-line no-bitwise - if (value < 0 || value >> fromWidth !== 0) { - return null - } - // eslint-disable-next-line no-bitwise - acc = (acc << fromWidth) | value - bits += fromWidth - while (bits >= toWidth) { - bits -= toWidth - ret.push((acc >> bits) & maxv) - } - } - - if (pad) { - if (bits > 0) { - ret.push((acc << (toWidth - bits)) & maxv) - } - } else if (bits >= fromWidth || (acc << (toWidth - bits)) & maxv) { - return null - } - - return Buffer.from(ret) -} - -/** - * toBech32Address - * - * bech32Encodes a canonical 20-byte Ethereum-style address as a bech32 Harmony - * address. - * - * The expected format is one1
where address and checksum - * are the result of bech32 encoding a Buffer containing the address bytes. - * - * @param {string} 20 byte canonical address - * @returns {string} 38 char bech32 bech32Encoded Harmony address - */ -export const toBech32 = (address: string, useHRP: string = HRP): string => { - if (!isAddress(address)) { - throw new Error('Invalid address format.') - } - - const addrBz = convertBits(Buffer.from(address.replace('0x', ''), 'hex'), 8, 5) - - if (addrBz === null) { - throw new Error('Could not convert byte Buffer to 5-bit Buffer') - } - - return bech32Encode(useHRP, addrBz) -} - -/** - * fromBech32Address - * - * @param {string} address - a valid Harmony bech32 address - * @returns {string} a canonical 20-byte Ethereum-style address - */ -export const fromBech32 = (address: string, useHRP: string = HRP): string => { - const res = bech32Decode(address) - - if (res === null) { - throw new Error('Invalid bech32 address') - } - - const { hrp, data } = res - - if (hrp !== useHRP) { - throw new Error(`Expected hrp to be ${useHRP} but got ${hrp}`) - } - - const buf = convertBits(data, 5, 8, false) - - if (buf === null) { - throw new Error('Could not convert buffer to bytes') - } - - return toChecksumAddress('0x' + buf.toString('hex')) -} diff --git a/packages/web3-shared/evm/utils/bytes.ts b/packages/web3-shared/evm/utils/bytes.ts deleted file mode 100644 index d44f3de4a988..000000000000 --- a/packages/web3-shared/evm/utils/bytes.ts +++ /dev/null @@ -1,489 +0,0 @@ -/* eslint-disable no-plusplus */ -/** - * @packageDocumentation - * @module harmony-crypto - * @hidden - */ - -// This file is ported from ether.js/src.ts/utils/bytes.ts -// and done some fixes - -import * as errors from './errors' - -export type Arrayish = string | ArrayLike - -export interface Hexable { - toHexString(): string -} - -export interface Signature { - r: string - s: string - - /* At least one of the following MUST be specified; the other will be derived */ - recoveryParam?: number - v?: number -} - -/// //////////////////////////// - -export function isHexable(value: any): value is Hexable { - return !!value.toHexString -} - -function addSlice(array: Uint8Array): Uint8Array { - if (typeof array === 'object' && typeof array.slice === 'function') { - return array - } - - // tslint:disable-next-line: only-arrow-functions - array.slice = function () { - const args = Array.prototype.slice.call(arguments) - return addSlice(new Uint8Array(Array.prototype.slice.apply(array, [args[0], args[1]]))) - } - - return array -} - -export function isArrayish(value: any): value is Arrayish { - if ( - !value || - // tslint:disable-next-line: radix - Number.parseInt(String(value.length), 10) !== value.length || - typeof value === 'string' - ) { - return false - } - - // tslint:disable-next-line: prefer-for-of - // eslint-disable-next-line @typescript-eslint/prefer-for-of - for (let i = 0; i < value.length; i++) { - const v = value[i] - // tslint:disable-next-line: radix - if (v < 0 || v >= 256 || Number.parseInt(String(v), 10) !== v) { - return false - } - } - - return true -} - -export function arrayify(value: Arrayish | Hexable): Uint8Array | null { - if (value === null) { - errors.throwError('cannot convert null value to array', errors.INVALID_ARGUMENT, { - arg: 'value', - value, - }) - } - - if (isHexable(value)) { - value = value.toHexString() - } - - if (typeof value === 'string') { - const match = value.match(/^(0x)?[\dA-Fa-f]*$/) - - if (!match) { - errors.throwError('invalid hexadecimal string', errors.INVALID_ARGUMENT, { - arg: 'value', - value, - }) - } - - if (match !== null && match[1] !== '0x') { - errors.throwError('hex string must have 0x prefix', errors.INVALID_ARGUMENT, { - arg: 'value', - value, - }) - } - - value = value.substring(2) - if (value.length % 2) { - value = '0' + value - } - - const result = [] - for (let i = 0; i < value.length; i += 2) { - result.push(Number.parseInt(value.substr(i, 2), 16)) - } - - return addSlice(new Uint8Array(result)) - } - - if (isArrayish(value)) { - return addSlice(new Uint8Array(value)) - } - - errors.throwError('invalid arrayify value', null, { - arg: 'value', - value, - type: typeof value, - }) -} - -export function concat(objects: Arrayish[]): Uint8Array { - if (objects === null) { - throw new Error('concat objects is null') - } - const arrays = [] - let length = 0 - // tslint:disable-next-line: prefer-for-of - // eslint-disable-next-line @typescript-eslint/prefer-for-of - for (let i = 0; i < objects.length; i++) { - const object = arrayify(objects[i]) - if (object == null) { - throw new Error('arrayify failed') - } - arrays.push(object) - length += object.length - } - - const result = new Uint8Array(length) - let offset = 0 - // tslint:disable-next-line: prefer-for-of - // eslint-disable-next-line @typescript-eslint/prefer-for-of - for (let i = 0; i < arrays.length; i++) { - result.set(arrays[i], offset) - offset += arrays[i].length - } - - return addSlice(result) -} - -export function stripZeros(value: Arrayish): Uint8Array { - let result: Uint8Array | null = arrayify(value) - - if (result === null) { - throw new Error('arrayify failed') - } - - if (result.length === 0) { - return result - } - - // Find the first non-zero entry - let start = 0 - while (result[start] === 0) { - start++ - } - - // If we started with zeros, strip them - if (start) { - result = result.slice(start) - } - - return result -} - -export function padZeros(value: Arrayish, length: number): Uint8Array { - const arrayifyValue = arrayify(value) - if (arrayifyValue === null) { - throw new Error('arrayify failed') - } - if (length < arrayifyValue.length) { - throw new Error('cannot pad') - } - - const result = new Uint8Array(length) - result.set(arrayifyValue, length - arrayifyValue.length) - return addSlice(result) -} - -export function isHexString(value: any, length?: number): boolean { - if (typeof value !== 'string' || !value.match(/^0x[\dA-Fa-f]*$/)) { - return false - } - if (length && value.length !== 2 + 2 * length) { - return false - } - return true -} - -const HexCharacters = '0123456789abcdef' - -export function hexlify(value: Arrayish | Hexable | number): string { - if (isHexable(value)) { - return value.toHexString() - } - - if (typeof value === 'number') { - if (value < 0) { - errors.throwError('cannot hexlify negative value', errors.INVALID_ARGUMENT, { - arg: 'value', - value, - }) - } - - // @TODO: Roll this into the above error as a numeric fault (overflow); next version, not backward compatible - // We can about (value == MAX_INT) to as well, since that may indicate we underflowed already - if (value >= 9007199254740991) { - errors.throwError('out-of-range', errors.NUMERIC_FAULT, { - operation: 'hexlify', - fault: 'out-of-safe-range', - }) - } - - let hex = '' - while (value) { - // eslint-disable-next-line no-bitwise - hex = HexCharacters[value & 0x0f] + hex - value = Math.floor(value / 16) - } - - if (hex.length) { - if (hex.length % 2) { - hex = '0' + hex - } - return '0x' + hex - } - - return '0x00' - } - - if (typeof value === 'string') { - const match = value.match(/^(0x)?[\dA-Fa-f]*$/) - - if (!match) { - errors.throwError('invalid hexadecimal string', errors.INVALID_ARGUMENT, { - arg: 'value', - value, - }) - } - - if (match !== null && match[1] !== '0x') { - errors.throwError('hex string must have 0x prefix', errors.INVALID_ARGUMENT, { - arg: 'value', - value, - }) - } - - if (value.length % 2) { - value = '0x0' + value.substring(2) - } - return value - } - - if (isArrayish(value)) { - const result = [] - // tslint:disable-next-line: prefer-for-of - // eslint-disable-next-line @typescript-eslint/prefer-for-of - // eslint-disable-next-line no-plusplus - // eslint-disable-next-line @typescript-eslint/prefer-for-of - for (let i = 0; i < value.length; i++) { - const v = value[i] - // eslint-disable-next-line no-bitwise - result.push(HexCharacters[(v & 0xf0) >> 4] + HexCharacters[v & 0x0f]) - } - return '0x' + result.join('') - } - - errors.throwError('invalid hexlify value', null, { - arg: 'value', - value, - }) -} - -export function hexDataLength(data: string) { - if (!isHexString(data) || data.length % 2 !== 0) { - return null - } - return (data.length - 2) / 2 -} - -export function hexDataSlice(data: string, offset: number, endOffset?: number): string { - if (!isHexString(data)) { - errors.throwError('invalid hex data', errors.INVALID_ARGUMENT, { - arg: 'value', - value: data, - }) - } - if (data.length % 2 !== 0) { - errors.throwError('hex data length must be even', errors.INVALID_ARGUMENT, { - arg: 'value', - value: data, - }) - } - offset = 2 + 2 * offset - - if (endOffset != null) { - return '0x' + data.substring(offset, 2 + 2 * endOffset) - } - - return '0x' + data.substring(offset) -} - -export function hexStripZeros(value: string): string { - if (!isHexString(value)) { - errors.throwError('invalid hex string', errors.INVALID_ARGUMENT, { - arg: 'value', - value, - }) - } - while (value.length > 3 && value.startsWith('0x0')) { - value = '0x' + value.substring(3) - } - return value -} - -export function hexZeroPad(value: string, length: number): string { - if (!isHexString(value)) { - errors.throwError('invalid hex string', errors.INVALID_ARGUMENT, { - arg: 'value', - value, - }) - } - - while (value.length < 2 * length + 2) { - value = '0x0' + value.substring(2) - } - return value -} - -export function bytesPadLeft(value: string, byteLength: number): string { - if (!isHexString(value)) { - errors.throwError('invalid hex string', errors.INVALID_ARGUMENT, { - arg: 'value', - value, - }) - } - - const striped = value.substring(2) - if (striped.length > byteLength * 2) { - throw new Error(`hex string length = ${striped.length} beyond byteLength=${byteLength}`) - } - const padLength = byteLength * 2 - striped.length - const returnValue = '0x' + '0'.repeat(padLength) + striped - return returnValue -} -export function bytesPadRight(value: string, byteLength: number): string { - if (!isHexString(value)) { - errors.throwError('invalid hex string', errors.INVALID_ARGUMENT, { - arg: 'value', - value, - }) - } - - const striped = value.substring(2) - if (striped.length > byteLength * 2) { - throw new Error(`hex string length = ${striped.length} beyond byteLength=${byteLength}`) - } - const padLength = byteLength * 2 - striped.length - const returnValue = '0x' + striped + '0'.repeat(padLength) - return returnValue -} - -export function isSignature(value: any): value is Signature { - return value && value.r != null && value.s != null -} - -export function splitSignature(signature: Arrayish | Signature): Signature { - if (signature !== undefined) { - let v = 0 - let r = '0x' - let s = '0x' - - if (isSignature(signature)) { - if (signature.v == null && signature.recoveryParam == null) { - errors.throwError('at least on of recoveryParam or v must be specified', errors.INVALID_ARGUMENT, { - argument: 'signature', - value: signature, - }) - } - r = hexZeroPad(signature.r, 32) - s = hexZeroPad(signature.s, 32) - - v = signature.v || 0 - if (typeof v === 'string') { - v = Number.parseInt(v, 16) - } - - let recoveryParam = signature.recoveryParam || 0 - if (recoveryParam === null && signature.v !== null) { - recoveryParam = 1 - (v % 2) - } - v = 27 + recoveryParam - } else { - const bytes: Uint8Array = arrayify(signature) || new Uint8Array() - if (bytes.length !== 65) { - throw new Error('invalid signature') - } - r = hexlify(bytes.slice(0, 32)) - s = hexlify(bytes.slice(32, 64)) - - v = bytes[64] - if (v !== 27 && v !== 28) { - v = 27 + (v % 2) - } - } - - return { - r, - s, - recoveryParam: v - 27, - v, - } - } else { - throw new Error('signature is not found') - } -} - -export function joinSignature(signature: Signature): string { - signature = splitSignature(signature) - - return hexlify(concat([signature.r, signature.s, signature.recoveryParam ? '0x1c' : '0x1b'])) -} - -/** - * hexToByteArray - * - * Convers a hex string to a Uint8Array - * - * @param {string} hex - * @returns {Uint8Array} - */ -export const hexToByteArray = (hex: string): Uint8Array => { - const res = new Uint8Array(hex.length / 2) - - for (let i = 0; i < hex.length; i += 2) { - res[i / 2] = Number.parseInt(hex.substring(i, i + 2), 16) - } - - return res -} - -/** - * hexToIntArray - * - * @param {string} hex - * @returns {number[]} - */ -export const hexToIntArray = (hex: string): number[] => { - if (!hex || !isHex(hex)) { - return [] - } - - const res = [] - - for (let i = 0; i < hex.length; i++) { - const c = hex.charCodeAt(i) - // eslint-disable-next-line no-bitwise - const hi = c >> 8 - // eslint-disable-next-line no-bitwise - const lo = c & 0xff - - hi ? res.push(hi, lo) : res.push(lo) - } - - return res -} - -/** - * isHex - * - * @param {string} str - string to be tested - * @returns {boolean} - */ -export const isHex = (str: string): boolean => { - const plain = str.replace('0x', '') - return /[\da-f]*$/i.test(plain) -} diff --git a/packages/web3-shared/evm/utils/index.ts b/packages/web3-shared/evm/utils/index.ts index 7fb19632caaa..a74ca021754b 100644 --- a/packages/web3-shared/evm/utils/index.ts +++ b/packages/web3-shared/evm/utils/index.ts @@ -8,4 +8,3 @@ export * from './transaction' export * from './domain' export * from './payload' export * from './provider' -export * from './GetAddress' diff --git a/packages/web3-shared/evm/utils/keccak256.ts b/packages/web3-shared/evm/utils/keccak256.ts deleted file mode 100644 index 4916513f6fd6..000000000000 --- a/packages/web3-shared/evm/utils/keccak256.ts +++ /dev/null @@ -1,18 +0,0 @@ -/** - * @packageDocumentation - * @module harmony-crypto - * @ignore - */ - -// this file is ported from 'ether.js' and done some fixes -import * as sha3 from 'js-sha3'; - -import { arrayify, Arrayish } from './bytes'; - -export function keccak256(data: Arrayish): string { - const arrayified = arrayify(data); - if (arrayified) { - return '0x' + sha3.keccak_256(arrayified); - } - throw new Error('arrayify failed'); -} \ No newline at end of file diff --git a/packages/web3-shared/evm/utils/keyTool.ts b/packages/web3-shared/evm/utils/keyTool.ts deleted file mode 100644 index 127650f1846d..000000000000 --- a/packages/web3-shared/evm/utils/keyTool.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { fromBech32 } from './bech32' -import * as bytes from './bytes' -import * as errors from './errors' -import { keccak256 } from './keccak256' -import { isBech32Address } from './validators' - -/** - * @function toChecksumAddress - * @param {string} address - raw address - * @return {string} checksumed address - */ -export const toChecksumAddress = (address: string): string => { - if (typeof address === 'string' && isBech32Address(address)) { - address = fromBech32(address) - } - if (typeof address !== 'string' || !address.match(/^0x[\dA-Fa-f]{40}$/)) { - errors.throwError('invalid address', errors.INVALID_ARGUMENT, { - arg: 'address', - value: address, - }) - } - - address = address.toLowerCase() - - const chars = address.substring(2).split('') - - let hashed = new Uint8Array(40) - for (let i = 0; i < 40; i += 1) { - hashed[i] = chars[i].charCodeAt(0) - } - hashed = bytes.arrayify(keccak256(hashed)) || hashed - - for (let i = 0; i < 40; i += 2) { - // eslint-disable-next-line no-bitwise - if (hashed[i >> 1] >> 4 >= 8) { - chars[i] = chars[i].toUpperCase() - } - // eslint-disable-next-line no-bitwise - if ((hashed[i >> 1] & 0x0f) >= 8) { - chars[i + 1] = chars[i + 1].toUpperCase() - } - } - - return '0x' + chars.join('') -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1d4e2e27e68f..52d6d990fdaa 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1251,7 +1251,9 @@ importers: packages/web3-shared/evm: specifiers: + '@codingsh/harmony-crypto': 0.1.57 '@ensdomains/address-encoder': ^0.2.6 + '@harmony-js/utils': ^0.1.56 '@masknet/shared-base': workspace:* '@masknet/web3-constants': workspace:* '@masknet/web3-contracts': workspace:* @@ -1263,7 +1265,6 @@ importers: ethereum-blockies: ^0.1.1 fortmatic: ^2.2.1 fuse.js: ^6.5.3 - js-sha3: 0.8.0 punycode: ^2.1.1 react-use: ^17.3.2 unstated-next: ^1.1.0 @@ -1275,7 +1276,9 @@ importers: web3-core-helpers: 1.5.2 web3-utils: 1.5.2 dependencies: + '@codingsh/harmony-crypto': 0.1.57 '@ensdomains/address-encoder': 0.2.6 + '@harmony-js/utils': 0.1.56 '@masknet/shared-base': link:../../shared-base '@masknet/web3-constants': link:../../web3-constants '@masknet/web3-contracts': link:../../web3-contracts @@ -1286,7 +1289,6 @@ importers: ethereum-blockies: 0.1.1 fortmatic: 2.2.1 fuse.js: 6.5.3 - js-sha3: 0.8.0 punycode: 2.1.1 react-use: 17.3.2_react-dom@18.0.0+react@18.0.0 unstated-next: 1.1.0 @@ -4706,6 +4708,23 @@ packages: minimist: 1.2.5 dev: true + /@codingsh/harmony-crypto/0.1.57: + resolution: {integrity: sha512-rBpna+JgCCv2LiG9t7mFrH8QUdKGNygAd72gyZqLFrqspAv67w9M2Zwf7DUyAFibeOCVFGUuzqoPcYjF4wCZQw==} + dependencies: + '@harmony-js/utils': 0.1.56 + aes-js: 3.1.2 + bip39: 2.6.0 + bn.js: 4.12.0 + elliptic: 6.5.4 + hdkey: 1.1.2 + hmac-drbg: 1.0.1 + js-sha3: 0.8.0 + pbkdf2: 3.1.2 + scrypt-js: 3.0.1 + scrypt-shim: 0.0.1-security + uuid: 3.4.0 + dev: false + /@commitlint/cli/16.2.3_@swc+core@1.2.148: resolution: {integrity: sha512-VsJBQLvhhlOgEfxs/Z5liYuK0dXqLE5hz1VJzLBxiOxG31kL/X5Q4OvK292BmO7IGZcm1yJE3XQPWSiFaEHbWA==} engines: {node: '>=v12'} @@ -5997,6 +6016,13 @@ packages: resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} dev: true + /@harmony-js/utils/0.1.56: + resolution: {integrity: sha512-XoYYIMoK/mSxPkxFd25dY/wScIWWevoTrHoFdlFd8N7GWlilfdgQEF5vO+4BA6hyDJ4ryfdLnGc6W6Hz+5qs2A==} + dependencies: + '@types/bn.js': 4.11.6 + bn.js: 4.12.0 + dev: false + /@hookform/resolvers/2.8.8_react-hook-form@7.28.1: resolution: {integrity: sha512-meAEDur1IJBfKyTo9yPYAuzjIfrxA7m9Ov+1nxaW/YupsqMeseWifoUjWK03+hz/RJizsVQAaUjVxFEkyu0GWg==} peerDependencies: @@ -12402,12 +12428,21 @@ packages: resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} dependencies: file-uri-to-path: 1.0.0 - optional: true /bintrees/1.0.2: resolution: {integrity: sha1-SfiW1uhYpKSZ34XDj7OZua/4QPg=} dev: false + /bip39/2.6.0: + resolution: {integrity: sha512-RrnQRG2EgEoqO24ea+Q/fftuPUZLmrEM3qNhhGsA3PbaXaCW791LTzPuVyx/VprXQcTbPJ3K3UeTna8ZnVl2sg==} + dependencies: + create-hash: 1.2.0 + pbkdf2: 3.1.2 + randombytes: 2.1.0 + safe-buffer: 5.2.1 + unorm: 1.6.0 + dev: false + /bip39/3.0.4: resolution: {integrity: sha512-YZKQlb752TrUWqHWj7XAwCSjYEgGAk+/Aas3V7NyjQeZYsztO8JnQUaCWhcnL4T+jL8nvB8typ2jRPzTlgugNw==} dependencies: @@ -12417,6 +12452,12 @@ packages: randombytes: 2.1.0 dev: false + /bip66/1.1.5: + resolution: {integrity: sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI=} + dependencies: + safe-buffer: 5.2.1 + dev: false + /blakejs/1.1.1: resolution: {integrity: sha512-bLG6PHOCZJKNshTjGRBvET0vTciwQE6zFKOKKXPDJfwFBd4Ac0yBfPZqcGvGJap50l7ktvlpFqc2jGVaUgbJgg==} @@ -14936,6 +14977,15 @@ packages: tslib: 2.3.1 dev: true + /drbg.js/1.0.1: + resolution: {integrity: sha1-Pja2xCs3BDgjzbwzLVjzHiRFSAs=} + engines: {node: '>=0.10'} + dependencies: + browserify-aes: 1.2.0 + create-hash: 1.2.0 + create-hmac: 1.1.7 + dev: false + /duplexer2/0.1.4: resolution: {integrity: sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=} dependencies: @@ -16491,7 +16541,6 @@ packages: /file-uri-to-path/1.0.0: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - optional: true /fill-range/4.0.0: resolution: {integrity: sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=} @@ -17666,6 +17715,14 @@ packages: space-separated-tokens: 1.1.5 dev: true + /hdkey/1.1.2: + resolution: {integrity: sha512-PTQ4VKu0oRnCrYfLp04iQZ7T2Cxz0UsEXYauk2j8eh6PJXCpbXuCFhOmtIFtbET0i3PMWmHN9J11gU8LEgUljQ==} + dependencies: + bs58check: 2.1.2 + safe-buffer: 5.2.1 + secp256k1: 3.8.0 + dev: false + /he/1.2.0: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true @@ -21100,7 +21157,6 @@ packages: /nan/2.15.0: resolution: {integrity: sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==} - optional: true /nano-base32/1.0.1: resolution: {integrity: sha1-ulSMh578+5DaHE2eCX20pGySVe8=} @@ -23978,6 +24034,24 @@ packages: /scrypt-js/3.0.1: resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} + /scrypt-shim/0.0.1-security: + resolution: {integrity: sha512-hDwaae2GbwG7os3qrjrvpXaiPf5RBSpFqmJIAIGwRz3Yu+VPU5VGfWYmLK49Jf2zQ69UKI1VeieB7Kp+iNfNgw==} + dev: false + + /secp256k1/3.8.0: + resolution: {integrity: sha512-k5ke5avRZbtl9Tqx/SA7CbY3NF6Ro+Sj9cZxezFzuBlLDmyqPiL8hJJ+EmzD8Ig4LUDByHJ3/iPOVoRixs/hmw==} + engines: {node: '>=4.0.0'} + dependencies: + bindings: 1.5.0 + bip66: 1.1.5 + bn.js: 4.12.0 + create-hash: 1.2.0 + drbg.js: 1.0.1 + elliptic: 6.5.4 + nan: 2.15.0 + safe-buffer: 5.2.1 + dev: false + /secp256k1/4.0.2: resolution: {integrity: sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg==} engines: {node: '>=10.0.0'} @@ -26231,6 +26305,11 @@ packages: resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} engines: {node: '>= 10.0.0'} + /unorm/1.6.0: + resolution: {integrity: sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==} + engines: {node: '>= 0.4.0'} + dev: false + /unpipe/1.0.0: resolution: {integrity: sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=} engines: {node: '>= 0.8'} From 6aa24cdd9bab46c94ce0b4ce9280ea3ee727877c Mon Sep 17 00:00:00 2001 From: codingsh Date: Thu, 14 Apr 2022 12:58:08 +0100 Subject: [PATCH 08/33] chore(harmony): disable bech32 --- .../evm/hooks/useERC721ContractDetailed.ts | 10 +- packages/web3-shared/evm/package.json | 4 +- packages/web3-shared/evm/utils/errors.ts | 289 ------------------ pnpm-lock.yaml | 8 +- 4 files changed, 11 insertions(+), 300 deletions(-) delete mode 100644 packages/web3-shared/evm/utils/errors.ts diff --git a/packages/web3-shared/evm/hooks/useERC721ContractDetailed.ts b/packages/web3-shared/evm/hooks/useERC721ContractDetailed.ts index c969276b3d0d..ef807538f58c 100644 --- a/packages/web3-shared/evm/hooks/useERC721ContractDetailed.ts +++ b/packages/web3-shared/evm/hooks/useERC721ContractDetailed.ts @@ -6,7 +6,6 @@ import { useChainId } from './useChainId' import { useERC721TokenContract } from '../contracts/useERC721TokenContract' import { createERC721ContractDetailed, safeNonPayableTransactionCall } from '../utils' import { getOpenseaAPIConstants } from '../constants' -import { fromBech32, isBech32Address } from '@codingsh/harmony-crypto' export function useERC721ContractDetailed(address?: string) { const chainId = useChainId() @@ -29,10 +28,11 @@ async function getERC721ContractDetailedFromChain(address: string, chainId: Chai result.status === 'fulfilled' ? result.value : '', ) as string[] - if (chainId === 1666600000) { - const addressONE = isBech32Address(address) ? fromBech32(address) : address - return createERC721ContractDetailed(chainId, addressONE, name, symbol, baseURI) - } + // todo add fixed bech32 harmony + // if (chainId === 1666600000) { + // const addressONE = isBech32Address(address) ? fromBech32(address) : address + // return createERC721ContractDetailed(chainId, addressONE, name, symbol, baseURI) + // } return createERC721ContractDetailed(chainId, address, name, symbol, baseURI) } diff --git a/packages/web3-shared/evm/package.json b/packages/web3-shared/evm/package.json index 800f5e2f0e3b..c75bae139701 100644 --- a/packages/web3-shared/evm/package.json +++ b/packages/web3-shared/evm/package.json @@ -5,9 +5,9 @@ "types": "./dist/index.d.ts", "sideEffects": false, "dependencies": { - "@codingsh/harmony-crypto": "0.1.57", - "@ensdomains/address-encoder": "^0.2.6", + "@codingsh/harmony-crypto": "0.1.58", "@harmony-js/utils": "^0.1.56", + "@ensdomains/address-encoder": "^0.2.6", "@masknet/shared-base": "workspace:*", "@masknet/web3-constants": "workspace:*", "@masknet/web3-contracts": "workspace:*", diff --git a/packages/web3-shared/evm/utils/errors.ts b/packages/web3-shared/evm/utils/errors.ts deleted file mode 100644 index 410dbb26e0f5..000000000000 --- a/packages/web3-shared/evm/utils/errors.ts +++ /dev/null @@ -1,289 +0,0 @@ -/** - # @harmony-js/crypto -This package provides a collection of apis related to address management, keystore, encoding, and encrypt/decrypt. -## Installation -``` -npm install @harmony-js/crypto -``` -## Usage -```javascript -* const { -* encode, -* decode, -* randomBytes, -* toBech32, -* fromBech32, -* HarmonyAddress, -* generatePrivateKey, -* getPubkeyFromPrivateKey, -* getAddressFromPublicKey, -* getAddressFromPrivateKey, -* encryptPhrase, -* decryptPhrase -* } = require('@harmony-js/crypto'); -* const { isPrivateKey, isAddress, isPublicKey } = require('@harmony-js/utils'); -``` -Address apis -```javascript -const bytes = randomBytes(20); -const addr = new HarmonyAddress(bytes); -console.log(addr.checksum); -console.log(addr.bech32); -console.log(HarmonyAddress.isValidBech32(addr.bech32)); -``` -RLP apis -```javascript -const encoded = '0x89010101010101010101'; -const decoded = '0x010101010101010101'; -console.log(encode(decoded)); -console.log(decode(encoded)); -``` -Keystore apis -```javascript -const prv = generatePrivateKey(); -const pub = getPubkeyFromPrivateKey(prv); -const addr = getAddressFromPublicKey(pub); -const addrPrv = getAddressFromPrivateKey(prv); -console.log(isPrivateKey(prv)); -console.log(isPublicKey(pub)); -console.log(isAddress(addr)); -console.log(isAddress(addrPrv)); -``` -Encrypt/decrypt apis -```javascript -* const { Wallet } = require('@harmony-js/account'); -* const myPhrase = new Wallet().newMnemonic(); -* console.log(myPhrase); -* const pwd = '1234'; -* encryptPhrase(myPhrase, pwd).then((value) => { -* console.log(value); -* decryptPhrase(JSON.parse(value), pwd).then(value => { -* console.log(value); -* }); -* }); -``` - * - * @packageDocumentation - * @module harmony-crypto - */ - -// This file is ported from ether.js/src.ts/errors.ts - -// Unknown Error -/** @hidden */ -export const UNKNOWN_ERROR = 'UNKNOWN_ERROR' - -// Not implemented -/** @hidden */ -export const NOT_IMPLEMENTED = 'NOT_IMPLEMENTED' - -// Missing new operator to an object -// - name: The name of the class -/** @hidden */ -export const MISSING_NEW = 'MISSING_NEW' - -// Call exception -// - transaction: the transaction -// - address?: the contract address -// - args?: The arguments passed into the function -// - method?: The Solidity method signature -// - errorSignature?: The EIP848 error signature -// - errorArgs?: The EIP848 error parameters -// - reason: The reason (only for EIP848 "Error(string)") -/** @hidden */ -export const CALL_EXCEPTION = 'CALL_EXCEPTION' - -// Invalid argument (e.g. value is incompatible with type) to a function: -// - argument: The argument name that was invalid -// - value: The value of the argument -/** @hidden */ -export const INVALID_ARGUMENT = 'INVALID_ARGUMENT' - -// Missing argument to a function: -// - count: The number of arguments received -// - expectedCount: The number of arguments expected -/** @hidden */ -export const MISSING_ARGUMENT = 'MISSING_ARGUMENT' - -// Too many arguments -// - count: The number of arguments received -// - expectedCount: The number of arguments expected -/** @hidden */ -export const UNEXPECTED_ARGUMENT = 'UNEXPECTED_ARGUMENT' - -// Numeric Fault -// - operation: the operation being executed -// - fault: the reason this faulted -/** @hidden */ -export const NUMERIC_FAULT = 'NUMERIC_FAULT' - -// Insufficient funds (< value + gasLimit * gasPrice) -// - transaction: the transaction attempted -/** @hidden */ -export const INSUFFICIENT_FUNDS = 'INSUFFICIENT_FUNDS' - -// Nonce has already been used -// - transaction: the transaction attempted -/** @hidden */ -export const NONCE_EXPIRED = 'NONCE_EXPIRED' - -// The replacement fee for the transaction is too low -// - transaction: the transaction attempted -/** @hidden */ -export const REPLACEMENT_UNDERPRICED = 'REPLACEMENT_UNDERPRICED' - -// Unsupported operation -// - operation -/** @hidden */ -export const UNSUPPORTED_OPERATION = 'UNSUPPORTED_OPERATION' - -// tslint:disable-next-line: variable-name -/** @hidden */ -let _permanentCensorErrors = false -// tslint:disable-next-line: variable-name -/** @hidden */ -let _censorErrors = false - -// @TODO: Enum -/** @hidden */ -export function throwError(message: string, code: string | null | undefined, params: any): never { - if (_censorErrors) { - throw new Error('unknown error') - } - - if (!code) { - code = UNKNOWN_ERROR - } - if (!params) { - params = {} - } - - const messageDetails: string[] = [] - Object.keys(params).forEach((key) => { - try { - messageDetails.push(key + '=' + JSON.stringify(params[key])) - } catch (error) { - messageDetails.push(key + '=' + JSON.stringify(params[key].toString())) - } - }) - // eslint-disable-next-line no-useless-concat - messageDetails.push('version=' + '#version') - - const reason = message - if (messageDetails.length) { - message += ' (' + messageDetails.join(', ') + ')' - } - - // @TODO: Any?? - const error: any = new Error(message) - error.reason = reason - error.code = code - - Object.keys(params).forEach((key) => { - error[key] = params[key] - }) - - throw error -} - -/** @hidden */ -export function checkNew(self: any, kind: any): void { - if (!(self instanceof kind)) { - throwError('missing new', MISSING_NEW, { name: kind.name }) - } -} - -/** @hidden */ -export function checkArgumentCount(count: number, expectedCount: number, suffix?: string): void { - if (!suffix) { - suffix = '' - } - if (count < expectedCount) { - throwError('missing argument' + suffix, MISSING_ARGUMENT, { - count, - expectedCount, - }) - } - if (count > expectedCount) { - throwError('too many arguments' + suffix, UNEXPECTED_ARGUMENT, { - count, - expectedCount, - }) - } -} - -/** @hidden */ -export function setCensorship(censorship: boolean, permanent?: boolean): void { - if (_permanentCensorErrors) { - throwError('error censorship permanent', UNSUPPORTED_OPERATION, { - operation: 'setCensorship', - }) - } - - _censorErrors = !!censorship - _permanentCensorErrors = !!permanent -} - -/** @hidden */ -export function checkNormalize(): void { - try { - // Make sure all forms of normalization are supported - ;['NFD', 'NFC', 'NFKD', 'NFKC'].forEach((form) => { - try { - 'test'.normalize(form) - } catch (error) { - throw new Error('missing ' + form) - } - }) - - if (String.fromCharCode(0xe9).normalize('NFD') !== String.fromCharCode(0x65, 0x0301)) { - throw new Error('broken implementation') - } - } catch (error) { - throwError('platform missing String.prototype.normalize', UNSUPPORTED_OPERATION, { - operation: 'String.prototype.normalize', - // @ts-ignore - form: error.message, - }) - } -} - -/** @hidden */ -const LogLevels: { [name: string]: number } = { - debug: 1, - default: 2, - info: 2, - warn: 3, - error: 4, - off: 5, -} -/** @hidden */ -let LogLevel = LogLevels.default - -/** @hidden */ -export function setLogLevel(logLevel: string): void { - const level = LogLevels[logLevel] - if (level === null) { - warn('invalid log level - ' + logLevel) - return - } - LogLevel = level -} - -/** @hidden */ -function log(logLevel: string, args: [any?, ...any[]]): void { - if (LogLevel > LogLevels[logLevel]) { - return - } - console.log.apply(console, args) -} - -/** @hidden */ -export function warn(...args: [any?, ...any[]]): void { - log('warn', args) -} - -/** @hidden */ -export function info(...args: [any?, ...any[]]): void { - log('info', args) -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 76b3e73f7b29..9b5dad42ecb6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1269,7 +1269,7 @@ importers: packages/web3-shared/evm: specifiers: - '@codingsh/harmony-crypto': 0.1.57 + '@codingsh/harmony-crypto': 0.1.58 '@ensdomains/address-encoder': ^0.2.6 '@harmony-js/utils': ^0.1.56 '@masknet/shared-base': workspace:* @@ -1294,7 +1294,7 @@ importers: web3-core-helpers: 1.5.2 web3-utils: 1.5.2 dependencies: - '@codingsh/harmony-crypto': 0.1.57 + '@codingsh/harmony-crypto': 0.1.58 '@ensdomains/address-encoder': 0.2.6 '@harmony-js/utils': 0.1.56 '@masknet/shared-base': link:../../shared-base @@ -4767,8 +4767,8 @@ packages: minimist: 1.2.5 dev: true - /@codingsh/harmony-crypto/0.1.57: - resolution: {integrity: sha512-rBpna+JgCCv2LiG9t7mFrH8QUdKGNygAd72gyZqLFrqspAv67w9M2Zwf7DUyAFibeOCVFGUuzqoPcYjF4wCZQw==} + /@codingsh/harmony-crypto/0.1.58: + resolution: {integrity: sha512-WFCTlaB6CohnCO41hHnHN7RseWJBYFA8iO0uT3wivomDZYdZ7KlNTRU9daC8xWkgg41dKo3Jf1XEHh9Pvjrx+w==} dependencies: '@harmony-js/utils': 0.1.56 aes-js: 3.1.2 From edcc91a349085635e4ad4f64d8eee091625f0e49 Mon Sep 17 00:00:00 2001 From: codingsh Date: Wed, 20 Apr 2022 14:47:42 +0100 Subject: [PATCH 09/33] chore(harmony): fixed network and metamask connect --- docs/evm-integration.md | 1 + packages/web3-constants/evm/rpc.json | 10 +++++++++- packages/web3-constants/evm/token.json | 8 ++++---- packages/web3-constants/evm/trader.json | 12 ++++++------ packages/web3-shared/evm/assets/chains.json | 4 ++-- packages/web3-shared/evm/constants/tokens.ts | 5 +++-- packages/web3-shared/evm/pipes/index.ts | 1 + packages/web3-shared/evm/utils/chainDetailed.ts | 1 + 8 files changed, 27 insertions(+), 15 deletions(-) diff --git a/docs/evm-integration.md b/docs/evm-integration.md index d4377758bc26..5a7d0a22ba42 100644 --- a/docs/evm-integration.md +++ b/docs/evm-integration.md @@ -119,3 +119,4 @@ Here is the chain abilities checklist. If you are working on a bounty task, plea | xDai | | | Arbitrum | | | Avalanche | | +| Harmony | | diff --git a/packages/web3-constants/evm/rpc.json b/packages/web3-constants/evm/rpc.json index b5fbbad2d671..4e240ca9c501 100644 --- a/packages/web3-constants/evm/rpc.json +++ b/packages/web3-constants/evm/rpc.json @@ -61,7 +61,15 @@ "Aurora": ["https://mainnet.aurora.dev"], "Aurora_Testnet": ["https://testnet.aurora.dev"], "Conflux": ["https://evm.confluxrpc.com"], - "Harmony": ["https://api.s0.t.hmny.io/"], + "Harmony": [ + "https://harmony-0-rpc.gateway.pokt.network", + "https://api.harmony.one", + "https://a.api.s0.t.hmny.io", + "https://api.s0.t.hmny.io", + "https://rpc.heavenswail.one/", + "https://api.fuzz.fi/", + "https://rpc.hermesdefi.io/" + ], "Harmony_Test": ["https://api.s0.b.hmny.io/"] }, "RPC_WEIGHTS": { diff --git a/packages/web3-constants/evm/token.json b/packages/web3-constants/evm/token.json index c946278e6ed7..55f9cebc681c 100644 --- a/packages/web3-constants/evm/token.json +++ b/packages/web3-constants/evm/token.json @@ -111,7 +111,7 @@ "Aurora": "", "Aurora_Testnet": "", "Conflux": "", - "Harmony": "", + "Harmony": "0x6ab707Aca953eDAeFBc4fD23bA73294241490620", "Harmony_Test": "" }, "HUSD_ADDRESS": { @@ -1215,7 +1215,7 @@ "Aurora": "", "Aurora_Testnet": "", "Conflux": "", - "Harmony": "", + "Harmony": "0xe50fA9b3c56FfB159cB0FCA61F5c9D750e8128c8", "Harmony_Test": "" }, "ZRX_ADDRESS": { @@ -1376,7 +1376,7 @@ "Aurora": "", "Aurora_Testnet": "", "Conflux": "", - "Harmony": "", + "Harmony": "0xf329e36C7bF6E5E86ce2150875a84Ce77f477375", "Harmony_Test": "" }, "BAT_ADDRESS": { @@ -2227,7 +2227,7 @@ "Aurora": "", "Aurora_Testnet": "", "Conflux": "", - "Harmony": "", + "Harmony": "0x078f358208685046a11C85e8ad32895DED33A249", "Harmony_Test": "" }, "aYFI_ADDRESS": { diff --git a/packages/web3-constants/evm/trader.json b/packages/web3-constants/evm/trader.json index 9d0a634fa2ef..f920b31e68d8 100644 --- a/packages/web3-constants/evm/trader.json +++ b/packages/web3-constants/evm/trader.json @@ -226,8 +226,8 @@ "Aurora": "0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506", "Aurora_Testnet": "", "Conflux": "", - "Harmony": "", - "Harmony_Test": "" + "Harmony": "0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506", + "Harmony_Test": "0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506" }, "SUSHISWAP_FACTORY_ADDRESS": { "Mainnet": "0xC0AEe478e3658e2610c5F7A4A2E1777cE9e4f2Ac", @@ -249,8 +249,8 @@ "Aurora": "", "Aurora_Testnet": "", "Conflux": "", - "Harmony": "", - "Harmony_Test": "" + "Harmony": "0xc35DADB65012eC5796536bD9864eD8773aBc74C4", + "Harmony_Test": "0xc35DADB65012eC5796536bD9864eD8773aBc74C4" }, "SUSHISWAP_THEGRAPH": { "Mainnet": "https://api.thegraph.com/subgraphs/name/zippoxer/sushiswap-subgraph-fork", @@ -295,8 +295,8 @@ "Aurora": "", "Aurora_Testnet": "", "Conflux": "", - "Harmony": "", - "Harmony_Test": "" + "Harmony": "0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303", + "Harmony_Test": "0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303" }, "SASHIMISWAP_ROUTER_ADDRESS": { "Mainnet": "0xe4fe6a45f354e845f954cddee6084603cedb9410", diff --git a/packages/web3-shared/evm/assets/chains.json b/packages/web3-shared/evm/assets/chains.json index 784947355c1b..e06035912420 100644 --- a/packages/web3-shared/evm/assets/chains.json +++ b/packages/web3-shared/evm/assets/chains.json @@ -2684,8 +2684,8 @@ "networkId": 1313161556 }, { - "name": "Harmony Mainnet Shard 0", - "chain": "harmony", + "name": "Harmony", + "chain": "Harmony", "network": "mainnet", "rpc": ["https://api.harmony.one"], "faucets": [], diff --git a/packages/web3-shared/evm/constants/tokens.ts b/packages/web3-shared/evm/constants/tokens.ts index 43436e5039f3..bf6ea4623815 100644 --- a/packages/web3-shared/evm/constants/tokens.ts +++ b/packages/web3-shared/evm/constants/tokens.ts @@ -45,8 +45,8 @@ export const CUSD = createERC20Tokens('cUSD_ADDRESS', 'Celo Dollar', 'cUSD', 18) export const CEUR = createERC20Tokens('cEUR_ADDRESS', 'Celo Euro', 'cEUR', 18) export const JOE = createERC20Tokens('JOE_ADDRESS', 'JoeToken', 'JOE', 18) export const PNG = createERC20Tokens('PNG_ADDRESS', 'Pangolin', 'PNG', 18) -export const VIPER = createERC20Tokens('VIPER_ADDRESS', 'VIPER', 'VIPER', 18) -export const OPENX = createERC20Tokens('OPENX_ADDRESS', 'Openswap', 'OPENX', 18) +export const VIPER = createERC20Tokens('VIPER_ADDRESS', 'Viper', 'VIPER', 18) +export const OPENX = createERC20Tokens('OPENX_ADDRESS', 'OpenSwap Token', 'OpenX', 18) export const WNATIVE = createERC20Tokens( 'WNATIVE_ADDRESS', @@ -74,4 +74,5 @@ export const WNATIVE_ONLY: ERC20AgainstToken = { [ChainId.Fantom]: [WNATIVE[ChainId.Fantom]], [ChainId.Aurora]: [WNATIVE[ChainId.Aurora]], [ChainId.Aurora_Testnet]: [WNATIVE[ChainId.Aurora_Testnet]], + [ChainId.Harmony]: [WNATIVE[ChainId.Harmony]], } diff --git a/packages/web3-shared/evm/pipes/index.ts b/packages/web3-shared/evm/pipes/index.ts index 9e247a3caf95..27a7fbc38471 100644 --- a/packages/web3-shared/evm/pipes/index.ts +++ b/packages/web3-shared/evm/pipes/index.ts @@ -147,6 +147,7 @@ export const resolveChainColor = createLookupTableResolver( [ChainId.Fantom]: 'rgb(19, 181, 236)', [ChainId.Aurora]: 'rgb(112, 212, 74)', [ChainId.Conflux]: 'rgb(24, 163, 138)', + [ChainId.Harmony]: 'rgb(48, 153, 242)', [ChainId.Aurora_Testnet]: 'rgb(112, 212, 74)', }, 'rgb(214, 217, 220)', diff --git a/packages/web3-shared/evm/utils/chainDetailed.ts b/packages/web3-shared/evm/utils/chainDetailed.ts index 087ac4c97401..7104e0933c48 100644 --- a/packages/web3-shared/evm/utils/chainDetailed.ts +++ b/packages/web3-shared/evm/utils/chainDetailed.ts @@ -96,6 +96,7 @@ export const getChainIdFromNetworkType = createLookupTableResolver Date: Wed, 20 Apr 2022 17:33:04 +0200 Subject: [PATCH 10/33] chore(harmony): debank price gas --- packages/mask/src/plugins/Wallet/apis/debank.ts | 4 +++- packages/web3-constants/evm/coinmarketcap.json | 4 ++-- packages/web3-constants/evm/token.json | 2 +- packages/web3-providers/src/zerion/format.ts | 2 +- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/packages/mask/src/plugins/Wallet/apis/debank.ts b/packages/mask/src/plugins/Wallet/apis/debank.ts index e72fdc67de63..4af353f75d36 100644 --- a/packages/mask/src/plugins/Wallet/apis/debank.ts +++ b/packages/mask/src/plugins/Wallet/apis/debank.ts @@ -29,6 +29,8 @@ export async function getAssetsList(address: string) { } const auroraChainOnDebank = getDeBankConstants(ChainId.Aurora).CHAIN_ID +const harmonyChainOnDebank = getDeBankConstants(ChainId.Harmony).CHAIN_ID +const arbitrumChainOnDebank = getDeBankConstants(ChainId.Arbitrum).CHAIN_ID const fieldKeys = ['fast', 'normal', 'slow'] as const /** * Debank's data might be outdated, like gas price for aurora which requires 1 Gwei at least @@ -36,7 +38,7 @@ const fieldKeys = ['fast', 'normal', 'slow'] as const * Once debank fixes it, we will remove this modifier. */ function gasModifier(gasDict: GasPriceDictResponse, chain: string) { - if (chain === auroraChainOnDebank) { + if (chain === auroraChainOnDebank || harmonyChainOnDebank || arbitrumChainOnDebank) { fieldKeys.forEach((fieldKey) => { const field = gasDict.data[fieldKey] field.price = Math.max(field.price, formatGweiToWei(1).toNumber()) diff --git a/packages/web3-constants/evm/coinmarketcap.json b/packages/web3-constants/evm/coinmarketcap.json index 647bf6c1b3ad..bb8ef5c346d4 100644 --- a/packages/web3-constants/evm/coinmarketcap.json +++ b/packages/web3-constants/evm/coinmarketcap.json @@ -16,9 +16,9 @@ "Avalanche_Fuji": "", "Celo": "5567", "Fantom": "3513", - "Aurora": "1313161554", + "Aurora": "14803", "Aurora_Testnet": "", - "Conflux": "", + "Conflux": "7334", "Harmony": "3945", "Harmony_Test": "" } diff --git a/packages/web3-constants/evm/token.json b/packages/web3-constants/evm/token.json index 55f9cebc681c..c0ec5e60775e 100644 --- a/packages/web3-constants/evm/token.json +++ b/packages/web3-constants/evm/token.json @@ -1170,7 +1170,7 @@ "Aurora_Testnet": "", "Conflux": "0x0000000000000000000000000000000000000000", "Harmony": "0x0000000000000000000000000000000000000000", - "Harmony_Test": "" + "Harmony_Test": "0x0000000000000000000000000000000000000000" }, "WETH_ADDRESS": { "Mainnet": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", diff --git a/packages/web3-providers/src/zerion/format.ts b/packages/web3-providers/src/zerion/format.ts index e0d2412e7761..d56fac00b516 100644 --- a/packages/web3-providers/src/zerion/format.ts +++ b/packages/web3-providers/src/zerion/format.ts @@ -56,7 +56,7 @@ export function formatAssets( return data.map(({ asset, quantity }) => { const balance = leftShift(quantity, asset.decimals).toNumber() const value = (asset as ZerionAsset).price?.value ?? (asset as ZerionCovalentAsset).value ?? 0 - const isNativeToken = (symbol: string) => ['ETH', 'BNB', 'MATIC', 'ARETH', 'AETH'].includes(symbol) + const isNativeToken = (symbol: string) => ['ETH', 'BNB', 'MATIC', 'ARETH', 'AETH', 'ONE'].includes(symbol) const address = isNativeToken(asset.symbol) ? getTokenConstants().NATIVE_TOKEN_ADDRESS : asset.asset_code const chainId = resolveChainByScope(scope).chainId From 10d6da0f4f0b37b9d0c04fdbd048792083fd3b02 Mon Sep 17 00:00:00 2001 From: codingsh Date: Sun, 24 Apr 2022 13:11:03 +0200 Subject: [PATCH 11/33] chore(harmony): fixed ito subgraph link and explorer harmony url --- packages/web3-constants/evm/ito.json | 2 +- packages/web3-shared/evm/assets/chains.json | 11 +++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/packages/web3-constants/evm/ito.json b/packages/web3-constants/evm/ito.json index 83210a210106..ed88c8ac7f71 100644 --- a/packages/web3-constants/evm/ito.json +++ b/packages/web3-constants/evm/ito.json @@ -157,7 +157,7 @@ "Aurora": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-ito-aurora", "Aurora_Testnet": "", "Conflux": "", - "Harmony": "ttps://api.thegraph.com/subgraphs/name/dimensiondev/mask-ito-harmony", + "Harmony": "https://api.thegraph.com/subgraphs/name/dimensiondev/mask-ito-harmony", "Harmony_Test": "" } } diff --git a/packages/web3-shared/evm/assets/chains.json b/packages/web3-shared/evm/assets/chains.json index e06035912420..ea25280e107e 100644 --- a/packages/web3-shared/evm/assets/chains.json +++ b/packages/web3-shared/evm/assets/chains.json @@ -2691,10 +2691,17 @@ "faucets": [], "features": [], "nativeCurrency": { "name": "ONE", "symbol": "ONE", "decimals": 18 }, - "infoURL": "https://www.harmony.one/", + "infoURL": "https://explorer.harmony.one", "shortName": "hmy", "chainId": 1666600000, - "networkId": 1666600000 + "networkId": 1666600000, + "explorers": [ + { + "name": "harmony", + "url": "https://explorer.harmony.one", + "standard": "EIP3091" + } + ] }, { "name": "Harmony Mainnet Shard 1", From 4c43d89a37012b9eeb077c4f451485470e05f367 Mon Sep 17 00:00:00 2001 From: codingsh Date: Mon, 25 Apr 2022 07:43:42 +0200 Subject: [PATCH 12/33] chore(harmony): remove harmony utils and trash code --- cspell.json | 1 - packages/web3-shared/evm/package.json | 2 - packages/web3-shared/evm/utils/validators.ts | 184 ------------------- 3 files changed, 187 deletions(-) delete mode 100644 packages/web3-shared/evm/utils/validators.ts diff --git a/cspell.json b/cspell.json index 98f92d8160ef..cc2e472eda1e 100644 --- a/cspell.json +++ b/cspell.json @@ -138,7 +138,6 @@ "lamports", "languagedetector", "lendingpool", - "lengh", "leste", "linkedin", "linkswap", diff --git a/packages/web3-shared/evm/package.json b/packages/web3-shared/evm/package.json index d8031a0fd494..7d6899f75b99 100644 --- a/packages/web3-shared/evm/package.json +++ b/packages/web3-shared/evm/package.json @@ -10,8 +10,6 @@ }, "sideEffects": false, "dependencies": { - "@codingsh/harmony-crypto": "0.1.58", - "@harmony-js/utils": "^0.1.56", "@ensdomains/address-encoder": "^0.2.6", "@masknet/shared-base": "workspace:*", "@masknet/web3-constants": "workspace:*", diff --git a/packages/web3-shared/evm/utils/validators.ts b/packages/web3-shared/evm/utils/validators.ts deleted file mode 100644 index 940d6359764f..000000000000 --- a/packages/web3-shared/evm/utils/validators.ts +++ /dev/null @@ -1,184 +0,0 @@ -/** - * @packageDocumentation - * @module harmony-utils - */ - -export const isKeyString = (keyString: string, lengh: number): boolean => { - return !!keyString.replace('0x', '').match(`^[0-9a-fA-F]{${lengh}}$`) -} -isKeyString.validator = 'isKeyString' - -export const isAddress = (address: string): boolean => { - return isKeyString(address, 40) -} -isAddress.validator = 'isAddress' - -export const isPrivateKey = (privateKey: string): boolean => { - return isKeyString(privateKey, 64) -} -isPrivateKey.validator = 'isPrivateKey' - -export const isPublicKey = (publicKey: string): boolean => { - return isKeyString(publicKey, 66) -} -isPublicKey.validator = 'isPublicKey' - -export const isHash = (hash: string): boolean => { - return isKeyString(hash, 64) -} -isHash.validator = 'isHash' - -/** - * [isNumber verify param is a Number] - * @param {any} obj [value] - * @return {Boolean} [boolean] - */ -export const isNumber = (obj: any): boolean => { - return obj === +obj -} -isNumber.validator = 'isNumber' - -/** - * [isNumber verify param is a Number] - * @param {any} obj [value] - * @return {boolean} [boolean] - */ -export const isInt = (obj: any): boolean => { - return isNumber(obj) && Number.isInteger(obj) -} - -isInt.validator = 'isInt' - -/** - * [isString verify param is a String] - * @param {any} obj [value] - * @return {Boolean} [boolean] - */ -export const isString = (obj: any): boolean => { - return obj === obj -} - -isString.validator = 'isString' -/** - * [isBoolean verify param is a Boolean] - * @param {any} obj [value] - * @return {Boolean} [boolean] - */ -export const isBoolean = (obj: any): boolean => { - return obj === !!obj -} - -isBoolean.validator = 'isBoolean' -/** - * [isArray verify param input is an Array] - * @param {any} obj [value] - * @return {Boolean} [boolean] - */ -export const isArray = (obj: any): boolean => { - return Array.isArray(obj) -} - -isArray.validator = 'isArray' -/** - * [isJson verify param input is a Json] - * @param {any} obj [value] - * @return {Boolean} [boolean] - */ -export const isJsonString = (obj: any): boolean => { - try { - return !!JSON.parse(obj) && isObject(JSON.parse(obj)) - } catch (error) { - return false - } -} -isJsonString.validator = 'isJsonString' - -/** - * [isObject verify param is an Object] - * @param {any} obj [value] - * @return {Boolean} [boolean] - */ -export const isObject = (obj: any): boolean => { - return obj !== null && !Array.isArray(obj) && typeof obj === 'object' -} -isObject.validator = 'isObject' - -/** - * [isFunction verify param is a Function] - * @param {any} obj [value] - * @return {Boolean} [description] - */ - -export const isFunction = (obj: any): boolean => { - return typeof obj === 'function' -} -isFunction.validator = 'isFunction' - -export const isHex = (obj: any): boolean => { - if (!isString(obj)) { - throw new Error(`${obj} is not string`) - } - return ( - (obj.startsWith('0x') || obj.startsWith('-0x')) && - isNumber(Number.parseInt(obj.toLowerCase().replace('0x', ''), 16)) - ) -} - -isHex.validator = 'isHex' - -export const isHttp = (obj: any): boolean => { - if (!isString(obj)) { - throw new Error(`${obj} is not valid url`) - } else { - return obj.startsWith('http://') || obj.startsWith('https://') - } -} -isHttp.validator = 'isHttp' - -export const isWs = (obj: any): boolean => { - if (!isString(obj)) { - throw new Error(`${obj} is not valid url`) - } else { - return obj.startsWith('ws://') || obj.startsWith('wss://') - } -} -isWs.validator = 'isWs' - -export enum DefaultBlockParams { - earliest = 'earliest', - pending = 'pending', - latest = 'latest', -} - -export const isBlockNumber = (obj: any): boolean => { - const blockParams = [DefaultBlockParams.earliest, DefaultBlockParams.pending, DefaultBlockParams.latest] - - if (!isString(obj)) { - throw new Error(`${obj} is not valid blockNumber`) - } - - return isHex(obj) || blockParams.some((val) => val === obj) -} -isBlockNumber.validator = 'isBlockNumber' - -export const isBech32Address = (raw: string): boolean => { - return !!raw.match(/^one1[02-9ac-hj-np-z]{38}/) -} -isBech32Address.validator = 'isBech32Address' - -export const isBech32TestNetAddress = (raw: string): boolean => { - return !!raw.match(/^tone1[02-9ac-hj-np-z]{38}/) -} -isBech32TestNetAddress.validator = 'isBech32TestNetAddress' - -export const isValidAddress = (address: string): boolean => { - if (!isString(address)) { - throw new Error(`${address} is not string`) - } - if (isAddress(address) || isBech32Address(address) || isBech32TestNetAddress(address)) { - return true - } else { - return false - } -} -isValidAddress.validator = 'isValidAddress' From 825bc3a0df3fcd77422ceb014c981ac4d5061931 Mon Sep 17 00:00:00 2001 From: unclebill Date: Wed, 27 Apr 2022 11:57:04 +0800 Subject: [PATCH 13/33] fix: missed config --- .../SNSAdaptor/ConnectWalletDialog/index.tsx | 27 +++++++++---------- packages/web3-shared/evm/pipes/index.ts | 15 +++++++++++ .../web3-shared/evm/utils/chainDetailed.ts | 4 +++ packages/web3-shared/evm/utils/enum.ts | 5 +--- 4 files changed, 32 insertions(+), 19 deletions(-) diff --git a/packages/mask/src/plugins/Wallet/SNSAdaptor/ConnectWalletDialog/index.tsx b/packages/mask/src/plugins/Wallet/SNSAdaptor/ConnectWalletDialog/index.tsx index e4d2a0472314..24cfe55458f3 100644 --- a/packages/mask/src/plugins/Wallet/SNSAdaptor/ConnectWalletDialog/index.tsx +++ b/packages/mask/src/plugins/Wallet/SNSAdaptor/ConnectWalletDialog/index.tsx @@ -32,17 +32,15 @@ export function ConnectWalletDialog(props: ConnectWalletDialogProps) { const [networkType, setNetworkType] = useState() // #region remote controlled dialog - const { open, setDialog: setConnectWalletDialog } = useRemoteControlledDialog( - WalletMessages.events.connectWalletDialogUpdated, - (ev) => { - if (!ev.open) return - setProviderType(ev.providerType) - setNetworkType(ev.networkType) - }, - ) - const onClose = useCallback(() => { - setConnectWalletDialog({ open: false }) - }, []) + const { + open, + closeDialog, + setDialog: setConnectWalletDialog, + } = useRemoteControlledDialog(WalletMessages.events.connectWalletDialogUpdated, (ev) => { + if (!ev.open) return + setProviderType(ev.providerType) + setNetworkType(ev.networkType) + }) // #endregion // #region walletconnect @@ -116,10 +114,9 @@ export function ConnectWalletDialog(props: ConnectWalletDialogProps) { // it will always add a new RPC provider even if the network exists if (providerType !== ProviderType.Coin98) { await Promise.race([ - (async () => { - await delay(30 /* seconds */ * 1000 /* milliseconds */) + delay(30 /* seconds */ * 1000 /* milliseconds */).then(() => { throw new Error('Timeout!') - })(), + }), networkType === NetworkType.Ethereum ? Services.Ethereum.switchEthereumChain(ChainId.Mainnet, overrides) : Services.Ethereum.addEthereumChain(chainDetailedCAIP, account, overrides), @@ -156,7 +153,7 @@ export function ConnectWalletDialog(props: ConnectWalletDialogProps) { if (!providerType) return null return ( - + diff --git a/packages/web3-shared/evm/pipes/index.ts b/packages/web3-shared/evm/pipes/index.ts index 27a7fbc38471..4cca8dccde1c 100644 --- a/packages/web3-shared/evm/pipes/index.ts +++ b/packages/web3-shared/evm/pipes/index.ts @@ -97,6 +97,11 @@ export const resolveNetworkAddressPrefix = createLookupTableResolver [NetworkType.Fantom]: 'Fantom', [NetworkType.Aurora]: 'Aurora', [NetworkType.Conflux]: 'Conflux', + [NetworkType.Harmony]: 'Harmony', + [NetworkType.Boba]: 'Boba', + [NetworkType.Fuse]: 'Fuse', + [NetworkType.Metis]: 'Metis', + [NetworkType.Optimistic]: 'Optimistic', }, 'Unknown', ) @@ -148,7 +158,12 @@ export const resolveChainColor = createLookupTableResolver( [ChainId.Aurora]: 'rgb(112, 212, 74)', [ChainId.Conflux]: 'rgb(24, 163, 138)', [ChainId.Harmony]: 'rgb(48, 153, 242)', + [ChainId.Harmony_Test]: 'rgb(48, 153, 242)', [ChainId.Aurora_Testnet]: 'rgb(112, 212, 74)', + [ChainId.Fuse]: 'rgb(255 255 255)', + [ChainId.Boba]: 'rgb(255 255 255)', + [ChainId.Metis]: 'rgb(255 255 255)', + [ChainId.Optimistic]: 'rgb(255 255 255)', }, 'rgb(214, 217, 220)', ) diff --git a/packages/web3-shared/evm/utils/chainDetailed.ts b/packages/web3-shared/evm/utils/chainDetailed.ts index 7104e0933c48..2f541f2a5361 100644 --- a/packages/web3-shared/evm/utils/chainDetailed.ts +++ b/packages/web3-shared/evm/utils/chainDetailed.ts @@ -97,6 +97,10 @@ export const getChainIdFromNetworkType = createLookupTableResolver( - map: Partial>, - fallback: T | ((key: K) => T), -) { +export function createLookupTableResolver(map: Record, fallback: T | ((key: K) => T)) { function resolveFallback(key: K) { if (typeof fallback === 'function') return (fallback as (key: K) => T)(key) return fallback From 5a6a61d1cf6918182efdec0ee57a46decc488c93 Mon Sep 17 00:00:00 2001 From: unclebill Date: Wed, 27 Apr 2022 12:14:33 +0800 Subject: [PATCH 14/33] fixup! fix: missed config --- .../src/plugins/Collectible/pipes/index.ts | 39 +++++++++++++------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/packages/mask/src/plugins/Collectible/pipes/index.ts b/packages/mask/src/plugins/Collectible/pipes/index.ts index 5f91ab391b21..1ea89c4e626f 100644 --- a/packages/mask/src/plugins/Collectible/pipes/index.ts +++ b/packages/mask/src/plugins/Collectible/pipes/index.ts @@ -63,7 +63,8 @@ export const resolveCollectibleProviderName = createLookupTableResolver( +type RaribleSupportedChainId = ChainId.Mainnet | ChainId.Ropsten | ChainId.Rinkeby +export const resolveRaribleUserNetwork = createLookupTableResolver( { [ChainId.Mainnet]: RaribleUserURL, [ChainId.Ropsten]: RaribleRopstenUserURL, @@ -72,7 +73,8 @@ export const resolveRaribleUserNetwork = createLookupTableResolver( +type OpenSeaSupportedChainId = ChainId.Mainnet | ChainId.Rinkeby +export const resolveLinkOnOpenSea = createLookupTableResolver( { [ChainId.Mainnet]: OpenSeaMainnetURL, [ChainId.Rinkeby]: OpenSeaTestnetURL, @@ -80,7 +82,7 @@ export const resolveLinkOnOpenSea = createLookupTableResolver( OpenSeaMainnetURL, ) -export const resolveLinkOnRarible = createLookupTableResolver( +export const resolveLinkOnRarible = createLookupTableResolver( { [ChainId.Mainnet]: 'https://rarible.com', [ChainId.Rinkeby]: 'https://rinkeby.rarible.com', @@ -89,7 +91,8 @@ export const resolveLinkOnRarible = createLookupTableResolver( 'https://rarible.com', ) -export const resolveLinkOnZora = createLookupTableResolver( +type ZoraSupportedChainId = ChainId.Mainnet +export const resolveLinkOnZora = createLookupTableResolver( { [ChainId.Mainnet]: 'https://zora.co', }, @@ -112,13 +115,22 @@ export function resolveAssetLinkOnCurrentProvider( ) { switch (provider) { case NonFungibleAssetProvider.OPENSEA: - return urlcat(resolveLinkOnOpenSea(chainId), '/assets/:address/:id', { address, id }) + return urlcat(resolveLinkOnOpenSea(chainId as OpenSeaSupportedChainId), '/assets/:address/:id', { + address, + id, + }) case NonFungibleAssetProvider.RARIBLE: - return urlcat(resolveLinkOnRarible(chainId), '/token/:address/:id', { address, id }) + return urlcat(resolveLinkOnRarible(chainId as RaribleSupportedChainId), '/token/:address/:id', { + address, + id, + }) case NonFungibleAssetProvider.NFTSCAN: return '' case NonFungibleAssetProvider.ZORA: - return urlcat(resolveLinkOnZora(chainId), '/collections/:address/:id', { address, id }) + return urlcat(resolveLinkOnZora(chainId as ZoraSupportedChainId), '/collections/:address/:id', { + address, + id, + }) default: return '' } @@ -132,13 +144,13 @@ export function resolveUserUrlOnCurrentProvider( ) { switch (provider) { case NonFungibleAssetProvider.RARIBLE: - return urlcat(resolveRaribleUserNetwork(chainId), `/${address}`) + return urlcat(resolveRaribleUserNetwork(chainId as RaribleSupportedChainId), `/${address}`) case NonFungibleAssetProvider.OPENSEA: - return urlcat(resolveLinkOnOpenSea(chainId), `/${username ?? ''}`) + return urlcat(resolveLinkOnOpenSea(chainId as OpenSeaSupportedChainId), `/${username ?? ''}`) case NonFungibleAssetProvider.NFTSCAN: return '' case NonFungibleAssetProvider.ZORA: - return urlcat(resolveLinkOnZora(chainId), `/${address}`) + return urlcat(resolveLinkOnZora(chainId as ZoraSupportedChainId), `/${address}`) default: return '' } @@ -147,9 +159,12 @@ export function resolveUserUrlOnCurrentProvider( export function resolveAvatarLinkOnCurrentProvider(chainId: ChainId, asset: any, provider: NonFungibleAssetProvider) { switch (provider) { case NonFungibleAssetProvider.OPENSEA: - return urlcat(resolveLinkOnOpenSea(chainId), `/collection/${asset.slug ?? ''}`) + return urlcat(resolveLinkOnOpenSea(chainId as OpenSeaSupportedChainId), `/collection/${asset.slug ?? ''}`) case NonFungibleAssetProvider.RARIBLE: - return urlcat(resolveLinkOnRarible(chainId), `/collection/${asset.token_address ?? ''}`) + return urlcat( + resolveLinkOnRarible(chainId as RaribleSupportedChainId), + `/collection/${asset.token_address ?? ''}`, + ) case NonFungibleAssetProvider.NFTSCAN: return '' case NonFungibleAssetProvider.ZORA: From 0f011c870a3fd69310e426dab8a01179bd59b8ad Mon Sep 17 00:00:00 2001 From: codingsh Date: Wed, 27 Apr 2022 09:53:53 +0200 Subject: [PATCH 15/33] fix: cspell --- cspell.json | 1 - 1 file changed, 1 deletion(-) diff --git a/cspell.json b/cspell.json index cc2e472eda1e..f49baa71c59f 100644 --- a/cspell.json +++ b/cspell.json @@ -54,7 +54,6 @@ "cbridge", "celer", "celo", - "checksumed", "checksummed", "choudhary", "cipherparams", From 233e8c1e947083a2f96212e95491fe40f5867f4d Mon Sep 17 00:00:00 2001 From: codingsh Date: Wed, 27 Apr 2022 16:24:06 +0200 Subject: [PATCH 16/33] fix: harmony Address Checksum --- packages/web3-constants/evm/token.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/web3-constants/evm/token.json b/packages/web3-constants/evm/token.json index c0ec5e60775e..1f84d4f5ce80 100644 --- a/packages/web3-constants/evm/token.json +++ b/packages/web3-constants/evm/token.json @@ -65,7 +65,7 @@ "Aurora": "0xb12bfca5a55806aaf64e99521918a4bf0fc40802", "Aurora_Testnet": "", "Conflux": "", - "Harmony": "0x985458e523db3d53125813ed68c274899e9dfab4", + "Harmony": "0x985458E523dB3d53125813eD68c274899e9DfAb4", "Harmony_Test": "" }, "USDT_ADDRESS": { @@ -111,7 +111,7 @@ "Aurora": "", "Aurora_Testnet": "", "Conflux": "", - "Harmony": "0x6ab707Aca953eDAeFBc4fD23bA73294241490620", + "Harmony": "0x3C2B8Be99c50593081EAA2A724F0B8285F5aba8f", "Harmony_Test": "" }, "HUSD_ADDRESS": { @@ -387,7 +387,7 @@ "Aurora": "0xe3520349f477a5f6eb06107066048508498a291b", "Aurora_Testnet": "", "Conflux": "", - "Harmony": "0xef977d2f931c1978db5f6747666fa1eacb0d0339", + "Harmony": "0xEf977d2f931C1978Db5F6747666fa1eACB0d0339", "Harmony_Test": "" }, "AMPL_ADDRESS": { @@ -686,7 +686,7 @@ "Aurora": "0xf4eb217ba2454613b15dbdea6e5f22276410e89e", "Aurora_Testnet": "", "Conflux": "", - "Harmony": "0x3095c7557bcb296ccc6e363de01b760ba031f2d9", + "Harmony": "0x3095c7557bCb296ccc6e363DE01b760bA031F2d9", "Harmony_Test": "" }, "IGG_ADDRESS": { From 71af8fd7e9786c2094fce98f13c514001b03a4f4 Mon Sep 17 00:00:00 2001 From: unclebill Date: Thu, 28 Apr 2022 10:49:51 +0800 Subject: [PATCH 17/33] fix: platform id and coin id on coingecko --- packages/web3-constants/evm/coingecko.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/web3-constants/evm/coingecko.json b/packages/web3-constants/evm/coingecko.json index 95e41da591e0..a0b9c6d8b510 100644 --- a/packages/web3-constants/evm/coingecko.json +++ b/packages/web3-constants/evm/coingecko.json @@ -19,7 +19,7 @@ "Aurora": "aurora", "Aurora_Testnet": "", "Conflux": "", - "Harmony": "harmony-shard-0", + "Harmony": "harmony", "Harmony_Test": "" }, "COIN_ID": { @@ -42,7 +42,7 @@ "Aurora": "ethereum", "Aurora_Testnet": "", "Conflux": "conflux-token", - "Harmony": "harmony-shard-0", + "Harmony": "harmony", "Harmony_Test": "" } } From c9d6f18d8833fe34682607547eed804660f2161d Mon Sep 17 00:00:00 2001 From: codingsh Date: Thu, 28 Apr 2022 07:22:47 +0000 Subject: [PATCH 18/33] fix: improve code with reviews tips --- packages/mask/src/plugins/Wallet/apis/debank.ts | 2 +- packages/web3-constants/evm/rpc.json | 2 -- packages/web3-shared/evm/hooks/useERC721ContractDetailed.ts | 3 +-- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/packages/mask/src/plugins/Wallet/apis/debank.ts b/packages/mask/src/plugins/Wallet/apis/debank.ts index 4af353f75d36..75102809f98a 100644 --- a/packages/mask/src/plugins/Wallet/apis/debank.ts +++ b/packages/mask/src/plugins/Wallet/apis/debank.ts @@ -38,7 +38,7 @@ const fieldKeys = ['fast', 'normal', 'slow'] as const * Once debank fixes it, we will remove this modifier. */ function gasModifier(gasDict: GasPriceDictResponse, chain: string) { - if (chain === auroraChainOnDebank || harmonyChainOnDebank || arbitrumChainOnDebank) { + if ([auroraChainOnDebank, harmonyChainOnDebank, arbitrumChainOnDebank].includes(chain)) { fieldKeys.forEach((fieldKey) => { const field = gasDict.data[fieldKey] field.price = Math.max(field.price, formatGweiToWei(1).toNumber()) diff --git a/packages/web3-constants/evm/rpc.json b/packages/web3-constants/evm/rpc.json index 643e312edf7e..a3074975a56d 100644 --- a/packages/web3-constants/evm/rpc.json +++ b/packages/web3-constants/evm/rpc.json @@ -66,8 +66,6 @@ "https://api.harmony.one", "https://a.api.s0.t.hmny.io", "https://api.s0.t.hmny.io", - "https://rpc.heavenswail.one/", - "https://api.fuzz.fi/", "https://rpc.hermesdefi.io/" ], "Harmony_Test": ["https://api.s0.b.hmny.io/"] diff --git a/packages/web3-shared/evm/hooks/useERC721ContractDetailed.ts b/packages/web3-shared/evm/hooks/useERC721ContractDetailed.ts index ef807538f58c..a004cfd96c96 100644 --- a/packages/web3-shared/evm/hooks/useERC721ContractDetailed.ts +++ b/packages/web3-shared/evm/hooks/useERC721ContractDetailed.ts @@ -28,8 +28,7 @@ async function getERC721ContractDetailedFromChain(address: string, chainId: Chai result.status === 'fulfilled' ? result.value : '', ) as string[] - // todo add fixed bech32 harmony - // if (chainId === 1666600000) { + // if (chainId === ChainId.Harmony) { // const addressONE = isBech32Address(address) ? fromBech32(address) : address // return createERC721ContractDetailed(chainId, addressONE, name, symbol, baseURI) // } From 9e6e03a8f1ec82b69890b0cc84f1da77f415053d Mon Sep 17 00:00:00 2001 From: codingsh Date: Thu, 28 Apr 2022 07:34:36 +0000 Subject: [PATCH 19/33] chore(harmony): remove comment code isBech32Address --- packages/web3-shared/evm/hooks/useERC721ContractDetailed.ts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/packages/web3-shared/evm/hooks/useERC721ContractDetailed.ts b/packages/web3-shared/evm/hooks/useERC721ContractDetailed.ts index a004cfd96c96..c99f91b9e31b 100644 --- a/packages/web3-shared/evm/hooks/useERC721ContractDetailed.ts +++ b/packages/web3-shared/evm/hooks/useERC721ContractDetailed.ts @@ -28,11 +28,6 @@ async function getERC721ContractDetailedFromChain(address: string, chainId: Chai result.status === 'fulfilled' ? result.value : '', ) as string[] - // if (chainId === ChainId.Harmony) { - // const addressONE = isBech32Address(address) ? fromBech32(address) : address - // return createERC721ContractDetailed(chainId, addressONE, name, symbol, baseURI) - // } - return createERC721ContractDetailed(chainId, address, name, symbol, baseURI) } From e6c1ed6aac08e66e01faae5ae8d03b11a2f69e40 Mon Sep 17 00:00:00 2001 From: codingsh Date: Sun, 1 May 2022 19:33:30 +0000 Subject: [PATCH 20/33] fix: usdc address --- packages/web3-constants/evm/token.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/web3-constants/evm/token.json b/packages/web3-constants/evm/token.json index 1f84d4f5ce80..357a90de92de 100644 --- a/packages/web3-constants/evm/token.json +++ b/packages/web3-constants/evm/token.json @@ -65,7 +65,7 @@ "Aurora": "0xb12bfca5a55806aaf64e99521918a4bf0fc40802", "Aurora_Testnet": "", "Conflux": "", - "Harmony": "0x985458E523dB3d53125813eD68c274899e9DfAb4", + "Harmony": "0x44cED87b9F1492Bf2DCf5c16004832569f7f6cBa", "Harmony_Test": "" }, "USDT_ADDRESS": { From ce79965b64b2254d973fd5fe3b837e3e45fa3ee0 Mon Sep 17 00:00:00 2001 From: codingsh Date: Sun, 1 May 2022 19:40:01 +0000 Subject: [PATCH 21/33] fix(harmony): add minGasPrice 30 gwei --- .../popups/pages/Wallet/GasSetting/Prior1559GasSetting.tsx | 1 + .../Wallet/SNSAdaptor/GasSettingDialog/Prior1559GasSetting.tsx | 1 + 2 files changed, 2 insertions(+) diff --git a/packages/mask/src/extension/popups/pages/Wallet/GasSetting/Prior1559GasSetting.tsx b/packages/mask/src/extension/popups/pages/Wallet/GasSetting/Prior1559GasSetting.tsx index fcbc87fb0df9..04b86160bd86 100644 --- a/packages/mask/src/extension/popups/pages/Wallet/GasSetting/Prior1559GasSetting.tsx +++ b/packages/mask/src/extension/popups/pages/Wallet/GasSetting/Prior1559GasSetting.tsx @@ -97,6 +97,7 @@ const minGasPriceOfChain: ChainIdOptionalRecord = { [ChainId.BSC]: pow10(9).multipliedBy(5), // 5 Gwei [ChainId.Conflux]: pow10(9).multipliedBy(5), // 5 Gwei [ChainId.Matic]: pow10(9).multipliedBy(30), // 30 Gwei + [ChainId.Harmony]: pow10(9).multipliedBy(30), // 30 Gwei } export const Prior1559GasSetting = memo(() => { diff --git a/packages/mask/src/plugins/Wallet/SNSAdaptor/GasSettingDialog/Prior1559GasSetting.tsx b/packages/mask/src/plugins/Wallet/SNSAdaptor/GasSettingDialog/Prior1559GasSetting.tsx index 725775c21af7..f5eb978b5e5f 100644 --- a/packages/mask/src/plugins/Wallet/SNSAdaptor/GasSettingDialog/Prior1559GasSetting.tsx +++ b/packages/mask/src/plugins/Wallet/SNSAdaptor/GasSettingDialog/Prior1559GasSetting.tsx @@ -29,6 +29,7 @@ const minGasPriceOfChain: ChainIdOptionalRecord = { [ChainId.BSC]: pow10(9).multipliedBy(5), // 5 Gwei [ChainId.Conflux]: pow10(9).multipliedBy(5), // 5 Gwei [ChainId.Matic]: pow10(9).multipliedBy(30), // 30 Gwei + [ChainId.Harmony]: pow10(9).multipliedBy(30), // 30 Gwei } export const Prior1559GasSetting: FC = memo( From 50c1aded5902347f2cf55388ae6e749165fcc900 Mon Sep 17 00:00:00 2001 From: codingsh Date: Sun, 1 May 2022 19:42:31 +0000 Subject: [PATCH 22/33] chore(harmony): enable EIP1559 --- packages/web3-shared/evm/assets/chains.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/web3-shared/evm/assets/chains.json b/packages/web3-shared/evm/assets/chains.json index a883c9cc5e53..d5a0b110deaa 100644 --- a/packages/web3-shared/evm/assets/chains.json +++ b/packages/web3-shared/evm/assets/chains.json @@ -2793,7 +2793,7 @@ "name": "Harmony", "chain": "Harmony", "network": "mainnet", - "features": [], + "features": ["EIP1559"], "nativeCurrency": { "name": "ONE", "symbol": "ONE", "decimals": 18 }, "infoURL": "https://explorer.harmony.one", "shortName": "hmy", From 38a73b37b3a608b090dc35e29e6000f6dee25bb7 Mon Sep 17 00:00:00 2001 From: codingsh Date: Sun, 1 May 2022 19:53:01 +0000 Subject: [PATCH 23/33] chore(harmony): update tokens address --- packages/web3-constants/evm/token.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/web3-constants/evm/token.json b/packages/web3-constants/evm/token.json index 357a90de92de..3dd943a033f7 100644 --- a/packages/web3-constants/evm/token.json +++ b/packages/web3-constants/evm/token.json @@ -65,7 +65,7 @@ "Aurora": "0xb12bfca5a55806aaf64e99521918a4bf0fc40802", "Aurora_Testnet": "", "Conflux": "", - "Harmony": "0x44cED87b9F1492Bf2DCf5c16004832569f7f6cBa", + "Harmony": "0x985458E523dB3d53125813eD68c274899e9DfAb4", "Harmony_Test": "" }, "USDT_ADDRESS": { @@ -157,7 +157,7 @@ "Aurora": "", "Aurora_Testnet": "", "Conflux": "", - "Harmony": "", + "Harmony": "0xE176EBE47d621b984a73036B9DA5d834411ef734", "Harmony_Test": "" }, "COMP_ADDRESS": { @@ -456,7 +456,7 @@ "Aurora": "", "Aurora_Testnet": "", "Conflux": "", - "Harmony": "", + "Harmony": "0x224e64ec1BDce3870a6a6c777eDd450454068FEC", "Harmony_Test": "" }, "eUSDC_ADDRESS": { @@ -755,7 +755,7 @@ "Aurora": "", "Aurora_Testnet": "", "Conflux": "", - "Harmony": "", + "Harmony": "0xBEC775Cb42AbFa4288dE81F387a9b1A3c4Bc552A", "Harmony_Test": "" }, "YAM_ADDRESS": { @@ -1353,7 +1353,7 @@ "Aurora": "", "Aurora_Testnet": "", "Conflux": "", - "Harmony": "", + "Harmony": "0xcF323Aad9E522B93F11c352CaA519Ad0E14eB40F", "Harmony_Test": "" }, "aAAVE_ADDRESS": { @@ -1537,7 +1537,7 @@ "Aurora": "", "Aurora_Testnet": "", "Conflux": "", - "Harmony": "", + "Harmony": "0x218532a12a389a4a92fC0C5Fb22901D1c19198aA", "Harmony_Test": "" }, "aLINK_ADDRESS": { @@ -2135,7 +2135,7 @@ "Aurora": "", "Aurora_Testnet": "", "Conflux": "", - "Harmony": "", + "Harmony": "0xFa7191D292d5633f702B0bd7E3E3BcCC0e633200", "Harmony_Test": "" }, "aFRAX_ADDRESS": { From 8a515908099b8962566cf5ebf486bb16b219fba4 Mon Sep 17 00:00:00 2001 From: codingsh Date: Sun, 1 May 2022 21:38:06 +0000 Subject: [PATCH 24/33] chore(harmony): fixed show price gas --- .../popups/pages/Wallet/GasSetting/Prior1559GasSetting.tsx | 1 - .../Wallet/SNSAdaptor/GasSettingDialog/Prior1559GasSetting.tsx | 1 - packages/mask/src/plugins/Wallet/apis/debank.ts | 2 +- packages/web3-shared/evm/assets/chains.json | 2 +- 4 files changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/mask/src/extension/popups/pages/Wallet/GasSetting/Prior1559GasSetting.tsx b/packages/mask/src/extension/popups/pages/Wallet/GasSetting/Prior1559GasSetting.tsx index 04b86160bd86..fcbc87fb0df9 100644 --- a/packages/mask/src/extension/popups/pages/Wallet/GasSetting/Prior1559GasSetting.tsx +++ b/packages/mask/src/extension/popups/pages/Wallet/GasSetting/Prior1559GasSetting.tsx @@ -97,7 +97,6 @@ const minGasPriceOfChain: ChainIdOptionalRecord = { [ChainId.BSC]: pow10(9).multipliedBy(5), // 5 Gwei [ChainId.Conflux]: pow10(9).multipliedBy(5), // 5 Gwei [ChainId.Matic]: pow10(9).multipliedBy(30), // 30 Gwei - [ChainId.Harmony]: pow10(9).multipliedBy(30), // 30 Gwei } export const Prior1559GasSetting = memo(() => { diff --git a/packages/mask/src/plugins/Wallet/SNSAdaptor/GasSettingDialog/Prior1559GasSetting.tsx b/packages/mask/src/plugins/Wallet/SNSAdaptor/GasSettingDialog/Prior1559GasSetting.tsx index f5eb978b5e5f..725775c21af7 100644 --- a/packages/mask/src/plugins/Wallet/SNSAdaptor/GasSettingDialog/Prior1559GasSetting.tsx +++ b/packages/mask/src/plugins/Wallet/SNSAdaptor/GasSettingDialog/Prior1559GasSetting.tsx @@ -29,7 +29,6 @@ const minGasPriceOfChain: ChainIdOptionalRecord = { [ChainId.BSC]: pow10(9).multipliedBy(5), // 5 Gwei [ChainId.Conflux]: pow10(9).multipliedBy(5), // 5 Gwei [ChainId.Matic]: pow10(9).multipliedBy(30), // 30 Gwei - [ChainId.Harmony]: pow10(9).multipliedBy(30), // 30 Gwei } export const Prior1559GasSetting: FC = memo( diff --git a/packages/mask/src/plugins/Wallet/apis/debank.ts b/packages/mask/src/plugins/Wallet/apis/debank.ts index 75102809f98a..e64de5fe31d7 100644 --- a/packages/mask/src/plugins/Wallet/apis/debank.ts +++ b/packages/mask/src/plugins/Wallet/apis/debank.ts @@ -38,7 +38,7 @@ const fieldKeys = ['fast', 'normal', 'slow'] as const * Once debank fixes it, we will remove this modifier. */ function gasModifier(gasDict: GasPriceDictResponse, chain: string) { - if ([auroraChainOnDebank, harmonyChainOnDebank, arbitrumChainOnDebank].includes(chain)) { + if ([auroraChainOnDebank, arbitrumChainOnDebank].includes(chain)) { fieldKeys.forEach((fieldKey) => { const field = gasDict.data[fieldKey] field.price = Math.max(field.price, formatGweiToWei(1).toNumber()) diff --git a/packages/web3-shared/evm/assets/chains.json b/packages/web3-shared/evm/assets/chains.json index d5a0b110deaa..aad0eb4fb04a 100644 --- a/packages/web3-shared/evm/assets/chains.json +++ b/packages/web3-shared/evm/assets/chains.json @@ -2793,7 +2793,7 @@ "name": "Harmony", "chain": "Harmony", "network": "mainnet", - "features": ["EIP1559"], + "features": [""], "nativeCurrency": { "name": "ONE", "symbol": "ONE", "decimals": 18 }, "infoURL": "https://explorer.harmony.one", "shortName": "hmy", From 8dbb41038f0eaff25c544b8d5646cb11049b3a8b Mon Sep 17 00:00:00 2001 From: codingsh Date: Sun, 1 May 2022 22:01:20 +0000 Subject: [PATCH 25/33] chore(harmony): change traderInfo to show harmony gas price on tradePlugin --- .../mask/src/plugins/Trader/SNSAdaptor/trader/ConfirmDialog.tsx | 2 +- .../mask/src/plugins/Trader/SNSAdaptor/trader/TraderInfo.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/mask/src/plugins/Trader/SNSAdaptor/trader/ConfirmDialog.tsx b/packages/mask/src/plugins/Trader/SNSAdaptor/trader/ConfirmDialog.tsx index b66e38e1452c..4dc11a1d6ea9 100644 --- a/packages/mask/src/plugins/Trader/SNSAdaptor/trader/ConfirmDialog.tsx +++ b/packages/mask/src/plugins/Trader/SNSAdaptor/trader/ConfirmDialog.tsx @@ -157,7 +157,7 @@ export function ConfirmDialogUI(props: ConfirmDialogUIProps) { }, [gas, gasPrice]) const feeValueUSD = useMemo( - () => (gasFee ? new BigNumber(formatWeiToEther(gasFee).times(tokenPrice).toFixed(2)) : '0'), + () => (gasFee ? new BigNumber(formatWeiToEther(gasFee).times(tokenPrice).toFixed(7)) : '0'), [gasFee, tokenPrice], ) // #endregion diff --git a/packages/mask/src/plugins/Trader/SNSAdaptor/trader/TraderInfo.tsx b/packages/mask/src/plugins/Trader/SNSAdaptor/trader/TraderInfo.tsx index de8a35058e61..24bf83e72a49 100644 --- a/packages/mask/src/plugins/Trader/SNSAdaptor/trader/TraderInfo.tsx +++ b/packages/mask/src/plugins/Trader/SNSAdaptor/trader/TraderInfo.tsx @@ -107,7 +107,7 @@ export const TraderInfo = memo(({ trade, gasPrice, isBest, onCl }, [trade.gas?.value, gasPrice]) const feeValueUSD = useMemo( - () => (gasFee ? new BigNumber(formatWeiToEther(gasFee).times(tokenPrice).toFixed(2)) : '0'), + () => (gasFee ? new BigNumber(formatWeiToEther(gasFee).times(tokenPrice).toFixed(7)) : '0'), [gasFee, tokenPrice], ) From 5ecd195fdb66fb2b0138ee15e1fa0e4296e7ad66 Mon Sep 17 00:00:00 2001 From: codingsh Date: Sun, 1 May 2022 22:19:55 +0000 Subject: [PATCH 26/33] chore(harmony): update feeValueUSD --- .../src/plugins/Trader/SNSAdaptor/trader/ConfirmDialog.tsx | 7 ++++++- .../src/plugins/Trader/SNSAdaptor/trader/TraderInfo.tsx | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/packages/mask/src/plugins/Trader/SNSAdaptor/trader/ConfirmDialog.tsx b/packages/mask/src/plugins/Trader/SNSAdaptor/trader/ConfirmDialog.tsx index 4dc11a1d6ea9..6621a5e4ff84 100644 --- a/packages/mask/src/plugins/Trader/SNSAdaptor/trader/ConfirmDialog.tsx +++ b/packages/mask/src/plugins/Trader/SNSAdaptor/trader/ConfirmDialog.tsx @@ -157,7 +157,12 @@ export function ConfirmDialogUI(props: ConfirmDialogUIProps) { }, [gas, gasPrice]) const feeValueUSD = useMemo( - () => (gasFee ? new BigNumber(formatWeiToEther(gasFee).times(tokenPrice).toFixed(7)) : '0'), + () => + gasFee + ? new BigNumber(formatWeiToEther(gasFee).times(tokenPrice).toPrecision(2)) < new BigNumber(0.01) + ? '< 0.01' + : new BigNumber(formatWeiToEther(gasFee).times(tokenPrice).toPrecision(2)) + : '0', [gasFee, tokenPrice], ) // #endregion diff --git a/packages/mask/src/plugins/Trader/SNSAdaptor/trader/TraderInfo.tsx b/packages/mask/src/plugins/Trader/SNSAdaptor/trader/TraderInfo.tsx index 24bf83e72a49..a78eb66954e6 100644 --- a/packages/mask/src/plugins/Trader/SNSAdaptor/trader/TraderInfo.tsx +++ b/packages/mask/src/plugins/Trader/SNSAdaptor/trader/TraderInfo.tsx @@ -107,7 +107,12 @@ export const TraderInfo = memo(({ trade, gasPrice, isBest, onCl }, [trade.gas?.value, gasPrice]) const feeValueUSD = useMemo( - () => (gasFee ? new BigNumber(formatWeiToEther(gasFee).times(tokenPrice).toFixed(7)) : '0'), + () => + gasFee + ? new BigNumber(formatWeiToEther(gasFee).times(tokenPrice).toPrecision(2)) < new BigNumber(0.01) + ? '< 0.01' + : new BigNumber(formatWeiToEther(gasFee).times(tokenPrice).toPrecision(2)) + : '0', [gasFee, tokenPrice], ) From e8c4000985c3278f925d2b8615af875dacc239d6 Mon Sep 17 00:00:00 2001 From: codingsh Date: Wed, 4 May 2022 02:17:47 +0200 Subject: [PATCH 27/33] chore(harmony): disable venowswap and openswap --- packages/mask/src/plugins/Trader/apis/trader/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/mask/src/plugins/Trader/apis/trader/index.ts b/packages/mask/src/plugins/Trader/apis/trader/index.ts index 59801ca1c28e..b1fa463f06d9 100644 --- a/packages/mask/src/plugins/Trader/apis/trader/index.ts +++ b/packages/mask/src/plugins/Trader/apis/trader/index.ts @@ -53,7 +53,7 @@ export async function getAvailableTraderProviders(chainId: ChainId) { case NetworkType.Aurora: return [TradeProvider.DODO, TradeProvider.WANNASWAP, TradeProvider.TRISOLARIS] case NetworkType.Harmony: - return [TradeProvider.SUSHISWAP, TradeProvider.VENONSWAP, TradeProvider.OPENSWAP] + return [TradeProvider.SUSHISWAP] case NetworkType.Boba: case NetworkType.Fuse: case NetworkType.Metis: From f44c7b0005251e0a1d9a7ff2bcce9bcc4edeac77 Mon Sep 17 00:00:00 2001 From: unclebill Date: Wed, 4 May 2022 11:46:16 +0800 Subject: [PATCH 28/33] fix: feeValueUSD --- .../SNSAdaptor/trader/ConfirmDialog.tsx | 45 +++++++++---------- .../Trader/SNSAdaptor/trader/TraderInfo.tsx | 22 ++++----- packages/web3-shared/evm/utils/formatter.ts | 5 +++ 3 files changed, 37 insertions(+), 35 deletions(-) diff --git a/packages/mask/src/plugins/Trader/SNSAdaptor/trader/ConfirmDialog.tsx b/packages/mask/src/plugins/Trader/SNSAdaptor/trader/ConfirmDialog.tsx index 6621a5e4ff84..855a89847167 100644 --- a/packages/mask/src/plugins/Trader/SNSAdaptor/trader/ConfirmDialog.tsx +++ b/packages/mask/src/plugins/Trader/SNSAdaptor/trader/ConfirmDialog.tsx @@ -1,31 +1,33 @@ -import { useCallback, useEffect, useMemo, useState } from 'react' -import { ExternalLink } from 'react-feather' -import BigNumber from 'bignumber.js' -import { Alert, Box, Button, DialogActions, DialogContent, Link, Typography } from '@mui/material' -import { makeStyles, MaskColorVar, useStylesExtends } from '@masknet/theme' +import { CramIcon, InfoIcon, RetweetIcon } from '@masknet/icons' +import { FormattedAddress, FormattedBalance, InjectedDialog, TokenIcon } from '@masknet/shared' +import { isDashboardPage } from '@masknet/shared-base' import { useValueRef } from '@masknet/shared-base-ui' -import { InjectedDialog, FormattedAddress, FormattedBalance, TokenIcon } from '@masknet/shared' -import type { TradeComputed } from '../../types' -import type { FungibleTokenDetailed, Wallet } from '@masknet/web3-shared-evm' +import { makeStyles, MaskColorVar, useStylesExtends } from '@masknet/theme' +import { isZero, multipliedBy } from '@masknet/web3-shared-base' import { createNativeToken, formatBalance, formatEthereumAddress, formatPercentage, + formatUSD, formatWeiToEther, + FungibleTokenDetailed, resolveAddressLinkOnExplorer, + Wallet, } from '@masknet/web3-shared-evm' +import { Alert, Box, Button, DialogActions, DialogContent, Link, Typography } from '@mui/material' +import BigNumber from 'bignumber.js' +import { useCallback, useEffect, useMemo, useState } from 'react' +import { ExternalLink } from 'react-feather' +import { useUpdateEffect } from 'react-use' import { useI18N } from '../../../../utils' -import { InfoIcon, RetweetIcon, CramIcon } from '@masknet/icons' -import { isZero, multipliedBy } from '@masknet/web3-shared-base' -import { isDashboardPage } from '@masknet/shared-base' -import { TargetChainIdContext } from '../../trader/useTargetChainIdContext' -import { currentSlippageSettings } from '../../settings' import { useNativeTokenPrice } from '../../../Wallet/hooks/useTokenPrice' -import { useUpdateEffect } from 'react-use' import { ONE_BIPS } from '../../constants' -import { useGreatThanSlippageSetting } from './hooks/useGreatThanSlippageSetting' +import { currentSlippageSettings } from '../../settings' import { AllProviderTradeContext } from '../../trader/useAllProviderTradeContext' +import { TargetChainIdContext } from '../../trader/useTargetChainIdContext' +import type { TradeComputed } from '../../types' +import { useGreatThanSlippageSetting } from './hooks/useGreatThanSlippageSetting' const useStyles = makeStyles<{ isDashboard: boolean }>()((theme, { isDashboard }) => ({ section: { @@ -156,15 +158,10 @@ export function ConfirmDialogUI(props: ConfirmDialogUIProps) { return gas && gasPrice ? multipliedBy(gasPrice, gas).integerValue().toFixed() : '0' }, [gas, gasPrice]) - const feeValueUSD = useMemo( - () => - gasFee - ? new BigNumber(formatWeiToEther(gasFee).times(tokenPrice).toPrecision(2)) < new BigNumber(0.01) - ? '< 0.01' - : new BigNumber(formatWeiToEther(gasFee).times(tokenPrice).toPrecision(2)) - : '0', - [gasFee, tokenPrice], - ) + const feeValueUSD = useMemo(() => { + if (!gasFee) return '0' + return formatUSD(formatWeiToEther(gasFee).times(tokenPrice)) + }, [gasFee, tokenPrice]) // #endregion const staled = !!(executionPrice && !executionPrice.isEqualTo(cacheTrade?.executionPrice ?? 0)) diff --git a/packages/mask/src/plugins/Trader/SNSAdaptor/trader/TraderInfo.tsx b/packages/mask/src/plugins/Trader/SNSAdaptor/trader/TraderInfo.tsx index a78eb66954e6..d30e7750e4ae 100644 --- a/packages/mask/src/plugins/Trader/SNSAdaptor/trader/TraderInfo.tsx +++ b/packages/mask/src/plugins/Trader/SNSAdaptor/trader/TraderInfo.tsx @@ -1,7 +1,13 @@ import { memo, useMemo } from 'react' import type { TradeInfo } from '../../types' import { makeStyles, MaskColorVar } from '@masknet/theme' -import { createNativeToken, formatBalance, formatPercentage, formatWeiToEther } from '@masknet/web3-shared-evm' +import { + createNativeToken, + formatBalance, + formatPercentage, + formatUSD, + formatWeiToEther, +} from '@masknet/web3-shared-evm' import { Box, CircularProgress, TextField, Typography } from '@mui/material' import { resolveTradeProviderName } from '../../pipes' import { FormattedBalance } from '@masknet/shared' @@ -13,7 +19,6 @@ import { BestTradeIcon, TriangleWarning } from '@masknet/icons' import { useAsyncRetry } from 'react-use' import { PluginTraderRPC } from '../../messages' import { TradeProvider } from '@masknet/public-api' -import BigNumber from 'bignumber.js' import { useNativeTokenPrice } from '../../../Wallet/hooks/useTokenPrice' import { TargetChainIdContext } from '../../trader/useTargetChainIdContext' import { useGreatThanSlippageSetting } from './hooks/useGreatThanSlippageSetting' @@ -106,15 +111,10 @@ export const TraderInfo = memo(({ trade, gasPrice, isBest, onCl return trade.gas.value && gasPrice ? multipliedBy(gasPrice, trade.gas.value).integerValue().toFixed() : 0 }, [trade.gas?.value, gasPrice]) - const feeValueUSD = useMemo( - () => - gasFee - ? new BigNumber(formatWeiToEther(gasFee).times(tokenPrice).toPrecision(2)) < new BigNumber(0.01) - ? '< 0.01' - : new BigNumber(formatWeiToEther(gasFee).times(tokenPrice).toPrecision(2)) - : '0', - [gasFee, tokenPrice], - ) + const feeValueUSD = useMemo(() => { + if (!gasFee) return '0' + return formatUSD(formatWeiToEther(gasFee).times(tokenPrice)) + }, [gasFee, tokenPrice]) const isGreatThanSlippageSetting = useGreatThanSlippageSetting(trade.value?.priceImpact) diff --git a/packages/web3-shared/evm/utils/formatter.ts b/packages/web3-shared/evm/utils/formatter.ts index 1c907af9d583..74be97189f87 100644 --- a/packages/web3-shared/evm/utils/formatter.ts +++ b/packages/web3-shared/evm/utils/formatter.ts @@ -98,3 +98,8 @@ export function formatGweiToWei(value: BigNumber.Value) { export function formatGweiToEther(value: BigNumber.Value) { return new BigNumber(value).shiftedBy(-9) } + +export function formatUSD(value: BigNumber.Value, significant = 2): string { + const bn = new BigNumber(value) + return bn.lt(0.01) ? '<$0.01' : bn.toFixed(significant) +} From 50ca7c56fb9ed31e7057b2670887db53f9436ad8 Mon Sep 17 00:00:00 2001 From: codingsh Date: Thu, 5 May 2022 16:28:04 +0100 Subject: [PATCH 29/33] chore(harmony): change venonswap to venomswap and add DefiKingdoms dex --- cspell.json | 4 +- .../src/plugins/Trader/apis/trader/index.ts | 7 +- .../plugins/Trader/constants/defikingdoms.ts | 14 ++ .../src/plugins/Trader/constants/index.ts | 3 +- .../constants/{venonswap.ts => venomswap.ts} | 4 +- packages/mask/src/plugins/Trader/pipes.ts | 3 +- .../Trader/trader/useAllTradeComputed.ts | 22 +- .../Trader/trader/useGetTradeContext.ts | 32 ++- .../plugins/Trader/trader/useTradeCallback.ts | 4 +- .../plugins/Trader/trader/useTradeContext.ts | 225 ------------------ .../mask/src/plugins/Trader/types/trader.ts | 3 +- packages/mask/src/resources/SushiSwapIcon.tsx | 11 - packages/public-api/src/web.ts | 3 +- packages/web3-constants/evm/token.json | 46 ++++ packages/web3-constants/evm/trader.json | 102 +++++++- packages/web3-contracts/abis/ERC20.json | 33 ++- .../web3-contracts/types/AaveLendingPool.d.ts | 2 +- .../types/AaveLendingPoolAddressProvider.d.ts | 2 +- .../types/AaveProtocolDataProvider.d.ts | 2 +- .../types/AaveStableDebtToken.d.ts | 2 +- .../web3-contracts/types/CryptoPunks.d.ts | 33 +++ packages/web3-contracts/types/ERC1155.d.ts | 33 +++ packages/web3-contracts/types/ERC20.d.ts | 2 + .../web3-contracts/types/Qualification.d.ts | 10 +- .../evm/constants/getContractOwnerDomain.ts | 4 + packages/web3-shared/evm/constants/tokens.ts | 1 + 26 files changed, 329 insertions(+), 278 deletions(-) create mode 100644 packages/mask/src/plugins/Trader/constants/defikingdoms.ts rename packages/mask/src/plugins/Trader/constants/{venonswap.ts => venomswap.ts} (77%) delete mode 100644 packages/mask/src/plugins/Trader/trader/useTradeContext.ts delete mode 100644 packages/mask/src/resources/SushiSwapIcon.tsx create mode 100644 packages/web3-contracts/types/CryptoPunks.d.ts create mode 100644 packages/web3-contracts/types/ERC1155.d.ts diff --git a/cspell.json b/cspell.json index 6213b47ecfe0..16fb37fd5caf 100644 --- a/cspell.json +++ b/cspell.json @@ -75,6 +75,7 @@ "cyberlab", "datas", "debank", + "defikingdoms", "denorm", "dfyn", "dhedge", @@ -267,9 +268,10 @@ "urlcat", "usermenu", "vcent", - "venonswap", + "venomswap", "viet", "viewbox", + "viperswap", "visualcompletion", "walletconnect", "wannaswap", diff --git a/packages/mask/src/plugins/Trader/apis/trader/index.ts b/packages/mask/src/plugins/Trader/apis/trader/index.ts index b1fa463f06d9..c36a2ebde6f3 100644 --- a/packages/mask/src/plugins/Trader/apis/trader/index.ts +++ b/packages/mask/src/plugins/Trader/apis/trader/index.ts @@ -53,7 +53,12 @@ export async function getAvailableTraderProviders(chainId: ChainId) { case NetworkType.Aurora: return [TradeProvider.DODO, TradeProvider.WANNASWAP, TradeProvider.TRISOLARIS] case NetworkType.Harmony: - return [TradeProvider.SUSHISWAP] + return [ + TradeProvider.SUSHISWAP, + TradeProvider.VENOMSWAP, + TradeProvider.OPENSWAP, + TradeProvider.DEFIKINGDOMS, + ] case NetworkType.Boba: case NetworkType.Fuse: case NetworkType.Metis: diff --git a/packages/mask/src/plugins/Trader/constants/defikingdoms.ts b/packages/mask/src/plugins/Trader/constants/defikingdoms.ts new file mode 100644 index 000000000000..a2661c980a5d --- /dev/null +++ b/packages/mask/src/plugins/Trader/constants/defikingdoms.ts @@ -0,0 +1,14 @@ +import { ChainId, DAI, USDC, USDT, WBTC, JEWEL, WNATIVE, WNATIVE_ONLY } from '@masknet/web3-shared-evm' + +import type { ERC20AgainstToken, ERC20TokenCustomizedBase } from './types' + +/** + * Some tokens can only be swapped via certain pairs, + * so we override the list of bases that are considered for these tokens. + */ +export const DEFIKINGDOMS_CUSTOM_BASES: ERC20TokenCustomizedBase = {} + +export const DEFIKINGDOMS_BASE_AGAINST_TOKENS: ERC20AgainstToken = { + ...WNATIVE_ONLY, + [ChainId.Harmony]: [WNATIVE, DAI, USDC, WBTC, USDT, JEWEL].map((x) => x[ChainId.Harmony]), +} diff --git a/packages/mask/src/plugins/Trader/constants/index.ts b/packages/mask/src/plugins/Trader/constants/index.ts index 76514b3e2677..8b2ec0bf672c 100644 --- a/packages/mask/src/plugins/Trader/constants/index.ts +++ b/packages/mask/src/plugins/Trader/constants/index.ts @@ -13,7 +13,8 @@ export * from './traderjoe' export * from './pangolindex' export * from './wannaswap' export * from './trisolaris' -export * from './venonswap' +export * from './venomswap' export * from './openswap' export * from './mdex' +export * from './defikingdoms' export type { ERC20TokenCustomizedBase, ERC20AgainstToken } from './types' diff --git a/packages/mask/src/plugins/Trader/constants/venonswap.ts b/packages/mask/src/plugins/Trader/constants/venomswap.ts similarity index 77% rename from packages/mask/src/plugins/Trader/constants/venonswap.ts rename to packages/mask/src/plugins/Trader/constants/venomswap.ts index dbd0ace755a6..25501e3d2044 100644 --- a/packages/mask/src/plugins/Trader/constants/venonswap.ts +++ b/packages/mask/src/plugins/Trader/constants/venomswap.ts @@ -6,9 +6,9 @@ import type { ERC20AgainstToken, ERC20TokenCustomizedBase } from './types' * Some tokens can only be swapped via certain pairs, * so we override the list of bases that are considered for these tokens. */ -export const VENONSWAP_CUSTOM_BASES: ERC20TokenCustomizedBase = {} +export const VENOMSWAP_CUSTOM_BASES: ERC20TokenCustomizedBase = {} -export const VENONSWAP_BASE_AGAINST_TOKENS: ERC20AgainstToken = { +export const VENOMSWAP_BASE_AGAINST_TOKENS: ERC20AgainstToken = { ...WNATIVE_ONLY, [ChainId.Harmony]: [WNATIVE, DAI, VIPER, USDC, WBTC, USDT].map((x) => x[ChainId.Harmony]), } diff --git a/packages/mask/src/plugins/Trader/pipes.ts b/packages/mask/src/plugins/Trader/pipes.ts index 8e4b5b916475..491bd0773dc3 100644 --- a/packages/mask/src/plugins/Trader/pipes.ts +++ b/packages/mask/src/plugins/Trader/pipes.ts @@ -40,9 +40,10 @@ export const resolveTradeProviderName = createLookupTableResolver { throw new Error(`Unknown provider type: ${tradeProvider}`) diff --git a/packages/mask/src/plugins/Trader/trader/useAllTradeComputed.ts b/packages/mask/src/plugins/Trader/trader/useAllTradeComputed.ts index be07bbe8e380..852cb59ba64d 100644 --- a/packages/mask/src/plugins/Trader/trader/useAllTradeComputed.ts +++ b/packages/mask/src/plugins/Trader/trader/useAllTradeComputed.ts @@ -199,19 +199,27 @@ export function useAllTradeComputed( traderEstimateGas: wannaSwapEstimateGas, } = useUniswapV2Like(tradeProviders, TradeProvider.WANNASWAP, inputAmount_, inputToken, outputToken) - // VenonSwap + // Venom Swap const { - trader_: venonswap_, - trader: venonswap, - traderEstimateGas: venonswapEstimateGas, - } = useUniswapV2Like(tradeProviders, TradeProvider.VENONSWAP, inputAmount_, inputToken, outputToken) + trader_: venomswap_, + trader: venomswap, + traderEstimateGas: venomswapEstimateGas, + } = useUniswapV2Like(tradeProviders, TradeProvider.VENOMSWAP, inputAmount_, inputToken, outputToken) - // OpenSwap + // Open Swap const { trader_: openswap_, trader: openswap, traderEstimateGas: openswapEstimateGas, } = useUniswapV2Like(tradeProviders, TradeProvider.OPENSWAP, inputAmount_, inputToken, outputToken) + + // Defi Kingdoms + const { + trader_: defikingdoms_, + trader: defikingdoms, + traderEstimateGas: defikingdomsEstimateGas, + } = useUniswapV2Like(tradeProviders, TradeProvider.DEFIKINGDOMS, inputAmount_, inputToken, outputToken) + // Mdex const { trader_: mdex_, @@ -235,7 +243,7 @@ export function useAllTradeComputed( { provider: TradeProvider.OPENOCEAN, ...openocean_, value: openocean, gas: openoceanSwapEstimateGas }, { provider: TradeProvider.WANNASWAP, ...wannaswap_, value: wannaswap, gas: wannaSwapEstimateGas }, { provider: TradeProvider.TRISOLARIS, ...trisolaris_, value: trisolaris, gas: trisolarisEstimateGas }, - { provider: TradeProvider.VENONSWAP, ...venonswap_, value: venonswap, gas: venonswapEstimateGas }, + { provider: TradeProvider.VENOMSWAP, ...venomswap_, value: venomswap, gas: venomswapEstimateGas }, { provider: TradeProvider.OPENSWAP, ...openswap_, value: openswap, gas: openswapEstimateGas }, { provider: TradeProvider.MDEX, ...mdex_, value: mdex, gas: mdexEstimateGas }, ] diff --git a/packages/mask/src/plugins/Trader/trader/useGetTradeContext.ts b/packages/mask/src/plugins/Trader/trader/useGetTradeContext.ts index 031a6e2ef514..e28ff07f5a8d 100644 --- a/packages/mask/src/plugins/Trader/trader/useGetTradeContext.ts +++ b/packages/mask/src/plugins/Trader/trader/useGetTradeContext.ts @@ -21,12 +21,14 @@ import { WANNASWAP_CUSTOM_BASES, TRISOLARIS_BASE_AGAINST_TOKENS, TRISOLARIS_CUSTOM_BASES, - VENONSWAP_BASE_AGAINST_TOKENS, - VENONSWAP_CUSTOM_BASES, + VENOMSWAP_BASE_AGAINST_TOKENS, + VENOMSWAP_CUSTOM_BASES, OPENSWAP_BASE_AGAINST_TOKENS, OPENSWAP_CUSTOM_BASES, MDEX_BASE_AGAINST_TOKENS, MDEX_CUSTOM_BASES, + DEFIKINGDOMS_BASE_AGAINST_TOKENS, + DEFIKINGDOMS_CUSTOM_BASES, } from '../constants' import { unreachable } from '@dimensiondev/kit' import { TargetChainIdContext } from './useTargetChainIdContext' @@ -179,17 +181,17 @@ export function useGetTradeContext(tradeProvider?: TradeProvider) { ADDITIONAL_TOKENS: {}, CUSTOM_TOKENS: MDEX_CUSTOM_BASES, } - case TradeProvider.VENONSWAP: + case TradeProvider.VENOMSWAP: return { TYPE: tradeProvider, IS_UNISWAP_V2_LIKE: true, - GRAPH_API: DEX_TRADE.VENONSWAP_THEGRAPH, - INIT_CODE_HASH: DEX_TRADE.VENONSWAP_INIT_CODE_HASH, - ROUTER_CONTRACT_ADDRESS: DEX_TRADE.VENONSWAP_ROUTER_ADDRESS, - FACTORY_CONTRACT_ADDRESS: DEX_TRADE.VENONSWAP_FACTORY_ADDRESS, - AGAINST_TOKENS: VENONSWAP_BASE_AGAINST_TOKENS, + GRAPH_API: DEX_TRADE.VENOMSWAP_THEGRAPH, + INIT_CODE_HASH: DEX_TRADE.VENOMSWAP_INIT_CODE_HASH, + ROUTER_CONTRACT_ADDRESS: DEX_TRADE.VENOMSWAP_ROUTER_ADDRESS, + FACTORY_CONTRACT_ADDRESS: DEX_TRADE.VENOMSWAP_FACTORY_ADDRESS, + AGAINST_TOKENS: VENOMSWAP_BASE_AGAINST_TOKENS, ADDITIONAL_TOKENS: {}, - CUSTOM_TOKENS: VENONSWAP_CUSTOM_BASES, + CUSTOM_TOKENS: VENOMSWAP_CUSTOM_BASES, } case TradeProvider.OPENSWAP: return { @@ -203,6 +205,18 @@ export function useGetTradeContext(tradeProvider?: TradeProvider) { ADDITIONAL_TOKENS: {}, CUSTOM_TOKENS: OPENSWAP_CUSTOM_BASES, } + case TradeProvider.DEFIKINGDOMS: + return { + TYPE: tradeProvider, + IS_UNISWAP_V2_LIKE: true, + GRAPH_API: DEX_TRADE.DEFIKINGDOMS_THEGRAPH, + INIT_CODE_HASH: DEX_TRADE.DEFIKINGDOMS_INIT_CODE_HASH, + ROUTER_CONTRACT_ADDRESS: DEX_TRADE.DEFIKINGDOMS_ROUTER_ADDRESS, + FACTORY_CONTRACT_ADDRESS: DEX_TRADE.DEFIKINGDOMS_FACTORY_ADDRESS, + AGAINST_TOKENS: DEFIKINGDOMS_BASE_AGAINST_TOKENS, + ADDITIONAL_TOKENS: {}, + CUSTOM_TOKENS: DEFIKINGDOMS_CUSTOM_BASES, + } case TradeProvider.ZRX: return { TYPE: tradeProvider, diff --git a/packages/mask/src/plugins/Trader/trader/useTradeCallback.ts b/packages/mask/src/plugins/Trader/trader/useTradeCallback.ts index 64f138af4397..35d55117ffcf 100644 --- a/packages/mask/src/plugins/Trader/trader/useTradeCallback.ts +++ b/packages/mask/src/plugins/Trader/trader/useTradeCallback.ts @@ -100,12 +100,14 @@ export function useTradeCallback( return uniswapV2Like case TradeProvider.TRISOLARIS: return uniswapV2Like - case TradeProvider.VENONSWAP: + case TradeProvider.VENOMSWAP: return uniswapV2Like case TradeProvider.OPENSWAP: return uniswapV2Like case TradeProvider.MDEX: return uniswapV2Like + case TradeProvider.DEFIKINGDOMS: + return uniswapV2Like case TradeProvider.ZRX: return zrx case TradeProvider.BALANCER: diff --git a/packages/mask/src/plugins/Trader/trader/useTradeContext.ts b/packages/mask/src/plugins/Trader/trader/useTradeContext.ts deleted file mode 100644 index 51c9c5f673f5..000000000000 --- a/packages/mask/src/plugins/Trader/trader/useTradeContext.ts +++ /dev/null @@ -1,225 +0,0 @@ -import { createContext, useMemo } from 'react' -import { unreachable } from '@dimensiondev/kit' -import { TradeProvider } from '@masknet/public-api' -import { getTraderConstants } from '@masknet/web3-shared-evm' -import { - PANCAKESWAP_BASE_AGAINST_TOKENS, - PANCAKESWAP_CUSTOM_BASES, - QUICKSWAP_BASE_AGAINST_TOKENS, - QUICKSWAP_CUSTOM_BASES, - SASHIMISWAP_BASE_AGAINST_TOKENS, - SASHIMISWAP_CUSTOM_BASES, - SUSHISWAP_BASE_AGAINST_TOKENS, - SUSHISWAP_CUSTOM_BASES, - UNISWAP_BASE_AGAINST_TOKENS, - UNISWAP_CUSTOM_BASES, - TRADERJOE_BASE_AGAINST_TOKENS, - TRADERJOE_CUSTOM_BASES, - PANGOLIN_BASE_AGAINST_TOKENS, - PANGOLIN_CUSTOM_BASES, - WANNASWAP_BASE_AGAINST_TOKENS, - WANNASWAP_CUSTOM_BASES, - TRISOLARIS_CUSTOM_BASES, - TRISOLARIS_BASE_AGAINST_TOKENS, - VENONSWAP_CUSTOM_BASES, - VENONSWAP_BASE_AGAINST_TOKENS, - OPENSWAP_CUSTOM_BASES, - OPENSWAP_BASE_AGAINST_TOKENS, - MDEX_CUSTOM_BASES, - MDEX_BASE_AGAINST_TOKENS, -} from '../constants' -import type { TradeContext as TradeContext_ } from '../types' -import { TargetChainIdContext } from './useTargetChainIdContext' - -export const TradeContext = createContext(null) - -export function useTradeContext(tradeProvider: TradeProvider) { - const { targetChainId: chainId } = TargetChainIdContext.useContainer() - return useMemo(() => { - const DEX_TRADE = getTraderConstants(chainId) - switch (tradeProvider) { - case TradeProvider.UNISWAP_V2: - return { - TYPE: tradeProvider, - IS_UNISWAP_V2_LIKE: true, - GRAPH_API: DEX_TRADE.UNISWAP_V2_THEGRAPH, - INIT_CODE_HASH: DEX_TRADE.UNISWAP_V2_INIT_CODE_HASH, - ROUTER_CONTRACT_ADDRESS: DEX_TRADE.UNISWAP_V2_ROUTER_ADDRESS, - FACTORY_CONTRACT_ADDRESS: DEX_TRADE.UNISWAP_V2_FACTORY_ADDRESS, - AGAINST_TOKENS: UNISWAP_BASE_AGAINST_TOKENS, - ADDITIONAL_TOKENS: {}, - CUSTOM_TOKENS: UNISWAP_CUSTOM_BASES, - } - case TradeProvider.UNISWAP_V3: - return { - TYPE: tradeProvider, - IS_UNISWAP_V3_LIKE: true, - GRAPH_API: DEX_TRADE.UNISWAP_V3_THEGRAPH, - INIT_CODE_HASH: DEX_TRADE.UNISWAP_V3_INIT_CODE_HASH, - ROUTER_CONTRACT_ADDRESS: DEX_TRADE.UNISWAP_SWAP_ROUTER_ADDRESS, - FACTORY_CONTRACT_ADDRESS: DEX_TRADE.UNISWAP_V3_FACTORY_ADDRESS, - AGAINST_TOKENS: UNISWAP_BASE_AGAINST_TOKENS, - ADDITIONAL_TOKENS: {}, - CUSTOM_TOKENS: UNISWAP_CUSTOM_BASES, - } - case TradeProvider.SUSHISWAP: - return { - TYPE: tradeProvider, - IS_UNISWAP_V2_LIKE: true, - GRAPH_API: DEX_TRADE.SUSHISWAP_THEGRAPH, - INIT_CODE_HASH: DEX_TRADE.SUSHISWAP_INIT_CODE_HASH, - ROUTER_CONTRACT_ADDRESS: DEX_TRADE.SUSHISWAP_ROUTER_ADDRESS, - FACTORY_CONTRACT_ADDRESS: DEX_TRADE.SUSHISWAP_FACTORY_ADDRESS, - AGAINST_TOKENS: SUSHISWAP_BASE_AGAINST_TOKENS, - ADDITIONAL_TOKENS: {}, - CUSTOM_TOKENS: SUSHISWAP_CUSTOM_BASES, - } - case TradeProvider.SASHIMISWAP: - return { - TYPE: tradeProvider, - IS_UNISWAP_V2_LIKE: true, - GRAPH_API: DEX_TRADE.SASHIMISWAP_THEGRAPH, - INIT_CODE_HASH: DEX_TRADE.SASHIMISWAP_INIT_CODE_HASH, - ROUTER_CONTRACT_ADDRESS: DEX_TRADE.SASHIMISWAP_ROUTER_ADDRESS, - FACTORY_CONTRACT_ADDRESS: DEX_TRADE.SASHIMISWAP_FACTORY_ADDRESS, - AGAINST_TOKENS: SASHIMISWAP_BASE_AGAINST_TOKENS, - ADDITIONAL_TOKENS: {}, - CUSTOM_TOKENS: SASHIMISWAP_CUSTOM_BASES, - } - case TradeProvider.QUICKSWAP: - return { - TYPE: tradeProvider, - IS_UNISWAP_V2_LIKE: true, - GRAPH_API: DEX_TRADE.QUICKSWAP_THEGRAPH, - INIT_CODE_HASH: DEX_TRADE.QUICKSWAP_INIT_CODE_HASH, - ROUTER_CONTRACT_ADDRESS: DEX_TRADE.QUICKSWAP_ROUTER_ADDRESS, - FACTORY_CONTRACT_ADDRESS: DEX_TRADE.QUICKSWAP_FACTORY_ADDRESS, - AGAINST_TOKENS: QUICKSWAP_BASE_AGAINST_TOKENS, - ADDITIONAL_TOKENS: {}, - CUSTOM_TOKENS: QUICKSWAP_CUSTOM_BASES, - } - case TradeProvider.PANCAKESWAP: - return { - TYPE: tradeProvider, - IS_UNISWAP_V2_LIKE: true, - GRAPH_API: DEX_TRADE.PANCAKESWAP_THEGRAPH, - INIT_CODE_HASH: DEX_TRADE.PANCAKESWAP_INIT_CODE_HASH, - ROUTER_CONTRACT_ADDRESS: DEX_TRADE.PANCAKESWAP_ROUTER_ADDRESS, - FACTORY_CONTRACT_ADDRESS: DEX_TRADE.PANCAKESWAP_FACTORY_ADDRESS, - AGAINST_TOKENS: PANCAKESWAP_BASE_AGAINST_TOKENS, - ADDITIONAL_TOKENS: {}, - CUSTOM_TOKENS: PANCAKESWAP_CUSTOM_BASES, - } - case TradeProvider.WANNASWAP: - return { - TYPE: tradeProvider, - IS_UNISWAP_V2_LIKE: true, - GRAPH_API: DEX_TRADE.WANNASWAP_THEGRAPH, - INIT_CODE_HASH: DEX_TRADE.WANNASWAP_INIT_CODE_HASH, - ROUTER_CONTRACT_ADDRESS: DEX_TRADE.WANNASWAP_ROUTER_V2_ADDRESS, - FACTORY_CONTRACT_ADDRESS: DEX_TRADE.WANNASWAP_FACTORY_ADDRESS, - AGAINST_TOKENS: WANNASWAP_BASE_AGAINST_TOKENS, - ADDITIONAL_TOKENS: {}, - CUSTOM_TOKENS: WANNASWAP_CUSTOM_BASES, - } - case TradeProvider.TRISOLARIS: - return { - TYPE: tradeProvider, - IS_UNISWAP_V2_LIKE: true, - GRAPH_API: DEX_TRADE.TRISOLARIS_THEGRAPH, - INIT_CODE_HASH: DEX_TRADE.TRISOLARIS_INIT_CODE_HASH, - ROUTER_CONTRACT_ADDRESS: DEX_TRADE.TRISOLARIS_ROUTER_ADDRESS, - FACTORY_CONTRACT_ADDRESS: DEX_TRADE.TRISOLARIS_FACTORY_ADDRESS, - AGAINST_TOKENS: TRISOLARIS_BASE_AGAINST_TOKENS, - ADDITIONAL_TOKENS: {}, - CUSTOM_TOKENS: TRISOLARIS_CUSTOM_BASES, - } - case TradeProvider.MDEX: - return { - TYPE: tradeProvider, - IS_UNISWAP_V2_LIKE: true, - GRAPH_API: DEX_TRADE.MDEX_THEGRAPH, - INIT_CODE_HASH: DEX_TRADE.MDEX_INIT_CODE_HASH, - ROUTER_CONTRACT_ADDRESS: DEX_TRADE.MDEX_ROUTER_ADDRESS, - FACTORY_CONTRACT_ADDRESS: DEX_TRADE.MDEX_FACTORY_ADDRESS, - AGAINST_TOKENS: MDEX_BASE_AGAINST_TOKENS, - ADDITIONAL_TOKENS: {}, - CUSTOM_TOKENS: MDEX_CUSTOM_BASES, - } - case TradeProvider.VENONSWAP: - return { - TYPE: tradeProvider, - IS_UNISWAP_V2_LIKE: true, - GRAPH_API: DEX_TRADE.VENONSWAP_THEGRAPH, - INIT_CODE_HASH: DEX_TRADE.VENONSWAP_INIT_CODE_HASH, - ROUTER_CONTRACT_ADDRESS: DEX_TRADE.VENONSWAP_ROUTER_ADDRESS, - FACTORY_CONTRACT_ADDRESS: DEX_TRADE.VENONSWAP_FACTORY_ADDRESS, - AGAINST_TOKENS: VENONSWAP_BASE_AGAINST_TOKENS, - ADDITIONAL_TOKENS: {}, - CUSTOM_TOKENS: VENONSWAP_CUSTOM_BASES, - } - case TradeProvider.OPENSWAP: - return { - TYPE: tradeProvider, - IS_UNISWAP_V2_LIKE: true, - GRAPH_API: DEX_TRADE.OPENSWAP_THEGRAPH, - INIT_CODE_HASH: DEX_TRADE.OPENSWAP_INIT_CODE_HASH, - ROUTER_CONTRACT_ADDRESS: DEX_TRADE.OPENSWAP_ROUTER_ADDRESS, - FACTORY_CONTRACT_ADDRESS: DEX_TRADE.OPENSWAP_FACTORY_ADDRESS, - AGAINST_TOKENS: OPENSWAP_BASE_AGAINST_TOKENS, - ADDITIONAL_TOKENS: {}, - CUSTOM_TOKENS: OPENSWAP_CUSTOM_BASES, - } - case TradeProvider.ZRX: - return { - TYPE: tradeProvider, - } - case TradeProvider.BALANCER: - return { - TYPE: tradeProvider, - ROUTER_CONTRACT_ADDRESS: DEX_TRADE.BALANCER_EXCHANGE_PROXY_ADDRESS, - } - case TradeProvider.DODO: - return { - TYPE: tradeProvider, - ROUTER_CONTRACT_ADDRESS: DEX_TRADE.DODO_EXCHANGE_PROXY_ADDRESS, - } - case TradeProvider.BANCOR: - return { - TYPE: tradeProvider, - ROUTER_CONTRACT_ADDRESS: DEX_TRADE.BANCOR_EXCHANGE_PROXY_ADDRESS, - } - case TradeProvider.TRADERJOE: - return { - TYPE: tradeProvider, - IS_UNISWAP_V2_LIKE: true, - GRAPH_API: DEX_TRADE.TRADERJOE_THEGRAPH, - INIT_CODE_HASH: DEX_TRADE.TRADERJOE_INIT_CODE_HASH, - ROUTER_CONTRACT_ADDRESS: DEX_TRADE.TRADERJOE_ROUTER_ADDRESS, - FACTORY_CONTRACT_ADDRESS: DEX_TRADE.TRADERJOE_FACTORY_ADDRESS, - AGAINST_TOKENS: TRADERJOE_BASE_AGAINST_TOKENS, - ADDITIONAL_TOKENS: {}, - CUSTOM_TOKENS: TRADERJOE_CUSTOM_BASES, - } - case TradeProvider.PANGOLIN: - return { - TYPE: tradeProvider, - IS_UNISWAP_V2_LIKE: true, - GRAPH_API: DEX_TRADE.PANGOLIN_THEGRAPH, - INIT_CODE_HASH: DEX_TRADE.PANGOLIN_INIT_CODE_HASH, - ROUTER_CONTRACT_ADDRESS: DEX_TRADE.PANGOLIN_ROUTER_ADDRESS, - FACTORY_CONTRACT_ADDRESS: DEX_TRADE.PANGOLIN_FACTORY_ADDRESS, - AGAINST_TOKENS: PANGOLIN_BASE_AGAINST_TOKENS, - ADDITIONAL_TOKENS: {}, - CUSTOM_TOKENS: PANGOLIN_CUSTOM_BASES, - } - case TradeProvider.OPENOCEAN: - return { - TYPE: tradeProvider, - ROUTER_CONTRACT_ADDRESS: DEX_TRADE.OPENOCEAN_EXCHANGE_PROXY_ADDRESS, - } - default: - unreachable(tradeProvider) - } - }, [chainId, tradeProvider]) -} diff --git a/packages/mask/src/plugins/Trader/types/trader.ts b/packages/mask/src/plugins/Trader/types/trader.ts index b63305cece1d..956f1a8fc0f7 100644 --- a/packages/mask/src/plugins/Trader/types/trader.ts +++ b/packages/mask/src/plugins/Trader/types/trader.ts @@ -76,8 +76,9 @@ export enum ZrxTradePool { Trisolaris = 'Trisolaris', WannaSwap = 'WannaSwap', Mdex = 'Mdex', - VenonSwap = 'VenonSwap', + VenomSwap = 'VenomSwap', OpenSwap = 'OpenSwap', + DefiKingdoms = 'DefiKingdoms', } export interface TradeComputed { diff --git a/packages/mask/src/resources/SushiSwapIcon.tsx b/packages/mask/src/resources/SushiSwapIcon.tsx deleted file mode 100644 index 2a7e07344ed0..000000000000 --- a/packages/mask/src/resources/SushiSwapIcon.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import { SvgIconProps, SvgIcon } from '@mui/material' - -const svg = ( - - - -) - -export function SushiSwapIcon(props: SvgIconProps) { - return {svg} -} diff --git a/packages/public-api/src/web.ts b/packages/public-api/src/web.ts index fd11e78e798b..75bb00fdc6c8 100644 --- a/packages/public-api/src/web.ts +++ b/packages/public-api/src/web.ts @@ -183,8 +183,9 @@ export enum TradeProvider { TRADERJOE = 13, PANGOLIN = 14, MDEX = 15, - VENONSWAP = 16, + VENOMSWAP = 16, OPENSWAP = 17, + DEFIKINGDOMS = 18, } /** Supported language settings */ diff --git a/packages/web3-constants/evm/token.json b/packages/web3-constants/evm/token.json index 3dd943a033f7..1486158cf340 100644 --- a/packages/web3-constants/evm/token.json +++ b/packages/web3-constants/evm/token.json @@ -1103,6 +1103,52 @@ "Harmony": "0xEa589E93Ff18b1a1F1e9BaC7EF3E86Ab62addc79", "Harmony_Test": "0x69A655c56087D927eb05247FB56495a0f19B9f70" }, + "JEWEL_ADDRESS": { + "Mainnet": "", + "Ropsten": "", + "Rinkeby": "", + "Kovan": "", + "Gorli": "", + "BSC": "", + "BSCT": "", + "Matic": "", + "Mumbai": "", + "Arbitrum": "", + "Arbitrum_Rinkeby": "", + "xDai": "", + "Avalanche": "", + "Avalanche_Fuji": "", + "Celo": "", + "Fantom": "", + "Aurora": "", + "Aurora_Testnet": "", + "Conflux": "", + "Harmony": "0x72Cb10C6bfA5624dD07Ef608027E366bd690048F", + "Harmony_Test": "" + }, + "CRYSTAL_ADDRESS": { + "Mainnet": "", + "Ropsten": "", + "Rinkeby": "", + "Kovan": "", + "Gorli": "", + "BSC": "", + "BSCT": "", + "Matic": "", + "Mumbai": "", + "Arbitrum": "", + "Arbitrum_Rinkeby": "", + "xDai": "", + "Avalanche": "", + "Avalanche_Fuji": "", + "Celo": "", + "Fantom": "", + "Aurora": "", + "Aurora_Testnet": "", + "Conflux": "", + "Harmony": "0x72Cb10C6bfA5624dD07Ef608027E366bd690048F", + "Harmony_Test": "" + }, "OPENX_ADDRESS": { "Mainnet": "", "Ropsten": "", diff --git a/packages/web3-constants/evm/trader.json b/packages/web3-constants/evm/trader.json index f920b31e68d8..3b20c45fa677 100644 --- a/packages/web3-constants/evm/trader.json +++ b/packages/web3-constants/evm/trader.json @@ -1264,7 +1264,7 @@ "Harmony": "", "Harmony_Test": "" }, - "VENONSWAP_ROUTER_ADDRESS": { + "VENOMSWAP_ROUTER_ADDRESS": { "Mainnet": "", "Ropsten": "", "Rinkeby": "", @@ -1284,10 +1284,10 @@ "Aurora": "", "Aurora_Testnet": "", "Conflux": "", - "Harmony": "0xf012702a5f0e54015362cBCA26a26fc90AA832a3", + "Harmony": "0xf012702a5f0e54015362cbca26a26fc90aa832a3", "Harmony_Test": "0x8e9A3cE409B13ef459fE4448aE97a79d6Ecd8b4b" }, - "VENONSWAP_FACTORY_ADDRESS": { + "VENOMSWAP_FACTORY_ADDRESS": { "Mainnet": "", "Ropsten": "", "Rinkeby": "", @@ -1310,7 +1310,7 @@ "Harmony": "0x7D02c116b98d0965ba7B642ace0183ad8b8D2196", "Harmony_Test": "0x066bafafC84607a956967F6f050bD14A8347952F" }, - "VENONSWAP_THEGRAPH": { + "VENOMSWAP_THEGRAPH": { "Mainnet": "", "Ropsten": "", "Rinkeby": "", @@ -1333,7 +1333,7 @@ "Harmony": "", "Harmony_Test": "" }, - "VENONSWAP_INIT_CODE_HASH": { + "VENOMSWAP_INIT_CODE_HASH": { "Mainnet": "", "Ropsten": "", "Rinkeby": "", @@ -1447,5 +1447,97 @@ "Conflux": "", "Harmony": "0x613b6eaa34b43dcb7eb8881dd4b5af85805be104d5f2f385304ffa8bda5e219c", "Harmony_Test": "" + }, + "DEFIKINGDOMS_ROUTER_ADDRESS": { + "Mainnet": "", + "Ropsten": "", + "Rinkeby": "", + "Kovan": "", + "Gorli": "", + "BSC": "", + "BSCT": "", + "Matic": "", + "Mumbai": "", + "Arbitrum": "", + "Arbitrum_Rinkeby": "", + "xDai": "", + "Avalanche": "", + "Avalanche_Fuji": "", + "Celo": "", + "Fantom": "", + "Aurora": "", + "Aurora_Testnet": "", + "Conflux": "", + "Harmony": "0x24ad62502d1C652Cc7684081169D04896aC20f30", + "Harmony_Test": "" + }, + "DEFIKINGDOMS_FACTORY_ADDRESS": { + "Mainnet": "", + "Ropsten": "", + "Rinkeby": "", + "Kovan": "", + "Gorli": "", + "BSC": "", + "BSCT": "", + "Matic": "", + "Mumbai": "", + "Arbitrum": "", + "Arbitrum_Rinkeby": "", + "xDai": "", + "Avalanche": "", + "Avalanche_Fuji": "", + "Celo": "", + "Fantom": "", + "Aurora": "", + "Aurora_Testnet": "", + "Conflux": "", + "Harmony": "0x9014B937069918bd319f80e8B3BB4A2cf6FAA5F7", + "Harmony_Test": "" + }, + "DEFIKINGDOMS_THEGRAPH": { + "Mainnet": "", + "Ropsten": "", + "Rinkeby": "", + "Kovan": "", + "Gorli": "", + "BSC": "", + "BSCT": "", + "Matic": "", + "Mumbai": "", + "Arbitrum": "", + "Arbitrum_Rinkeby": "", + "xDai": "", + "Avalanche": "", + "Avalanche_Fuji": "", + "Celo": "", + "Fantom": "", + "Aurora": "", + "Aurora_Testnet": "", + "Conflux": "", + "Harmony": "", + "Harmony_Test": "" + }, + "DEFIKINGDOMS_INIT_CODE_HASH": { + "Mainnet": "", + "Ropsten": "", + "Rinkeby": "", + "Kovan": "", + "Gorli": "", + "BSC": "", + "BSCT": "", + "Matic": "", + "Mumbai": "", + "Arbitrum": "", + "Arbitrum_Rinkeby": "", + "xDai": "", + "Avalanche": "", + "Avalanche_Fuji": "", + "Celo": "", + "Fantom": "", + "Aurora": "", + "Aurora_Testnet": "", + "Conflux": "", + "Harmony": "0xf1c21a825f13eff153022ddea53156462dd79972b6f88adf06f79ca8b042c3c1", + "Harmony_Test": "" } } diff --git a/packages/web3-contracts/abis/ERC20.json b/packages/web3-contracts/abis/ERC20.json index bdc6d9277899..effc5cc4b359 100644 --- a/packages/web3-contracts/abis/ERC20.json +++ b/packages/web3-contracts/abis/ERC20.json @@ -34,7 +34,8 @@ ], "payable": false, "stateMutability": "nonpayable", - "type": "function" + "type": "function", + "signature": "0x095ea7b3" }, { "constant": true, @@ -48,7 +49,8 @@ ], "payable": false, "stateMutability": "view", - "type": "function" + "type": "function", + "signature": "0x18160ddd" }, { "constant": false, @@ -75,7 +77,8 @@ ], "payable": false, "stateMutability": "nonpayable", - "type": "function" + "type": "function", + "signature": "0x23b872dd" }, { "constant": true, @@ -218,5 +221,29 @@ ], "name": "Transfer", "type": "event" + }, + { + "name": "increaseAllowance", + "inputs": [ + { + "type": "address", + "name": "spender", + "internalType": "address" + }, + { + "name": "addedValue", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "type": "bool", + "internalType": "bool", + "name": "" + } + ], + "stateMutability": "nonpayable", + "type": "function" } ] diff --git a/packages/web3-contracts/types/AaveLendingPool.d.ts b/packages/web3-contracts/types/AaveLendingPool.d.ts index 927c8b6d8bc9..59ed6ff16814 100644 --- a/packages/web3-contracts/types/AaveLendingPool.d.ts +++ b/packages/web3-contracts/types/AaveLendingPool.d.ts @@ -15,7 +15,7 @@ import { BaseContract, } from './types' -export interface EventOptions { +interface EventOptions { filter?: object fromBlock?: BlockType topics?: string[] diff --git a/packages/web3-contracts/types/AaveLendingPoolAddressProvider.d.ts b/packages/web3-contracts/types/AaveLendingPoolAddressProvider.d.ts index 1b04de4f3b88..08c0538e8c3b 100644 --- a/packages/web3-contracts/types/AaveLendingPoolAddressProvider.d.ts +++ b/packages/web3-contracts/types/AaveLendingPoolAddressProvider.d.ts @@ -15,7 +15,7 @@ import { BaseContract, } from './types' -export interface EventOptions { +interface EventOptions { filter?: object fromBlock?: BlockType topics?: string[] diff --git a/packages/web3-contracts/types/AaveProtocolDataProvider.d.ts b/packages/web3-contracts/types/AaveProtocolDataProvider.d.ts index c55d154bef05..264195b44671 100644 --- a/packages/web3-contracts/types/AaveProtocolDataProvider.d.ts +++ b/packages/web3-contracts/types/AaveProtocolDataProvider.d.ts @@ -15,7 +15,7 @@ import { BaseContract, } from './types' -export interface EventOptions { +interface EventOptions { filter?: object fromBlock?: BlockType topics?: string[] diff --git a/packages/web3-contracts/types/AaveStableDebtToken.d.ts b/packages/web3-contracts/types/AaveStableDebtToken.d.ts index 5b407b64a865..2a9e49e2bf30 100644 --- a/packages/web3-contracts/types/AaveStableDebtToken.d.ts +++ b/packages/web3-contracts/types/AaveStableDebtToken.d.ts @@ -15,7 +15,7 @@ import { BaseContract, } from './types' -export interface EventOptions { +interface EventOptions { filter?: object fromBlock?: BlockType topics?: string[] diff --git a/packages/web3-contracts/types/CryptoPunks.d.ts b/packages/web3-contracts/types/CryptoPunks.d.ts new file mode 100644 index 000000000000..e5a370703574 --- /dev/null +++ b/packages/web3-contracts/types/CryptoPunks.d.ts @@ -0,0 +1,33 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import BN from 'bn.js' +import { ContractOptions } from 'web3-eth-contract' +import { EventLog } from 'web3-core' +import { EventEmitter } from 'events' +import { + Callback, + PayableTransactionObject, + NonPayableTransactionObject, + BlockType, + ContractEventLog, + BaseContract, +} from './types' + +interface EventOptions { + filter?: object + fromBlock?: BlockType + topics?: string[] +} + +export interface CryptoPunks extends BaseContract { + constructor(jsonInterface: any[], address?: string, options?: ContractOptions): CryptoPunks + clone(): CryptoPunks + methods: { + punkIndexToAddress(tokenId: number | string | BN): NonPayableTransactionObject + } + events: { + allEvents(options?: EventOptions, cb?: Callback): EventEmitter + } +} diff --git a/packages/web3-contracts/types/ERC1155.d.ts b/packages/web3-contracts/types/ERC1155.d.ts new file mode 100644 index 000000000000..baebd723ba5f --- /dev/null +++ b/packages/web3-contracts/types/ERC1155.d.ts @@ -0,0 +1,33 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import BN from 'bn.js' +import { ContractOptions } from 'web3-eth-contract' +import { EventLog } from 'web3-core' +import { EventEmitter } from 'events' +import { + Callback, + PayableTransactionObject, + NonPayableTransactionObject, + BlockType, + ContractEventLog, + BaseContract, +} from './types' + +interface EventOptions { + filter?: object + fromBlock?: BlockType + topics?: string[] +} + +export interface ERC1155 extends BaseContract { + constructor(jsonInterface: any[], address?: string, options?: ContractOptions): ERC1155 + clone(): ERC1155 + methods: { + supportsInterface(interfaceId: string | number[]): NonPayableTransactionObject + } + events: { + allEvents(options?: EventOptions, cb?: Callback): EventEmitter + } +} diff --git a/packages/web3-contracts/types/ERC20.d.ts b/packages/web3-contracts/types/ERC20.d.ts index 3583ea982e6f..032ee1b61d71 100644 --- a/packages/web3-contracts/types/ERC20.d.ts +++ b/packages/web3-contracts/types/ERC20.d.ts @@ -59,6 +59,8 @@ export interface ERC20 extends BaseContract { transfer(to: string, value: number | string | BN): NonPayableTransactionObject allowance(_owner: string, _spender: string): NonPayableTransactionObject + + increaseAllowance(spender: string, addedValue: number | string | BN): NonPayableTransactionObject } events: { Approval(cb?: Callback): EventEmitter diff --git a/packages/web3-contracts/types/Qualification.d.ts b/packages/web3-contracts/types/Qualification.d.ts index 027f5c5390ff..dc660f0f34f5 100644 --- a/packages/web3-contracts/types/Qualification.d.ts +++ b/packages/web3-contracts/types/Qualification.d.ts @@ -22,7 +22,7 @@ interface EventOptions { } export type GasPriceOver = ContractEventLog<{}> -export type QualificationEvent = ContractEventLog<{ +export type Qualification = ContractEventLog<{ account: string qualified: boolean blockNumber: string @@ -74,8 +74,8 @@ export interface Qualification extends BaseContract { GasPriceOver(cb?: Callback): EventEmitter GasPriceOver(options?: EventOptions, cb?: Callback): EventEmitter - Qualification(cb?: Callback): EventEmitter - Qualification(options?: EventOptions, cb?: Callback): EventEmitter + Qualification(cb?: Callback): EventEmitter + Qualification(options?: EventOptions, cb?: Callback): EventEmitter Unlucky(cb?: Callback): EventEmitter Unlucky(options?: EventOptions, cb?: Callback): EventEmitter @@ -86,8 +86,8 @@ export interface Qualification extends BaseContract { once(event: 'GasPriceOver', cb: Callback): void once(event: 'GasPriceOver', options: EventOptions, cb: Callback): void - once(event: 'Qualification', cb: Callback): void - once(event: 'Qualification', options: EventOptions, cb: Callback): void + once(event: 'Qualification', cb: Callback): void + once(event: 'Qualification', options: EventOptions, cb: Callback): void once(event: 'Unlucky', cb: Callback): void once(event: 'Unlucky', options: EventOptions, cb: Callback): void diff --git a/packages/web3-shared/evm/constants/getContractOwnerDomain.ts b/packages/web3-shared/evm/constants/getContractOwnerDomain.ts index 467014000d2a..ae6757dc5d64 100644 --- a/packages/web3-shared/evm/constants/getContractOwnerDomain.ts +++ b/packages/web3-shared/evm/constants/getContractOwnerDomain.ts @@ -29,6 +29,10 @@ const domainAddressMap: Record = { 'UNISWAP_V3_FACTORY_ADDRESS', 'UNISWAP_V3_QUOTER_ADDRESS', ]), + 'defikingdoms.com': collect(Trader, ['DEFIKINGDOMS_ROUTER_ADDRESS', 'DEFIKINGDOMS_FACTORY_ADDRESS']), + 'app.openswap.one': collect(Trader, ['OPENSWAP_ROUTER_ADDRESS', 'OPENSWAP_FACTORY_ADDRESS']), + 'viper.exchange': collect(Trader, ['VENOMSWAP_ROUTER_ADDRESS', 'VENOMSWAP_FACTORY_ADDRESS']), + 'viperswap.one': collect(Trader, ['VENOMSWAP_ROUTER_ADDRESS', 'VENOMSWAP_FACTORY_ADDRESS']), 'www.sushi.com': collect(Trader, ['SUSHISWAP_ROUTER_ADDRESS', 'SUSHISWAP_FACTORY_ADDRESS']), 'quickswap.exchange': collect(Trader, ['QUICKSWAP_ROUTER_ADDRESS', 'QUICKSWAP_FACTORY_ADDRESS']), 'pancakeswap.finance': collect(Trader, ['PANCAKESWAP_ROUTER_ADDRESS', 'PANCAKESWAP_FACTORY_ADDRESS']), diff --git a/packages/web3-shared/evm/constants/tokens.ts b/packages/web3-shared/evm/constants/tokens.ts index bf6ea4623815..cd1b49403548 100644 --- a/packages/web3-shared/evm/constants/tokens.ts +++ b/packages/web3-shared/evm/constants/tokens.ts @@ -47,6 +47,7 @@ export const JOE = createERC20Tokens('JOE_ADDRESS', 'JoeToken', 'JOE', 18) export const PNG = createERC20Tokens('PNG_ADDRESS', 'Pangolin', 'PNG', 18) export const VIPER = createERC20Tokens('VIPER_ADDRESS', 'Viper', 'VIPER', 18) export const OPENX = createERC20Tokens('OPENX_ADDRESS', 'OpenSwap Token', 'OpenX', 18) +export const JEWEL = createERC20Tokens('JEWEL_ADDRESS', 'Jewels', 'JEWEL', 18) export const WNATIVE = createERC20Tokens( 'WNATIVE_ADDRESS', From a215005c48e7bd39a7c9aa7f73cfa106cd98e61e Mon Sep 17 00:00:00 2001 From: codingsh Date: Sat, 7 May 2022 07:31:55 +0100 Subject: [PATCH 30/33] chore(harmony): enable venomswap, openswap, kingdoms and sepender address info on useGetTradeContext --- .../src/plugins/Trader/trader/useGetTradeContext.ts | 3 +++ packages/web3-contracts/abis/ERC20.json | 9 +++------ packages/web3-contracts/types/Qualification.d.ts | 10 +++++----- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/mask/src/plugins/Trader/trader/useGetTradeContext.ts b/packages/mask/src/plugins/Trader/trader/useGetTradeContext.ts index e28ff07f5a8d..99e1a06e94ad 100644 --- a/packages/mask/src/plugins/Trader/trader/useGetTradeContext.ts +++ b/packages/mask/src/plugins/Trader/trader/useGetTradeContext.ts @@ -188,6 +188,7 @@ export function useGetTradeContext(tradeProvider?: TradeProvider) { GRAPH_API: DEX_TRADE.VENOMSWAP_THEGRAPH, INIT_CODE_HASH: DEX_TRADE.VENOMSWAP_INIT_CODE_HASH, ROUTER_CONTRACT_ADDRESS: DEX_TRADE.VENOMSWAP_ROUTER_ADDRESS, + SPENDER_CONTRACT_ADDRESS: DEX_TRADE.VENOMSWAP_ROUTER_ADDRESS, FACTORY_CONTRACT_ADDRESS: DEX_TRADE.VENOMSWAP_FACTORY_ADDRESS, AGAINST_TOKENS: VENOMSWAP_BASE_AGAINST_TOKENS, ADDITIONAL_TOKENS: {}, @@ -200,6 +201,7 @@ export function useGetTradeContext(tradeProvider?: TradeProvider) { GRAPH_API: DEX_TRADE.OPENSWAP_THEGRAPH, INIT_CODE_HASH: DEX_TRADE.OPENSWAP_INIT_CODE_HASH, ROUTER_CONTRACT_ADDRESS: DEX_TRADE.OPENSWAP_ROUTER_ADDRESS, + SPENDER_CONTRACT_ADDRESS: DEX_TRADE.OPENSWAP_ROUTER_ADDRESS, FACTORY_CONTRACT_ADDRESS: DEX_TRADE.OPENSWAP_FACTORY_ADDRESS, AGAINST_TOKENS: OPENSWAP_BASE_AGAINST_TOKENS, ADDITIONAL_TOKENS: {}, @@ -212,6 +214,7 @@ export function useGetTradeContext(tradeProvider?: TradeProvider) { GRAPH_API: DEX_TRADE.DEFIKINGDOMS_THEGRAPH, INIT_CODE_HASH: DEX_TRADE.DEFIKINGDOMS_INIT_CODE_HASH, ROUTER_CONTRACT_ADDRESS: DEX_TRADE.DEFIKINGDOMS_ROUTER_ADDRESS, + SPENDER_CONTRACT_ADDRESS: DEX_TRADE.DEFIKINGDOMS_ROUTER_ADDRESS, FACTORY_CONTRACT_ADDRESS: DEX_TRADE.DEFIKINGDOMS_FACTORY_ADDRESS, AGAINST_TOKENS: DEFIKINGDOMS_BASE_AGAINST_TOKENS, ADDITIONAL_TOKENS: {}, diff --git a/packages/web3-contracts/abis/ERC20.json b/packages/web3-contracts/abis/ERC20.json index effc5cc4b359..c302149e23df 100644 --- a/packages/web3-contracts/abis/ERC20.json +++ b/packages/web3-contracts/abis/ERC20.json @@ -34,8 +34,7 @@ ], "payable": false, "stateMutability": "nonpayable", - "type": "function", - "signature": "0x095ea7b3" + "type": "function" }, { "constant": true, @@ -49,8 +48,7 @@ ], "payable": false, "stateMutability": "view", - "type": "function", - "signature": "0x18160ddd" + "type": "function" }, { "constant": false, @@ -77,8 +75,7 @@ ], "payable": false, "stateMutability": "nonpayable", - "type": "function", - "signature": "0x23b872dd" + "type": "function" }, { "constant": true, diff --git a/packages/web3-contracts/types/Qualification.d.ts b/packages/web3-contracts/types/Qualification.d.ts index dc660f0f34f5..027f5c5390ff 100644 --- a/packages/web3-contracts/types/Qualification.d.ts +++ b/packages/web3-contracts/types/Qualification.d.ts @@ -22,7 +22,7 @@ interface EventOptions { } export type GasPriceOver = ContractEventLog<{}> -export type Qualification = ContractEventLog<{ +export type QualificationEvent = ContractEventLog<{ account: string qualified: boolean blockNumber: string @@ -74,8 +74,8 @@ export interface Qualification extends BaseContract { GasPriceOver(cb?: Callback): EventEmitter GasPriceOver(options?: EventOptions, cb?: Callback): EventEmitter - Qualification(cb?: Callback): EventEmitter - Qualification(options?: EventOptions, cb?: Callback): EventEmitter + Qualification(cb?: Callback): EventEmitter + Qualification(options?: EventOptions, cb?: Callback): EventEmitter Unlucky(cb?: Callback): EventEmitter Unlucky(options?: EventOptions, cb?: Callback): EventEmitter @@ -86,8 +86,8 @@ export interface Qualification extends BaseContract { once(event: 'GasPriceOver', cb: Callback): void once(event: 'GasPriceOver', options: EventOptions, cb: Callback): void - once(event: 'Qualification', cb: Callback): void - once(event: 'Qualification', options: EventOptions, cb: Callback): void + once(event: 'Qualification', cb: Callback): void + once(event: 'Qualification', options: EventOptions, cb: Callback): void once(event: 'Unlucky', cb: Callback): void once(event: 'Unlucky', options: EventOptions, cb: Callback): void From 62bd17d46f03b6dfeabc18e4194b6a15606e6953 Mon Sep 17 00:00:00 2001 From: codingsh Date: Sat, 7 May 2022 12:26:32 +0100 Subject: [PATCH 31/33] chore(harmony): fixed show gas price value on intl --- packages/mask/shared-ui/locales/en-US.json | 1 + packages/mask/shared-ui/locales/ko-KR.json | 1 + packages/mask/shared-ui/locales/qya-AA.json | 1 + packages/mask/shared-ui/locales/zh-CN.json | 3 ++- .../src/plugins/Trader/SNSAdaptor/trader/ConfirmDialog.tsx | 4 +++- .../mask/src/plugins/Trader/SNSAdaptor/trader/TraderInfo.tsx | 4 +++- 6 files changed, 11 insertions(+), 3 deletions(-) diff --git a/packages/mask/shared-ui/locales/en-US.json b/packages/mask/shared-ui/locales/en-US.json index c1e032da924c..7469764ab031 100644 --- a/packages/mask/shared-ui/locales/en-US.json +++ b/packages/mask/shared-ui/locales/en-US.json @@ -484,6 +484,7 @@ "plugin_trader_gas_setting_fast": "Fast", "plugin_trader_gas_setting_custom": "Custom", "plugin_trader_tx_cost_usd": "(~${{usd}})", + "plugin_trader_tx_cost_usd_less": "({{usd}})", "plugin_trader_gas_option": "{{option}} ({{value}}) Gwei", "plugin_trader_no_enough_liquidity": "No enough liquidity", "plugin_trader_no_trade": "Please select a trade", diff --git a/packages/mask/shared-ui/locales/ko-KR.json b/packages/mask/shared-ui/locales/ko-KR.json index 09f707ec80b8..dae18eb60725 100644 --- a/packages/mask/shared-ui/locales/ko-KR.json +++ b/packages/mask/shared-ui/locales/ko-KR.json @@ -349,6 +349,7 @@ "plugin_trader_gas_setting_fast": "빠름", "plugin_trader_gas_setting_custom": "커스텀", "plugin_trader_tx_cost_usd": "(~${{usd}})", + "plugin_trader_tx_cost_usd_less": "({{usd}})", "plugin_trader_gas_option": "{{option}} ({{value}}) Gwei", "plugin_trader_no_enough_liquidity": "유동성 부족", "plugin_trader_no_trade": "거래를 선택하세요", diff --git a/packages/mask/shared-ui/locales/qya-AA.json b/packages/mask/shared-ui/locales/qya-AA.json index d7eb8ae5d7cf..26cca812946b 100644 --- a/packages/mask/shared-ui/locales/qya-AA.json +++ b/packages/mask/shared-ui/locales/qya-AA.json @@ -484,6 +484,7 @@ "plugin_trader_gas_setting_fast": "crwdns10473:0crwdne10473:0", "plugin_trader_gas_setting_custom": "crwdns10475:0crwdne10475:0", "plugin_trader_tx_cost_usd": "crwdns10477:0{{usd}}crwdne10477:0", + "plugin_trader_tx_cost_usd_less": "crwdns10477:0{{usd}}crwdne10477:0", "plugin_trader_gas_option": "crwdns10479:0{{option}}crwdnd10479:0{{value}}crwdne10479:0", "plugin_trader_no_enough_liquidity": "crwdns10481:0crwdne10481:0", "plugin_trader_no_trade": "crwdns10483:0crwdne10483:0", diff --git a/packages/mask/shared-ui/locales/zh-CN.json b/packages/mask/shared-ui/locales/zh-CN.json index 8a338efd388f..db464c4a966d 100644 --- a/packages/mask/shared-ui/locales/zh-CN.json +++ b/packages/mask/shared-ui/locales/zh-CN.json @@ -467,7 +467,8 @@ "plugin_trader_gas_setting_standard": "标准", "plugin_trader_gas_setting_fast": "快速", "plugin_trader_gas_setting_custom": "自定义", - "plugin_trader_tx_cost_usd": "(~{{usd}} 美元)", + "plugin_trader_tx_cost_usd": "(~${{usd}} 美元)", + "plugin_trader_tx_cost_usd_less": "({{usd}} 美元)", "plugin_trader_gas_option": "{{option}} ({{value}}) Gwei", "plugin_trader_no_enough_liquidity": "流动性不足", "plugin_trader_no_trade": "请选择一个交易", diff --git a/packages/mask/src/plugins/Trader/SNSAdaptor/trader/ConfirmDialog.tsx b/packages/mask/src/plugins/Trader/SNSAdaptor/trader/ConfirmDialog.tsx index 855a89847167..c1fd9b4a3e29 100644 --- a/packages/mask/src/plugins/Trader/SNSAdaptor/trader/ConfirmDialog.tsx +++ b/packages/mask/src/plugins/Trader/SNSAdaptor/trader/ConfirmDialog.tsx @@ -356,7 +356,9 @@ export function ConfirmDialogUI(props: ConfirmDialogUIProps) { formatter={formatBalance} /> - {t('plugin_trader_tx_cost_usd', { usd: feeValueUSD })} + {feeValueUSD === '<$0.01' + ? t('plugin_trader_tx_cost_usd_less', { usd: feeValueUSD }) + : t('plugin_trader_tx_cost_usd', { usd: feeValueUSD })} diff --git a/packages/mask/src/plugins/Trader/SNSAdaptor/trader/TraderInfo.tsx b/packages/mask/src/plugins/Trader/SNSAdaptor/trader/TraderInfo.tsx index d30e7750e4ae..1972fd8bc80d 100644 --- a/packages/mask/src/plugins/Trader/SNSAdaptor/trader/TraderInfo.tsx +++ b/packages/mask/src/plugins/Trader/SNSAdaptor/trader/TraderInfo.tsx @@ -167,7 +167,9 @@ export const TraderInfo = memo(({ trade, gasPrice, isBest, onCl /> - {t('plugin_trader_tx_cost_usd', { usd: feeValueUSD })} + {feeValueUSD === '<$0.01' + ? t('plugin_trader_tx_cost_usd_less', { usd: feeValueUSD }) + : t('plugin_trader_tx_cost_usd', { usd: feeValueUSD })} ) : null} From cbb9e449edcc79bcfb8f25cfa02ca16bec1d9325 Mon Sep 17 00:00:00 2001 From: codingsh Date: Sat, 7 May 2022 16:05:47 +0100 Subject: [PATCH 32/33] chore(harmony): fixed defiKingdoms --- packages/mask/src/plugins/Trader/pipes.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/mask/src/plugins/Trader/pipes.ts b/packages/mask/src/plugins/Trader/pipes.ts index 491bd0773dc3..314831b4388d 100644 --- a/packages/mask/src/plugins/Trader/pipes.ts +++ b/packages/mask/src/plugins/Trader/pipes.ts @@ -43,7 +43,7 @@ export const resolveTradeProviderName = createLookupTableResolver { throw new Error(`Unknown provider type: ${tradeProvider}`) From 156504e55b1663e71d789c7ed0c8be68d2d90844 Mon Sep 17 00:00:00 2001 From: codingsh Date: Sat, 7 May 2022 16:08:24 +0100 Subject: [PATCH 33/33] chore(harmony): change less to small --- packages/mask/shared-ui/locales/en-US.json | 2 +- packages/mask/shared-ui/locales/ko-KR.json | 2 +- packages/mask/shared-ui/locales/qya-AA.json | 2 +- packages/mask/shared-ui/locales/zh-CN.json | 2 +- .../mask/src/plugins/Trader/SNSAdaptor/trader/ConfirmDialog.tsx | 2 +- .../mask/src/plugins/Trader/SNSAdaptor/trader/TraderInfo.tsx | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/mask/shared-ui/locales/en-US.json b/packages/mask/shared-ui/locales/en-US.json index 7469764ab031..cbdff5494776 100644 --- a/packages/mask/shared-ui/locales/en-US.json +++ b/packages/mask/shared-ui/locales/en-US.json @@ -484,7 +484,7 @@ "plugin_trader_gas_setting_fast": "Fast", "plugin_trader_gas_setting_custom": "Custom", "plugin_trader_tx_cost_usd": "(~${{usd}})", - "plugin_trader_tx_cost_usd_less": "({{usd}})", + "plugin_trader_tx_cost_very_small": "({{usd}})", "plugin_trader_gas_option": "{{option}} ({{value}}) Gwei", "plugin_trader_no_enough_liquidity": "No enough liquidity", "plugin_trader_no_trade": "Please select a trade", diff --git a/packages/mask/shared-ui/locales/ko-KR.json b/packages/mask/shared-ui/locales/ko-KR.json index dae18eb60725..8303c5ede2a2 100644 --- a/packages/mask/shared-ui/locales/ko-KR.json +++ b/packages/mask/shared-ui/locales/ko-KR.json @@ -349,7 +349,7 @@ "plugin_trader_gas_setting_fast": "빠름", "plugin_trader_gas_setting_custom": "커스텀", "plugin_trader_tx_cost_usd": "(~${{usd}})", - "plugin_trader_tx_cost_usd_less": "({{usd}})", + "plugin_trader_tx_cost_very_small": "({{usd}})", "plugin_trader_gas_option": "{{option}} ({{value}}) Gwei", "plugin_trader_no_enough_liquidity": "유동성 부족", "plugin_trader_no_trade": "거래를 선택하세요", diff --git a/packages/mask/shared-ui/locales/qya-AA.json b/packages/mask/shared-ui/locales/qya-AA.json index 26cca812946b..0b643533873a 100644 --- a/packages/mask/shared-ui/locales/qya-AA.json +++ b/packages/mask/shared-ui/locales/qya-AA.json @@ -484,7 +484,7 @@ "plugin_trader_gas_setting_fast": "crwdns10473:0crwdne10473:0", "plugin_trader_gas_setting_custom": "crwdns10475:0crwdne10475:0", "plugin_trader_tx_cost_usd": "crwdns10477:0{{usd}}crwdne10477:0", - "plugin_trader_tx_cost_usd_less": "crwdns10477:0{{usd}}crwdne10477:0", + "plugin_trader_tx_cost_very_small": "crwdns10477:0{{usd}}crwdne10477:0", "plugin_trader_gas_option": "crwdns10479:0{{option}}crwdnd10479:0{{value}}crwdne10479:0", "plugin_trader_no_enough_liquidity": "crwdns10481:0crwdne10481:0", "plugin_trader_no_trade": "crwdns10483:0crwdne10483:0", diff --git a/packages/mask/shared-ui/locales/zh-CN.json b/packages/mask/shared-ui/locales/zh-CN.json index db464c4a966d..cf311dd58b9a 100644 --- a/packages/mask/shared-ui/locales/zh-CN.json +++ b/packages/mask/shared-ui/locales/zh-CN.json @@ -468,7 +468,7 @@ "plugin_trader_gas_setting_fast": "快速", "plugin_trader_gas_setting_custom": "自定义", "plugin_trader_tx_cost_usd": "(~${{usd}} 美元)", - "plugin_trader_tx_cost_usd_less": "({{usd}} 美元)", + "plugin_trader_tx_cost_very_small": "({{usd}} 美元)", "plugin_trader_gas_option": "{{option}} ({{value}}) Gwei", "plugin_trader_no_enough_liquidity": "流动性不足", "plugin_trader_no_trade": "请选择一个交易", diff --git a/packages/mask/src/plugins/Trader/SNSAdaptor/trader/ConfirmDialog.tsx b/packages/mask/src/plugins/Trader/SNSAdaptor/trader/ConfirmDialog.tsx index c1fd9b4a3e29..b0073a1ae351 100644 --- a/packages/mask/src/plugins/Trader/SNSAdaptor/trader/ConfirmDialog.tsx +++ b/packages/mask/src/plugins/Trader/SNSAdaptor/trader/ConfirmDialog.tsx @@ -357,7 +357,7 @@ export function ConfirmDialogUI(props: ConfirmDialogUIProps) { /> {feeValueUSD === '<$0.01' - ? t('plugin_trader_tx_cost_usd_less', { usd: feeValueUSD }) + ? t('plugin_trader_tx_cost_very_small', { usd: feeValueUSD }) : t('plugin_trader_tx_cost_usd', { usd: feeValueUSD })} diff --git a/packages/mask/src/plugins/Trader/SNSAdaptor/trader/TraderInfo.tsx b/packages/mask/src/plugins/Trader/SNSAdaptor/trader/TraderInfo.tsx index 1972fd8bc80d..475a1a910c56 100644 --- a/packages/mask/src/plugins/Trader/SNSAdaptor/trader/TraderInfo.tsx +++ b/packages/mask/src/plugins/Trader/SNSAdaptor/trader/TraderInfo.tsx @@ -168,7 +168,7 @@ export const TraderInfo = memo(({ trade, gasPrice, isBest, onCl {feeValueUSD === '<$0.01' - ? t('plugin_trader_tx_cost_usd_less', { usd: feeValueUSD }) + ? t('plugin_trader_tx_cost_very_small', { usd: feeValueUSD }) : t('plugin_trader_tx_cost_usd', { usd: feeValueUSD })}