From 57a625817541b8cf849ca1ad2e47e2740538e51e Mon Sep 17 00:00:00 2001 From: nithin Date: Thu, 6 May 2021 09:48:24 -0400 Subject: [PATCH 01/12] Ampl meter passport deployment --- .nvmrc | 1 + README.md | 2 +- public/ChainSafe-logo.png | Bin 4267 -> 0 bytes public/ample-favicon/android-icon-144x144.png | Bin 0 -> 10662 bytes public/ample-favicon/android-icon-192x192.png | Bin 0 -> 13570 bytes public/ample-favicon/android-icon-36x36.png | Bin 0 -> 2511 bytes public/ample-favicon/android-icon-48x48.png | Bin 0 -> 3323 bytes public/ample-favicon/android-icon-72x72.png | Bin 0 -> 5011 bytes public/ample-favicon/android-icon-96x96.png | Bin 0 -> 6757 bytes public/ample-favicon/apple-icon-114x114.png | Bin 0 -> 8232 bytes public/ample-favicon/apple-icon-120x120.png | Bin 0 -> 8658 bytes public/ample-favicon/apple-icon-144x144.png | Bin 0 -> 10662 bytes public/ample-favicon/apple-icon-152x152.png | Bin 0 -> 11529 bytes public/ample-favicon/apple-icon-180x180.png | Bin 0 -> 14234 bytes public/ample-favicon/apple-icon-57x57.png | Bin 0 -> 3885 bytes public/ample-favicon/apple-icon-60x60.png | Bin 0 -> 4129 bytes public/ample-favicon/apple-icon-72x72.png | Bin 0 -> 5011 bytes public/ample-favicon/apple-icon-76x76.png | Bin 0 -> 5188 bytes .../ample-favicon/apple-icon-precomposed.png | Bin 0 -> 14144 bytes public/ample-favicon/apple-icon.png | Bin 0 -> 14144 bytes public/ample-favicon/browserconfig.xml | 2 + public/ample-favicon/favicon-16x16.png | Bin 0 -> 1427 bytes public/ample-favicon/favicon-32x32.png | Bin 0 -> 2245 bytes public/ample-favicon/favicon-96x96.png | Bin 0 -> 6757 bytes public/ample-favicon/favicon.ico | Bin 0 -> 1150 bytes public/ample-favicon/manifest.json | 41 + public/ample-favicon/ms-icon-144x144.png | Bin 0 -> 10662 bytes public/ample-favicon/ms-icon-150x150.png | Bin 0 -> 11327 bytes public/ample-favicon/ms-icon-310x310.png | Bin 0 -> 30050 bytes public/ample-favicon/ms-icon-70x70.png | Bin 0 -> 4798 bytes public/favicon.ico | Bin 1150 -> 0 bytes public/index.html | 26 +- public/manifest.json | 10 +- scripts/deploy.sh | 1 + src/App.tsx | 4 +- src/Components/Custom/TokenInput.tsx | 6 +- src/Components/Custom/TokenSelectInput.tsx | 8 +- .../Pages/FormikContextElements/Fees.tsx | 6 +- src/Components/Pages/TransferPage.tsx | 131 +- src/Components/Routes.tsx | 6 +- src/Contexts/ChainbridgeContext.tsx | 78 +- src/Contracts/Bridge.d.ts | 2939 +++++++++++++++++ src/Contracts/BridgeFactory.ts | 1242 +++++++ src/Contracts/GenericHandler.d.ts | 1016 ++++++ src/Contracts/GenericHandlerFactory.ts | 417 +++ src/Contracts/XCAmpleController.d.ts | 1037 ++++++ src/Contracts/XCAmpleControllerFactory.ts | 450 +++ src/Contracts/commons.ts | 23 + src/Layouts/AppFooter.tsx | 47 + src/Layouts/AppHeader.tsx | 25 +- src/Layouts/AppWrapper.tsx | 27 +- src/Modules/AboutDrawer.tsx | 28 +- src/Modules/ChangeNetworkDrawer.tsx | 6 +- src/Modules/TransferActiveModal.tsx | 2 +- src/Themes/AmpleforthTheme.ts | 114 + src/Utils/XCAmple.tsx | 56 + src/chainbridgeConfig.ts | 143 +- src/media/ample-logo/logo.png | Bin 0 -> 2437 bytes src/media/ample-logo/logo_clear.png | Bin 0 -> 27226 bytes src/media/ample-logo/logo_small_text | Bin 0 -> 8477 bytes src/media/ample-logo/logo_white.png | Bin 0 -> 38744 bytes src/media/bridges/meter.png | Bin 0 -> 8022 bytes tsconfig.json | 3 +- yarn.lock | 6 +- 64 files changed, 7650 insertions(+), 253 deletions(-) create mode 100644 .nvmrc delete mode 100644 public/ChainSafe-logo.png create mode 100755 public/ample-favicon/android-icon-144x144.png create mode 100755 public/ample-favicon/android-icon-192x192.png create mode 100755 public/ample-favicon/android-icon-36x36.png create mode 100755 public/ample-favicon/android-icon-48x48.png create mode 100755 public/ample-favicon/android-icon-72x72.png create mode 100755 public/ample-favicon/android-icon-96x96.png create mode 100755 public/ample-favicon/apple-icon-114x114.png create mode 100755 public/ample-favicon/apple-icon-120x120.png create mode 100755 public/ample-favicon/apple-icon-144x144.png create mode 100755 public/ample-favicon/apple-icon-152x152.png create mode 100755 public/ample-favicon/apple-icon-180x180.png create mode 100755 public/ample-favicon/apple-icon-57x57.png create mode 100755 public/ample-favicon/apple-icon-60x60.png create mode 100755 public/ample-favicon/apple-icon-72x72.png create mode 100755 public/ample-favicon/apple-icon-76x76.png create mode 100755 public/ample-favicon/apple-icon-precomposed.png create mode 100755 public/ample-favicon/apple-icon.png create mode 100755 public/ample-favicon/browserconfig.xml create mode 100755 public/ample-favicon/favicon-16x16.png create mode 100755 public/ample-favicon/favicon-32x32.png create mode 100755 public/ample-favicon/favicon-96x96.png create mode 100755 public/ample-favicon/favicon.ico create mode 100755 public/ample-favicon/manifest.json create mode 100755 public/ample-favicon/ms-icon-144x144.png create mode 100755 public/ample-favicon/ms-icon-150x150.png create mode 100755 public/ample-favicon/ms-icon-310x310.png create mode 100755 public/ample-favicon/ms-icon-70x70.png delete mode 100644 public/favicon.ico create mode 100755 scripts/deploy.sh create mode 100644 src/Contracts/Bridge.d.ts create mode 100644 src/Contracts/BridgeFactory.ts create mode 100644 src/Contracts/GenericHandler.d.ts create mode 100644 src/Contracts/GenericHandlerFactory.ts create mode 100644 src/Contracts/XCAmpleController.d.ts create mode 100644 src/Contracts/XCAmpleControllerFactory.ts create mode 100644 src/Contracts/commons.ts create mode 100644 src/Layouts/AppFooter.tsx create mode 100644 src/Themes/AmpleforthTheme.ts create mode 100644 src/Utils/XCAmple.tsx create mode 100644 src/media/ample-logo/logo.png create mode 100755 src/media/ample-logo/logo_clear.png create mode 100755 src/media/ample-logo/logo_small_text create mode 100755 src/media/ample-logo/logo_white.png create mode 100644 src/media/bridges/meter.png diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 00000000..acabd5c1 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +15.8.0 diff --git a/README.md b/README.md index 0f07e760..ae605b08 100755 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ type BridgeConfig = { networkId: number // The networkId of this chain. name: string // The human readable name of this chain. bridgeAddress: string // The address on the brdige contract deployed on this chain. - erc20HandlerAddress: string // The ERC20 handler address. + genericHandlerAddress: string // The ERC20 handler address. rpcUrl: string // An RPC URL for this chain. type: "Ethereum" | "Substrate" // The type of chain. tokens: TokenConfig[] // An object to configure the tokens this bridge can transfer. See the TokenConfig object below. diff --git a/public/ChainSafe-logo.png b/public/ChainSafe-logo.png deleted file mode 100644 index 95ee5385b99548f0438c4cded9217266d0687986..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4267 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 N002ovPDHLkV1nclQ*i(Q diff --git a/public/ample-favicon/android-icon-144x144.png b/public/ample-favicon/android-icon-144x144.png new file mode 100755 index 0000000000000000000000000000000000000000..c3365741b96535b79f2424486cc02240b892ad89 GIT binary patch literal 10662 zcmZ{K2T)T{*X<28^ni2)LK9F*=v^YcN>}M6^e!OM4G=+)4uTXB=^~&MY0^6)pcD~7 zDT<+pfPf(NKl$d(yzl)pZ%D|Hd+xdWoU`}ZYp+eb(G4vcN_I*Jf@pNK)lI->D&Y+$ z1HbW_%gx|}#PzztbqK0Wp*nFO1%JZ=Ote&?nz2i3;1485+r$8ZLN7xQ76(B`;4ADZ z1l>hJ(7HVYDLjE77Qg&fV;fk;Z0N@jNxJP3(1#BnQddXVjTjgrVDSvxB$bsWy6&|2a3$`N$0qErZwqgSw#Rq0 z!HQopAoE6J?NQpBLB~=$=>rCiXEqZ>n`2@@PU$ zE&1uQXzX;7Ucdc~cH9h-gs6!Ym-Cz8(S^CAF1M>cc_M98Z!w{Z1Xaz=yM3C*FKFz{ zL?eY^$TczIq06}UNZfm}MW@6TnA8PTsruP)nj+4?X~?N*?zv!sThknicKTi>5>ADP zE_=xbsm)!_CF_C}J_z{cRX_Wr-!W>|D|TVaa8HE)K@BC=OXgym?JN7HIbV8>9ofu@ zkX5#VIl=-(TN(zXH?(Zkmb`kk}eITJfbz!vY_Dp zK6kw}%|w?Klax@@kfVQjsIF@83BxJ;NaGeCdb2lc*5l1L(S+surn`LG%i(WjO0#c6@kJG3RW>X~;QLp|w$2OvcgoNNE zL^;flR$w~mk-9=0oEzc-`cJSgOv`y#sf((sX(}tDC!Vz5k3vX1L`XbENW_`suI>I) zs;q3iL>otG-!+gz#)pnZb}jj#jWdNahWB`N(m8#`D+a6LF9<9@kK^oF?the4P(a%> zmz0&oj2cLMt;xgfgyMEmC=F~COkhhWl9C*-G%+U=lAHPA4d-i{S&4Rdeb8|y`dU}>GRlnlFY2#8IaH%<&6E8AN z;wmd^(8v$VfeLK+@UHhMWS7utakLt0YQ28IKCW~=Wo`H{>d#?r+4H(O1`Q1j`$UJ2 zMH;v3oG8llbBHXmK2A+Bk_|(T_%5hw8tJ-TP%VoudcpuF$t8}$&aDMXsA^BdNZCW_ z&TKczFH~1o&*bQr4f5->rXZH3j+Bo2X20(&9`1a9ZCU+9+LKu`iT%NBy(?y-Lx2cWXJqW5*0r)cBU4jJldP3z z@kPO0+LL?*Tx}0aS(O^UgY%n56YtoSl_ zQNsLlo7U#$eq-NHrg%+Fhyg+uy0gD~_ikXg?u5#iaf=66(zlzhphU$i+%+EgS5iM; zuJ$5gdU`r|cU0Ec+B#7u(>Zy)*qy32sR`zT}8RPXKiR~Eb8dErZnFNXW+(trr?$}(Z$1~QDaUL zFS_kt*H%}Lx;D*SSU&;}%MSpMty3p_uFKf3NWq;I{A?WT(aO8W!GDGY!WxuTR#t+4 z=D2Qu3)||(??#Eoe)(c~=~_6eUF1K0f)AAHWjmgo{PR70_8n!xzrL}upvH(%aO z7+*|sn#noS7T-@4TUR6asu6%Im+R3&WNldp7a<%3@2E*HN z@<%U`Rh&p(UY=FnpRddyj|^nax;lwqCC*|bkt&6iK&ezGN6B-r-i?FfyjVIe&M8yW z4(FG2O5~XQ8_Vi?gUgeq(a0(!Zs^W6E&vWYr(5^ARL*u%#JxVh_IZ_^m9;$U`mDdv zdoC1LUJU1U^YBm&2#|Cc&3ypy`txSc4?Mni$#1bQ{(`0&3GR;<0UAK|DiWl1_w?MY zs9dj`+oZ$@*C6;w(Ju9Dm6ZuHdEPe^l^z`vbCyrWAOC(!N2k1JBzxh z{j$oODXt zkc6b9V*41Ynz1pxjL-bTh~vK+`wupJ_J0g#h5%9`cYn{yt%m(!syhnJyC%%;`F#8Z86D?5O}cThro-OqN4bcj!23$J z7rC8ck#JcC)teO2+mTjQbA#RX+xnrQp|9V(nMQbKqOiiuR76qOVUIVW(mDF){0Ylu zeQca#@|uaPQCw%+afiR}byCIke%#zID&jdgJLnutpIXEs?{sDh3Hh9!)-T1bFh=QgM(krW7Wb|pTE@uk)R>!fZZSWE) z)b;N1RdMHcjH?{-ZMMGUc5YfvSTXjA*Rz~|{QS9`rp4L4KK;_6HZVC1cw@CyljBI1 zh~@yU=w?`fw>3cXaVH5K07}Cf`=KT#CczDl(@sNKWb$YtI~P1;@@_Sahb(veiVaBK z`9Ao4XOL^qyXh-g#*2X4;A|;;+xMAmBlgYBZr$p2lHe8)AlJ(l?H`q0NJJyCG30d1 zs~?L6#l*BsO)o@u+skb_G|h^SfN5+Wp91XZ0fcFL z{QlVm#e2Wiy}i99EDCOn>l!l(CKP$({$;?Q;JfWn%R#(%o~h4y$&e7i!W5NMSV$ZK zg$FNa&;u3`g@!~#M7}aS4mAnvPhdLym=cL=YislIGcz-@2Mhe%79t6pCPkc06;5(} z^)EaAl48)Wt}GF&ML)UJv@}>;FU%sVn>A+e`*j-|jxlg zGsa);(&68x&Ll0)5E5R^Ks%nBH*dzOoUR#uZoPXo{Mv$Z^=(T_b^vjTr(d@YzIR0t zAFdXs^rWucl}EdE6uVopdMU5vdQC{tM4<~YBE}H<4YTtd<9SFTM<1|HcfdXu_;rrx zt|J_6>q}>@_|DdmO1h5qwT0}ycKgUP_30DAJ1c5x2IgA=?tpxQyn6NJq^si3H$lJW zXFYAHpt`y``=)!Mk$b^PAbxoSOC2_*q+=Nd1q0qs#Le2HSZy69L{%WehQUWv=%Z*A zz_GUg4ZH$ZZA_ypEGr}93g3nWZGL$Gc$BbBE91teYPFysnfx2BvWAbuW5-p_FO6S2 z7XJJD>qTRaXhih&7_$AZGSWefo7Y z%+uXHUQ0)FzT_S;1zAk?%cno{cQ22HOg-A8Nm9RMW=1WWqo0ziUq&uinp4XqF0m%6 zjG^A&-Nkg6>K#UNr2(T`+dKF^n1Y#W z^ai!G4qe*sq65^z+7+fQ&ar=-1Gmj|#Cb&!+&JOF%$nj%_Krm{6JyI-+vgv!cP=a!7HxrGVk=efD;ZGa&j{>U&y0q1_7BS{Vjyr8gf+YeWH zytaoS>E+-SvVprC?gx1x?^Sf167L}IryT5g{9?;k_u!RiTl`{&Q_|S~cfB#nRq>uP> zS%(1-JU*TH_o~E)Gm-Y~{T}%@1iWOd$~*6R8D@K_-4+u)a_*NuxHEPdF+9mekqYmM zr7dMs(6$jtw|$le*YLMhg#%Y>ou*#1eRj>kkoh5x-$yY4+C?RNTZhSnLaNkXI2C$l)wWrTknN^b-nYbD+vrEe_WW*7IrX+i6leP zZ4pRzNx~vBg4KwT{}*?lJ{6y3tNBOe+V}7E0SWfA9r?ave|~oA=I*YuDy_9tba0ue z>!!K+!NE$eCQ&BEq9Qb)_2*{|@~-el?bzqfTU*&5Ja|BGmy<}9UqOoC6-&!O*}0H1 zF)@K_**!{iPL*9HfBiV%EX3|7T9Zf$&W$blon9#xY0Ah?Z6e`Rdm5>7<;oSm#V!~l z3rlfJ3mbvlg5m@$;?CJg2=Ifw4e2%8tf&He8vKd3x%v1W!4@gjuBTA!{ywCj-AYc5 ze2!fEgkq(Ro%;qVgYL~B%viqs(D=9(C=5CoAF;_f-BteW4!!cs{ZzhLnUt?ig@T5X z3#)p1XP-X{a#ICr&ZZ17T3F^ zFFd2`J4>wi3?_|iZIeOi+T44g_z`EkC2TL`Mde4IaO<0+;sXdcNui)_^R4H?BNY45 zN0^~?jF~(;DJ-A(1O6*6iDZZtSyO#`kHkSMl}|_4ZA^r7IX`Yoa)MiLVTfN>>=XH7 zLz#QTxB5vzEL`5gPXs@9N?P+%9xJ9Wv&W^r+e@Z*V_&mA?j=#7 z&Sb;2JUL#NKhZ)>5aFaSdUyQMoMc@Fdx^dsQVbYZ`jkn)s$Tu>mavHz>Jqjwj}X%!fF;ddn=<61ssD2t69 zDg+cW4zqR6!RMz3waz11e(a@1MMT9~DFa{LcrFFK<>ly+8Vk{Dkp5uf%!igp4<_$R z=El|__whKzFBNs);CtjMhp?Zcd2yX5D`KDDc(Rz8)11TGY{i0peU4(2bWyLbeMOEY zRjn<&HX?{s?^}&pqoG{3@tx1WyGZ05k(Rg>zYBfacD&We6@VY>e2Rybm z@-(z&Y@M8$=`FZeCv0Tf%~&IH_>h*eG*JIh4`a+4+g2>y6;I!)ue}y^ghA-*>t; zg9h6zIZmt=}B?ZmNMMKv*i(pl{Ol#v_@dIX3nR6m8R8&8t&dq% zgw{K4HH=?7k1+pQ=;R_q!1{}FzoR{OuZ0ed{{H?uVpo%-LN2cOFLQ2%E%(JYAAAcV zq*(`$Lp3+87R)K}^P|+L6-^jl_o84RD8J;!mJW_rq{vtIWdAunX@`o>I>)Tg6W({rkGjtth#=aw*NHj!A3`^&u z0BHUcT4zV@9-jg(PXg)-RN$(Sex3}?BNnj%AR+FoWZNx&Pf-~FO2&sTUp%Iq_XWQ$ z_tias;eilI446|tAgnt*RATBj6|cs}0m*{mdZT*d=j4`H`N6d3AHfTH?GJ-2RT$|{J~p#45eB&J#iI;q#+}o zs%>$$va(XQaLFEdusPTC9RO7q&_qyxXa6Tccb}an`bKP6Da#NUHUw@20ErXH%S(KG zutmsAeF0n%LVwfw^$hQzWS3qseKRR)(c`t!z9@uE$= z&mTTun-(H3mfv{VGmvz#Hgw;^$;pYJgUAJx8E)X0K}`da(QBafNy*A$7CIsTE2OvJ z8o1rOxdYfgVFwq7(sT_E-3zy}$#}{#WI#H@8?$`&4B418_p+IJjOuN3S1lkoS{Qz0Kv-|#t{Rbw|;m1%~ z^GcQ#8h#y!A|4(dp&T81Zu`A-DvA3WGrY>m96)_b6ZPMFbFWlZT@#i`MC=*0$3)he zo0oT-|J2vZtMA_~9uzzoMf`eN#=7D_%$N`Uo&?q|2mCBpZ$~d)Jl3H%c4;Y&i-7)V zIXUs5G6oW!TP`z2I19{L>K7-qLM$8MJY@|{O--K>2Ojk%?XHhi^vlPMy7WeqQi1M@ zv4urE;54=>lA(KUN{5Rvg_+Bx*|w??5z1!f8W9nF$~~Q$=`g;oMgLEknVEi3Y#3@l zKqDGC6UD(U9)@?65W4~0b*bmjwEV_C`!Nu~oB#dHyYqWqo}fXI(_TWOSaIWcHDH1| zo*&nM98g$ImT-hib}z0dalnWWwnZ0&AdX|rs|i5mB?5tcCD)@p(%8pG6kwBr-xvW$ zY=U-Kkb9WVZ|{k%udgre1lzx{`pNaA z*{H$^zAq&uWj|A6Ly&`BWjH8Hw0q8o0vUC=IOW>JfxGk{2~0Z3K!8{~)Xy&N{__K3 zz3sua5hE#JTuTX9(24=nz`EHF2I}23{lYmY-#L-(rvV=aI&Pecb3$9C;P@?#)e&7Z|H~rO{Rb7}A<=BJ-%3t5wFA5kI z5G0L(WR6GtdRblgUH-?@Yl5n95Uz3W-+u_=0WBs_KORi@lddo}^TAK?^2D+^4SUw?)qzpE^55MQ{>W+mJryXEO(9Eo#K~J&dh86YU z=^5uFD=2daS(wExJSso`QkCT!%6s2J1TNpmhwG#-?uQnOx@^&{*_{C^6{{aSa%o=4 z#|))%vtA3AyLPxp3{FiwJ=_@@lN{jLJ>boxzk{TrejfvRB{!fDrGk;4-O=618~Jik zt_2}vbk`1%AUn_uumW{1odJnt6dWDrWYw;kGc#}xfqtld04^}cYw_mVkier(1!A+QKSsXx!RBOU;s zc6uKrKAa98UT&;oW>ZVV$CF7eNe!BvQ|>7V+AtzjyD^YqjBIR@8XFr+_CYhys+=qS zTbWq;aRwiSUY2loj-=~rz}B=AegJaFjXyc4tmKqEvIVK^^*i6Z(N7eGZjw8oB(12d zR0aL1iJQn=0L}+b($g7?Yx8Vnm4mnKL9u`S&}n&84o@zJzsRUDYbYeGl;=f)mSJ^^ z0>}GVaVfudGe~PC`R!L9>$YHe;K`?CMhz>MY;L`!Ws@MWu&~H(w;huQx@8O?n)b(k zH$mb3%X|5~99|=T7qsnuU(iVF$7mZ?kn-S=($Y*I!!C{b)z{Va{Imf&kZdp&3DM{F zFj>%~p}v1x^M$8VI5@m!Ai|1LkYK1m(j%nZUhYKO!j;W1J1-;iyRzKsN!e=jFAw;5 z%=ACGVwpuOaey{2fnb-ryUxfgYR%e+uB_}?@z+=}cu|=!nkPHB;=snAGC1ij?gaF^ zn^m`?I23~lYin!g9Qz4y`^m~zBP2wgmP27`uB`h~7aoc%u3V?pb+6*E7QM;~t=E$} zCN2?#ZoqMxFZ2Un>;0rX2|BW86>&wuH589PXM)hh0jD*&z$|8)_{MW)IZ5^#c8+8H z9$HA_#tmA6nZN@aK*5@A;~j-i8kEPM_p;6bd466vrRFwXbPejDu@AJP13>8a>$CVJ zIX?(+w-~_$Z9_wV?J>e5;4pihtHl-7#Q!#=h(=6PnzW}zg3VtVx2V1e{4)oTnYrvJ0SLd%{9>_6z$0bKK+q@9xL8RgPq{IgW`o+iMxhwi}e9TsHB7hgepby zCHZKOZ9sKR2wt%Dgl;EjxMfV#Cy*gk;fxwzvQ8s^(YXvPjl3h_o?WR>XG8A zBN}yx-jdeIC}LQ?d;l5nJ2f303IcSQzr4u}T1=q*@**1dkw_gL1+++@;Q+pz_V_U= z(yZ0Q(lX(eT?7-*)06pTY^{Y>*%}dgL)bQYN8%5+a?6}reg?yzD2K@N5t-E(M-`?PL3OS=i zranx!DV|F=!3Bw0CmN0Sg`f)8GDWW=2tsMo+*7mt(FjsFx?KM0**U#sy(HYC;NC~u z?->tW9rsKOl8ru^2w~NrN(B2vKC19XOh7@V&V*as>*V$3kA93+(oe~^$su3j?W5B( zoN`8R_5KQE4JE@4snHy&8~CT%6Ul#T1(~r&g;Y=h@irN@QQc}eSd7^fE-k4*xrkC7 zt$qq`IUjywq)fKYi+%&0ku08b?+IVejwlMrAhD)% zPu(A{r`Nt6{|krV{<_LxKPbiXPL<4mc(Z>h6rqKe^UYW!+NQ*^AnI0iV05X?4t;cm z)Lq?w&voHZPDv|;@kT1p6y>5cF1CgpDgNzKY36E(_EoGHBG>H}w^O`C8p*{OjY>J< zDY8WooKg+du!PrLvm$_py|*Q?-{CagG^}V&t4pvyJU_}*l2Ydi0=J=ISgL3&LP=}x zT$+~=r*BZV@vB4*_Crk&-AvzQfozGbPSza|)6}SlGoU|PsdeUddYtZ4#6gZFg1)H< zzOyFd6H`L_6O~+jct6BTVD3CCkTb6vTHE$Q3ywdY0`t?PimG7!aY~Jnn=?vqvU?gE zFR4ic;r3Tmv+#Pze@iejGIXmYeF6tZU#C(dHEVNKtC$2F$<##)bzUF(@+S(SL%oKG zz_U5jhW1}+RHTYHaOS}vcj#|Jb`fW3CM|0)Hi|s8ra(zXfVwgvQB$0#PadxYFc~1T zV5x8p3&~zd6lJRDSBzrf2NPz}=kY=C z%cY)#DfopsVJ$rO~j9)q3xiaEa2MGyJl+TKX<{#G%; z%HgXMYh|SjjysD4KhgYfcv)OSh7DXZPt$-qpY2x;J@NNSgZktT#0S0^o9|nUg*exF zA2B?txr`0G`@Z%ukJEFBk6J0!ve++6|KdP@WhGx=#^)Z{st1X7wk^{?HphyDwoB;z zT?pg#5?sb4KGof$8C1I^iEdR0^)iQB6g^aK)PwcO-(tgXdFKA@OsvgFyX1*nXGe42 ztxlMlsVyyLNvRe9hMollM~<>8(h@f@Ys=UWSJbzLdWr6(V>Vz&7W|2CVr>$*7ngdK znRAgHooxcFVtxKE-PU$aXz&wh;pMS^c5?Xf7nQkf2JAFb(pb?~NLBg9aRiZ$#t{31 zj5i#R$ItxE9{KwP2$Kx`P1ofYo{+|66>I=J$}Adj`vyd-3a2OGhA(nKXK47p+<=0> zizl|G{z6n;n~<#lE}uo?PKscHWGV@N<7xHF-?21|*Wo4ZID{BJyi+jY-Q(1S*0M7u z7<%th-%Oyvf4x>V&WV3chu66DuQP!EoZ}DFxE<)^5a_Ic@plFvkOWFxRzw^nA|YcY zA+8`HrywD56@^kjq3kk@i~pY+ynUVAT|)lEqOziLBJxP^NGTDNw1~I_(pX#u=@uC1rywSF@7_I8cfx4!2BSrN{axo{ zH^GDuD`7@6x4Yhs3JU7Jn7iK2K7k4fMqp?FBwl|0R_uR``Oh;I6x^KMUEKm9ad``g^cQ0qKd@*mI zKrdfcF&Bp*cZ{!3fY|>%7%?dq(4dz+3F&f@YY7g2DB XD6ntgHQfw&0;HpHL%l}TKKg$Eg>kBv literal 0 HcmV?d00001 diff --git a/public/ample-favicon/android-icon-192x192.png b/public/ample-favicon/android-icon-192x192.png new file mode 100755 index 0000000000000000000000000000000000000000..dd7ca09e5790b9d846b2379e40999854dff0d46b GIT binary patch literal 13570 zcmX|oc{J4D|Njevv5$Q$VQi5lV|kM;CS=Vzwv=U1$QrU{F!sroEo9Bogi?x1*+)f@ zy%3tRBq7QgzdN7rIln)O&}R*is% zRn@PnGt;%SzW(=ci}_uBbpl2C$2as<$h- zd#~`vui^5gw>{@Z?!UmEnR{6p{o%P@sYdYE-Zbu$7r-wcP8#168lHIM+~`K!-*#rIisqLKxs=OWShZJI5=un0GAJ$MwB^R`%j4U;DN;K zHx2N4$qj9e@}YhyNl9})!(f5_;A+Tf*>;czN@POepiqiN69Hip@Z=MZHP1r$ONrUT zt>QK)p;zf<$@_5ZtxXQYo~OL@*+y^ybNF*%JwaRpvmSbA%lF{#+Cq?q_&=E?sbCtI z{;ka|CMKpyNt1-3rQ2LwTmif=cbb|OzoG!ciY)kSrDaAk z7pA_}hrUYYg`|nc=0~wm@OfI8KE6t3f`9Z-(Zb-m|mG04r|c?My~Ng_#0N=nZ7G&`2v%L`A}Q~4%{a=8Fs@qg;94}ZH8 zp&d~2p25&s{9mz0K^s)8pDS5UD)xNx=@%!=UAIP6C*eIx?Q+#kLiT3f$m=SZQ-o~s zjJ~g&hMbols*gOBUrc4GVDha+%Gy8pqpOb)ktVccg_ih=L0oXuKPD7KrlzAZ&mNKy zQgXw;Y;V`r6>mvsg9K416is?nORIBZ92abX24n1dZ+Z+)K;+t~h@02uh07`^grUi% zo=$&h@g!1C0B#KIxlZow+n~U-oEs-nVES!Yh+M9f|L)Q`OAxvU*(SpMUR)TGOpT#% z|9v%2ubLm4g4FVI?MbFtS`gYy6>o58Gh(`mi2@t zPoeA0GYlLetgX|xKxMSe20Sr>38G_~H9)X{m>@S%iYo zUV`grWR~d3t_3zb%IA&Hk{zG+dAR$>8fXNE#x%aF=g~-9X?-^@%xQ`_zB~3l` z;~yCv{Ro~lwJNntC;Dr;TvKP@%`G7fVRjxKp3c=j2{wX%y=k&#YGO4qg?hFQ#mbgu ziOtI8LrY&HMT%?h{3Dq!v?CxCjEEK=_>DBlwRe;+XdaeRGib43PoaDM{CV5&cXByJ z^?_RO1boKn*GPv;VZ2d0zivH#tPFKR46S3ncr+7@^706h1h>H=bdhG*DTC%;f-XFU+iTPO|NH8{ zKhtt^xu{RSv~@>Wd<RMavk)N zhcZZf#Kojudc6$gK0Ng{YOwLLMSIM z?THYZO)W-Ec?~xO4`iCnOL(FF;9=EUx4rh5L8&iA9*r2czSSF5bqRSZ<=ApHXO8zX z&zUo4G(x_?LFp^S>;}1njbq;o4jSCNscUL#I>>`zt_el-2UBEg_?_hoLNY1uxVgC6 zn_Xs`EST{Wje62Mr^bl~QYKNEOM7PGv(j`Hqe@qY#pInH!>Z3`1^j&iDx{B+bv9G| zO9b6q+_8?QlhMP=uatbpWX$g<)8D^;|INU_IUgTcB+eTi&xNs(tx1%vxh+$(hQ&78 zV4tQgMXK@fzw^HU<=I><_HK4=90e<1u(UV9)4(i8L=y$om+ zi^d6`J=&Gf7U6jO`0=B#ReNFG7~~1fP`z^9Sf!}#tLDY3OpoO$+bg3-ztg4r1ZqNr z)pKn$oe>0f=p7cT;6=PI+}}4iR&T*n;r&^{v2o%~m5k!|$k&$lrtL}qL-6?Y*bAu< z(CZs7X*3lfzCQYN?X_d7w!aE({hhyXfbciKz>ATu z9qvuTmS3Hz;c>VeDODivlP#@Nj4+|q};X!mYd=*kE^*ytm=Gv-{h=izU^X#~LfgK;u7_T@tk46oV>`QDfK z_+ub7@@cT2bAYC#F75rw3E-{}>ge<63Y)x?LeIiCUzJhZR9!xQYY!d-4aEqdtg-m&xF1V ze)Z2=>dDR3rFZY%s;Uwv3aPU{mQO?^w6v%a1ymShWo0!&ml35G>h6d`5KB#qTz@b( zzzZ38!Y#CY1<98eB}w9AL@VG0DVC3&8(YnCw>A2M`3+uJ-~$eGCEY)io{9L`+&|om z>z6+JK!$nZp=*}cK*7_g-PPM*NcIz&Zp*`!N9$=-sa=VT)nKisS_4H%B+?)s4de(w zyW3r>uwk1V8dKNQLq;cO@mIdEa zzyl%=v56_@WC8&;6T36JJ6e83$ji% z{nmilABRMn^vkcJ7B&`oG;SV77{E6CRMPSRSk{D!*R)&-2vAhDkh8*$E5I=ZA)Fo; zAT>i@tv8Pk@$v&Zwx-opZu#zqafcMq;JMhHy~Jt3o|RCKKR?DJzUMnwUA`=mJ0)T& zD{WaeQ(tJ3D|!3{bI&N=8Hqva$)32<>=?DFz0P0->m1l>zmG}1YT)UY<0Sw%(K#?D zDU%mjHpP5kTIWYqB~PBD#50O?zS{Z1Qqs6m8kN!$pD*X&F;2qPgPwQ?EiElwWm{J} zQ1BO2D8PkO65A<^F++c_dPdc5v7|{{j--!vfAHH&FOwf^gr74vV_@Pl$(`Sf&>VPt zSTAYPYGZmEAf2B2(e`$z_V)0(BCQ*WlJ{3yJnBZ%un+9r!JJT+@_dVvbz}D{02El< zBzr&U@_lNwAEw42MF^!t9`R*T6nFMwgiOuMCY|I9jwu=+cz~)QbVnYn&(!JoFD79+KbX%bojC;7RQAe&W73c*oen|3v~W zEG(==^zA!t%nR_H(EulVyq_p6M&9Is+`9=((6-Oz`g2{?H`#_O&oSCzv6mzVevjr# z&brvnNqw9N8H_KdXxKJ$cD zcR=e-o>ye0O!^a<8utgEMg>(Z&UM`U_b7D527vPYPnTD~lR35pp{V$xpUALKa510@ zpr#&NKQi)6>4lSaSpR%L?}k;`z%g&zTP)ceKF6UpeV}#sLOW>f8bR}TStl=4!i2Dd zR^HNHvvB`YTb`Oyw7qw;*)?i;_Ll$jvjsq$x(XC725m1}Q&H{u(uY1?2bcJ!OE0@Ao1H76 z-D}~KZ(lXW`u8le1&-ERS8q(=vZxQQ4;WbSwTC3q?$X)gw2tF{>&?Rl>I|0fmEPbP z<4lTCuyElUq#QthupI?}Qvn#kpBBjvlu%LOHZ(Mhl{9gdHW^XNvoTYRIPEKR38mu8L<)8425fj|Li>acaQ^M3ox7r zZIP?RU<0$Wv+;w2<}OhyHEoB#2hbk9sov4Cpqy_Bse3GRC(#797zz>5t+hUL_euNr zCs!|>hIcb%^>c6ROaFi=dA>miYXnuq-P*L2A{g|^^dWmX^`@$ib_s# z@#mjWJ%G?tdN|JZ{uqCdQ(itNO`HRSB|^K*w|r=)1E`BEteqW99$z1l=(N|S!?4tx5(^b9wL?yi_(`=b>-TR^gJ%*D21E7_8-)XRqd zoLU%y%q%U>`}&>&Vjrdt)$r(+a|E;s0TJ}(!v}KK*`w6hgTK^TLqA!p_mN4beK_fd zY`=^C`($&6HSa1XLuBimM+ zUVadm+*&LN^!WZRUq(*OFK1JQoLy8j^^JCdvN;d1u?O%ZR%;$qx_E=VoTpQ=OnMk> zK2*~hi=_t|fd9tDAAi&=602macxs+CJ1CJaFbG)-veAkqh!JxoSDf?_ zqt~O?M_#n8yKdJ;6dk_RyAt{}iT`rvMB_zt?0)EAu^J2LU2^Qg8hCJI-G|C_WMpOa zjf@yXVm9<$uD@5CZ>zoHAtfahvG={OIeg8z1Mkd?W4)^xM&f?$QbJV#{QL(GosQ?W zXv&8eA5KnR4HCvRyjYyys9;u12^|Nc6p?R1@tVU zP(T|Epy`GHr2I?U5u@09Is?sTlt91bYgl zT{(h|Tom_u&S3omRGO^I3`<&}t(V2VVMz!|k{>Vw0?+Nqv|HX9wMI$;U#GDN{Wt%6 z;B_^^qyo2)dcgMj*JpgDvYI!3&3uE~f~LCGtmUo`&d;ka*Y7%0 z7&flImqCpEGv@`2>mp3Q=+wY(aeaii^P_jm3mF+1n@0!h6d;T`cQ+})lw0Zm8aRzF z1Vk9$>!)Itp{eDUbI^4jTr?ro3<|BLU z1o;XvEkSHB+ba?Xq}8IZn{&-|y8!PZc|W}GGm#vNRw?)>uXOLbsn1n@t$Rw|r8mj-9(detg&>rDJUXxD zl3rX}`REaX+8n?^O#@XEy7rm(Trz7{g??fXAY9)T7oUB$62Jis)mwVzy5L=J0j+lc zrTuR=S9yq9fUNE66kbE?`S6!?!S2dX z2PDI0sMW0qVX>7yf)1B1DS+zTGx9 zHTBJhgFj4qGB{zeykMU`f7`BGbn%Y6=LhXVhuugyj&N>PC3iNfQN4Fa33AZVW`r1= z*1-B&c(tq`nvk8JpTzGP!zmiOZT;krZi%>>8gGJ_>i!dOzU}PojrOh2U0}IXy422! zpSgEWvbARczMmcVq+M^Ut+4s+!q%Q3993{Z7)=P;-}d?T?Hiub#K~{5f8?1UZcs0|7wGF zw3(8owxKm9WJD4-IDmY>JpNY0o2iqb;^XEQWA^(^O#yare>O4_OyOB_7Fv+3i7Ng* zcCrv%z(J5!d?!yMsV_=jY&fcVyfL(;4S1Ot{OD@`vk?_w@TqFizIn`=(Z@A<03~Or z6zM&c)?k{yR)4LF7?2EIWvu8kSu+}10C?);#MC-{;&xdzS?R~Fs>8igQd0B)C$pTo z7#F@?W4fYdA;&b{HyG4q1yw^XY!z6wSmKKH+FcCp_9^>lqv~vbfTkLm=lU~Gpa#Mo zyn6GP2+W(Gprl9M`|~QKer2V1l}-Phl!M@r_hy<8fgEVz8X@fX0l}j!+7@emxj$ zSp8)V)RCO3e&D{wQFmrB=c95gz|7zA+v_ABnDf>Bvu$t0dFu zAQe3o?LoD|V)N~*e2U}lT3v)|5A~1L7U$gK_94oAn2>BDAldX#C<8XHlWxfnti_FA z!v*O_*zdX#U#n7`x_8VZ9(RXC6YPMF5s4?%%bElfmC z)owBe#7>?%{VICrZ_@8TZzJ_0ybLEko-@WlYw?XobFUqbZyVEiQ^4B2e6iWFabj}< zXh=z+|J;)yF2C1R>{#r-N`Dc`Zi8Ot_NSPo#s+(TY41A_>|O zD;7)T>;Yj_wl9sN{>+ez_n6_k4#t`~cWx z@Y3BIUx6puX#2PCdkDQs{sb^8Z%8bs`<|Z{1nFuxPImV8R*z( zKX_M*9}qIP>Xc~Y5)zh58_VBzYV1Ug0Bts>zWPY_U#d~ zw&kh}UtjjjW}&jzGFr)RTUk&F@z$k^n7Y zI2q>VW`07L{k%C-W%!q{ii}GceF<9Y?cBhy7Jhc^Q^Lz%FIX5kL>egaN*6vmb==ee zDHu)R0I&J;9Th@$wq3#l%eFc_7+Ui|pHB?`5>d6(37ojU$%bJNa8e}AklSq(%w*n-xuNd^^JS34L>3p?m z-a&Q#PgLUPakb2hSAe%}>{7BQ>v6|g_6?5lKn{7Uv%k808klK}Cb_fu7;Ih0+WEJY+FGIG%BRgC{a;uz#M zgfEF`Wom6>lhBjG!FUQ1#a+|E{bVd3;{VMqIYWDu!%Z5WEt1-W>;WPnnT+ew>R9hEvy?+NmI&qI&JX=j0`kzJ7^b?|Xau z9-VsZWu~`U zELOJ3Po9bvyfI7bC*)4m3btqOikPI(E&Q}i}vBF>v1>B>2^fg^?|==vMw|a z!`z0umISd>u;4#IBi)hQ0P1w2|GEKZb9uCm1L_2)bG|daNHI~A?{%$@vAKCK&^E#2SO;o?24V_uwuq#PXZtLR17W!*l_VjjFcZS(=7EX9T_08Rn{Wf5Qlu08 z-|K^4S~GFS|EAg_Re-;c4E#j(NK>l5$y-PGy; zJPXu}x{aT#DBi~OK3`ML$(aL)ugHi4r%zznjAQ(G{q%n`YF5HjO(RuY@#}3>0L>-hS-~t4y9ZlsF>AZ5; zIXUsb4_o-RGuQ9mI-3lNPmCn4eQW+DwPOjhgNAwRP=CSX{;|k<8-<!_9bQBvC(rIiV)>Xky-q+EK!xfFKym64jZqy5#*zte#@07AQy z9Y;x7y8CcoJozj2`I-S*S9vbQgG>~F@F%pw=jXc;QA~@Ys%*Bk=3R$-TmMj;3i0Sg zgH$ur#K}^!Py9{QTp!x{Iop>mP4@kaKE=s^6}s*H{!TqRUv3`w6NS%k1-|;j_g}zF zYKlk{TqkNfl@x}NLBMFhn1kH=#zB4QZ2smAg2ksiRGR})c!dhp;g{Z7^p(lkxRqt2I zW0L_p{Y>mvrkD8AA5jaah&y0|`e~(ThO(t#P_he6FMoCa{ywnzz0mcU_mM08d}^(a zsk~);Zg&jFSzzZO`d&O&zfiYT>W9Bx`G0=>bYRB`pd}e3&?6PV(VlOw7MOlkur<2as}Vq?nY9pe(4C2@vP!T}@510URrp{(w`T2dNu$ z$>k$Y$O#!D+Pq9#0N@=A64r_0VPqGE*Y7xBc|n2qxE}9298SjlCLCN-Re`xN12)cPgtuZ5J9}2N?!sMK#B)xuJaQ-UTu6vASWeC3ZO@%wvjFye z{>0j04S@%{K?Sb;)rUK->j1Rl$+El^wOlUpES;*1Q6LCRW=scIM$6;V3rP{MMe8v*5msa!pN*8X(F1(F=7>!Xa4gxW0IGZNQ{^~%C+d~VsZ-3ocr3>FwM@Eh^&7o5 zcwIcRk}OxAO*)80H0M+>N#|~HRtftv?KT26xcy^%pj;0Ioju&311{G^ZCY^Ig&MCv zZ2!&t-?b^oVsyCalGd^FpiHVzCy$XA@%dnoGQk!~8@`d)liBCtgJ3j}O_DT0bxcmW z#@zz_V3)tAc@U&3zyW2}6Gdl_F)34+I#i6?W|-10tgGIiHvv$V12e!B#Xct z+>N?zH0ZO17grBB4V(3a5kp&Tz~}@fz$Pg7o`BZY{TG0-_bh*`Zoa;B!OqSO8opt& z-f?_XZ~BY_=2U?89z=Eo+uPaA1Fxr1*`Dlpm)jMI10ByGB;@gNF`#jc;F5!U3ECb; zICh*0YNV0b=IrF5QRQR$@h2*$w3NtyIf4dwPQ5xiGnBcNYqJ0L|MVOm4jsFJt{nDS z^j+_kF*y3bz4)Q+0DQ5Z;n5G+n*J^c;DC$q=+m~u!tbpux=V6*J&C*}Xj-sBCaLpq zD?2*^m6`s}ERQ?BslCxjcjWd=@zRTyWey#;P6(unPoHR@;?1h{EfnBT*<(6{}V*CCXK<{&ObIw_@K7#Nmq@c@g(YDE8)4+#l*6ga25 z{qqwys91@B=im7b7dYZNsg5zQ(GlR-_>P&O29(KJq8z3^B|(uBb%ArQ!x9+H%*+-x zBNEv0t0OfT$1lLOf<|ZCu_|#uBd?G*8~i<(^MKKMRjibg@!Qtk#=z+gHvs5GXdJ`Q zW>(xhIAr}mP&UWxg|G^1JnCBKKq^7NwNC7(F!}T)UG1!|v@7ZE?#@PD1kd2s>W20C!DH%)MrDv zsR_;d5_L+7=uL2AgN>W`dI$k>zPX2Uh+Qw6+I;cV4wI->>Z?Z|>64yF?QLRql)TwTv!1j0$ zNr=Q9OwS!MxC;{}3#fuj&~u2M1;@%QZ4Q=K`Et~X6o4VkVM4JDxrh$#O4Tn?kce~{ z+qIwG6Xbwa#<4`;_;~=fqY<;K1jS1FnAwU!Z{ECtue?<=a`|{m{Yz@t>V!Ku8Z-iN z7DLCkz!kwK6VL(|o;S)u%(h;X5wiAyc139d6126=G{G z%h?}{r-O?(BESpDo}Kd`Pr2G*{}~`)3KR6%&}~emY|T;Q4d5;&p2-&`qGJx$T0uev zJee0***8UTZ_1ItD~o8r5rkU~o5x zTk-TQHfbh31cAXFkzQ5N)}~Rv>J1`>_I6?RlxmB6y0jf4p$;8AVg%5?&SYN}%9UII zzHvY3s?9#5wf2^cNE|P**&$YU?v$xd(kGPkLMbf><4tk}ztMsqr-Ee`xZ+&_t<@wz zvfkA*zC2?f>)-MX2R!?WmzZJ&2>I(Adx)Y<;fm7o6s1< z+WQp$O$J|NWxAH*e5H>F!BNJ>##bLLjK7XOV4zj{vC5d(vp_AMO<+!>tnl8+3MSg% zs&U}D$}o^-d=`M`_JJ!oRQ^Xz8{@Aq!GKX3Yh1Z8}qjyjRZbCNXMvz$2;9s07R?coHNX=gZ!)3q9pm>!H&8dE#Qk0 z8*Vc<57r`98(TNPv$TePS@$M3x)T+aB45jlln@tq^o(aK(yQD6Yyf~~+UqlUE_Yyj?mf z^8tR*vx!|DV)G3(i;IK7F8bH&=86o#u|%DXz6z3#wm%aW(NyYtw6_FO53{>Pe8=aW zHec2n16;c5V|pZ&ndC~DfmA{Xdf`YsZIY|xHz9urFs~Qzv0K2EZ=KkEMQo0{TKo*$ zV>|qOMf!YhkW`~((;o8~5=s2zNyd`@{JTLX$b)?N$|O$KlZbl8@ojZLoXn$l{ z%;T{!yT8EUXkN79Ndj%L8OZg;@Ry%}eEI~!=_1h4*K~ApB^yB_&X7rG`>iN$(Po6F zfsDFf4l+1a5cFu>_|*$`IJ>+&3nZ_=N2CKxT^~@eVDNi|I=L#z?L35mw_iT(=|r^v zinsp>Vbu(*dx4`Ke|)rl%>J#DmA1aU)=k~=METv2u2kNigB0zv5MJAO*u z@eu^_`hdpG11N@e-URvtRejiv-(c!wnvaH}p>M#i_}3C)%jF3S)JJ}kiq}3prU&;z zs*P@S1F{I><+ZHeL@WjcrT`exCWy^Zz!C;k_9uEo)go~=pdYB)M{ZrT4VPZ>QHjN? zI*!gds0<2XPW@t&>n+&;hxVa1noe`*mD@-vw0yt_BIF*B0uurIqv|fuu^XIPIR>`I zERUFY$VeL-8)}_VGi8mnRp>&sfQ-iDry8a5XrWL}WWEsbt_O5<+{(q<>Ag&jgQW&g7zcUr z`n31~XpmNkZGXGopZ5!sL?xdd{3CQNKH%^y&Bwq)yh)$m>H>WbZKooXQn8M#n>-Za z?>++`7uV>$3cZfkT{@;oWuq{POF(q|cvt8rUNO~kndSR(2+w%|YZ-`P_R}T|AFKBh zc^2VB1MLqyfNiMY*P!&uLR*upglC3Q*3uBeyw)eN?6`g&x5>j}t|HA)a*ke>?@zactl1 zU4t^mTh!_HF?;P>NKQ;=u*Oh zHLwbp=dAmm-59q!U)n84!#T@^Q*OhVD|kA$pv#Q&zH(%a-dc#&4l*3(e|JD*NArg8 z+A84oY9gGeg0_hpajRbvowqqap$3e0aLf0qBUiqDsLc+IO@7<~E=3OL>-IUNsaI zY9O?Mydwjh#ODu3ABR-!~Czj^sXK3 z4H;hK#nUAI>e^+0fiSHMyeHNF^+|~mtsUL2R_Kko6IZ9fq$)UJsSLBY7LFH)nBhsr zx2cs$Aw~4_G#iSzYfSj6s}1uA_7D6tNSWcfb6SuvUXgfVc#_HbG(m}3&z%^{>W0Ss zBwA~JkC~6*#>eO6KckDX$)taQsM3^EFsB_x;>uOXe3%;|rRrpk(hgds`ec!bmn>2A ziQ%bV8(M#KvVn-r+$56j%GTa%H=>V!BWsKq zxFL>8?q9yR>=A^yaaUTb8w1aWkhm*$*jQ8Sco-r3&7@40STK#M#actldWB_*rXD}W zfbU%;0!R^8>^Qw{`FboS_4I^a4TG5rv_z(R)wUWAov%!>3x$a>-hA6BM!+xa;pr=U zoPjet05}L}eCvAwhkD?pfiAXL+&0_I#+bY8+&E%_01Y52B+?PMpYu>Zt1vyW4Wg|K zCt53R`&ergS#79W(I}B!NTk<|q#v$ul-FX%<7FvDe5aBJ@g`nZTw~Mk(WNQAcky7= z7B}}|z#YJS`5M*Jx@-5rqjgnc=G3RybUwVHi;YDTAgd>s@#xxm(u)h&@xHtf+ocB& zo}Bqg3ujC2zsk7HrY0IX>0|t4#90C&7g=J*Ex^J_n2a=U`KPqj^wJ}o+lL39A)S1b zF-7?kHsHCyg`rk3U}#j-ei!hjjXMhK!Lw~xX~`)t?tjrA7O5_P<5wm+W|y{ff)|qb zj}QZO3%x!Ux7`&Z)aGr_9@@Py%Icqeky4mqr7`oR|dG>i-0cC%rMQ*5we-fma>9{ z)zwDW{N#FfXgug>E41*N1Oyp*fQT~80B;J(X%uDOK>Y8mq5uE-(Et51{q>lxb3sz6 Ub71BVc((~MF}z^VgmFvwe{xw=cK`qY literal 0 HcmV?d00001 diff --git a/public/ample-favicon/android-icon-36x36.png b/public/ample-favicon/android-icon-36x36.png new file mode 100755 index 0000000000000000000000000000000000000000..5d2cda3b1239ed0b5d4e885bfe10cbcc7b45d4d2 GIT binary patch literal 2511 zcmZ`)3pAAL8vYfL6v-)}qNI$=++4;aW(J9J8&1h3#+VtCT;}4MG>Udxq+KJIK0KY@)6SUAKA0;{g zK&&1Ba1sGP3T<)503ZSZ0OS4ufQ1Nlgy&SdSwevg0mtlZfz`DqUwHo}w6ih%=qVNe zY}&SFGC+2YIsnKM9BlC(o{cXv{enE&c8RRfqms#%z%uH#!h#AnRr=lxOAo~ztK3^F zr7*Q6e_rj;W2@mw1|weJQGMa{9R>5vx5NWBo2iUxr^I$nwD^TW+*yM z=J&Y3A}Z_n3x-w$BCZUVb^J0y2_%mD>NLSQCLH7uAcSz`k%CS|5Ra@s67BBp?rFGP zqU36JTh6n98|$LLkPX@}W0|(H5}$%>@9aE8xFR522~*UmRgf+AICJ;m!-p!Dbr@Q8 zyYnB=ytG8$LGJ8fe>Nu@VQ#k*~US({xNZE?Y9 z6Zb{n?;fz)(HQFt;_h`d!?}X(opW!iSO=CCr)gB`<%$Zk6D6L13=iwJsM{-i$%4K0 zu1_JJ*?Y%%0<3RhW+7XKect@Y;?BzB+z%gDk=4SouL#dAqD)Mhirw$KIx=Pk@U!17 z4>;%K6N_IdTLkld7=(KT|0o#3B()HAG7>(qeHY&lTcajODad<0^eua=+7s5xV`64? zp&aeJPBa>Aqh>exuIv{`N{L{hu>xv+Um|7-)3Jvq@J45)xG#)$?`#c3sgtwMOIFjl zv*%v0h>qpr^78WV;pbZ;r$4+L7|>#D}7+;x$W^G&!SA+?Z=dR|tcqQLRfhHt4mMv6;(Zz$!|6AtYMMU{|G17nu^04FZBd7Mci8!K zhn-v3VqUWl_ zSRzOy9aXav01vY+1n_=Ts|*e?tCS3DC()@>Uct%Ddm&M3ib+zowdTEQX^TjdcL~|z zYMimL@w!-iq9RO^>k-d6P|rS3_f$IA`|U}S{er(sp4I;3yK)hFSz@U^EZq^3?% z6bk1T7km2pa^`OX)bXXKR{_)4ekG@c*$D|Ue80Mm#$S|6#dih#te(a5Tw-+Y$@P_D zRXewkWV5qxaWvY247eXPIy&=Uvg$VmFQUNedNYd4uglEL^q+b!&^i>E;&j`r>)pFk zb8dsFaaJx?d5>gt<7E^saz1|!4efi12Z=g)oo`$w>ds5dBlP@CY)+GHKq4tFE~l%@ z4U5H&O-+HGhD?Y|Zs)H<(fHy&y~<+dsO94Jj*h)x;LB`NXozoij&3C!*CcQEV0}m7 zs(h{yi<{cpl^Pox`<_Lm@w_WkG(IBinK?PK z82OrgU`?Um^yeDcdhhz_1QAEBgxmdfe*P_Vw{DjkEzDVV!oagCvXLXL>5-yqyDIAH zBpdMl>BK$ypw%O8Y_XELbAQHzF55P|;RY_QiXVJlQt4Ri!X^5-I)2%k4{kBmP?uj> zw_GOeqn)~^YtkCg??qB0=$`vX8L+Rn25#K>(F5#<$(SctpOmqdFQ2=ZwqC^0a7iw# zPfJLgC#Mv#`+>9>27Z>q zKR)KDZyEM3D?Y?ulOtJIwi(B&oxV^Bf+IQ|6Mkfbrn;DxMV~i}cp^_#>2vZ{@O4|)-rX9p)hhyRJsHiAo`WhNC2yGn3r1f2% zf(QZiHAau1h>!p*);5eB5kd)NW3jFflm#H~uReqS4f9t`EH;Qjrv2Xm4h$PQYA^pxl*K#-k3L7eCz6n0EF1^7!9JUo6gu%!=$}LffJ#40f!c?MgtE_u(cn~4B%K@< z%7Xv*VBjWH6dH{}kdP!(D%m_B(1Jpxq5=ZQm_Q5#X@Q^`Lm9@9KFMR{H&6w@!Oq#1 IPw>C^Z^FHDn*aa+ literal 0 HcmV?d00001 diff --git a/public/ample-favicon/android-icon-48x48.png b/public/ample-favicon/android-icon-48x48.png new file mode 100755 index 0000000000000000000000000000000000000000..468a68d9defce55f2135f8651811e0225131220f GIT binary patch literal 3323 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 literal 0 HcmV?d00001 diff --git a/public/ample-favicon/android-icon-96x96.png b/public/ample-favicon/android-icon-96x96.png new file mode 100755 index 0000000000000000000000000000000000000000..5c33f35681f821576ffe866c417a53873373becd GIT binary patch literal 6757 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 V<~Q|$ZWN3F(Y&pzR*tfI`d>=wsowwq literal 0 HcmV?d00001 diff --git a/public/ample-favicon/apple-icon-114x114.png b/public/ample-favicon/apple-icon-114x114.png new file mode 100755 index 0000000000000000000000000000000000000000..7e1bac99eef9249335629df9ae5009e3b2641a38 GIT binary patch literal 8232 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 literal 0 HcmV?d00001 diff --git a/public/ample-favicon/apple-icon-144x144.png b/public/ample-favicon/apple-icon-144x144.png new file mode 100755 index 0000000000000000000000000000000000000000..c3365741b96535b79f2424486cc02240b892ad89 GIT binary patch literal 10662 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 XD6ntgHQfw&0;HpHL%l}TKKg$Eg>kBv literal 0 HcmV?d00001 diff --git a/public/ample-favicon/apple-icon-152x152.png b/public/ample-favicon/apple-icon-152x152.png new file mode 100755 index 0000000000000000000000000000000000000000..13929c9d40c13818c9614a6a7c5212b34cba25f5 GIT binary patch literal 11529 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 c9M(|;Tp>{!&GG$+~ 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 T^gR;^?tswMHqa_WSv>q-VV}Lz literal 0 HcmV?d00001 diff --git a/public/ample-favicon/apple-icon-57x57.png b/public/ample-favicon/apple-icon-57x57.png new file mode 100755 index 0000000000000000000000000000000000000000..e9d4d7a2093ec1de0611a6d152ccc4587e5bbc97 GIT binary patch literal 3885 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 TRSL2|2>|ZY8PjsC^Y#A#@`U`{ literal 0 HcmV?d00001 diff --git a/public/ample-favicon/apple-icon-60x60.png b/public/ample-favicon/apple-icon-60x60.png new file mode 100755 index 0000000000000000000000000000000000000000..cd53c2ee0850413ace484c8546149fb6707a5854 GIT binary patch literal 4129 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 literal 0 HcmV?d00001 diff --git a/public/ample-favicon/apple-icon-72x72.png b/public/ample-favicon/apple-icon-72x72.png new file mode 100755 index 0000000000000000000000000000000000000000..468476a7120f2a3bb20eebba736e42eb7ee6a962 GIT binary patch literal 5011 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 literal 0 HcmV?d00001 diff --git a/public/ample-favicon/apple-icon-76x76.png b/public/ample-favicon/apple-icon-76x76.png new file mode 100755 index 0000000000000000000000000000000000000000..f22d55e960f906b8a5845edd7a7f72b39ac2c5f0 GIT binary patch literal 5188 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 M{!KU;X8+*701hjiXaE2J literal 0 HcmV?d00001 diff --git a/public/ample-favicon/apple-icon-precomposed.png b/public/ample-favicon/apple-icon-precomposed.png new file mode 100755 index 0000000000000000000000000000000000000000..d847d4d5ba4f7ce70a51e2f8349360724f8b0c28 GIT binary patch literal 14144 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 literal 0 HcmV?d00001 diff --git a/public/ample-favicon/apple-icon.png b/public/ample-favicon/apple-icon.png new file mode 100755 index 0000000000000000000000000000000000000000..d847d4d5ba4f7ce70a51e2f8349360724f8b0c28 GIT binary patch literal 14144 zcmZ{L2{e@9|L=>z*eB~)!bl?PSh9-=S+kBUWf^42ntjP&?2|1dWX;lqQi@7;qoT-O z2q{YvqO5VB`Tg&?=XdWp_jF`?ywCQ1zTeOCys74wF0wH4F+vc;VrZai2|jmFKHzlV zf6M9X^xzZhnvSUs1T|(d9lFqh@2PHBUc^8R9|TswH^MjrOH&An6oVi<0fP3ykMPS7 z6e0&fKb#>*tpI{}0*YT+Xnm*L|CnP#=gA84qgv~td-w1B_%&3z z^tSuL@Pn6F)!A3YQ6FAt7pnw*?MdZ0a|wL$;f%q3{-N>54)xB&P44v5Bd(1tdKOZa zoV2~Yz1e;a#rkt1Gx+DQ!L5yO4eOlyXzp}(-m2gV5=ju+J6H7H=b6KN&*x4M4>dux+TulpGnZI(Wq*987TK${O&$Eb}S-10v7yEY%7BJxjs>2x3!Oy}0-76Svr zgh5UdaiK-W^Gjog4o{Z>bms&{El9w&nnb$7srTOd8M#JZjDtrTKRU1{otm0Dky_D` zYq?)!bEtL^Zg_@3q?5}*45uQ3^3jV;4)xxSu*DNR+7Otrc$%xBiAk{pyvx$aYaNo+ zV?gl|vRokY2}~UU@k-Q?%jO|Aoe6c=Lpx;TO>{B=jZee7*p0jf%^mX*Ifn2T%pIN> zI9plq(q52ZPJwtDSnTYZ+vf}&p?YmjJ+P!`G&(Rt7@jU(#gn+pO^y0Sjd>%Ad83`N zz%E`DK|tJj?}6Jqf!YRLU_=e$2bXTMv$Okg!Ca`SntTfU^vW{fGv#LKN$i-~YA@Of z@t2~8uA3i)gF$<0m=3-|e4IcaOwsCu7b1o~5f9igx)=jC%o`Qx0vvS}s`6`|lIWL@ z)^fV*+~Kwg@w0?1k@ViLC-hES zeWX16NNO>Ksf@w98YyA(@Q;=bLQss*lo?#)Eex^4QU4fF3*uGn<+(PHIKP}T{#9$M zhL%WEd<(>fLZPVADw>)d>SNhq^HdlE@B34uZ~`L7T0z95IyY28S~>(xHgdE7ON}Ry zvi)$QV9zykZr=t0rtVNbo($7z$wcI^ubjI_<8X@5Nysu3=yPYski@I>1o|E*G3^>O zqrFp^%DCUYeH-w?k@tzz`LpmY4U9n$=!j7qC7OtkFGk3xS$@7{>7Xki-98u36z%Tr zp6%yk&Ca9Eva+%gpmy(yoBd4_1VJ5+O3n7O!Xq#S^q4nQxx);EELNF24+$U;?DNNV z1u<7XL{T9y0iCow9e&MWcii_3br60i!em#VEE$Q!9UUa`W*~;+EY*rF)#5C@Y0V#q zr(MYr<(|DTr22?fTY?tHeD%?et6@$FSdJY6Le+6+b^3*Zyu7?Q7W=*QPLVLI1Tma# zsg{9|cSI04pPt+?;7_Lm6)fFO}u@Eq*x#Rq? zLT`EEkr1a|+>Bpx|95Isj}*#L8_wGuI4x)7MUBTm*a~s)rB%VM2x-WIlm5+;Cv*w+g}xfca1?(9@DSt>X=`Ju65m2xHk02={)mEHO@OuH&yA_ z1eu$sZh^>Xnelt756eaj=Pk4t<__z`3vYl}do;1CIRC|>JK_uk>2mhEA@l9CMYsWNKkSAo1cBONmm|Ko@Ex22`-h0OvKjQR>(QzfHF zTVl<>(M~FNn3`<&tk>1WH%3>*A7+j-(9OAT0U|^a-gVzVqupgRF)?xSnGetK$jC=9 z)|85r63wWuX_5^c{x`SyRRmZ$IXOF4|HNDJ{q>;A60eF;$>8taIutHhnjtpImkus{ zjSwuXzWa}4GT(}TP%t7|r2jY4FvrGDD!*|^Qc1VTlr@>=#fuj$zu!q_7u5Qz!{hPk zvTaD)DgVPXLeR~zduuRa@Z-O zU)s7WFER=*7ecu)RyCzph-(>nm5Umt3B!HGem9wdrw*FA+n0zM4&MN^B>euATL-c` z3w2>*Kw+@V_>PR}%}Y6=+v~GJl;_H{ZeTchcq(ga;b7X0=I01<1qk`1r9DAnqmk)| z5trU3-+_3eNf8&+7dWJN>$dwIBM9}Sh@)YH=C|4-ijF~VPun$lX3uhc=2TTxRSEhA z2ca()y&K>dGKPIKFra($rk0VB(Eulgu__qR7q}o%#p58AAC$51j)R@Owb5~=!ITld zpi)bEXJ0@5@U&rM#?qd#$cz|`>4==?kg$~f6IkWNOuxTRL4@=!WS-AZ{t`|z8+)wj zX0QL~>T5agQE`*I^0W^gJb2UJf5FR30*Uj0$FXB9C8`o6s&0!{tzohCme^-0OA$)k zJnwujLAjQmg&vI#^&?>A^OyF$Q-%MgZJlBg`-EZz&L8cb z(hy{O^5n_mkX0K2t!U&)wP5X1tr)q;ZBLUzMTRF*3)?FrN59j=dU>mY1e9|u)f^B6 zR_GlTEA38vAkf!4Fj{NMQ0DRZlwJM!-3oD;?-6Zg_ou9j077v6^u!&h65xEh^rIq+ zQ}iZnN#qX+H+T0qOGXS_yvm%D_F|@B@87j4kUT#&`#S~yn&!pzW%PnE&IP>)SRCLz z7K~>w#~7$p1uOOicGKz@EU7dUAih5SbiK_kMZ;Hty7um0ILPo}pyS1eHrxACu;tgP zRh+h0BTnZ_*~fo*T_ht?&7@n^Typ8aQyCZ= zUs(EZ5AD(g3tkzf1si=tqiVuVeG&fln~EQ-FAyhQWm7t6OZU3v4)^;aFJBC#M3x2n zISXJ)%F^DiY(I`N{`Owi&X9>K$+S$|a~0`@4V6`-vy^`I(z#J*&eYi3oym0g|&BEnQ10|xK|`|`abB@_cNh4ok#iemU2>K zW%0dxw<;<`i2TZ|PoxqM@l8#NL|z3t2?+_6;AKSdrJB1U08>^qN%jSDfP5hikH3Ys zDIy8~cVDaeZRvABr=M zKXS@+@6UfWxx0EBbjf;B&3SpK{AfM3BBe8dz7nkUWV62zi9{OUrh@E1(zqn?nz*!w z;!aOYsj&OHwMPmsx%P2RDb1d0w5LY&a{YJ&m}Xa?qX%VI$^OqA0;hbN=d&*g>Nq$! z+%64yH50!6dS~P3(?JnsWo6+7W$K?lL)9Bve;WZ{u^X!|p|}3!wM(Pj<7d}J9`OJeBCR-u77@vg@4bpHNSdQFlSQGNJ7l4WV-f_ zVUFnW7tDSAI0qyKsV#BxTBBX$rp7v*Ijp09tMvgU#Z%YKC)=GDV4@3PPNxlDW?B|< zgK1qHQ4~FMW+9GVu;ca47p9{6mEy?c?zlWjTh}oXwieXHyJ#^nu?nl2>i+z{AVNW2 zNFlMD#Td}_1uCak>=ud|#%7CpY4ioYz49vQ;YR2M6Jt6CZo{0p&2Y8;Cx^A7hRv2n zw?U@URzBL^4%XNnx=^4VCL{V_rOCBsBo+J6#s$m?btTukFi9(BzYL@T)0eWgJs3`@N{LU$Et*eQ5iL{4P)O!jF76VyDMbm&Jj*2By9*<8dJ&Ax%PW z-*I4Gf@em7JlXB>RC+PuCMV?5MPPuoy{^_?=&ZcSGE{zn-WrR&BHI6ZBu8|{(P~!g zs~mXo-68w?gJo)%9jVO(5^qTjR8bQueBQGc%w6e&N_xuoO! z_vfbsGp)UzpSK#d%LrMD84F1_1e7f~dq32emC8_=XBQMKGyRcJwUEYVoK)}fYu?Fq zk0=*Udn#V#^6=9LpQ7o7_M8762d`Lyr2OF1)fF%@yOsbHCBNt-(9P#x_Ui;$QyZ=m z5usXq>5MhjHxIzOAw?E&%v<&ri#CTYuqjO)sNcKP3QD_5z#Lw}-W?S`E^taccWJLt zpzoO#XH_xU#-q`0)Lc5Z(grd#G_0+yZL!P$-V3I#Ex~g6eaU#47as)%oHovPKHS|j z<&(xSNB#ZTIbwGHmhaT_c>tU`^QA8bY%g0-vf7QM54~Krj&TiFUUe;OcB}+N^xiN{$qzqmMAh5#gk4U85rSr$B?Z^Mt8;1^*>CE6OJ%Q5(84LP> z0(agZB|-KF+mR126-Xm^S;0L2Qwj>qJ|D)hQms^md1+Vvflj1fS?vBikXg3 z${MA{g6R4a`$6t&PmeC~q&hd-`9nE6R)Lh^VM_tEV7Pkd&yJ&i2iYKP0fZB-A?R5M zHZUtI3qLSm;uyJ7)pGc|AMM(c;t>@C!ub}zvg>?TB9(uW9zPM?T<3KF?F~XeC7>+!)~4BMf^M&PFS5HMj;1kS9^)AL$=#H%eQ>EeiG}}h z^xki=3;al&IhG5M>Ymj{?Z0NFJ&5Hb5+j(IxVShT;NuE$z_FJ{A8^PkC}bBFe*PKR z4FLT@H{1E1A7c-*OG{_Ph_e8&glm*|mk#c<19p*#wYG*y;cJ5uJlx#oYD#bNfiRZ0 z;Cz%qx1h{jxIn(uecMdy({-u#iPheVLNSD;lBfpz%2NaYS13pTl);;TJ5W{uWWeC{ zFZ*~K(-G(9sm7=szvzuldQi!d?cK2^7qD2cWVIwCUR>J93Ny*gcogp38Bc517QKfs z%*ju$2#;tX&K6wcPZfLb0(7dh-ri>c*@x*sRh(L-Y<|uBfCRny@PV9p{wO8p;4dZC&`%d@y~NX~A5HimTkoO& zKHc15&hAnIHs?TY>;^cA*@6?5CQ@f3>1LlKo)!X|3s$qh zVrc;f;0e3@`e(5Inu z^nq3Oojb{EQ_TwxAGKj@Y`B4%@lUh5@s)b)QS?BG<}3T-NIgB;t1*ADt(#>202P6H z`PR_2&q@+?@7@`?UAsmzG{Kct0nXC7&r`f>e#ZL#<_fd^KTX_}@n1h*lYwFG(`wV| zATL|h+^}vT3Ju-rSqc7{$aA%0y#6veWBiDE=g7a6+AeyE`ueS;t~=%`ucQ& z(HlCBH{L7FwNzhoJ$?Fg_}=$BjiGA}?RW=99P>T35E4h5V-bY`@bDZwvOk{PqADGv ze>5@W86beGd$~BbQO3%gc^|43hTrx+tH_pMC@7KHmoW1x3^&^rvpihI1ZozM->-!V zz;r#3rx+O-DGAoi!{gjk<>L46^DmZ4y3dqGgZ-TH?iMAK0aRp~Art!QBx~|Qt9&>O zxgfS}R(JgaRGg&62uoa{u9d*PVTun(l2Gi=P*m3%)m?PJ`FZ{2#yy7xx{Vv} z#Sx?bOt=8zx(w4PINSeQLMrUkmVi$2=c#ymtn@A$$w`hEh-%@lOF~A(>4m zsX|=(bCx$V8R=&4X9Ix^`y_DLcPB^GX>=8G$=9VW*UpdCr)XFu&Py?b!+j zIPPQVLsD8-7v|}^llr-0j>Yf0kXuw6NnigFVrrg|cWDiCJo=xsnj;7$ACE37Ii?j> zmp^`tpcDsiP*XwF1h0MOx{$=&S*DW^007sw#l`2J&3SQvL-iD^-r&3E!K?lbWNF{q z4W=|$>}B~`f1&_+@_>-#iZL*+)SjI6dtYrLUlq(+wO!$zPo_70je`+mh#xHZbGMP)yVlMO*O`wZB)DDTW z=&5(fKv-GV-jEubV z;NS-nZglooEEm|P&)>Fd79Ble@B2Wz&|w!+k}Z^jSX)|0HPOWQk zJ+xAS4^7C*%S+^OiasF}vu*M8k5-Y0k`hk^q_zu)po~?b|o}LJRlKWUgiKkI@H)vN=<0 zte!Wd3%wH4w;Vm8;<2$YR3q0@nDBTz4~|)@bWrGvH#}}>uYeQdGpEvE&*NFA5oIi= zrlDtn2^to~4fG=)GLF4f@nGnnEBmikDj@M z&SxWt$-I-I64eo+Ez}!PJl+`G(g3(j7=Gm0_k36Z2z-j_)Nh_Jr}wgt96(9w3I*EF z#8epOuGe1gB>E*mp7dqChHLtR^B|wv+cPvzoxELANtXMut7v=w?CI0AAWvr6chb*) zz0Pn=$yAbItal)w(;TXV99hb+N-@M0i?w?g-0ibAQTmlxz95^bWL)UWIEm^HdHDLx z6Cx0Aeu9u5e(%dAo${5L)=47mcVaezQ_6#3E(o%vhN}cUILeQZI)kqzrGeTz2Xb;3 zP;2J@M1E|XLk&$W*um3tw$|Oa5ID7VN1qP@?;923XuPXRQ z6`=pJ;)5X62|TZ#xhpxwdr(K3n+c|~afdDSH1RJ`p}2j<>pID|_|bsyY%hQ8zK-+B zad;Ln&=ztUS0@0U@hIn|E|Y7d^YTRjK`o^Mu7hwrxA?|j7=0wP@})g5RkEB+qluJp zld%EO3X93JsqiX{y=Q(It})m*T3wiZpTmnN{$X6Sfq-PuMxk_B+|M{CL9ixg9u-HV z4`IJEEUsFiB$E(m+pMGl3B;AK^2!es2wyJmqt+7uh3Za!A~<0x_dW#pPc|_SPbhYg z*&tT(r0nacoxh2{{XO)R3-ID6@Np-iZPgdwxHk4!b9%Qhj5YYJ-Om%A866`w#)E>C z82ryA31atYt6;@q|CMudrvo{BKQTay<2q-}eC1Mv;M(VB7aSb;Kq&h8`N=I+M)2bN zgcbRn={(@Vypf8Yqpsl@tyld|@^~vsX}uSl?BOyU5jJE`Vm+A#Dn~O?HAobcC1xy^ zg4yS{2G6rCzm_MzgQH5!&p)!aDytQs`e8LSViDCTkY3Imr}1iD9PaiGclZII%fO|3 zVPAnJT5t8Y_j?enLf$YE*GC1r$!*C|fPy6PwJOsMRf>7fd3|I?^Vxsq0vc#nZ!>UD zod*Ci=gQ5Y$Yozuepf$QAH}mVq)1y&ktfTr381{Oty@fCHnIPE zeBZ)@r_LGfC}bDw=)(#xKK)F=TU?Sh!V(e;TT6p|i|>mp92^({e~S3+*1A1x+_GGe z4&)%9H*+l?Sn}dnD-{?|dmyW6Ey9sbWwoRq=kt2!17Pmj*#_V4*TWUy7fU_Tt?=v*@L5h>#+-eCY+M1y(l!-4kDt%-rK&JP2{CU3?;#w zolQ;(uwFD_C=dM-QkH%ty*FNcy_Ew9)&kG3e~N$g>m?ICn_%67l-#Ay_U$({feS`; zr=QE@#f}0YE6Y0mp;=3fHVmzH>@V?5^PFK zsZAg+FYlI?Y!yXUoP2tX?Pc%^`?6XBl?oZjWG@)t+a(PN?#l$cxd@%g7IpA!n6p)! z`xBY)c}yuI{WZX?8@mgc3+u7R>Na(DaexkaD6_u4DhtFkdcz!Q>753uH^YkcQUd(B z^W1oX+)pZl975FkYaW0TCY!uCjEuU5RbjeK*fu7tuOJ5Q*S6=OakRUzyFFsIdAKzQ zB!`k46UB)51bQ}V?Xt07NL-x?8vSuKKm~Jjvuj4P3M!zQV88Fr2dbBdhgrYXD%x} zQ|Nj?vkm1@?ViE?LCKGMwDp z`leda8$O+nKJ%-0GIq*kn43f}i&wQAA043mzi1q;Ivsa0$+jX=Z}k5~leM5Z80I$I zsVIP{j0yh<8t#hV0I5zh>aR0UHkU_g*q{z@I_Em#3bbO>^fLq)$VdRZ!GY>Jd?Q_R z^Sip~2z7&}%Qx-hciPt2-j=|H$F9AMz)R5BU#?UEa~H+*hLK475~v>fo)YLKRRIl0 zSGlGj+slyEB(SIxdu`QT1|}vwfZGI)VQnc68n7wA*&>q4p6@d)<};T61=&3wodkHy ze=t5sRGT14%_p#Fr5H@o2xIJG)|{aW_Vke8!zYQYp}kI@fma zOMN=__}^q}gaXhPl7OD59ARX9UvBu^NmlyeOV^$nE`xfhFoj{jF+cTq-$jWIfU`i% zC|mkS2;nV_9&k5gpP4>@xC`vqs{nrtIeO&9*LHjq1xO)EQj%#ldW*&8(bZd&yfJYl z?4-y0!bA#917qx<7&t%dL~t?AqALbD)=L|R?q1$y!#}0~H%4wR$Guu_;}__gr;x?X zg}zfcr)?Lg)C?uu=lNm=kW?lSHw5}nnwqaa>{w&#pDKgU1XzGTk)tV?B8^KjD?2+5 z=wb8!c4qs0n`e?h@ClPdG;YnkqEsvaR!}gHZEG(XJ~$R!Z&_faRB2GOdnf|_@B>%L zN7yc8|5ufaM4y*@ehaxKE%eatmYEN3w{*1|dEwF})~m7qLMXg%Yw`Vs(9m;7hfC*i zGcQBJ_g88H-=4nH;mXib5b_2+T{K_kQ4S6c3m*YQDGj9cZ`%r({333z+XJ=3B^zur z3cKZ8u@HmUG!0%*Fgw>etiGOfmP9HXtaw;g*8@1k##{oM>v*00E>LCVZY-KagFeFl zjM<_=G6#67U=uDa=6EVsJgsFRLp|&6-Bh4V*IjOwak~+V#iD_)GH_R+rk7fn(1OHa z=YwqsBPtQg<%nvycD}o)*f@*&@5tBEB@>cq@fVU=T~>yxT8{QtH~&ug<3JMHooGKw z%+%V41L4V6uGiZbz`F7a$*yD~FN8m-9y&MInSf$g98qMksy697+}rwxIw2j0Uerx7 zMvb2-CVR!*RLt?BuAQ}d<=9};NAFdb1W=*#-tX^}v-9QVfiF=&mEHgKAMSI0(<#Y< zk#Nn(?G#c7MjQd70)6UHZVvp3Y`pnz-`NsLb*MI5s(M50*Q<4{I)`VB$9sdZ4rPceiH0j^-_MGWHmK!V$A??^rRlxv36XGVa=S@iMdOv2~S3)Nh@M~!%KLO7S)fxHkDBoCHT?ReX5=hqBK`(A%y ztg(7PgWaGcuKm?VJ5K8$X~&TzxXP;89i^B$6zL;@5tzV(1=w%+>Sv(3e0zHvLSW~| z;sD6m-&xND`F^+53#>tX$q`a!lw$OO64S7Cpno^lrb3>4Gw!CC_5dS3A(adDW1X4? z9?|f4aOnaNC-Bc3>4XW+AjFTt?%cUE@na>k+6$@R!F)C1J6AE_8DU={&H$dVcx};m zqUe1Q5fReA0+md=fv(pWzUc~%B`YO?Y90JkIF8zhd@X+VEMpHIi!o>uPt&S=qum0p ziDQ(LV9&Ko1Gb3TtO6$S!mSe(0=^8p^?(g-{}}5p)rLXm4>xFl%5_0xDJ_(tQ3^iO)KXw=pPvP(2)ORPo7zmIjSV5^nVF}$Cy{=vedR>V`QA1Sw#Dr7q zEl>}3dAb`1fU5!&P)2Pbbf(bxUuI-42H>i_SDxL@Od=ovv9KRckFy2RXH!{{Ak5Z9 zzspjEHcMb}_27hFqmBS#aH|Cfoj?TG1mWK8*WA4S5+L^O<&Tw(H)A2@M<1vcKQwHCF7`7t>LE+R-z8ogP%$2V+CDY^duxm4isU^vB3BWb8my3E${gI> z+L}N?rvDMkV~=lYY;@2ZIX{=V^0H}}P1Csp0`B6o7ahuEBt@~mbWd%sJq$2T?Hb9D zEcZ|CbZ-U$HVp~!dGr?gwjbRVv{2U=z%D~`S}qU&8OK`2A-oa|LLIl9bYvj#3UsuLlAhdc47oVX2wzap>FWc@65_$m|M|ZTD z89N6KSsx&jjnR8S%mONpJJ;Eeau86h6Z#eyym}KoJ8H|Vi@LhHvXGa-7@QmJfb+Bg z9CW(j1WBkkt)f8wcT&H$DVH{wLBffS??Fl%LO>7#8vmWEkqko78&s4NPT@YvGr=4b zhvt2e@kp{6899P{r2sVYM3+OJiveTA9ij81p!~woIy@waG{Ioj|d*v$yB|Z zV*~#N3$ahcimil4#worD3-vsp5Vz+UiRfa$j6n{h)M{Y5ddxka^6LhIJw@#R*D*?k z_|H6O;sTiw%wVX>_>S7FB)}s3+Sd(phAJ-t=yv{i&kV?8Vp%JL_T)*gr(Z6r)Mzuv zt+*8cCu1Y}NTOZD{qzb9Y5Yu{*n^1I_?6F1{H6t z>EQ7#a7FOxI5f|W=ZZ8HwyG7Phb{A~$K@0ir32ZTYG~%cJTqCI-^eRLlVjn4l47gP zN?9L{rGbk#fPoi$Cn$1B53E_$4_Sf`I2&FN8uXl)#yz8K~Z53cmt~9-`McpnKY}?)~OaS#uHR~#Wj_5ql zjr%}VZS)$cwlS+m;<$*7wlP|>XN|lPKcU3ti>ZMbZ1Nk~|5a^Tl=SalM_G~@;KlF_ z=jodVYvHT)%^P4W&7oh`J&5%#MCql7Hu2#i;ykCe!Ax0Ng)>MSAi>jfOFO{GNT9uC z=jSgDYRgjufYf!ZX}!B5fI?F)*!+uBCm;?f7b-v;Wn6g`s)T53REYZIeh1{dT^b7V z0eaE%@m)<~W0;cZ<$*v)of|c?1$y9EqRvNo0;i+p&-i6D1^OQCEdkfV_+A0`@r7rN zSJg)Wmah1i7C}KKIj4<*DL02 z$>^x{U!ZU_E}C;Dg0k2M==x<51MFeFElm0jTI}nwmMH^`H=^i>I;tmJu;+(Z^Fk z`kgRaaU3%+dep;y^?)7DDlN?f&MVLnX#i5!0T3(@d|jqYu1Ivg2w~u@S7qJoDH1^8 z_CJ2ClCDJ$P}Jj&kJgV_zjZLvcJx6d<+&vuM7=A{E-kPut1Wk$AqKI$iw|mRJAhXC z*lR=#81?1AZYYp*p$3I36ELxPfY(kq1=AXfS8GE7e}CFjNI%F&KEtv8!1VMUJ1b@P z7y^F1U;X9*6iq#62z`PoKJ3PAFmy1?ML|)}H=tMiYYMkwcLM_IW1k6`>z|&`f_ovA z`nS3OSOoU+TIO#e7J~v)0ElQ4*ybo8342-u z9Wii{k(QR0lsKb!*kJoXgm>@E#%2QU)CnXr_H*^rlaR9(enESi@4T}m*@net*(c!z z)Ib-IeRs#qz@X#w9Y=};q(2rnS${g08VWvv%;P8CbA^tMo7uTKJeJ9^uoS-q`T;Jy z4mG|X8laYA+25}9<@&;Ks+?OJ{t>z!=XZFX>ZAW5-muqab)GhWx6erAc#0c~oWji^#~OdqjOW>Z3e$G4vSTahxFd3-Pqm_v2ZJhHd*^ z&l;35)}&0ckJ)S8LY}~M1UlaDe^v@sK}ct3xp%apS?i+=l;8~|m%qC7v@D9KCd{l# z|IvgKUIulrL+ex<1r}`@(>-Yrv%rwDeJG^DbOrW6PJ%2xtZN7LLise|^x7d(JNwU4 zmB1=sUNG-}cBbF%cxAmD1wTKHqGhIn4PYhORu z8`QhZg{MmR)w#?15@A&CfB$sf*QZ5t)Yde+>cL?(Cq1XYq{>dfQs`!IO>8d_(L)pT zZ&S(>g9>Qps5WG9*BS5?o^^8w)(<>XNb#YX3+j*nUWRySXoA5)mLSKd?Lv%Uc1GiV z5-rreN6$rb;N!CMp3_8HX3)MwRH#Wxn@|rSait1mZcLb9u`-#hxSd+AHc4>&6;mW_ zLTJj@x~2d)9{t>Sq^X8eZ!ZopT>asK55v+ch?!W|6lx|+1_$c*|;@TPV zBu8QO+BcPk_b=6oPRZb%T!v!4949+z>gzwgV%>vGw1kL_93+y~%GO?+GttYpo;lhW z+z>}4^(|jsb`8LU-4he;!oc$&B<`9uHpU1$7DC8+Ga;TS97v^Tx>nb;US^i8rp<%V z<$hO=093>YJ4UNjx*mf`ksbG`qBC}cmdG@(TUJA%i{;7I!7yR^n{PXW3HYTwJZ+hm z15jrB0R{nuZ+*}2P#e57(8)4`+h)00AAOIN14oSKr2;^OL^=ZZa~|nr-bqVnfvC$v zi54>3UKZ*F<{Qf9RB~iT5~;18^uq~`a$jtJvV2+w-y!EpyouKmQQ7o)d}WgRT^v}o z#m&8Fa0hT-s!CB-YwZCTT4y5JpvT~dekFKsIy}X1S>&+duT6*~K zsp?m1I7?EWC;c{yl2Gu3m%-Cvhf@%_zzjQP3Ks5^;c(-YZ*p^04=uu>b*TS2(%wrR zQ;;`q3C0C33^juegCisNJApQB(0->DjBUeQT~eBU|BKF$U}ZiWzcSuFv$UldIG@OK zgy^rC@A2X{U#^)yKK2Qo+I=zf#W6O`31AVI%yab0xOdvf1!U&t?jb5 z6|>Oe#e}4fn`Uw52oBtxDT^0A>~n2AOj?StlXA)IOb7RS5zrN?X@)8dnxdgkb;ey=3CrDlntt^d}la@bcEss`{S5cFfmz0xJlaq70ZBhAu z{eiE)o0mt#|NjqUKCB3VKhUT2aKqmtILsx;9WwNFx#n)_a?K0pBYaLqSw=-#RTy-s zC@rTXjg}X-K%W!#3=R%Zla&n%3zPApv<4rbwTyqzwdtfa@IVMjd7`yvh_9=fnyx=C z#Mj*~SWV3wG`#_#YmQ&Z{y%O0)2Eu6r@PlR&tT}BoSafZn>%R3^Iy;T-)(HY+=4wR zO;%*r!0TcV?|(Hh_40KOjtFpv{xd4s0KaSJpV(abf1YD%4O&5HB{@|&B?SdJ`2zaA z63~S0zn){|73mJiVKBKBT0g`n7(YVZ-A_aOQ;vl-|vR3q6Z+z u@^UU{7bOpzva6e_yN8Fot1C{$O~oCpD(4a2h9!e%L56ylbQ>_v@&5}u=l~-C literal 0 HcmV?d00001 diff --git a/public/ample-favicon/browserconfig.xml b/public/ample-favicon/browserconfig.xml new file mode 100755 index 00000000..c5541482 --- /dev/null +++ b/public/ample-favicon/browserconfig.xml @@ -0,0 +1,2 @@ + +#ffffff \ No newline at end of file diff --git a/public/ample-favicon/favicon-16x16.png b/public/ample-favicon/favicon-16x16.png new file mode 100755 index 0000000000000000000000000000000000000000..7351a6c2e40f466969ee753477ebfa24d7b2fcbb GIT binary patch literal 1427 zcmZ`&eN0nV6u&LB&{8b4E0pr#Lk0-g_Ptl2^re81^3e$dT41Xf=+|rMN3vf zEx`e^)f(y%3g#d*a0H=MNDcgkP!EpKV>3e3Fha@xk(nkf)P3Gq*IWgFgoFf%L?RZ8 zckI}al$0bAiG)I7a&od%DrK|TJRUDLHZ~?EhRfwfMMb@|X#fTfRe*_9bK_U#W0|3Y)x)1{rq|3_6+-^6_Qdn3xG&E#18UukqX=y18 zMNw2J6f&F5eSLi$9UXajd67#1^_-lXU@!=BpbLc1YI=G)Ns@4laJ@2_41|CmZa5<& zgCK~wxHt^MKoojbC=^z!H8nLgD=Q1SfOIj zvI!9T8AC((OL)!-{Mha*&u+Psyc7D+E8pjj2=4WqAO{N9S z)BX1Zf<=mRv})>F_PB|DG!xVc1gl)h_-RSYl&R%T(O~snmhIHy$(e_%p~02wT}IXD zz;soMF|f~lh;H-Fj!PP^EPj0cQo;0>moLuV{AuponYXWAoxdVukH&(1rD@x=V3?vKXc#)hSu_mGz>tq-|rBwFz_9|Rq zG%P?XeBI7_gMR=al7<+{PTJ+{WDubt zg{b=|V3N1-{EKGwLzzi4fEfv3J1P>3kP zHF%Lqg_FZEPtO5FxQ)l?3epI#to&fC>-jy2(oO G;eP-;fqQlU literal 0 HcmV?d00001 diff --git a/public/ample-favicon/favicon-32x32.png b/public/ample-favicon/favicon-32x32.png new file mode 100755 index 0000000000000000000000000000000000000000..22d65175afc40e1fe1ec10b85f9be7d68f0fe589 GIT binary patch literal 2245 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 DZ7u25 literal 0 HcmV?d00001 diff --git a/public/ample-favicon/favicon-96x96.png b/public/ample-favicon/favicon-96x96.png new file mode 100755 index 0000000000000000000000000000000000000000..5c33f35681f821576ffe866c417a53873373becd GIT binary patch literal 6757 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 V<~Q|$ZWN3F(Y&pzR*tfI`d>=wsowwq literal 0 HcmV?d00001 diff --git a/public/ample-favicon/favicon.ico b/public/ample-favicon/favicon.ico new file mode 100755 index 0000000000000000000000000000000000000000..1a341e235615811b7b7c88b0fcf9aa3b8aff7d43 GIT binary patch literal 1150 zcma)5JCBl45FOs{_ZtHHu^3obC4p>0B!K(?I!Xx;vW1DnSkOQtHFoj`EN!if9Wf@x zXrdN2Rv0T|qgF2Y$LuZjK-e$A0-EMz?UV^CSZ;nfded6=^R+UPH;a9jV z9vE)5T3oBu*5J91Z@<(4ZiJ{+!TvQCi*dKx|0&1RE59?x^!hi4Ce4EzU&!@<2?k2OtG`K5R1 zMS73N<6JBjITQ-9)9GBouIRhzaXZv zhxY^j8nah-h58gOnM`uITvnXI;q`h|9mu~z?QOvW11Q;WH;*uXRiE^Ec6P>%MuR7l ziR4o?NbM4XSa}a4^hKzVqR}XUzXJaonR~Tb<=Je;{eGXve za-mRI!S@1~b4WmPVHR8H?i3DSrI!<&3-JF0?iILhf;TKa=)3qs3TD6MI0esb;53PY mekh#Q*NDCy5iLDL3p~du{^CqD}DeF^!DIKiy$5d8wz(ZfCf literal 0 HcmV?d00001 diff --git a/public/ample-favicon/manifest.json b/public/ample-favicon/manifest.json new file mode 100755 index 00000000..013d4a6a --- /dev/null +++ b/public/ample-favicon/manifest.json @@ -0,0 +1,41 @@ +{ + "name": "App", + "icons": [ + { + "src": "\/android-icon-36x36.png", + "sizes": "36x36", + "type": "image\/png", + "density": "0.75" + }, + { + "src": "\/android-icon-48x48.png", + "sizes": "48x48", + "type": "image\/png", + "density": "1.0" + }, + { + "src": "\/android-icon-72x72.png", + "sizes": "72x72", + "type": "image\/png", + "density": "1.5" + }, + { + "src": "\/android-icon-96x96.png", + "sizes": "96x96", + "type": "image\/png", + "density": "2.0" + }, + { + "src": "\/android-icon-144x144.png", + "sizes": "144x144", + "type": "image\/png", + "density": "3.0" + }, + { + "src": "\/android-icon-192x192.png", + "sizes": "192x192", + "type": "image\/png", + "density": "4.0" + } + ] +} \ No newline at end of file diff --git a/public/ample-favicon/ms-icon-144x144.png b/public/ample-favicon/ms-icon-144x144.png new file mode 100755 index 0000000000000000000000000000000000000000..c3365741b96535b79f2424486cc02240b892ad89 GIT binary patch literal 10662 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 XD6ntgHQfw&0;HpHL%l}TKKg$Eg>kBv literal 0 HcmV?d00001 diff --git a/public/ample-favicon/ms-icon-150x150.png b/public/ample-favicon/ms-icon-150x150.png new file mode 100755 index 0000000000000000000000000000000000000000..3f8bb8d4dde6c0d9c21c84f3868bc916e97101b3 GIT binary patch literal 11327 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 ChrJ8{ literal 0 HcmV?d00001 diff --git a/public/ample-favicon/ms-icon-310x310.png b/public/ample-favicon/ms-icon-310x310.png new file mode 100755 index 0000000000000000000000000000000000000000..d02993b7c1d14cd2e45246a78abfe6c69048ca7d GIT binary patch literal 30050 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 XLk*m7;yM2y&;T(vu`;F^x!wFP8b{G~ literal 0 HcmV?d00001 diff --git a/public/favicon.ico b/public/favicon.ico deleted file mode 100644 index 0c72c7154d722498119d3024c9d3a86a63795c08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1150 zcmZQzU<5(|0R|wcz>vYhz#zuJz@P!dKp~(AL>x#lFaYHS0;t;9_H%M_GLvezqN+xU z$KQYd9nN3)@A3ctf0Lg6JH(j5$H%Yl{_`hTkNM)IVA}2T=l>4p&V$*8bq$xXnZwV| z&tZT13|Nib$x~q3_VAJaY(StBoA4Io2It35{yRT;@?X`;IuzLq^M#8af#j{$Zvg9a zegFQy01(K^D%iRI`~?=X-nJb~+w9)+6(LUcdhD_URK?UR+u>iH(h2!0jW1 zZ+HASSlsR7N1&O4y2yG#Y>z5nnRCI@m0(4PMufB%B@3Q0)^gX9DRgxs|g zQ;xvYfoPb1_ix`(^n=VWsHuAoQUmgf!{sYrvmCEp`!8#35&;qi0c`s1&Yb;kd*s-E zk3WC@J3V*^)@QwSE10$i#sfqrgaqj~?&*W7+5Q70%F4>l4)eFgvK3%CkpG1Qg$Im^w?VX!|>ESIQb%R0vKQJc#?+0Rj28KVt9QwhTf#F~?14A2--(wBL$v_Mg S2k{Ts1Lf-(7=D8EKrsN#G%CaZ diff --git a/public/index.html b/public/index.html index ea13a8dd..8a9fe358 100644 --- a/public/index.html +++ b/public/index.html @@ -2,11 +2,9 @@ - - - + - Chainbridge + + + + + + + + + + + + + + + + + + + + + Ample Bridge diff --git a/public/manifest.json b/public/manifest.json index 76a05f8e..301e9bd3 100644 --- a/public/manifest.json +++ b/public/manifest.json @@ -1,15 +1,15 @@ { - "short_name": "Chainbridge", - "name": "Chainbridge", + "short_name": "Ample Bridge", + "name": "Ample Bridge", "icons": [ { - "src": "ChainSafe-logo.png", + "src": "ample-logo/logo.png", "sizes": "64x64 32x32 24x24 16x16", "type": "image/x-icon" } ], "start_url": ".", "display": "standalone", - "theme_color": "#000000", - "background_color": "#ffffff" + "theme_color": "#ffffff", + "background_color": "#000000" } diff --git a/scripts/deploy.sh b/scripts/deploy.sh new file mode 100755 index 00000000..ef76963f --- /dev/null +++ b/scripts/deploy.sh @@ -0,0 +1 @@ +aws s3 sync build/ s3://bridge.ampleforth.org/ --cache-control max-age=86400 --acl public-read diff --git a/src/App.tsx b/src/App.tsx index b773952d..b7bb1b10 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -8,7 +8,7 @@ import { } from "@chainsafe/common-components"; import Routes from "./Components/Routes"; -import { lightTheme } from "./Themes/LightTheme"; +import { ampleTheme } from "./Themes/AmpleforthTheme"; import { ChainbridgeProvider } from "./Contexts/ChainbridgeContext"; import AppWrapper from "./Layouts/AppWrapper"; import { Web3Provider } from "@chainsafe/web3-context"; @@ -53,7 +53,7 @@ const App: React.FC<{}> = () => { )} onReset={() => window.location.reload()} > - + = ({ className={classNames?.button} onClick={() => { helpers.setValue( - tokens[(values as Record)[tokenSelectorKey]].balance + safeRound( + tokens[(values as Record)[tokenSelectorKey]].balance, + tokens[(values as Record)[tokenSelectorKey]].decimals) ); }} variant="outline" diff --git a/src/Components/Custom/TokenSelectInput.tsx b/src/Components/Custom/TokenSelectInput.tsx index 319cb0e5..da250d56 100644 --- a/src/Components/Custom/TokenSelectInput.tsx +++ b/src/Components/Custom/TokenSelectInput.tsx @@ -5,6 +5,7 @@ import { FormikSelectInput, } from "@chainsafe/common-components"; import { Tokens } from "@chainsafe/web3-context/dist/context/tokensReducer"; +import {safeRound} from "../../Utils/XCAmple"; interface ITokenSelectInput extends IFormikSelectInputProps { tokens: Tokens; @@ -20,10 +21,15 @@ const TokenSelectInput: React.FC = ({ ...rest }: ITokenSelectInput) => { const [field] = useField(name); + const roundedBalance = safeRound(tokens[field.value]?.balance, tokens[field.value]?.decimals); + const amountToDisplay = parseFloat(roundedBalance).toLocaleString(); const labelParsed = tokens[field.value] - ? `${label} ${tokens[field.value]?.balance} ${tokens[field.value]?.symbol}` + ? `${label} ${amountToDisplay} ${tokens[field.value]?.symbol}` : "Please select token"; + const tokenList = Object.keys(tokens); + const nTokens = tokenList.length; + const [synced, setSynced] = useState(); useEffect(() => { if (sync && field.value !== synced) { diff --git a/src/Components/Pages/FormikContextElements/Fees.tsx b/src/Components/Pages/FormikContextElements/Fees.tsx index e079e157..1cdd02af 100644 --- a/src/Components/Pages/FormikContextElements/Fees.tsx +++ b/src/Components/Pages/FormikContextElements/Fees.tsx @@ -22,15 +22,15 @@ const FeesFormikWrapped: React.FC = ({ return (
- {fee !== undefined && feeSymbol !== undefined && ( + {( <> Bridge Fee - {fee} {feeSymbol} + {fee||"0"} {feeSymbol} )} - {symbol !== undefined && ( + {( <> Transfer Amount: diff --git a/src/Components/Pages/TransferPage.tsx b/src/Components/Pages/TransferPage.tsx index 32d69f1a..0ac64473 100644 --- a/src/Components/Pages/TransferPage.tsx +++ b/src/Components/Pages/TransferPage.tsx @@ -28,6 +28,7 @@ const useStyles = makeStyles(({ constants, palette }: ITheme) => root: { padding: constants.generalUnit * 6, position: "relative", + minHeight: '730px', }, walletArea: { display: "flex", @@ -35,6 +36,7 @@ const useStyles = makeStyles(({ constants, palette }: ITheme) => alignItems: "center", justifyContent: "center", width: "100%", + minHeight: "130px", }, connectButton: { margin: `${constants.generalUnit * 3}px 0 ${constants.generalUnit * 6}px`, @@ -83,7 +85,7 @@ const useStyles = makeStyles(({ constants, palette }: ITheme) => flexDirection: "row", alignItems: "flex-end", justifyContent: "space-around", - paddingRight: constants.generalUnit, + // paddingRight: constants.generalUnit, }, tokenInput: { margin: 0, @@ -117,7 +119,12 @@ const useStyles = makeStyles(({ constants, palette }: ITheme) => }, }, currencySelector: { - width: 120, + display: "flex", + flexDirection: "row", + justifyContent: "space-between", + alignItems: "flex-end", + margin: `${constants.generalUnit * 3}px 0`, + width: '100%', "& *": { cursor: "pointer", }, @@ -129,6 +136,7 @@ const useStyles = makeStyles(({ constants, palette }: ITheme) => }, addressInput: {}, generalInput: { + width: '100%', "& > span": { marginBottom: constants.generalUnit, }, @@ -162,7 +170,10 @@ const useStyles = makeStyles(({ constants, palette }: ITheme) => flexDirection: "row", flexWrap: "wrap", justifyContent: "space-between", - marginBottom: constants.generalUnit, + marginTop: 2*constants.generalUnit, + marginBottom: 2*constants.generalUnit, + background: palette.additional["gray"][2], + padding: `${constants.generalUnit}px ${2*constants.generalUnit}px`, "& > *": { display: "block", width: "50%", @@ -204,7 +215,6 @@ const TransferPage = () => { resetDeposit, bridgeFee, } = useChainbridge(); - const [aboutOpen, setAboutOpen] = useState(false); const [walletConnecting, setWalletConnecting] = useState(false); const [changeNetworkOpen, setChangeNetworkOpen] = useState(false); @@ -269,7 +279,7 @@ const TransferPage = () => { }) .test("Min", "Less than minimum", (value) => { if (value) { - return parseFloat(value) > 0; + return parseFloat(value) >= (10 ** -(tokens[preflightDetails.token].decimals/2)); } return false; }) @@ -360,63 +370,61 @@ const TransferPage = () => { value={destinationChain?.chainId} />
+
+ { + setPreflightDetails({ + ...preflightDetails, + token: tokenAddress, + receiver: "", + tokenAmount: 0, + tokenSymbol: "", + }); + }} + options={ + Object.keys(tokens).map((t) => ({ + value: t, + label: ( +
+ {tokens[t]?.imageUri && ( + {tokens[t]?.symbol} + )} + {tokens[t]?.symbol || t} +
+ ), + })) || [] + } + /> +
-
-
- -
-
-
- { - setPreflightDetails({ - ...preflightDetails, - token: tokenAddress, - receiver: "", - tokenAmount: 0, - tokenSymbol: "", - }); +
+ ({ - value: t, - label: ( -
- {tokens[t]?.imageUri && ( - {tokens[t]?.symbol} - )} - {tokens[t]?.symbol || t} -
- ), - })) || [] + tokenSelectorKey="token" + tokens={tokens} + disabled={ + !destinationChain || + !preflightDetails.token || + preflightDetails.token === "" } + name="tokenAmount" + label="I want to send" /> -
+
{ Start transfer
-
- setAboutOpen(true)} - className={classes.faqButton} - /> -
- setAboutOpen(false)} /> setChangeNetworkOpen(false)} diff --git a/src/Components/Routes.tsx b/src/Components/Routes.tsx index 9ad20ae2..295502ef 100644 --- a/src/Components/Routes.tsx +++ b/src/Components/Routes.tsx @@ -1,18 +1,16 @@ import React from "react"; import { Switch, Route, Redirect } from "@chainsafe/common-components"; import TransferPage from "./Pages/TransferPage"; -import WrapperPage from "./Pages/WrapperPage"; export const ROUTE_LINKS = { - Transfer: "/transfer", - Wrap: "/wrap", + Transfer: "/transfer" }; const FilesRoutes = () => { return ( - + diff --git a/src/Contexts/ChainbridgeContext.tsx b/src/Contexts/ChainbridgeContext.tsx index 6e48d189..1868b623 100644 --- a/src/Contexts/ChainbridgeContext.tsx +++ b/src/Contexts/ChainbridgeContext.tsx @@ -1,6 +1,7 @@ import { useWeb3 } from "@chainsafe/web3-context"; import React, { useContext, useEffect, useReducer, useState } from "react"; -import { Bridge, BridgeFactory } from "@chainsafe/chainbridge-contracts"; +import { Bridge } from "../Contracts/Bridge"; +import { BridgeFactory } from "../Contracts/BridgeFactory"; import { BigNumber, BigNumberish, @@ -11,6 +12,7 @@ import { utils, } from "ethers"; import { Erc20DetailedFactory } from "../Contracts/Erc20DetailedFactory"; +import { XCAmpleControllerFactory } from "../Contracts/XCAmpleControllerFactory"; import { BridgeConfig, chainbridgeConfig, @@ -19,6 +21,7 @@ import { import { transitMessageReducer } from "./Reducers/TransitMessageReducer"; import { Weth } from "../Contracts/Weth"; import { WethFactory } from "../Contracts/WethFactory"; +import { packXCTransferData } from "../Utils/XCAmple"; interface IChainbridgeContextProps { children: React.ReactNode | React.ReactNode[]; @@ -233,14 +236,16 @@ const ChainbridgeProvider = ({ children }: IChainbridgeContextProps) => { } }; const getBridgeFee = async () => { - if (homeBridge) { - const bridgeFee = Number(utils.formatEther(await homeBridge._fee())); + if (homeBridge && destinationBridge) { + const targetChainID = await destinationBridge._chainID(); + const fee = await homeBridge.getFee(targetChainID); + const bridgeFee = Number(utils.formatEther(fee)); setBridgeFee(bridgeFee); } }; getRelayerThreshold(); getBridgeFee(); - }, [homeBridge]); + }, [homeBridge, destinationBridge]); useEffect(() => { if (homeChain && destinationBridge && depositNonce) { @@ -346,55 +351,44 @@ const ChainbridgeProvider = ({ children }: IChainbridgeContextProps) => { setDepositAmount(amount); setSelectedToken(tokenAddress); const erc20 = Erc20DetailedFactory.connect(tokenAddress, signer); + const controller = XCAmpleControllerFactory.connect(homeChain.controller, signer); const erc20Decimals = tokens[tokenAddress].decimals; - const data = - "0x" + - utils - .hexZeroPad( - // TODO Wire up dynamic token decimals - BigNumber.from( - utils.parseUnits(amount.toString(), erc20Decimals) - ).toHexString(), - 32 - ) - .substr(2) + // Deposit Amount (32 bytes) - utils - .hexZeroPad(utils.hexlify((recipient.length - 2) / 2), 32) - .substr(2) + // len(recipientAddress) (32 bytes) - recipient.substr(2); // recipientAddress (?? bytes) + + const [epoch, totalSupply] = await controller.globalAmpleforthEpochAndAMPLSupply(); + const data = packXCTransferData(address, recipient, utils.parseUnits(amount.toString(), erc20Decimals), totalSupply); try { const currentAllowance = await erc20.allowance( address, - homeChain.erc20HandlerAddress + homeChain.approvalContract ); if (Number(utils.formatUnits(currentAllowance, erc20Decimals)) < amount) { - if ( - Number(utils.formatUnits(currentAllowance, erc20Decimals)) > 0 && - resetAllowanceLogicFor.includes(tokenAddress) - ) { - //We need to reset the user's allowance to 0 before we give them a new allowance - //TODO Should we alert the user this is happening here? - await ( - await erc20.approve( - homeChain.erc20HandlerAddress, - BigNumber.from(utils.parseUnits("0", erc20Decimals)), - { - gasPrice: BigNumber.from( - utils.parseUnits( - (homeChain.defaultGasPrice || gasPrice).toString(), - 9 - ) - ).toString(), - } - ) - ).wait(1); - } + // if ( + // Number(utils.formatUnits(currentAllowance, erc20Decimals)) > 0 && + // resetAllowanceLogicFor.includes(tokenAddress) + // ) { + // // We need to reset the user's allowance to 0 before we give them a new allowance + // //TODO Should we alert the user this is happening here? + // await ( + // await erc20.approve( + // homeChain.approvalContract, + // BigNumber.from(utils.parseUnits("0", erc20Decimals)), + // { + // gasPrice: BigNumber.from( + // utils.parseUnits( + // (homeChain.defaultGasPrice || gasPrice).toString(), + // 9 + // ) + // ).toString(), + // } + // ) + // ).wait(1); + // } await ( await erc20.approve( - homeChain.erc20HandlerAddress, + homeChain.approvalContract, BigNumber.from(utils.parseUnits(amount.toString(), erc20Decimals)), { gasPrice: BigNumber.from( diff --git a/src/Contracts/Bridge.d.ts b/src/Contracts/Bridge.d.ts new file mode 100644 index 00000000..89982523 --- /dev/null +++ b/src/Contracts/Bridge.d.ts @@ -0,0 +1,2939 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { + ethers, + EventFilter, + Signer, + BigNumber, + BigNumberish, + PopulatedTransaction, +} from "ethers"; +import { + Contract, + ContractTransaction, + Overrides, + PayableOverrides, + CallOverrides, +} from "@ethersproject/contracts"; +import { BytesLike } from "@ethersproject/bytes"; +import { Listener, Provider } from "@ethersproject/providers"; +import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; +import { TypedEventFilter, TypedEvent, TypedListener } from "./commons"; + +interface BridgeInterface extends ethers.utils.Interface { + functions: { + "DEFAULT_ADMIN_ROLE()": FunctionFragment; + "RELAYER_ROLE()": FunctionFragment; + "_chainID()": FunctionFragment; + "_depositCounts(uint8)": FunctionFragment; + "_depositRecords(uint64,uint8)": FunctionFragment; + "_expiry()": FunctionFragment; + "_fee()": FunctionFragment; + "_hasVotedOnProposal(uint72,bytes32,address)": FunctionFragment; + "_proposals(uint72,bytes32)": FunctionFragment; + "_relayerThreshold()": FunctionFragment; + "_resourceIDToHandlerAddress(bytes32)": FunctionFragment; + "_specialFee()": FunctionFragment; + "_specialFeeChainID()": FunctionFragment; + "_totalProposals()": FunctionFragment; + "_totalRelayers()": FunctionFragment; + "_wtokenAddress()": FunctionFragment; + "adminAddRelayer(address)": FunctionFragment; + "adminChangeFee(uint256)": FunctionFragment; + "adminChangeRelayerThreshold(uint256)": FunctionFragment; + "adminChangeSpecialFee(uint256,uint8)": FunctionFragment; + "adminPauseTransfers()": FunctionFragment; + "adminRemoveRelayer(address)": FunctionFragment; + "adminSetBurnable(address,address)": FunctionFragment; + "adminSetGenericResource(address,bytes32,address,bytes4,uint256,bytes4)": FunctionFragment; + "adminSetResource(address,bytes32,address)": FunctionFragment; + "adminUnpauseTransfers()": FunctionFragment; + "adminUpdateBridgeAddress(address,address)": FunctionFragment; + "adminWithdraw(address,address,address,uint256)": FunctionFragment; + "cancelProposal(uint8,uint64,bytes32)": FunctionFragment; + "deposit(uint8,bytes32,bytes)": FunctionFragment; + "depositETH(uint8,bytes32,bytes)": FunctionFragment; + "executeProposal(uint8,uint64,bytes,bytes32)": FunctionFragment; + "getFee(uint8)": FunctionFragment; + "getFees()": FunctionFragment; + "getProposal(uint8,uint64,bytes32)": FunctionFragment; + "getRoleAdmin(bytes32)": FunctionFragment; + "getRoleMember(bytes32,uint256)": FunctionFragment; + "getRoleMemberCount(bytes32)": FunctionFragment; + "grantRole(bytes32,address)": FunctionFragment; + "hasRole(bytes32,address)": FunctionFragment; + "isRelayer(address)": FunctionFragment; + "paused()": FunctionFragment; + "renounceAdmin(address)": FunctionFragment; + "renounceRole(bytes32,address)": FunctionFragment; + "revokeRole(bytes32,address)": FunctionFragment; + "transferFunds(address[],uint256[])": FunctionFragment; + "voteProposal(uint8,uint64,bytes32,bytes32)": FunctionFragment; + }; + + encodeFunctionData( + functionFragment: "DEFAULT_ADMIN_ROLE", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "RELAYER_ROLE", + values?: undefined + ): string; + encodeFunctionData(functionFragment: "_chainID", values?: undefined): string; + encodeFunctionData( + functionFragment: "_depositCounts", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "_depositRecords", + values: [BigNumberish, BigNumberish] + ): string; + encodeFunctionData(functionFragment: "_expiry", values?: undefined): string; + encodeFunctionData(functionFragment: "_fee", values?: undefined): string; + encodeFunctionData( + functionFragment: "_hasVotedOnProposal", + values: [BigNumberish, BytesLike, string] + ): string; + encodeFunctionData( + functionFragment: "_proposals", + values: [BigNumberish, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "_relayerThreshold", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "_resourceIDToHandlerAddress", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "_specialFee", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "_specialFeeChainID", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "_totalProposals", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "_totalRelayers", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "_wtokenAddress", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "adminAddRelayer", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "adminChangeFee", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "adminChangeRelayerThreshold", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "adminChangeSpecialFee", + values: [BigNumberish, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "adminPauseTransfers", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "adminRemoveRelayer", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "adminSetBurnable", + values: [string, string] + ): string; + encodeFunctionData( + functionFragment: "adminSetGenericResource", + values: [string, BytesLike, string, BytesLike, BigNumberish, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "adminSetResource", + values: [string, BytesLike, string] + ): string; + encodeFunctionData( + functionFragment: "adminUnpauseTransfers", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "adminUpdateBridgeAddress", + values: [string, string] + ): string; + encodeFunctionData( + functionFragment: "adminWithdraw", + values: [string, string, string, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "cancelProposal", + values: [BigNumberish, BigNumberish, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "deposit", + values: [BigNumberish, BytesLike, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "depositETH", + values: [BigNumberish, BytesLike, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "executeProposal", + values: [BigNumberish, BigNumberish, BytesLike, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "getFee", + values: [BigNumberish] + ): string; + encodeFunctionData(functionFragment: "getFees", values?: undefined): string; + encodeFunctionData( + functionFragment: "getProposal", + values: [BigNumberish, BigNumberish, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "getRoleAdmin", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "getRoleMember", + values: [BytesLike, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "getRoleMemberCount", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "grantRole", + values: [BytesLike, string] + ): string; + encodeFunctionData( + functionFragment: "hasRole", + values: [BytesLike, string] + ): string; + encodeFunctionData(functionFragment: "isRelayer", values: [string]): string; + encodeFunctionData(functionFragment: "paused", values?: undefined): string; + encodeFunctionData( + functionFragment: "renounceAdmin", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "renounceRole", + values: [BytesLike, string] + ): string; + encodeFunctionData( + functionFragment: "revokeRole", + values: [BytesLike, string] + ): string; + encodeFunctionData( + functionFragment: "transferFunds", + values: [string[], BigNumberish[]] + ): string; + encodeFunctionData( + functionFragment: "voteProposal", + values: [BigNumberish, BigNumberish, BytesLike, BytesLike] + ): string; + + decodeFunctionResult( + functionFragment: "DEFAULT_ADMIN_ROLE", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "RELAYER_ROLE", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "_chainID", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "_depositCounts", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "_depositRecords", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "_expiry", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "_fee", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "_hasVotedOnProposal", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "_proposals", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "_relayerThreshold", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "_resourceIDToHandlerAddress", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "_specialFee", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "_specialFeeChainID", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "_totalProposals", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "_totalRelayers", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "_wtokenAddress", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "adminAddRelayer", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "adminChangeFee", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "adminChangeRelayerThreshold", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "adminChangeSpecialFee", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "adminPauseTransfers", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "adminRemoveRelayer", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "adminSetBurnable", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "adminSetGenericResource", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "adminSetResource", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "adminUnpauseTransfers", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "adminUpdateBridgeAddress", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "adminWithdraw", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "cancelProposal", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "deposit", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "depositETH", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "executeProposal", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "getFee", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "getFees", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "getProposal", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getRoleAdmin", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getRoleMember", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getRoleMemberCount", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "grantRole", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "hasRole", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "isRelayer", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "paused", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "renounceAdmin", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "renounceRole", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "revokeRole", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "transferFunds", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "voteProposal", + data: BytesLike + ): Result; + + events: { + "Deposit(uint8,bytes32,uint64)": EventFragment; + "Paused(address)": EventFragment; + "ProposalEvent(uint8,uint64,uint8,bytes32,bytes32)": EventFragment; + "ProposalVote(uint8,uint64,uint8,bytes32)": EventFragment; + "RelayerAdded(address)": EventFragment; + "RelayerRemoved(address)": EventFragment; + "RelayerThresholdChanged(uint256)": EventFragment; + "RoleAdminChanged(bytes32,bytes32,bytes32)": EventFragment; + "RoleGranted(bytes32,address,address)": EventFragment; + "RoleRevoked(bytes32,address,address)": EventFragment; + "Unpaused(address)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "Deposit"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Paused"): EventFragment; + getEvent(nameOrSignatureOrTopic: "ProposalEvent"): EventFragment; + getEvent(nameOrSignatureOrTopic: "ProposalVote"): EventFragment; + getEvent(nameOrSignatureOrTopic: "RelayerAdded"): EventFragment; + getEvent(nameOrSignatureOrTopic: "RelayerRemoved"): EventFragment; + getEvent(nameOrSignatureOrTopic: "RelayerThresholdChanged"): EventFragment; + getEvent(nameOrSignatureOrTopic: "RoleAdminChanged"): EventFragment; + getEvent(nameOrSignatureOrTopic: "RoleGranted"): EventFragment; + getEvent(nameOrSignatureOrTopic: "RoleRevoked"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Unpaused"): EventFragment; +} + +export class Bridge extends Contract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + listeners, EventArgsObject>( + eventFilter?: TypedEventFilter + ): Array>; + off, EventArgsObject>( + eventFilter: TypedEventFilter, + listener: TypedListener + ): this; + on, EventArgsObject>( + eventFilter: TypedEventFilter, + listener: TypedListener + ): this; + once, EventArgsObject>( + eventFilter: TypedEventFilter, + listener: TypedListener + ): this; + removeListener, EventArgsObject>( + eventFilter: TypedEventFilter, + listener: TypedListener + ): this; + removeAllListeners, EventArgsObject>( + eventFilter: TypedEventFilter + ): this; + + listeners(eventName?: string): Array; + off(eventName: string, listener: Listener): this; + on(eventName: string, listener: Listener): this; + once(eventName: string, listener: Listener): this; + removeListener(eventName: string, listener: Listener): this; + removeAllListeners(eventName?: string): this; + + queryFilter, EventArgsObject>( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + interface: BridgeInterface; + + functions: { + DEFAULT_ADMIN_ROLE(overrides?: CallOverrides): Promise<[string]>; + + "DEFAULT_ADMIN_ROLE()"(overrides?: CallOverrides): Promise<[string]>; + + RELAYER_ROLE(overrides?: CallOverrides): Promise<[string]>; + + "RELAYER_ROLE()"(overrides?: CallOverrides): Promise<[string]>; + + _chainID(overrides?: CallOverrides): Promise<[number]>; + + "_chainID()"(overrides?: CallOverrides): Promise<[number]>; + + _depositCounts( + arg0: BigNumberish, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + "_depositCounts(uint8)"( + arg0: BigNumberish, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + _depositRecords( + arg0: BigNumberish, + arg1: BigNumberish, + overrides?: CallOverrides + ): Promise<[string]>; + + "_depositRecords(uint64,uint8)"( + arg0: BigNumberish, + arg1: BigNumberish, + overrides?: CallOverrides + ): Promise<[string]>; + + _expiry(overrides?: CallOverrides): Promise<[BigNumber]>; + + "_expiry()"(overrides?: CallOverrides): Promise<[BigNumber]>; + + _fee(overrides?: CallOverrides): Promise<[BigNumber]>; + + "_fee()"(overrides?: CallOverrides): Promise<[BigNumber]>; + + _hasVotedOnProposal( + arg0: BigNumberish, + arg1: BytesLike, + arg2: string, + overrides?: CallOverrides + ): Promise<[boolean]>; + + "_hasVotedOnProposal(uint72,bytes32,address)"( + arg0: BigNumberish, + arg1: BytesLike, + arg2: string, + overrides?: CallOverrides + ): Promise<[boolean]>; + + _proposals( + arg0: BigNumberish, + arg1: BytesLike, + overrides?: CallOverrides + ): Promise< + [string, string, number, BigNumber] & { + _resourceID: string; + _dataHash: string; + _status: number; + _proposedBlock: BigNumber; + } + >; + + "_proposals(uint72,bytes32)"( + arg0: BigNumberish, + arg1: BytesLike, + overrides?: CallOverrides + ): Promise< + [string, string, number, BigNumber] & { + _resourceID: string; + _dataHash: string; + _status: number; + _proposedBlock: BigNumber; + } + >; + + _relayerThreshold(overrides?: CallOverrides): Promise<[BigNumber]>; + + "_relayerThreshold()"(overrides?: CallOverrides): Promise<[BigNumber]>; + + _resourceIDToHandlerAddress( + arg0: BytesLike, + overrides?: CallOverrides + ): Promise<[string]>; + + "_resourceIDToHandlerAddress(bytes32)"( + arg0: BytesLike, + overrides?: CallOverrides + ): Promise<[string]>; + + _specialFee(overrides?: CallOverrides): Promise<[BigNumber]>; + + "_specialFee()"(overrides?: CallOverrides): Promise<[BigNumber]>; + + _specialFeeChainID(overrides?: CallOverrides): Promise<[number]>; + + "_specialFeeChainID()"(overrides?: CallOverrides): Promise<[number]>; + + _totalProposals(overrides?: CallOverrides): Promise<[BigNumber]>; + + "_totalProposals()"(overrides?: CallOverrides): Promise<[BigNumber]>; + + _totalRelayers(overrides?: CallOverrides): Promise<[BigNumber]>; + + "_totalRelayers()"(overrides?: CallOverrides): Promise<[BigNumber]>; + + _wtokenAddress(overrides?: CallOverrides): Promise<[string]>; + + "_wtokenAddress()"(overrides?: CallOverrides): Promise<[string]>; + + adminAddRelayer( + relayerAddress: string, + overrides?: Overrides + ): Promise; + + "adminAddRelayer(address)"( + relayerAddress: string, + overrides?: Overrides + ): Promise; + + adminChangeFee( + newFee: BigNumberish, + overrides?: Overrides + ): Promise; + + "adminChangeFee(uint256)"( + newFee: BigNumberish, + overrides?: Overrides + ): Promise; + + adminChangeRelayerThreshold( + newThreshold: BigNumberish, + overrides?: Overrides + ): Promise; + + "adminChangeRelayerThreshold(uint256)"( + newThreshold: BigNumberish, + overrides?: Overrides + ): Promise; + + adminChangeSpecialFee( + newFee: BigNumberish, + chainID: BigNumberish, + overrides?: Overrides + ): Promise; + + "adminChangeSpecialFee(uint256,uint8)"( + newFee: BigNumberish, + chainID: BigNumberish, + overrides?: Overrides + ): Promise; + + adminPauseTransfers(overrides?: Overrides): Promise; + + "adminPauseTransfers()"( + overrides?: Overrides + ): Promise; + + adminRemoveRelayer( + relayerAddress: string, + overrides?: Overrides + ): Promise; + + "adminRemoveRelayer(address)"( + relayerAddress: string, + overrides?: Overrides + ): Promise; + + adminSetBurnable( + handlerAddress: string, + tokenAddress: string, + overrides?: Overrides + ): Promise; + + "adminSetBurnable(address,address)"( + handlerAddress: string, + tokenAddress: string, + overrides?: Overrides + ): Promise; + + adminSetGenericResource( + handlerAddress: string, + resourceID: BytesLike, + contractAddress: string, + depositFunctionSig: BytesLike, + depositFunctionDepositerOffset: BigNumberish, + executeFunctionSig: BytesLike, + overrides?: Overrides + ): Promise; + + "adminSetGenericResource(address,bytes32,address,bytes4,uint256,bytes4)"( + handlerAddress: string, + resourceID: BytesLike, + contractAddress: string, + depositFunctionSig: BytesLike, + depositFunctionDepositerOffset: BigNumberish, + executeFunctionSig: BytesLike, + overrides?: Overrides + ): Promise; + + adminSetResource( + handlerAddress: string, + resourceID: BytesLike, + tokenAddress: string, + overrides?: Overrides + ): Promise; + + "adminSetResource(address,bytes32,address)"( + handlerAddress: string, + resourceID: BytesLike, + tokenAddress: string, + overrides?: Overrides + ): Promise; + + adminUnpauseTransfers(overrides?: Overrides): Promise; + + "adminUnpauseTransfers()"( + overrides?: Overrides + ): Promise; + + adminUpdateBridgeAddress( + handlerAddress: string, + newBridgeAddress: string, + overrides?: Overrides + ): Promise; + + "adminUpdateBridgeAddress(address,address)"( + handlerAddress: string, + newBridgeAddress: string, + overrides?: Overrides + ): Promise; + + adminWithdraw( + handlerAddress: string, + tokenAddress: string, + recipient: string, + amountOrTokenID: BigNumberish, + overrides?: Overrides + ): Promise; + + "adminWithdraw(address,address,address,uint256)"( + handlerAddress: string, + tokenAddress: string, + recipient: string, + amountOrTokenID: BigNumberish, + overrides?: Overrides + ): Promise; + + cancelProposal( + chainID: BigNumberish, + depositNonce: BigNumberish, + dataHash: BytesLike, + overrides?: Overrides + ): Promise; + + "cancelProposal(uint8,uint64,bytes32)"( + chainID: BigNumberish, + depositNonce: BigNumberish, + dataHash: BytesLike, + overrides?: Overrides + ): Promise; + + deposit( + destinationChainID: BigNumberish, + resourceID: BytesLike, + data: BytesLike, + overrides?: PayableOverrides + ): Promise; + + "deposit(uint8,bytes32,bytes)"( + destinationChainID: BigNumberish, + resourceID: BytesLike, + data: BytesLike, + overrides?: PayableOverrides + ): Promise; + + depositETH( + destinationChainID: BigNumberish, + resourceID: BytesLike, + data: BytesLike, + overrides?: PayableOverrides + ): Promise; + + "depositETH(uint8,bytes32,bytes)"( + destinationChainID: BigNumberish, + resourceID: BytesLike, + data: BytesLike, + overrides?: PayableOverrides + ): Promise; + + executeProposal( + chainID: BigNumberish, + depositNonce: BigNumberish, + data: BytesLike, + resourceID: BytesLike, + overrides?: Overrides + ): Promise; + + "executeProposal(uint8,uint64,bytes,bytes32)"( + chainID: BigNumberish, + depositNonce: BigNumberish, + data: BytesLike, + resourceID: BytesLike, + overrides?: Overrides + ): Promise; + + getFee( + destinationChainID: BigNumberish, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + "getFee(uint8)"( + destinationChainID: BigNumberish, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + getFees(overrides?: CallOverrides): Promise<[BigNumber, BigNumber, number]>; + + "getFees()"( + overrides?: CallOverrides + ): Promise<[BigNumber, BigNumber, number]>; + + getProposal( + originChainID: BigNumberish, + depositNonce: BigNumberish, + dataHash: BytesLike, + overrides?: CallOverrides + ): Promise< + [ + [string, string, string[], string[], number, BigNumber] & { + _resourceID: string; + _dataHash: string; + _yesVotes: string[]; + _noVotes: string[]; + _status: number; + _proposedBlock: BigNumber; + } + ] + >; + + "getProposal(uint8,uint64,bytes32)"( + originChainID: BigNumberish, + depositNonce: BigNumberish, + dataHash: BytesLike, + overrides?: CallOverrides + ): Promise< + [ + [string, string, string[], string[], number, BigNumber] & { + _resourceID: string; + _dataHash: string; + _yesVotes: string[]; + _noVotes: string[]; + _status: number; + _proposedBlock: BigNumber; + } + ] + >; + + getRoleAdmin(role: BytesLike, overrides?: CallOverrides): Promise<[string]>; + + "getRoleAdmin(bytes32)"( + role: BytesLike, + overrides?: CallOverrides + ): Promise<[string]>; + + getRoleMember( + role: BytesLike, + index: BigNumberish, + overrides?: CallOverrides + ): Promise<[string]>; + + "getRoleMember(bytes32,uint256)"( + role: BytesLike, + index: BigNumberish, + overrides?: CallOverrides + ): Promise<[string]>; + + getRoleMemberCount( + role: BytesLike, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + "getRoleMemberCount(bytes32)"( + role: BytesLike, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + grantRole( + role: BytesLike, + account: string, + overrides?: Overrides + ): Promise; + + "grantRole(bytes32,address)"( + role: BytesLike, + account: string, + overrides?: Overrides + ): Promise; + + hasRole( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise<[boolean]>; + + "hasRole(bytes32,address)"( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise<[boolean]>; + + isRelayer(relayer: string, overrides?: CallOverrides): Promise<[boolean]>; + + "isRelayer(address)"( + relayer: string, + overrides?: CallOverrides + ): Promise<[boolean]>; + + paused(overrides?: CallOverrides): Promise<[boolean]>; + + "paused()"(overrides?: CallOverrides): Promise<[boolean]>; + + renounceAdmin( + newAdmin: string, + overrides?: Overrides + ): Promise; + + "renounceAdmin(address)"( + newAdmin: string, + overrides?: Overrides + ): Promise; + + renounceRole( + role: BytesLike, + account: string, + overrides?: Overrides + ): Promise; + + "renounceRole(bytes32,address)"( + role: BytesLike, + account: string, + overrides?: Overrides + ): Promise; + + revokeRole( + role: BytesLike, + account: string, + overrides?: Overrides + ): Promise; + + "revokeRole(bytes32,address)"( + role: BytesLike, + account: string, + overrides?: Overrides + ): Promise; + + transferFunds( + addrs: string[], + amounts: BigNumberish[], + overrides?: Overrides + ): Promise; + + "transferFunds(address[],uint256[])"( + addrs: string[], + amounts: BigNumberish[], + overrides?: Overrides + ): Promise; + + voteProposal( + chainID: BigNumberish, + depositNonce: BigNumberish, + resourceID: BytesLike, + dataHash: BytesLike, + overrides?: Overrides + ): Promise; + + "voteProposal(uint8,uint64,bytes32,bytes32)"( + chainID: BigNumberish, + depositNonce: BigNumberish, + resourceID: BytesLike, + dataHash: BytesLike, + overrides?: Overrides + ): Promise; + }; + + DEFAULT_ADMIN_ROLE(overrides?: CallOverrides): Promise; + + "DEFAULT_ADMIN_ROLE()"(overrides?: CallOverrides): Promise; + + RELAYER_ROLE(overrides?: CallOverrides): Promise; + + "RELAYER_ROLE()"(overrides?: CallOverrides): Promise; + + _chainID(overrides?: CallOverrides): Promise; + + "_chainID()"(overrides?: CallOverrides): Promise; + + _depositCounts( + arg0: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "_depositCounts(uint8)"( + arg0: BigNumberish, + overrides?: CallOverrides + ): Promise; + + _depositRecords( + arg0: BigNumberish, + arg1: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "_depositRecords(uint64,uint8)"( + arg0: BigNumberish, + arg1: BigNumberish, + overrides?: CallOverrides + ): Promise; + + _expiry(overrides?: CallOverrides): Promise; + + "_expiry()"(overrides?: CallOverrides): Promise; + + _fee(overrides?: CallOverrides): Promise; + + "_fee()"(overrides?: CallOverrides): Promise; + + _hasVotedOnProposal( + arg0: BigNumberish, + arg1: BytesLike, + arg2: string, + overrides?: CallOverrides + ): Promise; + + "_hasVotedOnProposal(uint72,bytes32,address)"( + arg0: BigNumberish, + arg1: BytesLike, + arg2: string, + overrides?: CallOverrides + ): Promise; + + _proposals( + arg0: BigNumberish, + arg1: BytesLike, + overrides?: CallOverrides + ): Promise< + [string, string, number, BigNumber] & { + _resourceID: string; + _dataHash: string; + _status: number; + _proposedBlock: BigNumber; + } + >; + + "_proposals(uint72,bytes32)"( + arg0: BigNumberish, + arg1: BytesLike, + overrides?: CallOverrides + ): Promise< + [string, string, number, BigNumber] & { + _resourceID: string; + _dataHash: string; + _status: number; + _proposedBlock: BigNumber; + } + >; + + _relayerThreshold(overrides?: CallOverrides): Promise; + + "_relayerThreshold()"(overrides?: CallOverrides): Promise; + + _resourceIDToHandlerAddress( + arg0: BytesLike, + overrides?: CallOverrides + ): Promise; + + "_resourceIDToHandlerAddress(bytes32)"( + arg0: BytesLike, + overrides?: CallOverrides + ): Promise; + + _specialFee(overrides?: CallOverrides): Promise; + + "_specialFee()"(overrides?: CallOverrides): Promise; + + _specialFeeChainID(overrides?: CallOverrides): Promise; + + "_specialFeeChainID()"(overrides?: CallOverrides): Promise; + + _totalProposals(overrides?: CallOverrides): Promise; + + "_totalProposals()"(overrides?: CallOverrides): Promise; + + _totalRelayers(overrides?: CallOverrides): Promise; + + "_totalRelayers()"(overrides?: CallOverrides): Promise; + + _wtokenAddress(overrides?: CallOverrides): Promise; + + "_wtokenAddress()"(overrides?: CallOverrides): Promise; + + adminAddRelayer( + relayerAddress: string, + overrides?: Overrides + ): Promise; + + "adminAddRelayer(address)"( + relayerAddress: string, + overrides?: Overrides + ): Promise; + + adminChangeFee( + newFee: BigNumberish, + overrides?: Overrides + ): Promise; + + "adminChangeFee(uint256)"( + newFee: BigNumberish, + overrides?: Overrides + ): Promise; + + adminChangeRelayerThreshold( + newThreshold: BigNumberish, + overrides?: Overrides + ): Promise; + + "adminChangeRelayerThreshold(uint256)"( + newThreshold: BigNumberish, + overrides?: Overrides + ): Promise; + + adminChangeSpecialFee( + newFee: BigNumberish, + chainID: BigNumberish, + overrides?: Overrides + ): Promise; + + "adminChangeSpecialFee(uint256,uint8)"( + newFee: BigNumberish, + chainID: BigNumberish, + overrides?: Overrides + ): Promise; + + adminPauseTransfers(overrides?: Overrides): Promise; + + "adminPauseTransfers()"(overrides?: Overrides): Promise; + + adminRemoveRelayer( + relayerAddress: string, + overrides?: Overrides + ): Promise; + + "adminRemoveRelayer(address)"( + relayerAddress: string, + overrides?: Overrides + ): Promise; + + adminSetBurnable( + handlerAddress: string, + tokenAddress: string, + overrides?: Overrides + ): Promise; + + "adminSetBurnable(address,address)"( + handlerAddress: string, + tokenAddress: string, + overrides?: Overrides + ): Promise; + + adminSetGenericResource( + handlerAddress: string, + resourceID: BytesLike, + contractAddress: string, + depositFunctionSig: BytesLike, + depositFunctionDepositerOffset: BigNumberish, + executeFunctionSig: BytesLike, + overrides?: Overrides + ): Promise; + + "adminSetGenericResource(address,bytes32,address,bytes4,uint256,bytes4)"( + handlerAddress: string, + resourceID: BytesLike, + contractAddress: string, + depositFunctionSig: BytesLike, + depositFunctionDepositerOffset: BigNumberish, + executeFunctionSig: BytesLike, + overrides?: Overrides + ): Promise; + + adminSetResource( + handlerAddress: string, + resourceID: BytesLike, + tokenAddress: string, + overrides?: Overrides + ): Promise; + + "adminSetResource(address,bytes32,address)"( + handlerAddress: string, + resourceID: BytesLike, + tokenAddress: string, + overrides?: Overrides + ): Promise; + + adminUnpauseTransfers(overrides?: Overrides): Promise; + + "adminUnpauseTransfers()"( + overrides?: Overrides + ): Promise; + + adminUpdateBridgeAddress( + handlerAddress: string, + newBridgeAddress: string, + overrides?: Overrides + ): Promise; + + "adminUpdateBridgeAddress(address,address)"( + handlerAddress: string, + newBridgeAddress: string, + overrides?: Overrides + ): Promise; + + adminWithdraw( + handlerAddress: string, + tokenAddress: string, + recipient: string, + amountOrTokenID: BigNumberish, + overrides?: Overrides + ): Promise; + + "adminWithdraw(address,address,address,uint256)"( + handlerAddress: string, + tokenAddress: string, + recipient: string, + amountOrTokenID: BigNumberish, + overrides?: Overrides + ): Promise; + + cancelProposal( + chainID: BigNumberish, + depositNonce: BigNumberish, + dataHash: BytesLike, + overrides?: Overrides + ): Promise; + + "cancelProposal(uint8,uint64,bytes32)"( + chainID: BigNumberish, + depositNonce: BigNumberish, + dataHash: BytesLike, + overrides?: Overrides + ): Promise; + + deposit( + destinationChainID: BigNumberish, + resourceID: BytesLike, + data: BytesLike, + overrides?: PayableOverrides + ): Promise; + + "deposit(uint8,bytes32,bytes)"( + destinationChainID: BigNumberish, + resourceID: BytesLike, + data: BytesLike, + overrides?: PayableOverrides + ): Promise; + + depositETH( + destinationChainID: BigNumberish, + resourceID: BytesLike, + data: BytesLike, + overrides?: PayableOverrides + ): Promise; + + "depositETH(uint8,bytes32,bytes)"( + destinationChainID: BigNumberish, + resourceID: BytesLike, + data: BytesLike, + overrides?: PayableOverrides + ): Promise; + + executeProposal( + chainID: BigNumberish, + depositNonce: BigNumberish, + data: BytesLike, + resourceID: BytesLike, + overrides?: Overrides + ): Promise; + + "executeProposal(uint8,uint64,bytes,bytes32)"( + chainID: BigNumberish, + depositNonce: BigNumberish, + data: BytesLike, + resourceID: BytesLike, + overrides?: Overrides + ): Promise; + + getFee( + destinationChainID: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "getFee(uint8)"( + destinationChainID: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getFees(overrides?: CallOverrides): Promise<[BigNumber, BigNumber, number]>; + + "getFees()"( + overrides?: CallOverrides + ): Promise<[BigNumber, BigNumber, number]>; + + getProposal( + originChainID: BigNumberish, + depositNonce: BigNumberish, + dataHash: BytesLike, + overrides?: CallOverrides + ): Promise< + [string, string, string[], string[], number, BigNumber] & { + _resourceID: string; + _dataHash: string; + _yesVotes: string[]; + _noVotes: string[]; + _status: number; + _proposedBlock: BigNumber; + } + >; + + "getProposal(uint8,uint64,bytes32)"( + originChainID: BigNumberish, + depositNonce: BigNumberish, + dataHash: BytesLike, + overrides?: CallOverrides + ): Promise< + [string, string, string[], string[], number, BigNumber] & { + _resourceID: string; + _dataHash: string; + _yesVotes: string[]; + _noVotes: string[]; + _status: number; + _proposedBlock: BigNumber; + } + >; + + getRoleAdmin(role: BytesLike, overrides?: CallOverrides): Promise; + + "getRoleAdmin(bytes32)"( + role: BytesLike, + overrides?: CallOverrides + ): Promise; + + getRoleMember( + role: BytesLike, + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "getRoleMember(bytes32,uint256)"( + role: BytesLike, + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getRoleMemberCount( + role: BytesLike, + overrides?: CallOverrides + ): Promise; + + "getRoleMemberCount(bytes32)"( + role: BytesLike, + overrides?: CallOverrides + ): Promise; + + grantRole( + role: BytesLike, + account: string, + overrides?: Overrides + ): Promise; + + "grantRole(bytes32,address)"( + role: BytesLike, + account: string, + overrides?: Overrides + ): Promise; + + hasRole( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + + "hasRole(bytes32,address)"( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + + isRelayer(relayer: string, overrides?: CallOverrides): Promise; + + "isRelayer(address)"( + relayer: string, + overrides?: CallOverrides + ): Promise; + + paused(overrides?: CallOverrides): Promise; + + "paused()"(overrides?: CallOverrides): Promise; + + renounceAdmin( + newAdmin: string, + overrides?: Overrides + ): Promise; + + "renounceAdmin(address)"( + newAdmin: string, + overrides?: Overrides + ): Promise; + + renounceRole( + role: BytesLike, + account: string, + overrides?: Overrides + ): Promise; + + "renounceRole(bytes32,address)"( + role: BytesLike, + account: string, + overrides?: Overrides + ): Promise; + + revokeRole( + role: BytesLike, + account: string, + overrides?: Overrides + ): Promise; + + "revokeRole(bytes32,address)"( + role: BytesLike, + account: string, + overrides?: Overrides + ): Promise; + + transferFunds( + addrs: string[], + amounts: BigNumberish[], + overrides?: Overrides + ): Promise; + + "transferFunds(address[],uint256[])"( + addrs: string[], + amounts: BigNumberish[], + overrides?: Overrides + ): Promise; + + voteProposal( + chainID: BigNumberish, + depositNonce: BigNumberish, + resourceID: BytesLike, + dataHash: BytesLike, + overrides?: Overrides + ): Promise; + + "voteProposal(uint8,uint64,bytes32,bytes32)"( + chainID: BigNumberish, + depositNonce: BigNumberish, + resourceID: BytesLike, + dataHash: BytesLike, + overrides?: Overrides + ): Promise; + + callStatic: { + DEFAULT_ADMIN_ROLE(overrides?: CallOverrides): Promise; + + "DEFAULT_ADMIN_ROLE()"(overrides?: CallOverrides): Promise; + + RELAYER_ROLE(overrides?: CallOverrides): Promise; + + "RELAYER_ROLE()"(overrides?: CallOverrides): Promise; + + _chainID(overrides?: CallOverrides): Promise; + + "_chainID()"(overrides?: CallOverrides): Promise; + + _depositCounts( + arg0: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "_depositCounts(uint8)"( + arg0: BigNumberish, + overrides?: CallOverrides + ): Promise; + + _depositRecords( + arg0: BigNumberish, + arg1: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "_depositRecords(uint64,uint8)"( + arg0: BigNumberish, + arg1: BigNumberish, + overrides?: CallOverrides + ): Promise; + + _expiry(overrides?: CallOverrides): Promise; + + "_expiry()"(overrides?: CallOverrides): Promise; + + _fee(overrides?: CallOverrides): Promise; + + "_fee()"(overrides?: CallOverrides): Promise; + + _hasVotedOnProposal( + arg0: BigNumberish, + arg1: BytesLike, + arg2: string, + overrides?: CallOverrides + ): Promise; + + "_hasVotedOnProposal(uint72,bytes32,address)"( + arg0: BigNumberish, + arg1: BytesLike, + arg2: string, + overrides?: CallOverrides + ): Promise; + + _proposals( + arg0: BigNumberish, + arg1: BytesLike, + overrides?: CallOverrides + ): Promise< + [string, string, number, BigNumber] & { + _resourceID: string; + _dataHash: string; + _status: number; + _proposedBlock: BigNumber; + } + >; + + "_proposals(uint72,bytes32)"( + arg0: BigNumberish, + arg1: BytesLike, + overrides?: CallOverrides + ): Promise< + [string, string, number, BigNumber] & { + _resourceID: string; + _dataHash: string; + _status: number; + _proposedBlock: BigNumber; + } + >; + + _relayerThreshold(overrides?: CallOverrides): Promise; + + "_relayerThreshold()"(overrides?: CallOverrides): Promise; + + _resourceIDToHandlerAddress( + arg0: BytesLike, + overrides?: CallOverrides + ): Promise; + + "_resourceIDToHandlerAddress(bytes32)"( + arg0: BytesLike, + overrides?: CallOverrides + ): Promise; + + _specialFee(overrides?: CallOverrides): Promise; + + "_specialFee()"(overrides?: CallOverrides): Promise; + + _specialFeeChainID(overrides?: CallOverrides): Promise; + + "_specialFeeChainID()"(overrides?: CallOverrides): Promise; + + _totalProposals(overrides?: CallOverrides): Promise; + + "_totalProposals()"(overrides?: CallOverrides): Promise; + + _totalRelayers(overrides?: CallOverrides): Promise; + + "_totalRelayers()"(overrides?: CallOverrides): Promise; + + _wtokenAddress(overrides?: CallOverrides): Promise; + + "_wtokenAddress()"(overrides?: CallOverrides): Promise; + + adminAddRelayer( + relayerAddress: string, + overrides?: CallOverrides + ): Promise; + + "adminAddRelayer(address)"( + relayerAddress: string, + overrides?: CallOverrides + ): Promise; + + adminChangeFee( + newFee: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "adminChangeFee(uint256)"( + newFee: BigNumberish, + overrides?: CallOverrides + ): Promise; + + adminChangeRelayerThreshold( + newThreshold: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "adminChangeRelayerThreshold(uint256)"( + newThreshold: BigNumberish, + overrides?: CallOverrides + ): Promise; + + adminChangeSpecialFee( + newFee: BigNumberish, + chainID: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "adminChangeSpecialFee(uint256,uint8)"( + newFee: BigNumberish, + chainID: BigNumberish, + overrides?: CallOverrides + ): Promise; + + adminPauseTransfers(overrides?: CallOverrides): Promise; + + "adminPauseTransfers()"(overrides?: CallOverrides): Promise; + + adminRemoveRelayer( + relayerAddress: string, + overrides?: CallOverrides + ): Promise; + + "adminRemoveRelayer(address)"( + relayerAddress: string, + overrides?: CallOverrides + ): Promise; + + adminSetBurnable( + handlerAddress: string, + tokenAddress: string, + overrides?: CallOverrides + ): Promise; + + "adminSetBurnable(address,address)"( + handlerAddress: string, + tokenAddress: string, + overrides?: CallOverrides + ): Promise; + + adminSetGenericResource( + handlerAddress: string, + resourceID: BytesLike, + contractAddress: string, + depositFunctionSig: BytesLike, + depositFunctionDepositerOffset: BigNumberish, + executeFunctionSig: BytesLike, + overrides?: CallOverrides + ): Promise; + + "adminSetGenericResource(address,bytes32,address,bytes4,uint256,bytes4)"( + handlerAddress: string, + resourceID: BytesLike, + contractAddress: string, + depositFunctionSig: BytesLike, + depositFunctionDepositerOffset: BigNumberish, + executeFunctionSig: BytesLike, + overrides?: CallOverrides + ): Promise; + + adminSetResource( + handlerAddress: string, + resourceID: BytesLike, + tokenAddress: string, + overrides?: CallOverrides + ): Promise; + + "adminSetResource(address,bytes32,address)"( + handlerAddress: string, + resourceID: BytesLike, + tokenAddress: string, + overrides?: CallOverrides + ): Promise; + + adminUnpauseTransfers(overrides?: CallOverrides): Promise; + + "adminUnpauseTransfers()"(overrides?: CallOverrides): Promise; + + adminUpdateBridgeAddress( + handlerAddress: string, + newBridgeAddress: string, + overrides?: CallOverrides + ): Promise; + + "adminUpdateBridgeAddress(address,address)"( + handlerAddress: string, + newBridgeAddress: string, + overrides?: CallOverrides + ): Promise; + + adminWithdraw( + handlerAddress: string, + tokenAddress: string, + recipient: string, + amountOrTokenID: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "adminWithdraw(address,address,address,uint256)"( + handlerAddress: string, + tokenAddress: string, + recipient: string, + amountOrTokenID: BigNumberish, + overrides?: CallOverrides + ): Promise; + + cancelProposal( + chainID: BigNumberish, + depositNonce: BigNumberish, + dataHash: BytesLike, + overrides?: CallOverrides + ): Promise; + + "cancelProposal(uint8,uint64,bytes32)"( + chainID: BigNumberish, + depositNonce: BigNumberish, + dataHash: BytesLike, + overrides?: CallOverrides + ): Promise; + + deposit( + destinationChainID: BigNumberish, + resourceID: BytesLike, + data: BytesLike, + overrides?: CallOverrides + ): Promise; + + "deposit(uint8,bytes32,bytes)"( + destinationChainID: BigNumberish, + resourceID: BytesLike, + data: BytesLike, + overrides?: CallOverrides + ): Promise; + + depositETH( + destinationChainID: BigNumberish, + resourceID: BytesLike, + data: BytesLike, + overrides?: CallOverrides + ): Promise; + + "depositETH(uint8,bytes32,bytes)"( + destinationChainID: BigNumberish, + resourceID: BytesLike, + data: BytesLike, + overrides?: CallOverrides + ): Promise; + + executeProposal( + chainID: BigNumberish, + depositNonce: BigNumberish, + data: BytesLike, + resourceID: BytesLike, + overrides?: CallOverrides + ): Promise; + + "executeProposal(uint8,uint64,bytes,bytes32)"( + chainID: BigNumberish, + depositNonce: BigNumberish, + data: BytesLike, + resourceID: BytesLike, + overrides?: CallOverrides + ): Promise; + + getFee( + destinationChainID: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "getFee(uint8)"( + destinationChainID: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getFees(overrides?: CallOverrides): Promise<[BigNumber, BigNumber, number]>; + + "getFees()"( + overrides?: CallOverrides + ): Promise<[BigNumber, BigNumber, number]>; + + getProposal( + originChainID: BigNumberish, + depositNonce: BigNumberish, + dataHash: BytesLike, + overrides?: CallOverrides + ): Promise< + [string, string, string[], string[], number, BigNumber] & { + _resourceID: string; + _dataHash: string; + _yesVotes: string[]; + _noVotes: string[]; + _status: number; + _proposedBlock: BigNumber; + } + >; + + "getProposal(uint8,uint64,bytes32)"( + originChainID: BigNumberish, + depositNonce: BigNumberish, + dataHash: BytesLike, + overrides?: CallOverrides + ): Promise< + [string, string, string[], string[], number, BigNumber] & { + _resourceID: string; + _dataHash: string; + _yesVotes: string[]; + _noVotes: string[]; + _status: number; + _proposedBlock: BigNumber; + } + >; + + getRoleAdmin(role: BytesLike, overrides?: CallOverrides): Promise; + + "getRoleAdmin(bytes32)"( + role: BytesLike, + overrides?: CallOverrides + ): Promise; + + getRoleMember( + role: BytesLike, + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "getRoleMember(bytes32,uint256)"( + role: BytesLike, + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getRoleMemberCount( + role: BytesLike, + overrides?: CallOverrides + ): Promise; + + "getRoleMemberCount(bytes32)"( + role: BytesLike, + overrides?: CallOverrides + ): Promise; + + grantRole( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + + "grantRole(bytes32,address)"( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + + hasRole( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + + "hasRole(bytes32,address)"( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + + isRelayer(relayer: string, overrides?: CallOverrides): Promise; + + "isRelayer(address)"( + relayer: string, + overrides?: CallOverrides + ): Promise; + + paused(overrides?: CallOverrides): Promise; + + "paused()"(overrides?: CallOverrides): Promise; + + renounceAdmin(newAdmin: string, overrides?: CallOverrides): Promise; + + "renounceAdmin(address)"( + newAdmin: string, + overrides?: CallOverrides + ): Promise; + + renounceRole( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + + "renounceRole(bytes32,address)"( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + + revokeRole( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + + "revokeRole(bytes32,address)"( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + + transferFunds( + addrs: string[], + amounts: BigNumberish[], + overrides?: CallOverrides + ): Promise; + + "transferFunds(address[],uint256[])"( + addrs: string[], + amounts: BigNumberish[], + overrides?: CallOverrides + ): Promise; + + voteProposal( + chainID: BigNumberish, + depositNonce: BigNumberish, + resourceID: BytesLike, + dataHash: BytesLike, + overrides?: CallOverrides + ): Promise; + + "voteProposal(uint8,uint64,bytes32,bytes32)"( + chainID: BigNumberish, + depositNonce: BigNumberish, + resourceID: BytesLike, + dataHash: BytesLike, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + Deposit( + destinationChainID: BigNumberish | null, + resourceID: BytesLike | null, + depositNonce: BigNumberish | null + ): TypedEventFilter< + [number, string, BigNumber], + { + destinationChainID: number; + resourceID: string; + depositNonce: BigNumber; + } + >; + + Paused(account: null): TypedEventFilter<[string], { account: string }>; + + ProposalEvent( + originChainID: BigNumberish | null, + depositNonce: BigNumberish | null, + status: BigNumberish | null, + resourceID: null, + dataHash: null + ): TypedEventFilter< + [number, BigNumber, number, string, string], + { + originChainID: number; + depositNonce: BigNumber; + status: number; + resourceID: string; + dataHash: string; + } + >; + + ProposalVote( + originChainID: BigNumberish | null, + depositNonce: BigNumberish | null, + status: BigNumberish | null, + resourceID: null + ): TypedEventFilter< + [number, BigNumber, number, string], + { + originChainID: number; + depositNonce: BigNumber; + status: number; + resourceID: string; + } + >; + + RelayerAdded( + relayer: string | null + ): TypedEventFilter<[string], { relayer: string }>; + + RelayerRemoved( + relayer: string | null + ): TypedEventFilter<[string], { relayer: string }>; + + RelayerThresholdChanged( + newThreshold: BigNumberish | null + ): TypedEventFilter<[BigNumber], { newThreshold: BigNumber }>; + + RoleAdminChanged( + role: BytesLike | null, + previousAdminRole: BytesLike | null, + newAdminRole: BytesLike | null + ): TypedEventFilter< + [string, string, string], + { role: string; previousAdminRole: string; newAdminRole: string } + >; + + RoleGranted( + role: BytesLike | null, + account: string | null, + sender: string | null + ): TypedEventFilter< + [string, string, string], + { role: string; account: string; sender: string } + >; + + RoleRevoked( + role: BytesLike | null, + account: string | null, + sender: string | null + ): TypedEventFilter< + [string, string, string], + { role: string; account: string; sender: string } + >; + + Unpaused(account: null): TypedEventFilter<[string], { account: string }>; + }; + + estimateGas: { + DEFAULT_ADMIN_ROLE(overrides?: CallOverrides): Promise; + + "DEFAULT_ADMIN_ROLE()"(overrides?: CallOverrides): Promise; + + RELAYER_ROLE(overrides?: CallOverrides): Promise; + + "RELAYER_ROLE()"(overrides?: CallOverrides): Promise; + + _chainID(overrides?: CallOverrides): Promise; + + "_chainID()"(overrides?: CallOverrides): Promise; + + _depositCounts( + arg0: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "_depositCounts(uint8)"( + arg0: BigNumberish, + overrides?: CallOverrides + ): Promise; + + _depositRecords( + arg0: BigNumberish, + arg1: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "_depositRecords(uint64,uint8)"( + arg0: BigNumberish, + arg1: BigNumberish, + overrides?: CallOverrides + ): Promise; + + _expiry(overrides?: CallOverrides): Promise; + + "_expiry()"(overrides?: CallOverrides): Promise; + + _fee(overrides?: CallOverrides): Promise; + + "_fee()"(overrides?: CallOverrides): Promise; + + _hasVotedOnProposal( + arg0: BigNumberish, + arg1: BytesLike, + arg2: string, + overrides?: CallOverrides + ): Promise; + + "_hasVotedOnProposal(uint72,bytes32,address)"( + arg0: BigNumberish, + arg1: BytesLike, + arg2: string, + overrides?: CallOverrides + ): Promise; + + _proposals( + arg0: BigNumberish, + arg1: BytesLike, + overrides?: CallOverrides + ): Promise; + + "_proposals(uint72,bytes32)"( + arg0: BigNumberish, + arg1: BytesLike, + overrides?: CallOverrides + ): Promise; + + _relayerThreshold(overrides?: CallOverrides): Promise; + + "_relayerThreshold()"(overrides?: CallOverrides): Promise; + + _resourceIDToHandlerAddress( + arg0: BytesLike, + overrides?: CallOverrides + ): Promise; + + "_resourceIDToHandlerAddress(bytes32)"( + arg0: BytesLike, + overrides?: CallOverrides + ): Promise; + + _specialFee(overrides?: CallOverrides): Promise; + + "_specialFee()"(overrides?: CallOverrides): Promise; + + _specialFeeChainID(overrides?: CallOverrides): Promise; + + "_specialFeeChainID()"(overrides?: CallOverrides): Promise; + + _totalProposals(overrides?: CallOverrides): Promise; + + "_totalProposals()"(overrides?: CallOverrides): Promise; + + _totalRelayers(overrides?: CallOverrides): Promise; + + "_totalRelayers()"(overrides?: CallOverrides): Promise; + + _wtokenAddress(overrides?: CallOverrides): Promise; + + "_wtokenAddress()"(overrides?: CallOverrides): Promise; + + adminAddRelayer( + relayerAddress: string, + overrides?: Overrides + ): Promise; + + "adminAddRelayer(address)"( + relayerAddress: string, + overrides?: Overrides + ): Promise; + + adminChangeFee( + newFee: BigNumberish, + overrides?: Overrides + ): Promise; + + "adminChangeFee(uint256)"( + newFee: BigNumberish, + overrides?: Overrides + ): Promise; + + adminChangeRelayerThreshold( + newThreshold: BigNumberish, + overrides?: Overrides + ): Promise; + + "adminChangeRelayerThreshold(uint256)"( + newThreshold: BigNumberish, + overrides?: Overrides + ): Promise; + + adminChangeSpecialFee( + newFee: BigNumberish, + chainID: BigNumberish, + overrides?: Overrides + ): Promise; + + "adminChangeSpecialFee(uint256,uint8)"( + newFee: BigNumberish, + chainID: BigNumberish, + overrides?: Overrides + ): Promise; + + adminPauseTransfers(overrides?: Overrides): Promise; + + "adminPauseTransfers()"(overrides?: Overrides): Promise; + + adminRemoveRelayer( + relayerAddress: string, + overrides?: Overrides + ): Promise; + + "adminRemoveRelayer(address)"( + relayerAddress: string, + overrides?: Overrides + ): Promise; + + adminSetBurnable( + handlerAddress: string, + tokenAddress: string, + overrides?: Overrides + ): Promise; + + "adminSetBurnable(address,address)"( + handlerAddress: string, + tokenAddress: string, + overrides?: Overrides + ): Promise; + + adminSetGenericResource( + handlerAddress: string, + resourceID: BytesLike, + contractAddress: string, + depositFunctionSig: BytesLike, + depositFunctionDepositerOffset: BigNumberish, + executeFunctionSig: BytesLike, + overrides?: Overrides + ): Promise; + + "adminSetGenericResource(address,bytes32,address,bytes4,uint256,bytes4)"( + handlerAddress: string, + resourceID: BytesLike, + contractAddress: string, + depositFunctionSig: BytesLike, + depositFunctionDepositerOffset: BigNumberish, + executeFunctionSig: BytesLike, + overrides?: Overrides + ): Promise; + + adminSetResource( + handlerAddress: string, + resourceID: BytesLike, + tokenAddress: string, + overrides?: Overrides + ): Promise; + + "adminSetResource(address,bytes32,address)"( + handlerAddress: string, + resourceID: BytesLike, + tokenAddress: string, + overrides?: Overrides + ): Promise; + + adminUnpauseTransfers(overrides?: Overrides): Promise; + + "adminUnpauseTransfers()"(overrides?: Overrides): Promise; + + adminUpdateBridgeAddress( + handlerAddress: string, + newBridgeAddress: string, + overrides?: Overrides + ): Promise; + + "adminUpdateBridgeAddress(address,address)"( + handlerAddress: string, + newBridgeAddress: string, + overrides?: Overrides + ): Promise; + + adminWithdraw( + handlerAddress: string, + tokenAddress: string, + recipient: string, + amountOrTokenID: BigNumberish, + overrides?: Overrides + ): Promise; + + "adminWithdraw(address,address,address,uint256)"( + handlerAddress: string, + tokenAddress: string, + recipient: string, + amountOrTokenID: BigNumberish, + overrides?: Overrides + ): Promise; + + cancelProposal( + chainID: BigNumberish, + depositNonce: BigNumberish, + dataHash: BytesLike, + overrides?: Overrides + ): Promise; + + "cancelProposal(uint8,uint64,bytes32)"( + chainID: BigNumberish, + depositNonce: BigNumberish, + dataHash: BytesLike, + overrides?: Overrides + ): Promise; + + deposit( + destinationChainID: BigNumberish, + resourceID: BytesLike, + data: BytesLike, + overrides?: PayableOverrides + ): Promise; + + "deposit(uint8,bytes32,bytes)"( + destinationChainID: BigNumberish, + resourceID: BytesLike, + data: BytesLike, + overrides?: PayableOverrides + ): Promise; + + depositETH( + destinationChainID: BigNumberish, + resourceID: BytesLike, + data: BytesLike, + overrides?: PayableOverrides + ): Promise; + + "depositETH(uint8,bytes32,bytes)"( + destinationChainID: BigNumberish, + resourceID: BytesLike, + data: BytesLike, + overrides?: PayableOverrides + ): Promise; + + executeProposal( + chainID: BigNumberish, + depositNonce: BigNumberish, + data: BytesLike, + resourceID: BytesLike, + overrides?: Overrides + ): Promise; + + "executeProposal(uint8,uint64,bytes,bytes32)"( + chainID: BigNumberish, + depositNonce: BigNumberish, + data: BytesLike, + resourceID: BytesLike, + overrides?: Overrides + ): Promise; + + getFee( + destinationChainID: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "getFee(uint8)"( + destinationChainID: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getFees(overrides?: CallOverrides): Promise; + + "getFees()"(overrides?: CallOverrides): Promise; + + getProposal( + originChainID: BigNumberish, + depositNonce: BigNumberish, + dataHash: BytesLike, + overrides?: CallOverrides + ): Promise; + + "getProposal(uint8,uint64,bytes32)"( + originChainID: BigNumberish, + depositNonce: BigNumberish, + dataHash: BytesLike, + overrides?: CallOverrides + ): Promise; + + getRoleAdmin( + role: BytesLike, + overrides?: CallOverrides + ): Promise; + + "getRoleAdmin(bytes32)"( + role: BytesLike, + overrides?: CallOverrides + ): Promise; + + getRoleMember( + role: BytesLike, + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "getRoleMember(bytes32,uint256)"( + role: BytesLike, + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getRoleMemberCount( + role: BytesLike, + overrides?: CallOverrides + ): Promise; + + "getRoleMemberCount(bytes32)"( + role: BytesLike, + overrides?: CallOverrides + ): Promise; + + grantRole( + role: BytesLike, + account: string, + overrides?: Overrides + ): Promise; + + "grantRole(bytes32,address)"( + role: BytesLike, + account: string, + overrides?: Overrides + ): Promise; + + hasRole( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + + "hasRole(bytes32,address)"( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + + isRelayer(relayer: string, overrides?: CallOverrides): Promise; + + "isRelayer(address)"( + relayer: string, + overrides?: CallOverrides + ): Promise; + + paused(overrides?: CallOverrides): Promise; + + "paused()"(overrides?: CallOverrides): Promise; + + renounceAdmin(newAdmin: string, overrides?: Overrides): Promise; + + "renounceAdmin(address)"( + newAdmin: string, + overrides?: Overrides + ): Promise; + + renounceRole( + role: BytesLike, + account: string, + overrides?: Overrides + ): Promise; + + "renounceRole(bytes32,address)"( + role: BytesLike, + account: string, + overrides?: Overrides + ): Promise; + + revokeRole( + role: BytesLike, + account: string, + overrides?: Overrides + ): Promise; + + "revokeRole(bytes32,address)"( + role: BytesLike, + account: string, + overrides?: Overrides + ): Promise; + + transferFunds( + addrs: string[], + amounts: BigNumberish[], + overrides?: Overrides + ): Promise; + + "transferFunds(address[],uint256[])"( + addrs: string[], + amounts: BigNumberish[], + overrides?: Overrides + ): Promise; + + voteProposal( + chainID: BigNumberish, + depositNonce: BigNumberish, + resourceID: BytesLike, + dataHash: BytesLike, + overrides?: Overrides + ): Promise; + + "voteProposal(uint8,uint64,bytes32,bytes32)"( + chainID: BigNumberish, + depositNonce: BigNumberish, + resourceID: BytesLike, + dataHash: BytesLike, + overrides?: Overrides + ): Promise; + }; + + populateTransaction: { + DEFAULT_ADMIN_ROLE( + overrides?: CallOverrides + ): Promise; + + "DEFAULT_ADMIN_ROLE()"( + overrides?: CallOverrides + ): Promise; + + RELAYER_ROLE(overrides?: CallOverrides): Promise; + + "RELAYER_ROLE()"(overrides?: CallOverrides): Promise; + + _chainID(overrides?: CallOverrides): Promise; + + "_chainID()"(overrides?: CallOverrides): Promise; + + _depositCounts( + arg0: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "_depositCounts(uint8)"( + arg0: BigNumberish, + overrides?: CallOverrides + ): Promise; + + _depositRecords( + arg0: BigNumberish, + arg1: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "_depositRecords(uint64,uint8)"( + arg0: BigNumberish, + arg1: BigNumberish, + overrides?: CallOverrides + ): Promise; + + _expiry(overrides?: CallOverrides): Promise; + + "_expiry()"(overrides?: CallOverrides): Promise; + + _fee(overrides?: CallOverrides): Promise; + + "_fee()"(overrides?: CallOverrides): Promise; + + _hasVotedOnProposal( + arg0: BigNumberish, + arg1: BytesLike, + arg2: string, + overrides?: CallOverrides + ): Promise; + + "_hasVotedOnProposal(uint72,bytes32,address)"( + arg0: BigNumberish, + arg1: BytesLike, + arg2: string, + overrides?: CallOverrides + ): Promise; + + _proposals( + arg0: BigNumberish, + arg1: BytesLike, + overrides?: CallOverrides + ): Promise; + + "_proposals(uint72,bytes32)"( + arg0: BigNumberish, + arg1: BytesLike, + overrides?: CallOverrides + ): Promise; + + _relayerThreshold(overrides?: CallOverrides): Promise; + + "_relayerThreshold()"( + overrides?: CallOverrides + ): Promise; + + _resourceIDToHandlerAddress( + arg0: BytesLike, + overrides?: CallOverrides + ): Promise; + + "_resourceIDToHandlerAddress(bytes32)"( + arg0: BytesLike, + overrides?: CallOverrides + ): Promise; + + _specialFee(overrides?: CallOverrides): Promise; + + "_specialFee()"(overrides?: CallOverrides): Promise; + + _specialFeeChainID( + overrides?: CallOverrides + ): Promise; + + "_specialFeeChainID()"( + overrides?: CallOverrides + ): Promise; + + _totalProposals(overrides?: CallOverrides): Promise; + + "_totalProposals()"( + overrides?: CallOverrides + ): Promise; + + _totalRelayers(overrides?: CallOverrides): Promise; + + "_totalRelayers()"( + overrides?: CallOverrides + ): Promise; + + _wtokenAddress(overrides?: CallOverrides): Promise; + + "_wtokenAddress()"( + overrides?: CallOverrides + ): Promise; + + adminAddRelayer( + relayerAddress: string, + overrides?: Overrides + ): Promise; + + "adminAddRelayer(address)"( + relayerAddress: string, + overrides?: Overrides + ): Promise; + + adminChangeFee( + newFee: BigNumberish, + overrides?: Overrides + ): Promise; + + "adminChangeFee(uint256)"( + newFee: BigNumberish, + overrides?: Overrides + ): Promise; + + adminChangeRelayerThreshold( + newThreshold: BigNumberish, + overrides?: Overrides + ): Promise; + + "adminChangeRelayerThreshold(uint256)"( + newThreshold: BigNumberish, + overrides?: Overrides + ): Promise; + + adminChangeSpecialFee( + newFee: BigNumberish, + chainID: BigNumberish, + overrides?: Overrides + ): Promise; + + "adminChangeSpecialFee(uint256,uint8)"( + newFee: BigNumberish, + chainID: BigNumberish, + overrides?: Overrides + ): Promise; + + adminPauseTransfers(overrides?: Overrides): Promise; + + "adminPauseTransfers()"( + overrides?: Overrides + ): Promise; + + adminRemoveRelayer( + relayerAddress: string, + overrides?: Overrides + ): Promise; + + "adminRemoveRelayer(address)"( + relayerAddress: string, + overrides?: Overrides + ): Promise; + + adminSetBurnable( + handlerAddress: string, + tokenAddress: string, + overrides?: Overrides + ): Promise; + + "adminSetBurnable(address,address)"( + handlerAddress: string, + tokenAddress: string, + overrides?: Overrides + ): Promise; + + adminSetGenericResource( + handlerAddress: string, + resourceID: BytesLike, + contractAddress: string, + depositFunctionSig: BytesLike, + depositFunctionDepositerOffset: BigNumberish, + executeFunctionSig: BytesLike, + overrides?: Overrides + ): Promise; + + "adminSetGenericResource(address,bytes32,address,bytes4,uint256,bytes4)"( + handlerAddress: string, + resourceID: BytesLike, + contractAddress: string, + depositFunctionSig: BytesLike, + depositFunctionDepositerOffset: BigNumberish, + executeFunctionSig: BytesLike, + overrides?: Overrides + ): Promise; + + adminSetResource( + handlerAddress: string, + resourceID: BytesLike, + tokenAddress: string, + overrides?: Overrides + ): Promise; + + "adminSetResource(address,bytes32,address)"( + handlerAddress: string, + resourceID: BytesLike, + tokenAddress: string, + overrides?: Overrides + ): Promise; + + adminUnpauseTransfers(overrides?: Overrides): Promise; + + "adminUnpauseTransfers()"( + overrides?: Overrides + ): Promise; + + adminUpdateBridgeAddress( + handlerAddress: string, + newBridgeAddress: string, + overrides?: Overrides + ): Promise; + + "adminUpdateBridgeAddress(address,address)"( + handlerAddress: string, + newBridgeAddress: string, + overrides?: Overrides + ): Promise; + + adminWithdraw( + handlerAddress: string, + tokenAddress: string, + recipient: string, + amountOrTokenID: BigNumberish, + overrides?: Overrides + ): Promise; + + "adminWithdraw(address,address,address,uint256)"( + handlerAddress: string, + tokenAddress: string, + recipient: string, + amountOrTokenID: BigNumberish, + overrides?: Overrides + ): Promise; + + cancelProposal( + chainID: BigNumberish, + depositNonce: BigNumberish, + dataHash: BytesLike, + overrides?: Overrides + ): Promise; + + "cancelProposal(uint8,uint64,bytes32)"( + chainID: BigNumberish, + depositNonce: BigNumberish, + dataHash: BytesLike, + overrides?: Overrides + ): Promise; + + deposit( + destinationChainID: BigNumberish, + resourceID: BytesLike, + data: BytesLike, + overrides?: PayableOverrides + ): Promise; + + "deposit(uint8,bytes32,bytes)"( + destinationChainID: BigNumberish, + resourceID: BytesLike, + data: BytesLike, + overrides?: PayableOverrides + ): Promise; + + depositETH( + destinationChainID: BigNumberish, + resourceID: BytesLike, + data: BytesLike, + overrides?: PayableOverrides + ): Promise; + + "depositETH(uint8,bytes32,bytes)"( + destinationChainID: BigNumberish, + resourceID: BytesLike, + data: BytesLike, + overrides?: PayableOverrides + ): Promise; + + executeProposal( + chainID: BigNumberish, + depositNonce: BigNumberish, + data: BytesLike, + resourceID: BytesLike, + overrides?: Overrides + ): Promise; + + "executeProposal(uint8,uint64,bytes,bytes32)"( + chainID: BigNumberish, + depositNonce: BigNumberish, + data: BytesLike, + resourceID: BytesLike, + overrides?: Overrides + ): Promise; + + getFee( + destinationChainID: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "getFee(uint8)"( + destinationChainID: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getFees(overrides?: CallOverrides): Promise; + + "getFees()"(overrides?: CallOverrides): Promise; + + getProposal( + originChainID: BigNumberish, + depositNonce: BigNumberish, + dataHash: BytesLike, + overrides?: CallOverrides + ): Promise; + + "getProposal(uint8,uint64,bytes32)"( + originChainID: BigNumberish, + depositNonce: BigNumberish, + dataHash: BytesLike, + overrides?: CallOverrides + ): Promise; + + getRoleAdmin( + role: BytesLike, + overrides?: CallOverrides + ): Promise; + + "getRoleAdmin(bytes32)"( + role: BytesLike, + overrides?: CallOverrides + ): Promise; + + getRoleMember( + role: BytesLike, + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "getRoleMember(bytes32,uint256)"( + role: BytesLike, + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getRoleMemberCount( + role: BytesLike, + overrides?: CallOverrides + ): Promise; + + "getRoleMemberCount(bytes32)"( + role: BytesLike, + overrides?: CallOverrides + ): Promise; + + grantRole( + role: BytesLike, + account: string, + overrides?: Overrides + ): Promise; + + "grantRole(bytes32,address)"( + role: BytesLike, + account: string, + overrides?: Overrides + ): Promise; + + hasRole( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + + "hasRole(bytes32,address)"( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + + isRelayer( + relayer: string, + overrides?: CallOverrides + ): Promise; + + "isRelayer(address)"( + relayer: string, + overrides?: CallOverrides + ): Promise; + + paused(overrides?: CallOverrides): Promise; + + "paused()"(overrides?: CallOverrides): Promise; + + renounceAdmin( + newAdmin: string, + overrides?: Overrides + ): Promise; + + "renounceAdmin(address)"( + newAdmin: string, + overrides?: Overrides + ): Promise; + + renounceRole( + role: BytesLike, + account: string, + overrides?: Overrides + ): Promise; + + "renounceRole(bytes32,address)"( + role: BytesLike, + account: string, + overrides?: Overrides + ): Promise; + + revokeRole( + role: BytesLike, + account: string, + overrides?: Overrides + ): Promise; + + "revokeRole(bytes32,address)"( + role: BytesLike, + account: string, + overrides?: Overrides + ): Promise; + + transferFunds( + addrs: string[], + amounts: BigNumberish[], + overrides?: Overrides + ): Promise; + + "transferFunds(address[],uint256[])"( + addrs: string[], + amounts: BigNumberish[], + overrides?: Overrides + ): Promise; + + voteProposal( + chainID: BigNumberish, + depositNonce: BigNumberish, + resourceID: BytesLike, + dataHash: BytesLike, + overrides?: Overrides + ): Promise; + + "voteProposal(uint8,uint64,bytes32,bytes32)"( + chainID: BigNumberish, + depositNonce: BigNumberish, + resourceID: BytesLike, + dataHash: BytesLike, + overrides?: Overrides + ): Promise; + }; +} diff --git a/src/Contracts/BridgeFactory.ts b/src/Contracts/BridgeFactory.ts new file mode 100644 index 00000000..5a6b0e16 --- /dev/null +++ b/src/Contracts/BridgeFactory.ts @@ -0,0 +1,1242 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Signer, BigNumberish } from "ethers"; +import { Provider, TransactionRequest } from "@ethersproject/providers"; +import { Contract, ContractFactory, Overrides } from "@ethersproject/contracts"; + +import type { Bridge } from "./Bridge"; + +export class BridgeFactory extends ContractFactory { + constructor(signer?: Signer) { + super(_abi, _bytecode, signer); + } + + deploy( + chainID: BigNumberish, + initialRelayers: string[], + initialRelayerThreshold: BigNumberish, + fee: BigNumberish, + expiry: BigNumberish, + overrides?: Overrides + ): Promise { + return super.deploy( + chainID, + initialRelayers, + initialRelayerThreshold, + fee, + expiry, + overrides || {} + ) as Promise; + } + getDeployTransaction( + chainID: BigNumberish, + initialRelayers: string[], + initialRelayerThreshold: BigNumberish, + fee: BigNumberish, + expiry: BigNumberish, + overrides?: Overrides + ): TransactionRequest { + return super.getDeployTransaction( + chainID, + initialRelayers, + initialRelayerThreshold, + fee, + expiry, + overrides || {} + ); + } + attach(address: string): Bridge { + return super.attach(address) as Bridge; + } + connect(signer: Signer): BridgeFactory { + return super.connect(signer) as BridgeFactory; + } + static connect(address: string, signerOrProvider: Signer | Provider): Bridge { + return new Contract(address, _abi, signerOrProvider) as Bridge; + } +} + +const _abi = [ + { + inputs: [ + { + internalType: "uint8", + name: "chainID", + type: "uint8", + }, + { + internalType: "address[]", + name: "initialRelayers", + type: "address[]", + }, + { + internalType: "uint256", + name: "initialRelayerThreshold", + type: "uint256", + }, + { + internalType: "uint256", + name: "fee", + type: "uint256", + }, + { + internalType: "uint256", + name: "expiry", + type: "uint256", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint8", + name: "destinationChainID", + type: "uint8", + }, + { + indexed: true, + internalType: "bytes32", + name: "resourceID", + type: "bytes32", + }, + { + indexed: true, + internalType: "uint64", + name: "depositNonce", + type: "uint64", + }, + ], + name: "Deposit", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "Paused", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint8", + name: "originChainID", + type: "uint8", + }, + { + indexed: true, + internalType: "uint64", + name: "depositNonce", + type: "uint64", + }, + { + indexed: true, + internalType: "enum Bridge.ProposalStatus", + name: "status", + type: "uint8", + }, + { + indexed: false, + internalType: "bytes32", + name: "resourceID", + type: "bytes32", + }, + { + indexed: false, + internalType: "bytes32", + name: "dataHash", + type: "bytes32", + }, + ], + name: "ProposalEvent", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint8", + name: "originChainID", + type: "uint8", + }, + { + indexed: true, + internalType: "uint64", + name: "depositNonce", + type: "uint64", + }, + { + indexed: true, + internalType: "enum Bridge.ProposalStatus", + name: "status", + type: "uint8", + }, + { + indexed: false, + internalType: "bytes32", + name: "resourceID", + type: "bytes32", + }, + ], + name: "ProposalVote", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "relayer", + type: "address", + }, + ], + name: "RelayerAdded", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "relayer", + type: "address", + }, + ], + name: "RelayerRemoved", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "newThreshold", + type: "uint256", + }, + ], + name: "RelayerThresholdChanged", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + { + indexed: true, + internalType: "bytes32", + name: "previousAdminRole", + type: "bytes32", + }, + { + indexed: true, + internalType: "bytes32", + name: "newAdminRole", + type: "bytes32", + }, + ], + name: "RoleAdminChanged", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + { + indexed: true, + internalType: "address", + name: "account", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "sender", + type: "address", + }, + ], + name: "RoleGranted", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + { + indexed: true, + internalType: "address", + name: "account", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "sender", + type: "address", + }, + ], + name: "RoleRevoked", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "Unpaused", + type: "event", + }, + { + inputs: [], + name: "DEFAULT_ADMIN_ROLE", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "RELAYER_ROLE", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "_chainID", + outputs: [ + { + internalType: "uint8", + name: "", + type: "uint8", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint8", + name: "", + type: "uint8", + }, + ], + name: "_depositCounts", + outputs: [ + { + internalType: "uint64", + name: "", + type: "uint64", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint64", + name: "", + type: "uint64", + }, + { + internalType: "uint8", + name: "", + type: "uint8", + }, + ], + name: "_depositRecords", + outputs: [ + { + internalType: "bytes", + name: "", + type: "bytes", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "_expiry", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "_fee", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint72", + name: "", + type: "uint72", + }, + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + { + internalType: "address", + name: "", + type: "address", + }, + ], + name: "_hasVotedOnProposal", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint72", + name: "", + type: "uint72", + }, + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + name: "_proposals", + outputs: [ + { + internalType: "bytes32", + name: "_resourceID", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "_dataHash", + type: "bytes32", + }, + { + internalType: "enum Bridge.ProposalStatus", + name: "_status", + type: "uint8", + }, + { + internalType: "uint256", + name: "_proposedBlock", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "_relayerThreshold", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + name: "_resourceIDToHandlerAddress", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "_specialFee", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "_specialFeeChainID", + outputs: [ + { + internalType: "uint8", + name: "", + type: "uint8", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "_totalProposals", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "_totalRelayers", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "_wtokenAddress", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "relayerAddress", + type: "address", + }, + ], + name: "adminAddRelayer", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "newFee", + type: "uint256", + }, + ], + name: "adminChangeFee", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "newThreshold", + type: "uint256", + }, + ], + name: "adminChangeRelayerThreshold", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "newFee", + type: "uint256", + }, + { + internalType: "uint8", + name: "chainID", + type: "uint8", + }, + ], + name: "adminChangeSpecialFee", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "adminPauseTransfers", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "relayerAddress", + type: "address", + }, + ], + name: "adminRemoveRelayer", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "handlerAddress", + type: "address", + }, + { + internalType: "address", + name: "tokenAddress", + type: "address", + }, + ], + name: "adminSetBurnable", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "handlerAddress", + type: "address", + }, + { + internalType: "bytes32", + name: "resourceID", + type: "bytes32", + }, + { + internalType: "address", + name: "contractAddress", + type: "address", + }, + { + internalType: "bytes4", + name: "depositFunctionSig", + type: "bytes4", + }, + { + internalType: "uint256", + name: "depositFunctionDepositerOffset", + type: "uint256", + }, + { + internalType: "bytes4", + name: "executeFunctionSig", + type: "bytes4", + }, + ], + name: "adminSetGenericResource", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "handlerAddress", + type: "address", + }, + { + internalType: "bytes32", + name: "resourceID", + type: "bytes32", + }, + { + internalType: "address", + name: "tokenAddress", + type: "address", + }, + ], + name: "adminSetResource", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "adminUnpauseTransfers", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "handlerAddress", + type: "address", + }, + { + internalType: "address", + name: "newBridgeAddress", + type: "address", + }, + ], + name: "adminUpdateBridgeAddress", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "handlerAddress", + type: "address", + }, + { + internalType: "address", + name: "tokenAddress", + type: "address", + }, + { + internalType: "address", + name: "recipient", + type: "address", + }, + { + internalType: "uint256", + name: "amountOrTokenID", + type: "uint256", + }, + ], + name: "adminWithdraw", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint8", + name: "chainID", + type: "uint8", + }, + { + internalType: "uint64", + name: "depositNonce", + type: "uint64", + }, + { + internalType: "bytes32", + name: "dataHash", + type: "bytes32", + }, + ], + name: "cancelProposal", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint8", + name: "destinationChainID", + type: "uint8", + }, + { + internalType: "bytes32", + name: "resourceID", + type: "bytes32", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + ], + name: "deposit", + outputs: [], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint8", + name: "destinationChainID", + type: "uint8", + }, + { + internalType: "bytes32", + name: "resourceID", + type: "bytes32", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + ], + name: "depositETH", + outputs: [], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint8", + name: "chainID", + type: "uint8", + }, + { + internalType: "uint64", + name: "depositNonce", + type: "uint64", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + internalType: "bytes32", + name: "resourceID", + type: "bytes32", + }, + ], + name: "executeProposal", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint8", + name: "destinationChainID", + type: "uint8", + }, + ], + name: "getFee", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getFees", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + { + internalType: "uint256", + name: "", + type: "uint256", + }, + { + internalType: "uint8", + name: "", + type: "uint8", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint8", + name: "originChainID", + type: "uint8", + }, + { + internalType: "uint64", + name: "depositNonce", + type: "uint64", + }, + { + internalType: "bytes32", + name: "dataHash", + type: "bytes32", + }, + ], + name: "getProposal", + outputs: [ + { + components: [ + { + internalType: "bytes32", + name: "_resourceID", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "_dataHash", + type: "bytes32", + }, + { + internalType: "address[]", + name: "_yesVotes", + type: "address[]", + }, + { + internalType: "address[]", + name: "_noVotes", + type: "address[]", + }, + { + internalType: "enum Bridge.ProposalStatus", + name: "_status", + type: "uint8", + }, + { + internalType: "uint256", + name: "_proposedBlock", + type: "uint256", + }, + ], + internalType: "struct Bridge.Proposal", + name: "", + type: "tuple", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + ], + name: "getRoleAdmin", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + { + internalType: "uint256", + name: "index", + type: "uint256", + }, + ], + name: "getRoleMember", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + ], + name: "getRoleMemberCount", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "grantRole", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "hasRole", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "relayer", + type: "address", + }, + ], + name: "isRelayer", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "paused", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "newAdmin", + type: "address", + }, + ], + name: "renounceAdmin", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "renounceRole", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "revokeRole", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address payable[]", + name: "addrs", + type: "address[]", + }, + { + internalType: "uint256[]", + name: "amounts", + type: "uint256[]", + }, + ], + name: "transferFunds", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint8", + name: "chainID", + type: "uint8", + }, + { + internalType: "uint64", + name: "depositNonce", + type: "uint64", + }, + { + internalType: "bytes32", + name: "resourceID", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "dataHash", + type: "bytes32", + }, + ], + name: "voteProposal", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, +]; + +const _bytecode = + "0x60806040523480156200001157600080fd5b50604051620059f2380380620059f2833981810160405281019062000037919062000525565b60008060006101000a81548160ff02191690831515021790555084600260006101000a81548160ff021916908360ff16021790555082600381905550816006819055508060078190555060006009819055506000600a60006101000a81548160ff021916908360ff160217905550620000ba6000801b336200015860201b60201c565b620000e4604051620000cc906200066a565b60405180910390206000801b6200016e60201b60201c565b60005b84518110156200014c576200012c60405162000103906200066a565b60405180910390208683815181106200011857fe5b6020026020010151620001d260201b60201c565b6004600081548092919060010191905055508080600101915050620000e7565b505050505050620007af565b6200016a82826200026160201b60201c565b5050565b806001600084815260200190815260200160002060020154837fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff60405160405180910390a48060016000848152602001908152602001600020600201819055505050565b620002096001600084815260200190815260200160002060020154620001fd6200030560201b60201c565b6200030d60201b60201c565b6200024b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002429062000681565b60405180910390fd5b6200025d82826200026160201b60201c565b5050565b6200029081600160008581526020019081526020016000206000016200034660201b620030e01790919060201c565b156200030157620002a66200030560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600033905090565b60006200033e82600160008681526020019081526020016000206000016200037e60201b62002fe51790919060201c565b905092915050565b600062000376836000018373ffffffffffffffffffffffffffffffffffffffff1660001b620003b660201b60201c565b905092915050565b6000620003ae836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6200043060201b60201c565b905092915050565b6000620003ca83836200043060201b60201c565b620004255782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506200042a565b600090505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b600081519050620004648162000761565b92915050565b600082601f8301126200047c57600080fd5b8151620004936200048d82620006d1565b620006a3565b91508181835260208401935060208101905083856020840282011115620004b957600080fd5b60005b83811015620004ed5781620004d2888262000453565b845260208401935060208301925050600181019050620004bc565b5050505092915050565b60008151905062000508816200077b565b92915050565b6000815190506200051f8162000795565b92915050565b600080600080600060a086880312156200053e57600080fd5b60006200054e888289016200050e565b955050602086015167ffffffffffffffff8111156200056c57600080fd5b6200057a888289016200046a565b94505060406200058d88828901620004f7565b9350506060620005a088828901620004f7565b9250506080620005b388828901620004f7565b9150509295509295909350565b6000620005cf602f83620006fa565b91507f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60008301527f2061646d696e20746f206772616e7400000000000000000000000000000000006020830152604082019050919050565b600062000637600c836200070b565b91507f52454c415945525f524f4c4500000000000000000000000000000000000000006000830152600c82019050919050565b6000620006778262000628565b9150819050919050565b600060208201905081810360008301526200069c81620005c0565b9050919050565b6000604051905081810181811067ffffffffffffffff82111715620006c757600080fd5b8060405250919050565b600067ffffffffffffffff821115620006e957600080fd5b602082029050602081019050919050565b600082825260208201905092915050565b600081905092915050565b600062000723826200072a565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6200076c8162000716565b81146200077857600080fd5b50565b62000786816200074a565b81146200079257600080fd5b50565b620007a08162000754565b8114620007ac57600080fd5b50565b61523380620007bf6000396000f3fe6080604052600436106102885760003560e01c806380ae1c281161015a578063bc5b093f116100c1578063cdb0f73a1161007a578063cdb0f73a14610a08578063d547741f14610a31578063d7a9cd7914610a5a578063db8d55f114610a85578063f179637c14610ab2578063ffaac0eb14610ace57610288565b8063bc5b093f146108f6578063beab713114610921578063c5b37c221461094c578063c5ec897014610977578063ca15c873146109a2578063cb10f215146109df57610288565b8063926d7d7f11610113578063926d7d7f146107e657806395b15e98146108115780639d5773e01461083a5780639d82dd6314610865578063a217fddf1461088e578063a9cf69fa146108b957610288565b806380ae1c28146106c657806384db809f146106dd5780638c0c26311461071a5780639010d07c1461074357806391c404ac1461078057806391d14854146107a957610288565b80634e056005116101fe5780635e1fab0f116101b75780635e1fab0f146105b857806369a8c246146105e15780636a6adbfe1461060a578063780cf004146106355780637febe63f1461065e578063802aabe81461069b57610288565b80634e0560051461049357806350598719146104bc57806353ec4105146104fc578063541d5548146105275780635a1ad87c146105645780635c975abb1461058d57610288565b80632f2ff15d116102505780632f2ff15d1461037557806336568abe1461039e5780633ee7094a146103c75780634454b20d146104045780634603ae381461042d5780634b0b919d1461045657610288565b806305e2ca171461028d578063083132c4146102a957806317f03ce5146102e65780631ff013f11461030f578063248a9ca314610338575b600080fd5b6102a760048036038101906102a29190613b78565b610ae5565b005b3480156102b557600080fd5b506102d060048036038101906102cb9190613b4f565b610d70565b6040516102dd9190614e6d565b60405180910390f35b3480156102f257600080fd5b5061030d60048036038101906103089190613be4565b610da4565b005b34801561031b57600080fd5b5061033660048036038101906103319190613c33565b610f51565b005b34801561034457600080fd5b5061035f600480360381019061035a9190613982565b6116d2565b60405161036c91906148f4565b60405180910390f35b34801561038157600080fd5b5061039c600480360381019061039791906139ab565b6116f2565b005b3480156103aa57600080fd5b506103c560048036038101906103c091906139ab565b611766565b005b3480156103d357600080fd5b506103ee60048036038101906103e99190613a88565b6117e9565b6040516103fb9190614a87565b60405180910390f35b34801561041057600080fd5b5061042b60048036038101906104269190613c96565b6118a6565b005b34801561043957600080fd5b50610454600480360381019061044f91906138e4565b611be7565b005b34801561046257600080fd5b5061047d60048036038101906104789190613b4f565b611c8d565b60405161048a9190614ebf565b60405180910390f35b34801561049f57600080fd5b506104ba60048036038101906104b59190613a23565b611cb4565b005b3480156104c857600080fd5b506104e360048036038101906104de9190613ac4565b611cf3565b6040516104f394939291906149b4565b60405180910390f35b34801561050857600080fd5b50610511611d3d565b60405161051e9190614843565b60405180910390f35b34801561053357600080fd5b5061054e600480360381019061054991906136f2565b611d63565b60405161055b91906148d9565b60405180910390f35b34801561057057600080fd5b5061058b6004803603810190610586919061385b565b611d89565b005b34801561059957600080fd5b506105a2611e64565b6040516105af91906148d9565b60405180910390f35b3480156105c457600080fd5b506105df60048036038101906105da91906136f2565b611e7a565b005b3480156105ed57600080fd5b5061060860048036038101906106039190613a4c565b611e9f565b005b34801561061657600080fd5b5061061f611f6a565b60405161062c9190614e6d565b60405180910390f35b34801561064157600080fd5b5061065c600480360381019061065791906137a9565b611f70565b005b34801561066a57600080fd5b5061068560048036038101906106809190613b00565b611ff3565b60405161069291906148d9565b60405180910390f35b3480156106a757600080fd5b506106b061202f565b6040516106bd9190614e6d565b60405180910390f35b3480156106d257600080fd5b506106db612035565b005b3480156106e957600080fd5b5061070460048036038101906106ff9190613982565b612047565b6040516107119190614843565b60405180910390f35b34801561072657600080fd5b50610741600480360381019061073c919061376d565b61207a565b005b34801561074f57600080fd5b5061076a600480360381019061076591906139e7565b6120f7565b6040516107779190614843565b60405180910390f35b34801561078c57600080fd5b506107a760048036038101906107a29190613a23565b612129565b005b3480156107b557600080fd5b506107d060048036038101906107cb91906139ab565b612180565b6040516107dd91906148d9565b60405180910390f35b3480156107f257600080fd5b506107fb6121b2565b60405161080891906148f4565b60405180910390f35b34801561081d57600080fd5b506108386004803603810190610833919061376d565b6121c9565b005b34801561084657600080fd5b5061084f612246565b60405161085c9190614e6d565b60405180910390f35b34801561087157600080fd5b5061088c600480360381019061088791906136f2565b61224c565b005b34801561089a57600080fd5b506108a3612326565b6040516108b091906148f4565b60405180910390f35b3480156108c557600080fd5b506108e060048036038101906108db9190613be4565b61232d565b6040516108ed9190614e4b565b60405180910390f35b34801561090257600080fd5b5061090b61250e565b6040516109189190614eda565b60405180910390f35b34801561092d57600080fd5b50610936612521565b6040516109439190614eda565b60405180910390f35b34801561095857600080fd5b50610961612534565b60405161096e9190614e6d565b60405180910390f35b34801561098357600080fd5b5061098c61253a565b6040516109999190614e6d565b60405180910390f35b3480156109ae57600080fd5b506109c960048036038101906109c49190613982565b612540565b6040516109d69190614e6d565b60405180910390f35b3480156109eb57600080fd5b50610a066004803603810190610a01919061380c565b612567565b005b348015610a1457600080fd5b50610a2f6004803603810190610a2a91906136f2565b612639565b005b348015610a3d57600080fd5b50610a586004803603810190610a5391906139ab565b612713565b005b348015610a6657600080fd5b50610a6f612787565b604051610a7c9190614e6d565b60405180910390f35b348015610a9157600080fd5b50610a9a61278d565b604051610aa993929190614e88565b60405180910390f35b610acc6004803603810190610ac79190613b78565b6127b3565b005b348015610ada57600080fd5b50610ae3612c75565b005b610aed612c87565b6000600a60009054906101000a900460ff1660ff168560ff161415610b16576009549050610b1c565b60065490505b803414610b5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5590614beb565b60405180910390fd5b6000600c600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610c06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfd90614c6b565b60405180910390fd5b6000600b60008860ff1660ff168152602001908152602001600020600081819054906101000a900467ffffffffffffffff1660010191906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905590508484600d60008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008a60ff1660ff1681526020019081526020016000209190610caf929190613389565b5060008290508073ffffffffffffffffffffffffffffffffffffffff166338995da9888a85338b8b6040518763ffffffff1660e01b8152600401610cf896959493929190614a2b565b600060405180830381600087803b158015610d1257600080fd5b505af1158015610d26573d6000803e3d6000fd5b505050508167ffffffffffffffff16878960ff167fdbb69440df8433824a026ef190652f29929eb64b4d1d5d2a69be8afe3e6eaed860405160405180910390a45050505050505050565b6000600a60009054906101000a900460ff1660ff168260ff161415610d99576009549050610d9f565b60065490505b919050565b610dac612cd8565b60008360ff1660088467ffffffffffffffff1668ffffffffffffffffff16901b1790506000600e60008368ffffffffffffffffff1668ffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000209050600480811115610e1957fe5b8160040160009054906101000a900460ff166004811115610e3657fe5b1415610e77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6e90614c2b565b60405180910390fd5b600754610e88438360050154612d4a565b11610ec8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebf90614cab565b60405180910390fd5b60048160040160006101000a81548160ff02191690836004811115610ee957fe5b0217905550600480811115610efa57fe5b8467ffffffffffffffff168660ff167f803c5a12f6bde629cea32e63d4b92d1b560816a6fb72e939d3c89e1cab65041784600001548560010154604051610f4292919061498b565b60405180910390a45050505050565b610f59612d94565b610f61612c87565b60008460ff1660088567ffffffffffffffff1668ffffffffffffffffff16901b1790506000600e60008368ffffffffffffffffff1668ffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff16600c600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611065576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105c90614e0b565b60405180910390fd5b60018160040160009054906101000a900460ff16600481111561108457fe5b11156110c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bc90614d4b565b60405180910390fd5b600f60008368ffffffffffffffffff1668ffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561118a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118190614b8b565b60405180910390fd5b60008160040160009054906101000a900460ff1660048111156111a957fe5b14156113c957600560008154600101919050819055506040518060c0016040528085815260200184815260200160016040519080825280602002602001820160405280156112065781602001602082028036833780820191505090505b508152602001600060405190808252806020026020018201604052801561123c5781602001602082028036833780820191505090505b5081526020016001600481111561124f57fe5b815260200143815250600e60008468ffffffffffffffffff1668ffffffffffffffffff1681526020019081526020016000206000858152602001908152602001600020600082015181600001556020820151816001015560408201518160020190805190602001906112c2929190613409565b5060608201518160030190805190602001906112df929190613409565b5060808201518160040160006101000a81548160ff0219169083600481111561130457fe5b021790555060a08201518160050155905050338160020160008154811061132757fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600481111561137c57fe5b8567ffffffffffffffff168760ff167f803c5a12f6bde629cea32e63d4b92d1b560816a6fb72e939d3c89e1cab65041787876040516113bc92919061498b565b60405180910390a461150c565b6007546113da438360050154612d4a565b111561145f5760048160040160006101000a81548160ff0219169083600481111561140157fe5b021790555060048081111561141257fe5b8567ffffffffffffffff168760ff167f803c5a12f6bde629cea32e63d4b92d1b560816a6fb72e939d3c89e1cab650417878760405161145292919061498b565b60405180910390a461150b565b806001015483146114a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149c90614deb565b60405180910390fd5b80600201339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b60048081111561151857fe5b8160040160009054906101000a900460ff16600481111561153557fe5b146116ca576001600f60008468ffffffffffffffffff1668ffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508060040160009054906101000a900460ff1660048111156115e757fe5b8567ffffffffffffffff168760ff167f25f8daaa4635a7729927ba3f5b3d59cc3320aca7c32c9db4e7ca7b95743436408760405161162591906148f4565b60405180910390a460016003541115806116485750600354816002018054905010155b156116c95760028160040160006101000a81548160ff0219169083600481111561166e57fe5b02179055506002600481111561168057fe5b8567ffffffffffffffff168760ff167f803c5a12f6bde629cea32e63d4b92d1b560816a6fb72e939d3c89e1cab65041787876040516116c092919061498b565b60405180910390a45b5b505050505050565b600060016000838152602001908152602001600020600201549050919050565b6117196001600084815260200190815260200160002060020154611714612df2565b612180565b611758576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174f90614b6b565b60405180910390fd5b6117628282612dfa565b5050565b61176e612df2565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146117db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d290614e2b565b60405180910390fd5b6117e58282612e8e565b5050565b600d602052816000526040600020602052806000526040600020600091509150508054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561189e5780601f106118735761010080835404028352916020019161189e565b820191906000526020600020905b81548152906001019060200180831161188157829003601f168201915b505050505081565b6118ae612d94565b6118b6612c87565b6000600c600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008660ff1660088767ffffffffffffffff1668ffffffffffffffffff16901b179050600082868660405160200161192893929190614804565b6040516020818303038152906040528051906020012090506000600e60008468ffffffffffffffffff1668ffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002090506000600481111561198b57fe5b8160040160009054906101000a900460ff1660048111156119a857fe5b14156119e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e090614aeb565b60405180910390fd5b600260048111156119f657fe5b8160040160009054906101000a900460ff166004811115611a1357fe5b14611a53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4a90614acb565b60405180910390fd5b80600101548214611a99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9090614c0b565b60405180910390fd5b60038160040160006101000a81548160ff02191690836004811115611aba57fe5b02179055506000600c60008360000154815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663e248cff283600001548a8a6040518463ffffffff1660e01b8152600401611b3c939291906149f9565b600060405180830381600087803b158015611b5657600080fd5b505af1158015611b6a573d6000803e3d6000fd5b505050508160040160009054906101000a900460ff166004811115611b8b57fe5b8967ffffffffffffffff168b60ff167f803c5a12f6bde629cea32e63d4b92d1b560816a6fb72e939d3c89e1cab65041785600001548660010154604051611bd392919061498b565b60405180910390a450505050505050505050565b611bef612f22565b60008090505b84849050811015611c8657848482818110611c0c57fe5b9050602002016020810190611c219190613744565b73ffffffffffffffffffffffffffffffffffffffff166108fc848484818110611c4657fe5b905060200201359081150290604051600060405180830381858888f19350505050158015611c78573d6000803e3d6000fd5b508080600101915050611bf5565b5050505050565b600b6020528060005260406000206000915054906101000a900467ffffffffffffffff1681565b611cbc612f22565b80600381905550807fa20d6b84cd798a24038be305eff8a45ca82ef54a2aa2082005d8e14c0a4746c860405160405180910390a250565b600e602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060040160009054906101000a900460ff16908060050154905084565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000611d82604051611d749061482e565b604051809103902083612180565b9050919050565b611d91612f22565b85600c600087815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008690508073ffffffffffffffffffffffffffffffffffffffff1663de319d9987878787876040518663ffffffff1660e01b8152600401611e29959493929190614938565b600060405180830381600087803b158015611e4357600080fd5b505af1158015611e57573d6000803e3d6000fd5b5050505050505050505050565b60008060009054906101000a900460ff16905090565b611e82612f22565b611e8f6000801b826116f2565b611e9c6000801b33611766565b50565b611ea7612f22565b816009541415611eec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee390614c4b565b60405180910390fd5b8060ff16600a60009054906101000a900460ff1660ff161415611f44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3b90614d8b565b60405180910390fd5b8160098190555080600a60006101000a81548160ff021916908360ff1602179055505050565b60095481565b611f78612f22565b60008490508073ffffffffffffffffffffffffffffffffffffffff1663d9caed128585856040518463ffffffff1660e01b8152600401611fba93929190614879565b600060405180830381600087803b158015611fd457600080fd5b505af1158015611fe8573d6000803e3d6000fd5b505050505050505050565b600f602052826000526040600020602052816000526040600020602052806000526040600020600092509250509054906101000a900460ff1681565b60045481565b61203d612f22565b612045612f70565b565b600c6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612082612f22565b60008290508073ffffffffffffffffffffffffffffffffffffffff166307b7ed99836040518263ffffffff1660e01b81526004016120c09190614843565b600060405180830381600087803b1580156120da57600080fd5b505af11580156120ee573d6000803e3d6000fd5b50505050505050565b60006121218260016000868152602001908152602001600020600001612fcb90919063ffffffff16565b905092915050565b612131612f22565b806006541415612176576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216d90614dcb565b60405180910390fd5b8060068190555050565b60006121aa8260016000868152602001908152602001600020600001612fe590919063ffffffff16565b905092915050565b6040516121be9061482e565b604051809103902081565b6121d1612f22565b60008290508073ffffffffffffffffffffffffffffffffffffffff1663645c8a4b836040518263ffffffff1660e01b815260040161220f9190614843565b600060405180830381600087803b15801561222957600080fd5b505af115801561223d573d6000803e3d6000fd5b50505050505050565b60055481565b612254612f22565b6122716040516122639061482e565b604051809103902082612180565b6122b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a790614bcb565b60405180910390fd5b6122cd6040516122bf9061482e565b604051809103902082612713565b8073ffffffffffffffffffffffffffffffffffffffff167f10e1f7ce9fd7d1b90a66d13a2ab3cb8dd7f29f3f8d520b143b063ccfbab6906b60405160405180910390a26004600081548092919060019003919050555050565b6000801b81565b612335613493565b60008460ff1660088567ffffffffffffffff1668ffffffffffffffffff16901b179050600e60008268ffffffffffffffffff1668ffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000206040518060c001604052908160008201548152602001600182015481526020016002820180548060200260200160405190810160405280929190818152602001828054801561243657602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116123ec575b50505050508152602001600382018054806020026020016040519081016040528092919081815260200182805480156124c457602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161247a575b505050505081526020016004820160009054906101000a900460ff1660048111156124eb57fe5b60048111156124f657fe5b81526020016005820154815250509150509392505050565b600a60009054906101000a900460ff1681565b600260009054906101000a900460ff1681565b60065481565b60075481565b600061256060016000848152602001908152602001600020600001613015565b9050919050565b61256f612f22565b82600c600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008390508073ffffffffffffffffffffffffffffffffffffffff1663b8fa373684846040518363ffffffff1660e01b815260040161260192919061490f565b600060405180830381600087803b15801561261b57600080fd5b505af115801561262f573d6000803e3d6000fd5b5050505050505050565b612641612f22565b61265e6040516126509061482e565b604051809103902082612180565b1561269e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269590614d0b565b60405180910390fd5b6126bb6040516126ad9061482e565b6040518091039020826116f2565b8073ffffffffffffffffffffffffffffffffffffffff167f03580ee9f53a62b7cb409a2cb56f9be87747dd15017afc5cef6eef321e4fb2c560405160405180910390a260046000815480929190600101919050555050565b61273a6001600084815260200190815260200160002060020154612735612df2565b612180565b612779576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277090614c8b565b60405180910390fd5b6127838282612e8e565b5050565b60035481565b6000806000600654600954600a60009054906101000a900460ff16925092509250909192565b6127bb612c87565b6000600a60009054906101000a900460ff1660ff168560ff1614156127e45760095490506127ea565b60065490505b8034101561282d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282490614d2b565b60405180910390fd5b6000600c600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156128d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128cc90614c6b565b60405180910390fd5b6000823403905060006084359050818114612925576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291c90614b2b565b60405180910390fd5b60008373ffffffffffffffffffffffffffffffffffffffff166353ec41056040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561296f57600080fd5b505af1158015612983573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129a7919061371b565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612a19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1090614ceb565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0846040518263ffffffff1660e01b81526004016000604051808303818588803b158015612a6157600080fd5b505af1158015612a75573d6000803e3d6000fd5b50505050508073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85856040518363ffffffff1660e01b8152600401612ab59291906148b0565b602060405180830381600087803b158015612acf57600080fd5b505af1158015612ae3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b079190613959565b506000600b60008b60ff1660ff168152602001908152602001600020600081819054906101000a900467ffffffffffffffff1660010191906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905590508787600d60008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008d60ff1660ff1681526020019081526020016000209190612bb1929190613389565b5060008590508073ffffffffffffffffffffffffffffffffffffffff166338995da98b8d85338e8e6040518763ffffffff1660e01b8152600401612bfa96959493929190614a2b565b600060405180830381600087803b158015612c1457600080fd5b505af1158015612c28573d6000803e3d6000fd5b505050508167ffffffffffffffff168a8c60ff167fdbb69440df8433824a026ef190652f29929eb64b4d1d5d2a69be8afe3e6eaed860405160405180910390a45050505050505050505050565b612c7d612f22565b612c8561302a565b565b6000809054906101000a900460ff1615612cd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ccd90614ccb565b60405180910390fd5b565b612ce56000801b33612180565b80612d095750612d08604051612cfa9061482e565b604051809103902033612180565b5b612d48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3f90614b4b565b60405180910390fd5b565b6000612d8c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613085565b905092915050565b612db1604051612da39061482e565b604051809103902033612180565b612df0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612de790614d6b565b60405180910390fd5b565b600033905090565b612e2281600160008581526020019081526020016000206000016130e090919063ffffffff16565b15612e8a57612e2f612df2565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b612eb6816001600085815260200190815260200160002060000161311090919063ffffffff16565b15612f1e57612ec3612df2565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b612f2f6000801b33612180565b612f6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f6590614dab565b60405180910390fd5b565b612f78612c87565b60016000806101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833604051612fc1919061485e565b60405180910390a1565b6000612fda8360000183613140565b60001c905092915050565b600061300d836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6131ad565b905092915050565b6000613023826000016131d0565b9050919050565b6130326131e1565b60008060006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa3360405161307b919061485e565b60405180910390a1565b60008383111582906130cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130c49190614aa9565b60405180910390fd5b5060008385039050809150509392505050565b6000613108836000018373ffffffffffffffffffffffffffffffffffffffff1660001b613231565b905092915050565b6000613138836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6132a1565b905092915050565b60008183600001805490501161318b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161318290614b0b565b60405180910390fd5b82600001828154811061319a57fe5b9060005260206000200154905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b600081600001805490509050919050565b6000809054906101000a900460ff1661322f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161322690614bab565b60405180910390fd5b565b600061323d83836131ad565b61329657826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905061329b565b600090505b92915050565b6000808360010160008481526020019081526020016000205490506000811461337d57600060018203905060006001866000018054905003905060008660000182815481106132ec57fe5b906000526020600020015490508087600001848154811061330957fe5b906000526020600020018190555060018301876001016000838152602001908152602001600020819055508660000180548061334157fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050613383565b60009150505b92915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106133ca57803560ff19168380011785556133f8565b828001600101855582156133f8579182015b828111156133f75782358255916020019190600101906133dc565b5b50905061340591906134da565b5090565b828054828255906000526020600020908101928215613482579160200282015b828111156134815782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190613429565b5b50905061348f91906134ff565b5090565b6040518060c0016040528060008019168152602001600080191681526020016060815260200160608152602001600060048111156134cd57fe5b8152602001600081525090565b6134fc91905b808211156134f85760008160009055506001016134e0565b5090565b90565b61353f91905b8082111561353b57600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550600101613505565b5090565b90565b6000813590506135518161512e565b92915050565b6000815190506135668161512e565b92915050565b60008135905061357b81615145565b92915050565b60008083601f84011261359357600080fd5b8235905067ffffffffffffffff8111156135ac57600080fd5b6020830191508360208202830111156135c457600080fd5b9250929050565b60008083601f8401126135dd57600080fd5b8235905067ffffffffffffffff8111156135f657600080fd5b60208301915083602082028301111561360e57600080fd5b9250929050565b6000815190506136248161515c565b92915050565b60008135905061363981615173565b92915050565b60008135905061364e8161518a565b92915050565b60008083601f84011261366657600080fd5b8235905067ffffffffffffffff81111561367f57600080fd5b60208301915083600182028301111561369757600080fd5b9250929050565b6000813590506136ad816151a1565b92915050565b6000813590506136c2816151b8565b92915050565b6000813590506136d7816151cf565b92915050565b6000813590506136ec816151e6565b92915050565b60006020828403121561370457600080fd5b600061371284828501613542565b91505092915050565b60006020828403121561372d57600080fd5b600061373b84828501613557565b91505092915050565b60006020828403121561375657600080fd5b60006137648482850161356c565b91505092915050565b6000806040838503121561378057600080fd5b600061378e85828601613542565b925050602061379f85828601613542565b9150509250929050565b600080600080608085870312156137bf57600080fd5b60006137cd87828801613542565b94505060206137de87828801613542565b93505060406137ef87828801613542565b92505060606138008782880161369e565b91505092959194509250565b60008060006060848603121561382157600080fd5b600061382f86828701613542565b93505060206138408682870161362a565b925050604061385186828701613542565b9150509250925092565b60008060008060008060c0878903121561387457600080fd5b600061388289828a01613542565b965050602061389389828a0161362a565b95505060406138a489828a01613542565b94505060606138b589828a0161363f565b93505060806138c689828a0161369e565b92505060a06138d789828a0161363f565b9150509295509295509295565b600080600080604085870312156138fa57600080fd5b600085013567ffffffffffffffff81111561391457600080fd5b61392087828801613581565b9450945050602085013567ffffffffffffffff81111561393f57600080fd5b61394b878288016135cb565b925092505092959194509250565b60006020828403121561396b57600080fd5b600061397984828501613615565b91505092915050565b60006020828403121561399457600080fd5b60006139a28482850161362a565b91505092915050565b600080604083850312156139be57600080fd5b60006139cc8582860161362a565b92505060206139dd85828601613542565b9150509250929050565b600080604083850312156139fa57600080fd5b6000613a088582860161362a565b9250506020613a198582860161369e565b9150509250929050565b600060208284031215613a3557600080fd5b6000613a438482850161369e565b91505092915050565b60008060408385031215613a5f57600080fd5b6000613a6d8582860161369e565b9250506020613a7e858286016136dd565b9150509250929050565b60008060408385031215613a9b57600080fd5b6000613aa9858286016136b3565b9250506020613aba858286016136dd565b9150509250929050565b60008060408385031215613ad757600080fd5b6000613ae5858286016136c8565b9250506020613af68582860161362a565b9150509250929050565b600080600060608486031215613b1557600080fd5b6000613b23868287016136c8565b9350506020613b348682870161362a565b9250506040613b4586828701613542565b9150509250925092565b600060208284031215613b6157600080fd5b6000613b6f848285016136dd565b91505092915050565b60008060008060608587031215613b8e57600080fd5b6000613b9c878288016136dd565b9450506020613bad8782880161362a565b935050604085013567ffffffffffffffff811115613bca57600080fd5b613bd687828801613654565b925092505092959194509250565b600080600060608486031215613bf957600080fd5b6000613c07868287016136dd565b9350506020613c18868287016136b3565b9250506040613c298682870161362a565b9150509250925092565b60008060008060808587031215613c4957600080fd5b6000613c57878288016136dd565b9450506020613c68878288016136b3565b9350506040613c798782880161362a565b9250506060613c8a8782880161362a565b91505092959194509250565b600080600080600060808688031215613cae57600080fd5b6000613cbc888289016136dd565b9550506020613ccd888289016136b3565b945050604086013567ffffffffffffffff811115613cea57600080fd5b613cf688828901613654565b93509350506060613d098882890161362a565b9150509295509295909350565b6000613d228383613d3d565b60208301905092915050565b613d3781615055565b82525050565b613d4681614f7c565b82525050565b613d5581614f7c565b82525050565b613d6c613d6782614f7c565b6150df565b82525050565b6000613d7d82614f05565b613d878185614f33565b9350613d9283614ef5565b8060005b83811015613dc3578151613daa8882613d16565b9750613db583614f26565b925050600181019050613d96565b5085935050505092915050565b613dd981614fa0565b82525050565b613de881614fac565b82525050565b613df781614fac565b82525050565b613e0681614fb6565b82525050565b6000613e188385614f44565b9350613e2583858461509d565b613e2e83615103565b840190509392505050565b6000613e458385614f55565b9350613e5283858461509d565b82840190509392505050565b6000613e6982614f10565b613e738185614f44565b9350613e838185602086016150ac565b613e8c81615103565b840191505092915050565b613ea081615067565b82525050565b613eaf81615067565b82525050565b6000613ec082614f1b565b613eca8185614f60565b9350613eda8185602086016150ac565b613ee381615103565b840191505092915050565b6000613efb601c83614f60565b91507f70726f706f73616c20616c7265616479207472616e73666572726564000000006000830152602082019050919050565b6000613f3b601683614f60565b91507f70726f706f73616c206973206e6f7420616374697665000000000000000000006000830152602082019050919050565b6000613f7b602283614f60565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613fe1601d83614f60565b91507f6d73672e76616c756520616e642064617461206d69736d6174636865640000006000830152602082019050919050565b6000614021601e83614f60565b91507f73656e646572206973206e6f742072656c61796572206f722061646d696e00006000830152602082019050919050565b6000614061602f83614f60565b91507f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60008301527f2061646d696e20746f206772616e7400000000000000000000000000000000006020830152604082019050919050565b60006140c7601583614f60565b91507f72656c6179657220616c726561647920766f74656400000000000000000000006000830152602082019050919050565b6000614107601483614f60565b91507f5061757361626c653a206e6f74207061757365640000000000000000000000006000830152602082019050919050565b6000614147601f83614f60565b91507f6164647220646f65736e277420686176652072656c6179657220726f6c6521006000830152602082019050919050565b6000614187601683614f60565b91507f496e636f72726563742066656520737570706c696564000000000000000000006000830152602082019050919050565b60006141c7601b83614f60565b91507f6461746120646f65736e2774206d6174636820646174616861736800000000006000830152602082019050919050565b6000614207601a83614f60565b91507f50726f706f73616c20616c72656164792063616e63656c6c65640000000000006000830152602082019050919050565b6000614247602783614f60565b91507f43757272656e74207370656369616c2066656520697320657175616c20746f2060008301527f6e657720666565000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142ad602083614f60565b91507f7265736f757263654944206e6f74206d617070656420746f2068616e646c65726000830152602082019050919050565b60006142ed603083614f60565b91507f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60008301527f2061646d696e20746f207265766f6b65000000000000000000000000000000006020830152604082019050919050565b6000614353602083614f60565b91507f50726f706f73616c206e6f7420617420657870697279207468726573686f6c646000830152602082019050919050565b6000614393601083614f60565b91507f5061757361626c653a20706175736564000000000000000000000000000000006000830152602082019050919050565b60006143d3601483614f60565b91507f5f77746f6b656e416464726573732069732030780000000000000000000000006000830152602082019050919050565b6000614413601e83614f60565b91507f6164647220616c7265616479206861732072656c6179657220726f6c652100006000830152602082019050919050565b6000614453601983614f60565b91507f496e73756666696369656e742066656520737570706c696564000000000000006000830152602082019050919050565b6000614493602a83614f60565b91507f70726f706f73616c20616c7265616479207061737365642f657865637574656460008301527f2f63616e63656c6c6564000000000000000000000000000000000000000000006020830152604082019050919050565b60006144f9602083614f60565b91507f73656e64657220646f65736e277420686176652072656c6179657220726f6c656000830152602082019050919050565b6000614539603183614f60565b91507f43757272656e74207370656369616c466565436861696e49442069732065717560008301527f616c20746f206e657720636861696e49440000000000000000000000000000006020830152604082019050919050565b600061459f601e83614f60565b91507f73656e64657220646f65736e277420686176652061646d696e20726f6c6500006000830152602082019050919050565b60006145df601f83614f60565b91507f43757272656e742066656520697320657175616c20746f206e657720666565006000830152602082019050919050565b600061461f600c83614f71565b91507f52454c415945525f524f4c4500000000000000000000000000000000000000006000830152600c82019050919050565b600061465f601183614f60565b91507f6461746168617368206d69736d617463680000000000000000000000000000006000830152602082019050919050565b600061469f601983614f60565b91507f6e6f2068616e646c657220666f72207265736f757263654944000000000000006000830152602082019050919050565b60006146df602f83614f60565b91507f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008301527f20726f6c657320666f722073656c6600000000000000000000000000000000006020830152604082019050919050565b600060c0830160008301516147506000860182613ddf565b5060208301516147636020860182613ddf565b506040830151848203604086015261477b8282613d72565b915050606083015184820360608601526147958282613d72565b91505060808301516147aa6080860182613e97565b5060a08301516147bd60a08601826147c8565b508091505092915050565b6147d181615015565b82525050565b6147e081615015565b82525050565b6147ef8161501f565b82525050565b6147fe81615048565b82525050565b60006148108286613d5b565b601482019150614821828486613e39565b9150819050949350505050565b600061483982614612565b9150819050919050565b60006020820190506148586000830184613d4c565b92915050565b60006020820190506148736000830184613d2e565b92915050565b600060608201905061488e6000830186613d4c565b61489b6020830185613d4c565b6148a860408301846147d7565b949350505050565b60006040820190506148c56000830185613d4c565b6148d260208301846147d7565b9392505050565b60006020820190506148ee6000830184613dd0565b92915050565b60006020820190506149096000830184613dee565b92915050565b60006040820190506149246000830185613dee565b6149316020830184613d4c565b9392505050565b600060a08201905061494d6000830188613dee565b61495a6020830187613d4c565b6149676040830186613dfd565b61497460608301856147d7565b6149816080830184613dfd565b9695505050505050565b60006040820190506149a06000830185613dee565b6149ad6020830184613dee565b9392505050565b60006080820190506149c96000830187613dee565b6149d66020830186613dee565b6149e36040830185613ea6565b6149f060608301846147d7565b95945050505050565b6000604082019050614a0e6000830186613dee565b8181036020830152614a21818486613e0c565b9050949350505050565b600060a082019050614a406000830189613dee565b614a4d60208301886147f5565b614a5a60408301876147e6565b614a676060830186613d2e565b8181036080830152614a7a818486613e0c565b9050979650505050505050565b60006020820190508181036000830152614aa18184613e5e565b905092915050565b60006020820190508181036000830152614ac38184613eb5565b905092915050565b60006020820190508181036000830152614ae481613eee565b9050919050565b60006020820190508181036000830152614b0481613f2e565b9050919050565b60006020820190508181036000830152614b2481613f6e565b9050919050565b60006020820190508181036000830152614b4481613fd4565b9050919050565b60006020820190508181036000830152614b6481614014565b9050919050565b60006020820190508181036000830152614b8481614054565b9050919050565b60006020820190508181036000830152614ba4816140ba565b9050919050565b60006020820190508181036000830152614bc4816140fa565b9050919050565b60006020820190508181036000830152614be48161413a565b9050919050565b60006020820190508181036000830152614c048161417a565b9050919050565b60006020820190508181036000830152614c24816141ba565b9050919050565b60006020820190508181036000830152614c44816141fa565b9050919050565b60006020820190508181036000830152614c648161423a565b9050919050565b60006020820190508181036000830152614c84816142a0565b9050919050565b60006020820190508181036000830152614ca4816142e0565b9050919050565b60006020820190508181036000830152614cc481614346565b9050919050565b60006020820190508181036000830152614ce481614386565b9050919050565b60006020820190508181036000830152614d04816143c6565b9050919050565b60006020820190508181036000830152614d2481614406565b9050919050565b60006020820190508181036000830152614d4481614446565b9050919050565b60006020820190508181036000830152614d6481614486565b9050919050565b60006020820190508181036000830152614d84816144ec565b9050919050565b60006020820190508181036000830152614da48161452c565b9050919050565b60006020820190508181036000830152614dc481614592565b9050919050565b60006020820190508181036000830152614de4816145d2565b9050919050565b60006020820190508181036000830152614e0481614652565b9050919050565b60006020820190508181036000830152614e2481614692565b9050919050565b60006020820190508181036000830152614e44816146d2565b9050919050565b60006020820190508181036000830152614e658184614738565b905092915050565b6000602082019050614e8260008301846147d7565b92915050565b6000606082019050614e9d60008301866147d7565b614eaa60208301856147d7565b614eb760408301846147f5565b949350505050565b6000602082019050614ed460008301846147e6565b92915050565b6000602082019050614eef60008301846147f5565b92915050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614f8782614ff5565b9050919050565b6000614f9982614ff5565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000819050614ff082615121565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b600068ffffffffffffffffff82169050919050565b600060ff82169050919050565b600061506082615079565b9050919050565b600061507282614fe2565b9050919050565b60006150848261508b565b9050919050565b600061509682614ff5565b9050919050565b82818337600083830152505050565b60005b838110156150ca5780820151818401526020810190506150af565b838111156150d9576000848401525b50505050565b60006150ea826150f1565b9050919050565b60006150fc82615114565b9050919050565b6000601f19601f8301169050919050565b60008160601b9050919050565b6005811061512b57fe5b50565b61513781614f7c565b811461514257600080fd5b50565b61514e81614f8e565b811461515957600080fd5b50565b61516581614fa0565b811461517057600080fd5b50565b61517c81614fac565b811461518757600080fd5b50565b61519381614fb6565b811461519e57600080fd5b50565b6151aa81615015565b81146151b557600080fd5b50565b6151c18161501f565b81146151cc57600080fd5b50565b6151d881615033565b81146151e357600080fd5b50565b6151ef81615048565b81146151fa57600080fd5b5056fea2646970667358221220369810edc3f330ad2d2fe0dcdb1122fd8ceda793c93711cfbf843d46149a30a264736f6c63430006040033"; diff --git a/src/Contracts/GenericHandler.d.ts b/src/Contracts/GenericHandler.d.ts new file mode 100644 index 00000000..8d81c048 --- /dev/null +++ b/src/Contracts/GenericHandler.d.ts @@ -0,0 +1,1016 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { + ethers, + EventFilter, + Signer, + BigNumber, + BigNumberish, + PopulatedTransaction, +} from "ethers"; +import { + Contract, + ContractTransaction, + Overrides, + CallOverrides, +} from "@ethersproject/contracts"; +import { BytesLike } from "@ethersproject/bytes"; +import { Listener, Provider } from "@ethersproject/providers"; +import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; +import { TypedEventFilter, TypedEvent, TypedListener } from "./commons"; + +interface GenericHandlerInterface extends ethers.utils.Interface { + functions: { + "_bridgeAddress()": FunctionFragment; + "_contractAddressToDepositFunctionDepositerOffset(address)": FunctionFragment; + "_contractAddressToDepositFunctionSignature(address)": FunctionFragment; + "_contractAddressToExecuteFunctionSignature(address)": FunctionFragment; + "_contractAddressToResourceID(address)": FunctionFragment; + "_contractWhitelist(address)": FunctionFragment; + "_depositRecords(uint8,uint64)": FunctionFragment; + "_resourceIDToContractAddress(bytes32)": FunctionFragment; + "deposit(bytes32,uint8,uint64,address,bytes)": FunctionFragment; + "executeProposal(bytes32,bytes)": FunctionFragment; + "getDepositRecord(uint64,uint8)": FunctionFragment; + "setResource(bytes32,address,bytes4,uint256,bytes4)": FunctionFragment; + "updateBridgeAddress(address)": FunctionFragment; + }; + + encodeFunctionData( + functionFragment: "_bridgeAddress", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "_contractAddressToDepositFunctionDepositerOffset", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "_contractAddressToDepositFunctionSignature", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "_contractAddressToExecuteFunctionSignature", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "_contractAddressToResourceID", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "_contractWhitelist", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "_depositRecords", + values: [BigNumberish, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "_resourceIDToContractAddress", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "deposit", + values: [BytesLike, BigNumberish, BigNumberish, string, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "executeProposal", + values: [BytesLike, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "getDepositRecord", + values: [BigNumberish, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "setResource", + values: [BytesLike, string, BytesLike, BigNumberish, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "updateBridgeAddress", + values: [string] + ): string; + + decodeFunctionResult( + functionFragment: "_bridgeAddress", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "_contractAddressToDepositFunctionDepositerOffset", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "_contractAddressToDepositFunctionSignature", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "_contractAddressToExecuteFunctionSignature", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "_contractAddressToResourceID", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "_contractWhitelist", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "_depositRecords", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "_resourceIDToContractAddress", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "deposit", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "executeProposal", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getDepositRecord", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setResource", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "updateBridgeAddress", + data: BytesLike + ): Result; + + events: {}; +} + +export class GenericHandler extends Contract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + listeners, EventArgsObject>( + eventFilter?: TypedEventFilter + ): Array>; + off, EventArgsObject>( + eventFilter: TypedEventFilter, + listener: TypedListener + ): this; + on, EventArgsObject>( + eventFilter: TypedEventFilter, + listener: TypedListener + ): this; + once, EventArgsObject>( + eventFilter: TypedEventFilter, + listener: TypedListener + ): this; + removeListener, EventArgsObject>( + eventFilter: TypedEventFilter, + listener: TypedListener + ): this; + removeAllListeners, EventArgsObject>( + eventFilter: TypedEventFilter + ): this; + + listeners(eventName?: string): Array; + off(eventName: string, listener: Listener): this; + on(eventName: string, listener: Listener): this; + once(eventName: string, listener: Listener): this; + removeListener(eventName: string, listener: Listener): this; + removeAllListeners(eventName?: string): this; + + queryFilter, EventArgsObject>( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + interface: GenericHandlerInterface; + + functions: { + _bridgeAddress(overrides?: CallOverrides): Promise<[string]>; + + "_bridgeAddress()"(overrides?: CallOverrides): Promise<[string]>; + + _contractAddressToDepositFunctionDepositerOffset( + arg0: string, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + "_contractAddressToDepositFunctionDepositerOffset(address)"( + arg0: string, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + _contractAddressToDepositFunctionSignature( + arg0: string, + overrides?: CallOverrides + ): Promise<[string]>; + + "_contractAddressToDepositFunctionSignature(address)"( + arg0: string, + overrides?: CallOverrides + ): Promise<[string]>; + + _contractAddressToExecuteFunctionSignature( + arg0: string, + overrides?: CallOverrides + ): Promise<[string]>; + + "_contractAddressToExecuteFunctionSignature(address)"( + arg0: string, + overrides?: CallOverrides + ): Promise<[string]>; + + _contractAddressToResourceID( + arg0: string, + overrides?: CallOverrides + ): Promise<[string]>; + + "_contractAddressToResourceID(address)"( + arg0: string, + overrides?: CallOverrides + ): Promise<[string]>; + + _contractWhitelist( + arg0: string, + overrides?: CallOverrides + ): Promise<[boolean]>; + + "_contractWhitelist(address)"( + arg0: string, + overrides?: CallOverrides + ): Promise<[boolean]>; + + _depositRecords( + arg0: BigNumberish, + arg1: BigNumberish, + overrides?: CallOverrides + ): Promise< + [number, string, string, string] & { + _destinationChainID: number; + _depositer: string; + _resourceID: string; + _metaData: string; + } + >; + + "_depositRecords(uint8,uint64)"( + arg0: BigNumberish, + arg1: BigNumberish, + overrides?: CallOverrides + ): Promise< + [number, string, string, string] & { + _destinationChainID: number; + _depositer: string; + _resourceID: string; + _metaData: string; + } + >; + + _resourceIDToContractAddress( + arg0: BytesLike, + overrides?: CallOverrides + ): Promise<[string]>; + + "_resourceIDToContractAddress(bytes32)"( + arg0: BytesLike, + overrides?: CallOverrides + ): Promise<[string]>; + + deposit( + resourceID: BytesLike, + destinationChainID: BigNumberish, + depositNonce: BigNumberish, + depositer: string, + data: BytesLike, + overrides?: Overrides + ): Promise; + + "deposit(bytes32,uint8,uint64,address,bytes)"( + resourceID: BytesLike, + destinationChainID: BigNumberish, + depositNonce: BigNumberish, + depositer: string, + data: BytesLike, + overrides?: Overrides + ): Promise; + + executeProposal( + resourceID: BytesLike, + data: BytesLike, + overrides?: Overrides + ): Promise; + + "executeProposal(bytes32,bytes)"( + resourceID: BytesLike, + data: BytesLike, + overrides?: Overrides + ): Promise; + + getDepositRecord( + depositNonce: BigNumberish, + destId: BigNumberish, + overrides?: CallOverrides + ): Promise< + [ + [number, string, string, string] & { + _destinationChainID: number; + _depositer: string; + _resourceID: string; + _metaData: string; + } + ] + >; + + "getDepositRecord(uint64,uint8)"( + depositNonce: BigNumberish, + destId: BigNumberish, + overrides?: CallOverrides + ): Promise< + [ + [number, string, string, string] & { + _destinationChainID: number; + _depositer: string; + _resourceID: string; + _metaData: string; + } + ] + >; + + setResource( + resourceID: BytesLike, + contractAddress: string, + depositFunctionSig: BytesLike, + depositFunctionDepositerOffset: BigNumberish, + executeFunctionSig: BytesLike, + overrides?: Overrides + ): Promise; + + "setResource(bytes32,address,bytes4,uint256,bytes4)"( + resourceID: BytesLike, + contractAddress: string, + depositFunctionSig: BytesLike, + depositFunctionDepositerOffset: BigNumberish, + executeFunctionSig: BytesLike, + overrides?: Overrides + ): Promise; + + updateBridgeAddress( + newBridgeAddress: string, + overrides?: Overrides + ): Promise; + + "updateBridgeAddress(address)"( + newBridgeAddress: string, + overrides?: Overrides + ): Promise; + }; + + _bridgeAddress(overrides?: CallOverrides): Promise; + + "_bridgeAddress()"(overrides?: CallOverrides): Promise; + + _contractAddressToDepositFunctionDepositerOffset( + arg0: string, + overrides?: CallOverrides + ): Promise; + + "_contractAddressToDepositFunctionDepositerOffset(address)"( + arg0: string, + overrides?: CallOverrides + ): Promise; + + _contractAddressToDepositFunctionSignature( + arg0: string, + overrides?: CallOverrides + ): Promise; + + "_contractAddressToDepositFunctionSignature(address)"( + arg0: string, + overrides?: CallOverrides + ): Promise; + + _contractAddressToExecuteFunctionSignature( + arg0: string, + overrides?: CallOverrides + ): Promise; + + "_contractAddressToExecuteFunctionSignature(address)"( + arg0: string, + overrides?: CallOverrides + ): Promise; + + _contractAddressToResourceID( + arg0: string, + overrides?: CallOverrides + ): Promise; + + "_contractAddressToResourceID(address)"( + arg0: string, + overrides?: CallOverrides + ): Promise; + + _contractWhitelist(arg0: string, overrides?: CallOverrides): Promise; + + "_contractWhitelist(address)"( + arg0: string, + overrides?: CallOverrides + ): Promise; + + _depositRecords( + arg0: BigNumberish, + arg1: BigNumberish, + overrides?: CallOverrides + ): Promise< + [number, string, string, string] & { + _destinationChainID: number; + _depositer: string; + _resourceID: string; + _metaData: string; + } + >; + + "_depositRecords(uint8,uint64)"( + arg0: BigNumberish, + arg1: BigNumberish, + overrides?: CallOverrides + ): Promise< + [number, string, string, string] & { + _destinationChainID: number; + _depositer: string; + _resourceID: string; + _metaData: string; + } + >; + + _resourceIDToContractAddress( + arg0: BytesLike, + overrides?: CallOverrides + ): Promise; + + "_resourceIDToContractAddress(bytes32)"( + arg0: BytesLike, + overrides?: CallOverrides + ): Promise; + + deposit( + resourceID: BytesLike, + destinationChainID: BigNumberish, + depositNonce: BigNumberish, + depositer: string, + data: BytesLike, + overrides?: Overrides + ): Promise; + + "deposit(bytes32,uint8,uint64,address,bytes)"( + resourceID: BytesLike, + destinationChainID: BigNumberish, + depositNonce: BigNumberish, + depositer: string, + data: BytesLike, + overrides?: Overrides + ): Promise; + + executeProposal( + resourceID: BytesLike, + data: BytesLike, + overrides?: Overrides + ): Promise; + + "executeProposal(bytes32,bytes)"( + resourceID: BytesLike, + data: BytesLike, + overrides?: Overrides + ): Promise; + + getDepositRecord( + depositNonce: BigNumberish, + destId: BigNumberish, + overrides?: CallOverrides + ): Promise< + [number, string, string, string] & { + _destinationChainID: number; + _depositer: string; + _resourceID: string; + _metaData: string; + } + >; + + "getDepositRecord(uint64,uint8)"( + depositNonce: BigNumberish, + destId: BigNumberish, + overrides?: CallOverrides + ): Promise< + [number, string, string, string] & { + _destinationChainID: number; + _depositer: string; + _resourceID: string; + _metaData: string; + } + >; + + setResource( + resourceID: BytesLike, + contractAddress: string, + depositFunctionSig: BytesLike, + depositFunctionDepositerOffset: BigNumberish, + executeFunctionSig: BytesLike, + overrides?: Overrides + ): Promise; + + "setResource(bytes32,address,bytes4,uint256,bytes4)"( + resourceID: BytesLike, + contractAddress: string, + depositFunctionSig: BytesLike, + depositFunctionDepositerOffset: BigNumberish, + executeFunctionSig: BytesLike, + overrides?: Overrides + ): Promise; + + updateBridgeAddress( + newBridgeAddress: string, + overrides?: Overrides + ): Promise; + + "updateBridgeAddress(address)"( + newBridgeAddress: string, + overrides?: Overrides + ): Promise; + + callStatic: { + _bridgeAddress(overrides?: CallOverrides): Promise; + + "_bridgeAddress()"(overrides?: CallOverrides): Promise; + + _contractAddressToDepositFunctionDepositerOffset( + arg0: string, + overrides?: CallOverrides + ): Promise; + + "_contractAddressToDepositFunctionDepositerOffset(address)"( + arg0: string, + overrides?: CallOverrides + ): Promise; + + _contractAddressToDepositFunctionSignature( + arg0: string, + overrides?: CallOverrides + ): Promise; + + "_contractAddressToDepositFunctionSignature(address)"( + arg0: string, + overrides?: CallOverrides + ): Promise; + + _contractAddressToExecuteFunctionSignature( + arg0: string, + overrides?: CallOverrides + ): Promise; + + "_contractAddressToExecuteFunctionSignature(address)"( + arg0: string, + overrides?: CallOverrides + ): Promise; + + _contractAddressToResourceID( + arg0: string, + overrides?: CallOverrides + ): Promise; + + "_contractAddressToResourceID(address)"( + arg0: string, + overrides?: CallOverrides + ): Promise; + + _contractWhitelist( + arg0: string, + overrides?: CallOverrides + ): Promise; + + "_contractWhitelist(address)"( + arg0: string, + overrides?: CallOverrides + ): Promise; + + _depositRecords( + arg0: BigNumberish, + arg1: BigNumberish, + overrides?: CallOverrides + ): Promise< + [number, string, string, string] & { + _destinationChainID: number; + _depositer: string; + _resourceID: string; + _metaData: string; + } + >; + + "_depositRecords(uint8,uint64)"( + arg0: BigNumberish, + arg1: BigNumberish, + overrides?: CallOverrides + ): Promise< + [number, string, string, string] & { + _destinationChainID: number; + _depositer: string; + _resourceID: string; + _metaData: string; + } + >; + + _resourceIDToContractAddress( + arg0: BytesLike, + overrides?: CallOverrides + ): Promise; + + "_resourceIDToContractAddress(bytes32)"( + arg0: BytesLike, + overrides?: CallOverrides + ): Promise; + + deposit( + resourceID: BytesLike, + destinationChainID: BigNumberish, + depositNonce: BigNumberish, + depositer: string, + data: BytesLike, + overrides?: CallOverrides + ): Promise; + + "deposit(bytes32,uint8,uint64,address,bytes)"( + resourceID: BytesLike, + destinationChainID: BigNumberish, + depositNonce: BigNumberish, + depositer: string, + data: BytesLike, + overrides?: CallOverrides + ): Promise; + + executeProposal( + resourceID: BytesLike, + data: BytesLike, + overrides?: CallOverrides + ): Promise; + + "executeProposal(bytes32,bytes)"( + resourceID: BytesLike, + data: BytesLike, + overrides?: CallOverrides + ): Promise; + + getDepositRecord( + depositNonce: BigNumberish, + destId: BigNumberish, + overrides?: CallOverrides + ): Promise< + [number, string, string, string] & { + _destinationChainID: number; + _depositer: string; + _resourceID: string; + _metaData: string; + } + >; + + "getDepositRecord(uint64,uint8)"( + depositNonce: BigNumberish, + destId: BigNumberish, + overrides?: CallOverrides + ): Promise< + [number, string, string, string] & { + _destinationChainID: number; + _depositer: string; + _resourceID: string; + _metaData: string; + } + >; + + setResource( + resourceID: BytesLike, + contractAddress: string, + depositFunctionSig: BytesLike, + depositFunctionDepositerOffset: BigNumberish, + executeFunctionSig: BytesLike, + overrides?: CallOverrides + ): Promise; + + "setResource(bytes32,address,bytes4,uint256,bytes4)"( + resourceID: BytesLike, + contractAddress: string, + depositFunctionSig: BytesLike, + depositFunctionDepositerOffset: BigNumberish, + executeFunctionSig: BytesLike, + overrides?: CallOverrides + ): Promise; + + updateBridgeAddress( + newBridgeAddress: string, + overrides?: CallOverrides + ): Promise; + + "updateBridgeAddress(address)"( + newBridgeAddress: string, + overrides?: CallOverrides + ): Promise; + }; + + filters: {}; + + estimateGas: { + _bridgeAddress(overrides?: CallOverrides): Promise; + + "_bridgeAddress()"(overrides?: CallOverrides): Promise; + + _contractAddressToDepositFunctionDepositerOffset( + arg0: string, + overrides?: CallOverrides + ): Promise; + + "_contractAddressToDepositFunctionDepositerOffset(address)"( + arg0: string, + overrides?: CallOverrides + ): Promise; + + _contractAddressToDepositFunctionSignature( + arg0: string, + overrides?: CallOverrides + ): Promise; + + "_contractAddressToDepositFunctionSignature(address)"( + arg0: string, + overrides?: CallOverrides + ): Promise; + + _contractAddressToExecuteFunctionSignature( + arg0: string, + overrides?: CallOverrides + ): Promise; + + "_contractAddressToExecuteFunctionSignature(address)"( + arg0: string, + overrides?: CallOverrides + ): Promise; + + _contractAddressToResourceID( + arg0: string, + overrides?: CallOverrides + ): Promise; + + "_contractAddressToResourceID(address)"( + arg0: string, + overrides?: CallOverrides + ): Promise; + + _contractWhitelist( + arg0: string, + overrides?: CallOverrides + ): Promise; + + "_contractWhitelist(address)"( + arg0: string, + overrides?: CallOverrides + ): Promise; + + _depositRecords( + arg0: BigNumberish, + arg1: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "_depositRecords(uint8,uint64)"( + arg0: BigNumberish, + arg1: BigNumberish, + overrides?: CallOverrides + ): Promise; + + _resourceIDToContractAddress( + arg0: BytesLike, + overrides?: CallOverrides + ): Promise; + + "_resourceIDToContractAddress(bytes32)"( + arg0: BytesLike, + overrides?: CallOverrides + ): Promise; + + deposit( + resourceID: BytesLike, + destinationChainID: BigNumberish, + depositNonce: BigNumberish, + depositer: string, + data: BytesLike, + overrides?: Overrides + ): Promise; + + "deposit(bytes32,uint8,uint64,address,bytes)"( + resourceID: BytesLike, + destinationChainID: BigNumberish, + depositNonce: BigNumberish, + depositer: string, + data: BytesLike, + overrides?: Overrides + ): Promise; + + executeProposal( + resourceID: BytesLike, + data: BytesLike, + overrides?: Overrides + ): Promise; + + "executeProposal(bytes32,bytes)"( + resourceID: BytesLike, + data: BytesLike, + overrides?: Overrides + ): Promise; + + getDepositRecord( + depositNonce: BigNumberish, + destId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "getDepositRecord(uint64,uint8)"( + depositNonce: BigNumberish, + destId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + setResource( + resourceID: BytesLike, + contractAddress: string, + depositFunctionSig: BytesLike, + depositFunctionDepositerOffset: BigNumberish, + executeFunctionSig: BytesLike, + overrides?: Overrides + ): Promise; + + "setResource(bytes32,address,bytes4,uint256,bytes4)"( + resourceID: BytesLike, + contractAddress: string, + depositFunctionSig: BytesLike, + depositFunctionDepositerOffset: BigNumberish, + executeFunctionSig: BytesLike, + overrides?: Overrides + ): Promise; + + updateBridgeAddress( + newBridgeAddress: string, + overrides?: Overrides + ): Promise; + + "updateBridgeAddress(address)"( + newBridgeAddress: string, + overrides?: Overrides + ): Promise; + }; + + populateTransaction: { + _bridgeAddress(overrides?: CallOverrides): Promise; + + "_bridgeAddress()"( + overrides?: CallOverrides + ): Promise; + + _contractAddressToDepositFunctionDepositerOffset( + arg0: string, + overrides?: CallOverrides + ): Promise; + + "_contractAddressToDepositFunctionDepositerOffset(address)"( + arg0: string, + overrides?: CallOverrides + ): Promise; + + _contractAddressToDepositFunctionSignature( + arg0: string, + overrides?: CallOverrides + ): Promise; + + "_contractAddressToDepositFunctionSignature(address)"( + arg0: string, + overrides?: CallOverrides + ): Promise; + + _contractAddressToExecuteFunctionSignature( + arg0: string, + overrides?: CallOverrides + ): Promise; + + "_contractAddressToExecuteFunctionSignature(address)"( + arg0: string, + overrides?: CallOverrides + ): Promise; + + _contractAddressToResourceID( + arg0: string, + overrides?: CallOverrides + ): Promise; + + "_contractAddressToResourceID(address)"( + arg0: string, + overrides?: CallOverrides + ): Promise; + + _contractWhitelist( + arg0: string, + overrides?: CallOverrides + ): Promise; + + "_contractWhitelist(address)"( + arg0: string, + overrides?: CallOverrides + ): Promise; + + _depositRecords( + arg0: BigNumberish, + arg1: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "_depositRecords(uint8,uint64)"( + arg0: BigNumberish, + arg1: BigNumberish, + overrides?: CallOverrides + ): Promise; + + _resourceIDToContractAddress( + arg0: BytesLike, + overrides?: CallOverrides + ): Promise; + + "_resourceIDToContractAddress(bytes32)"( + arg0: BytesLike, + overrides?: CallOverrides + ): Promise; + + deposit( + resourceID: BytesLike, + destinationChainID: BigNumberish, + depositNonce: BigNumberish, + depositer: string, + data: BytesLike, + overrides?: Overrides + ): Promise; + + "deposit(bytes32,uint8,uint64,address,bytes)"( + resourceID: BytesLike, + destinationChainID: BigNumberish, + depositNonce: BigNumberish, + depositer: string, + data: BytesLike, + overrides?: Overrides + ): Promise; + + executeProposal( + resourceID: BytesLike, + data: BytesLike, + overrides?: Overrides + ): Promise; + + "executeProposal(bytes32,bytes)"( + resourceID: BytesLike, + data: BytesLike, + overrides?: Overrides + ): Promise; + + getDepositRecord( + depositNonce: BigNumberish, + destId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "getDepositRecord(uint64,uint8)"( + depositNonce: BigNumberish, + destId: BigNumberish, + overrides?: CallOverrides + ): Promise; + + setResource( + resourceID: BytesLike, + contractAddress: string, + depositFunctionSig: BytesLike, + depositFunctionDepositerOffset: BigNumberish, + executeFunctionSig: BytesLike, + overrides?: Overrides + ): Promise; + + "setResource(bytes32,address,bytes4,uint256,bytes4)"( + resourceID: BytesLike, + contractAddress: string, + depositFunctionSig: BytesLike, + depositFunctionDepositerOffset: BigNumberish, + executeFunctionSig: BytesLike, + overrides?: Overrides + ): Promise; + + updateBridgeAddress( + newBridgeAddress: string, + overrides?: Overrides + ): Promise; + + "updateBridgeAddress(address)"( + newBridgeAddress: string, + overrides?: Overrides + ): Promise; + }; +} diff --git a/src/Contracts/GenericHandlerFactory.ts b/src/Contracts/GenericHandlerFactory.ts new file mode 100644 index 00000000..445ffc3d --- /dev/null +++ b/src/Contracts/GenericHandlerFactory.ts @@ -0,0 +1,417 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Signer, BytesLike, BigNumberish } from "ethers"; +import { Provider, TransactionRequest } from "@ethersproject/providers"; +import { Contract, ContractFactory, Overrides } from "@ethersproject/contracts"; + +import type { GenericHandler } from "./GenericHandler"; + +export class GenericHandler__factory extends ContractFactory { + constructor(signer?: Signer) { + super(_abi, _bytecode, signer); + } + + deploy( + bridgeAddress: string, + initialResourceIDs: BytesLike[], + initialContractAddresses: string[], + initialDepositFunctionSignatures: BytesLike[], + initialDepositFunctionDepositerOffsets: BigNumberish[], + initialExecuteFunctionSignatures: BytesLike[], + overrides?: Overrides + ): Promise { + return super.deploy( + bridgeAddress, + initialResourceIDs, + initialContractAddresses, + initialDepositFunctionSignatures, + initialDepositFunctionDepositerOffsets, + initialExecuteFunctionSignatures, + overrides || {} + ) as Promise; + } + getDeployTransaction( + bridgeAddress: string, + initialResourceIDs: BytesLike[], + initialContractAddresses: string[], + initialDepositFunctionSignatures: BytesLike[], + initialDepositFunctionDepositerOffsets: BigNumberish[], + initialExecuteFunctionSignatures: BytesLike[], + overrides?: Overrides + ): TransactionRequest { + return super.getDeployTransaction( + bridgeAddress, + initialResourceIDs, + initialContractAddresses, + initialDepositFunctionSignatures, + initialDepositFunctionDepositerOffsets, + initialExecuteFunctionSignatures, + overrides || {} + ); + } + attach(address: string): GenericHandler { + return super.attach(address) as GenericHandler; + } + connect(signer: Signer): GenericHandler__factory { + return super.connect(signer) as GenericHandler__factory; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): GenericHandler { + return new Contract(address, _abi, signerOrProvider) as GenericHandler; + } +} + +const _abi = [ + { + inputs: [ + { + internalType: "address", + name: "bridgeAddress", + type: "address", + }, + { + internalType: "bytes32[]", + name: "initialResourceIDs", + type: "bytes32[]", + }, + { + internalType: "address[]", + name: "initialContractAddresses", + type: "address[]", + }, + { + internalType: "bytes4[]", + name: "initialDepositFunctionSignatures", + type: "bytes4[]", + }, + { + internalType: "uint256[]", + name: "initialDepositFunctionDepositerOffsets", + type: "uint256[]", + }, + { + internalType: "bytes4[]", + name: "initialExecuteFunctionSignatures", + type: "bytes4[]", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + { + inputs: [], + name: "_bridgeAddress", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + name: "_contractAddressToDepositFunctionDepositerOffset", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + name: "_contractAddressToDepositFunctionSignature", + outputs: [ + { + internalType: "bytes4", + name: "", + type: "bytes4", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + name: "_contractAddressToExecuteFunctionSignature", + outputs: [ + { + internalType: "bytes4", + name: "", + type: "bytes4", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + name: "_contractAddressToResourceID", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + name: "_contractWhitelist", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint8", + name: "", + type: "uint8", + }, + { + internalType: "uint64", + name: "", + type: "uint64", + }, + ], + name: "_depositRecords", + outputs: [ + { + internalType: "uint8", + name: "_destinationChainID", + type: "uint8", + }, + { + internalType: "address", + name: "_depositer", + type: "address", + }, + { + internalType: "bytes32", + name: "_resourceID", + type: "bytes32", + }, + { + internalType: "bytes", + name: "_metaData", + type: "bytes", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + name: "_resourceIDToContractAddress", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "resourceID", + type: "bytes32", + }, + { + internalType: "uint8", + name: "destinationChainID", + type: "uint8", + }, + { + internalType: "uint64", + name: "depositNonce", + type: "uint64", + }, + { + internalType: "address", + name: "depositer", + type: "address", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + ], + name: "deposit", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "resourceID", + type: "bytes32", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + ], + name: "executeProposal", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint64", + name: "depositNonce", + type: "uint64", + }, + { + internalType: "uint8", + name: "destId", + type: "uint8", + }, + ], + name: "getDepositRecord", + outputs: [ + { + components: [ + { + internalType: "uint8", + name: "_destinationChainID", + type: "uint8", + }, + { + internalType: "address", + name: "_depositer", + type: "address", + }, + { + internalType: "bytes32", + name: "_resourceID", + type: "bytes32", + }, + { + internalType: "bytes", + name: "_metaData", + type: "bytes", + }, + ], + internalType: "struct GenericHandler.DepositRecord", + name: "", + type: "tuple", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "resourceID", + type: "bytes32", + }, + { + internalType: "address", + name: "contractAddress", + type: "address", + }, + { + internalType: "bytes4", + name: "depositFunctionSig", + type: "bytes4", + }, + { + internalType: "uint256", + name: "depositFunctionDepositerOffset", + type: "uint256", + }, + { + internalType: "bytes4", + name: "executeFunctionSig", + type: "bytes4", + }, + ], + name: "setResource", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "newBridgeAddress", + type: "address", + }, + ], + name: "updateBridgeAddress", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, +]; + +const _bytecode = + "0x60806040523480156200001157600080fd5b5060405162002888380380620028888339818101604052810190620000379190620006b6565b83518551146200007e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000759062000969565b60405180910390fd5b8251845114620000c5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000bc90620009cf565b60405180910390fd5b80518351146200010c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200010390620009ad565b60405180910390fd5b805182511462000153576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200014a906200098b565b60405180910390fd5b856000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008090505b85518110156200022a576200021c868281518110620001b457fe5b6020026020010151868381518110620001c957fe5b6020026020010151868481518110620001de57fe5b6020026020010151868581518110620001f357fe5b60200260200101518686815181106200020857fe5b60200260200101516200023760201b60201c565b808060010191505062000199565b5050505050505062000bb0565b836002600087815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555082600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548163ffffffff021916908360e01c021790555081600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548163ffffffff021916908360e01c02179055506001600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050505050565b600081519050620004378162000b48565b92915050565b600082601f8301126200044f57600080fd5b815162000466620004608262000a1f565b620009f1565b915081818352602084019350602081019050838560208402820111156200048c57600080fd5b60005b83811015620004c05781620004a5888262000426565b8452602084019350602083019250506001810190506200048f565b5050505092915050565b600082601f830112620004dc57600080fd5b8151620004f3620004ed8262000a48565b620009f1565b915081818352602084019350602081019050838560208402820111156200051957600080fd5b60005b838110156200054d578162000532888262000671565b8452602084019350602083019250506001810190506200051c565b5050505092915050565b600082601f8301126200056957600080fd5b8151620005806200057a8262000a71565b620009f1565b91508181835260208401935060208101905083856020840282011115620005a657600080fd5b60005b83811015620005da5781620005bf888262000688565b845260208401935060208301925050600181019050620005a9565b5050505092915050565b600082601f830112620005f657600080fd5b81516200060d620006078262000a9a565b620009f1565b915081818352602084019350602081019050838560208402820111156200063357600080fd5b60005b838110156200066757816200064c88826200069f565b84526020840193506020830192505060018101905062000636565b5050505092915050565b600081519050620006828162000b62565b92915050565b600081519050620006998162000b7c565b92915050565b600081519050620006b08162000b96565b92915050565b60008060008060008060c08789031215620006d057600080fd5b6000620006e089828a0162000426565b965050602087015167ffffffffffffffff811115620006fe57600080fd5b6200070c89828a01620004ca565b955050604087015167ffffffffffffffff8111156200072a57600080fd5b6200073889828a016200043d565b945050606087015167ffffffffffffffff8111156200075657600080fd5b6200076489828a0162000557565b935050608087015167ffffffffffffffff8111156200078257600080fd5b6200079089828a01620005e4565b92505060a087015167ffffffffffffffff811115620007ae57600080fd5b620007bc89828a0162000557565b9150509295509295509295565b6000620007d8603c8362000ac3565b91507f696e697469616c5265736f7572636549447320616e6420696e697469616c436f60008301527f6e7472616374416464726573736573206c656e206d69736d61746368000000006020830152604082019050919050565b600062000840603f8362000ac3565b91507f70726f7669646564206465706f7369746572206f66667365747320616e64206660008301527f756e6374696f6e207369676e617475726573206c656e206d69736d61746368006020830152604082019050919050565b6000620008a8603d8362000ac3565b91507f70726f7669646564206465706f73697420616e6420657865637574652066756e60008301527f6374696f6e207369676e617475726573206c656e206d69736d617463680000006020830152604082019050919050565b60006200091060408362000ac3565b91507f70726f766964656420636f6e74726163742061646472657373657320616e642060008301527f66756e6374696f6e207369676e617475726573206c656e206d69736d617463686020830152604082019050919050565b600060208201905081810360008301526200098481620007c9565b9050919050565b60006020820190508181036000830152620009a68162000831565b9050919050565b60006020820190508181036000830152620009c88162000899565b9050919050565b60006020820190508181036000830152620009ea8162000901565b9050919050565b6000604051905081810181811067ffffffffffffffff8211171562000a1557600080fd5b8060405250919050565b600067ffffffffffffffff82111562000a3757600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111562000a6057600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111562000a8957600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111562000ab257600080fd5b602082029050602081019050919050565b600082825260208201905092915050565b600062000ae18262000b1e565b9050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b62000b538162000ad4565b811462000b5f57600080fd5b50565b62000b6d8162000ae8565b811462000b7957600080fd5b50565b62000b878162000af2565b811462000b9357600080fd5b50565b62000ba18162000b3e565b811462000bad57600080fd5b50565b611cc88062000bc06000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c8063aa50800b1161008c578063cb62446311610066578063cb6244631461024d578063de319d991461027d578063e248cff214610299578063ec97d3b4146102b5576100cf565b8063aa50800b146101bd578063ba484c09146101ed578063c54c2a111461021d576100cf565b8063318c136e146100d457806338995da9146100f25780634402027f1461010e578063645c8a4b146101415780637f79bea81461015d578063a5c3a9851461018d575b600080fd5b6100dc6102e5565b6040516100e99190611912565b60405180910390f35b61010c6004803603810190610107919061140a565b61030a565b005b61012860048036038101906101239190611501565b6107b4565b6040516101389493929190611a7b565b60405180910390f35b61015b600480360381019061015691906112e9565b6108b6565b005b610177600480360381019061017291906112e9565b610991565b604051610184919061192d565b60405180910390f35b6101a760048036038101906101a291906112e9565b6109b1565b6040516101b49190611963565b60405180910390f35b6101d760048036038101906101d291906112e9565b6109d1565b6040516101e49190611a60565b60405180910390f35b610207600480360381019061020291906114c5565b6109e9565b6040516102149190611a3e565b60405180910390f35b61023760048036038101906102329190611312565b610b61565b6040516102449190611912565b60405180910390f35b610267600480360381019061026291906112e9565b610b94565b6040516102749190611963565b60405180910390f35b6102976004803603810190610292919061133b565b610bb4565b005b6102b360048036038101906102ae91906113b2565b610bd0565b005b6102cf60048036038101906102ca91906112e9565b610ea0565b6040516102dc9190611948565b60405180910390f35b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610312610eb8565b600060608383810190610325919061149c565b915083836020846020018082111561033c57600080fd5b8281111561034957600080fd5b6001820284019350818103925050508080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505090506000600260008a815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111156104a1576000816020850101519050606081901c73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161461049f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610496906119de565b60405180910390fd5b505b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661052d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610524906119fe565b60405180910390fd5b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460e01b9050600060e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461069d57606081856040516020016105dc9291906118d3565b604051602081830303815290604052905060008473ffffffffffffffffffffffffffffffffffffffff168260405161061491906118fb565b6000604051808303816000865af19150503d8060008114610651576040519150601f19603f3d011682016040523d82523d6000602084013e610656565b606091505b505090508061069a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069190611a1e565b60405180910390fd5b50505b60405180608001604052808b60ff1681526020018973ffffffffffffffffffffffffffffffffffffffff1681526020018c815260200185815250600160008c60ff1660ff16815260200190815260200160002060008b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816001015560608201518160020190805190602001906107a3929190611138565b509050505050505050505050505050565b6001602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900460ff16908060000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806001015490806002018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156108ac5780601f10610881576101008083540402835291602001916108ac565b820191906000526020600020905b81548152906001019060200180831161088f57829003601f168201915b5050505050905084565b6108be610eb8565b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561094e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109459061199e565b60405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60076020528060005260406000206000915054906101000a900460ff1681565b60066020528060005260406000206000915054906101000a900460e01b81565b60056020528060005260406000206000915090505481565b6109f16111b8565b600160008360ff1660ff16815260200190815260200160002060008467ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206040518060800160405290816000820160009054906101000a900460ff1660ff1660ff1681526020016000820160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610b505780601f10610b2557610100808354040283529160200191610b50565b820191906000526020600020905b815481529060010190602001808311610b3357829003601f168201915b505050505081525050905092915050565b60026020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60046020528060005260406000206000915054906101000a900460e01b81565b610bbc610eb8565b610bc98585858585610f49565b5050505050565b610bd8610eb8565b600060608383810190610beb919061149c565b9150838360208460200180821115610c0257600080fd5b82811115610c0f57600080fd5b6001820284019350818103925050508080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050905060006002600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610d27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1e906119fe565b60405180910390fd5b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460e01b9050600060e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610e975760608184604051602001610dd69291906118d3565b604051602081830303815290604052905060008373ffffffffffffffffffffffffffffffffffffffff1682604051610e0e91906118fb565b6000604051808303816000865af19150503d8060008114610e4b576040519150601f19603f3d011682016040523d82523d6000602084013e610e50565b606091505b5050905080610e94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8b906119be565b60405180910390fd5b50505b50505050505050565b60036020528060005260406000206000915090505481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3e9061197e565b60405180910390fd5b565b836002600087815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555082600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548163ffffffff021916908360e01c021790555081600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548163ffffffff021916908360e01c02179055506001600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061117957805160ff19168380011785556111a7565b828001600101855582156111a7579182015b828111156111a657825182559160200191906001019061118b565b5b5090506111b491906111fc565b5090565b6040518060800160405280600060ff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008019168152602001606081525090565b61121e91905b8082111561121a576000816000905550600101611202565b5090565b90565b60008135905061123081611c08565b92915050565b60008135905061124581611c1f565b92915050565b60008135905061125a81611c36565b92915050565b60008083601f84011261127257600080fd5b8235905067ffffffffffffffff81111561128b57600080fd5b6020830191508360018202830111156112a357600080fd5b9250929050565b6000813590506112b981611c4d565b92915050565b6000813590506112ce81611c64565b92915050565b6000813590506112e381611c7b565b92915050565b6000602082840312156112fb57600080fd5b600061130984828501611221565b91505092915050565b60006020828403121561132457600080fd5b600061133284828501611236565b91505092915050565b600080600080600060a0868803121561135357600080fd5b600061136188828901611236565b955050602061137288828901611221565b94505060406113838882890161124b565b9350506060611394888289016112aa565b92505060806113a58882890161124b565b9150509295509295909350565b6000806000604084860312156113c757600080fd5b60006113d586828701611236565b935050602084013567ffffffffffffffff8111156113f257600080fd5b6113fe86828701611260565b92509250509250925092565b60008060008060008060a0878903121561142357600080fd5b600061143189828a01611236565b965050602061144289828a016112d4565b955050604061145389828a016112bf565b945050606061146489828a01611221565b935050608087013567ffffffffffffffff81111561148157600080fd5b61148d89828a01611260565b92509250509295509295509295565b6000602082840312156114ae57600080fd5b60006114bc848285016112aa565b91505092915050565b600080604083850312156114d857600080fd5b60006114e6858286016112bf565b92505060206114f7858286016112d4565b9150509250929050565b6000806040838503121561151457600080fd5b6000611522858286016112d4565b9250506020611533858286016112bf565b9150509250929050565b61154681611b1b565b82525050565b61155581611b1b565b82525050565b61156481611b2d565b82525050565b61157381611b39565b82525050565b61158281611b39565b82525050565b61159181611b43565b82525050565b6115a86115a382611b43565b611bed565b82525050565b60006115b982611ad2565b6115c38185611aff565b93506115d3818560208601611bba565b80840191505092915050565b60006115ea82611ac7565b6115f48185611add565b9350611604818560208601611bba565b61160d81611bf7565b840191505092915050565b600061162382611ac7565b61162d8185611aee565b935061163d818560208601611bba565b61164681611bf7565b840191505092915050565b600061165e601e83611b0a565b91507f73656e646572206d7573742062652062726964676520636f6e747261637400006000830152602082019050919050565b600061169e602c83611b0a565b91507f74686520757064617465642061646472657373206973207468652073616d652060008301527f7769746820746865206f6c6400000000000000000000000000000000000000006020830152604082019050919050565b6000611704602683611b0a565b91507f64656c656761746563616c6c20746f20636f6e7472616374416464726573732060008301527f6661696c656400000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061176a601f83611b0a565b91507f696e636f7272656374206465706f736974657220696e207468652064617461006000830152602082019050919050565b60006117aa602b83611b0a565b91507f70726f766964656420636f6e747261637441646472657373206973206e6f742060008301527f77686974656c69737465640000000000000000000000000000000000000000006020830152604082019050919050565b6000611810601e83611b0a565b91507f63616c6c20746f20636f6e747261637441646472657373206661696c656400006000830152602082019050919050565b600060808301600083015161185b60008601826118b5565b50602083015161186e602086018261153d565b506040830151611881604086018261156a565b506060830151848203606086015261189982826115df565b9150508091505092915050565b6118af81611b8f565b82525050565b6118be81611bad565b82525050565b6118cd81611bad565b82525050565b60006118df8285611597565b6004820191506118ef82846115ae565b91508190509392505050565b600061190782846115ae565b915081905092915050565b6000602082019050611927600083018461154c565b92915050565b6000602082019050611942600083018461155b565b92915050565b600060208201905061195d6000830184611579565b92915050565b60006020820190506119786000830184611588565b92915050565b6000602082019050818103600083015261199781611651565b9050919050565b600060208201905081810360008301526119b781611691565b9050919050565b600060208201905081810360008301526119d7816116f7565b9050919050565b600060208201905081810360008301526119f78161175d565b9050919050565b60006020820190508181036000830152611a178161179d565b9050919050565b60006020820190508181036000830152611a3781611803565b9050919050565b60006020820190508181036000830152611a588184611843565b905092915050565b6000602082019050611a7560008301846118a6565b92915050565b6000608082019050611a9060008301876118c4565b611a9d602083018661154c565b611aaa6040830185611579565b8181036060830152611abc8184611618565b905095945050505050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b6000611b2682611b6f565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b60005b83811015611bd8578082015181840152602081019050611bbd565b83811115611be7576000848401525b50505050565b6000819050919050565b6000601f19601f8301169050919050565b611c1181611b1b565b8114611c1c57600080fd5b50565b611c2881611b39565b8114611c3357600080fd5b50565b611c3f81611b43565b8114611c4a57600080fd5b50565b611c5681611b8f565b8114611c6157600080fd5b50565b611c6d81611b99565b8114611c7857600080fd5b50565b611c8481611bad565b8114611c8f57600080fd5b5056fea2646970667358221220b1bdc4176dfb2b3dbcb5c113880ccd032d739bbd87202fe18afdb73d351fff7664736f6c63430006040033"; diff --git a/src/Contracts/XCAmpleController.d.ts b/src/Contracts/XCAmpleController.d.ts new file mode 100644 index 00000000..46bbb052 --- /dev/null +++ b/src/Contracts/XCAmpleController.d.ts @@ -0,0 +1,1037 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { + ethers, + EventFilter, + Signer, + BigNumber, + BigNumberish, + PopulatedTransaction, +} from "ethers"; +import { + Contract, + ContractTransaction, + Overrides, + CallOverrides, +} from "@ethersproject/contracts"; +import { BytesLike } from "@ethersproject/bytes"; +import { Listener, Provider } from "@ethersproject/providers"; +import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; +import { TypedEventFilter, TypedEvent, TypedListener } from "./commons"; + +interface XCAmpleControllerInterface extends ethers.utils.Interface { + functions: { + "addBridgeGateway(address)": FunctionFragment; + "burn(address,uint256)": FunctionFragment; + "globalAmpleforthEpoch()": FunctionFragment; + "globalAmpleforthEpochAndAMPLSupply()": FunctionFragment; + "initialize(address,uint256)": FunctionFragment; + "lastRebaseTimestampSec()": FunctionFragment; + "mint(address,uint256)": FunctionFragment; + "nextGlobalAMPLSupply()": FunctionFragment; + "nextGlobalAmpleforthEpoch()": FunctionFragment; + "owner()": FunctionFragment; + "rebase()": FunctionFragment; + "rebaseRelayer()": FunctionFragment; + "removeBridgeGateway(address)": FunctionFragment; + "renounceOwnership()": FunctionFragment; + "reportRebase(uint256,uint256)": FunctionFragment; + "setRebaseRelayer(address)": FunctionFragment; + "transferOwnership(address)": FunctionFragment; + "whitelistedBridgeGateways(address)": FunctionFragment; + "xcAmple()": FunctionFragment; + }; + + encodeFunctionData( + functionFragment: "addBridgeGateway", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "burn", + values: [string, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "globalAmpleforthEpoch", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "globalAmpleforthEpochAndAMPLSupply", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "initialize", + values: [string, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "lastRebaseTimestampSec", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "mint", + values: [string, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "nextGlobalAMPLSupply", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "nextGlobalAmpleforthEpoch", + values?: undefined + ): string; + encodeFunctionData(functionFragment: "owner", values?: undefined): string; + encodeFunctionData(functionFragment: "rebase", values?: undefined): string; + encodeFunctionData( + functionFragment: "rebaseRelayer", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "removeBridgeGateway", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "renounceOwnership", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "reportRebase", + values: [BigNumberish, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "setRebaseRelayer", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "transferOwnership", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "whitelistedBridgeGateways", + values: [string] + ): string; + encodeFunctionData(functionFragment: "xcAmple", values?: undefined): string; + + decodeFunctionResult( + functionFragment: "addBridgeGateway", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "burn", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "globalAmpleforthEpoch", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "globalAmpleforthEpochAndAMPLSupply", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "initialize", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "lastRebaseTimestampSec", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "mint", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "nextGlobalAMPLSupply", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "nextGlobalAmpleforthEpoch", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "owner", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "rebase", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "rebaseRelayer", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "removeBridgeGateway", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "renounceOwnership", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "reportRebase", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setRebaseRelayer", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "transferOwnership", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "whitelistedBridgeGateways", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "xcAmple", data: BytesLike): Result; + + events: { + "GatewayBurn(address,address,uint256)": EventFragment; + "GatewayMint(address,address,uint256)": EventFragment; + "GatewayRebaseReported(address,uint256,uint256,uint256)": EventFragment; + "GatewayWhitelistUpdated(address,bool)": EventFragment; + "LogRebase(uint256,int256,uint256)": EventFragment; + "OwnershipTransferred(address,address)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "GatewayBurn"): EventFragment; + getEvent(nameOrSignatureOrTopic: "GatewayMint"): EventFragment; + getEvent(nameOrSignatureOrTopic: "GatewayRebaseReported"): EventFragment; + getEvent(nameOrSignatureOrTopic: "GatewayWhitelistUpdated"): EventFragment; + getEvent(nameOrSignatureOrTopic: "LogRebase"): EventFragment; + getEvent(nameOrSignatureOrTopic: "OwnershipTransferred"): EventFragment; +} + +export class XCAmpleController extends Contract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + listeners, EventArgsObject>( + eventFilter?: TypedEventFilter + ): Array>; + off, EventArgsObject>( + eventFilter: TypedEventFilter, + listener: TypedListener + ): this; + on, EventArgsObject>( + eventFilter: TypedEventFilter, + listener: TypedListener + ): this; + once, EventArgsObject>( + eventFilter: TypedEventFilter, + listener: TypedListener + ): this; + removeListener, EventArgsObject>( + eventFilter: TypedEventFilter, + listener: TypedListener + ): this; + removeAllListeners, EventArgsObject>( + eventFilter: TypedEventFilter + ): this; + + listeners(eventName?: string): Array; + off(eventName: string, listener: Listener): this; + on(eventName: string, listener: Listener): this; + once(eventName: string, listener: Listener): this; + removeListener(eventName: string, listener: Listener): this; + removeAllListeners(eventName?: string): this; + + queryFilter, EventArgsObject>( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + interface: XCAmpleControllerInterface; + + functions: { + addBridgeGateway( + bridgeGateway: string, + overrides?: Overrides + ): Promise; + + "addBridgeGateway(address)"( + bridgeGateway: string, + overrides?: Overrides + ): Promise; + + burn( + depositor: string, + xcAmpleAmount: BigNumberish, + overrides?: Overrides + ): Promise; + + "burn(address,uint256)"( + depositor: string, + xcAmpleAmount: BigNumberish, + overrides?: Overrides + ): Promise; + + globalAmpleforthEpoch(overrides?: CallOverrides): Promise<[BigNumber]>; + + "globalAmpleforthEpoch()"(overrides?: CallOverrides): Promise<[BigNumber]>; + + globalAmpleforthEpochAndAMPLSupply( + overrides?: CallOverrides + ): Promise<[BigNumber, BigNumber]>; + + "globalAmpleforthEpochAndAMPLSupply()"( + overrides?: CallOverrides + ): Promise<[BigNumber, BigNumber]>; + + initialize( + xcAmple_: string, + globalAmpleforthEpoch_: BigNumberish, + overrides?: Overrides + ): Promise; + + "initialize(address,uint256)"( + xcAmple_: string, + globalAmpleforthEpoch_: BigNumberish, + overrides?: Overrides + ): Promise; + + lastRebaseTimestampSec(overrides?: CallOverrides): Promise<[BigNumber]>; + + "lastRebaseTimestampSec()"(overrides?: CallOverrides): Promise<[BigNumber]>; + + mint( + recipient: string, + xcAmpleAmount: BigNumberish, + overrides?: Overrides + ): Promise; + + "mint(address,uint256)"( + recipient: string, + xcAmpleAmount: BigNumberish, + overrides?: Overrides + ): Promise; + + nextGlobalAMPLSupply(overrides?: CallOverrides): Promise<[BigNumber]>; + + "nextGlobalAMPLSupply()"(overrides?: CallOverrides): Promise<[BigNumber]>; + + nextGlobalAmpleforthEpoch(overrides?: CallOverrides): Promise<[BigNumber]>; + + "nextGlobalAmpleforthEpoch()"( + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + owner(overrides?: CallOverrides): Promise<[string]>; + + "owner()"(overrides?: CallOverrides): Promise<[string]>; + + rebase(overrides?: Overrides): Promise; + + "rebase()"(overrides?: Overrides): Promise; + + rebaseRelayer(overrides?: CallOverrides): Promise<[string]>; + + "rebaseRelayer()"(overrides?: CallOverrides): Promise<[string]>; + + removeBridgeGateway( + bridgeGateway: string, + overrides?: Overrides + ): Promise; + + "removeBridgeGateway(address)"( + bridgeGateway: string, + overrides?: Overrides + ): Promise; + + renounceOwnership(overrides?: Overrides): Promise; + + "renounceOwnership()"(overrides?: Overrides): Promise; + + reportRebase( + nextGlobalAmpleforthEpoch_: BigNumberish, + nextGlobalAMPLSupply_: BigNumberish, + overrides?: Overrides + ): Promise; + + "reportRebase(uint256,uint256)"( + nextGlobalAmpleforthEpoch_: BigNumberish, + nextGlobalAMPLSupply_: BigNumberish, + overrides?: Overrides + ): Promise; + + setRebaseRelayer( + rebaseRelayer_: string, + overrides?: Overrides + ): Promise; + + "setRebaseRelayer(address)"( + rebaseRelayer_: string, + overrides?: Overrides + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides + ): Promise; + + "transferOwnership(address)"( + newOwner: string, + overrides?: Overrides + ): Promise; + + whitelistedBridgeGateways( + arg0: string, + overrides?: CallOverrides + ): Promise<[boolean]>; + + "whitelistedBridgeGateways(address)"( + arg0: string, + overrides?: CallOverrides + ): Promise<[boolean]>; + + xcAmple(overrides?: CallOverrides): Promise<[string]>; + + "xcAmple()"(overrides?: CallOverrides): Promise<[string]>; + }; + + addBridgeGateway( + bridgeGateway: string, + overrides?: Overrides + ): Promise; + + "addBridgeGateway(address)"( + bridgeGateway: string, + overrides?: Overrides + ): Promise; + + burn( + depositor: string, + xcAmpleAmount: BigNumberish, + overrides?: Overrides + ): Promise; + + "burn(address,uint256)"( + depositor: string, + xcAmpleAmount: BigNumberish, + overrides?: Overrides + ): Promise; + + globalAmpleforthEpoch(overrides?: CallOverrides): Promise; + + "globalAmpleforthEpoch()"(overrides?: CallOverrides): Promise; + + globalAmpleforthEpochAndAMPLSupply( + overrides?: CallOverrides + ): Promise<[BigNumber, BigNumber]>; + + "globalAmpleforthEpochAndAMPLSupply()"( + overrides?: CallOverrides + ): Promise<[BigNumber, BigNumber]>; + + initialize( + xcAmple_: string, + globalAmpleforthEpoch_: BigNumberish, + overrides?: Overrides + ): Promise; + + "initialize(address,uint256)"( + xcAmple_: string, + globalAmpleforthEpoch_: BigNumberish, + overrides?: Overrides + ): Promise; + + lastRebaseTimestampSec(overrides?: CallOverrides): Promise; + + "lastRebaseTimestampSec()"(overrides?: CallOverrides): Promise; + + mint( + recipient: string, + xcAmpleAmount: BigNumberish, + overrides?: Overrides + ): Promise; + + "mint(address,uint256)"( + recipient: string, + xcAmpleAmount: BigNumberish, + overrides?: Overrides + ): Promise; + + nextGlobalAMPLSupply(overrides?: CallOverrides): Promise; + + "nextGlobalAMPLSupply()"(overrides?: CallOverrides): Promise; + + nextGlobalAmpleforthEpoch(overrides?: CallOverrides): Promise; + + "nextGlobalAmpleforthEpoch()"(overrides?: CallOverrides): Promise; + + owner(overrides?: CallOverrides): Promise; + + "owner()"(overrides?: CallOverrides): Promise; + + rebase(overrides?: Overrides): Promise; + + "rebase()"(overrides?: Overrides): Promise; + + rebaseRelayer(overrides?: CallOverrides): Promise; + + "rebaseRelayer()"(overrides?: CallOverrides): Promise; + + removeBridgeGateway( + bridgeGateway: string, + overrides?: Overrides + ): Promise; + + "removeBridgeGateway(address)"( + bridgeGateway: string, + overrides?: Overrides + ): Promise; + + renounceOwnership(overrides?: Overrides): Promise; + + "renounceOwnership()"(overrides?: Overrides): Promise; + + reportRebase( + nextGlobalAmpleforthEpoch_: BigNumberish, + nextGlobalAMPLSupply_: BigNumberish, + overrides?: Overrides + ): Promise; + + "reportRebase(uint256,uint256)"( + nextGlobalAmpleforthEpoch_: BigNumberish, + nextGlobalAMPLSupply_: BigNumberish, + overrides?: Overrides + ): Promise; + + setRebaseRelayer( + rebaseRelayer_: string, + overrides?: Overrides + ): Promise; + + "setRebaseRelayer(address)"( + rebaseRelayer_: string, + overrides?: Overrides + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides + ): Promise; + + "transferOwnership(address)"( + newOwner: string, + overrides?: Overrides + ): Promise; + + whitelistedBridgeGateways( + arg0: string, + overrides?: CallOverrides + ): Promise; + + "whitelistedBridgeGateways(address)"( + arg0: string, + overrides?: CallOverrides + ): Promise; + + xcAmple(overrides?: CallOverrides): Promise; + + "xcAmple()"(overrides?: CallOverrides): Promise; + + callStatic: { + addBridgeGateway( + bridgeGateway: string, + overrides?: CallOverrides + ): Promise; + + "addBridgeGateway(address)"( + bridgeGateway: string, + overrides?: CallOverrides + ): Promise; + + burn( + depositor: string, + xcAmpleAmount: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "burn(address,uint256)"( + depositor: string, + xcAmpleAmount: BigNumberish, + overrides?: CallOverrides + ): Promise; + + globalAmpleforthEpoch(overrides?: CallOverrides): Promise; + + "globalAmpleforthEpoch()"(overrides?: CallOverrides): Promise; + + globalAmpleforthEpochAndAMPLSupply( + overrides?: CallOverrides + ): Promise<[BigNumber, BigNumber]>; + + "globalAmpleforthEpochAndAMPLSupply()"( + overrides?: CallOverrides + ): Promise<[BigNumber, BigNumber]>; + + initialize( + xcAmple_: string, + globalAmpleforthEpoch_: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "initialize(address,uint256)"( + xcAmple_: string, + globalAmpleforthEpoch_: BigNumberish, + overrides?: CallOverrides + ): Promise; + + lastRebaseTimestampSec(overrides?: CallOverrides): Promise; + + "lastRebaseTimestampSec()"(overrides?: CallOverrides): Promise; + + mint( + recipient: string, + xcAmpleAmount: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "mint(address,uint256)"( + recipient: string, + xcAmpleAmount: BigNumberish, + overrides?: CallOverrides + ): Promise; + + nextGlobalAMPLSupply(overrides?: CallOverrides): Promise; + + "nextGlobalAMPLSupply()"(overrides?: CallOverrides): Promise; + + nextGlobalAmpleforthEpoch(overrides?: CallOverrides): Promise; + + "nextGlobalAmpleforthEpoch()"( + overrides?: CallOverrides + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + "owner()"(overrides?: CallOverrides): Promise; + + rebase(overrides?: CallOverrides): Promise; + + "rebase()"(overrides?: CallOverrides): Promise; + + rebaseRelayer(overrides?: CallOverrides): Promise; + + "rebaseRelayer()"(overrides?: CallOverrides): Promise; + + removeBridgeGateway( + bridgeGateway: string, + overrides?: CallOverrides + ): Promise; + + "removeBridgeGateway(address)"( + bridgeGateway: string, + overrides?: CallOverrides + ): Promise; + + renounceOwnership(overrides?: CallOverrides): Promise; + + "renounceOwnership()"(overrides?: CallOverrides): Promise; + + reportRebase( + nextGlobalAmpleforthEpoch_: BigNumberish, + nextGlobalAMPLSupply_: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "reportRebase(uint256,uint256)"( + nextGlobalAmpleforthEpoch_: BigNumberish, + nextGlobalAMPLSupply_: BigNumberish, + overrides?: CallOverrides + ): Promise; + + setRebaseRelayer( + rebaseRelayer_: string, + overrides?: CallOverrides + ): Promise; + + "setRebaseRelayer(address)"( + rebaseRelayer_: string, + overrides?: CallOverrides + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: CallOverrides + ): Promise; + + "transferOwnership(address)"( + newOwner: string, + overrides?: CallOverrides + ): Promise; + + whitelistedBridgeGateways( + arg0: string, + overrides?: CallOverrides + ): Promise; + + "whitelistedBridgeGateways(address)"( + arg0: string, + overrides?: CallOverrides + ): Promise; + + xcAmple(overrides?: CallOverrides): Promise; + + "xcAmple()"(overrides?: CallOverrides): Promise; + }; + + filters: { + GatewayBurn( + bridgeGateway: string | null, + depositor: string | null, + xcAmpleAmount: null + ): TypedEventFilter< + [string, string, BigNumber], + { bridgeGateway: string; depositor: string; xcAmpleAmount: BigNumber } + >; + + GatewayMint( + bridgeGateway: string | null, + recipient: string | null, + xcAmpleAmount: null + ): TypedEventFilter< + [string, string, BigNumber], + { bridgeGateway: string; recipient: string; xcAmpleAmount: BigNumber } + >; + + GatewayRebaseReported( + bridgeGateway: string | null, + epoch: BigNumberish | null, + globalAMPLSupply: null, + timestampSec: null + ): TypedEventFilter< + [string, BigNumber, BigNumber, BigNumber], + { + bridgeGateway: string; + epoch: BigNumber; + globalAMPLSupply: BigNumber; + timestampSec: BigNumber; + } + >; + + GatewayWhitelistUpdated( + bridgeGateway: string | null, + active: null + ): TypedEventFilter< + [string, boolean], + { bridgeGateway: string; active: boolean } + >; + + LogRebase( + epoch: BigNumberish | null, + requestedSupplyAdjustment: null, + timestampSec: null + ): TypedEventFilter< + [BigNumber, BigNumber, BigNumber], + { + epoch: BigNumber; + requestedSupplyAdjustment: BigNumber; + timestampSec: BigNumber; + } + >; + + OwnershipTransferred( + previousOwner: string | null, + newOwner: string | null + ): TypedEventFilter< + [string, string], + { previousOwner: string; newOwner: string } + >; + }; + + estimateGas: { + addBridgeGateway( + bridgeGateway: string, + overrides?: Overrides + ): Promise; + + "addBridgeGateway(address)"( + bridgeGateway: string, + overrides?: Overrides + ): Promise; + + burn( + depositor: string, + xcAmpleAmount: BigNumberish, + overrides?: Overrides + ): Promise; + + "burn(address,uint256)"( + depositor: string, + xcAmpleAmount: BigNumberish, + overrides?: Overrides + ): Promise; + + globalAmpleforthEpoch(overrides?: CallOverrides): Promise; + + "globalAmpleforthEpoch()"(overrides?: CallOverrides): Promise; + + globalAmpleforthEpochAndAMPLSupply( + overrides?: CallOverrides + ): Promise; + + "globalAmpleforthEpochAndAMPLSupply()"( + overrides?: CallOverrides + ): Promise; + + initialize( + xcAmple_: string, + globalAmpleforthEpoch_: BigNumberish, + overrides?: Overrides + ): Promise; + + "initialize(address,uint256)"( + xcAmple_: string, + globalAmpleforthEpoch_: BigNumberish, + overrides?: Overrides + ): Promise; + + lastRebaseTimestampSec(overrides?: CallOverrides): Promise; + + "lastRebaseTimestampSec()"(overrides?: CallOverrides): Promise; + + mint( + recipient: string, + xcAmpleAmount: BigNumberish, + overrides?: Overrides + ): Promise; + + "mint(address,uint256)"( + recipient: string, + xcAmpleAmount: BigNumberish, + overrides?: Overrides + ): Promise; + + nextGlobalAMPLSupply(overrides?: CallOverrides): Promise; + + "nextGlobalAMPLSupply()"(overrides?: CallOverrides): Promise; + + nextGlobalAmpleforthEpoch(overrides?: CallOverrides): Promise; + + "nextGlobalAmpleforthEpoch()"( + overrides?: CallOverrides + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + "owner()"(overrides?: CallOverrides): Promise; + + rebase(overrides?: Overrides): Promise; + + "rebase()"(overrides?: Overrides): Promise; + + rebaseRelayer(overrides?: CallOverrides): Promise; + + "rebaseRelayer()"(overrides?: CallOverrides): Promise; + + removeBridgeGateway( + bridgeGateway: string, + overrides?: Overrides + ): Promise; + + "removeBridgeGateway(address)"( + bridgeGateway: string, + overrides?: Overrides + ): Promise; + + renounceOwnership(overrides?: Overrides): Promise; + + "renounceOwnership()"(overrides?: Overrides): Promise; + + reportRebase( + nextGlobalAmpleforthEpoch_: BigNumberish, + nextGlobalAMPLSupply_: BigNumberish, + overrides?: Overrides + ): Promise; + + "reportRebase(uint256,uint256)"( + nextGlobalAmpleforthEpoch_: BigNumberish, + nextGlobalAMPLSupply_: BigNumberish, + overrides?: Overrides + ): Promise; + + setRebaseRelayer( + rebaseRelayer_: string, + overrides?: Overrides + ): Promise; + + "setRebaseRelayer(address)"( + rebaseRelayer_: string, + overrides?: Overrides + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides + ): Promise; + + "transferOwnership(address)"( + newOwner: string, + overrides?: Overrides + ): Promise; + + whitelistedBridgeGateways( + arg0: string, + overrides?: CallOverrides + ): Promise; + + "whitelistedBridgeGateways(address)"( + arg0: string, + overrides?: CallOverrides + ): Promise; + + xcAmple(overrides?: CallOverrides): Promise; + + "xcAmple()"(overrides?: CallOverrides): Promise; + }; + + populateTransaction: { + addBridgeGateway( + bridgeGateway: string, + overrides?: Overrides + ): Promise; + + "addBridgeGateway(address)"( + bridgeGateway: string, + overrides?: Overrides + ): Promise; + + burn( + depositor: string, + xcAmpleAmount: BigNumberish, + overrides?: Overrides + ): Promise; + + "burn(address,uint256)"( + depositor: string, + xcAmpleAmount: BigNumberish, + overrides?: Overrides + ): Promise; + + globalAmpleforthEpoch( + overrides?: CallOverrides + ): Promise; + + "globalAmpleforthEpoch()"( + overrides?: CallOverrides + ): Promise; + + globalAmpleforthEpochAndAMPLSupply( + overrides?: CallOverrides + ): Promise; + + "globalAmpleforthEpochAndAMPLSupply()"( + overrides?: CallOverrides + ): Promise; + + initialize( + xcAmple_: string, + globalAmpleforthEpoch_: BigNumberish, + overrides?: Overrides + ): Promise; + + "initialize(address,uint256)"( + xcAmple_: string, + globalAmpleforthEpoch_: BigNumberish, + overrides?: Overrides + ): Promise; + + lastRebaseTimestampSec( + overrides?: CallOverrides + ): Promise; + + "lastRebaseTimestampSec()"( + overrides?: CallOverrides + ): Promise; + + mint( + recipient: string, + xcAmpleAmount: BigNumberish, + overrides?: Overrides + ): Promise; + + "mint(address,uint256)"( + recipient: string, + xcAmpleAmount: BigNumberish, + overrides?: Overrides + ): Promise; + + nextGlobalAMPLSupply( + overrides?: CallOverrides + ): Promise; + + "nextGlobalAMPLSupply()"( + overrides?: CallOverrides + ): Promise; + + nextGlobalAmpleforthEpoch( + overrides?: CallOverrides + ): Promise; + + "nextGlobalAmpleforthEpoch()"( + overrides?: CallOverrides + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + "owner()"(overrides?: CallOverrides): Promise; + + rebase(overrides?: Overrides): Promise; + + "rebase()"(overrides?: Overrides): Promise; + + rebaseRelayer(overrides?: CallOverrides): Promise; + + "rebaseRelayer()"(overrides?: CallOverrides): Promise; + + removeBridgeGateway( + bridgeGateway: string, + overrides?: Overrides + ): Promise; + + "removeBridgeGateway(address)"( + bridgeGateway: string, + overrides?: Overrides + ): Promise; + + renounceOwnership(overrides?: Overrides): Promise; + + "renounceOwnership()"(overrides?: Overrides): Promise; + + reportRebase( + nextGlobalAmpleforthEpoch_: BigNumberish, + nextGlobalAMPLSupply_: BigNumberish, + overrides?: Overrides + ): Promise; + + "reportRebase(uint256,uint256)"( + nextGlobalAmpleforthEpoch_: BigNumberish, + nextGlobalAMPLSupply_: BigNumberish, + overrides?: Overrides + ): Promise; + + setRebaseRelayer( + rebaseRelayer_: string, + overrides?: Overrides + ): Promise; + + "setRebaseRelayer(address)"( + rebaseRelayer_: string, + overrides?: Overrides + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides + ): Promise; + + "transferOwnership(address)"( + newOwner: string, + overrides?: Overrides + ): Promise; + + whitelistedBridgeGateways( + arg0: string, + overrides?: CallOverrides + ): Promise; + + "whitelistedBridgeGateways(address)"( + arg0: string, + overrides?: CallOverrides + ): Promise; + + xcAmple(overrides?: CallOverrides): Promise; + + "xcAmple()"(overrides?: CallOverrides): Promise; + }; +} diff --git a/src/Contracts/XCAmpleControllerFactory.ts b/src/Contracts/XCAmpleControllerFactory.ts new file mode 100644 index 00000000..b6548de8 --- /dev/null +++ b/src/Contracts/XCAmpleControllerFactory.ts @@ -0,0 +1,450 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Signer } from "ethers"; +import { Provider, TransactionRequest } from "@ethersproject/providers"; +import { Contract, ContractFactory, Overrides } from "@ethersproject/contracts"; + +import type { XCAmpleController } from "./XCAmpleController"; + +export class XCAmpleControllerFactory extends ContractFactory { + constructor(signer?: Signer) { + super(_abi, _bytecode, signer); + } + + deploy(overrides?: Overrides): Promise { + return super.deploy(overrides || {}) as Promise; + } + getDeployTransaction(overrides?: Overrides): TransactionRequest { + return super.getDeployTransaction(overrides || {}); + } + attach(address: string): XCAmpleController { + return super.attach(address) as XCAmpleController; + } + connect(signer: Signer): XCAmpleControllerFactory { + return super.connect(signer) as XCAmpleControllerFactory; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): XCAmpleController { + return new Contract(address, _abi, signerOrProvider) as XCAmpleController; + } +} + +const _abi = [ + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "bridgeGateway", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "depositor", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "xcAmpleAmount", + type: "uint256", + }, + ], + name: "GatewayBurn", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "bridgeGateway", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "recipient", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "xcAmpleAmount", + type: "uint256", + }, + ], + name: "GatewayMint", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "bridgeGateway", + type: "address", + }, + { + indexed: true, + internalType: "uint256", + name: "epoch", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "globalAMPLSupply", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "timestampSec", + type: "uint256", + }, + ], + name: "GatewayRebaseReported", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "bridgeGateway", + type: "address", + }, + { + indexed: false, + internalType: "bool", + name: "active", + type: "bool", + }, + ], + name: "GatewayWhitelistUpdated", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "epoch", + type: "uint256", + }, + { + indexed: false, + internalType: "int256", + name: "requestedSupplyAdjustment", + type: "int256", + }, + { + indexed: false, + internalType: "uint256", + name: "timestampSec", + type: "uint256", + }, + ], + name: "LogRebase", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "previousOwner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "OwnershipTransferred", + type: "event", + }, + { + inputs: [ + { + internalType: "address", + name: "bridgeGateway", + type: "address", + }, + ], + name: "addBridgeGateway", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "depositor", + type: "address", + }, + { + internalType: "uint256", + name: "xcAmpleAmount", + type: "uint256", + }, + ], + name: "burn", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "globalAmpleforthEpoch", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "globalAmpleforthEpochAndAMPLSupply", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "xcAmple_", + type: "address", + }, + { + internalType: "uint256", + name: "globalAmpleforthEpoch_", + type: "uint256", + }, + ], + name: "initialize", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "lastRebaseTimestampSec", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "recipient", + type: "address", + }, + { + internalType: "uint256", + name: "xcAmpleAmount", + type: "uint256", + }, + ], + name: "mint", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "nextGlobalAMPLSupply", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "nextGlobalAmpleforthEpoch", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "owner", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "rebase", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "rebaseRelayer", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "bridgeGateway", + type: "address", + }, + ], + name: "removeBridgeGateway", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "renounceOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "nextGlobalAmpleforthEpoch_", + type: "uint256", + }, + { + internalType: "uint256", + name: "nextGlobalAMPLSupply_", + type: "uint256", + }, + ], + name: "reportRebase", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "rebaseRelayer_", + type: "address", + }, + ], + name: "setRebaseRelayer", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "transferOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + name: "whitelistedBridgeGateways", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "xcAmple", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, +]; + +const _bytecode = + "0x608060405234801561001057600080fd5b50611185806100206000396000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c806399deb996116100ad578063cd6dc68711610071578063cd6dc68714610281578063d9e8ec23146102ad578063f2fde38b146102e7578063f9a920881461030d578063fe5f0d1a1461031557610121565b806399deb996146102355780639c09799d1461023d5780639dc29fac14610245578063af14052c14610271578063cc314dcb1461027957610121565b806366935278116100f457806366935278146101b5578063715018a6146101db5780637663f5e2146101e357806387921ea0146102075780638da5cb5b1461022d57610121565b806309b1f9fc14610126578063105bad4f1461014e5780633a93069b1461016f57806340c10f1914610189575b600080fd5b61014c6004803603602081101561013c57600080fd5b50356001600160a01b0316610338565b005b6101566103e6565b6040805192835260208301919091528051918290030190f35b61017761046f565b60408051918252519081900360200190f35b61014c6004803603604081101561019f57600080fd5b506001600160a01b038135169060200135610475565b61014c600480360360208110156101cb57600080fd5b50356001600160a01b0316610574565b61014c61062a565b6101eb6106cc565b604080516001600160a01b039092168252519081900360200190f35b61014c6004803603602081101561021d57600080fd5b50356001600160a01b03166106db565b6101eb610755565b610177610764565b61017761076a565b61014c6004803603604081101561025b57600080fd5b506001600160a01b038135169060200135610770565b61014c61086f565b6101eb610ada565b61014c6004803603604081101561029757600080fd5b506001600160a01b038135169060200135610ae9565b6102d3600480360360208110156102c357600080fd5b50356001600160a01b0316610bb5565b604080519115158252519081900360200190f35b61014c600480360360208110156102fd57600080fd5b50356001600160a01b0316610bca565b610177610cc3565b61014c6004803603604081101561032b57600080fd5b5080359060200135610cc9565b610340610d63565b6033546001600160a01b03908116911614610390576040805162461bcd60e51b8152602060048201819052602482015260008051602061110c833981519152604482015290519081900360640190fd5b6001600160a01b0381166000818152606b60209081526040808320805460ff191690558051928352517fac9ed55978d682b61923ed2b7e5972d9ec65bd33e859849eb45b136948f53dd49281900390910190a250565b600080606754606560009054906101000a90046001600160a01b03166001600160a01b0316631a795e296040518163ffffffff1660e01b815260040160206040518083038186803b15801561043a57600080fd5b505afa15801561044e573d6000803e3d6000fd5b505050506040513d602081101561046457600080fd5b505190925090509091565b60685481565b336000908152606b602052604090205460ff166104c35760405162461bcd60e51b81526004018080602001828103825260318152602001806110ad6031913960400191505060405180910390fd5b606554604080516340c10f1960e01b81526001600160a01b03858116600483015260248201859052915191909216916340c10f1991604480830192600092919082900301818387803b15801561051857600080fd5b505af115801561052c573d6000803e3d6000fd5b50506040805184815290516001600160a01b03861693503392507f2276cb64a5c1a1b4e0a9b3dd983a74152445c9a7205a8885994430f51eef1ef79181900360200190a35050565b61057c610d63565b6033546001600160a01b039081169116146105cc576040805162461bcd60e51b8152602060048201819052602482015260008051602061110c833981519152604482015290519081900360640190fd5b6001600160a01b0381166000818152606b6020908152604091829020805460ff19166001908117909155825190815291517fac9ed55978d682b61923ed2b7e5972d9ec65bd33e859849eb45b136948f53dd49281900390910190a250565b610632610d63565b6033546001600160a01b03908116911614610682576040805162461bcd60e51b8152602060048201819052602482015260008051602061110c833981519152604482015290519081900360640190fd5b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b6066546001600160a01b031681565b6106e3610d63565b6033546001600160a01b03908116911614610733576040805162461bcd60e51b8152602060048201819052602482015260008051602061110c833981519152604482015290519081900360640190fd5b606680546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b031690565b60675481565b60695481565b336000908152606b602052604090205460ff166107be5760405162461bcd60e51b81526004018080602001828103825260318152602001806110ad6031913960400191505060405180910390fd5b60655460408051632770a7eb60e21b81526001600160a01b0385811660048301526024820185905291519190921691639dc29fac91604480830192600092919082900301818387803b15801561081357600080fd5b505af1158015610827573d6000803e3d6000fd5b50506040805184815290516001600160a01b03861693503392507fc6b579eab3b88dfe8714487b5065949e975cd741c0fb9322bb967c8075ddde0c9181900360200190a35050565b606754606954116108c7576040805162461bcd60e51b815260206004820181905260248201527f5843416d706c65436f6e74726f6c6c65723a2045706f6368206e6f74206e6577604482015290519081900360640190fd5b600061094b606560009054906101000a90046001600160a01b03166001600160a01b0316631a795e296040518163ffffffff1660e01b815260040160206040518083038186803b15801561091a57600080fd5b505afa15801561092e573d6000803e3d6000fd5b505050506040513d602081101561094457600080fd5b5051610d67565b606554606954606a5460408051630163b36d60e21b815260048101939093526024830191909152519293506001600160a01b039091169163058ecdb4916044808201926020929091908290030181600087803b1580156109aa57600080fd5b505af11580156109be573d6000803e3d6000fd5b505050506040513d60208110156109d457600080fd5b5050606a546000906109f19083906109eb90610d67565b90610dc9565b6069546067819055426068819055604080518481526020810192909252805193945091927f103acf79ad7b5ac64c3d3a9adc0e6f80d75d4147d7bf72efcb61480457351eb0929181900390910190a26066546001600160a01b031615610ad657606660009054906101000a90046001600160a01b03166001600160a01b031663a378ff3e6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610aa157600080fd5b505af1158015610ab5573d6000803e3d6000fd5b505050506040513d6020811015610acb57600080fd5b5051610ad657600080fd5b5050565b6065546001600160a01b031681565b600054610100900460ff1680610b025750610b02610e35565b80610b10575060005460ff16155b610b4b5760405162461bcd60e51b815260040180806020018281038252602e8152602001806110de602e913960400191505060405180910390fd5b600054610100900460ff16158015610b76576000805460ff1961ff0019909116610100171660011790555b610b7e610e3b565b606580546001600160a01b0319166001600160a01b03851617905560678290558015610bb0576000805461ff00191690555b505050565b606b6020526000908152604090205460ff1681565b610bd2610d63565b6033546001600160a01b03908116911614610c22576040805162461bcd60e51b8152602060048201819052602482015260008051602061110c833981519152604482015290519081900360640190fd5b6001600160a01b038116610c675760405162461bcd60e51b81526004018080602001828103825260268152602001806110876026913960400191505060405180910390fd5b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b606a5481565b336000908152606b602052604090205460ff16610d175760405162461bcd60e51b81526004018080602001828103825260318152602001806110ad6031913960400191505060405180910390fd5b6069829055606a819055604080518281524260208201528151849233927faff3f230b06afa07a1935063aa6b673104174ba95f91110d5cf273fb5a73f6a1929081900390910190a35050565b3390565b60006001600160ff1b03821115610dc5576040805162461bcd60e51b815260206004820152601b60248201527f55496e743235364c69623a20696e74323536206f766572666c6f770000000000604482015290519081900360640190fd5b5090565b6000818303818312801590610dde5750838113155b80610df35750600083128015610df357508381135b610e2e5760405162461bcd60e51b815260040180806020018281038252602481526020018061112c6024913960400191505060405180910390fd5b9392505050565b303b1590565b600054610100900460ff1680610e545750610e54610e35565b80610e62575060005460ff16155b610e9d5760405162461bcd60e51b815260040180806020018281038252602e8152602001806110de602e913960400191505060405180910390fd5b600054610100900460ff16158015610ec8576000805460ff1961ff0019909116610100171660011790555b610ed0610eed565b610ed8610f8d565b8015610eea576000805461ff00191690555b50565b600054610100900460ff1680610f065750610f06610e35565b80610f14575060005460ff16155b610f4f5760405162461bcd60e51b815260040180806020018281038252602e8152602001806110de602e913960400191505060405180910390fd5b600054610100900460ff16158015610ed8576000805460ff1961ff0019909116610100171660011790558015610eea576000805461ff001916905550565b600054610100900460ff1680610fa65750610fa6610e35565b80610fb4575060005460ff16155b610fef5760405162461bcd60e51b815260040180806020018281038252602e8152602001806110de602e913960400191505060405180910390fd5b600054610100900460ff1615801561101a576000805460ff1961ff0019909116610100171660011790555b6000611024610d63565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015610eea576000805461ff00191690555056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573735843416d706c65436f6e74726f6c6c65723a204272696467652067617465776179206e6f742077686974656c6973746564496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a65644f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725369676e6564536166654d6174683a207375627472616374696f6e206f766572666c6f77a2646970667358221220533eed1b2e059ca8f1836d74de719d4d4d0da6e3c12663caa62d17480c9928a464736f6c634300060c0033"; diff --git a/src/Contracts/commons.ts b/src/Contracts/commons.ts new file mode 100644 index 00000000..760b7a6a --- /dev/null +++ b/src/Contracts/commons.ts @@ -0,0 +1,23 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { EventFilter, Event } from "ethers"; +import { Result } from "@ethersproject/abi"; + +export interface TypedEventFilter<_EventArgsArray, _EventArgsObject> + extends EventFilter {} + +export interface TypedEvent extends Event { + args: EventArgs; +} + +export type TypedListener< + EventArgsArray extends Array, + EventArgsObject +> = ( + ...listenerArg: [ + ...EventArgsArray, + TypedEvent + ] +) => void; diff --git a/src/Layouts/AppFooter.tsx b/src/Layouts/AppFooter.tsx new file mode 100644 index 00000000..291c44e1 --- /dev/null +++ b/src/Layouts/AppFooter.tsx @@ -0,0 +1,47 @@ +import { createStyles, ITheme, makeStyles } from "@chainsafe/common-theme"; +import React, { useState } from "react"; +import clsx from "clsx"; +import AboutDrawer from "../Modules/AboutDrawer"; +import MeterLogo from "../media/bridges/meter.png"; + +const useStyles = makeStyles(({ constants, palette, zIndex }: ITheme) => { + return createStyles({ + root: { + display: "flex", + position: "fixed", + justifyContent: "space-between", + padding: `${constants.generalUnit * 2}px ${constants.generalUnit * 4}px`, + width: "100%", + bottom: 0, + left: 0, + backgroundColor: palette.additional["header"][1], + borderTop: `1px solid ${palette.additional["header"][3]}`, + color: palette.additional["header"][2], + alignItems: "center", + zIndex: zIndex?.layer1, + }, + bridgeLogo: { + width: "50px", + } + }); +}); + +interface IAppFooter {} + +const AppFooter: React.FC = () => { + const classes = useStyles(); + const [aboutOpen, setAboutOpen] = useState(false); + return ( +
+ setAboutOpen(false)} /> + +
+ ); +}; + +export default AppFooter; diff --git a/src/Layouts/AppHeader.tsx b/src/Layouts/AppHeader.tsx index 98a0c678..fffade92 100644 --- a/src/Layouts/AppHeader.tsx +++ b/src/Layouts/AppHeader.tsx @@ -5,6 +5,7 @@ import { Typography } from "@chainsafe/common-components"; import { shortenAddress } from "../Utils/Helpers"; import { useWeb3 } from "@chainsafe/web3-context"; import { useChainbridge } from "../Contexts/ChainbridgeContext"; +// import AMPLLogo from "../media/ample-logo/logo.png"; const useStyles = makeStyles(({ constants, palette, zIndex }: ITheme) => { return createStyles({ @@ -20,7 +21,7 @@ const useStyles = makeStyles(({ constants, palette, zIndex }: ITheme) => { borderBottom: `1px solid ${palette.additional["header"][3]}`, color: palette.additional["header"][2], alignItems: "center", - zIndex: zIndex?.layer2, + zIndex: zIndex?.layer1, }, left: { display: "flex", @@ -36,6 +37,17 @@ const useStyles = makeStyles(({ constants, palette, zIndex }: ITheme) => { maxWidth: "100%", }, }, + logoBranding: { + fontFamily: 'Montserrat Alternates', + fontWeight: 900, + fontStyle: "normal", + letterSpacing: "0px", + fontSize: "1.25rem", + color: "black", + }, + logoLink: { + textDecoration: "none", + }, state: { display: "flex", flexDirection: "row", @@ -65,11 +77,12 @@ const AppHeader: React.FC = () => { return (
- {/* ADD LOGO HERE */} - {/*
- -
*/} - ChainBridge Token Swap + {/*
+ +
*/} + + AMPL Bridge +
{!isReady ? ( diff --git a/src/Layouts/AppWrapper.tsx b/src/Layouts/AppWrapper.tsx index eab40626..792331c9 100644 --- a/src/Layouts/AppWrapper.tsx +++ b/src/Layouts/AppWrapper.tsx @@ -3,6 +3,7 @@ import { createStyles, ITheme, makeStyles } from "@chainsafe/common-theme"; import React from "react"; import { ReactNode } from "react"; import AppHeader from "./AppHeader"; +import AppFooter from "./AppFooter"; import { ReactComponent as GlobalSvg } from "../media/Icons/global.svg"; import { ReactComponent as GiftSvg } from "../media/Icons/gift.svg"; import { ROUTE_LINKS } from "../Components/Routes"; @@ -16,12 +17,12 @@ const useStyles = makeStyles(({ animation, constants, palette }: ITheme) => { minHeight: "100vh", display: "flex", flexDirection: "column", - justifyContent: "center", + // justifyContent: "center", paddingTop: 60, }, inner: { - paddingTop: (constants.navItemHeight as number) * 2, - paddingBottom: (constants.navItemHeight as number) * 2, + paddingTop: (constants.navItemHeight as number) * 0.5, + paddingBottom: (constants.navItemHeight as number) * 0.5, }, cta: { display: "block", @@ -40,15 +41,18 @@ const useStyles = makeStyles(({ animation, constants, palette }: ITheme) => { maxWidth: 460, display: "flex", flexDirection: "column", - overflow: "hidden", - borderRadius: 4, + // overflow: "hidden", + borderRadius: 0, }, pageArea: { height: "100%", width: "100%", overflow: "hidden", - border: `1px solid ${palette.additional["gray"][7]}`, - borderRadius: 4, + // border: `1px solid ${palette.additional["gray"][7]}`, + borderRadius: 0, + "-webkit-box-shadow": "0px -2px 25px -3px rgb(0 0 0 / 10%)", + "-moz-box-shadow": "0px -2px 25px -3px rgba(0, 0, 0, 0.1)", + "box-shadow": "0px -2px 25px -3px rgb(0 0 0 / 10%)", }, navTabs: { // position: "absolute", @@ -104,16 +108,12 @@ const AppWrapper: React.FC = ({ children }: IAppWrapper) => {
-
+ {/*
Transfer - - - Wrap token - -
+
*/}
{children}
@@ -121,6 +121,7 @@ const AppWrapper: React.FC = ({ children }: IAppWrapper) => { {/* */}
+
); }; diff --git a/src/Modules/AboutDrawer.tsx b/src/Modules/AboutDrawer.tsx index b60c28f6..dc4606ce 100644 --- a/src/Modules/AboutDrawer.tsx +++ b/src/Modules/AboutDrawer.tsx @@ -4,12 +4,16 @@ import { makeStyles, createStyles, ITheme } from "@chainsafe/common-theme"; import CustomDrawer from "../Components/Custom/CustomDrawer"; import { Button, Typography } from "@chainsafe/common-components"; -const useStyles = makeStyles(({ constants }: ITheme) => +const useStyles = makeStyles(({ constants, zIndex }: ITheme) => createStyles({ root: { display: "flex", flexDirection: "column", justifyContent: "space-between", + zIndex: zIndex?.layer3, + }, + link: { + color: "#ffffff", }, buttons: { display: "flex", @@ -37,18 +41,20 @@ const AboutDrawer: React.FC = ({ return ( - What is ChainBridge? + What is the AMPL Bridge? - ChainBridge is a modular multi-directional blockchain bridge to allow - data and value transfer between any number of blockchains. This should - enable users to specify a destination blockchain from their source - chain, and send data to that blockchain for consumption on the - destination chain.
-
- This could be a token that is locked on ChainA and redeemed on ChainB, - or an operation that is executed on a destination chain and initiated on - the source chain. + The AMPL Bridge is a n-way POA +  blockchain bridge which allows AMPL to be + transfer between any two connected blockchains. +


+ + This bridge currently supports transfers between Ethereum and BSC and is validated by +  Meter Passport. +


+ + Learn more +  about how AMPL works acorss muliple chains.
diff --git a/src/Themes/AmpleforthTheme.ts b/src/Themes/AmpleforthTheme.ts new file mode 100644 index 00000000..63bbcd60 --- /dev/null +++ b/src/Themes/AmpleforthTheme.ts @@ -0,0 +1,114 @@ +import { createTheme } from "@chainsafe/common-theme"; + +export const ampleTheme = createTheme({ + globalStyling: { + body: { + background: "#ffffff", + }, + }, + themeConfig: { + constants: { + navItemHeight: 42, + }, + palette: { + additional: { + general: { + 1: "#007AFF", // Accents + }, + transferUi: { + 1: "#5856d6", // FAQ button + }, + header: { + 1: "#ffffff", // Background + 2: "#595959", // Text color + 3: "#ffffff00", // border + }, + preflight: { + 1: "#85A5FF", // Button bg color + 2: "#262626", // Button color + }, + transactionModal: { + 1: "#597EF7", // border //geekblue5 + 2: "#85A5FF", // indicator border //geekblue4 + 3: "#2F54EB", // indicator text //geekblue6 + }, + }, + }, + overrides: { + CheckboxInput: { + root: { + alignItems: "center", + }, + }, + Button: { + variants: { + primary: { + root: { + backgroundColor: "#262626", + color: "#ffffff", + border: `1px solid #262626`, + "& svg": { + fill: "#ffffff", + }, + }, + active: { + backgroundColor: "#ffffff", + color: "#262626", + "& svg": { + fill: "#262626", + }, + }, + hover: { + backgroundColor: "#ffffff", + color: "#262626", + "& svg": { + fill: "#262626", + }, + }, + focus: { + backgroundColor: "#ffffff", + color: "#262626", + "& svg": { + fill: "#262626", + }, + }, + }, + outline: { + root: { + backgroundColor: "transparent", + color: "#ffffff", + border: `1px solid #ffffff`, + "& svg": { + fill: "#ffffff", + }, + }, + active: { + backgroundColor: "#ffffff", + color: "#262626", + borderColor: "#ffffff", + "& svg": { + fill: "#262626", + }, + }, + hover: { + backgroundColor: "#ffffff", + color: "#262626", + borderColor: "#ffffff", + "& svg": { + fill: "#262626", + }, + }, + focus: { + backgroundColor: "#ffffff", + color: "#262626", + borderColor: "#ffffff", + "& svg": { + fill: "#262626", + }, + }, + }, + }, + }, + }, + }, +}); diff --git a/src/Utils/XCAmple.tsx b/src/Utils/XCAmple.tsx new file mode 100644 index 00000000..d7ccef73 --- /dev/null +++ b/src/Utils/XCAmple.tsx @@ -0,0 +1,56 @@ +import { + BigNumber, + BigNumberish, + utils, +} from "ethers"; + + +const toHex = (covertThis:number, padding:number):string => { + return utils.hexZeroPad(utils.hexlify(covertThis), padding); +}; + +const createGenericDepositData = (hexMetaData:string):string => { + if (hexMetaData === null) { + return '0x' + toHex(0, 32).substr(2); + } + const hexMetaDataLength = hexMetaData.substr(2).length / 2; + return '0x' + toHex(hexMetaDataLength, 32).substr(2) + hexMetaData.substr(2); +}; + +export const safeRound = (amount:number, decimals:number):string => { + const nDecimals = decimals/2; + const adjFactor = 10**(nDecimals); + return (Math.floor(amount*adjFactor) / adjFactor).toFixed(nDecimals); +} + +export const packXCTransferData = (depositor:string, recipient:string, amount:BigNumberish, totalSupply:BigNumberish):string => { + return createGenericDepositData( + utils.defaultAbiCoder.encode( + ['address', 'address', 'uint256', 'uint256'], + [depositor, recipient, amount, totalSupply], + ), + ); +}; + +export type TransferData = { + depositor: string; + recipient: string; + amount: BigNumber; + totalSupply: BigNumber; +}; + +export const decodeXCTransferData = (data:string):TransferData => { + const r = utils.defaultAbiCoder.decode( + ['address', 'address', 'uint256', 'uint256'], + data, + ); + + const t:TransferData = { + depositor:r[0], + recipient:r[1], + amount:BigNumber.from(r[2]), + totalSupply:BigNumber.from(r[3]), + }; + + return t; +}; diff --git a/src/chainbridgeConfig.ts b/src/chainbridgeConfig.ts index bf1f4458..e522d04d 100644 --- a/src/chainbridgeConfig.ts +++ b/src/chainbridgeConfig.ts @@ -1,5 +1,5 @@ -import ETHIcon from "./media/tokens/eth.svg"; -import WETHIcon from "./media/tokens/weth.svg"; +import AMPLIcon from "./media/ample-logo/logo.png"; + export type TokenConfig = { address: string; @@ -15,14 +15,17 @@ export type BridgeConfig = { networkId: number; name: string; bridgeAddress: string; - erc20HandlerAddress: string; + genericHandlerAddress: string; + controller: string; + approvalContract: string; rpcUrl: string; type: "Ethereum" | "Substrate"; tokens: TokenConfig[]; nativeTokenSymbol: string; - //This should be the full path to display a tx hash, without the trailing slash, ie. https://etherscan.io/tx + // This should be the full path to display a tx hash, without the trailing slash, ie. https://etherscan.io/tx blockExplorer?: string; defaultGasPrice?: number; + deployedBlockNumber?: number; }; export type ChainbridgeConfig = { @@ -30,106 +33,70 @@ export type ChainbridgeConfig = { }; export const chainbridgeConfig: ChainbridgeConfig = { - // Goerli - Kotti Bridge chains: [ { chainId: 1, - networkId: 5, - name: "Ethereum - Goerli", - bridgeAddress: "0x2524d71D163f60747630c4EBeB077a9832329646", - erc20HandlerAddress: "0xDc26320258ADfd806d125223Fb0F94e54D13FA51", - rpcUrl: "https://goerli.prylabs.net", + networkId: 3, + name: "Ropsten", + bridgeAddress: "0x6fC272eD9B6B947a7858DF30D7DD2D8173306EA8", + genericHandlerAddress: "0xBAb8402E278F45d51BB342525716611fE1090027", + controller: "0x7F93DE6733602f4606986389e4fbaC2010904aCE", + approvalContract: "0xa0DF1131eFA62E487dF180Feb9ecF1cdE7aad632", + rpcUrl: "https://eth-ropsten.alchemyapi.io/v2/x2jT9wfMVj9S3IjBoniQXNAF14Yaktg6", type: "Ethereum", - blockExplorer: "https://goerli.etherscan.io/tx", - nativeTokenSymbol: "ETH", + blockExplorer: "https://ropsten.etherscan.io/tx", + nativeTokenSymbol: "RETH", + deployedBlockNumber: 10126635, tokens: [ { - address: "0x735B895bCb37cBba5812154f4F34480EcE1B672C", - name: "Wrapped ETC", - symbol: "wETC", - imageUri: WETHIcon, + address: "0xD0E9335817f7B7c2567b784FD55b203697177E2A", + imageUri: AMPLIcon, resourceId: - "0x000000000000000000000023A9FD05ef0c5fb9dDE964C4d4191A169Fd221f802", - }, + "0x1f3eb8ee12ce38ffa19fc4c635621ad2c9a0bd609def9ddce77680e33bc2224b", + } + ], + }, { + chainId: 4, + networkId: 97, + name: "BSC Testnet", + bridgeAddress: "0xcCeA086cbb7DA6bA5eb004fAd435F9b7712bA80e", + genericHandlerAddress: "0x56f03E0B73fa6Ff6704CA399CE88282EDcF9FeEA", + controller: "0x22881e9feb1746109227397cAe6Cd86859b9C43e", + approvalContract: "0x22881e9feb1746109227397cAe6Cd86859b9C43e", + rpcUrl: "https://data-seed-prebsc-2-s3.binance.org:8545", + type: "Ethereum", + blockExplorer: "https://testnet.bscscan.io/tx", + nativeTokenSymbol: "TBNB", + deployedBlockNumber: 8356136, + tokens: [ { - address: "0x14dD060dB55c0E7cc072BD3ab4709d55583119c0", - name: "An ERC20", - symbol: "ERC20", - imageUri: ETHIcon, + address: "0x75c00CF8B6C932AaD2E20fa238a57D389aE3842d", + imageUri: AMPLIcon, resourceId: - "0x000000000000000000000014dD060dB55c0E7cc072BD3ab4709d55583119c001", - }, + "0x1f3eb8ee12ce38ffa19fc4c635621ad2c9a0bd609def9ddce77680e33bc2224b", + } ], - }, - { + }, { chainId: 2, - networkId: 6, - name: "Ethereum Classic - Kotti", - bridgeAddress: "0x2524d71D163f60747630c4EBeB077a9832329646", - erc20HandlerAddress: "0xDc26320258ADfd806d125223Fb0F94e54D13FA51", - rpcUrl: "https://www.ethercluster.com/kotti", + networkId: 101, + name: "Meter Testnet", + bridgeAddress: "0x4E68f5f704878e69AF9d58D5616168d69f1D03e4", + genericHandlerAddress: "0x56f03E0B73fa6Ff6704CA399CE88282EDcF9FeEA", + controller: "0x073ebB139F18d78c2671a316336bB8e1B52e60EA", + approvalContract: "0x073ebB139F18d78c2671a316336bB8e1B52e60EA", + rpcUrl: "https://rpctest.meter.io", type: "Ethereum", - blockExplorer: "https://blockscout.com/etc/kotti/tx", - nativeTokenSymbol: "ETC", + blockExplorer: "https://scan-warringstakes.meter.io/tx", + nativeTokenSymbol: "TMTR", + deployedBlockNumber: 1092980, tokens: [ { - address: "0x23A9FD05ef0c5fb9dDE964C4d4191A169Fd221f8", - name: "Wrapped ETC", - symbol: "wETC", - imageUri: WETHIcon, - resourceId: - "0x000000000000000000000023A9FD05ef0c5fb9dDE964C4d4191A169Fd221f802", - isNativeWrappedToken: true, - }, - { - address: "0x14dD060dB55c0E7cc072BD3ab4709d55583119c0", - name: "An ERC20", - symbol: "ERC20", - imageUri: ETHIcon, + address: "0xd259ED8E7ACa1f5eA16fD58a860c09Af335b8198", + imageUri: AMPLIcon, resourceId: - "0x000000000000000000000014dD060dB55c0E7cc072BD3ab4709d55583119c001", - }, + "0x1f3eb8ee12ce38ffa19fc4c635621ad2c9a0bd609def9ddce77680e33bc2224b", + } ], }, ], - - // DEVNET - // erc20ResourceId: - // "0x00000000000000000000000021605f71845f372A9ed84253d2D024B7B10999f4", - // chains: [ - // { - // chainId: 1, - // networkId: 5, - // name: "Ethereum - A", - // bridgeAddress: "0x62877dDCd49aD22f5eDfc6ac108e9a4b5D2bD88B", - // erc20HandlerAddress: "0x3167776db165D8eA0f51790CA2bbf44Db5105ADF", - // rpcUrl: "http://localhost:8545", - // type: "Ethereum", - // tokens: [ - // { - // address: "0x21605f71845f372A9ed84253d2D024B7B10999f4", - // name: "Test EthA", - // symbol: "TESTA", - // imageUri: ETHIcon, - // }, - // ], - // }, - // { - // chainId: 2, - // networkId: 6, - // name: "Ethereum - B", - // bridgeAddress: "0x62877dDCd49aD22f5eDfc6ac108e9a4b5D2bD88B", - // erc20HandlerAddress: "0x3167776db165D8eA0f51790CA2bbf44Db5105ADF", - // rpcUrl: "http://localhost:8546", - // type: "Ethereum", - // tokens: [ - // { - // address: "0x21605f71845f372A9ed84253d2D024B7B10999f4", - // name: "Test EthB", - // symbol: "TESTB", - // imageUri: ETHIcon, - // }, - // ], - // }, - // ] }; diff --git a/src/media/ample-logo/logo.png b/src/media/ample-logo/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..da535f6df531d930eb283113edcd7db845c0699c GIT binary patch literal 2437 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 literal 0 HcmV?d00001 diff --git a/src/media/ample-logo/logo_white.png b/src/media/ample-logo/logo_white.png new file mode 100755 index 0000000000000000000000000000000000000000..0d3e6488bb3a4c212ec239c8afe0e58fa968d83d GIT binary patch literal 38744 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

NUf3+QZ9>Pb3Z}vbI4j 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 literal 0 HcmV?d00001 diff --git a/tsconfig.json b/tsconfig.json index 2cd50b9f..76aab169 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -17,7 +17,8 @@ "sourceMap": true, "inlineSources": true, "sourceRoot": "/", - "downlevelIteration": true + "downlevelIteration": true, + "noImplicitAny": false }, "include": ["src"] } diff --git a/yarn.lock b/yarn.lock index 2a1aeb86..11c05933 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4746,9 +4746,9 @@ caniuse-api@^3.0.0: lodash.uniq "^4.5.0" caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001035, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001135: - version "1.0.30001151" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001151.tgz#1ddfde5e6fff02aad7940b4edb7d3ac76b0cb00b" - integrity sha512-Zh3sHqskX6mHNrqUerh+fkf0N72cMxrmflzje/JyVImfpknscMnkeJrlFGJcqTmaa0iszdYptGpWMJCRQDkBVw== + version "1.0.30001228" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001228.tgz" + integrity sha512-QQmLOGJ3DEgokHbMSA8cj2a+geXqmnpyOFT0lhQV6P3/YOJvGDEwoedcwxEQ30gJIwIIunHIicunJ2rzK5gB2A== capture-exit@^2.0.0: version "2.0.0" From 402de9ced9cb54c6cb6f62daf7f86263ffc083cb Mon Sep 17 00:00:00 2001 From: nithin Date: Sat, 29 May 2021 11:21:04 -0400 Subject: [PATCH 02/12] mainnnet config --- src/Components/Pages/TransferPage.tsx | 2 +- src/Modules/AboutDrawer.tsx | 2 +- src/Modules/PreflightModalTransfer.tsx | 2 +- src/chainbridgeConfig.ts | 77 ++++++++++--------------- src/media/ample-logo/ampl_bsc_mp.png | Bin 0 -> 3914 bytes 5 files changed, 32 insertions(+), 51 deletions(-) create mode 100644 src/media/ample-logo/ampl_bsc_mp.png diff --git a/src/Components/Pages/TransferPage.tsx b/src/Components/Pages/TransferPage.tsx index 0ac64473..6fd3c842 100644 --- a/src/Components/Pages/TransferPage.tsx +++ b/src/Components/Pages/TransferPage.tsx @@ -28,7 +28,7 @@ const useStyles = makeStyles(({ constants, palette }: ITheme) => root: { padding: constants.generalUnit * 6, position: "relative", - minHeight: '730px', + minHeight: '800px', }, walletArea: { display: "flex", diff --git a/src/Modules/AboutDrawer.tsx b/src/Modules/AboutDrawer.tsx index dc4606ce..121af1d9 100644 --- a/src/Modules/AboutDrawer.tsx +++ b/src/Modules/AboutDrawer.tsx @@ -46,7 +46,7 @@ const AboutDrawer: React.FC = ({ The AMPL Bridge is a n-way POA  blockchain bridge which allows AMPL to be - transfer between any two connected blockchains. + transferred between any two connected blockchains.


This bridge currently supports transfers between Ethereum and BSC and is validated by diff --git a/src/Modules/PreflightModalTransfer.tsx b/src/Modules/PreflightModalTransfer.tsx index 84397def..5bfb7f12 100644 --- a/src/Modules/PreflightModalTransfer.tsx +++ b/src/Modules/PreflightModalTransfer.tsx @@ -105,7 +105,7 @@ const PreflightModalTransfer: React.FC = ({

  • - The transaction fee may be higher than expected. + The bridge is not run by Fragments or the Ampleforth foundation.
  • diff --git a/src/chainbridgeConfig.ts b/src/chainbridgeConfig.ts index e522d04d..84623019 100644 --- a/src/chainbridgeConfig.ts +++ b/src/chainbridgeConfig.ts @@ -1,5 +1,5 @@ import AMPLIcon from "./media/ample-logo/logo.png"; - +import AMPL_BSC_MP_Icon from "./media/ample-logo/ampl_bsc_mp.png"; export type TokenConfig = { address: string; @@ -36,66 +36,47 @@ export const chainbridgeConfig: ChainbridgeConfig = { chains: [ { chainId: 1, - networkId: 3, - name: "Ropsten", - bridgeAddress: "0x6fC272eD9B6B947a7858DF30D7DD2D8173306EA8", - genericHandlerAddress: "0xBAb8402E278F45d51BB342525716611fE1090027", - controller: "0x7F93DE6733602f4606986389e4fbaC2010904aCE", - approvalContract: "0xa0DF1131eFA62E487dF180Feb9ecF1cdE7aad632", - rpcUrl: "https://eth-ropsten.alchemyapi.io/v2/x2jT9wfMVj9S3IjBoniQXNAF14Yaktg6", + networkId: 1, + name: "Ethereum", + bridgeAddress: "0xbD515E41DF155112Cc883f8981CB763a286261be", + genericHandlerAddress: "0x517828d2549cEC09386f89a67E92825E26740240", + controller: "0x1B228a749077b8e307C5856cE62Ef35d96Dca2ea", + approvalContract: "0x805c7Ecba41f9321bb098ec1cf31d86d9407de2F", + rpcUrl: + "https://eth-mainnet.alchemyapi.io/v2/x2jT9wfMVj9S3IjBoniQXNAF14Yaktg6", type: "Ethereum", - blockExplorer: "https://ropsten.etherscan.io/tx", - nativeTokenSymbol: "RETH", - deployedBlockNumber: 10126635, + blockExplorer: "https://etherscan.io/tx", + nativeTokenSymbol: "ETH", + deployedBlockNumber: 12345342, tokens: [ { - address: "0xD0E9335817f7B7c2567b784FD55b203697177E2A", + address: "0xD46bA6D942050d489DBd938a2C909A5d5039A161", imageUri: AMPLIcon, resourceId: "0x1f3eb8ee12ce38ffa19fc4c635621ad2c9a0bd609def9ddce77680e33bc2224b", - } + }, ], - }, { + }, + { chainId: 4, - networkId: 97, - name: "BSC Testnet", - bridgeAddress: "0xcCeA086cbb7DA6bA5eb004fAd435F9b7712bA80e", - genericHandlerAddress: "0x56f03E0B73fa6Ff6704CA399CE88282EDcF9FeEA", - controller: "0x22881e9feb1746109227397cAe6Cd86859b9C43e", - approvalContract: "0x22881e9feb1746109227397cAe6Cd86859b9C43e", - rpcUrl: "https://data-seed-prebsc-2-s3.binance.org:8545", + networkId: 56, + name: "BSC", + bridgeAddress: "0x223fafbc2cA53A75CcfF5B2369128d3d1a828F36", + genericHandlerAddress: "0x83Fc24eB56121FA2A05e0b5170E7310738425839", + controller: "0x17F084dFF8a71e38521BCBD3Da871753Dc67aa81", + approvalContract: "0x17F084dFF8a71e38521BCBD3Da871753Dc67aa81", + rpcUrl: "https://bsc-dataseed.binance.org/", type: "Ethereum", - blockExplorer: "https://testnet.bscscan.io/tx", - nativeTokenSymbol: "TBNB", - deployedBlockNumber: 8356136, + blockExplorer: "https://bscscan.com/tx", + nativeTokenSymbol: "BNB", + deployedBlockNumber: 7028782, tokens: [ { - address: "0x75c00CF8B6C932AaD2E20fa238a57D389aE3842d", - imageUri: AMPLIcon, - resourceId: - "0x1f3eb8ee12ce38ffa19fc4c635621ad2c9a0bd609def9ddce77680e33bc2224b", - } - ], - }, { - chainId: 2, - networkId: 101, - name: "Meter Testnet", - bridgeAddress: "0x4E68f5f704878e69AF9d58D5616168d69f1D03e4", - genericHandlerAddress: "0x56f03E0B73fa6Ff6704CA399CE88282EDcF9FeEA", - controller: "0x073ebB139F18d78c2671a316336bB8e1B52e60EA", - approvalContract: "0x073ebB139F18d78c2671a316336bB8e1B52e60EA", - rpcUrl: "https://rpctest.meter.io", - type: "Ethereum", - blockExplorer: "https://scan-warringstakes.meter.io/tx", - nativeTokenSymbol: "TMTR", - deployedBlockNumber: 1092980, - tokens: [ - { - address: "0xd259ED8E7ACa1f5eA16fD58a860c09Af335b8198", - imageUri: AMPLIcon, + address: "0xDB021b1B247fe2F1fa57e0A87C748Cc1E321F07F", + imageUri: AMPL_BSC_MP_Icon, resourceId: "0x1f3eb8ee12ce38ffa19fc4c635621ad2c9a0bd609def9ddce77680e33bc2224b", - } + }, ], }, ], diff --git a/src/media/ample-logo/ampl_bsc_mp.png b/src/media/ample-logo/ampl_bsc_mp.png new file mode 100644 index 0000000000000000000000000000000000000000..6030f76ed47de2d159b167b2700b88b32d869d6d GIT binary patch literal 3914 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 NJiid`k&lFb{TJ;9_9y@V literal 0 HcmV?d00001 From a58e239832b85b82d98ba2b0cf711d3c01e9a9f4 Mon Sep 17 00:00:00 2001 From: nithin Date: Mon, 9 Aug 2021 11:46:43 -0400 Subject: [PATCH 03/12] updated web3 context for london hardfork --- package.json | 4 +- src/App.tsx | 4 +- src/Components/Custom/TokenInput.tsx | 2 +- src/Components/Custom/TokenSelectInput.tsx | 2 +- src/Components/Pages/TransferPage.tsx | 2 +- src/Components/Pages/WrapperPage.tsx | 2 +- src/Contexts/ChainbridgeContext.tsx | 6 +- src/Layouts/AppHeader.tsx | 2 +- src/Modules/ChangeNetworkDrawer.tsx | 2 +- src/Modules/TransferActiveModal.tsx | 2 +- yarn.lock | 599 +++++++++++++-------- 11 files changed, 404 insertions(+), 223 deletions(-) diff --git a/package.json b/package.json index 0cce92d5..8ed837bc 100755 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "@babel/core": "^7.12.3", "@babel/runtime": "^7.12.1", "@chainsafe/chainbridge-contracts": "^1.0.3", - "@chainsafe/web3-context": "1.2.0", + "@meterio/web3-context": "1.2.3", "@chainsafe/common-components": "1.0.26", "@chainsafe/common-theme": "1.0.6", "@material-ui/styles": "4.10.0", @@ -15,7 +15,7 @@ "bnc-onboard": "1.19.2", "clsx": "^1.1.1", "dayjs": "^1.9.1", - "ethers": "^5.0.17", + "ethers": "^5.4.4", "formik": "^2.2.0", "history": "^5.0.0", "react": "^16.13.1", diff --git a/src/App.tsx b/src/App.tsx index b7bb1b10..87a2f0c8 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -11,7 +11,7 @@ import Routes from "./Components/Routes"; import { ampleTheme } from "./Themes/AmpleforthTheme"; import { ChainbridgeProvider } from "./Contexts/ChainbridgeContext"; import AppWrapper from "./Layouts/AppWrapper"; -import { Web3Provider } from "@chainsafe/web3-context"; +import { Web3Provider } from "@meterio/web3-context"; import { chainbridgeConfig } from "./chainbridgeConfig"; import { utils } from "ethers"; @@ -71,7 +71,7 @@ const App: React.FC<{}> = () => { }} checkNetwork={false} gasPricePollingInterval={120} - gasPriceSetting="fast" + gasPriceSetting="recommendedBaseFee" > diff --git a/src/Components/Custom/TokenInput.tsx b/src/Components/Custom/TokenInput.tsx index 1fa3ab9d..e49becea 100644 --- a/src/Components/Custom/TokenInput.tsx +++ b/src/Components/Custom/TokenInput.tsx @@ -2,7 +2,7 @@ import React from "react"; import { useField, useFormikContext } from "formik"; import { Button, FormikTextInput } from "@chainsafe/common-components"; -import { Tokens } from "@chainsafe/web3-context/dist/context/tokensReducer"; +import { Tokens } from "@meterio/web3-context/dist/context/tokensReducer"; import {safeRound} from "../../Utils/XCAmple"; diff --git a/src/Components/Custom/TokenSelectInput.tsx b/src/Components/Custom/TokenSelectInput.tsx index da250d56..586df1e2 100644 --- a/src/Components/Custom/TokenSelectInput.tsx +++ b/src/Components/Custom/TokenSelectInput.tsx @@ -4,7 +4,7 @@ import { IFormikSelectInputProps, FormikSelectInput, } from "@chainsafe/common-components"; -import { Tokens } from "@chainsafe/web3-context/dist/context/tokensReducer"; +import { Tokens } from "@meterio/web3-context/dist/context/tokensReducer"; import {safeRound} from "../../Utils/XCAmple"; interface ITokenSelectInput extends IFormikSelectInputProps { diff --git a/src/Components/Pages/TransferPage.tsx b/src/Components/Pages/TransferPage.tsx index 6fd3c842..045a1260 100644 --- a/src/Components/Pages/TransferPage.tsx +++ b/src/Components/Pages/TransferPage.tsx @@ -14,7 +14,7 @@ import { Form, Formik } from "formik"; import AddressInput from "../Custom/AddressInput"; import clsx from "clsx"; import TransferActiveModal from "../../Modules/TransferActiveModal"; -import { useWeb3 } from "@chainsafe/web3-context"; +import { useWeb3 } from "@meterio/web3-context"; import { useChainbridge } from "../../Contexts/ChainbridgeContext"; import TokenSelectInput from "../Custom/TokenSelectInput"; import TokenInput from "../Custom/TokenInput"; diff --git a/src/Components/Pages/WrapperPage.tsx b/src/Components/Pages/WrapperPage.tsx index 2c7e70f4..80b02f05 100644 --- a/src/Components/Pages/WrapperPage.tsx +++ b/src/Components/Pages/WrapperPage.tsx @@ -11,7 +11,7 @@ import { } from "@chainsafe/common-components"; import { Form, Formik } from "formik"; import clsx from "clsx"; -import { useWeb3 } from "@chainsafe/web3-context"; +import { useWeb3 } from "@meterio/web3-context"; import { useChainbridge } from "../../Contexts/ChainbridgeContext"; import { object, string } from "yup"; import { ReactComponent as ETHIcon } from "../../media/tokens/eth.svg"; diff --git a/src/Contexts/ChainbridgeContext.tsx b/src/Contexts/ChainbridgeContext.tsx index 1868b623..ed91975c 100644 --- a/src/Contexts/ChainbridgeContext.tsx +++ b/src/Contexts/ChainbridgeContext.tsx @@ -1,4 +1,4 @@ -import { useWeb3 } from "@chainsafe/web3-context"; +import { useWeb3 } from "@meterio/web3-context"; import React, { useContext, useEffect, useReducer, useState } from "react"; import { Bridge } from "../Contracts/Bridge"; import { BridgeFactory } from "../Contracts/BridgeFactory"; @@ -364,6 +364,8 @@ const ChainbridgeProvider = ({ children }: IChainbridgeContextProps) => { homeChain.approvalContract ); + const gasLimit = 500000; + if (Number(utils.formatUnits(currentAllowance, erc20Decimals)) < amount) { // if ( // Number(utils.formatUnits(currentAllowance, erc20Decimals)) > 0 && @@ -397,6 +399,7 @@ const ChainbridgeProvider = ({ children }: IChainbridgeContextProps) => { 9 ) ).toString(), + gasLimit, } ) ).wait(1); @@ -424,6 +427,7 @@ const ChainbridgeProvider = ({ children }: IChainbridgeContextProps) => { (homeChain.defaultGasPrice || gasPrice).toString(), 9 ), + gasLimit, value: utils.parseUnits((bridgeFee || 0).toString(), 18), } ) diff --git a/src/Layouts/AppHeader.tsx b/src/Layouts/AppHeader.tsx index fffade92..aa6d08f8 100644 --- a/src/Layouts/AppHeader.tsx +++ b/src/Layouts/AppHeader.tsx @@ -3,7 +3,7 @@ import React from "react"; import clsx from "clsx"; import { Typography } from "@chainsafe/common-components"; import { shortenAddress } from "../Utils/Helpers"; -import { useWeb3 } from "@chainsafe/web3-context"; +import { useWeb3 } from "@meterio/web3-context"; import { useChainbridge } from "../Contexts/ChainbridgeContext"; // import AMPLLogo from "../media/ample-logo/logo.png"; diff --git a/src/Modules/ChangeNetworkDrawer.tsx b/src/Modules/ChangeNetworkDrawer.tsx index 33b11d5c..db6bbdea 100644 --- a/src/Modules/ChangeNetworkDrawer.tsx +++ b/src/Modules/ChangeNetworkDrawer.tsx @@ -3,7 +3,7 @@ import React from "react"; import { makeStyles, createStyles, ITheme } from "@chainsafe/common-theme"; import CustomDrawer from "../Components/Custom/CustomDrawer"; import { Button, Typography } from "@chainsafe/common-components"; -import { useWeb3 } from "@chainsafe/web3-context"; +import { useWeb3 } from "@meterio/web3-context"; const useStyles = makeStyles(({ constants, zIndex }: ITheme) => createStyles({ diff --git a/src/Modules/TransferActiveModal.tsx b/src/Modules/TransferActiveModal.tsx index 4eb1a4ad..0e18efcc 100644 --- a/src/Modules/TransferActiveModal.tsx +++ b/src/Modules/TransferActiveModal.tsx @@ -9,7 +9,7 @@ import { } from "@chainsafe/common-components"; import CustomModal from "../Components/Custom/CustomModal"; import { useChainbridge } from "../Contexts/ChainbridgeContext"; -import { useWeb3 } from "@chainsafe/web3-context"; +import { useWeb3 } from "@meterio/web3-context"; const useStyles = makeStyles( ({ animation, constants, palette, typography }: ITheme) => diff --git a/yarn.lock b/yarn.lock index 11c05933..38fdba9f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1190,13 +1190,6 @@ dependencies: ts-essentials "^7.0.1" -"@chainsafe/web3-context@1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@chainsafe/web3-context/-/web3-context-1.2.0.tgz#679509ed9da7e9dea4567c2151bfd7d612e89914" - integrity sha512-BajGPIbzSRn0vQ4eNmwz+EAq2ax1U7E5BMp36uxNf674ZzvpZbG2nkU9rP9JlCHKVOrpy0608cMUBWa4IPdH2g== - dependencies: - bignumber.js "^9.0.1" - "@chaitanyapotti/random-id@^1.0.3": version "1.0.3" resolved "https://registry.yarnpkg.com/@chaitanyapotti/random-id/-/random-id-1.0.3.tgz#f52f647cfe9f79fc7723ea2b01b0ad3889204002" @@ -1306,7 +1299,7 @@ resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz#8eed982e2ee6f7f4e44c253e12962980791efd46" integrity sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA== -"@ethersproject/abi@5.0.7", "@ethersproject/abi@^5.0.5": +"@ethersproject/abi@5.0.7": version "5.0.7" resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.0.7.tgz#79e52452bd3ca2956d0e1c964207a58ad1a0ee7b" integrity sha512-Cqktk+hSIckwP/W8O47Eef60VwmoSC/L3lY0+dIBhQPCNn9E4V7rwmm2aFrNRRDJfFlGuZ1khkQUOc3oBX+niw== @@ -1321,7 +1314,35 @@ "@ethersproject/properties" "^5.0.3" "@ethersproject/strings" "^5.0.4" -"@ethersproject/abstract-provider@5.0.5", "@ethersproject/abstract-provider@^5.0.4": +"@ethersproject/abi@5.4.0", "@ethersproject/abi@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.4.0.tgz#a6d63bdb3672f738398846d4279fa6b6c9818242" + integrity sha512-9gU2H+/yK1j2eVMdzm6xvHSnMxk8waIHQGYCZg5uvAyH0rsAzxkModzBSpbAkAuhKFEovC2S9hM4nPuLym8IZw== + dependencies: + "@ethersproject/address" "^5.4.0" + "@ethersproject/bignumber" "^5.4.0" + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/constants" "^5.4.0" + "@ethersproject/hash" "^5.4.0" + "@ethersproject/keccak256" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + "@ethersproject/properties" "^5.4.0" + "@ethersproject/strings" "^5.4.0" + +"@ethersproject/abstract-provider@5.4.1", "@ethersproject/abstract-provider@^5.4.0": + version "5.4.1" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.4.1.tgz#e404309a29f771bd4d28dbafadcaa184668c2a6e" + integrity sha512-3EedfKI3LVpjSKgAxoUaI+gB27frKsxzm+r21w9G60Ugk+3wVLQwhi1LsEJAKNV7WoZc8CIpNrATlL1QFABjtQ== + dependencies: + "@ethersproject/bignumber" "^5.4.0" + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + "@ethersproject/networks" "^5.4.0" + "@ethersproject/properties" "^5.4.0" + "@ethersproject/transactions" "^5.4.0" + "@ethersproject/web" "^5.4.0" + +"@ethersproject/abstract-provider@^5.0.4": version "5.0.5" resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.0.5.tgz#797a32a8707830af1ad8f833e9c228994d5572b9" integrity sha512-i/CjElAkzV7vQBAeoz+IpjGfcFYEP9eD7j3fzZ0fzTq03DO7PPnR+xkEZ1IoDXGwDS+55aLM1xvLDwB/Lx6IOQ== @@ -1334,7 +1355,18 @@ "@ethersproject/transactions" "^5.0.5" "@ethersproject/web" "^5.0.6" -"@ethersproject/abstract-signer@5.0.7", "@ethersproject/abstract-signer@^5.0.4", "@ethersproject/abstract-signer@^5.0.6": +"@ethersproject/abstract-signer@5.4.1", "@ethersproject/abstract-signer@^5.4.0": + version "5.4.1" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.4.1.tgz#e4e9abcf4dd4f1ba0db7dff9746a5f78f355ea81" + integrity sha512-SkkFL5HVq1k4/25dM+NWP9MILgohJCgGv5xT5AcRruGz4ILpfHeBtO/y6j+Z3UN/PAjDeb4P7E51Yh8wcGNLGA== + dependencies: + "@ethersproject/abstract-provider" "^5.4.0" + "@ethersproject/bignumber" "^5.4.0" + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + "@ethersproject/properties" "^5.4.0" + +"@ethersproject/abstract-signer@^5.0.6": version "5.0.7" resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.0.7.tgz#cdbd3bd479edf77c71b7f6a6156b0275b1176ded" integrity sha512-8W8gy/QutEL60EoMEpvxZ8MFAEWs/JvH5nmZ6xeLXoZvmBCasGmxqHdYjo2cxg0nevkPkq9SeenSsBBZSCx+SQ== @@ -1345,7 +1377,18 @@ "@ethersproject/logger" "^5.0.5" "@ethersproject/properties" "^5.0.3" -"@ethersproject/address@5.0.5", "@ethersproject/address@^5.0.4", "@ethersproject/address@^5.0.5": +"@ethersproject/address@5.4.0", "@ethersproject/address@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.4.0.tgz#ba2d00a0f8c4c0854933b963b9a3a9f6eb4a37a3" + integrity sha512-SD0VgOEkcACEG/C6xavlU1Hy3m5DGSXW3CUHkaaEHbAPPsgi0coP5oNPsxau8eTlZOk/bpa/hKeCNoK5IzVI2Q== + dependencies: + "@ethersproject/bignumber" "^5.4.0" + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/keccak256" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + "@ethersproject/rlp" "^5.4.0" + +"@ethersproject/address@^5.0.4", "@ethersproject/address@^5.0.5": version "5.0.5" resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.0.5.tgz#2caa65f6b7125015395b1b54c985ee0b27059cc7" integrity sha512-DpkQ6rwk9jTefrRsJzEm6nhRiJd9pvhn1xN0rw5N/jswXG5r7BLk/GVA0mMAVWAsYfvi2xSc5L41FMox43RYEA== @@ -1357,22 +1400,38 @@ "@ethersproject/rlp" "^5.0.3" bn.js "^4.4.0" -"@ethersproject/base64@5.0.4", "@ethersproject/base64@^5.0.3": +"@ethersproject/base64@5.4.0", "@ethersproject/base64@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.4.0.tgz#7252bf65295954c9048c7ca5f43e5c86441b2a9a" + integrity sha512-CjQw6E17QDSSC5jiM9YpF7N1aSCHmYGMt9bWD8PWv6YPMxjsys2/Q8xLrROKI3IWJ7sFfZ8B3flKDTM5wlWuZQ== + dependencies: + "@ethersproject/bytes" "^5.4.0" + +"@ethersproject/base64@^5.0.3": version "5.0.4" resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.0.4.tgz#b0d8fdbf3dda977cf546dcd35725a7b1d5256caa" integrity sha512-4KRykQ7BQMeOXfvio1YITwHjxwBzh92UoXIdzxDE1p53CK28bbHPdsPNYo0wl0El7lJAMpT2SOdL0hhbWRnyIA== dependencies: "@ethersproject/bytes" "^5.0.4" -"@ethersproject/basex@5.0.4", "@ethersproject/basex@^5.0.3": - version "5.0.4" - resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.0.4.tgz#93e1cd11f9a47281da2389de24f88e13e9d90847" - integrity sha512-ixIr/kKiAoSzOnSc777AGIOAhKai5Ivqr4HO/Gz+YG+xkfv6kqD6AW4ga9vM20Wwb0QBhh3LoRWTu4V1K+x9Ew== +"@ethersproject/basex@5.4.0", "@ethersproject/basex@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.4.0.tgz#0a2da0f4e76c504a94f2b21d3161ed9438c7f8a6" + integrity sha512-J07+QCVJ7np2bcpxydFVf/CuYo9mZ7T73Pe7KQY4c1lRlrixMeblauMxHXD0MPwFmUHZIILDNViVkykFBZylbg== dependencies: - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/properties" "^5.0.3" + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/properties" "^5.4.0" -"@ethersproject/bignumber@5.0.8", "@ethersproject/bignumber@^5.0.7", "@ethersproject/bignumber@^5.0.8": +"@ethersproject/bignumber@5.4.1", "@ethersproject/bignumber@^5.4.0": + version "5.4.1" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.4.1.tgz#64399d3b9ae80aa83d483e550ba57ea062c1042d" + integrity sha512-fJhdxqoQNuDOk6epfM7yD6J8Pol4NUCy1vkaGAkuujZm0+lNow//MKu1hLhRiYV4BsOHyBv5/lsTjF+7hWwhJg== + dependencies: + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + bn.js "^4.11.9" + +"@ethersproject/bignumber@^5.0.7", "@ethersproject/bignumber@^5.0.8": version "5.0.8" resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.0.8.tgz#cee33bd8eb0266176def0d371b45274b1d2c4ec0" integrity sha512-KXFVAFKS1jdTXYN8BE5Oj+ZfPMh28iRdFeNGBVT6cUFdtiPVqeXqc0ggvBqA3A1VoFFGgM7oAeaagA393aORHA== @@ -1381,36 +1440,65 @@ "@ethersproject/logger" "^5.0.5" bn.js "^4.4.0" -"@ethersproject/bytes@5.0.5", "@ethersproject/bytes@^5.0.4": +"@ethersproject/bytes@5.4.0", "@ethersproject/bytes@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.4.0.tgz#56fa32ce3bf67153756dbaefda921d1d4774404e" + integrity sha512-H60ceqgTHbhzOj4uRc/83SCN9d+BSUnOkrr2intevqdtEMO1JFVZ1XL84OEZV+QjV36OaZYxtnt4lGmxcGsPfA== + dependencies: + "@ethersproject/logger" "^5.4.0" + +"@ethersproject/bytes@^5.0.4": version "5.0.5" resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.0.5.tgz#688b70000e550de0c97a151a21f15b87d7f97d7c" integrity sha512-IEj9HpZB+ACS6cZ+QQMTqmu/cnUK2fYNE6ms/PVxjoBjoxc6HCraLpam1KuRvreMy0i523PLmjN8OYeikRdcUQ== dependencies: "@ethersproject/logger" "^5.0.5" -"@ethersproject/constants@5.0.5", "@ethersproject/constants@^5.0.4": - version "5.0.5" - resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.0.5.tgz#0ed19b002e8404bdf6d135234dc86a7d9bcf9b71" - integrity sha512-foaQVmxp2+ik9FrLUCtVrLZCj4M3Ibgkqvh+Xw/vFRSerkjVSYePApaVE5essxhoSlF1U9oXfWY09QI2AXtgKA== +"@ethersproject/constants@5.4.0", "@ethersproject/constants@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.4.0.tgz#ee0bdcb30bf1b532d2353c977bf2ef1ee117958a" + integrity sha512-tzjn6S7sj9+DIIeKTJLjK9WGN2Tj0P++Z8ONEIlZjyoTkBuODN+0VfhAyYksKi43l1Sx9tX2VlFfzjfmr5Wl3Q== dependencies: - "@ethersproject/bignumber" "^5.0.7" + "@ethersproject/bignumber" "^5.4.0" -"@ethersproject/contracts@5.0.5": +"@ethersproject/constants@^5.0.4": version "5.0.5" - resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.0.5.tgz#64831a341ec8ca225e83ff3e9437c26b970fd5d7" - integrity sha512-tFI255lFbmbqMkgnuyhDWHl3yWqttPlReplYuVvDCT/SuvBjLR4ad2uipBlh1fh5X1ipK9ettAoV4S0HKim4Kw== + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.0.5.tgz#0ed19b002e8404bdf6d135234dc86a7d9bcf9b71" + integrity sha512-foaQVmxp2+ik9FrLUCtVrLZCj4M3Ibgkqvh+Xw/vFRSerkjVSYePApaVE5essxhoSlF1U9oXfWY09QI2AXtgKA== dependencies: - "@ethersproject/abi" "^5.0.5" - "@ethersproject/abstract-provider" "^5.0.4" - "@ethersproject/abstract-signer" "^5.0.4" - "@ethersproject/address" "^5.0.4" "@ethersproject/bignumber" "^5.0.7" - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/constants" "^5.0.4" - "@ethersproject/logger" "^5.0.5" - "@ethersproject/properties" "^5.0.3" -"@ethersproject/hash@5.0.6", "@ethersproject/hash@^5.0.4": +"@ethersproject/contracts@5.4.1": + version "5.4.1" + resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.4.1.tgz#3eb4f35b7fe60a962a75804ada2746494df3e470" + integrity sha512-m+z2ZgPy4pyR15Je//dUaymRUZq5MtDajF6GwFbGAVmKz/RF+DNIPwF0k5qEcL3wPGVqUjFg2/krlCRVTU4T5w== + dependencies: + "@ethersproject/abi" "^5.4.0" + "@ethersproject/abstract-provider" "^5.4.0" + "@ethersproject/abstract-signer" "^5.4.0" + "@ethersproject/address" "^5.4.0" + "@ethersproject/bignumber" "^5.4.0" + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/constants" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + "@ethersproject/properties" "^5.4.0" + "@ethersproject/transactions" "^5.4.0" + +"@ethersproject/hash@5.4.0", "@ethersproject/hash@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.4.0.tgz#d18a8e927e828e22860a011f39e429d388344ae0" + integrity sha512-xymAM9tmikKgbktOCjW60Z5sdouiIIurkZUr9oW5NOex5uwxrbsYG09kb5bMcNjlVeJD3yPivTNzViIs1GCbqA== + dependencies: + "@ethersproject/abstract-signer" "^5.4.0" + "@ethersproject/address" "^5.4.0" + "@ethersproject/bignumber" "^5.4.0" + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/keccak256" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + "@ethersproject/properties" "^5.4.0" + "@ethersproject/strings" "^5.4.0" + +"@ethersproject/hash@^5.0.4": version "5.0.6" resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.0.6.tgz#2a2e8a1470685421217e9e86e9971ca636e609ce" integrity sha512-Gvh57v6BWhwnud6l7tMfQm32PRQ2DYx2WaAAQmAxAfYvmzUkpQCBstnGeNMXIL8/2wdkvcB2u+WZRWaZtsFuUQ== @@ -1424,44 +1512,52 @@ "@ethersproject/properties" "^5.0.4" "@ethersproject/strings" "^5.0.4" -"@ethersproject/hdnode@5.0.5", "@ethersproject/hdnode@^5.0.4": - version "5.0.5" - resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.0.5.tgz#1f89aad0a5ba9dfae3a85a36e0669f8bc7a74781" - integrity sha512-Ho4HZaK+KijE5adayvjAGusWMnT0mgwGa5hGMBofBOgX9nqiKf6Wxx68SXBGI1/L3rmKo6mlAjxUd8gefs0teQ== - dependencies: - "@ethersproject/abstract-signer" "^5.0.4" - "@ethersproject/basex" "^5.0.3" - "@ethersproject/bignumber" "^5.0.7" - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/logger" "^5.0.5" - "@ethersproject/pbkdf2" "^5.0.3" - "@ethersproject/properties" "^5.0.3" - "@ethersproject/sha2" "^5.0.3" - "@ethersproject/signing-key" "^5.0.4" - "@ethersproject/strings" "^5.0.4" - "@ethersproject/transactions" "^5.0.5" - "@ethersproject/wordlists" "^5.0.4" - -"@ethersproject/json-wallets@5.0.7", "@ethersproject/json-wallets@^5.0.6": - version "5.0.7" - resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.0.7.tgz#4c48753b38ce7bce23a55f25c23f24617cf560e5" - integrity sha512-dgOn9JtGgjT28mDXs4LYY2rT4CzS6bG/rxoYuPq3TLHIf6nmvBcr33Fee6RrM/y8UAx4gyIkf6wb2cXsOctvQQ== - dependencies: - "@ethersproject/abstract-signer" "^5.0.4" - "@ethersproject/address" "^5.0.4" - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/hdnode" "^5.0.4" - "@ethersproject/keccak256" "^5.0.3" - "@ethersproject/logger" "^5.0.5" - "@ethersproject/pbkdf2" "^5.0.3" - "@ethersproject/properties" "^5.0.3" - "@ethersproject/random" "^5.0.3" - "@ethersproject/strings" "^5.0.4" - "@ethersproject/transactions" "^5.0.5" +"@ethersproject/hdnode@5.4.0", "@ethersproject/hdnode@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.4.0.tgz#4bc9999b9a12eb5ce80c5faa83114a57e4107cac" + integrity sha512-pKxdS0KAaeVGfZPp1KOiDLB0jba11tG6OP1u11QnYfb7pXn6IZx0xceqWRr6ygke8+Kw74IpOoSi7/DwANhy8Q== + dependencies: + "@ethersproject/abstract-signer" "^5.4.0" + "@ethersproject/basex" "^5.4.0" + "@ethersproject/bignumber" "^5.4.0" + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + "@ethersproject/pbkdf2" "^5.4.0" + "@ethersproject/properties" "^5.4.0" + "@ethersproject/sha2" "^5.4.0" + "@ethersproject/signing-key" "^5.4.0" + "@ethersproject/strings" "^5.4.0" + "@ethersproject/transactions" "^5.4.0" + "@ethersproject/wordlists" "^5.4.0" + +"@ethersproject/json-wallets@5.4.0", "@ethersproject/json-wallets@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.4.0.tgz#2583341cfe313fc9856642e8ace3080154145e95" + integrity sha512-igWcu3fx4aiczrzEHwG1xJZo9l1cFfQOWzTqwRw/xcvxTk58q4f9M7cjh51EKphMHvrJtcezJ1gf1q1AUOfEQQ== + dependencies: + "@ethersproject/abstract-signer" "^5.4.0" + "@ethersproject/address" "^5.4.0" + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/hdnode" "^5.4.0" + "@ethersproject/keccak256" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + "@ethersproject/pbkdf2" "^5.4.0" + "@ethersproject/properties" "^5.4.0" + "@ethersproject/random" "^5.4.0" + "@ethersproject/strings" "^5.4.0" + "@ethersproject/transactions" "^5.4.0" aes-js "3.0.0" scrypt-js "3.0.1" -"@ethersproject/keccak256@5.0.4", "@ethersproject/keccak256@^5.0.3": +"@ethersproject/keccak256@5.4.0", "@ethersproject/keccak256@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.4.0.tgz#7143b8eea4976080241d2bd92e3b1f1bf7025318" + integrity sha512-FBI1plWet+dPUvAzPAeHzRKiPpETQzqSUWR1wXJGHVWi4i8bOSrpC3NwpkPjgeXG7MnugVc1B42VbfnQikyC/A== + dependencies: + "@ethersproject/bytes" "^5.4.0" + js-sha3 "0.5.7" + +"@ethersproject/keccak256@^5.0.3": version "5.0.4" resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.0.4.tgz#36ca0a7d1ae2a272da5654cb886776d0c680ef3a" integrity sha512-GNpiOUm9PGUxFNqOxYKDQBM0u68bG9XC9iOulEQ8I0tOx/4qUpgVzvgXL6ugxr0RY554Gz/NQsVqknqPzUcxpQ== @@ -1469,67 +1565,94 @@ "@ethersproject/bytes" "^5.0.4" js-sha3 "0.5.7" -"@ethersproject/logger@5.0.6", "@ethersproject/logger@^5.0.5": +"@ethersproject/logger@5.4.0", "@ethersproject/logger@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.4.0.tgz#f39adadf62ad610c420bcd156fd41270e91b3ca9" + integrity sha512-xYdWGGQ9P2cxBayt64d8LC8aPFJk6yWCawQi/4eJ4+oJdMMjEBMrIcIMZ9AxhwpPVmnBPrsB10PcXGmGAqgUEQ== + +"@ethersproject/logger@^5.0.5": version "5.0.6" resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.0.6.tgz#faa484203e86e08be9e07fef826afeef7183fe88" integrity sha512-FrX0Vnb3JZ1md/7GIZfmJ06XOAA8r3q9Uqt9O5orr4ZiksnbpXKlyDzQtlZ5Yv18RS8CAUbiKH9vwidJg1BPmQ== -"@ethersproject/networks@5.0.4", "@ethersproject/networks@^5.0.3": +"@ethersproject/networks@5.4.2", "@ethersproject/networks@^5.4.0": + version "5.4.2" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.4.2.tgz#2247d977626e97e2c3b8ee73cd2457babde0ce35" + integrity sha512-eekOhvJyBnuibfJnhtK46b8HimBc5+4gqpvd1/H9LEl7Q7/qhsIhM81dI9Fcnjpk3jB1aTy6bj0hz3cifhNeYw== + dependencies: + "@ethersproject/logger" "^5.4.0" + +"@ethersproject/networks@^5.0.3": version "5.0.4" resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.0.4.tgz#6d320a5e15a0cda804f5da88be0ba846156f6eec" integrity sha512-/wHDTRms5mpJ09BoDrbNdFWINzONe05wZRgohCXvEv39rrH/Gd/yAnct8wC0RsW3tmFOgjgQxuBvypIxuUynTw== dependencies: "@ethersproject/logger" "^5.0.5" -"@ethersproject/pbkdf2@5.0.4", "@ethersproject/pbkdf2@^5.0.3": - version "5.0.4" - resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.0.4.tgz#a0841d53f5ce9a2b52a65a349d2dc15910b0a767" - integrity sha512-9jVBjHXQKfr9+3bkCg01a8Cd1H9e+7Kw3ZMIvAxD0lZtuzrXsJxm1hVwY9KA+PRUvgS/9tTP4viXQYwLAax7zg== +"@ethersproject/pbkdf2@5.4.0", "@ethersproject/pbkdf2@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.4.0.tgz#ed88782a67fda1594c22d60d0ca911a9d669641c" + integrity sha512-x94aIv6tiA04g6BnazZSLoRXqyusawRyZWlUhKip2jvoLpzJuLb//KtMM6PEovE47pMbW+Qe1uw+68ameJjB7g== dependencies: - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/sha2" "^5.0.3" + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/sha2" "^5.4.0" + +"@ethersproject/properties@5.4.0", "@ethersproject/properties@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.4.0.tgz#38ba20539b44dcc5d5f80c45ad902017dcdbefe7" + integrity sha512-7jczalGVRAJ+XSRvNA6D5sAwT4gavLq3OXPuV/74o3Rd2wuzSL035IMpIMgei4CYyBdialJMrTqkOnzccLHn4A== + dependencies: + "@ethersproject/logger" "^5.4.0" -"@ethersproject/properties@5.0.4", "@ethersproject/properties@^5.0.3", "@ethersproject/properties@^5.0.4": +"@ethersproject/properties@^5.0.3", "@ethersproject/properties@^5.0.4": version "5.0.4" resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.0.4.tgz#a67a1f5a52c30850b5062c861631e73d131f666e" integrity sha512-UdyX3GqBxFt15B0uSESdDNmhvEbK3ACdDXl2soshoPcneXuTswHDeA0LoPlnaZzhbgk4p6jqb4GMms5C26Qu6A== dependencies: "@ethersproject/logger" "^5.0.5" -"@ethersproject/providers@5.0.14": - version "5.0.14" - resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.0.14.tgz#751ccb14b4a8c8e9e4be171818c23f4601be90ba" - integrity sha512-K9QRRkkHWyprm3g4L8U9aPx5uyivznL4RYemkN2shCQumyGqFJ5SO+OtQrgebVm0JpGwFAUGugnhRUh49sjErw== - dependencies: - "@ethersproject/abstract-provider" "^5.0.4" - "@ethersproject/abstract-signer" "^5.0.4" - "@ethersproject/address" "^5.0.4" - "@ethersproject/basex" "^5.0.3" - "@ethersproject/bignumber" "^5.0.7" - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/constants" "^5.0.4" - "@ethersproject/hash" "^5.0.4" - "@ethersproject/logger" "^5.0.5" - "@ethersproject/networks" "^5.0.3" - "@ethersproject/properties" "^5.0.3" - "@ethersproject/random" "^5.0.3" - "@ethersproject/rlp" "^5.0.3" - "@ethersproject/sha2" "^5.0.3" - "@ethersproject/strings" "^5.0.4" - "@ethersproject/transactions" "^5.0.5" - "@ethersproject/web" "^5.0.6" +"@ethersproject/providers@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.4.3.tgz#4cd7ccd9e12bc3875b33df8b24abf735663958a5" + integrity sha512-VURwkaWPoUj7jq9NheNDT5Iyy64Qcyf6BOFDwVdHsmLmX/5prNjFrgSX3GHPE4z1BRrVerDxe2yayvXKFm/NNg== + dependencies: + "@ethersproject/abstract-provider" "^5.4.0" + "@ethersproject/abstract-signer" "^5.4.0" + "@ethersproject/address" "^5.4.0" + "@ethersproject/basex" "^5.4.0" + "@ethersproject/bignumber" "^5.4.0" + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/constants" "^5.4.0" + "@ethersproject/hash" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + "@ethersproject/networks" "^5.4.0" + "@ethersproject/properties" "^5.4.0" + "@ethersproject/random" "^5.4.0" + "@ethersproject/rlp" "^5.4.0" + "@ethersproject/sha2" "^5.4.0" + "@ethersproject/strings" "^5.4.0" + "@ethersproject/transactions" "^5.4.0" + "@ethersproject/web" "^5.4.0" bech32 "1.1.4" - ws "7.2.3" + ws "7.4.6" -"@ethersproject/random@5.0.4", "@ethersproject/random@^5.0.3": - version "5.0.4" - resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.0.4.tgz#98f7cf65b0e588cec39ef24843e391ed5004556f" - integrity sha512-AIZJhqs6Ba4/+U3lOjt3QZbP6b/kuuGLJUYFUonAgWmkTHwqsCwYnFvnHKQSUuHbXHvErp7WFXFlztx+yMn3kQ== +"@ethersproject/random@5.4.0", "@ethersproject/random@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.4.0.tgz#9cdde60e160d024be39cc16f8de3b9ce39191e16" + integrity sha512-pnpWNQlf0VAZDEOVp1rsYQosmv2o0ITS/PecNw+mS2/btF8eYdspkN0vIXrCMtkX09EAh9bdk8GoXmFXM1eAKw== dependencies: - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/logger" "^5.0.5" + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + +"@ethersproject/rlp@5.4.0", "@ethersproject/rlp@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.4.0.tgz#de61afda5ff979454e76d3b3310a6c32ad060931" + integrity sha512-0I7MZKfi+T5+G8atId9QaQKHRvvasM/kqLyAH4XxBCBchAooH2EX5rL9kYZWwcm3awYV+XC7VF6nLhfeQFKVPg== + dependencies: + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/logger" "^5.4.0" -"@ethersproject/rlp@5.0.4", "@ethersproject/rlp@^5.0.3": +"@ethersproject/rlp@^5.0.3": version "5.0.4" resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.0.4.tgz#0090a0271e84ea803016a112a79f5cfd80271a77" integrity sha512-5qrrZad7VTjofxSsm7Zg/7Dr4ZOln4S2CqiDdOuTv6MBKnXj0CiBojXyuDy52M8O3wxH0CyE924hXWTDV1PQWQ== @@ -1537,16 +1660,28 @@ "@ethersproject/bytes" "^5.0.4" "@ethersproject/logger" "^5.0.5" -"@ethersproject/sha2@5.0.4", "@ethersproject/sha2@^5.0.3": - version "5.0.4" - resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.0.4.tgz#40f639721a27dbe034b3dee021ba20b054586fec" - integrity sha512-0yFhf1mspxAfWdXXoPtK94adUeu1R7/FzAa+DfEiZTc76sz/vHXf0LSIazoR3znYKFny6haBxME+usbvvEcF3A== +"@ethersproject/sha2@5.4.0", "@ethersproject/sha2@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.4.0.tgz#c9a8db1037014cbc4e9482bd662f86c090440371" + integrity sha512-siheo36r1WD7Cy+bDdE1BJ8y0bDtqXCOxRMzPa4bV1TGt/eTUUt03BHoJNB6reWJD8A30E/pdJ8WFkq+/uz4Gg== dependencies: - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/logger" "^5.0.5" - hash.js "1.1.3" + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + hash.js "1.1.7" + +"@ethersproject/signing-key@5.4.0", "@ethersproject/signing-key@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.4.0.tgz#2f05120984e81cf89a3d5f6dec5c68ee0894fbec" + integrity sha512-q8POUeywx6AKg2/jX9qBYZIAmKSB4ubGXdQ88l40hmATj29JnG5pp331nAWwwxPn2Qao4JpWHNZsQN+bPiSW9A== + dependencies: + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + "@ethersproject/properties" "^5.4.0" + bn.js "^4.11.9" + elliptic "6.5.4" + hash.js "1.1.7" -"@ethersproject/signing-key@5.0.5", "@ethersproject/signing-key@^5.0.4": +"@ethersproject/signing-key@^5.0.4": version "5.0.5" resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.0.5.tgz#acfd06fc05a14180df7e027688bbd23fc4baf782" integrity sha512-Z1wY7JC1HVO4CvQWY2TyTTuAr8xK3bJijZw1a9G92JEmKdv1j255R/0YLBBcFTl2J65LUjtXynNJ2GbArPGi5g== @@ -1556,18 +1691,27 @@ "@ethersproject/properties" "^5.0.3" elliptic "6.5.3" -"@ethersproject/solidity@5.0.5": - version "5.0.5" - resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.0.5.tgz#97a7d8a67f2d944f208c948fed0d565512bcc2be" - integrity sha512-DMFQ0ouXmNVoKWbGEUFGi8Urli4SJip9jXafQyFHWPRr5oJUqDVkNfwcyC37k+mhBG93k7qrYXCH2xJnGEOxHg== +"@ethersproject/solidity@5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.4.0.tgz#1305e058ea02dc4891df18b33232b11a14ece9ec" + integrity sha512-XFQTZ7wFSHOhHcV1DpcWj7VXECEiSrBuv7JErJvB9Uo+KfCdc3QtUZV+Vjh/AAaYgezUEKbCtE6Khjm44seevQ== dependencies: - "@ethersproject/bignumber" "^5.0.7" - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/keccak256" "^5.0.3" - "@ethersproject/sha2" "^5.0.3" - "@ethersproject/strings" "^5.0.4" + "@ethersproject/bignumber" "^5.4.0" + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/keccak256" "^5.4.0" + "@ethersproject/sha2" "^5.4.0" + "@ethersproject/strings" "^5.4.0" + +"@ethersproject/strings@5.4.0", "@ethersproject/strings@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.4.0.tgz#fb12270132dd84b02906a8d895ae7e7fa3d07d9a" + integrity sha512-k/9DkH5UGDhv7aReXLluFG5ExurwtIpUfnDNhQA29w896Dw3i4uDTz01Quaptbks1Uj9kI8wo9tmW73wcIEaWA== + dependencies: + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/constants" "^5.4.0" + "@ethersproject/logger" "^5.4.0" -"@ethersproject/strings@5.0.5", "@ethersproject/strings@^5.0.4": +"@ethersproject/strings@^5.0.4": version "5.0.5" resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.0.5.tgz#ed7e99a282a02f40757691b04a24cd83f3752195" integrity sha512-JED6WaIV00xM/gvj8vSnd+0VWtDYdidTmavFRCTQakqfz+4tDo6Jz5LHgG+dd45h7ah7ykCHW0C7ZXWEDROCXQ== @@ -1576,7 +1720,22 @@ "@ethersproject/constants" "^5.0.4" "@ethersproject/logger" "^5.0.5" -"@ethersproject/transactions@5.0.6", "@ethersproject/transactions@^5.0.0-beta.135", "@ethersproject/transactions@^5.0.5": +"@ethersproject/transactions@5.4.0", "@ethersproject/transactions@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.4.0.tgz#a159d035179334bd92f340ce0f77e83e9e1522e0" + integrity sha512-s3EjZZt7xa4BkLknJZ98QGoIza94rVjaEed0rzZ/jB9WrIuu/1+tjvYCWzVrystXtDswy7TPBeIepyXwSYa4WQ== + dependencies: + "@ethersproject/address" "^5.4.0" + "@ethersproject/bignumber" "^5.4.0" + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/constants" "^5.4.0" + "@ethersproject/keccak256" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + "@ethersproject/properties" "^5.4.0" + "@ethersproject/rlp" "^5.4.0" + "@ethersproject/signing-key" "^5.4.0" + +"@ethersproject/transactions@^5.0.0-beta.135", "@ethersproject/transactions@^5.0.5": version "5.0.6" resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.0.6.tgz#b8b27938be6e9ed671dbdd35fe98af8b14d0df7c" integrity sha512-htsFhOD+NMBxx676A8ehSuwVV49iqpSB+CkjPZ02tpNew0K6p8g0CZ46Z1ZP946gIHAU80xQ0NACHYrjIUaCFA== @@ -1591,37 +1750,48 @@ "@ethersproject/rlp" "^5.0.3" "@ethersproject/signing-key" "^5.0.4" -"@ethersproject/units@5.0.6": - version "5.0.6" - resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.0.6.tgz#e1169ecffb7e8d5eab84e1481a4e35df19045708" - integrity sha512-tsJuy4mipppdmooukRfhXt8fGx9nxvfvG6Xdy0RDm7LzHsjghjwQ69m2bCpId6SDSR1Uq1cQ9irPiUBSyWolUA== - dependencies: - "@ethersproject/bignumber" "^5.0.7" - "@ethersproject/constants" "^5.0.4" - "@ethersproject/logger" "^5.0.5" - -"@ethersproject/wallet@5.0.7": - version "5.0.7" - resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.0.7.tgz#9d4540f97d534e3d61548ace30f15857209b3f02" - integrity sha512-n2GX1+2Tc0qV8dguUcLkjNugINKvZY7u/5fEsn0skW9rz5+jHTR5IKMV6jSfXA+WjQT8UCNMvkI3CNcdhaPbTQ== - dependencies: - "@ethersproject/abstract-provider" "^5.0.4" - "@ethersproject/abstract-signer" "^5.0.4" - "@ethersproject/address" "^5.0.4" - "@ethersproject/bignumber" "^5.0.7" - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/hash" "^5.0.4" - "@ethersproject/hdnode" "^5.0.4" - "@ethersproject/json-wallets" "^5.0.6" - "@ethersproject/keccak256" "^5.0.3" - "@ethersproject/logger" "^5.0.5" - "@ethersproject/properties" "^5.0.3" - "@ethersproject/random" "^5.0.3" - "@ethersproject/signing-key" "^5.0.4" - "@ethersproject/transactions" "^5.0.5" - "@ethersproject/wordlists" "^5.0.4" - -"@ethersproject/web@5.0.9", "@ethersproject/web@^5.0.6": +"@ethersproject/units@5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.4.0.tgz#d57477a4498b14b88b10396062c8cbbaf20c79fe" + integrity sha512-Z88krX40KCp+JqPCP5oPv5p750g+uU6gopDYRTBGcDvOASh6qhiEYCRatuM/suC4S2XW9Zz90QI35MfSrTIaFg== + dependencies: + "@ethersproject/bignumber" "^5.4.0" + "@ethersproject/constants" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + +"@ethersproject/wallet@5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.4.0.tgz#fa5b59830b42e9be56eadd45a16a2e0933ad9353" + integrity sha512-wU29majLjM6AjCjpat21mPPviG+EpK7wY1+jzKD0fg3ui5fgedf2zEu1RDgpfIMsfn8fJHJuzM4zXZ2+hSHaSQ== + dependencies: + "@ethersproject/abstract-provider" "^5.4.0" + "@ethersproject/abstract-signer" "^5.4.0" + "@ethersproject/address" "^5.4.0" + "@ethersproject/bignumber" "^5.4.0" + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/hash" "^5.4.0" + "@ethersproject/hdnode" "^5.4.0" + "@ethersproject/json-wallets" "^5.4.0" + "@ethersproject/keccak256" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + "@ethersproject/properties" "^5.4.0" + "@ethersproject/random" "^5.4.0" + "@ethersproject/signing-key" "^5.4.0" + "@ethersproject/transactions" "^5.4.0" + "@ethersproject/wordlists" "^5.4.0" + +"@ethersproject/web@5.4.0", "@ethersproject/web@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.4.0.tgz#49fac173b96992334ed36a175538ba07a7413d1f" + integrity sha512-1bUusGmcoRLYgMn6c1BLk1tOKUIFuTg8j+6N8lYlbMpDesnle+i3pGSagGNvwjaiLo4Y5gBibwctpPRmjrh4Og== + dependencies: + "@ethersproject/base64" "^5.4.0" + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + "@ethersproject/properties" "^5.4.0" + "@ethersproject/strings" "^5.4.0" + +"@ethersproject/web@^5.0.6": version "5.0.9" resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.0.9.tgz#b08f8295f4bfd4777c8723fe9572f5453b9f03cb" integrity sha512-//QNlv1MSkOII1hv3+HQwWoiVFS+BMVGI0KYeUww4cyrEktnx1QIez5bTSab9s9fWTFaWKNmQNBwMbxAqPuYDw== @@ -1632,16 +1802,16 @@ "@ethersproject/properties" "^5.0.3" "@ethersproject/strings" "^5.0.4" -"@ethersproject/wordlists@5.0.5", "@ethersproject/wordlists@^5.0.4": - version "5.0.5" - resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.0.5.tgz#a935b7fdb86c96b44ea8391fed94b3fa2f33c606" - integrity sha512-XA3ycFltVrCTQt04w5nHu3Xq5Z6HjqWsXaAYQHFdqtugyUsIumaO9S5MOwFFuUYTNkZUoT3jCRa/OBS+K4tLfA== +"@ethersproject/wordlists@5.4.0", "@ethersproject/wordlists@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.4.0.tgz#f34205ec3bbc9e2c49cadaee774cf0b07e7573d7" + integrity sha512-FemEkf6a+EBKEPxlzeVgUaVSodU7G0Na89jqKjmWMlDB0tomoU8RlEMgUvXyqtrg8N4cwpLh8nyRnm1Nay1isA== dependencies: - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/hash" "^5.0.4" - "@ethersproject/logger" "^5.0.5" - "@ethersproject/properties" "^5.0.3" - "@ethersproject/strings" "^5.0.4" + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/hash" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + "@ethersproject/properties" "^5.4.0" + "@ethersproject/strings" "^5.4.0" "@hapi/address@2.x.x": version "2.1.4" @@ -1953,6 +2123,13 @@ resolved "https://registry.yarnpkg.com/@metamask/safe-event-emitter/-/safe-event-emitter-2.0.0.tgz#af577b477c683fad17c619a78208cede06f9605c" integrity sha512-/kSXhY692qiV1MXu6EeOZvg5nECLclxNXcKCxJ3cXQgYuRymRHpdx/t7JXfsK+JLjwA1e1c1/SBrlQYpusC29Q== +"@meterio/web3-context@1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@meterio/web3-context/-/web3-context-1.2.3.tgz#d9ae45bb5a0df02f31a24c84be64647f15f788c2" + integrity sha512-El96RMFdg0inFwsz8LXkjPU9p8Pl0OsLqw+tL0ezxlJfirhGIXD3GAyuE7D2QP5gcwdbl+vXZ7X3IAk8Zmgs3Q== + dependencies: + bignumber.js "^9.0.1" + "@mrmlnc/readdir-enhanced@^2.2.1": version "2.2.1" resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" @@ -6106,7 +6283,7 @@ elliptic@6.5.3, elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.3: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.0" -elliptic@^6.5.4: +elliptic@6.5.4, elliptic@^6.5.4: version "6.5.4" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== @@ -6986,41 +7163,41 @@ ethers@4.0.47: uuid "2.0.1" xmlhttprequest "1.8.0" -ethers@^5.0.17: - version "5.0.19" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.0.19.tgz#a4636f62a180135b13fd1f0a393477beafd535b7" - integrity sha512-0AZnUgZh98q888WAd1oI3aLeI+iyDtrupjANVtPPS7O63lVopkR/No8A1NqSkgl/rU+b2iuu2mUZor6GD4RG2w== - dependencies: - "@ethersproject/abi" "5.0.7" - "@ethersproject/abstract-provider" "5.0.5" - "@ethersproject/abstract-signer" "5.0.7" - "@ethersproject/address" "5.0.5" - "@ethersproject/base64" "5.0.4" - "@ethersproject/basex" "5.0.4" - "@ethersproject/bignumber" "5.0.8" - "@ethersproject/bytes" "5.0.5" - "@ethersproject/constants" "5.0.5" - "@ethersproject/contracts" "5.0.5" - "@ethersproject/hash" "5.0.6" - "@ethersproject/hdnode" "5.0.5" - "@ethersproject/json-wallets" "5.0.7" - "@ethersproject/keccak256" "5.0.4" - "@ethersproject/logger" "5.0.6" - "@ethersproject/networks" "5.0.4" - "@ethersproject/pbkdf2" "5.0.4" - "@ethersproject/properties" "5.0.4" - "@ethersproject/providers" "5.0.14" - "@ethersproject/random" "5.0.4" - "@ethersproject/rlp" "5.0.4" - "@ethersproject/sha2" "5.0.4" - "@ethersproject/signing-key" "5.0.5" - "@ethersproject/solidity" "5.0.5" - "@ethersproject/strings" "5.0.5" - "@ethersproject/transactions" "5.0.6" - "@ethersproject/units" "5.0.6" - "@ethersproject/wallet" "5.0.7" - "@ethersproject/web" "5.0.9" - "@ethersproject/wordlists" "5.0.5" +ethers@^5.4.4: + version "5.4.4" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.4.4.tgz#35cce530505b84c699da944162195cfb3f894947" + integrity sha512-zaTs8yaDjfb0Zyj8tT6a+/hEkC+kWAA350MWRp6yP5W7NdGcURRPMOpOU+6GtkfxV9wyJEShWesqhE/TjdqpMA== + dependencies: + "@ethersproject/abi" "5.4.0" + "@ethersproject/abstract-provider" "5.4.1" + "@ethersproject/abstract-signer" "5.4.1" + "@ethersproject/address" "5.4.0" + "@ethersproject/base64" "5.4.0" + "@ethersproject/basex" "5.4.0" + "@ethersproject/bignumber" "5.4.1" + "@ethersproject/bytes" "5.4.0" + "@ethersproject/constants" "5.4.0" + "@ethersproject/contracts" "5.4.1" + "@ethersproject/hash" "5.4.0" + "@ethersproject/hdnode" "5.4.0" + "@ethersproject/json-wallets" "5.4.0" + "@ethersproject/keccak256" "5.4.0" + "@ethersproject/logger" "5.4.0" + "@ethersproject/networks" "5.4.2" + "@ethersproject/pbkdf2" "5.4.0" + "@ethersproject/properties" "5.4.0" + "@ethersproject/providers" "5.4.3" + "@ethersproject/random" "5.4.0" + "@ethersproject/rlp" "5.4.0" + "@ethersproject/sha2" "5.4.0" + "@ethersproject/signing-key" "5.4.0" + "@ethersproject/solidity" "5.4.0" + "@ethersproject/strings" "5.4.0" + "@ethersproject/transactions" "5.4.0" + "@ethersproject/units" "5.4.0" + "@ethersproject/wallet" "5.4.0" + "@ethersproject/web" "5.4.0" + "@ethersproject/wordlists" "5.4.0" ethjs-unit@0.1.6: version "0.1.6" @@ -15430,16 +15607,16 @@ write@1.0.3: dependencies: mkdirp "^0.5.1" -ws@7.2.3: - version "7.2.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.2.3.tgz#a5411e1fb04d5ed0efee76d26d5c46d830c39b46" - integrity sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ== - ws@7.3.0: version "7.3.0" resolved "https://registry.yarnpkg.com/ws/-/ws-7.3.0.tgz#4b2f7f219b3d3737bc1a2fbf145d825b94d38ffd" integrity sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w== +ws@7.4.6: + version "7.4.6" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" + integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== + ws@^5.1.1, ws@^5.2.0: version "5.2.2" resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" From 7a335ae3366fd41ca9345bc407c7f1c61e2a42d2 Mon Sep 17 00:00:00 2001 From: nithin Date: Mon, 9 Aug 2021 11:50:21 -0400 Subject: [PATCH 04/12] deploy fixes --- public/downtime.html | 5 +++++ scripts/deploy.sh | 2 ++ 2 files changed, 7 insertions(+) create mode 100644 public/downtime.html diff --git a/public/downtime.html b/public/downtime.html new file mode 100644 index 00000000..3ec29ea5 --- /dev/null +++ b/public/downtime.html @@ -0,0 +1,5 @@ + + +

    The Meter Passport bridge is experiencing downtime. Check back again soon.

    + + diff --git a/scripts/deploy.sh b/scripts/deploy.sh index ef76963f..eb0b8a71 100755 --- a/scripts/deploy.sh +++ b/scripts/deploy.sh @@ -1 +1,3 @@ +yarn build aws s3 sync build/ s3://bridge.ampleforth.org/ --cache-control max-age=86400 --acl public-read + From 0a15ccdea2433823b4dc0f0ec8f5fd3f91fd2a2c Mon Sep 17 00:00:00 2001 From: nithin Date: Wed, 18 Aug 2021 11:50:44 -0400 Subject: [PATCH 05/12] migrating to new bridge contract --- src/chainbridgeConfig.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/chainbridgeConfig.ts b/src/chainbridgeConfig.ts index 84623019..c6ed9eb7 100644 --- a/src/chainbridgeConfig.ts +++ b/src/chainbridgeConfig.ts @@ -38,7 +38,7 @@ export const chainbridgeConfig: ChainbridgeConfig = { chainId: 1, networkId: 1, name: "Ethereum", - bridgeAddress: "0xbD515E41DF155112Cc883f8981CB763a286261be", + bridgeAddress: "0xa2A22B46B8df38cd7C55E6bf32Ea5a32637Cf2b1", genericHandlerAddress: "0x517828d2549cEC09386f89a67E92825E26740240", controller: "0x1B228a749077b8e307C5856cE62Ef35d96Dca2ea", approvalContract: "0x805c7Ecba41f9321bb098ec1cf31d86d9407de2F", @@ -61,7 +61,7 @@ export const chainbridgeConfig: ChainbridgeConfig = { chainId: 4, networkId: 56, name: "BSC", - bridgeAddress: "0x223fafbc2cA53A75CcfF5B2369128d3d1a828F36", + bridgeAddress: "0xFd55eBc7bBde603A048648C6eAb8775c997C1001", genericHandlerAddress: "0x83Fc24eB56121FA2A05e0b5170E7310738425839", controller: "0x17F084dFF8a71e38521BCBD3Da871753Dc67aa81", approvalContract: "0x17F084dFF8a71e38521BCBD3Da871753Dc67aa81", From 7bdb207dde4b9cfe6dd1c220d2145fc362730a1d Mon Sep 17 00:00:00 2001 From: nithin Date: Wed, 29 Sep 2021 13:31:21 -0400 Subject: [PATCH 06/12] added avax --- src/chainbridgeConfig.ts | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/src/chainbridgeConfig.ts b/src/chainbridgeConfig.ts index c6ed9eb7..dc3677a7 100644 --- a/src/chainbridgeConfig.ts +++ b/src/chainbridgeConfig.ts @@ -1,5 +1,5 @@ import AMPLIcon from "./media/ample-logo/logo.png"; -import AMPL_BSC_MP_Icon from "./media/ample-logo/ampl_bsc_mp.png"; +// import AMPL_BSC_MP_Icon from "./media/ample-logo/ampl_bsc_mp.png"; export type TokenConfig = { address: string; @@ -73,7 +73,29 @@ export const chainbridgeConfig: ChainbridgeConfig = { tokens: [ { address: "0xDB021b1B247fe2F1fa57e0A87C748Cc1E321F07F", - imageUri: AMPL_BSC_MP_Icon, + imageUri: AMPLIcon, + resourceId: + "0x1f3eb8ee12ce38ffa19fc4c635621ad2c9a0bd609def9ddce77680e33bc2224b", + }, + ], + }, + { + chainId: 2, + networkId: 43114, + name: "AVAX", + bridgeAddress: "0xF41e7FC4eC990298d36f667B93951c9dba65224e", + genericHandlerAddress: "0x123455360bE78C9289B38bcb4DbA427D9a6cD440", + controller: "0x24232ccAf8bB87908C419aD7dDCca8cc9e74746d", + approvalContract: "0x24232ccAf8bB87908C419aD7dDCca8cc9e74746d", + rpcUrl: "https://api.avax.network/ext/bc/C/rpc", + type: "Ethereum", + blockExplorer: "https://cchain.explorer.avax.network/tx", + nativeTokenSymbol: "AVAX", + deployedBlockNumber: 4754446, + tokens: [ + { + address: "0x027dbcA046ca156De9622cD1e2D907d375e53aa7", + imageUri: AMPLIcon, resourceId: "0x1f3eb8ee12ce38ffa19fc4c635621ad2c9a0bd609def9ddce77680e33bc2224b", }, From e4afcaaa540baf6dc0505dbe64db37fdb0b3ee97 Mon Sep 17 00:00:00 2001 From: nithin Date: Wed, 29 Sep 2021 13:41:58 -0400 Subject: [PATCH 07/12] set default gas price --- src/chainbridgeConfig.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/chainbridgeConfig.ts b/src/chainbridgeConfig.ts index dc3677a7..ba39a8ad 100644 --- a/src/chainbridgeConfig.ts +++ b/src/chainbridgeConfig.ts @@ -92,6 +92,7 @@ export const chainbridgeConfig: ChainbridgeConfig = { blockExplorer: "https://cchain.explorer.avax.network/tx", nativeTokenSymbol: "AVAX", deployedBlockNumber: 4754446, + defaultGasPrice: 20, tokens: [ { address: "0x027dbcA046ca156De9622cD1e2D907d375e53aa7", From 36926b30b74cd8b288cf4eb4b532742c34729f8c Mon Sep 17 00:00:00 2001 From: aalavandhan1984 <6264334+aalavandhan@users.noreply.github.com> Date: Mon, 24 Jan 2022 13:53:55 -0500 Subject: [PATCH 08/12] added meter chain --- src/chainbridgeConfig.ts | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/chainbridgeConfig.ts b/src/chainbridgeConfig.ts index ba39a8ad..f5075c36 100644 --- a/src/chainbridgeConfig.ts +++ b/src/chainbridgeConfig.ts @@ -89,7 +89,7 @@ export const chainbridgeConfig: ChainbridgeConfig = { approvalContract: "0x24232ccAf8bB87908C419aD7dDCca8cc9e74746d", rpcUrl: "https://api.avax.network/ext/bc/C/rpc", type: "Ethereum", - blockExplorer: "https://cchain.explorer.avax.network/tx", + blockExplorer: "https://snowtrace.io/tx", nativeTokenSymbol: "AVAX", deployedBlockNumber: 4754446, defaultGasPrice: 20, @@ -102,5 +102,27 @@ export const chainbridgeConfig: ChainbridgeConfig = { }, ], }, + { + chainId: 3, + networkId: 82, + name: "MTR", + bridgeAddress: "0x3f396Af107049232Bc2804C171ecad65DBCC0323", + genericHandlerAddress: "0x89CA53Bf11d24D32A7aC3aDb7750868360c90590", + controller: "0x5353C43b3aF8E9F9c044B55Ea2c139aC977E0F19", + approvalContract: "0x5353C43b3aF8E9F9c044B55Ea2c139aC977E0F19", + rpcUrl: "https://rpc.meter.io", + type: "Ethereum", + blockExplorer: "https://scan.meter.io/tx", + nativeTokenSymbol: "MTR", + deployedBlockNumber: 14654758, + tokens: [ + { + address: "0x1cf09D1B5Da9d9d24365D87B932A7c4bD018A419", + imageUri: AMPLIcon, + resourceId: + "0x1f3eb8ee12ce38ffa19fc4c635621ad2c9a0bd609def9ddce77680e33bc2224b", + }, + ], + }, ], }; From ec5900a203c5e940e34eeac2cb6ed6cbda95bba0 Mon Sep 17 00:00:00 2001 From: nithin Date: Fri, 11 Feb 2022 08:05:07 -0800 Subject: [PATCH 09/12] updated bridge addresses --- src/chainbridgeConfig.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/chainbridgeConfig.ts b/src/chainbridgeConfig.ts index f5075c36..f514c939 100644 --- a/src/chainbridgeConfig.ts +++ b/src/chainbridgeConfig.ts @@ -38,7 +38,7 @@ export const chainbridgeConfig: ChainbridgeConfig = { chainId: 1, networkId: 1, name: "Ethereum", - bridgeAddress: "0xa2A22B46B8df38cd7C55E6bf32Ea5a32637Cf2b1", + bridgeAddress: "0xb61b5aca15193ecb719433d0e5c066f9980e1e83", genericHandlerAddress: "0x517828d2549cEC09386f89a67E92825E26740240", controller: "0x1B228a749077b8e307C5856cE62Ef35d96Dca2ea", approvalContract: "0x805c7Ecba41f9321bb098ec1cf31d86d9407de2F", @@ -61,7 +61,7 @@ export const chainbridgeConfig: ChainbridgeConfig = { chainId: 4, networkId: 56, name: "BSC", - bridgeAddress: "0xFd55eBc7bBde603A048648C6eAb8775c997C1001", + bridgeAddress: "0x0316f3A2f01bf3934f10F24217a0F802Eac3FBD7", genericHandlerAddress: "0x83Fc24eB56121FA2A05e0b5170E7310738425839", controller: "0x17F084dFF8a71e38521BCBD3Da871753Dc67aa81", approvalContract: "0x17F084dFF8a71e38521BCBD3Da871753Dc67aa81", @@ -83,7 +83,7 @@ export const chainbridgeConfig: ChainbridgeConfig = { chainId: 2, networkId: 43114, name: "AVAX", - bridgeAddress: "0xF41e7FC4eC990298d36f667B93951c9dba65224e", + bridgeAddress: "0x6154a8611fb02f250eA3FA0C8C8a8CB56931eBf2", genericHandlerAddress: "0x123455360bE78C9289B38bcb4DbA427D9a6cD440", controller: "0x24232ccAf8bB87908C419aD7dDCca8cc9e74746d", approvalContract: "0x24232ccAf8bB87908C419aD7dDCca8cc9e74746d", @@ -106,7 +106,7 @@ export const chainbridgeConfig: ChainbridgeConfig = { chainId: 3, networkId: 82, name: "MTR", - bridgeAddress: "0x3f396Af107049232Bc2804C171ecad65DBCC0323", + bridgeAddress: "0x411b6aef79d44CEa36979Ca1525831C8DE37Da90", genericHandlerAddress: "0x89CA53Bf11d24D32A7aC3aDb7750868360c90590", controller: "0x5353C43b3aF8E9F9c044B55Ea2c139aC977E0F19", approvalContract: "0x5353C43b3aF8E9F9c044B55Ea2c139aC977E0F19", From e75f6b51174ff638326157e7a89fe9fa28c9b603 Mon Sep 17 00:00:00 2001 From: aalavandhan1984 <6264334+aalavandhan@users.noreply.github.com> Date: Thu, 15 Sep 2022 11:13:20 -0400 Subject: [PATCH 10/12] chainbridge v2 changes --- src/Contexts/ChainbridgeContext.tsx | 49 +- src/Contracts/Bridge.d.ts | 1989 ++++++++++++++++----------- src/Contracts/BridgeFactory.ts | 738 +++++----- src/chainbridgeConfig.ts | 60 +- 4 files changed, 1693 insertions(+), 1143 deletions(-) diff --git a/src/Contexts/ChainbridgeContext.tsx b/src/Contexts/ChainbridgeContext.tsx index ed91975c..6c4ffe8b 100644 --- a/src/Contexts/ChainbridgeContext.tsx +++ b/src/Contexts/ChainbridgeContext.tsx @@ -236,11 +236,24 @@ const ChainbridgeProvider = ({ children }: IChainbridgeContextProps) => { } }; const getBridgeFee = async () => { - if (homeBridge && destinationBridge) { - const targetChainID = await destinationBridge._chainID(); - const fee = await homeBridge.getFee(targetChainID); - const bridgeFee = Number(utils.formatEther(fee)); - setBridgeFee(bridgeFee); + if (homeBridge && destinationBridge && homeChain && selectedToken) { + const targetDomainID = await destinationBridge._domainID(); + const token = homeChain.tokens.find( + (token) => token.address === selectedToken + ); + if(token) { + // NOTE: The v2 chainbridge contracts allow dynamic fees based on payload + // this is not being used by meter passport currently so we + // do not need to create the packed data for calculating the bridge fees. + const fee = await homeBridge.calculateFee( + targetDomainID, + token.resourceId, + "", + "" + ); + const bridgeFee = Number(utils.formatEther(fee)); + setBridgeFee(bridgeFee); + } } }; getRelayerThreshold(); @@ -251,13 +264,12 @@ const ChainbridgeProvider = ({ children }: IChainbridgeContextProps) => { if (homeChain && destinationBridge && depositNonce) { destinationBridge.on( destinationBridge.filters.ProposalEvent( - homeChain.chainId, - BigNumber.from(depositNonce), + null, null, null, null ), - (originChainId, depositNonce, status, resourceId, dataHash, tx) => { + (originChainId, depositNonce, status, dataHash, tx) => { switch (BigNumber.from(status).toNumber()) { case 1: tokensDispatch({ @@ -285,12 +297,12 @@ const ChainbridgeProvider = ({ children }: IChainbridgeContextProps) => { destinationBridge.on( destinationBridge.filters.ProposalVote( - homeChain.chainId, - BigNumber.from(depositNonce), + null, + null, null, null ), - async (originChainId, depositNonce, status, resourceId, tx) => { + async (originChainId, depositNonce, status, dataHash, tx) => { const txReceipt = await tx.getTransactionReceipt(); if (txReceipt.status === 1) { setDepositVotes(depositVotes + 1); @@ -338,6 +350,7 @@ const ChainbridgeProvider = ({ children }: IChainbridgeContextProps) => { console.log("No signer"); return; } + const sender = await signer.getAddress(); const token = homeChain.tokens.find( (token) => token.address === tokenAddress @@ -354,7 +367,6 @@ const ChainbridgeProvider = ({ children }: IChainbridgeContextProps) => { const controller = XCAmpleControllerFactory.connect(homeChain.controller, signer); const erc20Decimals = tokens[tokenAddress].decimals; - const [epoch, totalSupply] = await controller.globalAmpleforthEpochAndAMPLSupply(); const data = packXCTransferData(address, recipient, utils.parseUnits(amount.toString(), erc20Decimals), totalSupply); @@ -365,7 +377,6 @@ const ChainbridgeProvider = ({ children }: IChainbridgeContextProps) => { ); const gasLimit = 500000; - if (Number(utils.formatUnits(currentAllowance, erc20Decimals)) < amount) { // if ( // Number(utils.formatUnits(currentAllowance, erc20Decimals)) > 0 && @@ -407,11 +418,14 @@ const ChainbridgeProvider = ({ children }: IChainbridgeContextProps) => { homeBridge.once( homeBridge.filters.Deposit( - destinationChain.chainId, - token.resourceId, - null + null, + null, + null, + sender, + null, + null, ), - (destChainId, resourceId, depositNonce) => { + (destChainId, resourceId, depositNonce, user, data, handlerResponse) => { setDepositNonce(`${depositNonce.toString()}`); setTransactionStatus("In Transit"); } @@ -422,6 +436,7 @@ const ChainbridgeProvider = ({ children }: IChainbridgeContextProps) => { destinationChain.chainId, token.resourceId, data, + [], { gasPrice: utils.parseUnits( (homeChain.defaultGasPrice || gasPrice).toString(), diff --git a/src/Contracts/Bridge.d.ts b/src/Contracts/Bridge.d.ts index 89982523..b55c35c5 100644 --- a/src/Contracts/Bridge.d.ts +++ b/src/Contracts/Bridge.d.ts @@ -25,80 +25,90 @@ import { TypedEventFilter, TypedEvent, TypedListener } from "./commons"; interface BridgeInterface extends ethers.utils.Interface { functions: { "DEFAULT_ADMIN_ROLE()": FunctionFragment; + "MAX_RELAYERS()": FunctionFragment; + "PERMIT_TYPEHASH()": FunctionFragment; "RELAYER_ROLE()": FunctionFragment; - "_chainID()": FunctionFragment; + "_chainId()": FunctionFragment; "_depositCounts(uint8)": FunctionFragment; - "_depositRecords(uint64,uint8)": FunctionFragment; + "_domainID()": FunctionFragment; "_expiry()": FunctionFragment; "_fee()": FunctionFragment; + "_feeHandler()": FunctionFragment; "_hasVotedOnProposal(uint72,bytes32,address)": FunctionFragment; - "_proposals(uint72,bytes32)": FunctionFragment; "_relayerThreshold()": FunctionFragment; "_resourceIDToHandlerAddress(bytes32)": FunctionFragment; - "_specialFee()": FunctionFragment; - "_specialFeeChainID()": FunctionFragment; - "_totalProposals()": FunctionFragment; "_totalRelayers()": FunctionFragment; - "_wtokenAddress()": FunctionFragment; "adminAddRelayer(address)": FunctionFragment; - "adminChangeFee(uint256)": FunctionFragment; + "adminChangeExpiry(uint256)": FunctionFragment; + "adminChangeFeeHandler(address)": FunctionFragment; "adminChangeRelayerThreshold(uint256)": FunctionFragment; - "adminChangeSpecialFee(uint256,uint8)": FunctionFragment; "adminPauseTransfers()": FunctionFragment; "adminRemoveRelayer(address)": FunctionFragment; "adminSetBurnable(address,address)": FunctionFragment; + "adminSetDepositNonce(uint8,uint64)": FunctionFragment; + "adminSetDomainId(uint8)": FunctionFragment; + "adminSetForwarder(address,bool)": FunctionFragment; "adminSetGenericResource(address,bytes32,address,bytes4,uint256,bytes4)": FunctionFragment; + "adminSetNative(bytes32,address,bool)": FunctionFragment; + "adminSetNativeResource(address)": FunctionFragment; "adminSetResource(address,bytes32,address)": FunctionFragment; "adminUnpauseTransfers()": FunctionFragment; - "adminUpdateBridgeAddress(address,address)": FunctionFragment; - "adminWithdraw(address,address,address,uint256)": FunctionFragment; + "adminWithdraw(address,bytes)": FunctionFragment; + "adminWithdrawETH(address,bytes)": FunctionFragment; + "calculateFee(uint8,bytes32,bytes,bytes)": FunctionFragment; "cancelProposal(uint8,uint64,bytes32)": FunctionFragment; - "deposit(uint8,bytes32,bytes)": FunctionFragment; - "depositETH(uint8,bytes32,bytes)": FunctionFragment; - "executeProposal(uint8,uint64,bytes,bytes32)": FunctionFragment; - "getFee(uint8)": FunctionFragment; - "getFees()": FunctionFragment; - "getProposal(uint8,uint64,bytes32)": FunctionFragment; + "checkSignature(uint8,uint64,bytes32,bytes,bytes)": FunctionFragment; + "deposit(uint8,bytes32,bytes,bytes)": FunctionFragment; + "executeProposal(uint8,uint64,bytes,bytes32,bool)": FunctionFragment; + "getProposal(uint8,uint64,bytes32,bytes)": FunctionFragment; "getRoleAdmin(bytes32)": FunctionFragment; "getRoleMember(bytes32,uint256)": FunctionFragment; "getRoleMemberCount(bytes32)": FunctionFragment; + "getRoleMemberIndex(bytes32,address)": FunctionFragment; "grantRole(bytes32,address)": FunctionFragment; "hasRole(bytes32,address)": FunctionFragment; "isRelayer(address)": FunctionFragment; + "isValidForwarder(address)": FunctionFragment; "paused()": FunctionFragment; "renounceAdmin(address)": FunctionFragment; "renounceRole(bytes32,address)": FunctionFragment; "revokeRole(bytes32,address)": FunctionFragment; "transferFunds(address[],uint256[])": FunctionFragment; - "voteProposal(uint8,uint64,bytes32,bytes32)": FunctionFragment; + "voteProposal(uint8,uint64,bytes32,bytes)": FunctionFragment; + "voteProposals(uint8,uint64,bytes32,bytes,bytes[])": FunctionFragment; }; encodeFunctionData( functionFragment: "DEFAULT_ADMIN_ROLE", values?: undefined ): string; + encodeFunctionData( + functionFragment: "MAX_RELAYERS", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "PERMIT_TYPEHASH", + values?: undefined + ): string; encodeFunctionData( functionFragment: "RELAYER_ROLE", values?: undefined ): string; - encodeFunctionData(functionFragment: "_chainID", values?: undefined): string; + encodeFunctionData(functionFragment: "_chainId", values?: undefined): string; encodeFunctionData( functionFragment: "_depositCounts", values: [BigNumberish] ): string; - encodeFunctionData( - functionFragment: "_depositRecords", - values: [BigNumberish, BigNumberish] - ): string; + encodeFunctionData(functionFragment: "_domainID", values?: undefined): string; encodeFunctionData(functionFragment: "_expiry", values?: undefined): string; encodeFunctionData(functionFragment: "_fee", values?: undefined): string; encodeFunctionData( - functionFragment: "_hasVotedOnProposal", - values: [BigNumberish, BytesLike, string] + functionFragment: "_feeHandler", + values?: undefined ): string; encodeFunctionData( - functionFragment: "_proposals", - values: [BigNumberish, BytesLike] + functionFragment: "_hasVotedOnProposal", + values: [BigNumberish, BytesLike, string] ): string; encodeFunctionData( functionFragment: "_relayerThreshold", @@ -108,41 +118,25 @@ interface BridgeInterface extends ethers.utils.Interface { functionFragment: "_resourceIDToHandlerAddress", values: [BytesLike] ): string; - encodeFunctionData( - functionFragment: "_specialFee", - values?: undefined - ): string; - encodeFunctionData( - functionFragment: "_specialFeeChainID", - values?: undefined - ): string; - encodeFunctionData( - functionFragment: "_totalProposals", - values?: undefined - ): string; encodeFunctionData( functionFragment: "_totalRelayers", values?: undefined ): string; - encodeFunctionData( - functionFragment: "_wtokenAddress", - values?: undefined - ): string; encodeFunctionData( functionFragment: "adminAddRelayer", values: [string] ): string; encodeFunctionData( - functionFragment: "adminChangeFee", + functionFragment: "adminChangeExpiry", values: [BigNumberish] ): string; encodeFunctionData( - functionFragment: "adminChangeRelayerThreshold", - values: [BigNumberish] + functionFragment: "adminChangeFeeHandler", + values: [string] ): string; encodeFunctionData( - functionFragment: "adminChangeSpecialFee", - values: [BigNumberish, BigNumberish] + functionFragment: "adminChangeRelayerThreshold", + values: [BigNumberish] ): string; encodeFunctionData( functionFragment: "adminPauseTransfers", @@ -156,10 +150,30 @@ interface BridgeInterface extends ethers.utils.Interface { functionFragment: "adminSetBurnable", values: [string, string] ): string; + encodeFunctionData( + functionFragment: "adminSetDepositNonce", + values: [BigNumberish, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "adminSetDomainId", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "adminSetForwarder", + values: [string, boolean] + ): string; encodeFunctionData( functionFragment: "adminSetGenericResource", values: [string, BytesLike, string, BytesLike, BigNumberish, BytesLike] ): string; + encodeFunctionData( + functionFragment: "adminSetNative", + values: [BytesLike, string, boolean] + ): string; + encodeFunctionData( + functionFragment: "adminSetNativeResource", + values: [string] + ): string; encodeFunctionData( functionFragment: "adminSetResource", values: [string, BytesLike, string] @@ -169,37 +183,36 @@ interface BridgeInterface extends ethers.utils.Interface { values?: undefined ): string; encodeFunctionData( - functionFragment: "adminUpdateBridgeAddress", - values: [string, string] + functionFragment: "adminWithdraw", + values: [string, BytesLike] ): string; encodeFunctionData( - functionFragment: "adminWithdraw", - values: [string, string, string, BigNumberish] + functionFragment: "adminWithdrawETH", + values: [string, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "calculateFee", + values: [BigNumberish, BytesLike, BytesLike, BytesLike] ): string; encodeFunctionData( functionFragment: "cancelProposal", values: [BigNumberish, BigNumberish, BytesLike] ): string; encodeFunctionData( - functionFragment: "deposit", - values: [BigNumberish, BytesLike, BytesLike] + functionFragment: "checkSignature", + values: [BigNumberish, BigNumberish, BytesLike, BytesLike, BytesLike] ): string; encodeFunctionData( - functionFragment: "depositETH", - values: [BigNumberish, BytesLike, BytesLike] + functionFragment: "deposit", + values: [BigNumberish, BytesLike, BytesLike, BytesLike] ): string; encodeFunctionData( functionFragment: "executeProposal", - values: [BigNumberish, BigNumberish, BytesLike, BytesLike] - ): string; - encodeFunctionData( - functionFragment: "getFee", - values: [BigNumberish] + values: [BigNumberish, BigNumberish, BytesLike, BytesLike, boolean] ): string; - encodeFunctionData(functionFragment: "getFees", values?: undefined): string; encodeFunctionData( functionFragment: "getProposal", - values: [BigNumberish, BigNumberish, BytesLike] + values: [BigNumberish, BigNumberish, BytesLike, BytesLike] ): string; encodeFunctionData( functionFragment: "getRoleAdmin", @@ -213,6 +226,10 @@ interface BridgeInterface extends ethers.utils.Interface { functionFragment: "getRoleMemberCount", values: [BytesLike] ): string; + encodeFunctionData( + functionFragment: "getRoleMemberIndex", + values: [BytesLike, string] + ): string; encodeFunctionData( functionFragment: "grantRole", values: [BytesLike, string] @@ -222,6 +239,10 @@ interface BridgeInterface extends ethers.utils.Interface { values: [BytesLike, string] ): string; encodeFunctionData(functionFragment: "isRelayer", values: [string]): string; + encodeFunctionData( + functionFragment: "isValidForwarder", + values: [string] + ): string; encodeFunctionData(functionFragment: "paused", values?: undefined): string; encodeFunctionData( functionFragment: "renounceAdmin", @@ -243,31 +264,43 @@ interface BridgeInterface extends ethers.utils.Interface { functionFragment: "voteProposal", values: [BigNumberish, BigNumberish, BytesLike, BytesLike] ): string; + encodeFunctionData( + functionFragment: "voteProposals", + values: [BigNumberish, BigNumberish, BytesLike, BytesLike, BytesLike[]] + ): string; decodeFunctionResult( functionFragment: "DEFAULT_ADMIN_ROLE", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "RELAYER_ROLE", + functionFragment: "MAX_RELAYERS", data: BytesLike ): Result; - decodeFunctionResult(functionFragment: "_chainID", data: BytesLike): Result; decodeFunctionResult( - functionFragment: "_depositCounts", + functionFragment: "PERMIT_TYPEHASH", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "RELAYER_ROLE", data: BytesLike ): Result; + decodeFunctionResult(functionFragment: "_chainId", data: BytesLike): Result; decodeFunctionResult( - functionFragment: "_depositRecords", + functionFragment: "_depositCounts", data: BytesLike ): Result; + decodeFunctionResult(functionFragment: "_domainID", data: BytesLike): Result; decodeFunctionResult(functionFragment: "_expiry", data: BytesLike): Result; decodeFunctionResult(functionFragment: "_fee", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "_feeHandler", + data: BytesLike + ): Result; decodeFunctionResult( functionFragment: "_hasVotedOnProposal", data: BytesLike ): Result; - decodeFunctionResult(functionFragment: "_proposals", data: BytesLike): Result; decodeFunctionResult( functionFragment: "_relayerThreshold", data: BytesLike @@ -277,55 +310,59 @@ interface BridgeInterface extends ethers.utils.Interface { data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "_specialFee", + functionFragment: "_totalRelayers", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "_specialFeeChainID", + functionFragment: "adminAddRelayer", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "_totalProposals", + functionFragment: "adminChangeExpiry", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "_totalRelayers", + functionFragment: "adminChangeFeeHandler", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "adminChangeRelayerThreshold", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "_wtokenAddress", + functionFragment: "adminPauseTransfers", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "adminAddRelayer", + functionFragment: "adminRemoveRelayer", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "adminChangeFee", + functionFragment: "adminSetBurnable", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "adminChangeRelayerThreshold", + functionFragment: "adminSetDepositNonce", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "adminChangeSpecialFee", + functionFragment: "adminSetDomainId", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "adminPauseTransfers", + functionFragment: "adminSetForwarder", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "adminRemoveRelayer", + functionFragment: "adminSetGenericResource", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "adminSetBurnable", + functionFragment: "adminSetNative", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "adminSetGenericResource", + functionFragment: "adminSetNativeResource", data: BytesLike ): Result; decodeFunctionResult( @@ -337,25 +374,30 @@ interface BridgeInterface extends ethers.utils.Interface { data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "adminUpdateBridgeAddress", + functionFragment: "adminWithdraw", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "adminWithdraw", + functionFragment: "adminWithdrawETH", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "calculateFee", data: BytesLike ): Result; decodeFunctionResult( functionFragment: "cancelProposal", data: BytesLike ): Result; + decodeFunctionResult( + functionFragment: "checkSignature", + data: BytesLike + ): Result; decodeFunctionResult(functionFragment: "deposit", data: BytesLike): Result; - decodeFunctionResult(functionFragment: "depositETH", data: BytesLike): Result; decodeFunctionResult( functionFragment: "executeProposal", data: BytesLike ): Result; - decodeFunctionResult(functionFragment: "getFee", data: BytesLike): Result; - decodeFunctionResult(functionFragment: "getFees", data: BytesLike): Result; decodeFunctionResult( functionFragment: "getProposal", data: BytesLike @@ -372,9 +414,17 @@ interface BridgeInterface extends ethers.utils.Interface { functionFragment: "getRoleMemberCount", data: BytesLike ): Result; + decodeFunctionResult( + functionFragment: "getRoleMemberIndex", + data: BytesLike + ): Result; decodeFunctionResult(functionFragment: "grantRole", data: BytesLike): Result; decodeFunctionResult(functionFragment: "hasRole", data: BytesLike): Result; decodeFunctionResult(functionFragment: "isRelayer", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "isValidForwarder", + data: BytesLike + ): Result; decodeFunctionResult(functionFragment: "paused", data: BytesLike): Result; decodeFunctionResult( functionFragment: "renounceAdmin", @@ -393,29 +443,35 @@ interface BridgeInterface extends ethers.utils.Interface { functionFragment: "voteProposal", data: BytesLike ): Result; + decodeFunctionResult( + functionFragment: "voteProposals", + data: BytesLike + ): Result; events: { - "Deposit(uint8,bytes32,uint64)": EventFragment; + "Deposit(uint8,bytes32,uint64,address,bytes,bytes)": EventFragment; + "FailedHandlerExecution(bytes)": EventFragment; + "FeeHandlerChanged(address)": EventFragment; "Paused(address)": EventFragment; - "ProposalEvent(uint8,uint64,uint8,bytes32,bytes32)": EventFragment; + "ProposalEvent(uint8,uint64,uint8,bytes32)": EventFragment; "ProposalVote(uint8,uint64,uint8,bytes32)": EventFragment; "RelayerAdded(address)": EventFragment; "RelayerRemoved(address)": EventFragment; "RelayerThresholdChanged(uint256)": EventFragment; - "RoleAdminChanged(bytes32,bytes32,bytes32)": EventFragment; "RoleGranted(bytes32,address,address)": EventFragment; "RoleRevoked(bytes32,address,address)": EventFragment; "Unpaused(address)": EventFragment; }; getEvent(nameOrSignatureOrTopic: "Deposit"): EventFragment; + getEvent(nameOrSignatureOrTopic: "FailedHandlerExecution"): EventFragment; + getEvent(nameOrSignatureOrTopic: "FeeHandlerChanged"): EventFragment; getEvent(nameOrSignatureOrTopic: "Paused"): EventFragment; getEvent(nameOrSignatureOrTopic: "ProposalEvent"): EventFragment; getEvent(nameOrSignatureOrTopic: "ProposalVote"): EventFragment; getEvent(nameOrSignatureOrTopic: "RelayerAdded"): EventFragment; getEvent(nameOrSignatureOrTopic: "RelayerRemoved"): EventFragment; getEvent(nameOrSignatureOrTopic: "RelayerThresholdChanged"): EventFragment; - getEvent(nameOrSignatureOrTopic: "RoleAdminChanged"): EventFragment; getEvent(nameOrSignatureOrTopic: "RoleGranted"): EventFragment; getEvent(nameOrSignatureOrTopic: "RoleRevoked"): EventFragment; getEvent(nameOrSignatureOrTopic: "Unpaused"): EventFragment; @@ -469,13 +525,21 @@ export class Bridge extends Contract { "DEFAULT_ADMIN_ROLE()"(overrides?: CallOverrides): Promise<[string]>; + MAX_RELAYERS(overrides?: CallOverrides): Promise<[BigNumber]>; + + "MAX_RELAYERS()"(overrides?: CallOverrides): Promise<[BigNumber]>; + + PERMIT_TYPEHASH(overrides?: CallOverrides): Promise<[string]>; + + "PERMIT_TYPEHASH()"(overrides?: CallOverrides): Promise<[string]>; + RELAYER_ROLE(overrides?: CallOverrides): Promise<[string]>; "RELAYER_ROLE()"(overrides?: CallOverrides): Promise<[string]>; - _chainID(overrides?: CallOverrides): Promise<[number]>; + _chainId(overrides?: CallOverrides): Promise<[BigNumber]>; - "_chainID()"(overrides?: CallOverrides): Promise<[number]>; + "_chainId()"(overrides?: CallOverrides): Promise<[BigNumber]>; _depositCounts( arg0: BigNumberish, @@ -487,69 +551,39 @@ export class Bridge extends Contract { overrides?: CallOverrides ): Promise<[BigNumber]>; - _depositRecords( - arg0: BigNumberish, - arg1: BigNumberish, - overrides?: CallOverrides - ): Promise<[string]>; + _domainID(overrides?: CallOverrides): Promise<[number]>; - "_depositRecords(uint64,uint8)"( - arg0: BigNumberish, - arg1: BigNumberish, - overrides?: CallOverrides - ): Promise<[string]>; + "_domainID()"(overrides?: CallOverrides): Promise<[number]>; - _expiry(overrides?: CallOverrides): Promise<[BigNumber]>; + _expiry(overrides?: CallOverrides): Promise<[number]>; - "_expiry()"(overrides?: CallOverrides): Promise<[BigNumber]>; + "_expiry()"(overrides?: CallOverrides): Promise<[number]>; _fee(overrides?: CallOverrides): Promise<[BigNumber]>; "_fee()"(overrides?: CallOverrides): Promise<[BigNumber]>; + _feeHandler(overrides?: CallOverrides): Promise<[string]>; + + "_feeHandler()"(overrides?: CallOverrides): Promise<[string]>; + _hasVotedOnProposal( - arg0: BigNumberish, - arg1: BytesLike, - arg2: string, + destNonce: BigNumberish, + dataHash: BytesLike, + relayer: string, overrides?: CallOverrides ): Promise<[boolean]>; "_hasVotedOnProposal(uint72,bytes32,address)"( - arg0: BigNumberish, - arg1: BytesLike, - arg2: string, + destNonce: BigNumberish, + dataHash: BytesLike, + relayer: string, overrides?: CallOverrides ): Promise<[boolean]>; - _proposals( - arg0: BigNumberish, - arg1: BytesLike, - overrides?: CallOverrides - ): Promise< - [string, string, number, BigNumber] & { - _resourceID: string; - _dataHash: string; - _status: number; - _proposedBlock: BigNumber; - } - >; - - "_proposals(uint72,bytes32)"( - arg0: BigNumberish, - arg1: BytesLike, - overrides?: CallOverrides - ): Promise< - [string, string, number, BigNumber] & { - _resourceID: string; - _dataHash: string; - _status: number; - _proposedBlock: BigNumber; - } - >; - - _relayerThreshold(overrides?: CallOverrides): Promise<[BigNumber]>; + _relayerThreshold(overrides?: CallOverrides): Promise<[number]>; - "_relayerThreshold()"(overrides?: CallOverrides): Promise<[BigNumber]>; + "_relayerThreshold()"(overrides?: CallOverrides): Promise<[number]>; _resourceIDToHandlerAddress( arg0: BytesLike, @@ -561,26 +595,10 @@ export class Bridge extends Contract { overrides?: CallOverrides ): Promise<[string]>; - _specialFee(overrides?: CallOverrides): Promise<[BigNumber]>; - - "_specialFee()"(overrides?: CallOverrides): Promise<[BigNumber]>; - - _specialFeeChainID(overrides?: CallOverrides): Promise<[number]>; - - "_specialFeeChainID()"(overrides?: CallOverrides): Promise<[number]>; - - _totalProposals(overrides?: CallOverrides): Promise<[BigNumber]>; - - "_totalProposals()"(overrides?: CallOverrides): Promise<[BigNumber]>; - _totalRelayers(overrides?: CallOverrides): Promise<[BigNumber]>; "_totalRelayers()"(overrides?: CallOverrides): Promise<[BigNumber]>; - _wtokenAddress(overrides?: CallOverrides): Promise<[string]>; - - "_wtokenAddress()"(overrides?: CallOverrides): Promise<[string]>; - adminAddRelayer( relayerAddress: string, overrides?: Overrides @@ -591,35 +609,33 @@ export class Bridge extends Contract { overrides?: Overrides ): Promise; - adminChangeFee( - newFee: BigNumberish, + adminChangeExpiry( + expiry: BigNumberish, overrides?: Overrides ): Promise; - "adminChangeFee(uint256)"( - newFee: BigNumberish, + "adminChangeExpiry(uint256)"( + expiry: BigNumberish, overrides?: Overrides ): Promise; - adminChangeRelayerThreshold( - newThreshold: BigNumberish, + adminChangeFeeHandler( + newFeeHandler: string, overrides?: Overrides ): Promise; - "adminChangeRelayerThreshold(uint256)"( - newThreshold: BigNumberish, + "adminChangeFeeHandler(address)"( + newFeeHandler: string, overrides?: Overrides ): Promise; - adminChangeSpecialFee( - newFee: BigNumberish, - chainID: BigNumberish, + adminChangeRelayerThreshold( + newThreshold: BigNumberish, overrides?: Overrides ): Promise; - "adminChangeSpecialFee(uint256,uint8)"( - newFee: BigNumberish, - chainID: BigNumberish, + "adminChangeRelayerThreshold(uint256)"( + newThreshold: BigNumberish, overrides?: Overrides ): Promise; @@ -651,6 +667,40 @@ export class Bridge extends Contract { overrides?: Overrides ): Promise; + adminSetDepositNonce( + domainID: BigNumberish, + nonce: BigNumberish, + overrides?: Overrides + ): Promise; + + "adminSetDepositNonce(uint8,uint64)"( + domainID: BigNumberish, + nonce: BigNumberish, + overrides?: Overrides + ): Promise; + + adminSetDomainId( + domainID: BigNumberish, + overrides?: Overrides + ): Promise; + + "adminSetDomainId(uint8)"( + domainID: BigNumberish, + overrides?: Overrides + ): Promise; + + adminSetForwarder( + forwarder: string, + valid: boolean, + overrides?: Overrides + ): Promise; + + "adminSetForwarder(address,bool)"( + forwarder: string, + valid: boolean, + overrides?: Overrides + ): Promise; + adminSetGenericResource( handlerAddress: string, resourceID: BytesLike, @@ -671,6 +721,30 @@ export class Bridge extends Contract { overrides?: Overrides ): Promise; + adminSetNative( + resourceID: BytesLike, + nativeAddress: string, + isNative: boolean, + overrides?: Overrides + ): Promise; + + "adminSetNative(bytes32,address,bool)"( + resourceID: BytesLike, + nativeAddress: string, + isNative: boolean, + overrides?: Overrides + ): Promise; + + adminSetNativeResource( + handlerAddress: string, + overrides?: Overrides + ): Promise; + + "adminSetNativeResource(address)"( + handlerAddress: string, + overrides?: Overrides + ): Promise; + adminSetResource( handlerAddress: string, resourceID: BytesLike, @@ -691,140 +765,142 @@ export class Bridge extends Contract { overrides?: Overrides ): Promise; - adminUpdateBridgeAddress( + adminWithdraw( handlerAddress: string, - newBridgeAddress: string, + data: BytesLike, overrides?: Overrides ): Promise; - "adminUpdateBridgeAddress(address,address)"( + "adminWithdraw(address,bytes)"( handlerAddress: string, - newBridgeAddress: string, + data: BytesLike, overrides?: Overrides ): Promise; - adminWithdraw( + adminWithdrawETH( handlerAddress: string, - tokenAddress: string, - recipient: string, - amountOrTokenID: BigNumberish, + data: BytesLike, overrides?: Overrides ): Promise; - "adminWithdraw(address,address,address,uint256)"( + "adminWithdrawETH(address,bytes)"( handlerAddress: string, - tokenAddress: string, - recipient: string, - amountOrTokenID: BigNumberish, + data: BytesLike, overrides?: Overrides ): Promise; + calculateFee( + destinationDomainID: BigNumberish, + resourceID: BytesLike, + depositData: BytesLike, + feeData: BytesLike, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + "calculateFee(uint8,bytes32,bytes,bytes)"( + destinationDomainID: BigNumberish, + resourceID: BytesLike, + depositData: BytesLike, + feeData: BytesLike, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + cancelProposal( - chainID: BigNumberish, + domainID: BigNumberish, depositNonce: BigNumberish, dataHash: BytesLike, overrides?: Overrides ): Promise; "cancelProposal(uint8,uint64,bytes32)"( - chainID: BigNumberish, + domainID: BigNumberish, depositNonce: BigNumberish, dataHash: BytesLike, overrides?: Overrides ): Promise; - deposit( - destinationChainID: BigNumberish, + checkSignature( + domainID: BigNumberish, + depositNonce: BigNumberish, resourceID: BytesLike, data: BytesLike, - overrides?: PayableOverrides - ): Promise; + signature: BytesLike, + overrides?: CallOverrides + ): Promise<[boolean]>; - "deposit(uint8,bytes32,bytes)"( - destinationChainID: BigNumberish, + "checkSignature(uint8,uint64,bytes32,bytes,bytes)"( + domainID: BigNumberish, + depositNonce: BigNumberish, resourceID: BytesLike, data: BytesLike, - overrides?: PayableOverrides - ): Promise; + signature: BytesLike, + overrides?: CallOverrides + ): Promise<[boolean]>; - depositETH( - destinationChainID: BigNumberish, + deposit( + destinationDomainID: BigNumberish, resourceID: BytesLike, - data: BytesLike, + depositData: BytesLike, + feeData: BytesLike, overrides?: PayableOverrides ): Promise; - "depositETH(uint8,bytes32,bytes)"( - destinationChainID: BigNumberish, + "deposit(uint8,bytes32,bytes,bytes)"( + destinationDomainID: BigNumberish, resourceID: BytesLike, - data: BytesLike, + depositData: BytesLike, + feeData: BytesLike, overrides?: PayableOverrides ): Promise; executeProposal( - chainID: BigNumberish, + domainID: BigNumberish, depositNonce: BigNumberish, data: BytesLike, resourceID: BytesLike, + revertOnFail: boolean, overrides?: Overrides ): Promise; - "executeProposal(uint8,uint64,bytes,bytes32)"( - chainID: BigNumberish, + "executeProposal(uint8,uint64,bytes,bytes32,bool)"( + domainID: BigNumberish, depositNonce: BigNumberish, data: BytesLike, resourceID: BytesLike, + revertOnFail: boolean, overrides?: Overrides ): Promise; - getFee( - destinationChainID: BigNumberish, - overrides?: CallOverrides - ): Promise<[BigNumber]>; - - "getFee(uint8)"( - destinationChainID: BigNumberish, - overrides?: CallOverrides - ): Promise<[BigNumber]>; - - getFees(overrides?: CallOverrides): Promise<[BigNumber, BigNumber, number]>; - - "getFees()"( - overrides?: CallOverrides - ): Promise<[BigNumber, BigNumber, number]>; - getProposal( - originChainID: BigNumberish, + originDomainID: BigNumberish, depositNonce: BigNumberish, - dataHash: BytesLike, + resourceID: BytesLike, + data: BytesLike, overrides?: CallOverrides ): Promise< [ - [string, string, string[], string[], number, BigNumber] & { - _resourceID: string; - _dataHash: string; - _yesVotes: string[]; - _noVotes: string[]; + [number, BigNumber, number, number] & { _status: number; - _proposedBlock: BigNumber; + _yesVotes: BigNumber; + _yesVotesTotal: number; + _proposedBlock: number; } ] >; - "getProposal(uint8,uint64,bytes32)"( - originChainID: BigNumberish, + "getProposal(uint8,uint64,bytes32,bytes)"( + originDomainID: BigNumberish, depositNonce: BigNumberish, - dataHash: BytesLike, + resourceID: BytesLike, + data: BytesLike, overrides?: CallOverrides ): Promise< [ - [string, string, string[], string[], number, BigNumber] & { - _resourceID: string; - _dataHash: string; - _yesVotes: string[]; - _noVotes: string[]; + [number, BigNumber, number, number] & { _status: number; - _proposedBlock: BigNumber; + _yesVotes: BigNumber; + _yesVotesTotal: number; + _proposedBlock: number; } ] >; @@ -858,6 +934,18 @@ export class Bridge extends Contract { overrides?: CallOverrides ): Promise<[BigNumber]>; + getRoleMemberIndex( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + "getRoleMemberIndex(bytes32,address)"( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + grantRole( role: BytesLike, account: string, @@ -889,6 +977,16 @@ export class Bridge extends Contract { overrides?: CallOverrides ): Promise<[boolean]>; + isValidForwarder( + arg0: string, + overrides?: CallOverrides + ): Promise<[boolean]>; + + "isValidForwarder(address)"( + arg0: string, + overrides?: CallOverrides + ): Promise<[boolean]>; + paused(overrides?: CallOverrides): Promise<[boolean]>; "paused()"(overrides?: CallOverrides): Promise<[boolean]>; @@ -940,18 +1038,36 @@ export class Bridge extends Contract { ): Promise; voteProposal( - chainID: BigNumberish, + domainID: BigNumberish, depositNonce: BigNumberish, resourceID: BytesLike, - dataHash: BytesLike, + data: BytesLike, overrides?: Overrides ): Promise; - "voteProposal(uint8,uint64,bytes32,bytes32)"( - chainID: BigNumberish, + "voteProposal(uint8,uint64,bytes32,bytes)"( + domainID: BigNumberish, depositNonce: BigNumberish, resourceID: BytesLike, - dataHash: BytesLike, + data: BytesLike, + overrides?: Overrides + ): Promise; + + voteProposals( + domainID: BigNumberish, + depositNonce: BigNumberish, + resourceID: BytesLike, + data: BytesLike, + signatures: BytesLike[], + overrides?: Overrides + ): Promise; + + "voteProposals(uint8,uint64,bytes32,bytes,bytes[])"( + domainID: BigNumberish, + depositNonce: BigNumberish, + resourceID: BytesLike, + data: BytesLike, + signatures: BytesLike[], overrides?: Overrides ): Promise; }; @@ -960,13 +1076,21 @@ export class Bridge extends Contract { "DEFAULT_ADMIN_ROLE()"(overrides?: CallOverrides): Promise; + MAX_RELAYERS(overrides?: CallOverrides): Promise; + + "MAX_RELAYERS()"(overrides?: CallOverrides): Promise; + + PERMIT_TYPEHASH(overrides?: CallOverrides): Promise; + + "PERMIT_TYPEHASH()"(overrides?: CallOverrides): Promise; + RELAYER_ROLE(overrides?: CallOverrides): Promise; "RELAYER_ROLE()"(overrides?: CallOverrides): Promise; - _chainID(overrides?: CallOverrides): Promise; + _chainId(overrides?: CallOverrides): Promise; - "_chainID()"(overrides?: CallOverrides): Promise; + "_chainId()"(overrides?: CallOverrides): Promise; _depositCounts( arg0: BigNumberish, @@ -978,69 +1102,39 @@ export class Bridge extends Contract { overrides?: CallOverrides ): Promise; - _depositRecords( - arg0: BigNumberish, - arg1: BigNumberish, - overrides?: CallOverrides - ): Promise; + _domainID(overrides?: CallOverrides): Promise; - "_depositRecords(uint64,uint8)"( - arg0: BigNumberish, - arg1: BigNumberish, - overrides?: CallOverrides - ): Promise; + "_domainID()"(overrides?: CallOverrides): Promise; - _expiry(overrides?: CallOverrides): Promise; + _expiry(overrides?: CallOverrides): Promise; - "_expiry()"(overrides?: CallOverrides): Promise; + "_expiry()"(overrides?: CallOverrides): Promise; _fee(overrides?: CallOverrides): Promise; "_fee()"(overrides?: CallOverrides): Promise; + _feeHandler(overrides?: CallOverrides): Promise; + + "_feeHandler()"(overrides?: CallOverrides): Promise; + _hasVotedOnProposal( - arg0: BigNumberish, - arg1: BytesLike, - arg2: string, + destNonce: BigNumberish, + dataHash: BytesLike, + relayer: string, overrides?: CallOverrides ): Promise; "_hasVotedOnProposal(uint72,bytes32,address)"( - arg0: BigNumberish, - arg1: BytesLike, - arg2: string, + destNonce: BigNumberish, + dataHash: BytesLike, + relayer: string, overrides?: CallOverrides ): Promise; - _proposals( - arg0: BigNumberish, - arg1: BytesLike, - overrides?: CallOverrides - ): Promise< - [string, string, number, BigNumber] & { - _resourceID: string; - _dataHash: string; - _status: number; - _proposedBlock: BigNumber; - } - >; + _relayerThreshold(overrides?: CallOverrides): Promise; - "_proposals(uint72,bytes32)"( - arg0: BigNumberish, - arg1: BytesLike, - overrides?: CallOverrides - ): Promise< - [string, string, number, BigNumber] & { - _resourceID: string; - _dataHash: string; - _status: number; - _proposedBlock: BigNumber; - } - >; - - _relayerThreshold(overrides?: CallOverrides): Promise; - - "_relayerThreshold()"(overrides?: CallOverrides): Promise; + "_relayerThreshold()"(overrides?: CallOverrides): Promise; _resourceIDToHandlerAddress( arg0: BytesLike, @@ -1052,26 +1146,10 @@ export class Bridge extends Contract { overrides?: CallOverrides ): Promise; - _specialFee(overrides?: CallOverrides): Promise; - - "_specialFee()"(overrides?: CallOverrides): Promise; - - _specialFeeChainID(overrides?: CallOverrides): Promise; - - "_specialFeeChainID()"(overrides?: CallOverrides): Promise; - - _totalProposals(overrides?: CallOverrides): Promise; - - "_totalProposals()"(overrides?: CallOverrides): Promise; - _totalRelayers(overrides?: CallOverrides): Promise; "_totalRelayers()"(overrides?: CallOverrides): Promise; - _wtokenAddress(overrides?: CallOverrides): Promise; - - "_wtokenAddress()"(overrides?: CallOverrides): Promise; - adminAddRelayer( relayerAddress: string, overrides?: Overrides @@ -1082,35 +1160,33 @@ export class Bridge extends Contract { overrides?: Overrides ): Promise; - adminChangeFee( - newFee: BigNumberish, + adminChangeExpiry( + expiry: BigNumberish, overrides?: Overrides ): Promise; - "adminChangeFee(uint256)"( - newFee: BigNumberish, + "adminChangeExpiry(uint256)"( + expiry: BigNumberish, overrides?: Overrides ): Promise; - adminChangeRelayerThreshold( - newThreshold: BigNumberish, + adminChangeFeeHandler( + newFeeHandler: string, overrides?: Overrides ): Promise; - "adminChangeRelayerThreshold(uint256)"( - newThreshold: BigNumberish, + "adminChangeFeeHandler(address)"( + newFeeHandler: string, overrides?: Overrides ): Promise; - adminChangeSpecialFee( - newFee: BigNumberish, - chainID: BigNumberish, + adminChangeRelayerThreshold( + newThreshold: BigNumberish, overrides?: Overrides ): Promise; - "adminChangeSpecialFee(uint256,uint8)"( - newFee: BigNumberish, - chainID: BigNumberish, + "adminChangeRelayerThreshold(uint256)"( + newThreshold: BigNumberish, overrides?: Overrides ): Promise; @@ -1140,6 +1216,40 @@ export class Bridge extends Contract { overrides?: Overrides ): Promise; + adminSetDepositNonce( + domainID: BigNumberish, + nonce: BigNumberish, + overrides?: Overrides + ): Promise; + + "adminSetDepositNonce(uint8,uint64)"( + domainID: BigNumberish, + nonce: BigNumberish, + overrides?: Overrides + ): Promise; + + adminSetDomainId( + domainID: BigNumberish, + overrides?: Overrides + ): Promise; + + "adminSetDomainId(uint8)"( + domainID: BigNumberish, + overrides?: Overrides + ): Promise; + + adminSetForwarder( + forwarder: string, + valid: boolean, + overrides?: Overrides + ): Promise; + + "adminSetForwarder(address,bool)"( + forwarder: string, + valid: boolean, + overrides?: Overrides + ): Promise; + adminSetGenericResource( handlerAddress: string, resourceID: BytesLike, @@ -1160,6 +1270,30 @@ export class Bridge extends Contract { overrides?: Overrides ): Promise; + adminSetNative( + resourceID: BytesLike, + nativeAddress: string, + isNative: boolean, + overrides?: Overrides + ): Promise; + + "adminSetNative(bytes32,address,bool)"( + resourceID: BytesLike, + nativeAddress: string, + isNative: boolean, + overrides?: Overrides + ): Promise; + + adminSetNativeResource( + handlerAddress: string, + overrides?: Overrides + ): Promise; + + "adminSetNativeResource(address)"( + handlerAddress: string, + overrides?: Overrides + ): Promise; + adminSetResource( handlerAddress: string, resourceID: BytesLike, @@ -1180,137 +1314,139 @@ export class Bridge extends Contract { overrides?: Overrides ): Promise; - adminUpdateBridgeAddress( + adminWithdraw( handlerAddress: string, - newBridgeAddress: string, + data: BytesLike, overrides?: Overrides ): Promise; - "adminUpdateBridgeAddress(address,address)"( + "adminWithdraw(address,bytes)"( handlerAddress: string, - newBridgeAddress: string, + data: BytesLike, overrides?: Overrides ): Promise; - adminWithdraw( + adminWithdrawETH( handlerAddress: string, - tokenAddress: string, - recipient: string, - amountOrTokenID: BigNumberish, + data: BytesLike, overrides?: Overrides ): Promise; - "adminWithdraw(address,address,address,uint256)"( + "adminWithdrawETH(address,bytes)"( handlerAddress: string, - tokenAddress: string, - recipient: string, - amountOrTokenID: BigNumberish, + data: BytesLike, overrides?: Overrides ): Promise; + calculateFee( + destinationDomainID: BigNumberish, + resourceID: BytesLike, + depositData: BytesLike, + feeData: BytesLike, + overrides?: CallOverrides + ): Promise; + + "calculateFee(uint8,bytes32,bytes,bytes)"( + destinationDomainID: BigNumberish, + resourceID: BytesLike, + depositData: BytesLike, + feeData: BytesLike, + overrides?: CallOverrides + ): Promise; + cancelProposal( - chainID: BigNumberish, + domainID: BigNumberish, depositNonce: BigNumberish, dataHash: BytesLike, overrides?: Overrides ): Promise; "cancelProposal(uint8,uint64,bytes32)"( - chainID: BigNumberish, + domainID: BigNumberish, depositNonce: BigNumberish, dataHash: BytesLike, overrides?: Overrides ): Promise; - deposit( - destinationChainID: BigNumberish, + checkSignature( + domainID: BigNumberish, + depositNonce: BigNumberish, resourceID: BytesLike, data: BytesLike, - overrides?: PayableOverrides - ): Promise; + signature: BytesLike, + overrides?: CallOverrides + ): Promise; - "deposit(uint8,bytes32,bytes)"( - destinationChainID: BigNumberish, + "checkSignature(uint8,uint64,bytes32,bytes,bytes)"( + domainID: BigNumberish, + depositNonce: BigNumberish, resourceID: BytesLike, data: BytesLike, - overrides?: PayableOverrides - ): Promise; + signature: BytesLike, + overrides?: CallOverrides + ): Promise; - depositETH( - destinationChainID: BigNumberish, + deposit( + destinationDomainID: BigNumberish, resourceID: BytesLike, - data: BytesLike, + depositData: BytesLike, + feeData: BytesLike, overrides?: PayableOverrides ): Promise; - "depositETH(uint8,bytes32,bytes)"( - destinationChainID: BigNumberish, + "deposit(uint8,bytes32,bytes,bytes)"( + destinationDomainID: BigNumberish, resourceID: BytesLike, - data: BytesLike, + depositData: BytesLike, + feeData: BytesLike, overrides?: PayableOverrides ): Promise; executeProposal( - chainID: BigNumberish, + domainID: BigNumberish, depositNonce: BigNumberish, data: BytesLike, resourceID: BytesLike, + revertOnFail: boolean, overrides?: Overrides ): Promise; - "executeProposal(uint8,uint64,bytes,bytes32)"( - chainID: BigNumberish, + "executeProposal(uint8,uint64,bytes,bytes32,bool)"( + domainID: BigNumberish, depositNonce: BigNumberish, data: BytesLike, resourceID: BytesLike, + revertOnFail: boolean, overrides?: Overrides ): Promise; - getFee( - destinationChainID: BigNumberish, - overrides?: CallOverrides - ): Promise; - - "getFee(uint8)"( - destinationChainID: BigNumberish, - overrides?: CallOverrides - ): Promise; - - getFees(overrides?: CallOverrides): Promise<[BigNumber, BigNumber, number]>; - - "getFees()"( - overrides?: CallOverrides - ): Promise<[BigNumber, BigNumber, number]>; - getProposal( - originChainID: BigNumberish, + originDomainID: BigNumberish, depositNonce: BigNumberish, - dataHash: BytesLike, + resourceID: BytesLike, + data: BytesLike, overrides?: CallOverrides ): Promise< - [string, string, string[], string[], number, BigNumber] & { - _resourceID: string; - _dataHash: string; - _yesVotes: string[]; - _noVotes: string[]; + [number, BigNumber, number, number] & { _status: number; - _proposedBlock: BigNumber; + _yesVotes: BigNumber; + _yesVotesTotal: number; + _proposedBlock: number; } >; - "getProposal(uint8,uint64,bytes32)"( - originChainID: BigNumberish, + "getProposal(uint8,uint64,bytes32,bytes)"( + originDomainID: BigNumberish, depositNonce: BigNumberish, - dataHash: BytesLike, + resourceID: BytesLike, + data: BytesLike, overrides?: CallOverrides ): Promise< - [string, string, string[], string[], number, BigNumber] & { - _resourceID: string; - _dataHash: string; - _yesVotes: string[]; - _noVotes: string[]; + [number, BigNumber, number, number] & { _status: number; - _proposedBlock: BigNumber; + _yesVotes: BigNumber; + _yesVotesTotal: number; + _proposedBlock: number; } >; @@ -1343,6 +1479,18 @@ export class Bridge extends Contract { overrides?: CallOverrides ): Promise; + getRoleMemberIndex( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + + "getRoleMemberIndex(bytes32,address)"( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + grantRole( role: BytesLike, account: string, @@ -1374,6 +1522,13 @@ export class Bridge extends Contract { overrides?: CallOverrides ): Promise; + isValidForwarder(arg0: string, overrides?: CallOverrides): Promise; + + "isValidForwarder(address)"( + arg0: string, + overrides?: CallOverrides + ): Promise; + paused(overrides?: CallOverrides): Promise; "paused()"(overrides?: CallOverrides): Promise; @@ -1425,18 +1580,36 @@ export class Bridge extends Contract { ): Promise; voteProposal( - chainID: BigNumberish, + domainID: BigNumberish, depositNonce: BigNumberish, resourceID: BytesLike, - dataHash: BytesLike, + data: BytesLike, overrides?: Overrides ): Promise; - "voteProposal(uint8,uint64,bytes32,bytes32)"( - chainID: BigNumberish, + "voteProposal(uint8,uint64,bytes32,bytes)"( + domainID: BigNumberish, depositNonce: BigNumberish, resourceID: BytesLike, - dataHash: BytesLike, + data: BytesLike, + overrides?: Overrides + ): Promise; + + voteProposals( + domainID: BigNumberish, + depositNonce: BigNumberish, + resourceID: BytesLike, + data: BytesLike, + signatures: BytesLike[], + overrides?: Overrides + ): Promise; + + "voteProposals(uint8,uint64,bytes32,bytes,bytes[])"( + domainID: BigNumberish, + depositNonce: BigNumberish, + resourceID: BytesLike, + data: BytesLike, + signatures: BytesLike[], overrides?: Overrides ): Promise; @@ -1445,13 +1618,21 @@ export class Bridge extends Contract { "DEFAULT_ADMIN_ROLE()"(overrides?: CallOverrides): Promise; + MAX_RELAYERS(overrides?: CallOverrides): Promise; + + "MAX_RELAYERS()"(overrides?: CallOverrides): Promise; + + PERMIT_TYPEHASH(overrides?: CallOverrides): Promise; + + "PERMIT_TYPEHASH()"(overrides?: CallOverrides): Promise; + RELAYER_ROLE(overrides?: CallOverrides): Promise; "RELAYER_ROLE()"(overrides?: CallOverrides): Promise; - _chainID(overrides?: CallOverrides): Promise; + _chainId(overrides?: CallOverrides): Promise; - "_chainID()"(overrides?: CallOverrides): Promise; + "_chainId()"(overrides?: CallOverrides): Promise; _depositCounts( arg0: BigNumberish, @@ -1463,69 +1644,39 @@ export class Bridge extends Contract { overrides?: CallOverrides ): Promise; - _depositRecords( - arg0: BigNumberish, - arg1: BigNumberish, - overrides?: CallOverrides - ): Promise; + _domainID(overrides?: CallOverrides): Promise; - "_depositRecords(uint64,uint8)"( - arg0: BigNumberish, - arg1: BigNumberish, - overrides?: CallOverrides - ): Promise; + "_domainID()"(overrides?: CallOverrides): Promise; - _expiry(overrides?: CallOverrides): Promise; + _expiry(overrides?: CallOverrides): Promise; - "_expiry()"(overrides?: CallOverrides): Promise; + "_expiry()"(overrides?: CallOverrides): Promise; _fee(overrides?: CallOverrides): Promise; "_fee()"(overrides?: CallOverrides): Promise; + _feeHandler(overrides?: CallOverrides): Promise; + + "_feeHandler()"(overrides?: CallOverrides): Promise; + _hasVotedOnProposal( - arg0: BigNumberish, - arg1: BytesLike, - arg2: string, + destNonce: BigNumberish, + dataHash: BytesLike, + relayer: string, overrides?: CallOverrides ): Promise; "_hasVotedOnProposal(uint72,bytes32,address)"( - arg0: BigNumberish, - arg1: BytesLike, - arg2: string, + destNonce: BigNumberish, + dataHash: BytesLike, + relayer: string, overrides?: CallOverrides ): Promise; - _proposals( - arg0: BigNumberish, - arg1: BytesLike, - overrides?: CallOverrides - ): Promise< - [string, string, number, BigNumber] & { - _resourceID: string; - _dataHash: string; - _status: number; - _proposedBlock: BigNumber; - } - >; - - "_proposals(uint72,bytes32)"( - arg0: BigNumberish, - arg1: BytesLike, - overrides?: CallOverrides - ): Promise< - [string, string, number, BigNumber] & { - _resourceID: string; - _dataHash: string; - _status: number; - _proposedBlock: BigNumber; - } - >; + _relayerThreshold(overrides?: CallOverrides): Promise; - _relayerThreshold(overrides?: CallOverrides): Promise; - - "_relayerThreshold()"(overrides?: CallOverrides): Promise; + "_relayerThreshold()"(overrides?: CallOverrides): Promise; _resourceIDToHandlerAddress( arg0: BytesLike, @@ -1537,26 +1688,10 @@ export class Bridge extends Contract { overrides?: CallOverrides ): Promise; - _specialFee(overrides?: CallOverrides): Promise; - - "_specialFee()"(overrides?: CallOverrides): Promise; - - _specialFeeChainID(overrides?: CallOverrides): Promise; - - "_specialFeeChainID()"(overrides?: CallOverrides): Promise; - - _totalProposals(overrides?: CallOverrides): Promise; - - "_totalProposals()"(overrides?: CallOverrides): Promise; - _totalRelayers(overrides?: CallOverrides): Promise; "_totalRelayers()"(overrides?: CallOverrides): Promise; - _wtokenAddress(overrides?: CallOverrides): Promise; - - "_wtokenAddress()"(overrides?: CallOverrides): Promise; - adminAddRelayer( relayerAddress: string, overrides?: CallOverrides @@ -1567,35 +1702,33 @@ export class Bridge extends Contract { overrides?: CallOverrides ): Promise; - adminChangeFee( - newFee: BigNumberish, + adminChangeExpiry( + expiry: BigNumberish, overrides?: CallOverrides ): Promise; - "adminChangeFee(uint256)"( - newFee: BigNumberish, + "adminChangeExpiry(uint256)"( + expiry: BigNumberish, overrides?: CallOverrides ): Promise; - adminChangeRelayerThreshold( - newThreshold: BigNumberish, + adminChangeFeeHandler( + newFeeHandler: string, overrides?: CallOverrides ): Promise; - "adminChangeRelayerThreshold(uint256)"( - newThreshold: BigNumberish, + "adminChangeFeeHandler(address)"( + newFeeHandler: string, overrides?: CallOverrides ): Promise; - adminChangeSpecialFee( - newFee: BigNumberish, - chainID: BigNumberish, + adminChangeRelayerThreshold( + newThreshold: BigNumberish, overrides?: CallOverrides ): Promise; - "adminChangeSpecialFee(uint256,uint8)"( - newFee: BigNumberish, - chainID: BigNumberish, + "adminChangeRelayerThreshold(uint256)"( + newThreshold: BigNumberish, overrides?: CallOverrides ): Promise; @@ -1625,6 +1758,40 @@ export class Bridge extends Contract { overrides?: CallOverrides ): Promise; + adminSetDepositNonce( + domainID: BigNumberish, + nonce: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "adminSetDepositNonce(uint8,uint64)"( + domainID: BigNumberish, + nonce: BigNumberish, + overrides?: CallOverrides + ): Promise; + + adminSetDomainId( + domainID: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "adminSetDomainId(uint8)"( + domainID: BigNumberish, + overrides?: CallOverrides + ): Promise; + + adminSetForwarder( + forwarder: string, + valid: boolean, + overrides?: CallOverrides + ): Promise; + + "adminSetForwarder(address,bool)"( + forwarder: string, + valid: boolean, + overrides?: CallOverrides + ): Promise; + adminSetGenericResource( handlerAddress: string, resourceID: BytesLike, @@ -1645,6 +1812,30 @@ export class Bridge extends Contract { overrides?: CallOverrides ): Promise; + adminSetNative( + resourceID: BytesLike, + nativeAddress: string, + isNative: boolean, + overrides?: CallOverrides + ): Promise; + + "adminSetNative(bytes32,address,bool)"( + resourceID: BytesLike, + nativeAddress: string, + isNative: boolean, + overrides?: CallOverrides + ): Promise; + + adminSetNativeResource( + handlerAddress: string, + overrides?: CallOverrides + ): Promise; + + "adminSetNativeResource(address)"( + handlerAddress: string, + overrides?: CallOverrides + ): Promise; + adminSetResource( handlerAddress: string, resourceID: BytesLike, @@ -1663,137 +1854,139 @@ export class Bridge extends Contract { "adminUnpauseTransfers()"(overrides?: CallOverrides): Promise; - adminUpdateBridgeAddress( + adminWithdraw( handlerAddress: string, - newBridgeAddress: string, + data: BytesLike, overrides?: CallOverrides ): Promise; - "adminUpdateBridgeAddress(address,address)"( + "adminWithdraw(address,bytes)"( handlerAddress: string, - newBridgeAddress: string, + data: BytesLike, overrides?: CallOverrides ): Promise; - adminWithdraw( + adminWithdrawETH( handlerAddress: string, - tokenAddress: string, - recipient: string, - amountOrTokenID: BigNumberish, + data: BytesLike, overrides?: CallOverrides ): Promise; - "adminWithdraw(address,address,address,uint256)"( + "adminWithdrawETH(address,bytes)"( handlerAddress: string, - tokenAddress: string, - recipient: string, - amountOrTokenID: BigNumberish, + data: BytesLike, overrides?: CallOverrides ): Promise; + calculateFee( + destinationDomainID: BigNumberish, + resourceID: BytesLike, + depositData: BytesLike, + feeData: BytesLike, + overrides?: CallOverrides + ): Promise; + + "calculateFee(uint8,bytes32,bytes,bytes)"( + destinationDomainID: BigNumberish, + resourceID: BytesLike, + depositData: BytesLike, + feeData: BytesLike, + overrides?: CallOverrides + ): Promise; + cancelProposal( - chainID: BigNumberish, + domainID: BigNumberish, depositNonce: BigNumberish, dataHash: BytesLike, overrides?: CallOverrides ): Promise; "cancelProposal(uint8,uint64,bytes32)"( - chainID: BigNumberish, + domainID: BigNumberish, depositNonce: BigNumberish, dataHash: BytesLike, overrides?: CallOverrides ): Promise; - deposit( - destinationChainID: BigNumberish, + checkSignature( + domainID: BigNumberish, + depositNonce: BigNumberish, resourceID: BytesLike, data: BytesLike, + signature: BytesLike, overrides?: CallOverrides - ): Promise; + ): Promise; - "deposit(uint8,bytes32,bytes)"( - destinationChainID: BigNumberish, + "checkSignature(uint8,uint64,bytes32,bytes,bytes)"( + domainID: BigNumberish, + depositNonce: BigNumberish, resourceID: BytesLike, data: BytesLike, + signature: BytesLike, overrides?: CallOverrides - ): Promise; + ): Promise; - depositETH( - destinationChainID: BigNumberish, + deposit( + destinationDomainID: BigNumberish, resourceID: BytesLike, - data: BytesLike, + depositData: BytesLike, + feeData: BytesLike, overrides?: CallOverrides ): Promise; - "depositETH(uint8,bytes32,bytes)"( - destinationChainID: BigNumberish, + "deposit(uint8,bytes32,bytes,bytes)"( + destinationDomainID: BigNumberish, resourceID: BytesLike, - data: BytesLike, + depositData: BytesLike, + feeData: BytesLike, overrides?: CallOverrides ): Promise; executeProposal( - chainID: BigNumberish, + domainID: BigNumberish, depositNonce: BigNumberish, data: BytesLike, resourceID: BytesLike, + revertOnFail: boolean, overrides?: CallOverrides ): Promise; - "executeProposal(uint8,uint64,bytes,bytes32)"( - chainID: BigNumberish, + "executeProposal(uint8,uint64,bytes,bytes32,bool)"( + domainID: BigNumberish, depositNonce: BigNumberish, data: BytesLike, resourceID: BytesLike, + revertOnFail: boolean, overrides?: CallOverrides ): Promise; - getFee( - destinationChainID: BigNumberish, - overrides?: CallOverrides - ): Promise; - - "getFee(uint8)"( - destinationChainID: BigNumberish, - overrides?: CallOverrides - ): Promise; - - getFees(overrides?: CallOverrides): Promise<[BigNumber, BigNumber, number]>; - - "getFees()"( - overrides?: CallOverrides - ): Promise<[BigNumber, BigNumber, number]>; - getProposal( - originChainID: BigNumberish, + originDomainID: BigNumberish, depositNonce: BigNumberish, - dataHash: BytesLike, + resourceID: BytesLike, + data: BytesLike, overrides?: CallOverrides ): Promise< - [string, string, string[], string[], number, BigNumber] & { - _resourceID: string; - _dataHash: string; - _yesVotes: string[]; - _noVotes: string[]; + [number, BigNumber, number, number] & { _status: number; - _proposedBlock: BigNumber; + _yesVotes: BigNumber; + _yesVotesTotal: number; + _proposedBlock: number; } >; - "getProposal(uint8,uint64,bytes32)"( - originChainID: BigNumberish, + "getProposal(uint8,uint64,bytes32,bytes)"( + originDomainID: BigNumberish, depositNonce: BigNumberish, - dataHash: BytesLike, + resourceID: BytesLike, + data: BytesLike, overrides?: CallOverrides ): Promise< - [string, string, string[], string[], number, BigNumber] & { - _resourceID: string; - _dataHash: string; - _yesVotes: string[]; - _noVotes: string[]; + [number, BigNumber, number, number] & { _status: number; - _proposedBlock: BigNumber; + _yesVotes: BigNumber; + _yesVotesTotal: number; + _proposedBlock: number; } >; @@ -1826,6 +2019,18 @@ export class Bridge extends Contract { overrides?: CallOverrides ): Promise; + getRoleMemberIndex( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + + "getRoleMemberIndex(bytes32,address)"( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + grantRole( role: BytesLike, account: string, @@ -1857,6 +2062,13 @@ export class Bridge extends Contract { overrides?: CallOverrides ): Promise; + isValidForwarder(arg0: string, overrides?: CallOverrides): Promise; + + "isValidForwarder(address)"( + arg0: string, + overrides?: CallOverrides + ): Promise; + paused(overrides?: CallOverrides): Promise; "paused()"(overrides?: CallOverrides): Promise; @@ -1905,91 +2117,112 @@ export class Bridge extends Contract { ): Promise; voteProposal( - chainID: BigNumberish, + domainID: BigNumberish, depositNonce: BigNumberish, resourceID: BytesLike, - dataHash: BytesLike, + data: BytesLike, overrides?: CallOverrides ): Promise; - "voteProposal(uint8,uint64,bytes32,bytes32)"( - chainID: BigNumberish, + "voteProposal(uint8,uint64,bytes32,bytes)"( + domainID: BigNumberish, depositNonce: BigNumberish, resourceID: BytesLike, - dataHash: BytesLike, + data: BytesLike, + overrides?: CallOverrides + ): Promise; + + voteProposals( + domainID: BigNumberish, + depositNonce: BigNumberish, + resourceID: BytesLike, + data: BytesLike, + signatures: BytesLike[], + overrides?: CallOverrides + ): Promise; + + "voteProposals(uint8,uint64,bytes32,bytes,bytes[])"( + domainID: BigNumberish, + depositNonce: BigNumberish, + resourceID: BytesLike, + data: BytesLike, + signatures: BytesLike[], overrides?: CallOverrides ): Promise; }; filters: { Deposit( - destinationChainID: BigNumberish | null, - resourceID: BytesLike | null, - depositNonce: BigNumberish | null + destinationDomainID: null, + resourceID: null, + depositNonce: null, + user: string | null, + data: null, + handlerResponse: null ): TypedEventFilter< - [number, string, BigNumber], + [number, string, BigNumber, string, string, string], { - destinationChainID: number; + destinationDomainID: number; resourceID: string; depositNonce: BigNumber; + user: string; + data: string; + handlerResponse: string; } >; + FailedHandlerExecution( + lowLevelData: null + ): TypedEventFilter<[string], { lowLevelData: string }>; + + FeeHandlerChanged( + newFeeHandler: null + ): TypedEventFilter<[string], { newFeeHandler: string }>; + Paused(account: null): TypedEventFilter<[string], { account: string }>; ProposalEvent( - originChainID: BigNumberish | null, - depositNonce: BigNumberish | null, - status: BigNumberish | null, - resourceID: null, + originDomainID: null, + depositNonce: null, + status: null, dataHash: null ): TypedEventFilter< - [number, BigNumber, number, string, string], + [number, BigNumber, number, string], { - originChainID: number; + originDomainID: number; depositNonce: BigNumber; status: number; - resourceID: string; dataHash: string; } >; ProposalVote( - originChainID: BigNumberish | null, - depositNonce: BigNumberish | null, - status: BigNumberish | null, - resourceID: null + originDomainID: null, + depositNonce: null, + status: null, + dataHash: null ): TypedEventFilter< [number, BigNumber, number, string], { - originChainID: number; + originDomainID: number; depositNonce: BigNumber; status: number; - resourceID: string; + dataHash: string; } >; RelayerAdded( - relayer: string | null + relayer: null ): TypedEventFilter<[string], { relayer: string }>; RelayerRemoved( - relayer: string | null + relayer: null ): TypedEventFilter<[string], { relayer: string }>; RelayerThresholdChanged( - newThreshold: BigNumberish | null + newThreshold: null ): TypedEventFilter<[BigNumber], { newThreshold: BigNumber }>; - RoleAdminChanged( - role: BytesLike | null, - previousAdminRole: BytesLike | null, - newAdminRole: BytesLike | null - ): TypedEventFilter< - [string, string, string], - { role: string; previousAdminRole: string; newAdminRole: string } - >; - RoleGranted( role: BytesLike | null, account: string | null, @@ -2016,13 +2249,21 @@ export class Bridge extends Contract { "DEFAULT_ADMIN_ROLE()"(overrides?: CallOverrides): Promise; + MAX_RELAYERS(overrides?: CallOverrides): Promise; + + "MAX_RELAYERS()"(overrides?: CallOverrides): Promise; + + PERMIT_TYPEHASH(overrides?: CallOverrides): Promise; + + "PERMIT_TYPEHASH()"(overrides?: CallOverrides): Promise; + RELAYER_ROLE(overrides?: CallOverrides): Promise; "RELAYER_ROLE()"(overrides?: CallOverrides): Promise; - _chainID(overrides?: CallOverrides): Promise; + _chainId(overrides?: CallOverrides): Promise; - "_chainID()"(overrides?: CallOverrides): Promise; + "_chainId()"(overrides?: CallOverrides): Promise; _depositCounts( arg0: BigNumberish, @@ -2034,17 +2275,9 @@ export class Bridge extends Contract { overrides?: CallOverrides ): Promise; - _depositRecords( - arg0: BigNumberish, - arg1: BigNumberish, - overrides?: CallOverrides - ): Promise; + _domainID(overrides?: CallOverrides): Promise; - "_depositRecords(uint64,uint8)"( - arg0: BigNumberish, - arg1: BigNumberish, - overrides?: CallOverrides - ): Promise; + "_domainID()"(overrides?: CallOverrides): Promise; _expiry(overrides?: CallOverrides): Promise; @@ -2054,29 +2287,21 @@ export class Bridge extends Contract { "_fee()"(overrides?: CallOverrides): Promise; - _hasVotedOnProposal( - arg0: BigNumberish, - arg1: BytesLike, - arg2: string, - overrides?: CallOverrides - ): Promise; + _feeHandler(overrides?: CallOverrides): Promise; - "_hasVotedOnProposal(uint72,bytes32,address)"( - arg0: BigNumberish, - arg1: BytesLike, - arg2: string, - overrides?: CallOverrides - ): Promise; + "_feeHandler()"(overrides?: CallOverrides): Promise; - _proposals( - arg0: BigNumberish, - arg1: BytesLike, + _hasVotedOnProposal( + destNonce: BigNumberish, + dataHash: BytesLike, + relayer: string, overrides?: CallOverrides ): Promise; - "_proposals(uint72,bytes32)"( - arg0: BigNumberish, - arg1: BytesLike, + "_hasVotedOnProposal(uint72,bytes32,address)"( + destNonce: BigNumberish, + dataHash: BytesLike, + relayer: string, overrides?: CallOverrides ): Promise; @@ -2094,26 +2319,10 @@ export class Bridge extends Contract { overrides?: CallOverrides ): Promise; - _specialFee(overrides?: CallOverrides): Promise; - - "_specialFee()"(overrides?: CallOverrides): Promise; - - _specialFeeChainID(overrides?: CallOverrides): Promise; - - "_specialFeeChainID()"(overrides?: CallOverrides): Promise; - - _totalProposals(overrides?: CallOverrides): Promise; - - "_totalProposals()"(overrides?: CallOverrides): Promise; - _totalRelayers(overrides?: CallOverrides): Promise; "_totalRelayers()"(overrides?: CallOverrides): Promise; - _wtokenAddress(overrides?: CallOverrides): Promise; - - "_wtokenAddress()"(overrides?: CallOverrides): Promise; - adminAddRelayer( relayerAddress: string, overrides?: Overrides @@ -2124,13 +2333,23 @@ export class Bridge extends Contract { overrides?: Overrides ): Promise; - adminChangeFee( - newFee: BigNumberish, + adminChangeExpiry( + expiry: BigNumberish, + overrides?: Overrides + ): Promise; + + "adminChangeExpiry(uint256)"( + expiry: BigNumberish, + overrides?: Overrides + ): Promise; + + adminChangeFeeHandler( + newFeeHandler: string, overrides?: Overrides ): Promise; - "adminChangeFee(uint256)"( - newFee: BigNumberish, + "adminChangeFeeHandler(address)"( + newFeeHandler: string, overrides?: Overrides ): Promise; @@ -2144,41 +2363,63 @@ export class Bridge extends Contract { overrides?: Overrides ): Promise; - adminChangeSpecialFee( - newFee: BigNumberish, - chainID: BigNumberish, + adminPauseTransfers(overrides?: Overrides): Promise; + + "adminPauseTransfers()"(overrides?: Overrides): Promise; + + adminRemoveRelayer( + relayerAddress: string, + overrides?: Overrides + ): Promise; + + "adminRemoveRelayer(address)"( + relayerAddress: string, overrides?: Overrides ): Promise; - "adminChangeSpecialFee(uint256,uint8)"( - newFee: BigNumberish, - chainID: BigNumberish, + adminSetBurnable( + handlerAddress: string, + tokenAddress: string, overrides?: Overrides ): Promise; - adminPauseTransfers(overrides?: Overrides): Promise; + "adminSetBurnable(address,address)"( + handlerAddress: string, + tokenAddress: string, + overrides?: Overrides + ): Promise; - "adminPauseTransfers()"(overrides?: Overrides): Promise; + adminSetDepositNonce( + domainID: BigNumberish, + nonce: BigNumberish, + overrides?: Overrides + ): Promise; + + "adminSetDepositNonce(uint8,uint64)"( + domainID: BigNumberish, + nonce: BigNumberish, + overrides?: Overrides + ): Promise; - adminRemoveRelayer( - relayerAddress: string, + adminSetDomainId( + domainID: BigNumberish, overrides?: Overrides ): Promise; - "adminRemoveRelayer(address)"( - relayerAddress: string, + "adminSetDomainId(uint8)"( + domainID: BigNumberish, overrides?: Overrides ): Promise; - adminSetBurnable( - handlerAddress: string, - tokenAddress: string, + adminSetForwarder( + forwarder: string, + valid: boolean, overrides?: Overrides ): Promise; - "adminSetBurnable(address,address)"( - handlerAddress: string, - tokenAddress: string, + "adminSetForwarder(address,bool)"( + forwarder: string, + valid: boolean, overrides?: Overrides ): Promise; @@ -2202,6 +2443,30 @@ export class Bridge extends Contract { overrides?: Overrides ): Promise; + adminSetNative( + resourceID: BytesLike, + nativeAddress: string, + isNative: boolean, + overrides?: Overrides + ): Promise; + + "adminSetNative(bytes32,address,bool)"( + resourceID: BytesLike, + nativeAddress: string, + isNative: boolean, + overrides?: Overrides + ): Promise; + + adminSetNativeResource( + handlerAddress: string, + overrides?: Overrides + ): Promise; + + "adminSetNativeResource(address)"( + handlerAddress: string, + overrides?: Overrides + ): Promise; + adminSetResource( handlerAddress: string, resourceID: BytesLike, @@ -2220,117 +2485,125 @@ export class Bridge extends Contract { "adminUnpauseTransfers()"(overrides?: Overrides): Promise; - adminUpdateBridgeAddress( + adminWithdraw( handlerAddress: string, - newBridgeAddress: string, + data: BytesLike, overrides?: Overrides ): Promise; - "adminUpdateBridgeAddress(address,address)"( + "adminWithdraw(address,bytes)"( handlerAddress: string, - newBridgeAddress: string, + data: BytesLike, overrides?: Overrides ): Promise; - adminWithdraw( + adminWithdrawETH( handlerAddress: string, - tokenAddress: string, - recipient: string, - amountOrTokenID: BigNumberish, + data: BytesLike, overrides?: Overrides ): Promise; - "adminWithdraw(address,address,address,uint256)"( + "adminWithdrawETH(address,bytes)"( handlerAddress: string, - tokenAddress: string, - recipient: string, - amountOrTokenID: BigNumberish, + data: BytesLike, overrides?: Overrides ): Promise; + calculateFee( + destinationDomainID: BigNumberish, + resourceID: BytesLike, + depositData: BytesLike, + feeData: BytesLike, + overrides?: CallOverrides + ): Promise; + + "calculateFee(uint8,bytes32,bytes,bytes)"( + destinationDomainID: BigNumberish, + resourceID: BytesLike, + depositData: BytesLike, + feeData: BytesLike, + overrides?: CallOverrides + ): Promise; + cancelProposal( - chainID: BigNumberish, + domainID: BigNumberish, depositNonce: BigNumberish, dataHash: BytesLike, overrides?: Overrides ): Promise; "cancelProposal(uint8,uint64,bytes32)"( - chainID: BigNumberish, + domainID: BigNumberish, depositNonce: BigNumberish, dataHash: BytesLike, overrides?: Overrides ): Promise; - deposit( - destinationChainID: BigNumberish, + checkSignature( + domainID: BigNumberish, + depositNonce: BigNumberish, resourceID: BytesLike, data: BytesLike, - overrides?: PayableOverrides + signature: BytesLike, + overrides?: CallOverrides ): Promise; - "deposit(uint8,bytes32,bytes)"( - destinationChainID: BigNumberish, + "checkSignature(uint8,uint64,bytes32,bytes,bytes)"( + domainID: BigNumberish, + depositNonce: BigNumberish, resourceID: BytesLike, data: BytesLike, - overrides?: PayableOverrides + signature: BytesLike, + overrides?: CallOverrides ): Promise; - depositETH( - destinationChainID: BigNumberish, + deposit( + destinationDomainID: BigNumberish, resourceID: BytesLike, - data: BytesLike, + depositData: BytesLike, + feeData: BytesLike, overrides?: PayableOverrides ): Promise; - "depositETH(uint8,bytes32,bytes)"( - destinationChainID: BigNumberish, + "deposit(uint8,bytes32,bytes,bytes)"( + destinationDomainID: BigNumberish, resourceID: BytesLike, - data: BytesLike, + depositData: BytesLike, + feeData: BytesLike, overrides?: PayableOverrides ): Promise; executeProposal( - chainID: BigNumberish, + domainID: BigNumberish, depositNonce: BigNumberish, data: BytesLike, resourceID: BytesLike, + revertOnFail: boolean, overrides?: Overrides ): Promise; - "executeProposal(uint8,uint64,bytes,bytes32)"( - chainID: BigNumberish, + "executeProposal(uint8,uint64,bytes,bytes32,bool)"( + domainID: BigNumberish, depositNonce: BigNumberish, data: BytesLike, resourceID: BytesLike, + revertOnFail: boolean, overrides?: Overrides ): Promise; - getFee( - destinationChainID: BigNumberish, - overrides?: CallOverrides - ): Promise; - - "getFee(uint8)"( - destinationChainID: BigNumberish, - overrides?: CallOverrides - ): Promise; - - getFees(overrides?: CallOverrides): Promise; - - "getFees()"(overrides?: CallOverrides): Promise; - getProposal( - originChainID: BigNumberish, + originDomainID: BigNumberish, depositNonce: BigNumberish, - dataHash: BytesLike, + resourceID: BytesLike, + data: BytesLike, overrides?: CallOverrides ): Promise; - "getProposal(uint8,uint64,bytes32)"( - originChainID: BigNumberish, + "getProposal(uint8,uint64,bytes32,bytes)"( + originDomainID: BigNumberish, depositNonce: BigNumberish, - dataHash: BytesLike, + resourceID: BytesLike, + data: BytesLike, overrides?: CallOverrides ): Promise; @@ -2366,6 +2639,18 @@ export class Bridge extends Contract { overrides?: CallOverrides ): Promise; + getRoleMemberIndex( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + + "getRoleMemberIndex(bytes32,address)"( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + grantRole( role: BytesLike, account: string, @@ -2397,6 +2682,16 @@ export class Bridge extends Contract { overrides?: CallOverrides ): Promise; + isValidForwarder( + arg0: string, + overrides?: CallOverrides + ): Promise; + + "isValidForwarder(address)"( + arg0: string, + overrides?: CallOverrides + ): Promise; + paused(overrides?: CallOverrides): Promise; "paused()"(overrides?: CallOverrides): Promise; @@ -2445,18 +2740,36 @@ export class Bridge extends Contract { ): Promise; voteProposal( - chainID: BigNumberish, + domainID: BigNumberish, depositNonce: BigNumberish, resourceID: BytesLike, - dataHash: BytesLike, + data: BytesLike, overrides?: Overrides ): Promise; - "voteProposal(uint8,uint64,bytes32,bytes32)"( - chainID: BigNumberish, + "voteProposal(uint8,uint64,bytes32,bytes)"( + domainID: BigNumberish, depositNonce: BigNumberish, resourceID: BytesLike, - dataHash: BytesLike, + data: BytesLike, + overrides?: Overrides + ): Promise; + + voteProposals( + domainID: BigNumberish, + depositNonce: BigNumberish, + resourceID: BytesLike, + data: BytesLike, + signatures: BytesLike[], + overrides?: Overrides + ): Promise; + + "voteProposals(uint8,uint64,bytes32,bytes,bytes[])"( + domainID: BigNumberish, + depositNonce: BigNumberish, + resourceID: BytesLike, + data: BytesLike, + signatures: BytesLike[], overrides?: Overrides ): Promise; }; @@ -2470,13 +2783,23 @@ export class Bridge extends Contract { overrides?: CallOverrides ): Promise; + MAX_RELAYERS(overrides?: CallOverrides): Promise; + + "MAX_RELAYERS()"(overrides?: CallOverrides): Promise; + + PERMIT_TYPEHASH(overrides?: CallOverrides): Promise; + + "PERMIT_TYPEHASH()"( + overrides?: CallOverrides + ): Promise; + RELAYER_ROLE(overrides?: CallOverrides): Promise; "RELAYER_ROLE()"(overrides?: CallOverrides): Promise; - _chainID(overrides?: CallOverrides): Promise; + _chainId(overrides?: CallOverrides): Promise; - "_chainID()"(overrides?: CallOverrides): Promise; + "_chainId()"(overrides?: CallOverrides): Promise; _depositCounts( arg0: BigNumberish, @@ -2488,17 +2811,9 @@ export class Bridge extends Contract { overrides?: CallOverrides ): Promise; - _depositRecords( - arg0: BigNumberish, - arg1: BigNumberish, - overrides?: CallOverrides - ): Promise; + _domainID(overrides?: CallOverrides): Promise; - "_depositRecords(uint64,uint8)"( - arg0: BigNumberish, - arg1: BigNumberish, - overrides?: CallOverrides - ): Promise; + "_domainID()"(overrides?: CallOverrides): Promise; _expiry(overrides?: CallOverrides): Promise; @@ -2508,29 +2823,21 @@ export class Bridge extends Contract { "_fee()"(overrides?: CallOverrides): Promise; - _hasVotedOnProposal( - arg0: BigNumberish, - arg1: BytesLike, - arg2: string, - overrides?: CallOverrides - ): Promise; + _feeHandler(overrides?: CallOverrides): Promise; - "_hasVotedOnProposal(uint72,bytes32,address)"( - arg0: BigNumberish, - arg1: BytesLike, - arg2: string, - overrides?: CallOverrides - ): Promise; + "_feeHandler()"(overrides?: CallOverrides): Promise; - _proposals( - arg0: BigNumberish, - arg1: BytesLike, + _hasVotedOnProposal( + destNonce: BigNumberish, + dataHash: BytesLike, + relayer: string, overrides?: CallOverrides ): Promise; - "_proposals(uint72,bytes32)"( - arg0: BigNumberish, - arg1: BytesLike, + "_hasVotedOnProposal(uint72,bytes32,address)"( + destNonce: BigNumberish, + dataHash: BytesLike, + relayer: string, overrides?: CallOverrides ): Promise; @@ -2550,36 +2857,12 @@ export class Bridge extends Contract { overrides?: CallOverrides ): Promise; - _specialFee(overrides?: CallOverrides): Promise; - - "_specialFee()"(overrides?: CallOverrides): Promise; - - _specialFeeChainID( - overrides?: CallOverrides - ): Promise; - - "_specialFeeChainID()"( - overrides?: CallOverrides - ): Promise; - - _totalProposals(overrides?: CallOverrides): Promise; - - "_totalProposals()"( - overrides?: CallOverrides - ): Promise; - _totalRelayers(overrides?: CallOverrides): Promise; "_totalRelayers()"( overrides?: CallOverrides ): Promise; - _wtokenAddress(overrides?: CallOverrides): Promise; - - "_wtokenAddress()"( - overrides?: CallOverrides - ): Promise; - adminAddRelayer( relayerAddress: string, overrides?: Overrides @@ -2590,35 +2873,33 @@ export class Bridge extends Contract { overrides?: Overrides ): Promise; - adminChangeFee( - newFee: BigNumberish, + adminChangeExpiry( + expiry: BigNumberish, overrides?: Overrides ): Promise; - "adminChangeFee(uint256)"( - newFee: BigNumberish, + "adminChangeExpiry(uint256)"( + expiry: BigNumberish, overrides?: Overrides ): Promise; - adminChangeRelayerThreshold( - newThreshold: BigNumberish, + adminChangeFeeHandler( + newFeeHandler: string, overrides?: Overrides ): Promise; - "adminChangeRelayerThreshold(uint256)"( - newThreshold: BigNumberish, + "adminChangeFeeHandler(address)"( + newFeeHandler: string, overrides?: Overrides ): Promise; - adminChangeSpecialFee( - newFee: BigNumberish, - chainID: BigNumberish, + adminChangeRelayerThreshold( + newThreshold: BigNumberish, overrides?: Overrides ): Promise; - "adminChangeSpecialFee(uint256,uint8)"( - newFee: BigNumberish, - chainID: BigNumberish, + "adminChangeRelayerThreshold(uint256)"( + newThreshold: BigNumberish, overrides?: Overrides ): Promise; @@ -2650,6 +2931,40 @@ export class Bridge extends Contract { overrides?: Overrides ): Promise; + adminSetDepositNonce( + domainID: BigNumberish, + nonce: BigNumberish, + overrides?: Overrides + ): Promise; + + "adminSetDepositNonce(uint8,uint64)"( + domainID: BigNumberish, + nonce: BigNumberish, + overrides?: Overrides + ): Promise; + + adminSetDomainId( + domainID: BigNumberish, + overrides?: Overrides + ): Promise; + + "adminSetDomainId(uint8)"( + domainID: BigNumberish, + overrides?: Overrides + ): Promise; + + adminSetForwarder( + forwarder: string, + valid: boolean, + overrides?: Overrides + ): Promise; + + "adminSetForwarder(address,bool)"( + forwarder: string, + valid: boolean, + overrides?: Overrides + ): Promise; + adminSetGenericResource( handlerAddress: string, resourceID: BytesLike, @@ -2670,6 +2985,30 @@ export class Bridge extends Contract { overrides?: Overrides ): Promise; + adminSetNative( + resourceID: BytesLike, + nativeAddress: string, + isNative: boolean, + overrides?: Overrides + ): Promise; + + "adminSetNative(bytes32,address,bool)"( + resourceID: BytesLike, + nativeAddress: string, + isNative: boolean, + overrides?: Overrides + ): Promise; + + adminSetNativeResource( + handlerAddress: string, + overrides?: Overrides + ): Promise; + + "adminSetNativeResource(address)"( + handlerAddress: string, + overrides?: Overrides + ): Promise; + adminSetResource( handlerAddress: string, resourceID: BytesLike, @@ -2690,117 +3029,125 @@ export class Bridge extends Contract { overrides?: Overrides ): Promise; - adminUpdateBridgeAddress( + adminWithdraw( handlerAddress: string, - newBridgeAddress: string, + data: BytesLike, overrides?: Overrides ): Promise; - "adminUpdateBridgeAddress(address,address)"( + "adminWithdraw(address,bytes)"( handlerAddress: string, - newBridgeAddress: string, + data: BytesLike, overrides?: Overrides ): Promise; - adminWithdraw( + adminWithdrawETH( handlerAddress: string, - tokenAddress: string, - recipient: string, - amountOrTokenID: BigNumberish, + data: BytesLike, overrides?: Overrides ): Promise; - "adminWithdraw(address,address,address,uint256)"( + "adminWithdrawETH(address,bytes)"( handlerAddress: string, - tokenAddress: string, - recipient: string, - amountOrTokenID: BigNumberish, + data: BytesLike, overrides?: Overrides ): Promise; + calculateFee( + destinationDomainID: BigNumberish, + resourceID: BytesLike, + depositData: BytesLike, + feeData: BytesLike, + overrides?: CallOverrides + ): Promise; + + "calculateFee(uint8,bytes32,bytes,bytes)"( + destinationDomainID: BigNumberish, + resourceID: BytesLike, + depositData: BytesLike, + feeData: BytesLike, + overrides?: CallOverrides + ): Promise; + cancelProposal( - chainID: BigNumberish, + domainID: BigNumberish, depositNonce: BigNumberish, dataHash: BytesLike, overrides?: Overrides ): Promise; "cancelProposal(uint8,uint64,bytes32)"( - chainID: BigNumberish, + domainID: BigNumberish, depositNonce: BigNumberish, dataHash: BytesLike, overrides?: Overrides ): Promise; - deposit( - destinationChainID: BigNumberish, + checkSignature( + domainID: BigNumberish, + depositNonce: BigNumberish, resourceID: BytesLike, data: BytesLike, - overrides?: PayableOverrides + signature: BytesLike, + overrides?: CallOverrides ): Promise; - "deposit(uint8,bytes32,bytes)"( - destinationChainID: BigNumberish, + "checkSignature(uint8,uint64,bytes32,bytes,bytes)"( + domainID: BigNumberish, + depositNonce: BigNumberish, resourceID: BytesLike, data: BytesLike, - overrides?: PayableOverrides + signature: BytesLike, + overrides?: CallOverrides ): Promise; - depositETH( - destinationChainID: BigNumberish, + deposit( + destinationDomainID: BigNumberish, resourceID: BytesLike, - data: BytesLike, + depositData: BytesLike, + feeData: BytesLike, overrides?: PayableOverrides ): Promise; - "depositETH(uint8,bytes32,bytes)"( - destinationChainID: BigNumberish, + "deposit(uint8,bytes32,bytes,bytes)"( + destinationDomainID: BigNumberish, resourceID: BytesLike, - data: BytesLike, + depositData: BytesLike, + feeData: BytesLike, overrides?: PayableOverrides ): Promise; executeProposal( - chainID: BigNumberish, + domainID: BigNumberish, depositNonce: BigNumberish, data: BytesLike, resourceID: BytesLike, + revertOnFail: boolean, overrides?: Overrides ): Promise; - "executeProposal(uint8,uint64,bytes,bytes32)"( - chainID: BigNumberish, + "executeProposal(uint8,uint64,bytes,bytes32,bool)"( + domainID: BigNumberish, depositNonce: BigNumberish, data: BytesLike, resourceID: BytesLike, + revertOnFail: boolean, overrides?: Overrides ): Promise; - getFee( - destinationChainID: BigNumberish, - overrides?: CallOverrides - ): Promise; - - "getFee(uint8)"( - destinationChainID: BigNumberish, - overrides?: CallOverrides - ): Promise; - - getFees(overrides?: CallOverrides): Promise; - - "getFees()"(overrides?: CallOverrides): Promise; - getProposal( - originChainID: BigNumberish, + originDomainID: BigNumberish, depositNonce: BigNumberish, - dataHash: BytesLike, + resourceID: BytesLike, + data: BytesLike, overrides?: CallOverrides ): Promise; - "getProposal(uint8,uint64,bytes32)"( - originChainID: BigNumberish, + "getProposal(uint8,uint64,bytes32,bytes)"( + originDomainID: BigNumberish, depositNonce: BigNumberish, - dataHash: BytesLike, + resourceID: BytesLike, + data: BytesLike, overrides?: CallOverrides ): Promise; @@ -2836,6 +3183,18 @@ export class Bridge extends Contract { overrides?: CallOverrides ): Promise; + getRoleMemberIndex( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + + "getRoleMemberIndex(bytes32,address)"( + role: BytesLike, + account: string, + overrides?: CallOverrides + ): Promise; + grantRole( role: BytesLike, account: string, @@ -2870,6 +3229,16 @@ export class Bridge extends Contract { overrides?: CallOverrides ): Promise; + isValidForwarder( + arg0: string, + overrides?: CallOverrides + ): Promise; + + "isValidForwarder(address)"( + arg0: string, + overrides?: CallOverrides + ): Promise; + paused(overrides?: CallOverrides): Promise; "paused()"(overrides?: CallOverrides): Promise; @@ -2921,18 +3290,36 @@ export class Bridge extends Contract { ): Promise; voteProposal( - chainID: BigNumberish, + domainID: BigNumberish, depositNonce: BigNumberish, resourceID: BytesLike, - dataHash: BytesLike, + data: BytesLike, overrides?: Overrides ): Promise; - "voteProposal(uint8,uint64,bytes32,bytes32)"( - chainID: BigNumberish, + "voteProposal(uint8,uint64,bytes32,bytes)"( + domainID: BigNumberish, depositNonce: BigNumberish, resourceID: BytesLike, - dataHash: BytesLike, + data: BytesLike, + overrides?: Overrides + ): Promise; + + voteProposals( + domainID: BigNumberish, + depositNonce: BigNumberish, + resourceID: BytesLike, + data: BytesLike, + signatures: BytesLike[], + overrides?: Overrides + ): Promise; + + "voteProposals(uint8,uint64,bytes32,bytes,bytes[])"( + domainID: BigNumberish, + depositNonce: BigNumberish, + resourceID: BytesLike, + data: BytesLike, + signatures: BytesLike[], overrides?: Overrides ): Promise; }; diff --git a/src/Contracts/BridgeFactory.ts b/src/Contracts/BridgeFactory.ts index 5a6b0e16..33f82176 100644 --- a/src/Contracts/BridgeFactory.ts +++ b/src/Contracts/BridgeFactory.ts @@ -2,58 +2,16 @@ /* tslint:disable */ /* eslint-disable */ -import { Signer, BigNumberish } from "ethers"; -import { Provider, TransactionRequest } from "@ethersproject/providers"; -import { Contract, ContractFactory, Overrides } from "@ethersproject/contracts"; +import { Contract, Signer } from "ethers"; +import { Provider } from "@ethersproject/providers"; import type { Bridge } from "./Bridge"; -export class BridgeFactory extends ContractFactory { - constructor(signer?: Signer) { - super(_abi, _bytecode, signer); - } - - deploy( - chainID: BigNumberish, - initialRelayers: string[], - initialRelayerThreshold: BigNumberish, - fee: BigNumberish, - expiry: BigNumberish, - overrides?: Overrides - ): Promise { - return super.deploy( - chainID, - initialRelayers, - initialRelayerThreshold, - fee, - expiry, - overrides || {} - ) as Promise; - } - getDeployTransaction( - chainID: BigNumberish, - initialRelayers: string[], - initialRelayerThreshold: BigNumberish, - fee: BigNumberish, - expiry: BigNumberish, - overrides?: Overrides - ): TransactionRequest { - return super.getDeployTransaction( - chainID, - initialRelayers, - initialRelayerThreshold, - fee, - expiry, - overrides || {} - ); - } - attach(address: string): Bridge { - return super.attach(address) as Bridge; - } - connect(signer: Signer): BridgeFactory { - return super.connect(signer) as BridgeFactory; - } - static connect(address: string, signerOrProvider: Signer | Provider): Bridge { +export class BridgeFactory { + static connect( + address: string, + signerOrProvider: Signer | Provider + ): Bridge { return new Contract(address, _abi, signerOrProvider) as Bridge; } } @@ -63,7 +21,7 @@ const _abi = [ inputs: [ { internalType: "uint8", - name: "chainID", + name: "domainID", type: "uint8", }, { @@ -76,45 +34,121 @@ const _abi = [ name: "initialRelayerThreshold", type: "uint256", }, + { + internalType: "uint256", + name: "expiry", + type: "uint256", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + { + inputs: [ + { + internalType: "uint256", + name: "msgValue", + type: "uint256", + }, { internalType: "uint256", name: "fee", type: "uint256", }, + ], + name: "IncorrectFeeSupplied", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "signer", + type: "address", + }, { internalType: "uint256", - name: "expiry", + name: "index", type: "uint256", }, ], - stateMutability: "nonpayable", - type: "constructor", + name: "InviladSignature", + type: "error", + }, + { + inputs: [], + name: "ResourceIDNotMappedToHandler", + type: "error", }, { anonymous: false, inputs: [ { - indexed: true, + indexed: false, internalType: "uint8", - name: "destinationChainID", + name: "destinationDomainID", type: "uint8", }, { - indexed: true, + indexed: false, internalType: "bytes32", name: "resourceID", type: "bytes32", }, { - indexed: true, + indexed: false, internalType: "uint64", name: "depositNonce", type: "uint64", }, + { + indexed: true, + internalType: "address", + name: "user", + type: "address", + }, + { + indexed: false, + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + indexed: false, + internalType: "bytes", + name: "handlerResponse", + type: "bytes", + }, ], name: "Deposit", type: "event", }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "bytes", + name: "lowLevelData", + type: "bytes", + }, + ], + name: "FailedHandlerExecution", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "newFeeHandler", + type: "address", + }, + ], + name: "FeeHandlerChanged", + type: "event", + }, { anonymous: false, inputs: [ @@ -132,29 +166,23 @@ const _abi = [ anonymous: false, inputs: [ { - indexed: true, + indexed: false, internalType: "uint8", - name: "originChainID", + name: "originDomainID", type: "uint8", }, { - indexed: true, + indexed: false, internalType: "uint64", name: "depositNonce", type: "uint64", }, { - indexed: true, - internalType: "enum Bridge.ProposalStatus", + indexed: false, + internalType: "enum IBridge.ProposalStatus", name: "status", type: "uint8", }, - { - indexed: false, - internalType: "bytes32", - name: "resourceID", - type: "bytes32", - }, { indexed: false, internalType: "bytes32", @@ -169,27 +197,27 @@ const _abi = [ anonymous: false, inputs: [ { - indexed: true, + indexed: false, internalType: "uint8", - name: "originChainID", + name: "originDomainID", type: "uint8", }, { - indexed: true, + indexed: false, internalType: "uint64", name: "depositNonce", type: "uint64", }, { - indexed: true, - internalType: "enum Bridge.ProposalStatus", + indexed: false, + internalType: "enum IBridge.ProposalStatus", name: "status", type: "uint8", }, { indexed: false, internalType: "bytes32", - name: "resourceID", + name: "dataHash", type: "bytes32", }, ], @@ -200,7 +228,7 @@ const _abi = [ anonymous: false, inputs: [ { - indexed: true, + indexed: false, internalType: "address", name: "relayer", type: "address", @@ -213,7 +241,7 @@ const _abi = [ anonymous: false, inputs: [ { - indexed: true, + indexed: false, internalType: "address", name: "relayer", type: "address", @@ -226,7 +254,7 @@ const _abi = [ anonymous: false, inputs: [ { - indexed: true, + indexed: false, internalType: "uint256", name: "newThreshold", type: "uint256", @@ -235,31 +263,6 @@ const _abi = [ name: "RelayerThresholdChanged", type: "event", }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: "bytes32", - name: "role", - type: "bytes32", - }, - { - indexed: true, - internalType: "bytes32", - name: "previousAdminRole", - type: "bytes32", - }, - { - indexed: true, - internalType: "bytes32", - name: "newAdminRole", - type: "bytes32", - }, - ], - name: "RoleAdminChanged", - type: "event", - }, { anonymous: false, inputs: [ @@ -336,6 +339,32 @@ const _abi = [ stateMutability: "view", type: "function", }, + { + inputs: [], + name: "MAX_RELAYERS", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "PERMIT_TYPEHASH", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, { inputs: [], name: "RELAYER_ROLE", @@ -351,12 +380,12 @@ const _abi = [ }, { inputs: [], - name: "_chainID", + name: "_domainId", outputs: [ { - internalType: "uint8", + internalType: "uint256", name: "", - type: "uint8", + type: "uint256", }, ], stateMutability: "view", @@ -382,24 +411,26 @@ const _abi = [ type: "function", }, { - inputs: [ - { - internalType: "uint64", - name: "", - type: "uint64", - }, + inputs: [], + name: "_domainID", + outputs: [ { internalType: "uint8", name: "", type: "uint8", }, ], - name: "_depositRecords", + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "_expiry", outputs: [ { - internalType: "bytes", + internalType: "uint40", name: "", - type: "bytes", + type: "uint40", }, ], stateMutability: "view", @@ -407,7 +438,7 @@ const _abi = [ }, { inputs: [], - name: "_expiry", + name: "_fee", outputs: [ { internalType: "uint256", @@ -420,12 +451,12 @@ const _abi = [ }, { inputs: [], - name: "_fee", + name: "_feeHandler", outputs: [ { - internalType: "uint256", + internalType: "contract IFeeHandler", name: "", - type: "uint256", + type: "address", }, ], stateMutability: "view", @@ -435,17 +466,17 @@ const _abi = [ inputs: [ { internalType: "uint72", - name: "", + name: "destNonce", type: "uint72", }, { internalType: "bytes32", - name: "", + name: "dataHash", type: "bytes32", }, { internalType: "address", - name: "", + name: "relayer", type: "address", }, ], @@ -460,53 +491,14 @@ const _abi = [ stateMutability: "view", type: "function", }, - { - inputs: [ - { - internalType: "uint72", - name: "", - type: "uint72", - }, - { - internalType: "bytes32", - name: "", - type: "bytes32", - }, - ], - name: "_proposals", - outputs: [ - { - internalType: "bytes32", - name: "_resourceID", - type: "bytes32", - }, - { - internalType: "bytes32", - name: "_dataHash", - type: "bytes32", - }, - { - internalType: "enum Bridge.ProposalStatus", - name: "_status", - type: "uint8", - }, - { - internalType: "uint256", - name: "_proposedBlock", - type: "uint256", - }, - ], - stateMutability: "view", - type: "function", - }, { inputs: [], name: "_relayerThreshold", outputs: [ { - internalType: "uint256", + internalType: "uint8", name: "", - type: "uint256", + type: "uint8", }, ], stateMutability: "view", @@ -533,7 +525,7 @@ const _abi = [ }, { inputs: [], - name: "_specialFee", + name: "_totalRelayers", outputs: [ { internalType: "uint256", @@ -545,66 +537,60 @@ const _abi = [ type: "function", }, { - inputs: [], - name: "_specialFeeChainID", - outputs: [ - { - internalType: "uint8", - name: "", - type: "uint8", - }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [], - name: "_totalProposals", - outputs: [ + inputs: [ { - internalType: "uint256", - name: "", - type: "uint256", + internalType: "address", + name: "relayerAddress", + type: "address", }, ], - stateMutability: "view", + name: "adminAddRelayer", + outputs: [], + stateMutability: "nonpayable", type: "function", }, { - inputs: [], - name: "_totalRelayers", - outputs: [ + inputs: [ { internalType: "uint256", - name: "", + name: "expiry", type: "uint256", }, ], - stateMutability: "view", + name: "adminChangeExpiry", + outputs: [], + stateMutability: "nonpayable", type: "function", }, { - inputs: [], - name: "_wtokenAddress", - outputs: [ + inputs: [ { internalType: "address", - name: "", + name: "newFeeHandler", type: "address", }, ], - stateMutability: "view", + name: "adminChangeFeeHandler", + outputs: [], + stateMutability: "nonpayable", type: "function", }, { inputs: [ { - internalType: "address", - name: "relayerAddress", - type: "address", + internalType: "uint256", + name: "newThreshold", + type: "uint256", }, ], - name: "adminAddRelayer", + name: "adminChangeRelayerThreshold", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "adminPauseTransfers", outputs: [], stateMutability: "nonpayable", type: "function", @@ -612,12 +598,12 @@ const _abi = [ { inputs: [ { - internalType: "uint256", - name: "newFee", - type: "uint256", + internalType: "address", + name: "relayerAddress", + type: "address", }, ], - name: "adminChangeFee", + name: "adminRemoveRelayer", outputs: [], stateMutability: "nonpayable", type: "function", @@ -625,37 +611,35 @@ const _abi = [ { inputs: [ { - internalType: "uint256", - name: "newThreshold", - type: "uint256", + internalType: "address", + name: "handlerAddress", + type: "address", + }, + { + internalType: "address", + name: "tokenAddress", + type: "address", }, ], - name: "adminChangeRelayerThreshold", + name: "adminSetBurnable", outputs: [], stateMutability: "nonpayable", type: "function", }, { inputs: [ - { - internalType: "uint256", - name: "newFee", - type: "uint256", - }, { internalType: "uint8", - name: "chainID", + name: "domainID", type: "uint8", }, + { + internalType: "uint64", + name: "nonce", + type: "uint64", + }, ], - name: "adminChangeSpecialFee", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [], - name: "adminPauseTransfers", + name: "adminSetDepositNonce", outputs: [], stateMutability: "nonpayable", type: "function", @@ -663,12 +647,12 @@ const _abi = [ { inputs: [ { - internalType: "address", - name: "relayerAddress", - type: "address", + internalType: "uint8", + name: "domainID", + type: "uint8", }, ], - name: "adminRemoveRelayer", + name: "adminSetDomainId", outputs: [], stateMutability: "nonpayable", type: "function", @@ -677,16 +661,16 @@ const _abi = [ inputs: [ { internalType: "address", - name: "handlerAddress", + name: "forwarder", type: "address", }, { - internalType: "address", - name: "tokenAddress", - type: "address", + internalType: "bool", + name: "valid", + type: "bool", }, ], - name: "adminSetBurnable", + name: "adminSetForwarder", outputs: [], stateMutability: "nonpayable", type: "function", @@ -729,6 +713,42 @@ const _abi = [ stateMutability: "nonpayable", type: "function", }, + { + inputs: [ + { + internalType: "bytes32", + name: "resourceID", + type: "bytes32", + }, + { + internalType: "address", + name: "nativeAddress", + type: "address", + }, + { + internalType: "bool", + name: "isNative", + type: "bool", + }, + ], + name: "adminSetNative", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "handlerAddress", + type: "address", + }, + ], + name: "adminSetNativeResource", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, { inputs: [ { @@ -767,12 +787,12 @@ const _abi = [ type: "address", }, { - internalType: "address", - name: "newBridgeAddress", - type: "address", + internalType: "bytes", + name: "data", + type: "bytes", }, ], - name: "adminUpdateBridgeAddress", + name: "adminWithdraw", outputs: [], stateMutability: "nonpayable", type: "function", @@ -785,31 +805,55 @@ const _abi = [ type: "address", }, { - internalType: "address", - name: "tokenAddress", - type: "address", + internalType: "bytes", + name: "data", + type: "bytes", }, + ], + name: "adminWithdrawETH", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ { - internalType: "address", - name: "recipient", - type: "address", + internalType: "uint8", + name: "destinationDomainID", + type: "uint8", + }, + { + internalType: "bytes32", + name: "resourceID", + type: "bytes32", + }, + { + internalType: "bytes", + name: "depositData", + type: "bytes", }, + { + internalType: "bytes", + name: "feeData", + type: "bytes", + }, + ], + name: "calculateFee", + outputs: [ { internalType: "uint256", - name: "amountOrTokenID", + name: "", type: "uint256", }, ], - name: "adminWithdraw", - outputs: [], - stateMutability: "nonpayable", + stateMutability: "view", type: "function", }, { inputs: [ { internalType: "uint8", - name: "chainID", + name: "domainID", type: "uint8", }, { @@ -832,9 +876,14 @@ const _abi = [ inputs: [ { internalType: "uint8", - name: "destinationChainID", + name: "domainID", type: "uint8", }, + { + internalType: "uint64", + name: "depositNonce", + type: "uint64", + }, { internalType: "bytes32", name: "resourceID", @@ -845,17 +894,28 @@ const _abi = [ name: "data", type: "bytes", }, + { + internalType: "bytes", + name: "signature", + type: "bytes", + }, ], - name: "deposit", - outputs: [], - stateMutability: "payable", + name: "checkSignature", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", type: "function", }, { inputs: [ { internalType: "uint8", - name: "destinationChainID", + name: "destinationDomainID", type: "uint8", }, { @@ -865,11 +925,16 @@ const _abi = [ }, { internalType: "bytes", - name: "data", + name: "depositData", + type: "bytes", + }, + { + internalType: "bytes", + name: "feeData", type: "bytes", }, ], - name: "depositETH", + name: "deposit", outputs: [], stateMutability: "payable", type: "function", @@ -878,7 +943,7 @@ const _abi = [ inputs: [ { internalType: "uint8", - name: "chainID", + name: "domainID", type: "uint8", }, { @@ -896,6 +961,11 @@ const _abi = [ name: "resourceID", type: "bytes32", }, + { + internalType: "bool", + name: "revertOnFail", + type: "bool", + }, ], name: "executeProposal", outputs: [], @@ -906,49 +976,7 @@ const _abi = [ inputs: [ { internalType: "uint8", - name: "destinationChainID", - type: "uint8", - }, - ], - name: "getFee", - outputs: [ - { - internalType: "uint256", - name: "", - type: "uint256", - }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [], - name: "getFees", - outputs: [ - { - internalType: "uint256", - name: "", - type: "uint256", - }, - { - internalType: "uint256", - name: "", - type: "uint256", - }, - { - internalType: "uint8", - name: "", - type: "uint8", - }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [ - { - internalType: "uint8", - name: "originChainID", + name: "originDomainID", type: "uint8", }, { @@ -958,46 +986,41 @@ const _abi = [ }, { internalType: "bytes32", - name: "dataHash", + name: "resourceID", type: "bytes32", }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, ], name: "getProposal", outputs: [ { components: [ { - internalType: "bytes32", - name: "_resourceID", - type: "bytes32", - }, - { - internalType: "bytes32", - name: "_dataHash", - type: "bytes32", + internalType: "enum IBridge.ProposalStatus", + name: "_status", + type: "uint8", }, { - internalType: "address[]", + internalType: "uint200", name: "_yesVotes", - type: "address[]", - }, - { - internalType: "address[]", - name: "_noVotes", - type: "address[]", + type: "uint200", }, { - internalType: "enum Bridge.ProposalStatus", - name: "_status", + internalType: "uint8", + name: "_yesVotesTotal", type: "uint8", }, { - internalType: "uint256", + internalType: "uint40", name: "_proposedBlock", - type: "uint256", + type: "uint40", }, ], - internalType: "struct Bridge.Proposal", + internalType: "struct IBridge.Proposal", name: "", type: "tuple", }, @@ -1067,6 +1090,30 @@ const _abi = [ stateMutability: "view", type: "function", }, + { + inputs: [ + { + internalType: "bytes32", + name: "role", + type: "bytes32", + }, + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "getRoleMemberIndex", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, { inputs: [ { @@ -1128,6 +1175,25 @@ const _abi = [ stateMutability: "view", type: "function", }, + { + inputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + name: "isValidForwarder", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, { inputs: [], name: "paused", @@ -1212,7 +1278,7 @@ const _abi = [ inputs: [ { internalType: "uint8", - name: "chainID", + name: "domainID", type: "uint8", }, { @@ -1225,18 +1291,48 @@ const _abi = [ name: "resourceID", type: "bytes32", }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + ], + name: "voteProposal", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint8", + name: "domainID", + type: "uint8", + }, + { + internalType: "uint64", + name: "depositNonce", + type: "uint64", + }, { internalType: "bytes32", - name: "dataHash", + name: "resourceID", type: "bytes32", }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + internalType: "bytes[]", + name: "signatures", + type: "bytes[]", + }, ], - name: "voteProposal", + name: "voteProposals", outputs: [], stateMutability: "nonpayable", type: "function", }, ]; - -const _bytecode = - "0x60806040523480156200001157600080fd5b50604051620059f2380380620059f2833981810160405281019062000037919062000525565b60008060006101000a81548160ff02191690831515021790555084600260006101000a81548160ff021916908360ff16021790555082600381905550816006819055508060078190555060006009819055506000600a60006101000a81548160ff021916908360ff160217905550620000ba6000801b336200015860201b60201c565b620000e4604051620000cc906200066a565b60405180910390206000801b6200016e60201b60201c565b60005b84518110156200014c576200012c60405162000103906200066a565b60405180910390208683815181106200011857fe5b6020026020010151620001d260201b60201c565b6004600081548092919060010191905055508080600101915050620000e7565b505050505050620007af565b6200016a82826200026160201b60201c565b5050565b806001600084815260200190815260200160002060020154837fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff60405160405180910390a48060016000848152602001908152602001600020600201819055505050565b620002096001600084815260200190815260200160002060020154620001fd6200030560201b60201c565b6200030d60201b60201c565b6200024b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002429062000681565b60405180910390fd5b6200025d82826200026160201b60201c565b5050565b6200029081600160008581526020019081526020016000206000016200034660201b620030e01790919060201c565b156200030157620002a66200030560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600033905090565b60006200033e82600160008681526020019081526020016000206000016200037e60201b62002fe51790919060201c565b905092915050565b600062000376836000018373ffffffffffffffffffffffffffffffffffffffff1660001b620003b660201b60201c565b905092915050565b6000620003ae836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6200043060201b60201c565b905092915050565b6000620003ca83836200043060201b60201c565b620004255782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506200042a565b600090505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b600081519050620004648162000761565b92915050565b600082601f8301126200047c57600080fd5b8151620004936200048d82620006d1565b620006a3565b91508181835260208401935060208101905083856020840282011115620004b957600080fd5b60005b83811015620004ed5781620004d2888262000453565b845260208401935060208301925050600181019050620004bc565b5050505092915050565b60008151905062000508816200077b565b92915050565b6000815190506200051f8162000795565b92915050565b600080600080600060a086880312156200053e57600080fd5b60006200054e888289016200050e565b955050602086015167ffffffffffffffff8111156200056c57600080fd5b6200057a888289016200046a565b94505060406200058d88828901620004f7565b9350506060620005a088828901620004f7565b9250506080620005b388828901620004f7565b9150509295509295909350565b6000620005cf602f83620006fa565b91507f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60008301527f2061646d696e20746f206772616e7400000000000000000000000000000000006020830152604082019050919050565b600062000637600c836200070b565b91507f52454c415945525f524f4c4500000000000000000000000000000000000000006000830152600c82019050919050565b6000620006778262000628565b9150819050919050565b600060208201905081810360008301526200069c81620005c0565b9050919050565b6000604051905081810181811067ffffffffffffffff82111715620006c757600080fd5b8060405250919050565b600067ffffffffffffffff821115620006e957600080fd5b602082029050602081019050919050565b600082825260208201905092915050565b600081905092915050565b600062000723826200072a565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6200076c8162000716565b81146200077857600080fd5b50565b62000786816200074a565b81146200079257600080fd5b50565b620007a08162000754565b8114620007ac57600080fd5b50565b61523380620007bf6000396000f3fe6080604052600436106102885760003560e01c806380ae1c281161015a578063bc5b093f116100c1578063cdb0f73a1161007a578063cdb0f73a14610a08578063d547741f14610a31578063d7a9cd7914610a5a578063db8d55f114610a85578063f179637c14610ab2578063ffaac0eb14610ace57610288565b8063bc5b093f146108f6578063beab713114610921578063c5b37c221461094c578063c5ec897014610977578063ca15c873146109a2578063cb10f215146109df57610288565b8063926d7d7f11610113578063926d7d7f146107e657806395b15e98146108115780639d5773e01461083a5780639d82dd6314610865578063a217fddf1461088e578063a9cf69fa146108b957610288565b806380ae1c28146106c657806384db809f146106dd5780638c0c26311461071a5780639010d07c1461074357806391c404ac1461078057806391d14854146107a957610288565b80634e056005116101fe5780635e1fab0f116101b75780635e1fab0f146105b857806369a8c246146105e15780636a6adbfe1461060a578063780cf004146106355780637febe63f1461065e578063802aabe81461069b57610288565b80634e0560051461049357806350598719146104bc57806353ec4105146104fc578063541d5548146105275780635a1ad87c146105645780635c975abb1461058d57610288565b80632f2ff15d116102505780632f2ff15d1461037557806336568abe1461039e5780633ee7094a146103c75780634454b20d146104045780634603ae381461042d5780634b0b919d1461045657610288565b806305e2ca171461028d578063083132c4146102a957806317f03ce5146102e65780631ff013f11461030f578063248a9ca314610338575b600080fd5b6102a760048036038101906102a29190613b78565b610ae5565b005b3480156102b557600080fd5b506102d060048036038101906102cb9190613b4f565b610d70565b6040516102dd9190614e6d565b60405180910390f35b3480156102f257600080fd5b5061030d60048036038101906103089190613be4565b610da4565b005b34801561031b57600080fd5b5061033660048036038101906103319190613c33565b610f51565b005b34801561034457600080fd5b5061035f600480360381019061035a9190613982565b6116d2565b60405161036c91906148f4565b60405180910390f35b34801561038157600080fd5b5061039c600480360381019061039791906139ab565b6116f2565b005b3480156103aa57600080fd5b506103c560048036038101906103c091906139ab565b611766565b005b3480156103d357600080fd5b506103ee60048036038101906103e99190613a88565b6117e9565b6040516103fb9190614a87565b60405180910390f35b34801561041057600080fd5b5061042b60048036038101906104269190613c96565b6118a6565b005b34801561043957600080fd5b50610454600480360381019061044f91906138e4565b611be7565b005b34801561046257600080fd5b5061047d60048036038101906104789190613b4f565b611c8d565b60405161048a9190614ebf565b60405180910390f35b34801561049f57600080fd5b506104ba60048036038101906104b59190613a23565b611cb4565b005b3480156104c857600080fd5b506104e360048036038101906104de9190613ac4565b611cf3565b6040516104f394939291906149b4565b60405180910390f35b34801561050857600080fd5b50610511611d3d565b60405161051e9190614843565b60405180910390f35b34801561053357600080fd5b5061054e600480360381019061054991906136f2565b611d63565b60405161055b91906148d9565b60405180910390f35b34801561057057600080fd5b5061058b6004803603810190610586919061385b565b611d89565b005b34801561059957600080fd5b506105a2611e64565b6040516105af91906148d9565b60405180910390f35b3480156105c457600080fd5b506105df60048036038101906105da91906136f2565b611e7a565b005b3480156105ed57600080fd5b5061060860048036038101906106039190613a4c565b611e9f565b005b34801561061657600080fd5b5061061f611f6a565b60405161062c9190614e6d565b60405180910390f35b34801561064157600080fd5b5061065c600480360381019061065791906137a9565b611f70565b005b34801561066a57600080fd5b5061068560048036038101906106809190613b00565b611ff3565b60405161069291906148d9565b60405180910390f35b3480156106a757600080fd5b506106b061202f565b6040516106bd9190614e6d565b60405180910390f35b3480156106d257600080fd5b506106db612035565b005b3480156106e957600080fd5b5061070460048036038101906106ff9190613982565b612047565b6040516107119190614843565b60405180910390f35b34801561072657600080fd5b50610741600480360381019061073c919061376d565b61207a565b005b34801561074f57600080fd5b5061076a600480360381019061076591906139e7565b6120f7565b6040516107779190614843565b60405180910390f35b34801561078c57600080fd5b506107a760048036038101906107a29190613a23565b612129565b005b3480156107b557600080fd5b506107d060048036038101906107cb91906139ab565b612180565b6040516107dd91906148d9565b60405180910390f35b3480156107f257600080fd5b506107fb6121b2565b60405161080891906148f4565b60405180910390f35b34801561081d57600080fd5b506108386004803603810190610833919061376d565b6121c9565b005b34801561084657600080fd5b5061084f612246565b60405161085c9190614e6d565b60405180910390f35b34801561087157600080fd5b5061088c600480360381019061088791906136f2565b61224c565b005b34801561089a57600080fd5b506108a3612326565b6040516108b091906148f4565b60405180910390f35b3480156108c557600080fd5b506108e060048036038101906108db9190613be4565b61232d565b6040516108ed9190614e4b565b60405180910390f35b34801561090257600080fd5b5061090b61250e565b6040516109189190614eda565b60405180910390f35b34801561092d57600080fd5b50610936612521565b6040516109439190614eda565b60405180910390f35b34801561095857600080fd5b50610961612534565b60405161096e9190614e6d565b60405180910390f35b34801561098357600080fd5b5061098c61253a565b6040516109999190614e6d565b60405180910390f35b3480156109ae57600080fd5b506109c960048036038101906109c49190613982565b612540565b6040516109d69190614e6d565b60405180910390f35b3480156109eb57600080fd5b50610a066004803603810190610a01919061380c565b612567565b005b348015610a1457600080fd5b50610a2f6004803603810190610a2a91906136f2565b612639565b005b348015610a3d57600080fd5b50610a586004803603810190610a5391906139ab565b612713565b005b348015610a6657600080fd5b50610a6f612787565b604051610a7c9190614e6d565b60405180910390f35b348015610a9157600080fd5b50610a9a61278d565b604051610aa993929190614e88565b60405180910390f35b610acc6004803603810190610ac79190613b78565b6127b3565b005b348015610ada57600080fd5b50610ae3612c75565b005b610aed612c87565b6000600a60009054906101000a900460ff1660ff168560ff161415610b16576009549050610b1c565b60065490505b803414610b5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5590614beb565b60405180910390fd5b6000600c600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610c06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfd90614c6b565b60405180910390fd5b6000600b60008860ff1660ff168152602001908152602001600020600081819054906101000a900467ffffffffffffffff1660010191906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905590508484600d60008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008a60ff1660ff1681526020019081526020016000209190610caf929190613389565b5060008290508073ffffffffffffffffffffffffffffffffffffffff166338995da9888a85338b8b6040518763ffffffff1660e01b8152600401610cf896959493929190614a2b565b600060405180830381600087803b158015610d1257600080fd5b505af1158015610d26573d6000803e3d6000fd5b505050508167ffffffffffffffff16878960ff167fdbb69440df8433824a026ef190652f29929eb64b4d1d5d2a69be8afe3e6eaed860405160405180910390a45050505050505050565b6000600a60009054906101000a900460ff1660ff168260ff161415610d99576009549050610d9f565b60065490505b919050565b610dac612cd8565b60008360ff1660088467ffffffffffffffff1668ffffffffffffffffff16901b1790506000600e60008368ffffffffffffffffff1668ffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000209050600480811115610e1957fe5b8160040160009054906101000a900460ff166004811115610e3657fe5b1415610e77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6e90614c2b565b60405180910390fd5b600754610e88438360050154612d4a565b11610ec8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebf90614cab565b60405180910390fd5b60048160040160006101000a81548160ff02191690836004811115610ee957fe5b0217905550600480811115610efa57fe5b8467ffffffffffffffff168660ff167f803c5a12f6bde629cea32e63d4b92d1b560816a6fb72e939d3c89e1cab65041784600001548560010154604051610f4292919061498b565b60405180910390a45050505050565b610f59612d94565b610f61612c87565b60008460ff1660088567ffffffffffffffff1668ffffffffffffffffff16901b1790506000600e60008368ffffffffffffffffff1668ffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff16600c600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611065576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105c90614e0b565b60405180910390fd5b60018160040160009054906101000a900460ff16600481111561108457fe5b11156110c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bc90614d4b565b60405180910390fd5b600f60008368ffffffffffffffffff1668ffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561118a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118190614b8b565b60405180910390fd5b60008160040160009054906101000a900460ff1660048111156111a957fe5b14156113c957600560008154600101919050819055506040518060c0016040528085815260200184815260200160016040519080825280602002602001820160405280156112065781602001602082028036833780820191505090505b508152602001600060405190808252806020026020018201604052801561123c5781602001602082028036833780820191505090505b5081526020016001600481111561124f57fe5b815260200143815250600e60008468ffffffffffffffffff1668ffffffffffffffffff1681526020019081526020016000206000858152602001908152602001600020600082015181600001556020820151816001015560408201518160020190805190602001906112c2929190613409565b5060608201518160030190805190602001906112df929190613409565b5060808201518160040160006101000a81548160ff0219169083600481111561130457fe5b021790555060a08201518160050155905050338160020160008154811061132757fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600481111561137c57fe5b8567ffffffffffffffff168760ff167f803c5a12f6bde629cea32e63d4b92d1b560816a6fb72e939d3c89e1cab65041787876040516113bc92919061498b565b60405180910390a461150c565b6007546113da438360050154612d4a565b111561145f5760048160040160006101000a81548160ff0219169083600481111561140157fe5b021790555060048081111561141257fe5b8567ffffffffffffffff168760ff167f803c5a12f6bde629cea32e63d4b92d1b560816a6fb72e939d3c89e1cab650417878760405161145292919061498b565b60405180910390a461150b565b806001015483146114a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149c90614deb565b60405180910390fd5b80600201339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b60048081111561151857fe5b8160040160009054906101000a900460ff16600481111561153557fe5b146116ca576001600f60008468ffffffffffffffffff1668ffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508060040160009054906101000a900460ff1660048111156115e757fe5b8567ffffffffffffffff168760ff167f25f8daaa4635a7729927ba3f5b3d59cc3320aca7c32c9db4e7ca7b95743436408760405161162591906148f4565b60405180910390a460016003541115806116485750600354816002018054905010155b156116c95760028160040160006101000a81548160ff0219169083600481111561166e57fe5b02179055506002600481111561168057fe5b8567ffffffffffffffff168760ff167f803c5a12f6bde629cea32e63d4b92d1b560816a6fb72e939d3c89e1cab65041787876040516116c092919061498b565b60405180910390a45b5b505050505050565b600060016000838152602001908152602001600020600201549050919050565b6117196001600084815260200190815260200160002060020154611714612df2565b612180565b611758576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174f90614b6b565b60405180910390fd5b6117628282612dfa565b5050565b61176e612df2565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146117db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d290614e2b565b60405180910390fd5b6117e58282612e8e565b5050565b600d602052816000526040600020602052806000526040600020600091509150508054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561189e5780601f106118735761010080835404028352916020019161189e565b820191906000526020600020905b81548152906001019060200180831161188157829003601f168201915b505050505081565b6118ae612d94565b6118b6612c87565b6000600c600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008660ff1660088767ffffffffffffffff1668ffffffffffffffffff16901b179050600082868660405160200161192893929190614804565b6040516020818303038152906040528051906020012090506000600e60008468ffffffffffffffffff1668ffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002090506000600481111561198b57fe5b8160040160009054906101000a900460ff1660048111156119a857fe5b14156119e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e090614aeb565b60405180910390fd5b600260048111156119f657fe5b8160040160009054906101000a900460ff166004811115611a1357fe5b14611a53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4a90614acb565b60405180910390fd5b80600101548214611a99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9090614c0b565b60405180910390fd5b60038160040160006101000a81548160ff02191690836004811115611aba57fe5b02179055506000600c60008360000154815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663e248cff283600001548a8a6040518463ffffffff1660e01b8152600401611b3c939291906149f9565b600060405180830381600087803b158015611b5657600080fd5b505af1158015611b6a573d6000803e3d6000fd5b505050508160040160009054906101000a900460ff166004811115611b8b57fe5b8967ffffffffffffffff168b60ff167f803c5a12f6bde629cea32e63d4b92d1b560816a6fb72e939d3c89e1cab65041785600001548660010154604051611bd392919061498b565b60405180910390a450505050505050505050565b611bef612f22565b60008090505b84849050811015611c8657848482818110611c0c57fe5b9050602002016020810190611c219190613744565b73ffffffffffffffffffffffffffffffffffffffff166108fc848484818110611c4657fe5b905060200201359081150290604051600060405180830381858888f19350505050158015611c78573d6000803e3d6000fd5b508080600101915050611bf5565b5050505050565b600b6020528060005260406000206000915054906101000a900467ffffffffffffffff1681565b611cbc612f22565b80600381905550807fa20d6b84cd798a24038be305eff8a45ca82ef54a2aa2082005d8e14c0a4746c860405160405180910390a250565b600e602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060040160009054906101000a900460ff16908060050154905084565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000611d82604051611d749061482e565b604051809103902083612180565b9050919050565b611d91612f22565b85600c600087815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008690508073ffffffffffffffffffffffffffffffffffffffff1663de319d9987878787876040518663ffffffff1660e01b8152600401611e29959493929190614938565b600060405180830381600087803b158015611e4357600080fd5b505af1158015611e57573d6000803e3d6000fd5b5050505050505050505050565b60008060009054906101000a900460ff16905090565b611e82612f22565b611e8f6000801b826116f2565b611e9c6000801b33611766565b50565b611ea7612f22565b816009541415611eec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee390614c4b565b60405180910390fd5b8060ff16600a60009054906101000a900460ff1660ff161415611f44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3b90614d8b565b60405180910390fd5b8160098190555080600a60006101000a81548160ff021916908360ff1602179055505050565b60095481565b611f78612f22565b60008490508073ffffffffffffffffffffffffffffffffffffffff1663d9caed128585856040518463ffffffff1660e01b8152600401611fba93929190614879565b600060405180830381600087803b158015611fd457600080fd5b505af1158015611fe8573d6000803e3d6000fd5b505050505050505050565b600f602052826000526040600020602052816000526040600020602052806000526040600020600092509250509054906101000a900460ff1681565b60045481565b61203d612f22565b612045612f70565b565b600c6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612082612f22565b60008290508073ffffffffffffffffffffffffffffffffffffffff166307b7ed99836040518263ffffffff1660e01b81526004016120c09190614843565b600060405180830381600087803b1580156120da57600080fd5b505af11580156120ee573d6000803e3d6000fd5b50505050505050565b60006121218260016000868152602001908152602001600020600001612fcb90919063ffffffff16565b905092915050565b612131612f22565b806006541415612176576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216d90614dcb565b60405180910390fd5b8060068190555050565b60006121aa8260016000868152602001908152602001600020600001612fe590919063ffffffff16565b905092915050565b6040516121be9061482e565b604051809103902081565b6121d1612f22565b60008290508073ffffffffffffffffffffffffffffffffffffffff1663645c8a4b836040518263ffffffff1660e01b815260040161220f9190614843565b600060405180830381600087803b15801561222957600080fd5b505af115801561223d573d6000803e3d6000fd5b50505050505050565b60055481565b612254612f22565b6122716040516122639061482e565b604051809103902082612180565b6122b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a790614bcb565b60405180910390fd5b6122cd6040516122bf9061482e565b604051809103902082612713565b8073ffffffffffffffffffffffffffffffffffffffff167f10e1f7ce9fd7d1b90a66d13a2ab3cb8dd7f29f3f8d520b143b063ccfbab6906b60405160405180910390a26004600081548092919060019003919050555050565b6000801b81565b612335613493565b60008460ff1660088567ffffffffffffffff1668ffffffffffffffffff16901b179050600e60008268ffffffffffffffffff1668ffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000206040518060c001604052908160008201548152602001600182015481526020016002820180548060200260200160405190810160405280929190818152602001828054801561243657602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116123ec575b50505050508152602001600382018054806020026020016040519081016040528092919081815260200182805480156124c457602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161247a575b505050505081526020016004820160009054906101000a900460ff1660048111156124eb57fe5b60048111156124f657fe5b81526020016005820154815250509150509392505050565b600a60009054906101000a900460ff1681565b600260009054906101000a900460ff1681565b60065481565b60075481565b600061256060016000848152602001908152602001600020600001613015565b9050919050565b61256f612f22565b82600c600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008390508073ffffffffffffffffffffffffffffffffffffffff1663b8fa373684846040518363ffffffff1660e01b815260040161260192919061490f565b600060405180830381600087803b15801561261b57600080fd5b505af115801561262f573d6000803e3d6000fd5b5050505050505050565b612641612f22565b61265e6040516126509061482e565b604051809103902082612180565b1561269e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269590614d0b565b60405180910390fd5b6126bb6040516126ad9061482e565b6040518091039020826116f2565b8073ffffffffffffffffffffffffffffffffffffffff167f03580ee9f53a62b7cb409a2cb56f9be87747dd15017afc5cef6eef321e4fb2c560405160405180910390a260046000815480929190600101919050555050565b61273a6001600084815260200190815260200160002060020154612735612df2565b612180565b612779576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277090614c8b565b60405180910390fd5b6127838282612e8e565b5050565b60035481565b6000806000600654600954600a60009054906101000a900460ff16925092509250909192565b6127bb612c87565b6000600a60009054906101000a900460ff1660ff168560ff1614156127e45760095490506127ea565b60065490505b8034101561282d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282490614d2b565b60405180910390fd5b6000600c600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156128d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128cc90614c6b565b60405180910390fd5b6000823403905060006084359050818114612925576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291c90614b2b565b60405180910390fd5b60008373ffffffffffffffffffffffffffffffffffffffff166353ec41056040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561296f57600080fd5b505af1158015612983573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129a7919061371b565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612a19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1090614ceb565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0846040518263ffffffff1660e01b81526004016000604051808303818588803b158015612a6157600080fd5b505af1158015612a75573d6000803e3d6000fd5b50505050508073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85856040518363ffffffff1660e01b8152600401612ab59291906148b0565b602060405180830381600087803b158015612acf57600080fd5b505af1158015612ae3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b079190613959565b506000600b60008b60ff1660ff168152602001908152602001600020600081819054906101000a900467ffffffffffffffff1660010191906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905590508787600d60008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008d60ff1660ff1681526020019081526020016000209190612bb1929190613389565b5060008590508073ffffffffffffffffffffffffffffffffffffffff166338995da98b8d85338e8e6040518763ffffffff1660e01b8152600401612bfa96959493929190614a2b565b600060405180830381600087803b158015612c1457600080fd5b505af1158015612c28573d6000803e3d6000fd5b505050508167ffffffffffffffff168a8c60ff167fdbb69440df8433824a026ef190652f29929eb64b4d1d5d2a69be8afe3e6eaed860405160405180910390a45050505050505050505050565b612c7d612f22565b612c8561302a565b565b6000809054906101000a900460ff1615612cd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ccd90614ccb565b60405180910390fd5b565b612ce56000801b33612180565b80612d095750612d08604051612cfa9061482e565b604051809103902033612180565b5b612d48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3f90614b4b565b60405180910390fd5b565b6000612d8c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613085565b905092915050565b612db1604051612da39061482e565b604051809103902033612180565b612df0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612de790614d6b565b60405180910390fd5b565b600033905090565b612e2281600160008581526020019081526020016000206000016130e090919063ffffffff16565b15612e8a57612e2f612df2565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b612eb6816001600085815260200190815260200160002060000161311090919063ffffffff16565b15612f1e57612ec3612df2565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b612f2f6000801b33612180565b612f6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f6590614dab565b60405180910390fd5b565b612f78612c87565b60016000806101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833604051612fc1919061485e565b60405180910390a1565b6000612fda8360000183613140565b60001c905092915050565b600061300d836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6131ad565b905092915050565b6000613023826000016131d0565b9050919050565b6130326131e1565b60008060006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa3360405161307b919061485e565b60405180910390a1565b60008383111582906130cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130c49190614aa9565b60405180910390fd5b5060008385039050809150509392505050565b6000613108836000018373ffffffffffffffffffffffffffffffffffffffff1660001b613231565b905092915050565b6000613138836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6132a1565b905092915050565b60008183600001805490501161318b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161318290614b0b565b60405180910390fd5b82600001828154811061319a57fe5b9060005260206000200154905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b600081600001805490509050919050565b6000809054906101000a900460ff1661322f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161322690614bab565b60405180910390fd5b565b600061323d83836131ad565b61329657826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905061329b565b600090505b92915050565b6000808360010160008481526020019081526020016000205490506000811461337d57600060018203905060006001866000018054905003905060008660000182815481106132ec57fe5b906000526020600020015490508087600001848154811061330957fe5b906000526020600020018190555060018301876001016000838152602001908152602001600020819055508660000180548061334157fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050613383565b60009150505b92915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106133ca57803560ff19168380011785556133f8565b828001600101855582156133f8579182015b828111156133f75782358255916020019190600101906133dc565b5b50905061340591906134da565b5090565b828054828255906000526020600020908101928215613482579160200282015b828111156134815782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190613429565b5b50905061348f91906134ff565b5090565b6040518060c0016040528060008019168152602001600080191681526020016060815260200160608152602001600060048111156134cd57fe5b8152602001600081525090565b6134fc91905b808211156134f85760008160009055506001016134e0565b5090565b90565b61353f91905b8082111561353b57600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550600101613505565b5090565b90565b6000813590506135518161512e565b92915050565b6000815190506135668161512e565b92915050565b60008135905061357b81615145565b92915050565b60008083601f84011261359357600080fd5b8235905067ffffffffffffffff8111156135ac57600080fd5b6020830191508360208202830111156135c457600080fd5b9250929050565b60008083601f8401126135dd57600080fd5b8235905067ffffffffffffffff8111156135f657600080fd5b60208301915083602082028301111561360e57600080fd5b9250929050565b6000815190506136248161515c565b92915050565b60008135905061363981615173565b92915050565b60008135905061364e8161518a565b92915050565b60008083601f84011261366657600080fd5b8235905067ffffffffffffffff81111561367f57600080fd5b60208301915083600182028301111561369757600080fd5b9250929050565b6000813590506136ad816151a1565b92915050565b6000813590506136c2816151b8565b92915050565b6000813590506136d7816151cf565b92915050565b6000813590506136ec816151e6565b92915050565b60006020828403121561370457600080fd5b600061371284828501613542565b91505092915050565b60006020828403121561372d57600080fd5b600061373b84828501613557565b91505092915050565b60006020828403121561375657600080fd5b60006137648482850161356c565b91505092915050565b6000806040838503121561378057600080fd5b600061378e85828601613542565b925050602061379f85828601613542565b9150509250929050565b600080600080608085870312156137bf57600080fd5b60006137cd87828801613542565b94505060206137de87828801613542565b93505060406137ef87828801613542565b92505060606138008782880161369e565b91505092959194509250565b60008060006060848603121561382157600080fd5b600061382f86828701613542565b93505060206138408682870161362a565b925050604061385186828701613542565b9150509250925092565b60008060008060008060c0878903121561387457600080fd5b600061388289828a01613542565b965050602061389389828a0161362a565b95505060406138a489828a01613542565b94505060606138b589828a0161363f565b93505060806138c689828a0161369e565b92505060a06138d789828a0161363f565b9150509295509295509295565b600080600080604085870312156138fa57600080fd5b600085013567ffffffffffffffff81111561391457600080fd5b61392087828801613581565b9450945050602085013567ffffffffffffffff81111561393f57600080fd5b61394b878288016135cb565b925092505092959194509250565b60006020828403121561396b57600080fd5b600061397984828501613615565b91505092915050565b60006020828403121561399457600080fd5b60006139a28482850161362a565b91505092915050565b600080604083850312156139be57600080fd5b60006139cc8582860161362a565b92505060206139dd85828601613542565b9150509250929050565b600080604083850312156139fa57600080fd5b6000613a088582860161362a565b9250506020613a198582860161369e565b9150509250929050565b600060208284031215613a3557600080fd5b6000613a438482850161369e565b91505092915050565b60008060408385031215613a5f57600080fd5b6000613a6d8582860161369e565b9250506020613a7e858286016136dd565b9150509250929050565b60008060408385031215613a9b57600080fd5b6000613aa9858286016136b3565b9250506020613aba858286016136dd565b9150509250929050565b60008060408385031215613ad757600080fd5b6000613ae5858286016136c8565b9250506020613af68582860161362a565b9150509250929050565b600080600060608486031215613b1557600080fd5b6000613b23868287016136c8565b9350506020613b348682870161362a565b9250506040613b4586828701613542565b9150509250925092565b600060208284031215613b6157600080fd5b6000613b6f848285016136dd565b91505092915050565b60008060008060608587031215613b8e57600080fd5b6000613b9c878288016136dd565b9450506020613bad8782880161362a565b935050604085013567ffffffffffffffff811115613bca57600080fd5b613bd687828801613654565b925092505092959194509250565b600080600060608486031215613bf957600080fd5b6000613c07868287016136dd565b9350506020613c18868287016136b3565b9250506040613c298682870161362a565b9150509250925092565b60008060008060808587031215613c4957600080fd5b6000613c57878288016136dd565b9450506020613c68878288016136b3565b9350506040613c798782880161362a565b9250506060613c8a8782880161362a565b91505092959194509250565b600080600080600060808688031215613cae57600080fd5b6000613cbc888289016136dd565b9550506020613ccd888289016136b3565b945050604086013567ffffffffffffffff811115613cea57600080fd5b613cf688828901613654565b93509350506060613d098882890161362a565b9150509295509295909350565b6000613d228383613d3d565b60208301905092915050565b613d3781615055565b82525050565b613d4681614f7c565b82525050565b613d5581614f7c565b82525050565b613d6c613d6782614f7c565b6150df565b82525050565b6000613d7d82614f05565b613d878185614f33565b9350613d9283614ef5565b8060005b83811015613dc3578151613daa8882613d16565b9750613db583614f26565b925050600181019050613d96565b5085935050505092915050565b613dd981614fa0565b82525050565b613de881614fac565b82525050565b613df781614fac565b82525050565b613e0681614fb6565b82525050565b6000613e188385614f44565b9350613e2583858461509d565b613e2e83615103565b840190509392505050565b6000613e458385614f55565b9350613e5283858461509d565b82840190509392505050565b6000613e6982614f10565b613e738185614f44565b9350613e838185602086016150ac565b613e8c81615103565b840191505092915050565b613ea081615067565b82525050565b613eaf81615067565b82525050565b6000613ec082614f1b565b613eca8185614f60565b9350613eda8185602086016150ac565b613ee381615103565b840191505092915050565b6000613efb601c83614f60565b91507f70726f706f73616c20616c7265616479207472616e73666572726564000000006000830152602082019050919050565b6000613f3b601683614f60565b91507f70726f706f73616c206973206e6f7420616374697665000000000000000000006000830152602082019050919050565b6000613f7b602283614f60565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613fe1601d83614f60565b91507f6d73672e76616c756520616e642064617461206d69736d6174636865640000006000830152602082019050919050565b6000614021601e83614f60565b91507f73656e646572206973206e6f742072656c61796572206f722061646d696e00006000830152602082019050919050565b6000614061602f83614f60565b91507f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60008301527f2061646d696e20746f206772616e7400000000000000000000000000000000006020830152604082019050919050565b60006140c7601583614f60565b91507f72656c6179657220616c726561647920766f74656400000000000000000000006000830152602082019050919050565b6000614107601483614f60565b91507f5061757361626c653a206e6f74207061757365640000000000000000000000006000830152602082019050919050565b6000614147601f83614f60565b91507f6164647220646f65736e277420686176652072656c6179657220726f6c6521006000830152602082019050919050565b6000614187601683614f60565b91507f496e636f72726563742066656520737570706c696564000000000000000000006000830152602082019050919050565b60006141c7601b83614f60565b91507f6461746120646f65736e2774206d6174636820646174616861736800000000006000830152602082019050919050565b6000614207601a83614f60565b91507f50726f706f73616c20616c72656164792063616e63656c6c65640000000000006000830152602082019050919050565b6000614247602783614f60565b91507f43757272656e74207370656369616c2066656520697320657175616c20746f2060008301527f6e657720666565000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142ad602083614f60565b91507f7265736f757263654944206e6f74206d617070656420746f2068616e646c65726000830152602082019050919050565b60006142ed603083614f60565b91507f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60008301527f2061646d696e20746f207265766f6b65000000000000000000000000000000006020830152604082019050919050565b6000614353602083614f60565b91507f50726f706f73616c206e6f7420617420657870697279207468726573686f6c646000830152602082019050919050565b6000614393601083614f60565b91507f5061757361626c653a20706175736564000000000000000000000000000000006000830152602082019050919050565b60006143d3601483614f60565b91507f5f77746f6b656e416464726573732069732030780000000000000000000000006000830152602082019050919050565b6000614413601e83614f60565b91507f6164647220616c7265616479206861732072656c6179657220726f6c652100006000830152602082019050919050565b6000614453601983614f60565b91507f496e73756666696369656e742066656520737570706c696564000000000000006000830152602082019050919050565b6000614493602a83614f60565b91507f70726f706f73616c20616c7265616479207061737365642f657865637574656460008301527f2f63616e63656c6c6564000000000000000000000000000000000000000000006020830152604082019050919050565b60006144f9602083614f60565b91507f73656e64657220646f65736e277420686176652072656c6179657220726f6c656000830152602082019050919050565b6000614539603183614f60565b91507f43757272656e74207370656369616c466565436861696e49442069732065717560008301527f616c20746f206e657720636861696e49440000000000000000000000000000006020830152604082019050919050565b600061459f601e83614f60565b91507f73656e64657220646f65736e277420686176652061646d696e20726f6c6500006000830152602082019050919050565b60006145df601f83614f60565b91507f43757272656e742066656520697320657175616c20746f206e657720666565006000830152602082019050919050565b600061461f600c83614f71565b91507f52454c415945525f524f4c4500000000000000000000000000000000000000006000830152600c82019050919050565b600061465f601183614f60565b91507f6461746168617368206d69736d617463680000000000000000000000000000006000830152602082019050919050565b600061469f601983614f60565b91507f6e6f2068616e646c657220666f72207265736f757263654944000000000000006000830152602082019050919050565b60006146df602f83614f60565b91507f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008301527f20726f6c657320666f722073656c6600000000000000000000000000000000006020830152604082019050919050565b600060c0830160008301516147506000860182613ddf565b5060208301516147636020860182613ddf565b506040830151848203604086015261477b8282613d72565b915050606083015184820360608601526147958282613d72565b91505060808301516147aa6080860182613e97565b5060a08301516147bd60a08601826147c8565b508091505092915050565b6147d181615015565b82525050565b6147e081615015565b82525050565b6147ef8161501f565b82525050565b6147fe81615048565b82525050565b60006148108286613d5b565b601482019150614821828486613e39565b9150819050949350505050565b600061483982614612565b9150819050919050565b60006020820190506148586000830184613d4c565b92915050565b60006020820190506148736000830184613d2e565b92915050565b600060608201905061488e6000830186613d4c565b61489b6020830185613d4c565b6148a860408301846147d7565b949350505050565b60006040820190506148c56000830185613d4c565b6148d260208301846147d7565b9392505050565b60006020820190506148ee6000830184613dd0565b92915050565b60006020820190506149096000830184613dee565b92915050565b60006040820190506149246000830185613dee565b6149316020830184613d4c565b9392505050565b600060a08201905061494d6000830188613dee565b61495a6020830187613d4c565b6149676040830186613dfd565b61497460608301856147d7565b6149816080830184613dfd565b9695505050505050565b60006040820190506149a06000830185613dee565b6149ad6020830184613dee565b9392505050565b60006080820190506149c96000830187613dee565b6149d66020830186613dee565b6149e36040830185613ea6565b6149f060608301846147d7565b95945050505050565b6000604082019050614a0e6000830186613dee565b8181036020830152614a21818486613e0c565b9050949350505050565b600060a082019050614a406000830189613dee565b614a4d60208301886147f5565b614a5a60408301876147e6565b614a676060830186613d2e565b8181036080830152614a7a818486613e0c565b9050979650505050505050565b60006020820190508181036000830152614aa18184613e5e565b905092915050565b60006020820190508181036000830152614ac38184613eb5565b905092915050565b60006020820190508181036000830152614ae481613eee565b9050919050565b60006020820190508181036000830152614b0481613f2e565b9050919050565b60006020820190508181036000830152614b2481613f6e565b9050919050565b60006020820190508181036000830152614b4481613fd4565b9050919050565b60006020820190508181036000830152614b6481614014565b9050919050565b60006020820190508181036000830152614b8481614054565b9050919050565b60006020820190508181036000830152614ba4816140ba565b9050919050565b60006020820190508181036000830152614bc4816140fa565b9050919050565b60006020820190508181036000830152614be48161413a565b9050919050565b60006020820190508181036000830152614c048161417a565b9050919050565b60006020820190508181036000830152614c24816141ba565b9050919050565b60006020820190508181036000830152614c44816141fa565b9050919050565b60006020820190508181036000830152614c648161423a565b9050919050565b60006020820190508181036000830152614c84816142a0565b9050919050565b60006020820190508181036000830152614ca4816142e0565b9050919050565b60006020820190508181036000830152614cc481614346565b9050919050565b60006020820190508181036000830152614ce481614386565b9050919050565b60006020820190508181036000830152614d04816143c6565b9050919050565b60006020820190508181036000830152614d2481614406565b9050919050565b60006020820190508181036000830152614d4481614446565b9050919050565b60006020820190508181036000830152614d6481614486565b9050919050565b60006020820190508181036000830152614d84816144ec565b9050919050565b60006020820190508181036000830152614da48161452c565b9050919050565b60006020820190508181036000830152614dc481614592565b9050919050565b60006020820190508181036000830152614de4816145d2565b9050919050565b60006020820190508181036000830152614e0481614652565b9050919050565b60006020820190508181036000830152614e2481614692565b9050919050565b60006020820190508181036000830152614e44816146d2565b9050919050565b60006020820190508181036000830152614e658184614738565b905092915050565b6000602082019050614e8260008301846147d7565b92915050565b6000606082019050614e9d60008301866147d7565b614eaa60208301856147d7565b614eb760408301846147f5565b949350505050565b6000602082019050614ed460008301846147e6565b92915050565b6000602082019050614eef60008301846147f5565b92915050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614f8782614ff5565b9050919050565b6000614f9982614ff5565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000819050614ff082615121565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b600068ffffffffffffffffff82169050919050565b600060ff82169050919050565b600061506082615079565b9050919050565b600061507282614fe2565b9050919050565b60006150848261508b565b9050919050565b600061509682614ff5565b9050919050565b82818337600083830152505050565b60005b838110156150ca5780820151818401526020810190506150af565b838111156150d9576000848401525b50505050565b60006150ea826150f1565b9050919050565b60006150fc82615114565b9050919050565b6000601f19601f8301169050919050565b60008160601b9050919050565b6005811061512b57fe5b50565b61513781614f7c565b811461514257600080fd5b50565b61514e81614f8e565b811461515957600080fd5b50565b61516581614fa0565b811461517057600080fd5b50565b61517c81614fac565b811461518757600080fd5b50565b61519381614fb6565b811461519e57600080fd5b50565b6151aa81615015565b81146151b557600080fd5b50565b6151c18161501f565b81146151cc57600080fd5b50565b6151d881615033565b81146151e357600080fd5b50565b6151ef81615048565b81146151fa57600080fd5b5056fea2646970667358221220369810edc3f330ad2d2fe0dcdb1122fd8ceda793c93711cfbf843d46149a30a264736f6c63430006040033"; diff --git a/src/chainbridgeConfig.ts b/src/chainbridgeConfig.ts index f514c939..1905a111 100644 --- a/src/chainbridgeConfig.ts +++ b/src/chainbridgeConfig.ts @@ -32,13 +32,14 @@ export type ChainbridgeConfig = { chains: BridgeConfig[]; }; +// mainnet export const chainbridgeConfig: ChainbridgeConfig = { chains: [ { chainId: 1, networkId: 1, name: "Ethereum", - bridgeAddress: "0xb61b5aca15193ecb719433d0e5c066f9980e1e83", + bridgeAddress: "0xa2A22B46B8df38cd7C55E6bf32Ea5a32637Cf2b1", genericHandlerAddress: "0x517828d2549cEC09386f89a67E92825E26740240", controller: "0x1B228a749077b8e307C5856cE62Ef35d96Dca2ea", approvalContract: "0x805c7Ecba41f9321bb098ec1cf31d86d9407de2F", @@ -61,7 +62,7 @@ export const chainbridgeConfig: ChainbridgeConfig = { chainId: 4, networkId: 56, name: "BSC", - bridgeAddress: "0x0316f3A2f01bf3934f10F24217a0F802Eac3FBD7", + bridgeAddress: "0xFd55eBc7bBde603A048648C6eAb8775c997C1001", genericHandlerAddress: "0x83Fc24eB56121FA2A05e0b5170E7310738425839", controller: "0x17F084dFF8a71e38521BCBD3Da871753Dc67aa81", approvalContract: "0x17F084dFF8a71e38521BCBD3Da871753Dc67aa81", @@ -83,7 +84,7 @@ export const chainbridgeConfig: ChainbridgeConfig = { chainId: 2, networkId: 43114, name: "AVAX", - bridgeAddress: "0x6154a8611fb02f250eA3FA0C8C8a8CB56931eBf2", + bridgeAddress: "0xF41e7FC4eC990298d36f667B93951c9dba65224e", genericHandlerAddress: "0x123455360bE78C9289B38bcb4DbA427D9a6cD440", controller: "0x24232ccAf8bB87908C419aD7dDCca8cc9e74746d", approvalContract: "0x24232ccAf8bB87908C419aD7dDCca8cc9e74746d", @@ -106,7 +107,7 @@ export const chainbridgeConfig: ChainbridgeConfig = { chainId: 3, networkId: 82, name: "MTR", - bridgeAddress: "0x411b6aef79d44CEa36979Ca1525831C8DE37Da90", + bridgeAddress: "0x3f396Af107049232Bc2804C171ecad65DBCC0323", genericHandlerAddress: "0x89CA53Bf11d24D32A7aC3aDb7750868360c90590", controller: "0x5353C43b3aF8E9F9c044B55Ea2c139aC977E0F19", approvalContract: "0x5353C43b3aF8E9F9c044B55Ea2c139aC977E0F19", @@ -126,3 +127,54 @@ export const chainbridgeConfig: ChainbridgeConfig = { }, ], }; + +// testnet +// export const chainbridgeConfig: ChainbridgeConfig = { +// chains: [ +// { +// chainId: 1, +// networkId: 5, +// name: "Goeril", +// bridgeAddress: "0xBd2949F67DcdC549c6Ebe98696449Fa79D988A9F", +// genericHandlerAddress: "0xa023E6f6B4862EA38cbe45e377abD908abAb2f82", +// controller: "0xE5D1351801aE21BA9A4d4880b58ce72F60b31546", +// approvalContract: "0x7b939c0BC023bdffA520791A30628FCabE6164Ae", +// rpcUrl: +// "https://eth-goerli.alchemyapi.io/v2/x2jT9wfMVj9S3IjBoniQXNAF14Yaktg6", +// type: "Ethereum", +// blockExplorer: "https://goerli.etherscan.io/tx", +// nativeTokenSymbol: "GETH", +// deployedBlockNumber: 7554032, +// tokens: [ +// { +// address: "0x28C07523b22ADb47424A835a124C1A31236FFfE4", +// imageUri: AMPLIcon, +// resourceId: +// "0x1f3eb8ee12ce38ffa19fc4c635621ad2c9a0bd609def9ddce77680e33bc2224b", +// }, +// ], +// }, +// { +// chainId: 3, +// networkId: 83, +// name: "Meter Testnet", +// bridgeAddress: "0xCf6ba7Eb4962e559f45CF61be1a1dB72872e3306", +// genericHandlerAddress: "0xCD9211E3057313da2682F63d3410Bf231B38d769", +// controller: "0x122ef99672eFD49123Ce54cE1Ca902fC3125678f", +// approvalContract: "0x122ef99672eFD49123Ce54cE1Ca902fC3125678f", +// rpcUrl: "https://rpctest.meter.io", +// type: "Ethereum", +// blockExplorer: "https://scan-warringstakes.meter.io/", +// nativeTokenSymbol: "TMTR", +// deployedBlockNumber: 19726633, +// tokens: [ +// { +// address: "0xEc133791822D441d2CA58A51D4b53cC23b2e7B73", +// imageUri: AMPLIcon, +// resourceId: +// "0x1f3eb8ee12ce38ffa19fc4c635621ad2c9a0bd609def9ddce77680e33bc2224b", +// }, +// ], +// }, +// ], +// }; From b84160c19e93cc7f159391c9372000c5999e67a6 Mon Sep 17 00:00:00 2001 From: aalavandhan1984 <6264334+aalavandhan@users.noreply.github.com> Date: Wed, 5 Oct 2022 13:11:18 -0400 Subject: [PATCH 11/12] v2 addresses --- src/chainbridgeConfig.ts | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/chainbridgeConfig.ts b/src/chainbridgeConfig.ts index 1905a111..bb8dc38c 100644 --- a/src/chainbridgeConfig.ts +++ b/src/chainbridgeConfig.ts @@ -39,8 +39,8 @@ export const chainbridgeConfig: ChainbridgeConfig = { chainId: 1, networkId: 1, name: "Ethereum", - bridgeAddress: "0xa2A22B46B8df38cd7C55E6bf32Ea5a32637Cf2b1", - genericHandlerAddress: "0x517828d2549cEC09386f89a67E92825E26740240", + bridgeAddress: "0xa7E2cE557980618253D9dafdEDb27ecCe2F82167", + genericHandlerAddress: "0x5945432d6c0A4b30c1178888F776a4d430d5BC94", controller: "0x1B228a749077b8e307C5856cE62Ef35d96Dca2ea", approvalContract: "0x805c7Ecba41f9321bb098ec1cf31d86d9407de2F", rpcUrl: @@ -48,7 +48,7 @@ export const chainbridgeConfig: ChainbridgeConfig = { type: "Ethereum", blockExplorer: "https://etherscan.io/tx", nativeTokenSymbol: "ETH", - deployedBlockNumber: 12345342, + deployedBlockNumber: 15648033, tokens: [ { address: "0xD46bA6D942050d489DBd938a2C909A5d5039A161", @@ -62,15 +62,15 @@ export const chainbridgeConfig: ChainbridgeConfig = { chainId: 4, networkId: 56, name: "BSC", - bridgeAddress: "0xFd55eBc7bBde603A048648C6eAb8775c997C1001", - genericHandlerAddress: "0x83Fc24eB56121FA2A05e0b5170E7310738425839", + bridgeAddress: "0x8209815136b35F21B8C0f5AA2E2f915a73530dF9", + genericHandlerAddress: "0x431a7Bb43b6242225Ceb97Bde140219b4d043116", controller: "0x17F084dFF8a71e38521BCBD3Da871753Dc67aa81", approvalContract: "0x17F084dFF8a71e38521BCBD3Da871753Dc67aa81", rpcUrl: "https://bsc-dataseed.binance.org/", type: "Ethereum", blockExplorer: "https://bscscan.com/tx", nativeTokenSymbol: "BNB", - deployedBlockNumber: 7028782, + deployedBlockNumber: 21787431, tokens: [ { address: "0xDB021b1B247fe2F1fa57e0A87C748Cc1E321F07F", @@ -84,15 +84,15 @@ export const chainbridgeConfig: ChainbridgeConfig = { chainId: 2, networkId: 43114, name: "AVAX", - bridgeAddress: "0xF41e7FC4eC990298d36f667B93951c9dba65224e", - genericHandlerAddress: "0x123455360bE78C9289B38bcb4DbA427D9a6cD440", + bridgeAddress: "0xB447acD21831F6615e208c9EEa7E6049dB3391Cd", + genericHandlerAddress: "0x0B9709FE3aa76068f07d054fd4417445D5c7DA9A", controller: "0x24232ccAf8bB87908C419aD7dDCca8cc9e74746d", approvalContract: "0x24232ccAf8bB87908C419aD7dDCca8cc9e74746d", rpcUrl: "https://api.avax.network/ext/bc/C/rpc", type: "Ethereum", blockExplorer: "https://snowtrace.io/tx", nativeTokenSymbol: "AVAX", - deployedBlockNumber: 4754446, + deployedBlockNumber: 20477952, defaultGasPrice: 20, tokens: [ { @@ -107,15 +107,15 @@ export const chainbridgeConfig: ChainbridgeConfig = { chainId: 3, networkId: 82, name: "MTR", - bridgeAddress: "0x3f396Af107049232Bc2804C171ecad65DBCC0323", - genericHandlerAddress: "0x89CA53Bf11d24D32A7aC3aDb7750868360c90590", + bridgeAddress: "0x23894d2937A2a4A479f0407909DA5B028049568E", + genericHandlerAddress: "0x701627e8638c452732eceCC7d0238746654fb365", controller: "0x5353C43b3aF8E9F9c044B55Ea2c139aC977E0F19", approvalContract: "0x5353C43b3aF8E9F9c044B55Ea2c139aC977E0F19", rpcUrl: "https://rpc.meter.io", type: "Ethereum", blockExplorer: "https://scan.meter.io/tx", nativeTokenSymbol: "MTR", - deployedBlockNumber: 14654758, + deployedBlockNumber: 28698530, tokens: [ { address: "0x1cf09D1B5Da9d9d24365D87B932A7c4bD018A419", @@ -135,8 +135,8 @@ export const chainbridgeConfig: ChainbridgeConfig = { // chainId: 1, // networkId: 5, // name: "Goeril", -// bridgeAddress: "0xBd2949F67DcdC549c6Ebe98696449Fa79D988A9F", -// genericHandlerAddress: "0xa023E6f6B4862EA38cbe45e377abD908abAb2f82", +// bridgeAddress: "0x2Ff19376B6F27A03B621b5c018f852BFAa416835", +// genericHandlerAddress: "0xEe373E583e313B0bd9d7dc6DEc694dc074212e86", // controller: "0xE5D1351801aE21BA9A4d4880b58ce72F60b31546", // approvalContract: "0x7b939c0BC023bdffA520791A30628FCabE6164Ae", // rpcUrl: @@ -158,8 +158,8 @@ export const chainbridgeConfig: ChainbridgeConfig = { // chainId: 3, // networkId: 83, // name: "Meter Testnet", -// bridgeAddress: "0xCf6ba7Eb4962e559f45CF61be1a1dB72872e3306", -// genericHandlerAddress: "0xCD9211E3057313da2682F63d3410Bf231B38d769", +// bridgeAddress: "0xcE785E92bc448de7c58D3f7D74F2BDcEd9Cc7c49", +// genericHandlerAddress: "0x64BBA8492a0CfaB65a954860Cf1D99b28eD2D418", // controller: "0x122ef99672eFD49123Ce54cE1Ca902fC3125678f", // approvalContract: "0x122ef99672eFD49123Ce54cE1Ca902fC3125678f", // rpcUrl: "https://rpctest.meter.io", From 97ee028b0bac974b0dfd3447b3532f22d29222ef Mon Sep 17 00:00:00 2001 From: aalavandhan1984 <6264334+aalavandhan@users.noreply.github.com> Date: Fri, 7 Oct 2022 21:59:53 -0400 Subject: [PATCH 12/12] updated fee logic --- src/Contexts/ChainbridgeContext.tsx | 22 +- src/Contracts/Bridge.d.ts | 1293 +++++++++++++++++---------- src/Contracts/BridgeFactory.ts | 287 ++++-- 3 files changed, 1008 insertions(+), 594 deletions(-) diff --git a/src/Contexts/ChainbridgeContext.tsx b/src/Contexts/ChainbridgeContext.tsx index 6c4ffe8b..1a62781b 100644 --- a/src/Contexts/ChainbridgeContext.tsx +++ b/src/Contexts/ChainbridgeContext.tsx @@ -202,7 +202,6 @@ const ChainbridgeProvider = ({ children }: IChainbridgeContextProps) => { const destChain = chainbridgeConfig.chains.find( (c) => c.networkId !== network ); - destChain && setDestinationChain(destChain); } @@ -236,24 +235,13 @@ const ChainbridgeProvider = ({ children }: IChainbridgeContextProps) => { } }; const getBridgeFee = async () => { - if (homeBridge && destinationBridge && homeChain && selectedToken) { + if (homeBridge && destinationBridge && homeChain) { const targetDomainID = await destinationBridge._domainID(); - const token = homeChain.tokens.find( - (token) => token.address === selectedToken + const fee = await homeBridge.getFee( + targetDomainID ); - if(token) { - // NOTE: The v2 chainbridge contracts allow dynamic fees based on payload - // this is not being used by meter passport currently so we - // do not need to create the packed data for calculating the bridge fees. - const fee = await homeBridge.calculateFee( - targetDomainID, - token.resourceId, - "", - "" - ); - const bridgeFee = Number(utils.formatEther(fee)); - setBridgeFee(bridgeFee); - } + const bridgeFee = Number(utils.formatEther(fee)); + setBridgeFee(bridgeFee); } }; getRelayerThreshold(); diff --git a/src/Contracts/Bridge.d.ts b/src/Contracts/Bridge.d.ts index b55c35c5..d8f97e43 100644 --- a/src/Contracts/Bridge.d.ts +++ b/src/Contracts/Bridge.d.ts @@ -9,14 +9,12 @@ import { BigNumber, BigNumberish, PopulatedTransaction, -} from "ethers"; -import { Contract, ContractTransaction, Overrides, PayableOverrides, CallOverrides, -} from "@ethersproject/contracts"; +} from "ethers"; import { BytesLike } from "@ethersproject/bytes"; import { Listener, Provider } from "@ethersproject/providers"; import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; @@ -34,32 +32,36 @@ interface BridgeInterface extends ethers.utils.Interface { "_expiry()": FunctionFragment; "_fee()": FunctionFragment; "_feeHandler()": FunctionFragment; + "_feeReserve()": FunctionFragment; + "_fee_()": FunctionFragment; "_hasVotedOnProposal(uint72,bytes32,address)": FunctionFragment; "_relayerThreshold()": FunctionFragment; "_resourceIDToHandlerAddress(bytes32)": FunctionFragment; "_totalRelayers()": FunctionFragment; "adminAddRelayer(address)": FunctionFragment; "adminChangeExpiry(uint256)": FunctionFragment; - "adminChangeFeeHandler(address)": FunctionFragment; "adminChangeRelayerThreshold(uint256)": FunctionFragment; "adminPauseTransfers()": FunctionFragment; + "adminRemoveGenericResource(bytes32,address)": FunctionFragment; "adminRemoveRelayer(address)": FunctionFragment; + "adminRemoveResourceId(bytes32,address,bool)": FunctionFragment; + "adminRemoveSpecialFee(uint8)": FunctionFragment; "adminSetBurnable(address,address)": FunctionFragment; "adminSetDepositNonce(uint8,uint64)": FunctionFragment; "adminSetDomainId(uint8)": FunctionFragment; + "adminSetFee(uint256)": FunctionFragment; "adminSetForwarder(address,bool)": FunctionFragment; "adminSetGenericResource(address,bytes32,address,bytes4,uint256,bytes4)": FunctionFragment; - "adminSetNative(bytes32,address,bool)": FunctionFragment; - "adminSetNativeResource(address)": FunctionFragment; - "adminSetResource(address,bytes32,address)": FunctionFragment; + "adminSetResource(address,bytes32,address,bool)": FunctionFragment; + "adminSetSpecialFee(uint8,uint256)": FunctionFragment; "adminUnpauseTransfers()": FunctionFragment; "adminWithdraw(address,bytes)": FunctionFragment; "adminWithdrawETH(address,bytes)": FunctionFragment; - "calculateFee(uint8,bytes32,bytes,bytes)": FunctionFragment; "cancelProposal(uint8,uint64,bytes32)": FunctionFragment; "checkSignature(uint8,uint64,bytes32,bytes,bytes)": FunctionFragment; "deposit(uint8,bytes32,bytes,bytes)": FunctionFragment; "executeProposal(uint8,uint64,bytes,bytes32,bool)": FunctionFragment; + "getFee(uint8)": FunctionFragment; "getProposal(uint8,uint64,bytes32,bytes)": FunctionFragment; "getRoleAdmin(bytes32)": FunctionFragment; "getRoleMember(bytes32,uint256)": FunctionFragment; @@ -73,7 +75,9 @@ interface BridgeInterface extends ethers.utils.Interface { "renounceAdmin(address)": FunctionFragment; "renounceRole(bytes32,address)": FunctionFragment; "revokeRole(bytes32,address)": FunctionFragment; - "transferFunds(address[],uint256[])": FunctionFragment; + "special(uint8)": FunctionFragment; + "specialFee(uint8)": FunctionFragment; + "transferFee(address[],uint256[])": FunctionFragment; "voteProposal(uint8,uint64,bytes32,bytes)": FunctionFragment; "voteProposals(uint8,uint64,bytes32,bytes,bytes[])": FunctionFragment; }; @@ -106,6 +110,11 @@ interface BridgeInterface extends ethers.utils.Interface { functionFragment: "_feeHandler", values?: undefined ): string; + encodeFunctionData( + functionFragment: "_feeReserve", + values?: undefined + ): string; + encodeFunctionData(functionFragment: "_fee_", values?: undefined): string; encodeFunctionData( functionFragment: "_hasVotedOnProposal", values: [BigNumberish, BytesLike, string] @@ -130,10 +139,6 @@ interface BridgeInterface extends ethers.utils.Interface { functionFragment: "adminChangeExpiry", values: [BigNumberish] ): string; - encodeFunctionData( - functionFragment: "adminChangeFeeHandler", - values: [string] - ): string; encodeFunctionData( functionFragment: "adminChangeRelayerThreshold", values: [BigNumberish] @@ -142,10 +147,22 @@ interface BridgeInterface extends ethers.utils.Interface { functionFragment: "adminPauseTransfers", values?: undefined ): string; + encodeFunctionData( + functionFragment: "adminRemoveGenericResource", + values: [BytesLike, string] + ): string; encodeFunctionData( functionFragment: "adminRemoveRelayer", values: [string] ): string; + encodeFunctionData( + functionFragment: "adminRemoveResourceId", + values: [BytesLike, string, boolean] + ): string; + encodeFunctionData( + functionFragment: "adminRemoveSpecialFee", + values: [BigNumberish] + ): string; encodeFunctionData( functionFragment: "adminSetBurnable", values: [string, string] @@ -158,6 +175,10 @@ interface BridgeInterface extends ethers.utils.Interface { functionFragment: "adminSetDomainId", values: [BigNumberish] ): string; + encodeFunctionData( + functionFragment: "adminSetFee", + values: [BigNumberish] + ): string; encodeFunctionData( functionFragment: "adminSetForwarder", values: [string, boolean] @@ -167,16 +188,12 @@ interface BridgeInterface extends ethers.utils.Interface { values: [string, BytesLike, string, BytesLike, BigNumberish, BytesLike] ): string; encodeFunctionData( - functionFragment: "adminSetNative", - values: [BytesLike, string, boolean] - ): string; - encodeFunctionData( - functionFragment: "adminSetNativeResource", - values: [string] + functionFragment: "adminSetResource", + values: [string, BytesLike, string, boolean] ): string; encodeFunctionData( - functionFragment: "adminSetResource", - values: [string, BytesLike, string] + functionFragment: "adminSetSpecialFee", + values: [BigNumberish, BigNumberish] ): string; encodeFunctionData( functionFragment: "adminUnpauseTransfers", @@ -190,10 +207,6 @@ interface BridgeInterface extends ethers.utils.Interface { functionFragment: "adminWithdrawETH", values: [string, BytesLike] ): string; - encodeFunctionData( - functionFragment: "calculateFee", - values: [BigNumberish, BytesLike, BytesLike, BytesLike] - ): string; encodeFunctionData( functionFragment: "cancelProposal", values: [BigNumberish, BigNumberish, BytesLike] @@ -210,6 +223,10 @@ interface BridgeInterface extends ethers.utils.Interface { functionFragment: "executeProposal", values: [BigNumberish, BigNumberish, BytesLike, BytesLike, boolean] ): string; + encodeFunctionData( + functionFragment: "getFee", + values: [BigNumberish] + ): string; encodeFunctionData( functionFragment: "getProposal", values: [BigNumberish, BigNumberish, BytesLike, BytesLike] @@ -257,7 +274,15 @@ interface BridgeInterface extends ethers.utils.Interface { values: [BytesLike, string] ): string; encodeFunctionData( - functionFragment: "transferFunds", + functionFragment: "special", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "specialFee", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "transferFee", values: [string[], BigNumberish[]] ): string; encodeFunctionData( @@ -297,6 +322,11 @@ interface BridgeInterface extends ethers.utils.Interface { functionFragment: "_feeHandler", data: BytesLike ): Result; + decodeFunctionResult( + functionFragment: "_feeReserve", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "_fee_", data: BytesLike): Result; decodeFunctionResult( functionFragment: "_hasVotedOnProposal", data: BytesLike @@ -322,21 +352,29 @@ interface BridgeInterface extends ethers.utils.Interface { data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "adminChangeFeeHandler", + functionFragment: "adminChangeRelayerThreshold", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "adminChangeRelayerThreshold", + functionFragment: "adminPauseTransfers", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "adminPauseTransfers", + functionFragment: "adminRemoveGenericResource", data: BytesLike ): Result; decodeFunctionResult( functionFragment: "adminRemoveRelayer", data: BytesLike ): Result; + decodeFunctionResult( + functionFragment: "adminRemoveResourceId", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "adminRemoveSpecialFee", + data: BytesLike + ): Result; decodeFunctionResult( functionFragment: "adminSetBurnable", data: BytesLike @@ -350,23 +388,23 @@ interface BridgeInterface extends ethers.utils.Interface { data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "adminSetForwarder", + functionFragment: "adminSetFee", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "adminSetGenericResource", + functionFragment: "adminSetForwarder", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "adminSetNative", + functionFragment: "adminSetGenericResource", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "adminSetNativeResource", + functionFragment: "adminSetResource", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "adminSetResource", + functionFragment: "adminSetSpecialFee", data: BytesLike ): Result; decodeFunctionResult( @@ -381,10 +419,6 @@ interface BridgeInterface extends ethers.utils.Interface { functionFragment: "adminWithdrawETH", data: BytesLike ): Result; - decodeFunctionResult( - functionFragment: "calculateFee", - data: BytesLike - ): Result; decodeFunctionResult( functionFragment: "cancelProposal", data: BytesLike @@ -398,6 +432,7 @@ interface BridgeInterface extends ethers.utils.Interface { functionFragment: "executeProposal", data: BytesLike ): Result; + decodeFunctionResult(functionFragment: "getFee", data: BytesLike): Result; decodeFunctionResult( functionFragment: "getProposal", data: BytesLike @@ -435,8 +470,10 @@ interface BridgeInterface extends ethers.utils.Interface { data: BytesLike ): Result; decodeFunctionResult(functionFragment: "revokeRole", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "special", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "specialFee", data: BytesLike): Result; decodeFunctionResult( - functionFragment: "transferFunds", + functionFragment: "transferFee", data: BytesLike ): Result; decodeFunctionResult( @@ -451,6 +488,8 @@ interface BridgeInterface extends ethers.utils.Interface { events: { "Deposit(uint8,bytes32,uint64,address,bytes,bytes)": EventFragment; "FailedHandlerExecution(bytes)": EventFragment; + "FeeChanged(uint256)": EventFragment; + "FeeDistributed(address,address,uint256)": EventFragment; "FeeHandlerChanged(address)": EventFragment; "Paused(address)": EventFragment; "ProposalEvent(uint8,uint64,uint8,bytes32)": EventFragment; @@ -465,6 +504,8 @@ interface BridgeInterface extends ethers.utils.Interface { getEvent(nameOrSignatureOrTopic: "Deposit"): EventFragment; getEvent(nameOrSignatureOrTopic: "FailedHandlerExecution"): EventFragment; + getEvent(nameOrSignatureOrTopic: "FeeChanged"): EventFragment; + getEvent(nameOrSignatureOrTopic: "FeeDistributed"): EventFragment; getEvent(nameOrSignatureOrTopic: "FeeHandlerChanged"): EventFragment; getEvent(nameOrSignatureOrTopic: "Paused"): EventFragment; getEvent(nameOrSignatureOrTopic: "ProposalEvent"): EventFragment; @@ -567,6 +608,14 @@ export class Bridge extends Contract { "_feeHandler()"(overrides?: CallOverrides): Promise<[string]>; + _feeReserve(overrides?: CallOverrides): Promise<[BigNumber]>; + + "_feeReserve()"(overrides?: CallOverrides): Promise<[BigNumber]>; + + _fee_(overrides?: CallOverrides): Promise<[BigNumber]>; + + "_fee_()"(overrides?: CallOverrides): Promise<[BigNumber]>; + _hasVotedOnProposal( destNonce: BigNumberish, dataHash: BytesLike, @@ -601,104 +650,142 @@ export class Bridge extends Contract { adminAddRelayer( relayerAddress: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "adminAddRelayer(address)"( relayerAddress: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; adminChangeExpiry( expiry: BigNumberish, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "adminChangeExpiry(uint256)"( expiry: BigNumberish, - overrides?: Overrides - ): Promise; - - adminChangeFeeHandler( - newFeeHandler: string, - overrides?: Overrides - ): Promise; - - "adminChangeFeeHandler(address)"( - newFeeHandler: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; adminChangeRelayerThreshold( newThreshold: BigNumberish, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "adminChangeRelayerThreshold(uint256)"( newThreshold: BigNumberish, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; - adminPauseTransfers(overrides?: Overrides): Promise; + adminPauseTransfers( + overrides?: Overrides & { from?: string | Promise } + ): Promise; "adminPauseTransfers()"( - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } + ): Promise; + + adminRemoveGenericResource( + resourceID: BytesLike, + contractAddress: string, + overrides?: Overrides & { from?: string | Promise } + ): Promise; + + "adminRemoveGenericResource(bytes32,address)"( + resourceID: BytesLike, + contractAddress: string, + overrides?: Overrides & { from?: string | Promise } ): Promise; adminRemoveRelayer( relayerAddress: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "adminRemoveRelayer(address)"( relayerAddress: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } + ): Promise; + + adminRemoveResourceId( + resourceID: BytesLike, + tokenAddress: string, + isNative: boolean, + overrides?: Overrides & { from?: string | Promise } + ): Promise; + + "adminRemoveResourceId(bytes32,address,bool)"( + resourceID: BytesLike, + tokenAddress: string, + isNative: boolean, + overrides?: Overrides & { from?: string | Promise } + ): Promise; + + adminRemoveSpecialFee( + destinationDomainID: BigNumberish, + overrides?: Overrides & { from?: string | Promise } + ): Promise; + + "adminRemoveSpecialFee(uint8)"( + destinationDomainID: BigNumberish, + overrides?: Overrides & { from?: string | Promise } ): Promise; adminSetBurnable( handlerAddress: string, tokenAddress: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "adminSetBurnable(address,address)"( handlerAddress: string, tokenAddress: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; adminSetDepositNonce( domainID: BigNumberish, nonce: BigNumberish, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "adminSetDepositNonce(uint8,uint64)"( domainID: BigNumberish, nonce: BigNumberish, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; adminSetDomainId( domainID: BigNumberish, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "adminSetDomainId(uint8)"( domainID: BigNumberish, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } + ): Promise; + + adminSetFee( + newFee: BigNumberish, + overrides?: Overrides & { from?: string | Promise } + ): Promise; + + "adminSetFee(uint256)"( + newFee: BigNumberish, + overrides?: Overrides & { from?: string | Promise } ): Promise; adminSetForwarder( forwarder: string, valid: boolean, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "adminSetForwarder(address,bool)"( forwarder: string, valid: boolean, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; adminSetGenericResource( @@ -706,9 +793,9 @@ export class Bridge extends Contract { resourceID: BytesLike, contractAddress: string, depositFunctionSig: BytesLike, - depositFunctionDepositerOffset: BigNumberish, + depositFunctionDepositorOffset: BigNumberish, executeFunctionSig: BytesLike, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "adminSetGenericResource(address,bytes32,address,bytes4,uint256,bytes4)"( @@ -716,107 +803,83 @@ export class Bridge extends Contract { resourceID: BytesLike, contractAddress: string, depositFunctionSig: BytesLike, - depositFunctionDepositerOffset: BigNumberish, + depositFunctionDepositorOffset: BigNumberish, executeFunctionSig: BytesLike, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; - adminSetNative( + adminSetResource( + handlerAddress: string, resourceID: BytesLike, - nativeAddress: string, + tokenAddress: string, isNative: boolean, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; - "adminSetNative(bytes32,address,bool)"( + "adminSetResource(address,bytes32,address,bool)"( + handlerAddress: string, resourceID: BytesLike, - nativeAddress: string, + tokenAddress: string, isNative: boolean, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; - adminSetNativeResource( - handlerAddress: string, - overrides?: Overrides - ): Promise; - - "adminSetNativeResource(address)"( - handlerAddress: string, - overrides?: Overrides + adminSetSpecialFee( + destinationDomainID: BigNumberish, + _specialFee: BigNumberish, + overrides?: Overrides & { from?: string | Promise } ): Promise; - adminSetResource( - handlerAddress: string, - resourceID: BytesLike, - tokenAddress: string, - overrides?: Overrides + "adminSetSpecialFee(uint8,uint256)"( + destinationDomainID: BigNumberish, + _specialFee: BigNumberish, + overrides?: Overrides & { from?: string | Promise } ): Promise; - "adminSetResource(address,bytes32,address)"( - handlerAddress: string, - resourceID: BytesLike, - tokenAddress: string, - overrides?: Overrides + adminUnpauseTransfers( + overrides?: Overrides & { from?: string | Promise } ): Promise; - adminUnpauseTransfers(overrides?: Overrides): Promise; - "adminUnpauseTransfers()"( - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; adminWithdraw( handlerAddress: string, data: BytesLike, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "adminWithdraw(address,bytes)"( handlerAddress: string, data: BytesLike, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; adminWithdrawETH( handlerAddress: string, data: BytesLike, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "adminWithdrawETH(address,bytes)"( handlerAddress: string, data: BytesLike, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; - calculateFee( - destinationDomainID: BigNumberish, - resourceID: BytesLike, - depositData: BytesLike, - feeData: BytesLike, - overrides?: CallOverrides - ): Promise<[BigNumber]>; - - "calculateFee(uint8,bytes32,bytes,bytes)"( - destinationDomainID: BigNumberish, - resourceID: BytesLike, - depositData: BytesLike, - feeData: BytesLike, - overrides?: CallOverrides - ): Promise<[BigNumber]>; - cancelProposal( domainID: BigNumberish, depositNonce: BigNumberish, dataHash: BytesLike, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "cancelProposal(uint8,uint64,bytes32)"( domainID: BigNumberish, depositNonce: BigNumberish, dataHash: BytesLike, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; checkSignature( @@ -842,7 +905,7 @@ export class Bridge extends Contract { resourceID: BytesLike, depositData: BytesLike, feeData: BytesLike, - overrides?: PayableOverrides + overrides?: PayableOverrides & { from?: string | Promise } ): Promise; "deposit(uint8,bytes32,bytes,bytes)"( @@ -850,7 +913,7 @@ export class Bridge extends Contract { resourceID: BytesLike, depositData: BytesLike, feeData: BytesLike, - overrides?: PayableOverrides + overrides?: PayableOverrides & { from?: string | Promise } ): Promise; executeProposal( @@ -859,7 +922,7 @@ export class Bridge extends Contract { data: BytesLike, resourceID: BytesLike, revertOnFail: boolean, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "executeProposal(uint8,uint64,bytes,bytes32,bool)"( @@ -868,9 +931,19 @@ export class Bridge extends Contract { data: BytesLike, resourceID: BytesLike, revertOnFail: boolean, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; + getFee( + destinationDomainID: BigNumberish, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + "getFee(uint8)"( + destinationDomainID: BigNumberish, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + getProposal( originDomainID: BigNumberish, depositNonce: BigNumberish, @@ -949,13 +1022,13 @@ export class Bridge extends Contract { grantRole( role: BytesLike, account: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "grantRole(bytes32,address)"( role: BytesLike, account: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; hasRole( @@ -993,48 +1066,65 @@ export class Bridge extends Contract { renounceAdmin( newAdmin: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "renounceAdmin(address)"( newAdmin: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; renounceRole( role: BytesLike, account: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "renounceRole(bytes32,address)"( role: BytesLike, account: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; revokeRole( role: BytesLike, account: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "revokeRole(bytes32,address)"( role: BytesLike, account: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; - transferFunds( + special(arg0: BigNumberish, overrides?: CallOverrides): Promise<[boolean]>; + + "special(uint8)"( + arg0: BigNumberish, + overrides?: CallOverrides + ): Promise<[boolean]>; + + specialFee( + arg0: BigNumberish, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + "specialFee(uint8)"( + arg0: BigNumberish, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + transferFee( addrs: string[], amounts: BigNumberish[], - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; - "transferFunds(address[],uint256[])"( + "transferFee(address[],uint256[])"( addrs: string[], amounts: BigNumberish[], - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; voteProposal( @@ -1042,7 +1132,7 @@ export class Bridge extends Contract { depositNonce: BigNumberish, resourceID: BytesLike, data: BytesLike, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "voteProposal(uint8,uint64,bytes32,bytes)"( @@ -1050,7 +1140,7 @@ export class Bridge extends Contract { depositNonce: BigNumberish, resourceID: BytesLike, data: BytesLike, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; voteProposals( @@ -1059,7 +1149,7 @@ export class Bridge extends Contract { resourceID: BytesLike, data: BytesLike, signatures: BytesLike[], - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "voteProposals(uint8,uint64,bytes32,bytes,bytes[])"( @@ -1068,7 +1158,7 @@ export class Bridge extends Contract { resourceID: BytesLike, data: BytesLike, signatures: BytesLike[], - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; }; @@ -1118,6 +1208,14 @@ export class Bridge extends Contract { "_feeHandler()"(overrides?: CallOverrides): Promise; + _feeReserve(overrides?: CallOverrides): Promise; + + "_feeReserve()"(overrides?: CallOverrides): Promise; + + _fee_(overrides?: CallOverrides): Promise; + + "_fee_()"(overrides?: CallOverrides): Promise; + _hasVotedOnProposal( destNonce: BigNumberish, dataHash: BytesLike, @@ -1152,102 +1250,142 @@ export class Bridge extends Contract { adminAddRelayer( relayerAddress: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "adminAddRelayer(address)"( relayerAddress: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; adminChangeExpiry( expiry: BigNumberish, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "adminChangeExpiry(uint256)"( expiry: BigNumberish, - overrides?: Overrides - ): Promise; - - adminChangeFeeHandler( - newFeeHandler: string, - overrides?: Overrides - ): Promise; - - "adminChangeFeeHandler(address)"( - newFeeHandler: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; adminChangeRelayerThreshold( newThreshold: BigNumberish, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "adminChangeRelayerThreshold(uint256)"( newThreshold: BigNumberish, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } + ): Promise; + + adminPauseTransfers( + overrides?: Overrides & { from?: string | Promise } + ): Promise; + + "adminPauseTransfers()"( + overrides?: Overrides & { from?: string | Promise } ): Promise; - adminPauseTransfers(overrides?: Overrides): Promise; + adminRemoveGenericResource( + resourceID: BytesLike, + contractAddress: string, + overrides?: Overrides & { from?: string | Promise } + ): Promise; - "adminPauseTransfers()"(overrides?: Overrides): Promise; + "adminRemoveGenericResource(bytes32,address)"( + resourceID: BytesLike, + contractAddress: string, + overrides?: Overrides & { from?: string | Promise } + ): Promise; adminRemoveRelayer( relayerAddress: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "adminRemoveRelayer(address)"( relayerAddress: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } + ): Promise; + + adminRemoveResourceId( + resourceID: BytesLike, + tokenAddress: string, + isNative: boolean, + overrides?: Overrides & { from?: string | Promise } + ): Promise; + + "adminRemoveResourceId(bytes32,address,bool)"( + resourceID: BytesLike, + tokenAddress: string, + isNative: boolean, + overrides?: Overrides & { from?: string | Promise } + ): Promise; + + adminRemoveSpecialFee( + destinationDomainID: BigNumberish, + overrides?: Overrides & { from?: string | Promise } + ): Promise; + + "adminRemoveSpecialFee(uint8)"( + destinationDomainID: BigNumberish, + overrides?: Overrides & { from?: string | Promise } ): Promise; adminSetBurnable( handlerAddress: string, tokenAddress: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "adminSetBurnable(address,address)"( handlerAddress: string, tokenAddress: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; adminSetDepositNonce( domainID: BigNumberish, nonce: BigNumberish, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "adminSetDepositNonce(uint8,uint64)"( domainID: BigNumberish, nonce: BigNumberish, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; adminSetDomainId( domainID: BigNumberish, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "adminSetDomainId(uint8)"( domainID: BigNumberish, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } + ): Promise; + + adminSetFee( + newFee: BigNumberish, + overrides?: Overrides & { from?: string | Promise } + ): Promise; + + "adminSetFee(uint256)"( + newFee: BigNumberish, + overrides?: Overrides & { from?: string | Promise } ): Promise; adminSetForwarder( forwarder: string, valid: boolean, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "adminSetForwarder(address,bool)"( forwarder: string, valid: boolean, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; adminSetGenericResource( @@ -1255,9 +1393,9 @@ export class Bridge extends Contract { resourceID: BytesLike, contractAddress: string, depositFunctionSig: BytesLike, - depositFunctionDepositerOffset: BigNumberish, + depositFunctionDepositorOffset: BigNumberish, executeFunctionSig: BytesLike, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "adminSetGenericResource(address,bytes32,address,bytes4,uint256,bytes4)"( @@ -1265,107 +1403,83 @@ export class Bridge extends Contract { resourceID: BytesLike, contractAddress: string, depositFunctionSig: BytesLike, - depositFunctionDepositerOffset: BigNumberish, + depositFunctionDepositorOffset: BigNumberish, executeFunctionSig: BytesLike, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; - adminSetNative( + adminSetResource( + handlerAddress: string, resourceID: BytesLike, - nativeAddress: string, + tokenAddress: string, isNative: boolean, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; - "adminSetNative(bytes32,address,bool)"( + "adminSetResource(address,bytes32,address,bool)"( + handlerAddress: string, resourceID: BytesLike, - nativeAddress: string, + tokenAddress: string, isNative: boolean, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; - adminSetNativeResource( - handlerAddress: string, - overrides?: Overrides - ): Promise; - - "adminSetNativeResource(address)"( - handlerAddress: string, - overrides?: Overrides + adminSetSpecialFee( + destinationDomainID: BigNumberish, + _specialFee: BigNumberish, + overrides?: Overrides & { from?: string | Promise } ): Promise; - adminSetResource( - handlerAddress: string, - resourceID: BytesLike, - tokenAddress: string, - overrides?: Overrides + "adminSetSpecialFee(uint8,uint256)"( + destinationDomainID: BigNumberish, + _specialFee: BigNumberish, + overrides?: Overrides & { from?: string | Promise } ): Promise; - "adminSetResource(address,bytes32,address)"( - handlerAddress: string, - resourceID: BytesLike, - tokenAddress: string, - overrides?: Overrides + adminUnpauseTransfers( + overrides?: Overrides & { from?: string | Promise } ): Promise; - adminUnpauseTransfers(overrides?: Overrides): Promise; - "adminUnpauseTransfers()"( - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; adminWithdraw( handlerAddress: string, data: BytesLike, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "adminWithdraw(address,bytes)"( handlerAddress: string, data: BytesLike, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; adminWithdrawETH( handlerAddress: string, data: BytesLike, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "adminWithdrawETH(address,bytes)"( handlerAddress: string, data: BytesLike, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; - calculateFee( - destinationDomainID: BigNumberish, - resourceID: BytesLike, - depositData: BytesLike, - feeData: BytesLike, - overrides?: CallOverrides - ): Promise; - - "calculateFee(uint8,bytes32,bytes,bytes)"( - destinationDomainID: BigNumberish, - resourceID: BytesLike, - depositData: BytesLike, - feeData: BytesLike, - overrides?: CallOverrides - ): Promise; - cancelProposal( domainID: BigNumberish, depositNonce: BigNumberish, dataHash: BytesLike, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "cancelProposal(uint8,uint64,bytes32)"( domainID: BigNumberish, depositNonce: BigNumberish, dataHash: BytesLike, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; checkSignature( @@ -1391,7 +1505,7 @@ export class Bridge extends Contract { resourceID: BytesLike, depositData: BytesLike, feeData: BytesLike, - overrides?: PayableOverrides + overrides?: PayableOverrides & { from?: string | Promise } ): Promise; "deposit(uint8,bytes32,bytes,bytes)"( @@ -1399,7 +1513,7 @@ export class Bridge extends Contract { resourceID: BytesLike, depositData: BytesLike, feeData: BytesLike, - overrides?: PayableOverrides + overrides?: PayableOverrides & { from?: string | Promise } ): Promise; executeProposal( @@ -1408,7 +1522,7 @@ export class Bridge extends Contract { data: BytesLike, resourceID: BytesLike, revertOnFail: boolean, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "executeProposal(uint8,uint64,bytes,bytes32,bool)"( @@ -1417,9 +1531,19 @@ export class Bridge extends Contract { data: BytesLike, resourceID: BytesLike, revertOnFail: boolean, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; + getFee( + destinationDomainID: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "getFee(uint8)"( + destinationDomainID: BigNumberish, + overrides?: CallOverrides + ): Promise; + getProposal( originDomainID: BigNumberish, depositNonce: BigNumberish, @@ -1494,13 +1618,13 @@ export class Bridge extends Contract { grantRole( role: BytesLike, account: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "grantRole(bytes32,address)"( role: BytesLike, account: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; hasRole( @@ -1535,48 +1659,62 @@ export class Bridge extends Contract { renounceAdmin( newAdmin: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "renounceAdmin(address)"( newAdmin: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; renounceRole( role: BytesLike, account: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "renounceRole(bytes32,address)"( role: BytesLike, account: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; revokeRole( role: BytesLike, account: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "revokeRole(bytes32,address)"( role: BytesLike, account: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; - transferFunds( + special(arg0: BigNumberish, overrides?: CallOverrides): Promise; + + "special(uint8)"( + arg0: BigNumberish, + overrides?: CallOverrides + ): Promise; + + specialFee(arg0: BigNumberish, overrides?: CallOverrides): Promise; + + "specialFee(uint8)"( + arg0: BigNumberish, + overrides?: CallOverrides + ): Promise; + + transferFee( addrs: string[], amounts: BigNumberish[], - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; - "transferFunds(address[],uint256[])"( + "transferFee(address[],uint256[])"( addrs: string[], amounts: BigNumberish[], - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; voteProposal( @@ -1584,7 +1722,7 @@ export class Bridge extends Contract { depositNonce: BigNumberish, resourceID: BytesLike, data: BytesLike, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "voteProposal(uint8,uint64,bytes32,bytes)"( @@ -1592,7 +1730,7 @@ export class Bridge extends Contract { depositNonce: BigNumberish, resourceID: BytesLike, data: BytesLike, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; voteProposals( @@ -1601,7 +1739,7 @@ export class Bridge extends Contract { resourceID: BytesLike, data: BytesLike, signatures: BytesLike[], - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "voteProposals(uint8,uint64,bytes32,bytes,bytes[])"( @@ -1610,7 +1748,7 @@ export class Bridge extends Contract { resourceID: BytesLike, data: BytesLike, signatures: BytesLike[], - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; callStatic: { @@ -1660,6 +1798,14 @@ export class Bridge extends Contract { "_feeHandler()"(overrides?: CallOverrides): Promise; + _feeReserve(overrides?: CallOverrides): Promise; + + "_feeReserve()"(overrides?: CallOverrides): Promise; + + _fee_(overrides?: CallOverrides): Promise; + + "_fee_()"(overrides?: CallOverrides): Promise; + _hasVotedOnProposal( destNonce: BigNumberish, dataHash: BytesLike, @@ -1712,16 +1858,6 @@ export class Bridge extends Contract { overrides?: CallOverrides ): Promise; - adminChangeFeeHandler( - newFeeHandler: string, - overrides?: CallOverrides - ): Promise; - - "adminChangeFeeHandler(address)"( - newFeeHandler: string, - overrides?: CallOverrides - ): Promise; - adminChangeRelayerThreshold( newThreshold: BigNumberish, overrides?: CallOverrides @@ -1736,8 +1872,20 @@ export class Bridge extends Contract { "adminPauseTransfers()"(overrides?: CallOverrides): Promise; - adminRemoveRelayer( - relayerAddress: string, + adminRemoveGenericResource( + resourceID: BytesLike, + contractAddress: string, + overrides?: CallOverrides + ): Promise; + + "adminRemoveGenericResource(bytes32,address)"( + resourceID: BytesLike, + contractAddress: string, + overrides?: CallOverrides + ): Promise; + + adminRemoveRelayer( + relayerAddress: string, overrides?: CallOverrides ): Promise; @@ -1746,6 +1894,30 @@ export class Bridge extends Contract { overrides?: CallOverrides ): Promise; + adminRemoveResourceId( + resourceID: BytesLike, + tokenAddress: string, + isNative: boolean, + overrides?: CallOverrides + ): Promise; + + "adminRemoveResourceId(bytes32,address,bool)"( + resourceID: BytesLike, + tokenAddress: string, + isNative: boolean, + overrides?: CallOverrides + ): Promise; + + adminRemoveSpecialFee( + destinationDomainID: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "adminRemoveSpecialFee(uint8)"( + destinationDomainID: BigNumberish, + overrides?: CallOverrides + ): Promise; + adminSetBurnable( handlerAddress: string, tokenAddress: string, @@ -1780,6 +1952,13 @@ export class Bridge extends Contract { overrides?: CallOverrides ): Promise; + adminSetFee(newFee: BigNumberish, overrides?: CallOverrides): Promise; + + "adminSetFee(uint256)"( + newFee: BigNumberish, + overrides?: CallOverrides + ): Promise; + adminSetForwarder( forwarder: string, valid: boolean, @@ -1797,7 +1976,7 @@ export class Bridge extends Contract { resourceID: BytesLike, contractAddress: string, depositFunctionSig: BytesLike, - depositFunctionDepositerOffset: BigNumberish, + depositFunctionDepositorOffset: BigNumberish, executeFunctionSig: BytesLike, overrides?: CallOverrides ): Promise; @@ -1807,46 +1986,36 @@ export class Bridge extends Contract { resourceID: BytesLike, contractAddress: string, depositFunctionSig: BytesLike, - depositFunctionDepositerOffset: BigNumberish, + depositFunctionDepositorOffset: BigNumberish, executeFunctionSig: BytesLike, overrides?: CallOverrides ): Promise; - adminSetNative( + adminSetResource( + handlerAddress: string, resourceID: BytesLike, - nativeAddress: string, + tokenAddress: string, isNative: boolean, overrides?: CallOverrides ): Promise; - "adminSetNative(bytes32,address,bool)"( + "adminSetResource(address,bytes32,address,bool)"( + handlerAddress: string, resourceID: BytesLike, - nativeAddress: string, + tokenAddress: string, isNative: boolean, overrides?: CallOverrides ): Promise; - adminSetNativeResource( - handlerAddress: string, - overrides?: CallOverrides - ): Promise; - - "adminSetNativeResource(address)"( - handlerAddress: string, - overrides?: CallOverrides - ): Promise; - - adminSetResource( - handlerAddress: string, - resourceID: BytesLike, - tokenAddress: string, + adminSetSpecialFee( + destinationDomainID: BigNumberish, + _specialFee: BigNumberish, overrides?: CallOverrides ): Promise; - "adminSetResource(address,bytes32,address)"( - handlerAddress: string, - resourceID: BytesLike, - tokenAddress: string, + "adminSetSpecialFee(uint8,uint256)"( + destinationDomainID: BigNumberish, + _specialFee: BigNumberish, overrides?: CallOverrides ): Promise; @@ -1878,22 +2047,6 @@ export class Bridge extends Contract { overrides?: CallOverrides ): Promise; - calculateFee( - destinationDomainID: BigNumberish, - resourceID: BytesLike, - depositData: BytesLike, - feeData: BytesLike, - overrides?: CallOverrides - ): Promise; - - "calculateFee(uint8,bytes32,bytes,bytes)"( - destinationDomainID: BigNumberish, - resourceID: BytesLike, - depositData: BytesLike, - feeData: BytesLike, - overrides?: CallOverrides - ): Promise; - cancelProposal( domainID: BigNumberish, depositNonce: BigNumberish, @@ -1960,6 +2113,16 @@ export class Bridge extends Contract { overrides?: CallOverrides ): Promise; + getFee( + destinationDomainID: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "getFee(uint8)"( + destinationDomainID: BigNumberish, + overrides?: CallOverrides + ): Promise; + getProposal( originDomainID: BigNumberish, depositNonce: BigNumberish, @@ -2104,13 +2267,30 @@ export class Bridge extends Contract { overrides?: CallOverrides ): Promise; - transferFunds( + special(arg0: BigNumberish, overrides?: CallOverrides): Promise; + + "special(uint8)"( + arg0: BigNumberish, + overrides?: CallOverrides + ): Promise; + + specialFee( + arg0: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "specialFee(uint8)"( + arg0: BigNumberish, + overrides?: CallOverrides + ): Promise; + + transferFee( addrs: string[], amounts: BigNumberish[], overrides?: CallOverrides ): Promise; - "transferFunds(address[],uint256[])"( + "transferFee(address[],uint256[])"( addrs: string[], amounts: BigNumberish[], overrides?: CallOverrides @@ -2175,6 +2355,19 @@ export class Bridge extends Contract { lowLevelData: null ): TypedEventFilter<[string], { lowLevelData: string }>; + FeeChanged( + newFee: null + ): TypedEventFilter<[BigNumber], { newFee: BigNumber }>; + + FeeDistributed( + tokenAddress: null, + recipient: null, + amount: null + ): TypedEventFilter< + [string, string, BigNumber], + { tokenAddress: string; recipient: string; amount: BigNumber } + >; + FeeHandlerChanged( newFeeHandler: null ): TypedEventFilter<[string], { newFeeHandler: string }>; @@ -2291,6 +2484,14 @@ export class Bridge extends Contract { "_feeHandler()"(overrides?: CallOverrides): Promise; + _feeReserve(overrides?: CallOverrides): Promise; + + "_feeReserve()"(overrides?: CallOverrides): Promise; + + _fee_(overrides?: CallOverrides): Promise; + + "_fee_()"(overrides?: CallOverrides): Promise; + _hasVotedOnProposal( destNonce: BigNumberish, dataHash: BytesLike, @@ -2325,102 +2526,142 @@ export class Bridge extends Contract { adminAddRelayer( relayerAddress: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "adminAddRelayer(address)"( relayerAddress: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; adminChangeExpiry( expiry: BigNumberish, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "adminChangeExpiry(uint256)"( expiry: BigNumberish, - overrides?: Overrides - ): Promise; - - adminChangeFeeHandler( - newFeeHandler: string, - overrides?: Overrides - ): Promise; - - "adminChangeFeeHandler(address)"( - newFeeHandler: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; adminChangeRelayerThreshold( newThreshold: BigNumberish, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "adminChangeRelayerThreshold(uint256)"( newThreshold: BigNumberish, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; - adminPauseTransfers(overrides?: Overrides): Promise; + adminPauseTransfers( + overrides?: Overrides & { from?: string | Promise } + ): Promise; - "adminPauseTransfers()"(overrides?: Overrides): Promise; + "adminPauseTransfers()"( + overrides?: Overrides & { from?: string | Promise } + ): Promise; + + adminRemoveGenericResource( + resourceID: BytesLike, + contractAddress: string, + overrides?: Overrides & { from?: string | Promise } + ): Promise; + + "adminRemoveGenericResource(bytes32,address)"( + resourceID: BytesLike, + contractAddress: string, + overrides?: Overrides & { from?: string | Promise } + ): Promise; adminRemoveRelayer( relayerAddress: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "adminRemoveRelayer(address)"( relayerAddress: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } + ): Promise; + + adminRemoveResourceId( + resourceID: BytesLike, + tokenAddress: string, + isNative: boolean, + overrides?: Overrides & { from?: string | Promise } + ): Promise; + + "adminRemoveResourceId(bytes32,address,bool)"( + resourceID: BytesLike, + tokenAddress: string, + isNative: boolean, + overrides?: Overrides & { from?: string | Promise } + ): Promise; + + adminRemoveSpecialFee( + destinationDomainID: BigNumberish, + overrides?: Overrides & { from?: string | Promise } + ): Promise; + + "adminRemoveSpecialFee(uint8)"( + destinationDomainID: BigNumberish, + overrides?: Overrides & { from?: string | Promise } ): Promise; adminSetBurnable( handlerAddress: string, tokenAddress: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "adminSetBurnable(address,address)"( handlerAddress: string, tokenAddress: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; adminSetDepositNonce( domainID: BigNumberish, nonce: BigNumberish, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "adminSetDepositNonce(uint8,uint64)"( domainID: BigNumberish, nonce: BigNumberish, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; adminSetDomainId( domainID: BigNumberish, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "adminSetDomainId(uint8)"( domainID: BigNumberish, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } + ): Promise; + + adminSetFee( + newFee: BigNumberish, + overrides?: Overrides & { from?: string | Promise } + ): Promise; + + "adminSetFee(uint256)"( + newFee: BigNumberish, + overrides?: Overrides & { from?: string | Promise } ): Promise; adminSetForwarder( forwarder: string, valid: boolean, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "adminSetForwarder(address,bool)"( forwarder: string, valid: boolean, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; adminSetGenericResource( @@ -2428,9 +2669,9 @@ export class Bridge extends Contract { resourceID: BytesLike, contractAddress: string, depositFunctionSig: BytesLike, - depositFunctionDepositerOffset: BigNumberish, + depositFunctionDepositorOffset: BigNumberish, executeFunctionSig: BytesLike, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "adminSetGenericResource(address,bytes32,address,bytes4,uint256,bytes4)"( @@ -2438,105 +2679,83 @@ export class Bridge extends Contract { resourceID: BytesLike, contractAddress: string, depositFunctionSig: BytesLike, - depositFunctionDepositerOffset: BigNumberish, + depositFunctionDepositorOffset: BigNumberish, executeFunctionSig: BytesLike, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; - adminSetNative( + adminSetResource( + handlerAddress: string, resourceID: BytesLike, - nativeAddress: string, + tokenAddress: string, isNative: boolean, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; - "adminSetNative(bytes32,address,bool)"( + "adminSetResource(address,bytes32,address,bool)"( + handlerAddress: string, resourceID: BytesLike, - nativeAddress: string, + tokenAddress: string, isNative: boolean, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; - adminSetNativeResource( - handlerAddress: string, - overrides?: Overrides + adminSetSpecialFee( + destinationDomainID: BigNumberish, + _specialFee: BigNumberish, + overrides?: Overrides & { from?: string | Promise } ): Promise; - "adminSetNativeResource(address)"( - handlerAddress: string, - overrides?: Overrides + "adminSetSpecialFee(uint8,uint256)"( + destinationDomainID: BigNumberish, + _specialFee: BigNumberish, + overrides?: Overrides & { from?: string | Promise } ): Promise; - adminSetResource( - handlerAddress: string, - resourceID: BytesLike, - tokenAddress: string, - overrides?: Overrides + adminUnpauseTransfers( + overrides?: Overrides & { from?: string | Promise } ): Promise; - "adminSetResource(address,bytes32,address)"( - handlerAddress: string, - resourceID: BytesLike, - tokenAddress: string, - overrides?: Overrides + "adminUnpauseTransfers()"( + overrides?: Overrides & { from?: string | Promise } ): Promise; - adminUnpauseTransfers(overrides?: Overrides): Promise; - - "adminUnpauseTransfers()"(overrides?: Overrides): Promise; - adminWithdraw( handlerAddress: string, data: BytesLike, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "adminWithdraw(address,bytes)"( handlerAddress: string, data: BytesLike, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; adminWithdrawETH( handlerAddress: string, data: BytesLike, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "adminWithdrawETH(address,bytes)"( handlerAddress: string, data: BytesLike, - overrides?: Overrides - ): Promise; - - calculateFee( - destinationDomainID: BigNumberish, - resourceID: BytesLike, - depositData: BytesLike, - feeData: BytesLike, - overrides?: CallOverrides - ): Promise; - - "calculateFee(uint8,bytes32,bytes,bytes)"( - destinationDomainID: BigNumberish, - resourceID: BytesLike, - depositData: BytesLike, - feeData: BytesLike, - overrides?: CallOverrides + overrides?: Overrides & { from?: string | Promise } ): Promise; cancelProposal( domainID: BigNumberish, depositNonce: BigNumberish, dataHash: BytesLike, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "cancelProposal(uint8,uint64,bytes32)"( domainID: BigNumberish, depositNonce: BigNumberish, dataHash: BytesLike, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; checkSignature( @@ -2562,7 +2781,7 @@ export class Bridge extends Contract { resourceID: BytesLike, depositData: BytesLike, feeData: BytesLike, - overrides?: PayableOverrides + overrides?: PayableOverrides & { from?: string | Promise } ): Promise; "deposit(uint8,bytes32,bytes,bytes)"( @@ -2570,7 +2789,7 @@ export class Bridge extends Contract { resourceID: BytesLike, depositData: BytesLike, feeData: BytesLike, - overrides?: PayableOverrides + overrides?: PayableOverrides & { from?: string | Promise } ): Promise; executeProposal( @@ -2579,7 +2798,7 @@ export class Bridge extends Contract { data: BytesLike, resourceID: BytesLike, revertOnFail: boolean, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "executeProposal(uint8,uint64,bytes,bytes32,bool)"( @@ -2588,7 +2807,17 @@ export class Bridge extends Contract { data: BytesLike, resourceID: BytesLike, revertOnFail: boolean, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } + ): Promise; + + getFee( + destinationDomainID: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "getFee(uint8)"( + destinationDomainID: BigNumberish, + overrides?: CallOverrides ): Promise; getProposal( @@ -2654,13 +2883,13 @@ export class Bridge extends Contract { grantRole( role: BytesLike, account: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "grantRole(bytes32,address)"( role: BytesLike, account: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; hasRole( @@ -2696,47 +2925,67 @@ export class Bridge extends Contract { "paused()"(overrides?: CallOverrides): Promise; - renounceAdmin(newAdmin: string, overrides?: Overrides): Promise; + renounceAdmin( + newAdmin: string, + overrides?: Overrides & { from?: string | Promise } + ): Promise; "renounceAdmin(address)"( newAdmin: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; renounceRole( role: BytesLike, account: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "renounceRole(bytes32,address)"( role: BytesLike, account: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; revokeRole( role: BytesLike, account: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "revokeRole(bytes32,address)"( role: BytesLike, account: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; - transferFunds( + special(arg0: BigNumberish, overrides?: CallOverrides): Promise; + + "special(uint8)"( + arg0: BigNumberish, + overrides?: CallOverrides + ): Promise; + + specialFee( + arg0: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "specialFee(uint8)"( + arg0: BigNumberish, + overrides?: CallOverrides + ): Promise; + + transferFee( addrs: string[], amounts: BigNumberish[], - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; - "transferFunds(address[],uint256[])"( + "transferFee(address[],uint256[])"( addrs: string[], amounts: BigNumberish[], - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; voteProposal( @@ -2744,7 +2993,7 @@ export class Bridge extends Contract { depositNonce: BigNumberish, resourceID: BytesLike, data: BytesLike, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "voteProposal(uint8,uint64,bytes32,bytes)"( @@ -2752,7 +3001,7 @@ export class Bridge extends Contract { depositNonce: BigNumberish, resourceID: BytesLike, data: BytesLike, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; voteProposals( @@ -2761,7 +3010,7 @@ export class Bridge extends Contract { resourceID: BytesLike, data: BytesLike, signatures: BytesLike[], - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "voteProposals(uint8,uint64,bytes32,bytes,bytes[])"( @@ -2770,7 +3019,7 @@ export class Bridge extends Contract { resourceID: BytesLike, data: BytesLike, signatures: BytesLike[], - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; }; @@ -2827,6 +3076,14 @@ export class Bridge extends Contract { "_feeHandler()"(overrides?: CallOverrides): Promise; + _feeReserve(overrides?: CallOverrides): Promise; + + "_feeReserve()"(overrides?: CallOverrides): Promise; + + _fee_(overrides?: CallOverrides): Promise; + + "_fee_()"(overrides?: CallOverrides): Promise; + _hasVotedOnProposal( destNonce: BigNumberish, dataHash: BytesLike, @@ -2865,104 +3122,142 @@ export class Bridge extends Contract { adminAddRelayer( relayerAddress: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "adminAddRelayer(address)"( relayerAddress: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; adminChangeExpiry( expiry: BigNumberish, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "adminChangeExpiry(uint256)"( expiry: BigNumberish, - overrides?: Overrides - ): Promise; - - adminChangeFeeHandler( - newFeeHandler: string, - overrides?: Overrides - ): Promise; - - "adminChangeFeeHandler(address)"( - newFeeHandler: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; adminChangeRelayerThreshold( newThreshold: BigNumberish, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "adminChangeRelayerThreshold(uint256)"( newThreshold: BigNumberish, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; - adminPauseTransfers(overrides?: Overrides): Promise; + adminPauseTransfers( + overrides?: Overrides & { from?: string | Promise } + ): Promise; "adminPauseTransfers()"( - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } + ): Promise; + + adminRemoveGenericResource( + resourceID: BytesLike, + contractAddress: string, + overrides?: Overrides & { from?: string | Promise } + ): Promise; + + "adminRemoveGenericResource(bytes32,address)"( + resourceID: BytesLike, + contractAddress: string, + overrides?: Overrides & { from?: string | Promise } ): Promise; adminRemoveRelayer( relayerAddress: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "adminRemoveRelayer(address)"( relayerAddress: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } + ): Promise; + + adminRemoveResourceId( + resourceID: BytesLike, + tokenAddress: string, + isNative: boolean, + overrides?: Overrides & { from?: string | Promise } + ): Promise; + + "adminRemoveResourceId(bytes32,address,bool)"( + resourceID: BytesLike, + tokenAddress: string, + isNative: boolean, + overrides?: Overrides & { from?: string | Promise } + ): Promise; + + adminRemoveSpecialFee( + destinationDomainID: BigNumberish, + overrides?: Overrides & { from?: string | Promise } + ): Promise; + + "adminRemoveSpecialFee(uint8)"( + destinationDomainID: BigNumberish, + overrides?: Overrides & { from?: string | Promise } ): Promise; adminSetBurnable( handlerAddress: string, tokenAddress: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "adminSetBurnable(address,address)"( handlerAddress: string, tokenAddress: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; adminSetDepositNonce( domainID: BigNumberish, nonce: BigNumberish, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "adminSetDepositNonce(uint8,uint64)"( domainID: BigNumberish, nonce: BigNumberish, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; adminSetDomainId( domainID: BigNumberish, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "adminSetDomainId(uint8)"( domainID: BigNumberish, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } + ): Promise; + + adminSetFee( + newFee: BigNumberish, + overrides?: Overrides & { from?: string | Promise } + ): Promise; + + "adminSetFee(uint256)"( + newFee: BigNumberish, + overrides?: Overrides & { from?: string | Promise } ): Promise; adminSetForwarder( forwarder: string, valid: boolean, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "adminSetForwarder(address,bool)"( forwarder: string, valid: boolean, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; adminSetGenericResource( @@ -2970,9 +3265,9 @@ export class Bridge extends Contract { resourceID: BytesLike, contractAddress: string, depositFunctionSig: BytesLike, - depositFunctionDepositerOffset: BigNumberish, + depositFunctionDepositorOffset: BigNumberish, executeFunctionSig: BytesLike, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "adminSetGenericResource(address,bytes32,address,bytes4,uint256,bytes4)"( @@ -2980,107 +3275,83 @@ export class Bridge extends Contract { resourceID: BytesLike, contractAddress: string, depositFunctionSig: BytesLike, - depositFunctionDepositerOffset: BigNumberish, + depositFunctionDepositorOffset: BigNumberish, executeFunctionSig: BytesLike, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; - adminSetNative( + adminSetResource( + handlerAddress: string, resourceID: BytesLike, - nativeAddress: string, + tokenAddress: string, isNative: boolean, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; - "adminSetNative(bytes32,address,bool)"( + "adminSetResource(address,bytes32,address,bool)"( + handlerAddress: string, resourceID: BytesLike, - nativeAddress: string, + tokenAddress: string, isNative: boolean, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; - adminSetNativeResource( - handlerAddress: string, - overrides?: Overrides - ): Promise; - - "adminSetNativeResource(address)"( - handlerAddress: string, - overrides?: Overrides + adminSetSpecialFee( + destinationDomainID: BigNumberish, + _specialFee: BigNumberish, + overrides?: Overrides & { from?: string | Promise } ): Promise; - adminSetResource( - handlerAddress: string, - resourceID: BytesLike, - tokenAddress: string, - overrides?: Overrides + "adminSetSpecialFee(uint8,uint256)"( + destinationDomainID: BigNumberish, + _specialFee: BigNumberish, + overrides?: Overrides & { from?: string | Promise } ): Promise; - "adminSetResource(address,bytes32,address)"( - handlerAddress: string, - resourceID: BytesLike, - tokenAddress: string, - overrides?: Overrides + adminUnpauseTransfers( + overrides?: Overrides & { from?: string | Promise } ): Promise; - adminUnpauseTransfers(overrides?: Overrides): Promise; - "adminUnpauseTransfers()"( - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; adminWithdraw( handlerAddress: string, data: BytesLike, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "adminWithdraw(address,bytes)"( handlerAddress: string, data: BytesLike, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; adminWithdrawETH( handlerAddress: string, data: BytesLike, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "adminWithdrawETH(address,bytes)"( handlerAddress: string, data: BytesLike, - overrides?: Overrides - ): Promise; - - calculateFee( - destinationDomainID: BigNumberish, - resourceID: BytesLike, - depositData: BytesLike, - feeData: BytesLike, - overrides?: CallOverrides - ): Promise; - - "calculateFee(uint8,bytes32,bytes,bytes)"( - destinationDomainID: BigNumberish, - resourceID: BytesLike, - depositData: BytesLike, - feeData: BytesLike, - overrides?: CallOverrides + overrides?: Overrides & { from?: string | Promise } ): Promise; cancelProposal( domainID: BigNumberish, depositNonce: BigNumberish, dataHash: BytesLike, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "cancelProposal(uint8,uint64,bytes32)"( domainID: BigNumberish, depositNonce: BigNumberish, dataHash: BytesLike, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; checkSignature( @@ -3106,7 +3377,7 @@ export class Bridge extends Contract { resourceID: BytesLike, depositData: BytesLike, feeData: BytesLike, - overrides?: PayableOverrides + overrides?: PayableOverrides & { from?: string | Promise } ): Promise; "deposit(uint8,bytes32,bytes,bytes)"( @@ -3114,7 +3385,7 @@ export class Bridge extends Contract { resourceID: BytesLike, depositData: BytesLike, feeData: BytesLike, - overrides?: PayableOverrides + overrides?: PayableOverrides & { from?: string | Promise } ): Promise; executeProposal( @@ -3123,7 +3394,7 @@ export class Bridge extends Contract { data: BytesLike, resourceID: BytesLike, revertOnFail: boolean, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "executeProposal(uint8,uint64,bytes,bytes32,bool)"( @@ -3132,7 +3403,17 @@ export class Bridge extends Contract { data: BytesLike, resourceID: BytesLike, revertOnFail: boolean, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } + ): Promise; + + getFee( + destinationDomainID: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "getFee(uint8)"( + destinationDomainID: BigNumberish, + overrides?: CallOverrides ): Promise; getProposal( @@ -3198,13 +3479,13 @@ export class Bridge extends Contract { grantRole( role: BytesLike, account: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "grantRole(bytes32,address)"( role: BytesLike, account: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; hasRole( @@ -3245,48 +3526,68 @@ export class Bridge extends Contract { renounceAdmin( newAdmin: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "renounceAdmin(address)"( newAdmin: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; renounceRole( role: BytesLike, account: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "renounceRole(bytes32,address)"( role: BytesLike, account: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; revokeRole( role: BytesLike, account: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "revokeRole(bytes32,address)"( role: BytesLike, account: string, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } + ): Promise; + + special( + arg0: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "special(uint8)"( + arg0: BigNumberish, + overrides?: CallOverrides + ): Promise; + + specialFee( + arg0: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "specialFee(uint8)"( + arg0: BigNumberish, + overrides?: CallOverrides ): Promise; - transferFunds( + transferFee( addrs: string[], amounts: BigNumberish[], - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; - "transferFunds(address[],uint256[])"( + "transferFee(address[],uint256[])"( addrs: string[], amounts: BigNumberish[], - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; voteProposal( @@ -3294,7 +3595,7 @@ export class Bridge extends Contract { depositNonce: BigNumberish, resourceID: BytesLike, data: BytesLike, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "voteProposal(uint8,uint64,bytes32,bytes)"( @@ -3302,7 +3603,7 @@ export class Bridge extends Contract { depositNonce: BigNumberish, resourceID: BytesLike, data: BytesLike, - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; voteProposals( @@ -3311,7 +3612,7 @@ export class Bridge extends Contract { resourceID: BytesLike, data: BytesLike, signatures: BytesLike[], - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; "voteProposals(uint8,uint64,bytes32,bytes,bytes[])"( @@ -3320,7 +3621,7 @@ export class Bridge extends Contract { resourceID: BytesLike, data: BytesLike, signatures: BytesLike[], - overrides?: Overrides + overrides?: Overrides & { from?: string | Promise } ): Promise; }; } diff --git a/src/Contracts/BridgeFactory.ts b/src/Contracts/BridgeFactory.ts index 33f82176..153fe581 100644 --- a/src/Contracts/BridgeFactory.ts +++ b/src/Contracts/BridgeFactory.ts @@ -8,10 +8,7 @@ import { Provider } from "@ethersproject/providers"; import type { Bridge } from "./Bridge"; export class BridgeFactory { - static connect( - address: string, - signerOrProvider: Signer | Provider - ): Bridge { + static connect(address: string, signerOrProvider: Signer | Provider): Bridge { return new Contract(address, _abi, signerOrProvider) as Bridge; } } @@ -72,7 +69,7 @@ const _abi = [ type: "uint256", }, ], - name: "InviladSignature", + name: "InvalidSignature", type: "error", }, { @@ -136,6 +133,44 @@ const _abi = [ name: "FailedHandlerExecution", type: "event", }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "newFee", + type: "uint256", + }, + ], + name: "FeeChanged", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "tokenAddress", + type: "address", + }, + { + indexed: false, + internalType: "address", + name: "recipient", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "FeeDistributed", + type: "event", + }, { anonymous: false, inputs: [ @@ -380,7 +415,7 @@ const _abi = [ }, { inputs: [], - name: "_domainId", + name: "_chainId", outputs: [ { internalType: "uint256", @@ -462,6 +497,32 @@ const _abi = [ stateMutability: "view", type: "function", }, + { + inputs: [], + name: "_feeReserve", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "_fee_", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, { inputs: [ { @@ -565,12 +626,19 @@ const _abi = [ { inputs: [ { - internalType: "address", - name: "newFeeHandler", - type: "address", + internalType: "uint256", + name: "newThreshold", + type: "uint256", }, ], - name: "adminChangeFeeHandler", + name: "adminChangeRelayerThreshold", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "adminPauseTransfers", outputs: [], stateMutability: "nonpayable", type: "function", @@ -578,32 +646,66 @@ const _abi = [ { inputs: [ { - internalType: "uint256", - name: "newThreshold", - type: "uint256", + internalType: "bytes32", + name: "resourceID", + type: "bytes32", + }, + { + internalType: "address", + name: "contractAddress", + type: "address", }, ], - name: "adminChangeRelayerThreshold", + name: "adminRemoveGenericResource", outputs: [], stateMutability: "nonpayable", type: "function", }, { - inputs: [], - name: "adminPauseTransfers", + inputs: [ + { + internalType: "address", + name: "relayerAddress", + type: "address", + }, + ], + name: "adminRemoveRelayer", outputs: [], stateMutability: "nonpayable", type: "function", }, { inputs: [ + { + internalType: "bytes32", + name: "resourceID", + type: "bytes32", + }, { internalType: "address", - name: "relayerAddress", + name: "tokenAddress", type: "address", }, + { + internalType: "bool", + name: "isNative", + type: "bool", + }, ], - name: "adminRemoveRelayer", + name: "adminRemoveResourceId", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint8", + name: "destinationDomainID", + type: "uint8", + }, + ], + name: "adminRemoveSpecialFee", outputs: [], stateMutability: "nonpayable", type: "function", @@ -657,6 +759,19 @@ const _abi = [ stateMutability: "nonpayable", type: "function", }, + { + inputs: [ + { + internalType: "uint256", + name: "newFee", + type: "uint256", + }, + ], + name: "adminSetFee", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, { inputs: [ { @@ -699,7 +814,7 @@ const _abi = [ }, { internalType: "uint256", - name: "depositFunctionDepositerOffset", + name: "depositFunctionDepositorOffset", type: "uint256", }, { @@ -715,6 +830,11 @@ const _abi = [ }, { inputs: [ + { + internalType: "address", + name: "handlerAddress", + type: "address", + }, { internalType: "bytes32", name: "resourceID", @@ -722,7 +842,7 @@ const _abi = [ }, { internalType: "address", - name: "nativeAddress", + name: "tokenAddress", type: "address", }, { @@ -731,20 +851,7 @@ const _abi = [ type: "bool", }, ], - name: "adminSetNative", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [ - { - internalType: "address", - name: "handlerAddress", - type: "address", - }, - ], - name: "adminSetNativeResource", + name: "adminSetResource", outputs: [], stateMutability: "nonpayable", type: "function", @@ -752,22 +859,17 @@ const _abi = [ { inputs: [ { - internalType: "address", - name: "handlerAddress", - type: "address", - }, - { - internalType: "bytes32", - name: "resourceID", - type: "bytes32", + internalType: "uint8", + name: "destinationDomainID", + type: "uint8", }, { - internalType: "address", - name: "tokenAddress", - type: "address", + internalType: "uint256", + name: "_specialFee", + type: "uint256", }, ], - name: "adminSetResource", + name: "adminSetSpecialFee", outputs: [], stateMutability: "nonpayable", type: "function", @@ -815,40 +917,6 @@ const _abi = [ stateMutability: "nonpayable", type: "function", }, - { - inputs: [ - { - internalType: "uint8", - name: "destinationDomainID", - type: "uint8", - }, - { - internalType: "bytes32", - name: "resourceID", - type: "bytes32", - }, - { - internalType: "bytes", - name: "depositData", - type: "bytes", - }, - { - internalType: "bytes", - name: "feeData", - type: "bytes", - }, - ], - name: "calculateFee", - outputs: [ - { - internalType: "uint256", - name: "", - type: "uint256", - }, - ], - stateMutability: "view", - type: "function", - }, { inputs: [ { @@ -972,6 +1040,25 @@ const _abi = [ stateMutability: "nonpayable", type: "function", }, + { + inputs: [ + { + internalType: "uint8", + name: "destinationDomainID", + type: "uint8", + }, + ], + name: "getFee", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, { inputs: [ { @@ -1256,6 +1343,44 @@ const _abi = [ stateMutability: "nonpayable", type: "function", }, + { + inputs: [ + { + internalType: "uint8", + name: "", + type: "uint8", + }, + ], + name: "special", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint8", + name: "", + type: "uint8", + }, + ], + name: "specialFee", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, { inputs: [ { @@ -1269,7 +1394,7 @@ const _abi = [ type: "uint256[]", }, ], - name: "transferFunds", + name: "transferFee", outputs: [], stateMutability: "nonpayable", type: "function",