From 4e49e8ed77004730c002c7aec4b31fe444bdeceb Mon Sep 17 00:00:00 2001 From: Karl Kempe Date: Mon, 24 Jan 2022 00:02:12 +0000 Subject: [PATCH] Updates --- asset-manifest.json | 6 +++--- index.html | 2 +- .../js/{main.6d2c5267.chunk.js => main.5252a854.chunk.js} | 4 ++-- static/js/main.5252a854.chunk.js.map | 1 + static/js/main.6d2c5267.chunk.js.map | 1 - 5 files changed, 7 insertions(+), 7 deletions(-) rename static/js/{main.6d2c5267.chunk.js => main.5252a854.chunk.js} (98%) create mode 100644 static/js/main.5252a854.chunk.js.map delete mode 100644 static/js/main.6d2c5267.chunk.js.map diff --git a/asset-manifest.json b/asset-manifest.json index 83bf99a..fd728ce 100644 --- a/asset-manifest.json +++ b/asset-manifest.json @@ -1,8 +1,8 @@ { "files": { "main.css": "/wormhole-nativeswap-example/static/css/main.a55348bc.chunk.css", - "main.js": "/wormhole-nativeswap-example/static/js/main.6d2c5267.chunk.js", - "main.js.map": "/wormhole-nativeswap-example/static/js/main.6d2c5267.chunk.js.map", + "main.js": "/wormhole-nativeswap-example/static/js/main.5252a854.chunk.js", + "main.js.map": "/wormhole-nativeswap-example/static/js/main.5252a854.chunk.js.map", "runtime-main.js": "/wormhole-nativeswap-example/static/js/runtime-main.042f3d2b.js", "runtime-main.js.map": "/wormhole-nativeswap-example/static/js/runtime-main.042f3d2b.js.map", "static/js/2.069fda70.chunk.js": "/wormhole-nativeswap-example/static/js/2.069fda70.chunk.js", @@ -38,6 +38,6 @@ "static/js/runtime-main.042f3d2b.js", "static/js/2.069fda70.chunk.js", "static/css/main.a55348bc.chunk.css", - "static/js/main.6d2c5267.chunk.js" + "static/js/main.5252a854.chunk.js" ] } \ No newline at end of file diff --git a/index.html b/index.html index e114518..da0dc44 100644 --- a/index.html +++ b/index.html @@ -1 +1 @@ -NativeSwap
\ No newline at end of file +NativeSwap
\ No newline at end of file diff --git a/static/js/main.6d2c5267.chunk.js b/static/js/main.5252a854.chunk.js similarity index 98% rename from static/js/main.6d2c5267.chunk.js rename to static/js/main.5252a854.chunk.js index 94f8c0f..bf5f3a6 100644 --- a/static/js/main.6d2c5267.chunk.js +++ b/static/js/main.5252a854.chunk.js @@ -1,2 +1,2 @@ -(this.webpackJsonpNativeSwap=this.webpackJsonpNativeSwap||[]).push([[0],{184:function(e,t){},401:function(e){e.exports=JSON.parse('{"a":[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"}]}')},409:function(e){e.exports=JSON.parse('{"a":[{"inputs":[{"internalType":"address","name":"_swapRouterAddress","type":"address"},{"internalType":"address","name":"_feeTokenAddress","type":"address"},{"internalType":"address","name":"_tokenBridgeAddress","type":"address"},{"internalType":"address","name":"_wrappedNativeAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_recipient","type":"address"},{"indexed":false,"internalType":"address","name":"_tokenOut","type":"address"},{"indexed":false,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amountOut","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"_success","type":"uint8"}],"name":"SwapResult","type":"event"},{"inputs":[],"name":"expectedVaaLength","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapRouter","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenBridgeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"typeExactIn","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"typeExactOut","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"typeNativeSwap","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"typeTokenSwap","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wrappedNative","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"},{"inputs":[{"internalType":"bytes","name":"encodedVaa","type":"bytes"}],"name":"recvAndSwapExactNativeIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"encodedVaa","type":"bytes"}],"name":"recvAndSwapExactIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMinimum","type":"uint256"},{"internalType":"uint256","name":"targetAmountOutMinimum","type":"uint256"},{"internalType":"address","name":"targetChainRecipient","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint24","name":"poolFee","type":"uint24"}],"internalType":"struct SwapHelper.ExactInParameters","name":"swapParams","type":"tuple"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint256","name":"relayerFee","type":"uint256"},{"internalType":"uint16","name":"targetChainId","type":"uint16"},{"internalType":"bytes32","name":"targetContractAddress","type":"bytes32"},{"internalType":"uint32","name":"nonce","type":"uint32"}],"name":"swapExactInAndTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMinimum","type":"uint256"},{"internalType":"uint256","name":"targetAmountOutMinimum","type":"uint256"},{"internalType":"address","name":"targetChainRecipient","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint24","name":"poolFee","type":"uint24"}],"internalType":"struct SwapHelper.ExactInParameters","name":"swapParams","type":"tuple"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint256","name":"relayerFee","type":"uint256"},{"internalType":"uint16","name":"targetChainId","type":"uint16"},{"internalType":"bytes32","name":"targetContractAddress","type":"bytes32"},{"internalType":"uint32","name":"nonce","type":"uint32"}],"name":"swapExactNativeInAndTransfer","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"encodedVaa","type":"bytes"}],"name":"recvAndSwapExactNativeOut","outputs":[{"internalType":"uint256","name":"amountInUsed","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"encodedVaa","type":"bytes"}],"name":"recvAndSwapExactOut","outputs":[{"internalType":"uint256","name":"amountInUsed","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMaximum","type":"uint256"},{"internalType":"uint256","name":"targetAmountOut","type":"uint256"},{"internalType":"address","name":"targetChainRecipient","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint24","name":"poolFee","type":"uint24"}],"internalType":"struct SwapHelper.ExactOutParameters","name":"swapParams","type":"tuple"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint256","name":"relayerFee","type":"uint256"},{"internalType":"uint16","name":"targetChainId","type":"uint16"},{"internalType":"bytes32","name":"targetContractAddress","type":"bytes32"},{"internalType":"uint32","name":"nonce","type":"uint32"}],"name":"swapExactOutAndTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMaximum","type":"uint256"},{"internalType":"uint256","name":"targetAmountOut","type":"uint256"},{"internalType":"address","name":"targetChainRecipient","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint24","name":"poolFee","type":"uint24"}],"internalType":"struct SwapHelper.ExactOutParameters","name":"swapParams","type":"tuple"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint256","name":"relayerFee","type":"uint256"},{"internalType":"uint16","name":"targetChainId","type":"uint16"},{"internalType":"bytes32","name":"targetContractAddress","type":"bytes32"},{"internalType":"uint32","name":"nonce","type":"uint32"}],"name":"swapExactNativeOutAndTransfer","outputs":[],"stateMutability":"payable","type":"function"}]}')},410:function(e){e.exports=JSON.parse('{"a":[{"inputs":[{"internalType":"address","name":"_swapRouterAddress","type":"address"},{"internalType":"address","name":"_feeTokenAddress","type":"address"},{"internalType":"address","name":"_tokenBridgeAddress","type":"address"},{"internalType":"address","name":"_wrappedNativeAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_recipient","type":"address"},{"indexed":false,"internalType":"address","name":"_tokenOut","type":"address"},{"indexed":false,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amountOut","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"_success","type":"uint8"}],"name":"SwapResult","type":"event"},{"inputs":[],"name":"expectedVaaLength","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapRouter","outputs":[{"internalType":"contract IUniswapRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenBridgeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"typeExactIn","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"typeExactOut","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"typeNativeSwap","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"typeTokenSwap","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wrappedNative","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"},{"inputs":[{"internalType":"bytes","name":"encodedVaa","type":"bytes"}],"name":"recvAndSwapExactNativeIn","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"encodedVaa","type":"bytes"}],"name":"recvAndSwapExactIn","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMinimum","type":"uint256"},{"internalType":"uint256","name":"targetAmountOutMinimum","type":"uint256"},{"internalType":"address","name":"targetChainRecipient","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint24","name":"poolFee","type":"uint24"}],"internalType":"struct SwapHelper.ExactInParameters","name":"swapParams","type":"tuple"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint256","name":"relayerFee","type":"uint256"},{"internalType":"uint16","name":"targetChainId","type":"uint16"},{"internalType":"bytes32","name":"targetContractAddress","type":"bytes32"},{"internalType":"uint32","name":"nonce","type":"uint32"}],"name":"swapExactInAndTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMinimum","type":"uint256"},{"internalType":"uint256","name":"targetAmountOutMinimum","type":"uint256"},{"internalType":"address","name":"targetChainRecipient","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint24","name":"poolFee","type":"uint24"}],"internalType":"struct SwapHelper.ExactInParameters","name":"swapParams","type":"tuple"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint256","name":"relayerFee","type":"uint256"},{"internalType":"uint16","name":"targetChainId","type":"uint16"},{"internalType":"bytes32","name":"targetContractAddress","type":"bytes32"},{"internalType":"uint32","name":"nonce","type":"uint32"}],"name":"swapExactNativeInAndTransfer","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"encodedVaa","type":"bytes"}],"name":"recvAndSwapExactNativeOut","outputs":[{"internalType":"uint256","name":"amountInUsed","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"encodedVaa","type":"bytes"}],"name":"recvAndSwapExactOut","outputs":[{"internalType":"uint256","name":"amountInUsed","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMaximum","type":"uint256"},{"internalType":"uint256","name":"targetAmountOut","type":"uint256"},{"internalType":"address","name":"targetChainRecipient","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint24","name":"poolFee","type":"uint24"}],"internalType":"struct SwapHelper.ExactOutParameters","name":"swapParams","type":"tuple"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint256","name":"relayerFee","type":"uint256"},{"internalType":"uint16","name":"targetChainId","type":"uint16"},{"internalType":"bytes32","name":"targetContractAddress","type":"bytes32"},{"internalType":"uint32","name":"nonce","type":"uint32"}],"name":"swapExactOutAndTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMaximum","type":"uint256"},{"internalType":"uint256","name":"targetAmountOut","type":"uint256"},{"internalType":"address","name":"targetChainRecipient","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint24","name":"poolFee","type":"uint24"}],"internalType":"struct SwapHelper.ExactOutParameters","name":"swapParams","type":"tuple"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint256","name":"relayerFee","type":"uint256"},{"internalType":"uint16","name":"targetChainId","type":"uint16"},{"internalType":"bytes32","name":"targetContractAddress","type":"bytes32"},{"internalType":"uint32","name":"nonce","type":"uint32"}],"name":"swapExactNativeOutAndTransfer","outputs":[],"stateMutability":"payable","type":"function"}]}')},433:function(e,t){},441:function(e,t){},444:function(e,t){},447:function(e,t){},466:function(e,t){},467:function(e,t){},590:function(e,t){},592:function(e,t){},603:function(e,t){},605:function(e,t){},615:function(e,t){},704:function(e,t,n){},705:function(e,t,n){"use strict";n.r(t);var a=n(770),r=n(769),i=n(220),s=n(45),o=n.n(s),u=n(28),c=n(12),p=n(1),d=n.n(p),l=n(752),m=n(765),y=n(143),f=n(759),h=n(751),b=n(771),v=n(768),x=n(50),g=n(0),w=n.n(g),O=n(753),k=n(754),j=n(19),T=Object(l.a)((function(e){return{root:{position:"relative"},button:{marginTop:e.spacing(2),textTransform:"none",width:"100%"},loader:{position:"absolute",bottom:0,left:"50%",marginLeft:-12,marginBottom:6},error:{marginTop:e.spacing(1),textAlign:"center"}}}));function A(e){var t=e.disabled,n=e.onClick,a=e.showLoader,r=e.error,i=e.children,s=e.className,o=T();return Object(j.jsxs)(j.Fragment,{children:[Object(j.jsxs)("div",{className:o.root,children:[Object(j.jsx)(O.a,{color:"primary",variant:"contained",className:s||o.button,disabled:t,onClick:n,children:i}),a?Object(j.jsx)(k.a,{size:24,color:"inherit",className:s||o.loader}):null]}),r?Object(j.jsx)(y.a,{color:"error",className:o.error,children:r}):null]})}var S=n(398),I=n.n(S),P=n(10),E=n(44),F=w.a.createContext({connect:function(){},disconnect:function(){},provider:void 0,chainId:void 0,signer:void 0,signerAddress:void 0,providerError:null}),N=function(e){var t=e.children,n=Object(g.useState)(null),a=Object(u.a)(n,2),r=a[0],i=a[1],s=Object(g.useState)(void 0),o=Object(u.a)(s,2),c=o[0],p=o[1],d=Object(g.useState)(void 0),l=Object(u.a)(d,2),m=l[0],y=l[1],f=Object(g.useState)(void 0),h=Object(u.a)(f,2),b=h[0],v=h[1],x=Object(g.useState)(void 0),w=Object(u.a)(x,2),O=w[0],k=w[1],T=Object(g.useCallback)((function(){i(null),I()().then((function(e){if(e){var t=new P.a.providers.Web3Provider(e,"any");t.send("eth_requestAccounts",[]).then((function(){i(null),p(t),t.getNetwork().then((function(e){y(e.chainId)})).catch((function(){i("An error occurred while getting the network")}));var n=t.getSigner();v(n),n.getAddress().then((function(e){k(e)})).catch((function(){i("An error occurred while getting the signer address")})),e&&e.on&&(e.on("chainChanged",(function(e){try{y(E.a.from(e).toNumber())}catch(t){}})),e.on("accountsChanged",(function(e){try{var n=t.getSigner();v(n),n.getAddress().then((function(e){k(e)})).catch((function(){i("An error occurred while getting the signer address")}))}catch(a){}})))})).catch((function(){i("An error occurred while requesting eth accounts")}))}else i("Please install MetaMask")})).catch((function(){i("Please install MetaMask")}))}),[]),A=Object(g.useCallback)((function(){i(null),p(void 0),y(void 0),v(void 0),k(void 0)}),[]),S=Object(g.useMemo)((function(){return{connect:T,disconnect:A,provider:c,chainId:m,signer:b,signerAddress:O,providerError:r}}),[T,A,c,m,b,O,r]);return Object(j.jsx)(F.Provider,{value:S,children:t})},C=function(){return Object(g.useContext)(F)},M=n(776),U=Object(l.a)((function(e){return{button:{display:"block",margin:"".concat(e.spacing(1),"px auto"),width:"100%",maxWidth:400}}})),R=function(e){var t=e.connect,n=e.disconnect,a=e.connected,r=e.pk,i=U(),s=r.startsWith("0x");return a?Object(j.jsx)(M.a,{title:r,children:Object(j.jsxs)(O.a,{color:"secondary",variant:"contained",size:"small",onClick:n,className:i.button,children:["Disconnect ",r.substring(0,s?6:3),"...",r.substr(r.length-(s?4:3))]})}):Object(j.jsx)(O.a,{color:"primary",variant:"contained",size:"small",onClick:t,className:i.button,children:"Connect Wallet"})},B=function(){var e=C(),t=e.connect,n=e.disconnect,a=e.signerAddress,r=e.providerError;return Object(j.jsxs)(j.Fragment,{children:[Object(j.jsx)(R,{connect:t,disconnect:n,connected:!!a,pk:a||""}),r?Object(j.jsx)(y.a,{variant:"body2",color:"error",children:r}):null]})},D=n(777),V=n(757),_=n(758),q=Object(l.a)((function(e){return{select:{"& .MuiSelect-root":{display:"flex",alignItems:"center"}},listItemIcon:{minWidth:40},icon:{height:24,maxWidth:24}}}));function W(e){var t=e.tokens,n=e.value,a=e.onChange,r=e.disabled,i=q();return Object(j.jsx)(b.a,{value:n,onChange:a,select:!0,variant:"outlined",fullWidth:!0,className:i.select,disabled:r,children:t.map((function(e){return function(e,t){var n=e.name,a=e.logo;return Object(j.jsxs)(D.a,{value:n,children:[Object(j.jsx)(V.a,{className:t.listItemIcon,children:Object(j.jsx)("img",{src:a,alt:n,className:t.icon})}),Object(j.jsx)(_.a,{children:n})]},n)}(e,i)}))})}var z=n.p+"static/media/eth.364436c5.svg",L=n.p+"static/media/polygon.97ff139c.svg",H={name:"MATIC",address:"0x9c3c9283d3e44854697cd22d3faa240cfb032889",chainId:x.b,logo:L,isNative:!0,maxAmount:.1},G={name:"WMATIC",address:"0x9c3c9283d3e44854697cd22d3faa240cfb032889",chainId:x.b,logo:L,isNative:!1,maxAmount:.1},Q={name:"ETH",address:"0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6",chainId:x.a,logo:z,isNative:!0,maxAmount:.01},J={name:"WETH",address:"0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6",chainId:x.a,logo:z,isNative:!1,maxAmount:.01},X=[H,G,Q,J],K=80001,Y=function(e){return e===x.a?5:e===x.b?K:void 0},Z=["https://wormhole-v2-testnet-api.certus.one"],$=n(775),ee=n(412),te="#1975e6",ne="rgba(25, 117, 230, 0.8)",ae="#4e4e54",re="#0ac2af",ie="rgba(10, 194, 175, 0.8)",se="rgba(51, 242, 223, 1)",oe="#83b9fc",ue="#000008",ce="rgba(0,0,0,.25)",pe="#aa0818",de=Object($.a)(Object(ee.a)({palette:{type:"dark",background:{default:ue,paper:ue},divider:ae,text:{primary:"rgba(255,255,255,0.98)"},primary:{main:ne,light:oe},secondary:{main:ie,light:se},error:{main:pe}},typography:{fontFamily:"'Sora', sans-serif",h1:{fontWeight:"200"},h2:{fontWeight:"200"},h4:{fontWeight:"500"}},overrides:{MuiCssBaseline:{"@global":{"*":{scrollbarWidth:"thin",scrollbarColor:"".concat(ae," ").concat(ce)},"*::-webkit-scrollbar":{width:"8px",height:"8px",backgroundColor:ce},"*::-webkit-scrollbar-thumb":{backgroundColor:ae,borderRadius:"4px"},"*::-webkit-scrollbar-corner":{backgroundColor:"transparent"}}},MuiAccordion:{root:{backgroundColor:ce,"&:before":{display:"none"}},rounded:{"&:first-child":{borderTopLeftRadius:"16px",borderTopRightRadius:"16px"},"&:last-child":{borderBottomLeftRadius:"16px",borderBottomRightRadius:"16px"}}},MuiAlert:{root:{borderRadius:"8px",border:"1px solid"}},MuiButton:{root:{borderRadius:"5px",textTransform:"none"}},MuiLink:{root:{color:oe}},MuiPaper:{rounded:{borderRadius:"16px"}},MuiStepper:{root:{backgroundColor:"transparent",padding:0}},MuiStep:{root:{backgroundColor:ce,borderRadius:"16px",padding:16}},MuiStepConnector:{lineVertical:{borderLeftWidth:0}},MuiStepContent:{root:{borderLeftWidth:0}},MuiStepLabel:{label:{fontSize:16,fontWeight:"300","&.MuiStepLabel-active":{fontWeight:"300"},"&.MuiStepLabel-completed":{fontWeight:"300"}}},MuiTab:{root:{fontSize:18,fontWeight:"300",padding:12,textTransform:"none"}}}})),le=n.p+"static/media/wormhole-network.5bb90ed1.svg",me=n(9),ye=n(8),fe=n(27),he=n(15),be=n(16),ve=n(57),xe=n(49),ge=n(14),we=n(261),Oe=n(126),ke=Object(ye.a)((function e(){Object(me.a)(this,e)})),je=n(401),Te=function(e){Object(he.a)(n,e);var t=Object(be.a)(n);function n(){var e;Object(me.a)(this,n);for(var a=arguments.length,r=new Array(a),i=0;i * > .MuiInputBase-input":{textAlign:"center",height:"100%",flexGrow:"1",fontSize:"3rem",fontFamily:"Roboto Mono, monospace",caretShape:"block","&::-webkit-outer-spin-button, &::-webkit-inner-spin-button":{"-webkit-appearance":"none","-moz-appearance":"none",margin:0},"&[type=number]":{"-webkit-appearance":"textfield","-moz-appearance":"textfield"}},"& > * > input::-webkit-inner-spin-button":{webkitAppearance:"none",margin:"0"}},gradientButton:{backgroundImage:"linear-gradient(45deg, ".concat(te," 0%, ").concat(ue,"20 50%, ").concat(te,"30 62%, ").concat(ue,"50 120%)"),transition:"0.75s",backgroundSize:"200% auto",boxShadow:"0 0 20px #222","&:hover":{backgroundPosition:"right center"},width:"100%",height:"3rem",marginTop:"1rem"},disabled:{background:ae},spacer:{height:"1rem"},titleBar:{marginTop:"10rem","& > *":{margin:".5rem",alignSelf:"flex-end"}},tokenSelectWrapper:{display:"flex",alignItems:"center"},wormholeIcon:{height:60,filter:"contrast(0)",transition:"filter 0.5s","&:hover":{filter:"contrast(1)"},verticalAlign:"middle",margin:"1rem",display:"inline-block"},loaderHolder:{display:"flex",justifyContent:"center",flexDirection:"column",alignItems:"center"},successIcon:{color:re,fontSize:"200px"},swapPath:{display:"inline-flex",alignItems:"center"}}})),zt=function(){var e=Object(c.a)(d.a.mark((function e(t,n){var a;return d.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(void 0!==(a=Y(n))){e.next=3;break}throw new Error("Unknown chainId");case 3:return e.next=5,t.send("wallet_switchEthereumChain",[{chainId:Object(xt.hexStripZeros)(Object(xt.hexlify)(a))}]);case 5:return e.next=7,t.getNetwork();case 7:if(e.sent.chainId===a){e.next=10;break}throw new Error("Could not switch network");case 10:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}();function Lt(){var e=Wt(),t=Object(g.useState)(H),n=Object(u.a)(t,2),a=n[0],r=n[1],s=Object(g.useState)(Q),o=Object(u.a)(s,2),p=o[0],l=o[1],w=Object(g.useState)(""),O=Object(u.a)(w,2),k=O[0],T=O[1],S=Object(g.useState)(""),I=Object(u.a)(S,2),P=I[0],E=I[1],F=Object(g.useState)(""),N=Object(u.a)(F,2),M=N[0],U=N[1],R=Object(g.useState)("30"),D=Object(u.a)(R,2),V=D[0],_=D[1],q=Object(g.useState)("1"),z=Object(u.a)(q,2),L=z[0],K=z[1],Y=Object(g.useState)(null),$=Object(u.a)(Y,2),ee=$[0],te=$[1],ne=Object(g.useState)(!1),ae=Object(u.a)(ne,2),re=ae[0],ie=ae[1],se=Object(g.useState)(!1),oe=Object(u.a)(se,2),ue=oe[0],ce=oe[1],pe=Object(g.useState)(!1),de=Object(u.a)(pe,2),me=de[0],ye=de[1],fe=C(),he=fe.provider,be=fe.signer,ve=Object(i.b)().enqueueSnackbar,xe=Object(g.useState)(!1),ge=Object(u.a)(xe,2),we=ge[0],Oe=ge[1],ke=Object(g.useState)(!1),je=Object(u.a)(ke,2),Te=je[0],Ae=je[1],Se=Object(g.useState)(void 0),Ie=Object(u.a)(Se,2),Pe=Ie[0],Ee=Ie[1],Fe=Object(g.useState)(!1),Ne=Object(u.a)(Fe,2),Ce=Ne[0],Me=Ne[1],Ue=Object(g.useState)(""),Re=Object(u.a)(Ue,2),Be=Re[0],De=Re[1],Ve=Object(g.useCallback)((function(){Object(c.a)(d.a.mark((function e(){var t,n;return d.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(ye(!1),ce(!0),U(""),E(""),e.prev=4,!(parseFloat(k)>0)||isNaN(parseFloat(V))||isNaN(parseFloat(L))){e.next=23;break}return t=new vt,e.next=9,t.initialize(a.address,p.address,a.isNative);case 9:return e.next=11,t.computeAndVerifySrcPoolAddress().catch((function(e){throw new Error("failed to verify source pool address")}));case 11:return e.next=13,t.computeAndVerifyDstPoolAddress().catch((function(e){throw new Error("failed to verify dest pool address")}));case 13:return t.setDeadlines((60*parseFloat(V)).toString()),t.setSlippage((parseFloat(L)/100).toString()),t.setRelayerFee("0.25"),e.next=18,t.computeQuoteExactIn(k);case 18:n=e.sent,te(t),U(parseFloat(t.tokens.dstOut.formatAmount(n.dst.minAmountOut)).toFixed(8)),E(parseFloat(t.tokens.dstIn.formatAmount(n.dst.amountIn)).toFixed(2)),ye(!0);case 23:e.next=29;break;case 25:e.prev=25,e.t0=e.catch(4),console.error(e.t0),ve(null,{content:Object(j.jsx)(wt.a,{severity:"error",children:kt(e.t0)})});case 29:ce(!1);case 30:case"end":return e.stop()}}),e,null,[[4,25]])})))()}),[a,p,k,V,L,ve]),_e=Object(gt.a)(Ve,1e3);Object(g.useEffect)((function(){_e()}),[a,p,k,V,L,_e]);var qe=Object(g.useCallback)((function(e){T(e.target.value)}),[]),We=Object(g.useCallback)((function(e){K(e)}),[]),ze=Object(g.useCallback)((function(e){_(e)}),[]),Le=Object(g.useCallback)((function(e){e.target.value===G.name?(r(G),l(J)):e.target.value===J.name?(r(J),l(G)):e.target.value===Q.name?(r(Q),l(H)):(r(H),l(Q)),T(""),U("")}),[]),He=Object(g.useCallback)((function(){ie(!1),ye(!1),Oe(!1),Ae(!1),T(""),U(""),Ee(void 0),De("")}),[]),Ge=Object(g.useCallback)(Object(c.a)(d.a.mark((function e(){var t,n,r,i;return d.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!(he&&be&&ee)){e.next=39;break}return e.prev=1,ie(!0),Oe(!1),Me(!1),Ae(!1),De(""),e.next=9,zt(he,a.chainId);case 9:return e.next=11,ee.approveAndSwap(be);case 11:return t=e.sent,console.info("firstSwapTransactionHash:",t.transactionHash),Oe(!0),Ee(t.blockNumber),e.next=17,Object(x.i)(Z,ee.srcExecutionParams.wormhole.chainId,ee.vaaSearchParams.emitterAddress,ee.vaaSearchParams.sequence);case 17:return n=e.sent,r=n.vaaBytes,Me(!0),e.next=22,Mt(ee.dstExecutionParams.wormhole.tokenBridgeAddress,ee.quoter.dstProvider,r,3e3,40);case 22:if(e.sent){e.next=31;break}return De("Timed out waiting for relayer to complete swap. You'll need to complete it yourself."),e.next=27,zt(he,p.chainId);case 27:return e.next=29,ee.fetchVaaAndSwap(be);case 29:i=e.sent,console.info("secondSwapTransactionHash:",i.transactionHash);case 31:Ae(!0),e.next=39;break;case 34:e.prev=34,e.t0=e.catch(1),He(),console.error(e.t0),ve(null,{content:Object(j.jsx)(wt.a,{severity:"error",children:kt(e.t0)})});case 39:case"end":return e.stop()}}),e,null,[[1,34]])}))),[he,be,ee,ve,a,p,He]),Qe=he&&be&&me;return Object(j.jsx)("div",{className:e.bg,children:Object(j.jsxs)(m.a,{className:e.centeredContainer,maxWidth:"sm",children:[Object(j.jsx)("div",{className:e.titleBar}),Object(j.jsx)(y.a,{variant:"h4",color:"textSecondary",children:"Wormhole NativeSwap Demo"}),Object(j.jsx)("div",{className:e.spacer}),Object(j.jsxs)(f.a,{className:e.mainPaper,children:[Object(j.jsxs)(h.a,{in:!we,children:[Object(j.jsx)(Ct,{disabled:re||ue,slippage:L,deadline:V,onSlippageChange:We,onDeadlineChange:ze}),Object(j.jsx)(W,{tokens:X,value:a.name,onChange:Le,disabled:re||ue}),Object(j.jsx)(y.a,{variant:"subtitle1",children:"Send"}),Object(j.jsx)(b.a,{type:"number",value:k,disabled:re||ue||parseFloat(k)>a.maxAmount,InputProps:{disableUnderline:!0},className:e.numberField,onChange:qe,placeholder:"0.0"}),parseFloat(k)>a.maxAmount?Object(j.jsx)(y.a,{variant:"subtitle2",color:"error",children:"The max input amount is ".concat(a.maxAmount," ").concat(a.name)}):null,Object(j.jsx)("div",{className:e.spacer}),Object(j.jsx)(W,{tokens:X,value:p.name,onChange:function(){},disabled:!0}),Object(j.jsx)(y.a,{variant:"subtitle1",children:"Receive (estimated)"}),Object(j.jsx)(b.a,{type:"number",value:M,autoFocus:!0,InputProps:{disableUnderline:!0},className:e.numberField,inputProps:{readOnly:!0},placeholder:"0.0"}),Object(j.jsx)(y.a,{variant:"subtitle2",children:"Slippage tolerance: ".concat(L,"%")}),!re&&Object(j.jsx)(B,{}),Object(j.jsx)(A,{disabled:!Qe||re,showLoader:re,onClick:Ge,children:"Swap"})]}),Object(j.jsx)(h.a,{in:we&&!Te,children:Object(j.jsxs)("div",{className:e.loaderHolder,children:[Object(j.jsx)(Rt,{}),Object(j.jsx)("div",{className:e.spacer}),Object(j.jsx)(y.a,{variant:"h5",children:"Your ".concat(a.name," is being swapped to ").concat(p.name)})]})}),Object(j.jsx)(h.a,{in:Te,children:Object(j.jsxs)("div",{className:e.loaderHolder,children:[Object(j.jsx)(Bt.a,{className:e.successIcon,fontSize:"inherit"}),Object(j.jsx)(y.a,{children:"Swap completed!"}),Object(j.jsx)(A,{onClick:function(){return He()},children:"Swap more tokens!"})]})}),Object(j.jsx)("div",{className:e.spacer}),me&&Object(j.jsxs)(y.a,{variant:"subtitle1",className:e.swapPath,children:["".concat(k," ").concat(a.name),Object(j.jsx)(Dt.a,{fontSize:"inherit",style:{margin:"10px"}}),"".concat(P," UST "),Object(j.jsx)(Dt.a,{fontSize:"inherit",style:{margin:"10px"}}),"".concat(M," ").concat(p.name)]}),we&&!Te&&!Be&&Object(j.jsx)(qt,{chainId:a.chainId,txBlockNumber:Pe,step:Ce?Te?3:2:1}),Be&&Object(j.jsx)(y.a,{variant:"subtitle1",children:Be}),Object(j.jsx)("div",{className:e.spacer}),Object(j.jsx)(y.a,{variant:"subtitle2",color:"error",children:"WARNING: this is a Testnet release only"})]}),Object(j.jsx)("div",{className:e.spacer}),Object(j.jsx)(y.a,{variant:"subtitle1",color:"textSecondary",children:"powered by wormhole"}),Object(j.jsx)("img",{src:le,alt:"Wormhole",className:e.wormholeIcon}),Object(j.jsx)("div",{className:e.spacer}),Object(j.jsx)(v.a,{variant:"subtitle2",href:"https://goerli-faucet.slock.it/",children:"Goerli faucet"}),Object(j.jsx)("div",{}),Object(j.jsx)(v.a,{href:"https://faucet.polygon.technology/",children:"Mumbai faucet"})]})})}function Ht(){return Object(j.jsx)(Lt,{})}var Gt=function(e){Object(he.a)(n,e);var t=Object(be.a)(n);function n(e){var a;return Object(me.a)(this,n),(a=t.call(this,e)).state={hasError:!1},a}return Object(ye.a)(n,[{key:"componentDidCatch",value:function(e,t){console.error(e,t)}},{key:"render",value:function(){return this.state.hasError?Object(j.jsx)(y.a,{variant:"h5",style:{textAlign:"center",marginTop:24},children:'"An unexpected error has occurred. Please refresh the page."'}):this.props.children}}],[{key:"getDerivedStateFromError",value:function(e){return{hasError:!0}}}]),n}(w.a.Component);o.a.render(Object(j.jsx)(Gt,{children:Object(j.jsx)(r.a,{theme:de,children:Object(j.jsx)(a.a,{children:Object(j.jsx)(N,{children:Object(j.jsx)(i.a,{maxSnack:3,children:Object(j.jsx)(Ht,{})})})})})}),document.getElementById("root"))}},[[705,1,2]]]); -//# sourceMappingURL=main.6d2c5267.chunk.js.map \ No newline at end of file +(this.webpackJsonpNativeSwap=this.webpackJsonpNativeSwap||[]).push([[0],{184:function(e,t){},401:function(e){e.exports=JSON.parse('{"a":[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"}]}')},409:function(e){e.exports=JSON.parse('{"a":[{"inputs":[{"internalType":"address","name":"_swapRouterAddress","type":"address"},{"internalType":"address","name":"_feeTokenAddress","type":"address"},{"internalType":"address","name":"_tokenBridgeAddress","type":"address"},{"internalType":"address","name":"_wrappedNativeAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_recipient","type":"address"},{"indexed":false,"internalType":"address","name":"_tokenOut","type":"address"},{"indexed":false,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amountOut","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"_success","type":"uint8"}],"name":"SwapResult","type":"event"},{"inputs":[],"name":"expectedVaaLength","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapRouter","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenBridgeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"typeExactIn","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"typeExactOut","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"typeNativeSwap","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"typeTokenSwap","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wrappedNative","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"},{"inputs":[{"internalType":"bytes","name":"encodedVaa","type":"bytes"}],"name":"recvAndSwapExactNativeIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"encodedVaa","type":"bytes"}],"name":"recvAndSwapExactIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMinimum","type":"uint256"},{"internalType":"uint256","name":"targetAmountOutMinimum","type":"uint256"},{"internalType":"address","name":"targetChainRecipient","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint24","name":"poolFee","type":"uint24"}],"internalType":"struct SwapHelper.ExactInParameters","name":"swapParams","type":"tuple"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint256","name":"relayerFee","type":"uint256"},{"internalType":"uint16","name":"targetChainId","type":"uint16"},{"internalType":"bytes32","name":"targetContractAddress","type":"bytes32"},{"internalType":"uint32","name":"nonce","type":"uint32"}],"name":"swapExactInAndTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMinimum","type":"uint256"},{"internalType":"uint256","name":"targetAmountOutMinimum","type":"uint256"},{"internalType":"address","name":"targetChainRecipient","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint24","name":"poolFee","type":"uint24"}],"internalType":"struct SwapHelper.ExactInParameters","name":"swapParams","type":"tuple"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint256","name":"relayerFee","type":"uint256"},{"internalType":"uint16","name":"targetChainId","type":"uint16"},{"internalType":"bytes32","name":"targetContractAddress","type":"bytes32"},{"internalType":"uint32","name":"nonce","type":"uint32"}],"name":"swapExactNativeInAndTransfer","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"encodedVaa","type":"bytes"}],"name":"recvAndSwapExactNativeOut","outputs":[{"internalType":"uint256","name":"amountInUsed","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"encodedVaa","type":"bytes"}],"name":"recvAndSwapExactOut","outputs":[{"internalType":"uint256","name":"amountInUsed","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMaximum","type":"uint256"},{"internalType":"uint256","name":"targetAmountOut","type":"uint256"},{"internalType":"address","name":"targetChainRecipient","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint24","name":"poolFee","type":"uint24"}],"internalType":"struct SwapHelper.ExactOutParameters","name":"swapParams","type":"tuple"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint256","name":"relayerFee","type":"uint256"},{"internalType":"uint16","name":"targetChainId","type":"uint16"},{"internalType":"bytes32","name":"targetContractAddress","type":"bytes32"},{"internalType":"uint32","name":"nonce","type":"uint32"}],"name":"swapExactOutAndTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMaximum","type":"uint256"},{"internalType":"uint256","name":"targetAmountOut","type":"uint256"},{"internalType":"address","name":"targetChainRecipient","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint24","name":"poolFee","type":"uint24"}],"internalType":"struct SwapHelper.ExactOutParameters","name":"swapParams","type":"tuple"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint256","name":"relayerFee","type":"uint256"},{"internalType":"uint16","name":"targetChainId","type":"uint16"},{"internalType":"bytes32","name":"targetContractAddress","type":"bytes32"},{"internalType":"uint32","name":"nonce","type":"uint32"}],"name":"swapExactNativeOutAndTransfer","outputs":[],"stateMutability":"payable","type":"function"}]}')},410:function(e){e.exports=JSON.parse('{"a":[{"inputs":[{"internalType":"address","name":"_swapRouterAddress","type":"address"},{"internalType":"address","name":"_feeTokenAddress","type":"address"},{"internalType":"address","name":"_tokenBridgeAddress","type":"address"},{"internalType":"address","name":"_wrappedNativeAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_recipient","type":"address"},{"indexed":false,"internalType":"address","name":"_tokenOut","type":"address"},{"indexed":false,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amountOut","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"_success","type":"uint8"}],"name":"SwapResult","type":"event"},{"inputs":[],"name":"expectedVaaLength","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapRouter","outputs":[{"internalType":"contract IUniswapRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenBridgeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"typeExactIn","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"typeExactOut","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"typeNativeSwap","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"typeTokenSwap","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wrappedNative","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"},{"inputs":[{"internalType":"bytes","name":"encodedVaa","type":"bytes"}],"name":"recvAndSwapExactNativeIn","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"encodedVaa","type":"bytes"}],"name":"recvAndSwapExactIn","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMinimum","type":"uint256"},{"internalType":"uint256","name":"targetAmountOutMinimum","type":"uint256"},{"internalType":"address","name":"targetChainRecipient","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint24","name":"poolFee","type":"uint24"}],"internalType":"struct SwapHelper.ExactInParameters","name":"swapParams","type":"tuple"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint256","name":"relayerFee","type":"uint256"},{"internalType":"uint16","name":"targetChainId","type":"uint16"},{"internalType":"bytes32","name":"targetContractAddress","type":"bytes32"},{"internalType":"uint32","name":"nonce","type":"uint32"}],"name":"swapExactInAndTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMinimum","type":"uint256"},{"internalType":"uint256","name":"targetAmountOutMinimum","type":"uint256"},{"internalType":"address","name":"targetChainRecipient","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint24","name":"poolFee","type":"uint24"}],"internalType":"struct SwapHelper.ExactInParameters","name":"swapParams","type":"tuple"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint256","name":"relayerFee","type":"uint256"},{"internalType":"uint16","name":"targetChainId","type":"uint16"},{"internalType":"bytes32","name":"targetContractAddress","type":"bytes32"},{"internalType":"uint32","name":"nonce","type":"uint32"}],"name":"swapExactNativeInAndTransfer","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"encodedVaa","type":"bytes"}],"name":"recvAndSwapExactNativeOut","outputs":[{"internalType":"uint256","name":"amountInUsed","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"encodedVaa","type":"bytes"}],"name":"recvAndSwapExactOut","outputs":[{"internalType":"uint256","name":"amountInUsed","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMaximum","type":"uint256"},{"internalType":"uint256","name":"targetAmountOut","type":"uint256"},{"internalType":"address","name":"targetChainRecipient","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint24","name":"poolFee","type":"uint24"}],"internalType":"struct SwapHelper.ExactOutParameters","name":"swapParams","type":"tuple"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint256","name":"relayerFee","type":"uint256"},{"internalType":"uint16","name":"targetChainId","type":"uint16"},{"internalType":"bytes32","name":"targetContractAddress","type":"bytes32"},{"internalType":"uint32","name":"nonce","type":"uint32"}],"name":"swapExactOutAndTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMaximum","type":"uint256"},{"internalType":"uint256","name":"targetAmountOut","type":"uint256"},{"internalType":"address","name":"targetChainRecipient","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint24","name":"poolFee","type":"uint24"}],"internalType":"struct SwapHelper.ExactOutParameters","name":"swapParams","type":"tuple"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint256","name":"relayerFee","type":"uint256"},{"internalType":"uint16","name":"targetChainId","type":"uint16"},{"internalType":"bytes32","name":"targetContractAddress","type":"bytes32"},{"internalType":"uint32","name":"nonce","type":"uint32"}],"name":"swapExactNativeOutAndTransfer","outputs":[],"stateMutability":"payable","type":"function"}]}')},433:function(e,t){},441:function(e,t){},444:function(e,t){},447:function(e,t){},466:function(e,t){},467:function(e,t){},590:function(e,t){},592:function(e,t){},603:function(e,t){},605:function(e,t){},615:function(e,t){},704:function(e,t,n){},705:function(e,t,n){"use strict";n.r(t);var a=n(770),r=n(769),i=n(220),s=n(45),o=n.n(s),u=n(28),c=n(12),p=n(1),d=n.n(p),l=n(752),m=n(765),y=n(143),f=n(759),h=n(751),b=n(771),v=n(768),x=n(50),g=n(0),w=n.n(g),O=n(753),k=n(754),j=n(19),T=Object(l.a)((function(e){return{root:{position:"relative"},button:{marginTop:e.spacing(2),textTransform:"none",width:"100%"},loader:{position:"absolute",bottom:0,left:"50%",marginLeft:-12,marginBottom:6},error:{marginTop:e.spacing(1),textAlign:"center"}}}));function A(e){var t=e.disabled,n=e.onClick,a=e.showLoader,r=e.error,i=e.children,s=e.className,o=T();return Object(j.jsxs)(j.Fragment,{children:[Object(j.jsxs)("div",{className:o.root,children:[Object(j.jsx)(O.a,{color:"primary",variant:"contained",className:s||o.button,disabled:t,onClick:n,children:i}),a?Object(j.jsx)(k.a,{size:24,color:"inherit",className:s||o.loader}):null]}),r?Object(j.jsx)(y.a,{color:"error",className:o.error,children:r}):null]})}var S=n(398),I=n.n(S),P=n(10),E=n(44),F=w.a.createContext({connect:function(){},disconnect:function(){},provider:void 0,chainId:void 0,signer:void 0,signerAddress:void 0,providerError:null}),N=function(e){var t=e.children,n=Object(g.useState)(null),a=Object(u.a)(n,2),r=a[0],i=a[1],s=Object(g.useState)(void 0),o=Object(u.a)(s,2),c=o[0],p=o[1],d=Object(g.useState)(void 0),l=Object(u.a)(d,2),m=l[0],y=l[1],f=Object(g.useState)(void 0),h=Object(u.a)(f,2),b=h[0],v=h[1],x=Object(g.useState)(void 0),w=Object(u.a)(x,2),O=w[0],k=w[1],T=Object(g.useCallback)((function(){i(null),I()().then((function(e){if(e){var t=new P.a.providers.Web3Provider(e,"any");t.send("eth_requestAccounts",[]).then((function(){i(null),p(t),t.getNetwork().then((function(e){y(e.chainId)})).catch((function(){i("An error occurred while getting the network")}));var n=t.getSigner();v(n),n.getAddress().then((function(e){k(e)})).catch((function(){i("An error occurred while getting the signer address")})),e&&e.on&&(e.on("chainChanged",(function(e){try{y(E.a.from(e).toNumber())}catch(t){}})),e.on("accountsChanged",(function(e){try{var n=t.getSigner();v(n),n.getAddress().then((function(e){k(e)})).catch((function(){i("An error occurred while getting the signer address")}))}catch(a){}})))})).catch((function(){i("An error occurred while requesting eth accounts")}))}else i("Please install MetaMask")})).catch((function(){i("Please install MetaMask")}))}),[]),A=Object(g.useCallback)((function(){i(null),p(void 0),y(void 0),v(void 0),k(void 0)}),[]),S=Object(g.useMemo)((function(){return{connect:T,disconnect:A,provider:c,chainId:m,signer:b,signerAddress:O,providerError:r}}),[T,A,c,m,b,O,r]);return Object(j.jsx)(F.Provider,{value:S,children:t})},C=function(){return Object(g.useContext)(F)},M=n(776),U=Object(l.a)((function(e){return{button:{display:"block",margin:"".concat(e.spacing(1),"px auto"),width:"100%",maxWidth:400}}})),R=function(e){var t=e.connect,n=e.disconnect,a=e.connected,r=e.pk,i=U(),s=r.startsWith("0x");return a?Object(j.jsx)(M.a,{title:r,children:Object(j.jsxs)(O.a,{color:"secondary",variant:"contained",size:"small",onClick:n,className:i.button,children:["Disconnect ",r.substring(0,s?6:3),"...",r.substr(r.length-(s?4:3))]})}):Object(j.jsx)(O.a,{color:"primary",variant:"contained",size:"small",onClick:t,className:i.button,children:"Connect Wallet"})},B=function(){var e=C(),t=e.connect,n=e.disconnect,a=e.signerAddress,r=e.providerError;return Object(j.jsxs)(j.Fragment,{children:[Object(j.jsx)(R,{connect:t,disconnect:n,connected:!!a,pk:a||""}),r?Object(j.jsx)(y.a,{variant:"body2",color:"error",children:r}):null]})},D=n(777),V=n(757),_=n(758),q=Object(l.a)((function(e){return{select:{"& .MuiSelect-root":{display:"flex",alignItems:"center"}},listItemIcon:{minWidth:40},icon:{height:24,maxWidth:24}}}));function W(e){var t=e.tokens,n=e.value,a=e.onChange,r=e.disabled,i=q();return Object(j.jsx)(b.a,{value:n,onChange:a,select:!0,variant:"outlined",fullWidth:!0,className:i.select,disabled:r,children:t.map((function(e){return function(e,t){var n=e.name,a=e.logo;return Object(j.jsxs)(D.a,{value:n,children:[Object(j.jsx)(V.a,{className:t.listItemIcon,children:Object(j.jsx)("img",{src:a,alt:n,className:t.icon})}),Object(j.jsx)(_.a,{children:n})]},n)}(e,i)}))})}var z=n.p+"static/media/eth.364436c5.svg",L=n.p+"static/media/polygon.97ff139c.svg",H={name:"MATIC",address:"0x9c3c9283d3e44854697cd22d3faa240cfb032889",chainId:x.b,logo:L,isNative:!0,maxAmount:.1},G={name:"WMATIC",address:"0x9c3c9283d3e44854697cd22d3faa240cfb032889",chainId:x.b,logo:L,isNative:!1,maxAmount:.1},Q={name:"ETH",address:"0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6",chainId:x.a,logo:z,isNative:!0,maxAmount:.01},J={name:"WETH",address:"0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6",chainId:x.a,logo:z,isNative:!1,maxAmount:.01},X=[H,G,Q,J],K=80001,Y=function(e){return e===x.a?5:e===x.b?K:void 0},Z=["https://wormhole-v2-testnet-api.certus.one"],$=n(775),ee=n(412),te="#1975e6",ne="rgba(25, 117, 230, 0.8)",ae="#4e4e54",re="#0ac2af",ie="rgba(10, 194, 175, 0.8)",se="rgba(51, 242, 223, 1)",oe="#83b9fc",ue="#000008",ce="rgba(0,0,0,.25)",pe="#aa0818",de=Object($.a)(Object(ee.a)({palette:{type:"dark",background:{default:ue,paper:ue},divider:ae,text:{primary:"rgba(255,255,255,0.98)"},primary:{main:ne,light:oe},secondary:{main:ie,light:se},error:{main:pe}},typography:{fontFamily:"'Sora', sans-serif",h1:{fontWeight:"200"},h2:{fontWeight:"200"},h4:{fontWeight:"500"}},overrides:{MuiCssBaseline:{"@global":{"*":{scrollbarWidth:"thin",scrollbarColor:"".concat(ae," ").concat(ce)},"*::-webkit-scrollbar":{width:"8px",height:"8px",backgroundColor:ce},"*::-webkit-scrollbar-thumb":{backgroundColor:ae,borderRadius:"4px"},"*::-webkit-scrollbar-corner":{backgroundColor:"transparent"}}},MuiAccordion:{root:{backgroundColor:ce,"&:before":{display:"none"}},rounded:{"&:first-child":{borderTopLeftRadius:"16px",borderTopRightRadius:"16px"},"&:last-child":{borderBottomLeftRadius:"16px",borderBottomRightRadius:"16px"}}},MuiAlert:{root:{borderRadius:"8px",border:"1px solid"}},MuiButton:{root:{borderRadius:"5px",textTransform:"none"}},MuiLink:{root:{color:oe}},MuiPaper:{rounded:{borderRadius:"16px"}},MuiStepper:{root:{backgroundColor:"transparent",padding:0}},MuiStep:{root:{backgroundColor:ce,borderRadius:"16px",padding:16}},MuiStepConnector:{lineVertical:{borderLeftWidth:0}},MuiStepContent:{root:{borderLeftWidth:0}},MuiStepLabel:{label:{fontSize:16,fontWeight:"300","&.MuiStepLabel-active":{fontWeight:"300"},"&.MuiStepLabel-completed":{fontWeight:"300"}}},MuiTab:{root:{fontSize:18,fontWeight:"300",padding:12,textTransform:"none"}}}})),le=n.p+"static/media/wormhole-network.5bb90ed1.svg",me=n(9),ye=n(8),fe=n(27),he=n(15),be=n(16),ve=n(57),xe=n(49),ge=n(14),we=n(261),Oe=n(126),ke=Object(ye.a)((function e(){Object(me.a)(this,e)})),je=n(401),Te=function(e){Object(he.a)(n,e);var t=Object(be.a)(n);function n(){var e;Object(me.a)(this,n);for(var a=arguments.length,r=new Array(a),i=0;i * > .MuiInputBase-input":{textAlign:"center",height:"100%",flexGrow:"1",fontSize:"3rem",fontFamily:"Roboto Mono, monospace",caretShape:"block","&::-webkit-outer-spin-button, &::-webkit-inner-spin-button":{"-webkit-appearance":"none","-moz-appearance":"none",margin:0},"&[type=number]":{"-webkit-appearance":"textfield","-moz-appearance":"textfield"}},"& > * > input::-webkit-inner-spin-button":{webkitAppearance:"none",margin:"0"}},gradientButton:{backgroundImage:"linear-gradient(45deg, ".concat(te," 0%, ").concat(ue,"20 50%, ").concat(te,"30 62%, ").concat(ue,"50 120%)"),transition:"0.75s",backgroundSize:"200% auto",boxShadow:"0 0 20px #222","&:hover":{backgroundPosition:"right center"},width:"100%",height:"3rem",marginTop:"1rem"},disabled:{background:ae},spacer:{height:"1rem"},titleBar:{marginTop:"10rem","& > *":{margin:".5rem",alignSelf:"flex-end"}},tokenSelectWrapper:{display:"flex",alignItems:"center"},wormholeIcon:{height:60,filter:"contrast(0)",transition:"filter 0.5s","&:hover":{filter:"contrast(1)"},verticalAlign:"middle",margin:"1rem",display:"inline-block"},loaderHolder:{display:"flex",justifyContent:"center",flexDirection:"column",alignItems:"center"},successIcon:{color:re,fontSize:"200px"},swapPath:{display:"inline-flex",alignItems:"center"}}})),zt=function(){var e=Object(c.a)(d.a.mark((function e(t,n){var a;return d.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(void 0!==(a=Y(n))){e.next=3;break}throw new Error("Unknown chainId");case 3:return e.next=5,t.send("wallet_switchEthereumChain",[{chainId:Object(xt.hexStripZeros)(Object(xt.hexlify)(a))}]);case 5:return e.next=7,t.getNetwork();case 7:if(e.sent.chainId===a){e.next=10;break}throw new Error("Could not switch network");case 10:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}();function Lt(){var e=Wt(),t=Object(g.useState)(H),n=Object(u.a)(t,2),a=n[0],r=n[1],s=Object(g.useState)(Q),o=Object(u.a)(s,2),p=o[0],l=o[1],w=Object(g.useState)(""),O=Object(u.a)(w,2),k=O[0],T=O[1],S=Object(g.useState)(""),I=Object(u.a)(S,2),P=I[0],E=I[1],F=Object(g.useState)(""),N=Object(u.a)(F,2),M=N[0],U=N[1],R=Object(g.useState)("30"),D=Object(u.a)(R,2),V=D[0],_=D[1],q=Object(g.useState)("1"),z=Object(u.a)(q,2),L=z[0],K=z[1],Y=Object(g.useState)(null),$=Object(u.a)(Y,2),ee=$[0],te=$[1],ne=Object(g.useState)(!1),ae=Object(u.a)(ne,2),re=ae[0],ie=ae[1],se=Object(g.useState)(!1),oe=Object(u.a)(se,2),ue=oe[0],ce=oe[1],pe=Object(g.useState)(!1),de=Object(u.a)(pe,2),me=de[0],ye=de[1],fe=C(),he=fe.provider,be=fe.signer,ve=Object(i.b)().enqueueSnackbar,xe=Object(g.useState)(!1),ge=Object(u.a)(xe,2),we=ge[0],Oe=ge[1],ke=Object(g.useState)(!1),je=Object(u.a)(ke,2),Te=je[0],Ae=je[1],Se=Object(g.useState)(void 0),Ie=Object(u.a)(Se,2),Pe=Ie[0],Ee=Ie[1],Fe=Object(g.useState)(!1),Ne=Object(u.a)(Fe,2),Ce=Ne[0],Me=Ne[1],Ue=Object(g.useState)(""),Re=Object(u.a)(Ue,2),Be=Re[0],De=Re[1],Ve=Object(g.useCallback)((function(){Object(c.a)(d.a.mark((function e(){var t,n;return d.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(ye(!1),ce(!0),U(""),E(""),e.prev=4,!(parseFloat(k)>0)||isNaN(parseFloat(V))||isNaN(parseFloat(L))){e.next=23;break}return t=new vt,e.next=9,t.initialize(a.address,p.address,a.isNative);case 9:return e.next=11,t.computeAndVerifySrcPoolAddress().catch((function(e){throw new Error("failed to verify source pool address")}));case 11:return e.next=13,t.computeAndVerifyDstPoolAddress().catch((function(e){throw new Error("failed to verify dest pool address")}));case 13:return t.setDeadlines((60*parseFloat(V)).toString()),t.setSlippage((parseFloat(L)/100).toString()),t.setRelayerFee("0.25"),e.next=18,t.computeQuoteExactIn(k);case 18:n=e.sent,te(t),U(parseFloat(t.tokens.dstOut.formatAmount(n.dst.minAmountOut)).toFixed(8)),E(parseFloat(t.tokens.dstIn.formatAmount(n.dst.amountIn)).toFixed(2)),ye(!0);case 23:e.next=29;break;case 25:e.prev=25,e.t0=e.catch(4),console.error(e.t0),ve(null,{content:Object(j.jsx)(wt.a,{severity:"error",children:kt(e.t0)})});case 29:ce(!1);case 30:case"end":return e.stop()}}),e,null,[[4,25]])})))()}),[a,p,k,V,L,ve]),_e=Object(gt.a)(Ve,1e3);Object(g.useEffect)((function(){_e()}),[a,p,k,V,L,_e]);var qe=Object(g.useCallback)((function(e){T(e.target.value)}),[]),We=Object(g.useCallback)((function(e){K(e)}),[]),ze=Object(g.useCallback)((function(e){_(e)}),[]),Le=Object(g.useCallback)((function(e){e.target.value===G.name?(r(G),l(J)):e.target.value===J.name?(r(J),l(G)):e.target.value===Q.name?(r(Q),l(H)):(r(H),l(Q)),T(""),U("")}),[]),He=Object(g.useCallback)((function(){ie(!1),ye(!1),Oe(!1),Ae(!1),T(""),U(""),Ee(void 0),De("")}),[]),Ge=Object(g.useCallback)(Object(c.a)(d.a.mark((function e(){var t,n,r,i;return d.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!(he&&be&&ee)){e.next=39;break}return e.prev=1,ie(!0),Oe(!1),Me(!1),Ae(!1),De(""),e.next=9,zt(he,a.chainId);case 9:return e.next=11,ee.approveAndSwap(be);case 11:return t=e.sent,console.info("firstSwapTransactionHash:",t.transactionHash),Oe(!0),Ee(t.blockNumber),e.next=17,Object(x.i)(Z,ee.srcExecutionParams.wormhole.chainId,ee.vaaSearchParams.emitterAddress,ee.vaaSearchParams.sequence);case 17:return n=e.sent,r=n.vaaBytes,Me(!0),e.next=22,Mt(ee.dstExecutionParams.wormhole.tokenBridgeAddress,ee.quoter.dstProvider,r,3e3,40);case 22:if(e.sent){e.next=31;break}return De("Timed out waiting for relayer to complete swap. You'll need to complete it yourself."),e.next=27,zt(he,p.chainId);case 27:return e.next=29,ee.fetchVaaAndSwap(be);case 29:i=e.sent,console.info("secondSwapTransactionHash:",i.transactionHash);case 31:Ae(!0),e.next=39;break;case 34:e.prev=34,e.t0=e.catch(1),He(),console.error(e.t0),ve(null,{content:Object(j.jsx)(wt.a,{severity:"error",children:kt(e.t0)})});case 39:case"end":return e.stop()}}),e,null,[[1,34]])}))),[he,be,ee,ve,a,p,He]),Qe=he&&be&&me;return Object(j.jsx)("div",{className:e.bg,children:Object(j.jsxs)(m.a,{className:e.centeredContainer,maxWidth:"sm",children:[Object(j.jsx)("div",{className:e.titleBar}),Object(j.jsx)(y.a,{variant:"h4",color:"textSecondary",children:"Wormhole NativeSwap Demo"}),Object(j.jsx)("div",{className:e.spacer}),Object(j.jsxs)(f.a,{className:e.mainPaper,children:[Object(j.jsxs)(h.a,{in:!we,children:[Object(j.jsx)(Ct,{disabled:re||ue,slippage:L,deadline:V,onSlippageChange:We,onDeadlineChange:ze}),Object(j.jsx)(W,{tokens:X,value:a.name,onChange:Le,disabled:re||ue}),Object(j.jsx)(y.a,{variant:"subtitle1",children:"Send"}),Object(j.jsx)(b.a,{type:"number",value:k,disabled:re||ue,InputProps:{disableUnderline:!0},className:e.numberField,onChange:qe,placeholder:"0.0"}),parseFloat(k)>a.maxAmount?Object(j.jsx)(y.a,{variant:"subtitle2",color:"error",children:"The max input amount is ".concat(a.maxAmount," ").concat(a.name)}):null,Object(j.jsx)("div",{className:e.spacer}),Object(j.jsx)(W,{tokens:X,value:p.name,onChange:function(){},disabled:!0}),Object(j.jsx)(y.a,{variant:"subtitle1",children:"Receive (estimated)"}),Object(j.jsx)(b.a,{type:"number",value:M,autoFocus:!0,InputProps:{disableUnderline:!0},className:e.numberField,inputProps:{readOnly:!0},placeholder:"0.0"}),Object(j.jsx)(y.a,{variant:"subtitle2",children:"Slippage tolerance: ".concat(L,"%")}),!re&&Object(j.jsx)(B,{}),Object(j.jsx)(A,{disabled:!Qe||re||parseFloat(k)>a.maxAmount,showLoader:re,onClick:Ge,children:"Swap"})]}),Object(j.jsx)(h.a,{in:we&&!Te,children:Object(j.jsxs)("div",{className:e.loaderHolder,children:[Object(j.jsx)(Rt,{}),Object(j.jsx)("div",{className:e.spacer}),Object(j.jsx)(y.a,{variant:"h5",children:"Your ".concat(a.name," is being swapped to ").concat(p.name)})]})}),Object(j.jsx)(h.a,{in:Te,children:Object(j.jsxs)("div",{className:e.loaderHolder,children:[Object(j.jsx)(Bt.a,{className:e.successIcon,fontSize:"inherit"}),Object(j.jsx)(y.a,{children:"Swap completed!"}),Object(j.jsx)(A,{onClick:function(){return He()},children:"Swap more tokens!"})]})}),Object(j.jsx)("div",{className:e.spacer}),me&&Object(j.jsxs)(y.a,{variant:"subtitle1",className:e.swapPath,children:["".concat(k," ").concat(a.name),Object(j.jsx)(Dt.a,{fontSize:"inherit",style:{margin:"10px"}}),"".concat(P," UST "),Object(j.jsx)(Dt.a,{fontSize:"inherit",style:{margin:"10px"}}),"".concat(M," ").concat(p.name)]}),we&&!Te&&!Be&&Object(j.jsx)(qt,{chainId:a.chainId,txBlockNumber:Pe,step:Ce?Te?3:2:1}),Be&&Object(j.jsx)(y.a,{variant:"subtitle1",children:Be}),Object(j.jsx)("div",{className:e.spacer}),Object(j.jsx)(y.a,{variant:"subtitle2",color:"error",children:"WARNING: this is a Testnet release only"})]}),Object(j.jsx)("div",{className:e.spacer}),Object(j.jsx)(y.a,{variant:"subtitle1",color:"textSecondary",children:"powered by wormhole"}),Object(j.jsx)("img",{src:le,alt:"Wormhole",className:e.wormholeIcon}),Object(j.jsx)("div",{className:e.spacer}),Object(j.jsx)(v.a,{variant:"subtitle2",href:"https://goerli-faucet.slock.it/",children:"Goerli faucet"}),Object(j.jsx)("div",{}),Object(j.jsx)(v.a,{href:"https://faucet.polygon.technology/",children:"Mumbai faucet"})]})})}function Ht(){return Object(j.jsx)(Lt,{})}var Gt=function(e){Object(he.a)(n,e);var t=Object(be.a)(n);function n(e){var a;return Object(me.a)(this,n),(a=t.call(this,e)).state={hasError:!1},a}return Object(ye.a)(n,[{key:"componentDidCatch",value:function(e,t){console.error(e,t)}},{key:"render",value:function(){return this.state.hasError?Object(j.jsx)(y.a,{variant:"h5",style:{textAlign:"center",marginTop:24},children:'"An unexpected error has occurred. Please refresh the page."'}):this.props.children}}],[{key:"getDerivedStateFromError",value:function(e){return{hasError:!0}}}]),n}(w.a.Component);o.a.render(Object(j.jsx)(Gt,{children:Object(j.jsx)(r.a,{theme:de,children:Object(j.jsx)(a.a,{children:Object(j.jsx)(N,{children:Object(j.jsx)(i.a,{maxSnack:3,children:Object(j.jsx)(Ht,{})})})})})}),document.getElementById("root"))}},[[705,1,2]]]); +//# sourceMappingURL=main.5252a854.chunk.js.map \ No newline at end of file diff --git a/static/js/main.5252a854.chunk.js.map b/static/js/main.5252a854.chunk.js.map new file mode 100644 index 0000000..768be02 --- /dev/null +++ b/static/js/main.5252a854.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["components/ButtonWithLoader.tsx","contexts/EthereumProviderContext.tsx","components/ToggleConnectedButton.tsx","components/EthereumSignerKey.tsx","components/TokenSelect.tsx","icons/eth.svg","icons/polygon.svg","utils/consts.ts","muiTheme.js","icons/wormhole-network.svg","route/generic.ts","route/evm.ts","route/uniswap-core.ts","route/cross-quote.ts","route/uniswap-v2.ts","route/quickswap.ts","route/uniswap-v3.ts","swapper/util.ts","swapper/swapper.ts","addresses/goerli.ts","addresses/mumbai.ts","utils/parseError.ts","components/Settings.tsx","utils/getIsTransferCompletedWithRetry.ts","components/CircleLoader.tsx","components/SwapProgress.tsx","views/Home.tsx","App.tsx","components/ErrorBoundary.js","index.js"],"names":["useStyles","makeStyles","theme","root","position","button","marginTop","spacing","textTransform","width","loader","bottom","left","marginLeft","marginBottom","error","textAlign","ButtonWithLoader","disabled","onClick","showLoader","children","className","classes","Button","color","variant","CircularProgress","size","Typography","EthereumProviderContext","React","createContext","connect","disconnect","provider","undefined","chainId","signer","signerAddress","providerError","EthereumProviderProvider","useState","setProviderError","setProvider","setChainId","setSigner","setSignerAddress","useCallback","detectEthereumProvider","then","detectedProvider","ethers","providers","Web3Provider","send","getNetwork","network","catch","getSigner","getAddress","address","on","BigNumber","from","toNumber","e","accounts","contextValue","useMemo","Provider","value","useEthereumProvider","useContext","display","margin","maxWidth","ToggleConnectedButton","connected","pk","is0x","startsWith","Tooltip","title","substring","substr","length","EthereumSignerKey","select","alignItems","listItemIcon","minWidth","icon","height","TokenSelect","tokens","onChange","TextField","fullWidth","map","token","name","logo","MenuItem","ListItemIcon","src","alt","ListItemText","createTokenMenuItem","MATIC_TOKEN_INFO","CHAIN_ID_POLYGON","polygonIcon","isNative","maxAmount","WMATIC_TOKEN_INFO","ETH_TOKEN_INFO","CHAIN_ID_ETH","ethIcon","WETH_TOKEN_INFO","TOKEN_INFOS","POLYGON_NETWORK_CHAIN_ID","getEvmChainId","WORMHOLE_RPC_HOSTS","COLORS","responsiveFontSizes","createTheme","palette","type","background","default","paper","divider","text","primary","main","light","secondary","typography","fontFamily","h1","fontWeight","h2","h4","overrides","MuiCssBaseline","scrollbarWidth","scrollbarColor","backgroundColor","borderRadius","MuiAccordion","rounded","borderTopLeftRadius","borderTopRightRadius","borderBottomLeftRadius","borderBottomRightRadius","MuiAlert","border","MuiButton","MuiLink","MuiPaper","MuiStepper","padding","MuiStep","MuiStepConnector","lineVertical","borderLeftWidth","MuiStepContent","MuiStepLabel","label","fontSize","MuiTab","GenericToken","EvmToken","decimals","tokenAddress","a","makeErc20Contract","this","getDecimals","balanceOf","balanceBeforeDecimals","utils","formatUnits","toString","amount","parseUnits","unitAmount","right","FixedNumber","addUnsafe","round","subUnsafe","o","initialize","Contract","Erc20Abi","UniEvmToken","erc20","uniToken","Token","getContract","getBalanceOf","computeUnitAmount","formatAmount","CurrencyAmount","fromRawAmount","getUniToken","addAmounts","subtractAmounts","makeUniEvmToken","create","QuoteType","UniswapRouterCore","deadline","Math","floor","Date","now","add","PROTOCOL","SingleAmmSwapRouter","factoryAddress","pairContract","pair","tokenIn","tokenOut","Error","computePairAddress","tokenA","tokenB","pairAddress","computePoolAddress","poolContract","IUniswapV2PairABI","factory","Promise","all","token0","getReserves","reserves","reserve0","_reserve0","reserve1","_reserve1","toLowerCase","Pair","amountIn","slippage","createPool","route","Route","currencyAmountIn","computeCurrencyAmount","quote","Trade","TradeType","EXACT_INPUT","minAmountOut","outputAmount","toSignificant","slippageMultiplier","minAmountOutWithSlippage","mulUnsafe","amountOut","currencyAmountOut","EXACT_OUTPUT","maxAmountIn","inputAmount","slippageDivisor","maxAmountInWithSlippage","divUnsafe","QuickswapRouter","pool","poolFee","FeeAmount","MEDIUM","fee","IUniswapV3PoolABI","poolAddress","liquidity","slot0","slot","sqrtPriceX96","tick","bigLiq","JSBI","BigInt","negBigLiq","multiply","tickConstructorArgs","index","nearestUsableTick","TickMath","MIN_TICK","TICK_SPACINGS","liquidityNet","liquidityGross","MAX_TICK","Pool","fromRoute","computeTradeExactIn","trade","computeTradeExactOut","makeRouter","id","UniswapV3Router","getUstAddress","splitSlippageInHalf","totalSlippage","divisor","UniswapToUniswapQuoter","srcProvider","dstProvider","srcNetwork","dstNetwork","srcRouter","dstRouter","srcTokenIn","srcTokenOut","dstTokenIn","dstTokenOut","tokenInAddress","ustOutAddress","router","makeToken","tokenOutAddress","ustInAddress","computeAndVerifyPoolAddress","relayerFeeUst","singleSlippage","fetchQuoteAmountOut","srcMinAmountOut","dstAmountIn","Number","dstAmountInAfterFee","dstMinAmountOut","srcParameters","protocol","getProtocol","getPoolFee","getTradeDeadline","path","dstParameters","params","dst","relayerFee","fetchQuoteAmountIn","dstMaxAmountIn","srcAmountOut","srcAmountOutBeforeFee","srcMaxAmountIn","setDeadline","CROSSCHAINSWAP_GAS_PARAMETERS","gasLimit","maxFeePerGas","maxPriorityFeePerGas","swapExactInFromVaaNative","swapContractWithSigner","signedVaa","recvAndSwapExactNativeIn","tx","wait","swapExactInFromVaaToken","recvAndSwapExactIn","swapExactOutFromVaaNative","recvAndSwapExactNativeOut","swapExactOutFromVaaToken","recvAndSwapExactOut","EXECUTION_PARAMETERS_ETHEREUM","crossChainSwap","wormhole","WORMHOLE_CHAIN_ID_ETHEREUM","coreBridgeAddress","tokenBridgeAddress","EXECUTION_PARAMETERS_POLYGON","WORMHOLE_CHAIN_ID_POLYGON","makeExecutionParameters","approveContractTokenSpend","tokenContract","swapContractAddress","populateTransaction","approve","unsignedTx","gas_limit","getGasPrice","gasPrice","parsedGasPrice","hexlify","parseInt","console","log","getTransactionCount","nonce","sendTransaction","makeCrossChainSwapContract","contractAddress","PROTOCOL_UNISWAP_V2","SWAP_CONTRACT_V2_ABI","makeCrossChainSwapV2Contract","SWAP_CONTRACT_V3_ABI","makeCrossChainSwapV3Contract","addressToBytes32","wormholeChainId","hexString","nativeToHexString","hexToUint8Array","approveAndSwapExactIn","srcWallet","quoteParams","srcExecutionParams","dstExecutionParams","swapContractParams","swapContract","contractWithSigner","swapParams","pathArray","concat","dstWormholeChainId","dstContractAddress","bridgeNonce","gasPlusValue","info","swapExactNativeInAndTransfer","swapExactInAndTransfer","approveAndSwapExactOut","swapExactNativeOutAndTransfer","swapExactOutAndTransfer","swapExactInFromVaa","dstWallet","dstProtocol","swapExactOutFromVaa","makeProvider","url","process","StaticJsonRpcProvider","UniswapToUniswapExecutor","quoter","cachedExactInParams","cachedExactOutParams","quoteType","relayerFeeAmount","transportFactory","vaaSearchParams","vaaBytes","srcReceipt","dstReceipt","makeTokens","setDeadlines","makeSrcTokens","makeDstTokens","srcIn","srcOut","dstIn","dstOut","computeAndVerifySrcPoolAddress","computeAndVerifyDstPoolAddress","areSwapParametersUndefined","computeExactInParameters","ExactIn","computeExactOutParameters","ExactOut","wallet","getSrcProvider","fetchAndSetEmitterAndSequence","receipt","wormholeParams","sequence","parseSequenceFromLogEth","emitterAddress","getEmitterAddressEth","getSignedVAAWithRetry","vaaResponse","fetchSignedVaaFromSwap","getDstProvider","MM_ERR_WITH_INFO_START","parseError","data","message","replace","response","topScrollPaper","topPaperScrollBody","verticalAlign","float","clamp","min","max","isNaN","Settings","onSlippageChange","onDeadlineChange","dialogIsOpen","setDialogIsOpen","dialog","Dialog","open","onClose","scroll","DialogTitle","DialogContent","InputProps","endAdornment","InputAdornment","event","target","parseFloat","disableRipple","endIcon","getIsTransferCompletedEvmWithRetry","signedVAA","retryTimeoutMs","retryAttempts","result","attempts","getIsTransferCompletedEth","resolve","setTimeout","CircleLoader","TransactionProgress","txBlockNumber","step","currentBlock","setCurrentBlock","useEffect","isEVMChain","cancelled","getBlockNumber","newBlock","valueBuffer","blockDiff","LinearProgress","bg","flexDirection","minHeight","centeredContainer","mainPaper","numberField","flexGrow","caretShape","webkitAppearance","gradientButton","backgroundImage","transition","backgroundSize","boxShadow","backgroundPosition","spacer","titleBar","alignSelf","tokenSelectWrapper","wormholeIcon","filter","loaderHolder","justifyContent","successIcon","swapPath","switchProviderNetwork","evmChainId","hexStripZeros","Home","sourceTokenInfo","setSourceTokenInfo","targetTokenInfo","setTargetTokenInfo","setAmountIn","amountInUST","setAmountInUST","setAmountOut","setSlippage","executor","setExecutor","isSwapping","setIsSwapping","isComputingQuote","setIsComputingQuote","hasQuote","setHasQuote","enqueueSnackbar","useSnackbar","isFirstSwapComplete","setIsFirstSwapComplete","isSecondSwapComplete","setIsSecondSwapComplete","sourceTxBlockNumber","setSourceTxBlockNumber","hasSignedVAA","setHasSignedVAA","relayerTimeoutString","setRelayerTimeoutString","computeQuote","setRelayerFee","computeQuoteExactIn","toFixed","content","Alert","severity","debouncedComputeQuote","useDebouncedCallback","handleAmountChange","handleSlippageChange","handleDeadlineChange","handleSourceChange","reset","handleSwapClick","approveAndSwap","sourceReceipt","transactionHash","blockNumber","fetchVaaAndSwap","targetReceipt","readyToSwap","Container","Paper","Collapse","in","disableUnderline","placeholder","autoFocus","inputProps","readOnly","CheckCircleOutlineRounded","ArrowForward","style","Wormhole","Link","href","App","ErrorBoundary","props","state","hasError","errorInfo","Component","ReactDOM","render","ThemeProvider","CssBaseline","maxSnack","document","getElementById"],"mappings":"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","file":"static/js/main.5252a854.chunk.js","sourcesContent":["import {\n Button,\n CircularProgress,\n makeStyles,\n Typography,\n} from \"@material-ui/core\";\nimport { ReactChild } from \"react\";\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n position: \"relative\",\n },\n button: {\n marginTop: theme.spacing(2),\n textTransform: \"none\",\n width: \"100%\",\n },\n loader: {\n position: \"absolute\",\n bottom: 0,\n left: \"50%\",\n marginLeft: -12,\n marginBottom: 6,\n },\n error: {\n marginTop: theme.spacing(1),\n textAlign: \"center\",\n },\n}));\n\nexport default function ButtonWithLoader({\n disabled,\n onClick,\n showLoader,\n error,\n children,\n className,\n}: {\n disabled?: boolean;\n onClick: () => void;\n showLoader?: boolean;\n error?: string;\n children: ReactChild;\n className?: string;\n}) {\n const classes = useStyles();\n return (\n <>\n
\n \n {children}\n \n {showLoader ? (\n \n ) : null}\n
\n {error ? (\n \n {error}\n \n ) : null}\n \n );\n}\n","import detectEthereumProvider from \"@metamask/detect-provider\";\nimport { BigNumber, ethers } from \"ethers\";\nimport React, {\n ReactChildren,\n useCallback,\n useContext,\n useMemo,\n useState,\n} from \"react\";\n\nexport type Provider = ethers.providers.Web3Provider | undefined;\nexport type Signer = ethers.Signer | undefined;\n\ninterface IEthereumProviderContext {\n connect(): void;\n disconnect(): void;\n provider: Provider;\n chainId: number | undefined;\n signer: Signer;\n signerAddress: string | undefined;\n providerError: string | null;\n}\n\nconst EthereumProviderContext = React.createContext({\n connect: () => {},\n disconnect: () => {},\n provider: undefined,\n chainId: undefined,\n signer: undefined,\n signerAddress: undefined,\n providerError: null,\n});\nexport const EthereumProviderProvider = ({\n children,\n}: {\n children: ReactChildren;\n}) => {\n const [providerError, setProviderError] = useState(null);\n const [provider, setProvider] = useState(undefined);\n const [chainId, setChainId] = useState(undefined);\n const [signer, setSigner] = useState(undefined);\n const [signerAddress, setSignerAddress] = useState(\n undefined\n );\n const connect = useCallback(() => {\n setProviderError(null);\n detectEthereumProvider()\n .then((detectedProvider) => {\n if (detectedProvider) {\n const provider = new ethers.providers.Web3Provider(\n // @ts-ignore\n detectedProvider,\n \"any\"\n );\n provider\n .send(\"eth_requestAccounts\", [])\n .then(() => {\n setProviderError(null);\n setProvider(provider);\n provider\n .getNetwork()\n .then((network) => {\n setChainId(network.chainId);\n })\n .catch(() => {\n setProviderError(\n \"An error occurred while getting the network\"\n );\n });\n const signer = provider.getSigner();\n setSigner(signer);\n signer\n .getAddress()\n .then((address) => {\n setSignerAddress(address);\n })\n .catch(() => {\n setProviderError(\n \"An error occurred while getting the signer address\"\n );\n });\n // TODO: try using ethers directly\n // @ts-ignore\n if (detectedProvider && detectedProvider.on) {\n // @ts-ignore\n detectedProvider.on(\"chainChanged\", (chainId) => {\n try {\n setChainId(BigNumber.from(chainId).toNumber());\n } catch (e) {}\n });\n // @ts-ignore\n detectedProvider.on(\"accountsChanged\", (accounts) => {\n try {\n const signer = provider.getSigner();\n setSigner(signer);\n signer\n .getAddress()\n .then((address) => {\n setSignerAddress(address);\n })\n .catch(() => {\n setProviderError(\n \"An error occurred while getting the signer address\"\n );\n });\n } catch (e) {}\n });\n }\n })\n .catch(() => {\n setProviderError(\n \"An error occurred while requesting eth accounts\"\n );\n });\n } else {\n setProviderError(\"Please install MetaMask\");\n }\n })\n .catch(() => {\n setProviderError(\"Please install MetaMask\");\n });\n }, []);\n const disconnect = useCallback(() => {\n setProviderError(null);\n setProvider(undefined);\n setChainId(undefined);\n setSigner(undefined);\n setSignerAddress(undefined);\n }, []);\n const contextValue = useMemo(\n () => ({\n connect,\n disconnect,\n provider,\n chainId,\n signer,\n signerAddress,\n providerError,\n }),\n [\n connect,\n disconnect,\n provider,\n chainId,\n signer,\n signerAddress,\n providerError,\n ]\n );\n return (\n \n {children}\n \n );\n};\nexport const useEthereumProvider = () => {\n return useContext(EthereumProviderContext);\n};\n","import { Button, makeStyles, Tooltip } from \"@material-ui/core\";\n\nconst useStyles = makeStyles((theme) => ({\n button: {\n display: \"block\",\n margin: `${theme.spacing(1)}px auto`,\n width: \"100%\",\n maxWidth: 400,\n },\n}));\n\nconst ToggleConnectedButton = ({\n connect,\n disconnect,\n connected,\n pk,\n}: {\n connect(): any;\n disconnect(): any;\n connected: boolean;\n pk: string;\n}) => {\n const classes = useStyles();\n const is0x = pk.startsWith(\"0x\");\n return connected ? (\n \n \n Disconnect {pk.substring(0, is0x ? 6 : 3)}...\n {pk.substr(pk.length - (is0x ? 4 : 3))}\n \n \n ) : (\n \n Connect Wallet\n \n );\n};\n\nexport default ToggleConnectedButton;\n","import { Typography } from \"@material-ui/core\";\nimport { useEthereumProvider } from \"../contexts/EthereumProviderContext\";\nimport ToggleConnectedButton from \"./ToggleConnectedButton\";\n\nconst EthereumSignerKey = () => {\n const { connect, disconnect, signerAddress, providerError } =\n useEthereumProvider();\n return (\n <>\n \n {providerError ? (\n \n {providerError}\n \n ) : null}\n \n );\n};\n\nexport default EthereumSignerKey;\n","import {\n ListItemIcon,\n ListItemText,\n makeStyles,\n MenuItem,\n TextField,\n} from \"@material-ui/core\";\nimport { TokenInfo } from \"../utils/consts\";\n\nconst useStyles = makeStyles((theme) => ({\n select: {\n \"& .MuiSelect-root\": {\n display: \"flex\",\n alignItems: \"center\",\n },\n },\n listItemIcon: {\n minWidth: 40,\n },\n icon: {\n height: 24,\n maxWidth: 24,\n },\n}));\n\nconst createTokenMenuItem = ({ name, logo }: TokenInfo, classes: any) => (\n \n \n {name}\n \n {name}\n \n);\n\ninterface TokenSelectProps {\n tokens: TokenInfo[];\n value: string;\n onChange: (event: any) => void;\n disabled: boolean;\n}\n\nexport default function TokenSelect({\n tokens,\n value,\n onChange,\n disabled,\n}: TokenSelectProps) {\n const classes = useStyles();\n\n return (\n \n {tokens.map((token) => createTokenMenuItem(token, classes))}\n \n );\n}\n","export default __webpack_public_path__ + \"static/media/eth.364436c5.svg\";","export default __webpack_public_path__ + \"static/media/polygon.97ff139c.svg\";","import {\n ChainId,\n CHAIN_ID_ETH,\n CHAIN_ID_POLYGON,\n} from \"@certusone/wormhole-sdk\";\nimport ethIcon from \"../icons/eth.svg\";\nimport polygonIcon from \"../icons/polygon.svg\";\n\nexport interface TokenInfo {\n name: string;\n address: string;\n chainId: ChainId;\n logo: string;\n isNative: boolean;\n maxAmount: number;\n}\n\nexport const MATIC_TOKEN_INFO: TokenInfo = {\n name: \"MATIC\",\n address: \"0x9c3c9283d3e44854697cd22d3faa240cfb032889\", // used to compute quote\n chainId: CHAIN_ID_POLYGON,\n logo: polygonIcon,\n isNative: true,\n maxAmount: 0.1,\n};\n\nexport const WMATIC_TOKEN_INFO: TokenInfo = {\n name: \"WMATIC\",\n address: \"0x9c3c9283d3e44854697cd22d3faa240cfb032889\",\n chainId: CHAIN_ID_POLYGON,\n logo: polygonIcon,\n isNative: false,\n maxAmount: 0.1,\n};\n\nexport const ETH_TOKEN_INFO: TokenInfo = {\n name: \"ETH\",\n address: \"0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6\", // used to compute quote\n chainId: CHAIN_ID_ETH,\n logo: ethIcon,\n isNative: true,\n maxAmount: 0.01,\n};\n\nexport const WETH_TOKEN_INFO: TokenInfo = {\n name: \"WETH\",\n address: \"0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6\",\n chainId: CHAIN_ID_ETH,\n logo: ethIcon,\n isNative: false,\n maxAmount: 0.01,\n};\n\nexport const TOKEN_INFOS = [\n MATIC_TOKEN_INFO,\n WMATIC_TOKEN_INFO,\n ETH_TOKEN_INFO,\n WETH_TOKEN_INFO,\n];\n\nexport const ETH_NETWORK_CHAIN_ID = 5;\n\nexport const POLYGON_NETWORK_CHAIN_ID = 80001;\n\nexport const getEvmChainId = (chainId: ChainId) =>\n chainId === CHAIN_ID_ETH\n ? ETH_NETWORK_CHAIN_ID\n : chainId === CHAIN_ID_POLYGON\n ? POLYGON_NETWORK_CHAIN_ID\n : undefined;\n\nexport const RELAYER_FEE_UST = \"0.25\";\n\nexport const WORMHOLE_RPC_HOSTS = [\n \"https://wormhole-v2-testnet-api.certus.one\",\n];\n\nexport const CORE_BRIDGE_ADDRESS_ETHEREUM =\n \"0x706abc4E45D419950511e474C7B9Ed348A4a716c\";\n\nexport const CORE_BRIDGE_ADDRESS_POLYGON =\n \"0x0CBE91CF822c73C2315FB05100C2F714765d5c20\";\n\nexport const TOKEN_BRIDGE_ADDRESS_ETHEREUM =\n \"0xF890982f9310df57d00f659cf4fd87e65adEd8d7\";\n\nexport const TOKEN_BRIDGE_ADDRESS_POLYGON =\n \"0x377D55a7928c046E18eEbb61977e714d2a76472a\";\n\nexport const QUICKSWAP_FACTORY_ADDRESS =\n \"0x5757371414417b8C6CAad45bAeF941aBc7d3Ab32\";\n\nexport const UNISWAP_V3_FACTORY_ADDRESS =\n \"0x1F98431c8aD98523631AE4a59f267346ea31F984\";\n\nexport const APPROVAL_GAS_LIMIT = \"100000\";\n","import { createTheme, responsiveFontSizes } from \"@material-ui/core\";\n\nexport const COLORS = {\n blue: \"#1975e6\",\n blueWithTransparency: \"rgba(25, 117, 230, 0.8)\",\n gray: \"#4e4e54\",\n green: \"#0ac2af\",\n greenWithTransparency: \"rgba(10, 194, 175, 0.8)\",\n lightGreen: \"rgba(51, 242, 223, 1)\",\n lightBlue: \"#83b9fc\",\n nearBlack: \"#000008\",\n nearBlackWithMinorTransparency: \"rgba(0,0,0,.25)\",\n red: \"#aa0818\",\n darkRed: \"#810612\",\n};\n\nexport const theme = responsiveFontSizes(\n createTheme({\n palette: {\n type: \"dark\",\n background: {\n default: COLORS.nearBlack,\n paper: COLORS.nearBlack,\n },\n divider: COLORS.gray,\n text: {\n primary: \"rgba(255,255,255,0.98)\",\n },\n primary: {\n main: COLORS.blueWithTransparency,\n light: COLORS.lightBlue,\n },\n secondary: {\n main: COLORS.greenWithTransparency,\n light: COLORS.lightGreen,\n },\n error: {\n main: COLORS.red,\n },\n },\n typography: {\n fontFamily: \"'Sora', sans-serif\",\n h1: {\n fontWeight: \"200\",\n },\n h2: {\n fontWeight: \"200\",\n },\n h4: {\n fontWeight: \"500\",\n },\n },\n overrides: {\n MuiCssBaseline: {\n \"@global\": {\n \"*\": {\n scrollbarWidth: \"thin\",\n scrollbarColor: `${COLORS.gray} ${COLORS.nearBlackWithMinorTransparency}`,\n },\n \"*::-webkit-scrollbar\": {\n width: \"8px\",\n height: \"8px\",\n backgroundColor: COLORS.nearBlackWithMinorTransparency,\n },\n \"*::-webkit-scrollbar-thumb\": {\n backgroundColor: COLORS.gray,\n borderRadius: \"4px\",\n },\n \"*::-webkit-scrollbar-corner\": {\n // this hides an annoying white box which appears when both scrollbars are present\n backgroundColor: \"transparent\",\n },\n },\n },\n MuiAccordion: {\n root: {\n backgroundColor: COLORS.nearBlackWithMinorTransparency,\n \"&:before\": {\n display: \"none\",\n },\n },\n rounded: {\n \"&:first-child\": {\n borderTopLeftRadius: \"16px\",\n borderTopRightRadius: \"16px\",\n },\n \"&:last-child\": {\n borderBottomLeftRadius: \"16px\",\n borderBottomRightRadius: \"16px\",\n },\n },\n },\n MuiAlert: {\n root: {\n borderRadius: \"8px\",\n border: \"1px solid\",\n },\n },\n MuiButton: {\n root: {\n borderRadius: \"5px\",\n textTransform: \"none\",\n },\n },\n MuiLink: {\n root: {\n color: COLORS.lightBlue,\n },\n },\n MuiPaper: {\n rounded: {\n borderRadius: \"16px\",\n },\n },\n MuiStepper: {\n root: {\n backgroundColor: \"transparent\",\n padding: 0,\n },\n },\n MuiStep: {\n root: {\n backgroundColor: COLORS.nearBlackWithMinorTransparency,\n borderRadius: \"16px\",\n padding: 16,\n },\n },\n MuiStepConnector: {\n lineVertical: {\n borderLeftWidth: 0,\n },\n },\n MuiStepContent: {\n root: {\n borderLeftWidth: 0,\n },\n },\n MuiStepLabel: {\n label: {\n fontSize: 16,\n fontWeight: \"300\",\n \"&.MuiStepLabel-active\": {\n fontWeight: \"300\",\n },\n \"&.MuiStepLabel-completed\": {\n fontWeight: \"300\",\n },\n },\n },\n MuiTab: {\n root: {\n fontSize: 18,\n fontWeight: \"300\",\n padding: 12,\n textTransform: \"none\",\n },\n },\n },\n })\n);\n","export default __webpack_public_path__ + \"static/media/wormhole-network.5bb90ed1.svg\";","export abstract class DexRouter {\n abstract makeToken(tokenAddress: string): any;\n abstract quoteLot(tokenA: any, tokenB: any, amount: string): Promise;\n abstract setSlippage(slippage: string): void;\n}\n\nexport abstract class GenericToken {\n abstract getAddress(): string;\n\n abstract getDecimals(): number;\n}\n\n// TODO: wrap SwapRoute and other routes\nexport class GenericRoute {\n route: any;\n\n constructor(route: any) {\n this.route = route;\n }\n\n getRoute(): any {\n return this.route;\n }\n}\n","import { ethers } from \"ethers\";\n\nimport { GenericToken } from \"./generic\";\n\n// erc20 spec\nimport { abi as Erc20Abi } from \"../abi/erc20.json\";\nimport {\n TransactionReceipt,\n TransactionRequest,\n TransactionResponse,\n} from \"@ethersproject/abstract-provider\";\nimport { APPROVAL_GAS_LIMIT } from \"../utils/consts\";\n\nexport class EvmToken extends GenericToken {\n token: ethers.Contract;\n decimals: number;\n\n async initialize(provider: ethers.providers.Provider, tokenAddress: string) {\n this.token = await makeErc20Contract(provider, tokenAddress);\n this.decimals = await this.token.decimals();\n }\n\n static async create(\n provider: ethers.providers.Provider,\n tokenAddress: string\n ): Promise {\n const o = new EvmToken();\n await o.initialize(provider, tokenAddress);\n return o;\n }\n\n getAddress(): string {\n return this.token.address;\n }\n\n getDecimals(): number {\n return this.decimals;\n }\n\n getContract(): ethers.Contract {\n return this.token;\n }\n\n async getBalanceOf(signer: ethers.Wallet) {\n const decimals = this.getDecimals();\n const balanceBeforeDecimals = await this.token.balanceOf(signer.address);\n return ethers.utils.formatUnits(balanceBeforeDecimals.toString(), decimals);\n }\n\n computeUnitAmount(amount: string): ethers.BigNumber {\n return ethers.utils.parseUnits(amount, this.getDecimals());\n }\n\n formatAmount(unitAmount: ethers.BigNumber): string {\n return ethers.utils.formatUnits(unitAmount, this.getDecimals());\n }\n\n addAmounts(left: string, right: string): string {\n const sum = ethers.FixedNumber.from(left).addUnsafe(\n ethers.FixedNumber.from(right)\n );\n return sum.round(this.getDecimals()).toString();\n }\n\n subtractAmounts(left: string, right: string): string {\n const sum = ethers.FixedNumber.from(left).subUnsafe(\n ethers.FixedNumber.from(right)\n );\n return sum.round(this.getDecimals()).toString();\n }\n}\n\nexport async function makeErc20Contract(\n provider: ethers.providers.Provider,\n tokenAddress: string\n): Promise {\n return new ethers.Contract(tokenAddress, Erc20Abi, provider);\n}\n\nexport async function approveContractTokenSpend(\n provider: ethers.providers.Provider,\n signer: ethers.Wallet,\n tokenContract: ethers.Contract,\n smartContractAddress: string,\n swapAmount: ethers.BigNumber\n): Promise {\n // build transaction for token spending\n const unsignedTx: TransactionRequest =\n await tokenContract.populateTransaction.approve(\n smartContractAddress,\n swapAmount\n );\n const nonce = await provider.getTransactionCount(signer.address, \"latest\");\n\n const gasPrice = await signer.getGasPrice();\n const parsedGasPrice = ethers.utils.hexlify(parseInt(gasPrice.toString()));\n\n unsignedTx.nonce = nonce;\n unsignedTx.gasLimit = ethers.BigNumber.from(APPROVAL_GAS_LIMIT);\n unsignedTx.gasPrice = ethers.BigNumber.from(parsedGasPrice);\n\n // sign and send transaction\n const tx: TransactionResponse = await signer.sendTransaction(unsignedTx);\n return tx.wait();\n}\n","import { ethers } from \"ethers\";\nimport { CurrencyAmount, Token } from \"@uniswap/sdk-core\";\n\nimport { EvmToken } from \"./evm\";\n\nexport function computeTradeDeadline(deadline: string): ethers.BigNumber {\n return ethers.BigNumber.from(Math.floor(Date.now() / 1000)).add(deadline);\n}\n\nexport class UniEvmToken {\n erc20: EvmToken;\n uniToken: Token;\n\n constructor(chainId: number, erc20: EvmToken) {\n this.erc20 = erc20;\n\n const address = this.getAddress();\n const decimals = this.getDecimals();\n\n this.uniToken = new Token(chainId, address, decimals);\n }\n\n getUniToken(): Token {\n return this.uniToken;\n }\n\n getEvmToken(): EvmToken {\n return this.erc20;\n }\n\n getDecimals(): number {\n return this.erc20.getDecimals();\n }\n\n getContract(): ethers.Contract {\n return this.erc20.getContract();\n }\n\n getAddress(): string {\n return this.erc20.getAddress();\n }\n\n async getBalanceOf(signer: ethers.Wallet) {\n return this.erc20.getBalanceOf(signer);\n }\n\n computeUnitAmount(amount: string): ethers.BigNumber {\n return this.erc20.computeUnitAmount(amount);\n }\n\n formatAmount(unitAmount: ethers.BigNumber): string {\n return this.erc20.formatAmount(unitAmount);\n }\n\n computeCurrencyAmount(amount: string): CurrencyAmount {\n const unitAmount = this.computeUnitAmount(amount);\n return CurrencyAmount.fromRawAmount(\n this.getUniToken(),\n unitAmount.toString()\n );\n }\n\n addAmounts(left: string, right: string): string {\n return this.erc20.addAmounts(left, right);\n }\n\n subtractAmounts(left: string, right: string): string {\n return this.erc20.subtractAmounts(left, right);\n }\n}\n\nexport async function makeUniEvmToken(\n provider: ethers.providers.Provider,\n chainId: number,\n tokenAddress: string\n): Promise {\n const erc20 = await EvmToken.create(provider, tokenAddress);\n return new UniEvmToken(chainId, erc20);\n}\n\nexport abstract class UniswapRouterCore {\n provider: ethers.providers.Provider;\n\n // params\n deadline: string = \"\";\n\n constructor(provider: ethers.providers.Provider) {\n this.provider = provider;\n }\n\n public async makeToken(tokenAddress: string): Promise {\n const network = await this.provider.getNetwork();\n return makeUniEvmToken(this.provider, network.chainId, tokenAddress);\n }\n\n abstract computePoolAddress(\n tokenIn: UniEvmToken,\n tokenOut: UniEvmToken\n ): string;\n\n abstract computeAndVerifyPoolAddress(\n tokenIn: UniEvmToken,\n tokenOut: UniEvmToken\n ): Promise;\n\n abstract fetchQuoteAmountOut(\n tokenIn: UniEvmToken,\n tokenOut: UniEvmToken,\n amountOut: string,\n slippage: string\n ): Promise;\n\n abstract fetchQuoteAmountIn(\n tokenIn: UniEvmToken,\n tokenOut: UniEvmToken,\n amountOut: string,\n slippage: string\n ): Promise;\n\n abstract getProtocol(): string;\n\n public getPoolFee(): string {\n return \"\";\n }\n\n public setDeadline(deadline: string): void {\n this.deadline = deadline;\n }\n\n public getTradeDeadline(): ethers.BigNumber {\n return computeTradeDeadline(this.deadline);\n }\n}\n","import { ethers } from \"ethers\";\nimport { UniEvmToken } from \"./uniswap-core\";\nimport { QuickswapRouter } from \"./quickswap\";\nimport { SingleAmmSwapRouter as UniswapV3Router } from \"./uniswap-v3\";\nimport {\n ETH_NETWORK_CHAIN_ID,\n POLYGON_NETWORK_CHAIN_ID,\n} from \"../utils/consts\";\n\nexport { PROTOCOL as PROTOCOL_UNISWAP_V2 } from \"./uniswap-v2\";\nexport { PROTOCOL as PROTOCOL_UNISWAP_V3 } from \"./uniswap-v3\";\n\nexport enum QuoteType {\n ExactIn = 1,\n ExactOut,\n}\n\nfunction makeRouter(provider: ethers.providers.Provider, id: number) {\n switch (id) {\n case ETH_NETWORK_CHAIN_ID: {\n return new UniswapV3Router(provider);\n }\n case POLYGON_NETWORK_CHAIN_ID: {\n return new QuickswapRouter(provider);\n }\n default: {\n throw Error(\"unrecognized chain id\");\n }\n }\n}\n\nexport function getUstAddress(id: number): string {\n switch (id) {\n case ETH_NETWORK_CHAIN_ID: {\n return \"0x36Ed51Afc79619b299b238898E72ce482600568a\";\n }\n case POLYGON_NETWORK_CHAIN_ID: {\n return \"0xe3a1c77e952b57b5883f6c906fc706fcc7d4392c\";\n }\n default: {\n throw Error(\"unrecognized chain id\");\n }\n }\n}\n\nfunction splitSlippageInHalf(totalSlippage: string): string {\n const divisor = ethers.FixedNumber.from(\"2\");\n return ethers.FixedNumber.from(totalSlippage)\n .divUnsafe(divisor)\n .round(4)\n .toString();\n}\n\ninterface RelayerFee {\n amount: ethers.BigNumber;\n tokenAddress: string;\n}\n\nexport interface ExactInParameters {\n protocol: string;\n amountIn: ethers.BigNumber;\n minAmountOut: ethers.BigNumber;\n deadline: ethers.BigNumber;\n poolFee: string;\n path: [string, string];\n}\n\nexport interface ExactInCrossParameters {\n src: ExactInParameters;\n dst: ExactInParameters;\n relayerFee: RelayerFee;\n}\n\nexport interface ExactOutParameters {\n protocol: string;\n amountOut: ethers.BigNumber;\n maxAmountIn: ethers.BigNumber;\n deadline: ethers.BigNumber;\n poolFee: string;\n path: [string, string];\n}\n\nexport interface ExactOutCrossParameters {\n src: ExactOutParameters;\n dst: ExactOutParameters;\n relayerFee: RelayerFee;\n}\n\nexport class UniswapToUniswapQuoter {\n // providers\n srcProvider: ethers.providers.Provider;\n dstProvider: ethers.providers.Provider;\n\n // networks\n srcNetwork: ethers.providers.Network;\n dstNetwork: ethers.providers.Network;\n\n // routers\n srcRouter: UniswapV3Router | QuickswapRouter;\n dstRouter: UniswapV3Router | QuickswapRouter;\n\n // tokens\n srcTokenIn: UniEvmToken;\n srcTokenOut: UniEvmToken;\n dstTokenIn: UniEvmToken;\n dstTokenOut: UniEvmToken;\n\n constructor(\n srcProvider: ethers.providers.Provider,\n dstProvider: ethers.providers.Provider\n ) {\n this.srcProvider = srcProvider;\n this.dstProvider = dstProvider;\n }\n\n async initialize(): Promise {\n [this.srcNetwork, this.dstNetwork] = await Promise.all([\n this.srcProvider.getNetwork(),\n this.dstProvider.getNetwork(),\n ]);\n\n this.srcRouter = makeRouter(this.srcProvider, this.srcNetwork.chainId);\n this.dstRouter = makeRouter(this.dstProvider, this.dstNetwork.chainId);\n return;\n }\n\n sameChain(): boolean {\n return this.srcNetwork.chainId === this.dstNetwork.chainId;\n }\n\n async makeSrcTokens(\n tokenInAddress: string\n ): Promise<[UniEvmToken, UniEvmToken]> {\n const ustOutAddress = getUstAddress(this.srcNetwork.chainId);\n\n const router = this.srcRouter;\n\n [this.srcTokenIn, this.srcTokenOut] = await Promise.all([\n router.makeToken(tokenInAddress),\n router.makeToken(ustOutAddress),\n ]);\n return [this.srcTokenIn, this.srcTokenOut];\n }\n\n async makeDstTokens(\n tokenOutAddress: string\n ): Promise<[UniEvmToken, UniEvmToken]> {\n const ustInAddress = getUstAddress(this.dstNetwork.chainId);\n\n const router = this.dstRouter;\n\n [this.dstTokenIn, this.dstTokenOut] = await Promise.all([\n router.makeToken(ustInAddress),\n router.makeToken(tokenOutAddress),\n ]);\n return [this.dstTokenIn, this.dstTokenOut];\n }\n\n async computeAndVerifySrcPoolAddress(): Promise {\n return this.srcRouter.computeAndVerifyPoolAddress(\n this.srcTokenIn,\n this.srcTokenOut\n );\n }\n\n async computeAndVerifyDstPoolAddress(): Promise {\n return this.dstRouter.computeAndVerifyPoolAddress(\n this.dstTokenIn,\n this.dstTokenOut\n );\n }\n\n async computeExactInParameters(\n amountIn: string,\n slippage: string,\n relayerFeeUst: string\n ): Promise {\n const singleSlippage = splitSlippageInHalf(slippage);\n\n // src quote\n const srcRouter = this.srcRouter;\n const srcTokenIn = this.srcTokenIn;\n const srcTokenOut = this.srcTokenOut;\n const srcMinAmountOut = await srcRouter.fetchQuoteAmountOut(\n srcTokenIn,\n srcTokenOut,\n amountIn,\n singleSlippage\n );\n\n // dst quote\n const dstRouter = this.dstRouter;\n const dstAmountIn = this.srcTokenOut.formatAmount(srcMinAmountOut);\n if (Number(dstAmountIn) < Number(relayerFeeUst)) {\n throw Error(\n `srcAmountOut <= relayerFeeUst. ${dstAmountIn} vs ${relayerFeeUst}`\n );\n }\n\n const dstTokenIn = this.dstTokenIn;\n const dstTokenOut = this.dstTokenOut;\n const dstAmountInAfterFee = dstTokenIn.subtractAmounts(\n dstAmountIn,\n relayerFeeUst\n );\n\n const dstMinAmountOut = await dstRouter.fetchQuoteAmountOut(\n dstTokenIn,\n dstTokenOut,\n dstAmountInAfterFee,\n singleSlippage\n );\n\n const srcParameters: ExactInParameters = {\n protocol: srcRouter.getProtocol(),\n amountIn: srcTokenIn.computeUnitAmount(amountIn),\n minAmountOut: srcMinAmountOut,\n poolFee: srcRouter.getPoolFee(),\n deadline: srcRouter.getTradeDeadline(),\n path: [srcTokenIn.getAddress(), srcTokenOut.getAddress()],\n };\n\n const dstParameters: ExactInParameters = {\n protocol: dstRouter.getProtocol(),\n amountIn: dstTokenIn.computeUnitAmount(dstAmountInAfterFee),\n minAmountOut: dstMinAmountOut,\n poolFee: dstRouter.getPoolFee(),\n deadline: dstRouter.getTradeDeadline(),\n path: [dstTokenIn.getAddress(), dstTokenOut.getAddress()],\n };\n\n const params: ExactInCrossParameters = {\n src: srcParameters,\n dst: dstParameters,\n relayerFee: {\n amount: dstTokenIn.computeUnitAmount(relayerFeeUst),\n tokenAddress: this.dstTokenIn.getAddress(),\n },\n };\n return params;\n }\n\n async computeExactOutParameters(\n amountOut: string,\n slippage: string,\n relayerFeeUst: string\n ): Promise {\n const singleSlippage = splitSlippageInHalf(slippage);\n\n // dst quote first\n const dstRouter = this.dstRouter;\n const dstTokenIn = this.dstTokenIn;\n const dstTokenOut = this.dstTokenOut;\n const dstMaxAmountIn = await dstRouter.fetchQuoteAmountIn(\n dstTokenIn,\n dstTokenOut,\n amountOut,\n singleSlippage\n );\n\n // src quote\n const srcRouter = this.srcRouter;\n const srcAmountOut = this.dstTokenIn.formatAmount(dstMaxAmountIn);\n if (Number(srcAmountOut) < Number(relayerFeeUst)) {\n throw Error(\n `dstAmountIn <= relayerFeeUst. ${srcAmountOut} vs ${relayerFeeUst}`\n );\n }\n\n const srcTokenIn = this.srcTokenIn;\n const srcTokenOut = this.srcTokenOut;\n const srcAmountOutBeforeFee = srcTokenOut.addAmounts(\n srcAmountOut,\n relayerFeeUst\n );\n\n const srcMaxAmountIn = await srcRouter.fetchQuoteAmountIn(\n srcTokenIn,\n srcTokenOut,\n srcAmountOutBeforeFee,\n singleSlippage\n );\n\n const srcParameters: ExactOutParameters = {\n protocol: srcRouter.getProtocol(),\n amountOut: srcTokenOut.computeUnitAmount(srcAmountOutBeforeFee),\n maxAmountIn: srcMaxAmountIn,\n poolFee: srcRouter.getPoolFee(),\n deadline: srcRouter.getTradeDeadline(),\n path: [srcTokenIn.getAddress(), srcTokenOut.getAddress()],\n };\n\n const dstParameters: ExactOutParameters = {\n protocol: dstRouter.getProtocol(),\n amountOut: dstTokenOut.computeUnitAmount(amountOut),\n maxAmountIn: dstMaxAmountIn,\n poolFee: dstRouter.getPoolFee(),\n deadline: dstRouter.getTradeDeadline(),\n path: [dstTokenIn.getAddress(), dstTokenOut.getAddress()],\n };\n\n const params: ExactOutCrossParameters = {\n src: srcParameters,\n dst: dstParameters,\n relayerFee: {\n amount: dstTokenIn.computeUnitAmount(relayerFeeUst),\n tokenAddress: this.dstTokenIn.getAddress(),\n },\n };\n return params;\n }\n\n setDeadlines(deadline: string): void {\n this.srcRouter.setDeadline(deadline);\n this.dstRouter.setDeadline(deadline);\n }\n}\n","import { ethers } from \"ethers\";\nimport { CurrencyAmount, TradeType } from \"@uniswap/sdk-core\";\nimport { abi as IUniswapV2PairABI } from \"@uniswap/v2-core/build/UniswapV2Pair.json\";\nimport { computePairAddress, Pair, Route, Trade } from \"@uniswap/v2-sdk\";\n\nimport { UniEvmToken, UniswapRouterCore } from \"./uniswap-core\";\n\nexport const PROTOCOL = \"UniswapV2\";\n\nexport class SingleAmmSwapRouter extends UniswapRouterCore {\n factoryAddress: string;\n pairContract: ethers.Contract;\n pair: Pair;\n\n setFactoryAddress(factoryAddress: string) {\n this.factoryAddress = factoryAddress;\n return;\n }\n\n computePoolAddress(tokenIn: UniEvmToken, tokenOut: UniEvmToken): string {\n if (this.factoryAddress === undefined) {\n throw Error(\"factoryAddress is undefined. use setFactoryAddress\");\n }\n\n return computePairAddress({\n factoryAddress: this.factoryAddress,\n tokenA: tokenIn.getUniToken(),\n tokenB: tokenOut.getUniToken(),\n });\n }\n\n async computeAndVerifyPoolAddress(\n tokenIn: UniEvmToken,\n tokenOut: UniEvmToken\n ): Promise {\n const pairAddress = this.computePoolAddress(tokenIn, tokenOut);\n\n // verify by attempting to call factory()\n const poolContract = new ethers.Contract(\n pairAddress,\n IUniswapV2PairABI,\n this.provider\n );\n await poolContract.factory();\n\n return pairAddress;\n }\n\n async createPool(tokenIn: UniEvmToken, tokenOut: UniEvmToken): Promise {\n const pairAddress = this.computePoolAddress(tokenIn, tokenOut);\n\n const pairContract = new ethers.Contract(\n pairAddress,\n IUniswapV2PairABI,\n this.provider\n );\n\n const [token0, reserves] = await Promise.all([\n pairContract.token0(),\n pairContract.getReserves(),\n ]);\n\n const reserve0 = reserves._reserve0.toString();\n const reserve1 = reserves._reserve1.toString();\n\n if (token0.toLowerCase() === tokenIn.getAddress().toLowerCase()) {\n return new Pair(\n CurrencyAmount.fromRawAmount(tokenIn.getUniToken(), reserve0),\n CurrencyAmount.fromRawAmount(tokenOut.getUniToken(), reserve1)\n );\n }\n\n return new Pair(\n CurrencyAmount.fromRawAmount(tokenOut.getUniToken(), reserve0),\n CurrencyAmount.fromRawAmount(tokenIn.getUniToken(), reserve1)\n );\n }\n\n async fetchQuoteAmountOut(\n tokenIn: UniEvmToken,\n tokenOut: UniEvmToken,\n amountIn: string,\n slippage: string\n ): Promise {\n // create pool\n const pair = await this.createPool(tokenIn, tokenOut);\n // let's get that quote\n\n const route = new Route(\n [pair],\n tokenIn.getUniToken(),\n tokenOut.getUniToken()\n );\n const currencyAmountIn = tokenIn.computeCurrencyAmount(amountIn);\n\n const quote = new Trade(route, currencyAmountIn, TradeType.EXACT_INPUT);\n\n const decimals = tokenOut.getDecimals();\n const minAmountOut = ethers.FixedNumber.from(\n quote.outputAmount.toSignificant(decimals)\n );\n\n // calculate output amount with slippage\n const slippageMultiplier = ethers.FixedNumber.from(\"1\").subUnsafe(\n ethers.FixedNumber.from(slippage)\n );\n const minAmountOutWithSlippage = minAmountOut\n .mulUnsafe(slippageMultiplier)\n .round(decimals);\n\n return tokenOut.computeUnitAmount(minAmountOutWithSlippage.toString());\n }\n\n async fetchQuoteAmountIn(\n tokenIn: UniEvmToken,\n tokenOut: UniEvmToken,\n amountOut: string,\n slippage: string\n ): Promise {\n // create pool\n const pair = await this.createPool(tokenIn, tokenOut);\n // let's get that quote\n\n const route = new Route(\n [pair],\n tokenIn.getUniToken(),\n tokenOut.getUniToken()\n );\n const currencyAmountOut = tokenOut.computeCurrencyAmount(amountOut);\n\n const quote = new Trade(route, currencyAmountOut, TradeType.EXACT_OUTPUT);\n\n const decimals = tokenIn.getDecimals();\n const maxAmountIn = ethers.FixedNumber.from(\n quote.inputAmount.toSignificant(decimals)\n );\n\n const slippageDivisor = ethers.FixedNumber.from(\"1\").subUnsafe(\n ethers.FixedNumber.from(slippage)\n );\n const maxAmountInWithSlippage = maxAmountIn\n .divUnsafe(slippageDivisor)\n .round(decimals);\n\n return tokenIn.computeUnitAmount(maxAmountInWithSlippage.toString());\n }\n\n getProtocol(): string {\n return PROTOCOL;\n }\n}\n","import { ethers } from \"ethers\";\nimport { QUICKSWAP_FACTORY_ADDRESS } from \"../utils/consts\";\nimport { SingleAmmSwapRouter } from \"./uniswap-v2\";\n\nexport { PROTOCOL } from \"./uniswap-v2\";\n\nexport class QuickswapRouter extends SingleAmmSwapRouter {\n constructor(provider: ethers.providers.Provider) {\n super(provider);\n super.setFactoryAddress(QUICKSWAP_FACTORY_ADDRESS);\n }\n}\n","import { ethers } from \"ethers\";\nimport JSBI from \"jsbi\";\nimport { CurrencyAmount, Token, TradeType } from \"@uniswap/sdk-core\";\nimport { abi as IUniswapV3PoolABI } from \"@uniswap/v3-core/artifacts/contracts/interfaces/IUniswapV3Pool.sol/IUniswapV3Pool.json\";\nimport {\n computePoolAddress,\n FeeAmount,\n nearestUsableTick,\n Pool,\n Route,\n TickMath,\n TICK_SPACINGS,\n Trade,\n} from \"@uniswap/v3-sdk\";\n\nimport { UniEvmToken, UniswapRouterCore } from \"./uniswap-core\";\nimport { UNISWAP_V3_FACTORY_ADDRESS } from \"../utils/consts\";\n\nexport const PROTOCOL = \"UniswapV3\";\n\nexport class SingleAmmSwapRouter extends UniswapRouterCore {\n poolContract: ethers.Contract;\n pool: Pool;\n poolFee: FeeAmount;\n\n constructor(provider: ethers.providers.Provider) {\n super(provider);\n\n // set fee amount for our example\n this.poolFee = FeeAmount.MEDIUM;\n }\n\n getPoolFee(): string {\n return this.poolFee.toString();\n }\n\n computePoolAddress(tokenIn: UniEvmToken, tokenOut: UniEvmToken): string {\n return computePoolAddress({\n factoryAddress: UNISWAP_V3_FACTORY_ADDRESS,\n fee: this.poolFee,\n tokenA: tokenIn.getUniToken(),\n tokenB: tokenOut.getUniToken(),\n });\n }\n\n async computeAndVerifyPoolAddress(\n tokenIn: UniEvmToken,\n tokenOut: UniEvmToken\n ): Promise {\n const pairAddress = this.computePoolAddress(tokenIn, tokenOut);\n\n // verify by attempting to call factory()\n const poolContract = new ethers.Contract(\n pairAddress,\n IUniswapV3PoolABI,\n this.provider\n );\n await poolContract.factory();\n\n return pairAddress;\n }\n\n async createPool(tokenIn: UniEvmToken, tokenOut: UniEvmToken): Promise {\n const poolAddress = this.computePoolAddress(tokenIn, tokenOut);\n\n const poolContract = new ethers.Contract(\n poolAddress,\n IUniswapV3PoolABI,\n this.provider\n );\n this.poolContract = poolContract;\n\n const [liquidity, slot] = await Promise.all([\n poolContract.liquidity(),\n poolContract.slot0(),\n ]);\n\n // grab necessary data from slot\n const sqrtPriceX96 = slot[0];\n const tick = slot[1];\n\n // create JSBI version of liquidity numbers\n const bigLiq = JSBI.BigInt(liquidity);\n const negBigLiq = JSBI.multiply(bigLiq, JSBI.BigInt(-1));\n\n const tickConstructorArgs = [\n {\n index: nearestUsableTick(\n TickMath.MIN_TICK,\n TICK_SPACINGS[this.poolFee]\n ),\n liquidityNet: bigLiq,\n liquidityGross: bigLiq,\n },\n {\n index: nearestUsableTick(\n TickMath.MAX_TICK,\n TICK_SPACINGS[this.poolFee]\n ),\n liquidityNet: negBigLiq,\n liquidityGross: bigLiq,\n },\n ];\n\n return new Pool(\n tokenIn.getUniToken(),\n tokenOut.getUniToken(),\n this.poolFee,\n sqrtPriceX96.toString(), //note the description discrepancy - sqrtPriceX96 and sqrtRatioX96 are interchangable values\n liquidity,\n tick,\n tickConstructorArgs\n );\n }\n\n async computeTradeExactIn(\n tokenIn: UniEvmToken,\n tokenOut: UniEvmToken,\n amount: string\n ): Promise> {\n // create pool\n const pool = await this.createPool(tokenIn, tokenOut);\n // let's get that quote\n const amountIn = tokenIn.computeUnitAmount(amount);\n\n const route = new Route(\n [pool],\n tokenIn.getUniToken(),\n tokenOut.getUniToken()\n );\n return Trade.fromRoute(\n route,\n CurrencyAmount.fromRawAmount(tokenIn.getUniToken(), amountIn.toString()),\n TradeType.EXACT_INPUT\n );\n }\n\n async computeTradeExactOut(\n tokenIn: UniEvmToken,\n tokenOut: UniEvmToken,\n amount: string\n ): Promise> {\n // create pool\n const pool = await this.createPool(tokenIn, tokenOut);\n // let's get that quote\n const amountOut = tokenOut.computeUnitAmount(amount);\n\n const route = new Route(\n [pool],\n tokenIn.getUniToken(),\n tokenOut.getUniToken()\n );\n return Trade.fromRoute(\n route,\n CurrencyAmount.fromRawAmount(\n tokenOut.getUniToken(),\n amountOut.toString()\n ),\n TradeType.EXACT_OUTPUT\n );\n }\n\n async fetchQuoteAmountOut(\n tokenIn: UniEvmToken,\n tokenOut: UniEvmToken,\n amountIn: string,\n slippage: string\n ): Promise {\n // get the quote\n const trade = await this.computeTradeExactIn(tokenIn, tokenOut, amountIn);\n\n const decimals = tokenOut.getDecimals();\n\n // calculate output amount with slippage\n const minAmountOut = ethers.FixedNumber.from(\n trade.outputAmount.toSignificant(decimals)\n );\n\n const slippageMultiplier = ethers.FixedNumber.from(\"1\").subUnsafe(\n ethers.FixedNumber.from(slippage)\n );\n const minAmountOutWithSlippage = minAmountOut\n .mulUnsafe(slippageMultiplier)\n .round(decimals);\n\n return tokenOut.computeUnitAmount(minAmountOutWithSlippage.toString());\n }\n\n async fetchQuoteAmountIn(\n tokenIn: UniEvmToken,\n tokenOut: UniEvmToken,\n amountOut: string,\n slippage: string\n ): Promise {\n // get the quote\n const trade = await this.computeTradeExactOut(tokenIn, tokenOut, amountOut);\n\n const decimals = tokenIn.getDecimals();\n\n // calculate output amount with slippage\n const maxAmountIn = ethers.FixedNumber.from(\n trade.inputAmount.toSignificant(decimals)\n );\n\n const slippageDivisor = ethers.FixedNumber.from(\"1\").subUnsafe(\n ethers.FixedNumber.from(slippage)\n );\n const maxAmountInWithSlippage = maxAmountIn\n .divUnsafe(slippageDivisor)\n .round(decimals);\n\n return tokenIn.computeUnitAmount(maxAmountInWithSlippage.toString());\n }\n\n getProtocol(): string {\n return PROTOCOL;\n }\n}\n","import { ethers } from \"ethers\";\nimport { TransactionReceipt } from \"@ethersproject/abstract-provider\";\n\nexport const CROSSCHAINSWAP_GAS_PARAMETERS = {\n gasLimit: \"550000\",\n maxFeePerGas: \"250000000000\",\n maxPriorityFeePerGas: \"1690000000\",\n};\n\n// exact in\n//\nexport async function swapExactInFromVaaNative(\n swapContractWithSigner: ethers.Contract,\n signedVaa: Uint8Array\n): Promise {\n const tx = await swapContractWithSigner.recvAndSwapExactNativeIn(\n signedVaa,\n CROSSCHAINSWAP_GAS_PARAMETERS\n );\n return tx.wait();\n}\n\nexport async function swapExactInFromVaaToken(\n swapContractWithSigner: ethers.Contract,\n signedVaa: Uint8Array\n): Promise {\n const tx = await swapContractWithSigner.recvAndSwapExactIn(\n signedVaa,\n CROSSCHAINSWAP_GAS_PARAMETERS\n );\n return tx.wait();\n}\n\n// exact out (TODO: add to util)\n//\nexport async function swapExactOutFromVaaNative(\n swapContractWithSigner: ethers.Contract,\n signedVaa: Uint8Array\n): Promise {\n const tx = await swapContractWithSigner.recvAndSwapExactNativeOut(\n signedVaa,\n CROSSCHAINSWAP_GAS_PARAMETERS\n );\n return tx.wait();\n}\n\nexport async function swapExactOutFromVaaToken(\n swapContractWithSigner: ethers.Contract,\n signedVaa: Uint8Array\n): Promise {\n const tx = await swapContractWithSigner.recvAndSwapExactOut(\n signedVaa,\n CROSSCHAINSWAP_GAS_PARAMETERS\n );\n return tx.wait();\n}\n","import { ethers } from \"ethers\";\nimport { TransactionReceipt } from \"@ethersproject/abstract-provider\";\nimport {\n CHAIN_ID_POLYGON as WORMHOLE_CHAIN_ID_POLYGON,\n CHAIN_ID_ETH as WORMHOLE_CHAIN_ID_ETHEREUM,\n ChainId,\n getEmitterAddressEth,\n hexToUint8Array,\n nativeToHexString,\n parseSequenceFromLogEth,\n getSignedVAAWithRetry,\n} from \"@certusone/wormhole-sdk\";\nimport { grpc } from \"@improbable-eng/grpc-web\";\nimport { UniEvmToken } from \"../route/uniswap-core\";\nimport {\n PROTOCOL_UNISWAP_V2,\n // PROTOCOL_UNISWAP_V3,\n ExactInCrossParameters,\n ExactOutCrossParameters,\n QuoteType,\n UniswapToUniswapQuoter,\n} from \"../route/cross-quote\";\nimport {\n TOKEN_BRIDGE_ADDRESS_POLYGON,\n CORE_BRIDGE_ADDRESS_ETHEREUM,\n CORE_BRIDGE_ADDRESS_POLYGON,\n TOKEN_BRIDGE_ADDRESS_ETHEREUM,\n WORMHOLE_RPC_HOSTS,\n POLYGON_NETWORK_CHAIN_ID,\n ETH_NETWORK_CHAIN_ID,\n WETH_TOKEN_INFO,\n WMATIC_TOKEN_INFO,\n} from \"../utils/consts\";\nimport {\n CROSSCHAINSWAP_GAS_PARAMETERS,\n swapExactInFromVaaNative,\n swapExactInFromVaaToken,\n swapExactOutFromVaaNative,\n swapExactOutFromVaaToken,\n} from \"./util\";\nimport { abi as SWAP_CONTRACT_V2_ABI } from \"../abi/contracts/CrossChainSwapV2.json\";\nimport { abi as SWAP_CONTRACT_V3_ABI } from \"../abi/contracts/CrossChainSwapV3.json\";\nimport { SWAP_CONTRACT_ADDRESS as CROSSCHAINSWAP_CONTRACT_ADDRESS_ETHEREUM } from \"../addresses/goerli\";\nimport { SWAP_CONTRACT_ADDRESS as CROSSCHAINSWAP_CONTRACT_ADDRESS_POLYGON } from \"../addresses/mumbai\";\n\ninterface SwapContractParameters {\n address: string;\n}\n\ninterface WormholeParameters {\n chainId: ChainId;\n coreBridgeAddress: string;\n tokenBridgeAddress: string;\n}\n\ninterface ExecutionParameters {\n crossChainSwap: SwapContractParameters;\n wormhole: WormholeParameters;\n}\n\nconst EXECUTION_PARAMETERS_ETHEREUM: ExecutionParameters = {\n crossChainSwap: {\n address: CROSSCHAINSWAP_CONTRACT_ADDRESS_ETHEREUM,\n },\n wormhole: {\n chainId: WORMHOLE_CHAIN_ID_ETHEREUM,\n coreBridgeAddress: CORE_BRIDGE_ADDRESS_ETHEREUM,\n tokenBridgeAddress: TOKEN_BRIDGE_ADDRESS_ETHEREUM,\n },\n};\n\nconst EXECUTION_PARAMETERS_POLYGON: ExecutionParameters = {\n crossChainSwap: {\n address: CROSSCHAINSWAP_CONTRACT_ADDRESS_POLYGON,\n },\n wormhole: {\n chainId: WORMHOLE_CHAIN_ID_POLYGON,\n coreBridgeAddress: CORE_BRIDGE_ADDRESS_POLYGON,\n tokenBridgeAddress: TOKEN_BRIDGE_ADDRESS_POLYGON,\n },\n};\n\nfunction makeExecutionParameters(id: number): ExecutionParameters {\n switch (id) {\n case ETH_NETWORK_CHAIN_ID: {\n return EXECUTION_PARAMETERS_ETHEREUM;\n }\n case POLYGON_NETWORK_CHAIN_ID: {\n return EXECUTION_PARAMETERS_POLYGON;\n }\n default: {\n throw Error(\"unrecognized chain id\");\n }\n }\n}\n\nasync function approveContractTokenSpend(\n provider: ethers.providers.Provider,\n signer: ethers.Signer,\n tokenContract: ethers.Contract,\n swapContractAddress: string,\n amount: ethers.BigNumber\n): Promise {\n // build transaction for token spending\n const unsignedTx = await tokenContract.populateTransaction.approve(\n swapContractAddress,\n amount\n );\n\n const address = await signer.getAddress();\n\n // gas calcs\n const gas_limit = \"0x100000\";\n const gasPrice = await signer.getGasPrice();\n const parsedGasPrice = ethers.utils.hexlify(parseInt(gasPrice.toString()));\n\n console.log(\"gettingTranscationCount\", provider);\n\n unsignedTx.nonce = await provider.getTransactionCount(address, \"latest\");\n unsignedTx.gasLimit = ethers.BigNumber.from(ethers.utils.hexlify(gas_limit));\n unsignedTx.gasPrice = ethers.BigNumber.from(parsedGasPrice);\n console.log(\"done gettingTranscationCount\");\n\n // sign and send transaction\n const tx = await signer.sendTransaction(unsignedTx);\n return tx.wait();\n}\n\nfunction makeCrossChainSwapV3Contract(\n contractAddress: string,\n provider: ethers.providers.Provider\n): ethers.Contract {\n return new ethers.Contract(contractAddress, SWAP_CONTRACT_V3_ABI, provider);\n}\n\nfunction makeCrossChainSwapV2Contract(\n contractAddress: string,\n provider: ethers.providers.Provider\n): ethers.Contract {\n return new ethers.Contract(contractAddress, SWAP_CONTRACT_V2_ABI, provider);\n}\n\nfunction makeCrossChainSwapContract(\n provider: ethers.providers.Provider,\n protocol: string,\n contractAddress: string\n): ethers.Contract {\n if (protocol === PROTOCOL_UNISWAP_V2) {\n return makeCrossChainSwapV2Contract(contractAddress, provider);\n } else {\n return makeCrossChainSwapV3Contract(contractAddress, provider);\n }\n}\n\nfunction addressToBytes32(\n address: string,\n wormholeChainId: ChainId\n): Uint8Array {\n const hexString = nativeToHexString(address, wormholeChainId);\n if (hexString === null) {\n throw new Error(\"nativeToHexString returned null\");\n }\n return hexToUint8Array(hexString);\n}\n\nasync function approveAndSwapExactIn(\n srcProvider: ethers.providers.Provider,\n srcWallet: ethers.Signer,\n srcTokenIn: UniEvmToken,\n quoteParams: ExactInCrossParameters,\n srcExecutionParams: ExecutionParameters,\n dstExecutionParams: ExecutionParameters,\n isNative: boolean\n): Promise {\n const swapContractParams = srcExecutionParams.crossChainSwap;\n\n const protocol = quoteParams.src.protocol;\n const swapContract = makeCrossChainSwapContract(\n srcProvider,\n protocol,\n swapContractParams.address\n );\n const contractWithSigner = swapContract.connect(srcWallet);\n\n // approve and swap this amount\n const amountIn = quoteParams.src.amountIn;\n\n const address = await srcWallet.getAddress();\n\n const swapParams = [\n amountIn,\n quoteParams.src.minAmountOut,\n quoteParams.dst.minAmountOut,\n address,\n quoteParams.src.deadline,\n quoteParams.dst.poolFee || quoteParams.src.poolFee,\n ];\n\n const pathArray = quoteParams.src.path.concat(quoteParams.dst.path);\n\n const dstWormholeChainId = dstExecutionParams.wormhole.chainId;\n const dstContractAddress = addressToBytes32(\n dstExecutionParams.crossChainSwap.address,\n dstWormholeChainId\n );\n const bridgeNonce = 69;\n\n // do the swap\n if (isNative) {\n const gasPlusValue = {\n value: amountIn,\n gasLimit: CROSSCHAINSWAP_GAS_PARAMETERS.gasLimit,\n maxFeePerGas: CROSSCHAINSWAP_GAS_PARAMETERS.maxFeePerGas,\n maxPriorityFeePerGas: CROSSCHAINSWAP_GAS_PARAMETERS.maxPriorityFeePerGas,\n };\n\n console.info(\"swapExactNativeInAndTransfer\");\n const tx = await contractWithSigner.swapExactNativeInAndTransfer(\n swapParams,\n pathArray,\n quoteParams.relayerFee.amount,\n dstWormholeChainId,\n dstContractAddress,\n bridgeNonce,\n gasPlusValue\n );\n return tx.wait();\n } else {\n console.info(\"approving contract to spend token in\");\n await approveContractTokenSpend(\n srcProvider,\n srcWallet,\n srcTokenIn.getContract(),\n swapContract.address,\n amountIn\n );\n\n console.info(\"swapExactInAndTransfer\");\n const tx = await contractWithSigner.swapExactInAndTransfer(\n swapParams,\n pathArray,\n quoteParams.relayerFee.amount,\n dstWormholeChainId,\n dstContractAddress,\n bridgeNonce,\n CROSSCHAINSWAP_GAS_PARAMETERS\n );\n return tx.wait();\n }\n}\n\nasync function approveAndSwapExactOut(\n srcProvider: ethers.providers.Provider,\n srcWallet: ethers.Signer,\n srcTokenIn: UniEvmToken,\n quoteParams: ExactOutCrossParameters,\n srcExecutionParams: ExecutionParameters,\n dstExecutionParams: ExecutionParameters,\n isNative: boolean\n): Promise {\n const swapContractParams = srcExecutionParams.crossChainSwap;\n\n const protocol = quoteParams.src.protocol;\n const swapContract = makeCrossChainSwapContract(\n srcProvider,\n protocol,\n swapContractParams.address\n );\n const contractWithSigner = swapContract.connect(srcWallet);\n\n // approve and swap this amount\n const amountOut = quoteParams.src.amountOut;\n const maxAmountIn = quoteParams.src.maxAmountIn;\n\n const address = await srcWallet.getAddress();\n\n const swapParams = [\n amountOut,\n maxAmountIn,\n quoteParams.dst.amountOut,\n address,\n quoteParams.src.deadline,\n quoteParams.dst.poolFee || quoteParams.src.poolFee,\n ];\n const pathArray = quoteParams.src.path.concat(quoteParams.dst.path);\n\n const dstWormholeChainId = dstExecutionParams.wormhole.chainId;\n const dstContractAddress = addressToBytes32(\n dstExecutionParams.crossChainSwap.address,\n dstWormholeChainId\n );\n const bridgeNonce = 69;\n\n // do the swap\n if (isNative) {\n const gasPlusValue = {\n value: maxAmountIn,\n gasLimit: CROSSCHAINSWAP_GAS_PARAMETERS.gasLimit,\n maxFeePerGas: CROSSCHAINSWAP_GAS_PARAMETERS.maxFeePerGas,\n maxPriorityFeePerGas: CROSSCHAINSWAP_GAS_PARAMETERS.maxPriorityFeePerGas,\n };\n\n console.info(\"swapExactNativeOutAndTransfer\");\n const tx = await contractWithSigner.swapExactNativeOutAndTransfer(\n swapParams,\n pathArray,\n quoteParams.relayerFee.amount,\n dstWormholeChainId,\n dstContractAddress,\n bridgeNonce,\n gasPlusValue\n );\n return tx.wait();\n } else {\n console.info(\"approving contract to spend token in\");\n await approveContractTokenSpend(\n srcProvider,\n srcWallet,\n srcTokenIn.getContract(),\n swapContract.address,\n maxAmountIn\n );\n\n console.info(\"swapExactOutAndTransfer\");\n const tx = await contractWithSigner.swapExactOutAndTransfer(\n swapParams,\n pathArray,\n quoteParams.relayerFee.amount,\n dstWormholeChainId,\n dstContractAddress,\n bridgeNonce,\n CROSSCHAINSWAP_GAS_PARAMETERS\n );\n return tx.wait();\n }\n}\n\nasync function swapExactInFromVaa(\n dstProvider: ethers.providers.Provider,\n dstWallet: ethers.Signer,\n dstExecutionParams: ExecutionParameters,\n dstProtocol: string,\n signedVaa: Uint8Array,\n isNative: boolean\n): Promise {\n const swapContractParams = dstExecutionParams.crossChainSwap;\n\n const swapContract = makeCrossChainSwapContract(\n dstProvider,\n dstProtocol,\n swapContractParams.address\n );\n const contractWithSigner = swapContract.connect(dstWallet);\n\n if (isNative) {\n console.info(\"swapExactInFromVaaNative\");\n return swapExactInFromVaaNative(contractWithSigner, signedVaa);\n } else {\n console.info(\"swapExactInFromVaaToken\");\n return swapExactInFromVaaToken(contractWithSigner, signedVaa);\n }\n}\n\nasync function swapExactOutFromVaa(\n dstProvider: ethers.providers.Provider,\n dstWallet: ethers.Signer,\n dstExecutionParams: ExecutionParameters,\n dstProtocol: string,\n signedVaa: Uint8Array,\n isNative: boolean\n): Promise {\n const swapContractParams = dstExecutionParams.crossChainSwap;\n\n const swapContract = makeCrossChainSwapContract(\n dstProvider,\n dstProtocol,\n swapContractParams.address\n );\n const contractWithSigner = swapContract.connect(dstWallet);\n\n if (isNative) {\n console.info(\"swapExactOutFromVaaNative\");\n return swapExactOutFromVaaNative(contractWithSigner, signedVaa);\n } else {\n console.info(\"swapExactOutFromVaaToken\");\n return swapExactOutFromVaaToken(contractWithSigner, signedVaa);\n }\n}\n\ninterface CrossChainSwapTokens {\n srcIn: UniEvmToken;\n srcOut: UniEvmToken;\n dstIn: UniEvmToken;\n dstOut: UniEvmToken;\n}\n\ninterface VaaSearchParams {\n sequence: string;\n emitterAddress: string;\n}\n\nexport function makeProvider(tokenAddress: string) {\n switch (tokenAddress) {\n case WETH_TOKEN_INFO.address: {\n const url = process.env.REACT_APP_GOERLI_PROVIDER;\n if (!url) {\n throw new Error(\"Could not find REACT_APP_GOERLI_PROVIDER\");\n }\n return new ethers.providers.StaticJsonRpcProvider(url);\n }\n case WMATIC_TOKEN_INFO.address: {\n const url = process.env.REACT_APP_MUMBAI_PROVIDER;\n if (!url) {\n throw new Error(\"Could not find REACT_APP_MUMBAI_PROVIDER\");\n }\n return new ethers.providers.StaticJsonRpcProvider(url);\n }\n default: {\n throw Error(\"unrecognized token address\");\n }\n }\n}\n\nexport class UniswapToUniswapExecutor {\n // quoting\n quoter: UniswapToUniswapQuoter;\n cachedExactInParams: ExactInCrossParameters;\n cachedExactOutParams: ExactOutCrossParameters;\n quoteType: QuoteType;\n tokens: CrossChainSwapTokens;\n\n // swapping\n isNative: boolean;\n slippage: string;\n relayerFeeAmount: string;\n srcExecutionParams: ExecutionParameters;\n dstExecutionParams: ExecutionParameters;\n\n // vaa handling\n transportFactory: grpc.TransportFactory;\n vaaSearchParams: VaaSearchParams;\n vaaBytes: Uint8Array;\n srcReceipt: TransactionReceipt;\n dstReceipt: TransactionReceipt;\n\n async initialize(\n tokenInAddress: string,\n tokenOutAddress: string,\n isNative: boolean\n ): Promise {\n this.isNative = isNative;\n\n const srcProvider = makeProvider(tokenInAddress);\n const dstProvider = makeProvider(tokenOutAddress);\n\n this.quoter = new UniswapToUniswapQuoter(srcProvider, dstProvider);\n await this.quoter.initialize();\n\n await this.makeTokens(tokenInAddress, tokenOutAddress);\n\n // now that we have a chain id for each network, get contract info for each chain\n this.srcExecutionParams = makeExecutionParameters(\n this.quoter.srcNetwork.chainId\n );\n this.dstExecutionParams = makeExecutionParameters(\n this.quoter.dstNetwork.chainId\n );\n }\n\n setSlippage(slippage: string): void {\n this.slippage = slippage;\n }\n\n setRelayerFee(amount: string): void {\n this.relayerFeeAmount = amount;\n }\n\n areSwapParametersUndefined(): boolean {\n return this.slippage === undefined || this.relayerFeeAmount === undefined;\n }\n\n setDeadlines(deadline: string): void {\n this.quoter.setDeadlines(deadline);\n }\n\n async makeTokens(\n tokenInAddress: string,\n tokenOutAddress: string\n ): Promise {\n const quoter = this.quoter;\n\n const [srcTokenIn, srcTokenOut] = await quoter.makeSrcTokens(\n tokenInAddress\n );\n const [dstTokenIn, dstTokenOut] = await quoter.makeDstTokens(\n tokenOutAddress\n );\n\n this.tokens = {\n srcIn: srcTokenIn,\n srcOut: srcTokenOut,\n dstIn: dstTokenIn,\n dstOut: dstTokenOut,\n };\n }\n\n getTokens(): CrossChainSwapTokens {\n return this.tokens;\n }\n\n async computeAndVerifySrcPoolAddress(): Promise {\n return this.quoter.computeAndVerifySrcPoolAddress();\n }\n\n async computeAndVerifyDstPoolAddress(): Promise {\n return this.quoter.computeAndVerifyDstPoolAddress();\n }\n\n async computeQuoteExactIn(amountIn: string): Promise {\n if (this.areSwapParametersUndefined()) {\n throw Error(\"undefined swap parameters\");\n }\n\n this.cachedExactInParams = await this.quoter.computeExactInParameters(\n amountIn,\n this.slippage,\n this.relayerFeeAmount\n );\n this.quoteType = QuoteType.ExactIn;\n return this.cachedExactInParams;\n }\n\n async computeQuoteExactOut(\n amountOut: string\n ): Promise {\n if (this.areSwapParametersUndefined()) {\n throw Error(\"undefined swap parameters\");\n }\n\n this.cachedExactOutParams = await this.quoter.computeExactOutParameters(\n amountOut,\n this.slippage,\n this.relayerFeeAmount\n );\n this.quoteType = QuoteType.ExactOut;\n return this.cachedExactOutParams;\n }\n\n getSrcProvider(): ethers.providers.Provider {\n return this.quoter.srcProvider;\n }\n\n getDstProvider(): ethers.providers.Provider {\n return this.quoter.dstProvider;\n }\n\n async approveAndSwapExactIn(\n wallet: ethers.Signer\n ): Promise {\n return approveAndSwapExactIn(\n this.getSrcProvider(),\n wallet,\n this.tokens.srcIn,\n this.cachedExactInParams,\n this.srcExecutionParams,\n this.dstExecutionParams,\n this.isNative\n );\n }\n\n async approveAndSwapExactOut(\n wallet: ethers.Signer\n ): Promise {\n return approveAndSwapExactOut(\n this.getSrcProvider(),\n wallet,\n this.tokens.srcIn,\n this.cachedExactOutParams,\n this.srcExecutionParams,\n this.dstExecutionParams,\n this.isNative\n );\n }\n\n async approveAndSwap(wallet: ethers.Signer): Promise {\n const quoteType = this.quoteType;\n\n if (quoteType === QuoteType.ExactIn) {\n this.srcReceipt = await this.approveAndSwapExactIn(wallet);\n } else if (quoteType === QuoteType.ExactOut) {\n this.srcReceipt = await this.approveAndSwapExactOut(wallet);\n } else {\n throw Error(\"no quote found\");\n }\n\n this.fetchAndSetEmitterAndSequence();\n return this.srcReceipt;\n }\n\n fetchAndSetEmitterAndSequence(): void {\n const receipt = this.srcReceipt;\n if (receipt === undefined) {\n throw Error(\"no swap receipt found\");\n }\n\n const wormholeParams = this.srcExecutionParams.wormhole;\n\n this.vaaSearchParams = {\n sequence: parseSequenceFromLogEth(\n receipt,\n wormholeParams.coreBridgeAddress\n ),\n emitterAddress: getEmitterAddressEth(wormholeParams.tokenBridgeAddress),\n };\n }\n\n async fetchSignedVaaFromSwap(): Promise {\n const vaaSearchParams = this.vaaSearchParams;\n if (vaaSearchParams === undefined) {\n throw Error(\"no vaa search params found\");\n }\n const sequence = vaaSearchParams.sequence;\n const emitterAddress = vaaSearchParams.emitterAddress;\n console.info(`sequence: ${sequence}, emitterAddress: ${emitterAddress}`);\n // wait for VAA to be signed\n const vaaResponse = await getSignedVAAWithRetry(\n WORMHOLE_RPC_HOSTS,\n this.srcExecutionParams.wormhole.chainId,\n vaaSearchParams.emitterAddress,\n vaaSearchParams.sequence\n );\n // grab vaaBytes\n this.vaaBytes = vaaResponse.vaaBytes;\n }\n\n async fetchVaaAndSwap(wallet: ethers.Signer): Promise {\n await this.fetchSignedVaaFromSwap();\n\n const quoteType = this.quoteType;\n\n if (quoteType === QuoteType.ExactIn) {\n this.dstReceipt = await this.swapExactInFromVaa(wallet);\n } else if (quoteType === QuoteType.ExactOut) {\n this.dstReceipt = await this.swapExactOutFromVaa(wallet);\n } else {\n throw Error(\"no quote found\");\n }\n\n return this.dstReceipt;\n }\n\n async swapExactInFromVaa(wallet: ethers.Signer): Promise {\n return swapExactInFromVaa(\n this.getDstProvider(),\n wallet,\n this.dstExecutionParams,\n this.cachedExactInParams.dst.protocol,\n this.vaaBytes,\n this.isNative\n );\n }\n\n async swapExactOutFromVaa(\n wallet: ethers.Signer\n ): Promise {\n return swapExactOutFromVaa(\n this.getDstProvider(),\n wallet,\n this.dstExecutionParams,\n this.cachedExactOutParams.dst.protocol,\n this.vaaBytes,\n this.isNative\n );\n }\n\n //getSwapResult(\n // walletAddress: string,\n // onSwapResult: (result: boolean) => void\n //) {\n // console.log(this.cachedExactInParams.dst.protocol);\n // console.log(this.dstExecutionParams.crossChainSwap.address);\n // const contract = makeCrossChainSwapContract(\n // this.getDstProvider(),\n // this.quoteType === QuoteType.ExactIn\n // ? this.cachedExactInParams.dst.protocol\n // : this.cachedExactOutParams.dst.protocol,\n // this.dstExecutionParams.crossChainSwap.address\n // );\n // const filter = contract.filters.SwapResult(walletAddress);\n // contract.once(\n // filter,\n // (recipient, tokenAddress, caller, amount, success) => {\n // onSwapResult(success);\n // }\n // );\n //}\n}\n","export const SWAP_CONTRACT_ADDRESS =\n \"0xDE3a69BFd962Eb16Ae742FdbA42ac48bb3b4E8fD\";\n","export const SWAP_CONTRACT_ADDRESS =\n \"0xe34Bda733530C5687Bd2aCaB093218edCCA142E4\";\n","const MM_ERR_WITH_INFO_START =\n \"VM Exception while processing transaction: revert \";\nconst parseError = (e: any) =>\n e?.data?.message?.startsWith(MM_ERR_WITH_INFO_START)\n ? e.data.message.replace(MM_ERR_WITH_INFO_START, \"\")\n : e?.response?.data?.error // terra error\n ? e.response.data.error\n : e?.message\n ? e.message\n : \"An unknown error occurred\";\nexport default parseError;\n","import {\n Button,\n Dialog,\n DialogContent,\n DialogTitle,\n InputAdornment,\n TextField,\n} from \"@material-ui/core\";\nimport SettingsIcon from \"@material-ui/icons/Settings\";\nimport { makeStyles } from \"@material-ui/styles\";\nimport { useState } from \"react\";\n\nconst useStyles = makeStyles({\n topScrollPaper: {\n alignItems: \"flex-start\",\n },\n topPaperScrollBody: {\n verticalAlign: \"top\",\n },\n button: {\n float: \"right\",\n \"&:hover\": {\n backgroundColor: \"transparent\",\n },\n },\n});\n\nconst clamp = (value: number, min: number, max: number) => {\n if (isNaN(value)) {\n return value;\n }\n return Math.min(Math.max(min, value), max);\n};\n\nexport default function Settings({\n disabled,\n slippage,\n deadline,\n onSlippageChange,\n onDeadlineChange,\n}: {\n disabled: boolean;\n slippage: string;\n deadline: string;\n onSlippageChange: (slippage: string) => void;\n onDeadlineChange: (deadline: string) => void;\n}) {\n const classes = useStyles();\n const [dialogIsOpen, setDialogIsOpen] = useState(false);\n\n const dialog = (\n setDialogIsOpen(false)}\n maxWidth=\"xs\"\n scroll=\"paper\"\n >\n Transaction Settings\n \n %,\n }}\n margin=\"normal\"\n type=\"number\"\n onChange={(event) => {\n onSlippageChange(\n event.target.value === \"\"\n ? \"\"\n : clamp(parseFloat(event.target.value), 0, 100).toString()\n );\n }}\n >\n minutes\n ),\n }}\n margin=\"normal\"\n type=\"number\"\n onChange={(event) => {\n onDeadlineChange(\n event.target.value === \"\"\n ? \"\"\n : clamp(parseFloat(event.target.value), 1, 100).toString()\n );\n }}\n >\n \n \n );\n\n return (\n
\n {\n setDialogIsOpen(true);\n }}\n disabled={disabled}\n disableRipple\n endIcon={}\n />\n {dialog}\n
\n );\n}\n","import { getIsTransferCompletedEth } from \"@certusone/wormhole-sdk\";\nimport { ethers } from \"ethers\";\n\nexport default async function getIsTransferCompletedEvmWithRetry(\n tokenBridgeAddress: string,\n provider: ethers.providers.Provider,\n signedVAA: Uint8Array,\n retryTimeoutMs: number,\n retryAttempts: number\n) {\n let result = false;\n let attempts = 0;\n while (attempts < retryAttempts) {\n try {\n result = await getIsTransferCompletedEth(\n tokenBridgeAddress,\n provider,\n signedVAA\n );\n } catch (e) {\n console.error(e);\n }\n if (result) {\n break;\n }\n await new Promise((resolve) => setTimeout(resolve, retryTimeoutMs));\n attempts++;\n }\n return result;\n}\n","import \"../css/CircleLoader.css\";\n\nexport default function CircleLoader() {\n return (\n
\n
\n
\n
\n
\n );\n}\n","import { ChainId, CHAIN_ID_POLYGON, isEVMChain } from \"@certusone/wormhole-sdk\";\nimport { LinearProgress, makeStyles, Typography } from \"@material-ui/core\";\nimport { useEffect, useState } from \"react\";\nimport { useEthereumProvider } from \"../contexts/EthereumProviderContext\";\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n marginTop: theme.spacing(2),\n textAlign: \"center\",\n },\n message: {\n marginTop: theme.spacing(1),\n },\n}));\n\nexport default function TransactionProgress({\n chainId,\n txBlockNumber,\n step,\n}: {\n chainId: ChainId;\n txBlockNumber: number | undefined;\n step: number;\n}) {\n const classes = useStyles();\n const { provider } = useEthereumProvider();\n const [currentBlock, setCurrentBlock] = useState(0);\n useEffect(() => {\n if (step !== 1 || !txBlockNumber) return;\n if (isEVMChain(chainId) && provider) {\n let cancelled = false;\n (async () => {\n while (!cancelled) {\n await new Promise((resolve) => setTimeout(resolve, 500));\n try {\n const newBlock = await provider.getBlockNumber();\n if (!cancelled) {\n setCurrentBlock(newBlock);\n }\n } catch (e) {\n console.error(e);\n }\n }\n })();\n return () => {\n cancelled = true;\n };\n }\n }, [step, chainId, provider, txBlockNumber]);\n const blockDiff =\n txBlockNumber !== undefined && txBlockNumber && currentBlock\n ? currentBlock - txBlockNumber\n : 0;\n const expectedBlocks = 15;\n let value;\n let valueBuffer;\n let message;\n switch (step) {\n case 1:\n value = (blockDiff / expectedBlocks) * 50;\n valueBuffer = 50;\n message = `Waiting for ${blockDiff} / ${expectedBlocks} confirmations on ${\n chainId === CHAIN_ID_POLYGON ? \"Polygon\" : \"Ethereum\"\n }...`;\n break;\n case 2:\n value = 50;\n valueBuffer = 100;\n message = \"Waiting for relayer to complete swap...\";\n break;\n case 3:\n value = 100;\n valueBuffer = 100;\n message = \"\";\n break;\n }\n return (\n
\n \n \n {message}\n \n
\n );\n}\n","import {\n Collapse,\n Container,\n Link,\n makeStyles,\n Paper,\n TextField,\n Typography,\n} from \"@material-ui/core\";\nimport { ChainId, getSignedVAAWithRetry } from \"@certusone/wormhole-sdk\";\nimport { useCallback, useEffect, useState } from \"react\";\nimport ButtonWithLoader from \"../components/ButtonWithLoader\";\nimport EthereumSignerKey from \"../components/EthereumSignerKey\";\nimport TokenSelect from \"../components/TokenSelect\";\nimport { useEthereumProvider } from \"../contexts/EthereumProviderContext\";\nimport {\n ETH_TOKEN_INFO,\n getEvmChainId,\n MATIC_TOKEN_INFO,\n RELAYER_FEE_UST,\n TOKEN_INFOS,\n WETH_TOKEN_INFO,\n WMATIC_TOKEN_INFO,\n WORMHOLE_RPC_HOSTS,\n} from \"../utils/consts\";\nimport { COLORS } from \"../muiTheme\";\nimport Wormhole from \"../icons/wormhole-network.svg\";\nimport { UniswapToUniswapExecutor } from \"../swapper/swapper\";\nimport { Web3Provider } from \"@ethersproject/providers\";\nimport { hexlify, hexStripZeros } from \"ethers/lib/utils\";\nimport { useDebouncedCallback } from \"use-debounce\";\nimport { useSnackbar } from \"notistack\";\nimport { Alert } from \"@material-ui/lab\";\nimport parseError from \"../utils/parseError\";\nimport Settings from \"../components/Settings\";\nimport getIsTransferCompletedEvmWithRetry from \"../utils/getIsTransferCompletedWithRetry\";\nimport CircleLoader from \"../components/CircleLoader\";\nimport { ArrowForward, CheckCircleOutlineRounded } from \"@material-ui/icons\";\nimport SwapProgress from \"../components/SwapProgress\";\n\nconst useStyles = makeStyles((theme) => ({\n bg: {\n background:\n \"linear-gradient(160deg, rgba(69,74,117,.1) 0%, rgba(138,146,178,.1) 33%, rgba(69,74,117,.1) 66%, rgba(98,104,143,.1) 100%), linear-gradient(45deg, rgba(153,69,255,.1) 0%, rgba(121,98,231,.1) 20%, rgba(0,209,140,.1) 100%)\",\n display: \"flex\",\n flexDirection: \"column\",\n minHeight: \"100vh\",\n },\n centeredContainer: {\n textAlign: \"center\",\n width: \"100%\",\n },\n mainPaper: {\n padding: \"2rem\",\n backgroundColor: COLORS.nearBlackWithMinorTransparency,\n },\n numberField: {\n flexGrow: 1,\n \"& > * > .MuiInputBase-input\": {\n textAlign: \"center\",\n height: \"100%\",\n flexGrow: \"1\",\n fontSize: \"3rem\",\n fontFamily: \"Roboto Mono, monospace\",\n caretShape: \"block\",\n \"&::-webkit-outer-spin-button, &::-webkit-inner-spin-button\": {\n \"-webkit-appearance\": \"none\",\n \"-moz-appearance\": \"none\",\n margin: 0,\n },\n \"&[type=number]\": {\n \"-webkit-appearance\": \"textfield\",\n \"-moz-appearance\": \"textfield\",\n },\n },\n \"& > * > input::-webkit-inner-spin-button\": {\n webkitAppearance: \"none\",\n margin: \"0\",\n },\n },\n gradientButton: {\n backgroundImage: `linear-gradient(45deg, ${COLORS.blue} 0%, ${COLORS.nearBlack}20 50%, ${COLORS.blue}30 62%, ${COLORS.nearBlack}50 120%)`,\n transition: \"0.75s\",\n backgroundSize: \"200% auto\",\n boxShadow: \"0 0 20px #222\",\n \"&:hover\": {\n backgroundPosition:\n \"right center\" /* change the direction of the change here */,\n },\n width: \"100%\",\n height: \"3rem\",\n marginTop: \"1rem\",\n },\n disabled: {\n background: COLORS.gray,\n },\n spacer: {\n height: \"1rem\",\n },\n titleBar: {\n marginTop: \"10rem\",\n \"& > *\": {\n margin: \".5rem\",\n alignSelf: \"flex-end\",\n },\n },\n tokenSelectWrapper: {\n display: \"flex\",\n alignItems: \"center\",\n },\n wormholeIcon: {\n height: 60,\n filter: \"contrast(0)\",\n transition: \"filter 0.5s\",\n \"&:hover\": {\n filter: \"contrast(1)\",\n },\n verticalAlign: \"middle\",\n margin: \"1rem\",\n display: \"inline-block\",\n },\n loaderHolder: {\n display: \"flex\",\n justifyContent: \"center\",\n flexDirection: \"column\",\n alignItems: \"center\",\n },\n successIcon: {\n color: COLORS.green,\n fontSize: \"200px\",\n },\n swapPath: {\n display: \"inline-flex\",\n alignItems: \"center\",\n },\n}));\n\nconst switchProviderNetwork = async (\n provider: Web3Provider,\n chainId: ChainId\n) => {\n const evmChainId = getEvmChainId(chainId);\n if (evmChainId === undefined) {\n throw new Error(\"Unknown chainId\");\n }\n await provider.send(\"wallet_switchEthereumChain\", [\n { chainId: hexStripZeros(hexlify(evmChainId)) },\n ]);\n const network = await provider.getNetwork();\n if (network.chainId !== evmChainId) {\n throw new Error(\"Could not switch network\");\n }\n};\n\nexport default function Home() {\n const classes = useStyles();\n const [sourceTokenInfo, setSourceTokenInfo] = useState(MATIC_TOKEN_INFO);\n const [targetTokenInfo, setTargetTokenInfo] = useState(ETH_TOKEN_INFO);\n const [amountIn, setAmountIn] = useState(\"\");\n const [amountInUST, setAmountInUST] = useState(\"\");\n const [amountOut, setAmountOut] = useState(\"\");\n const [deadline, setDeadline] = useState(\"30\");\n const [slippage, setSlippage] = useState(\"1\");\n const [executor, setExecutor] = useState(\n null\n );\n const [isSwapping, setIsSwapping] = useState(false);\n const [isComputingQuote, setIsComputingQuote] = useState(false);\n const [hasQuote, setHasQuote] = useState(false);\n const { provider, signer } = useEthereumProvider();\n const { enqueueSnackbar } = useSnackbar();\n const [isFirstSwapComplete, setIsFirstSwapComplete] = useState(false);\n const [isSecondSwapComplete, setIsSecondSwapComplete] = useState(false);\n const [sourceTxBlockNumber, setSourceTxBlockNumber] = useState<\n number | undefined\n >(undefined);\n const [hasSignedVAA, setHasSignedVAA] = useState(false);\n const [relayerTimeoutString, setRelayerTimeoutString] = useState(\"\");\n\n const computeQuote = useCallback(() => {\n (async () => {\n setHasQuote(false);\n setIsComputingQuote(true);\n setAmountOut(\"\");\n setAmountInUST(\"\");\n try {\n if (\n parseFloat(amountIn) > 0 &&\n !isNaN(parseFloat(deadline)) &&\n !isNaN(parseFloat(slippage))\n ) {\n const executor = new UniswapToUniswapExecutor();\n await executor.initialize(\n sourceTokenInfo.address,\n targetTokenInfo.address,\n sourceTokenInfo.isNative\n );\n await executor.computeAndVerifySrcPoolAddress().catch((e) => {\n throw new Error(\"failed to verify source pool address\");\n });\n await executor.computeAndVerifyDstPoolAddress().catch((e) => {\n throw new Error(\"failed to verify dest pool address\");\n });\n executor.setDeadlines((parseFloat(deadline) * 60).toString());\n executor.setSlippage((parseFloat(slippage) / 100).toString());\n executor.setRelayerFee(RELAYER_FEE_UST);\n const quote = await executor.computeQuoteExactIn(amountIn);\n setExecutor(executor);\n setAmountOut(\n parseFloat(\n executor.tokens.dstOut.formatAmount(quote.dst.minAmountOut)\n ).toFixed(8)\n );\n setAmountInUST(\n parseFloat(\n executor.tokens.dstIn.formatAmount(quote.dst.amountIn)\n ).toFixed(2)\n );\n setHasQuote(true);\n }\n } catch (e) {\n console.error(e);\n enqueueSnackbar(null, {\n content: {parseError(e)},\n });\n }\n setIsComputingQuote(false);\n })();\n }, [\n sourceTokenInfo,\n targetTokenInfo,\n amountIn,\n deadline,\n slippage,\n enqueueSnackbar,\n ]);\n\n const debouncedComputeQuote = useDebouncedCallback(computeQuote, 1000);\n\n useEffect(() => {\n debouncedComputeQuote();\n }, [\n sourceTokenInfo,\n targetTokenInfo,\n amountIn,\n deadline,\n slippage,\n debouncedComputeQuote,\n ]);\n\n const handleAmountChange = useCallback((event) => {\n setAmountIn(event.target.value);\n }, []);\n\n const handleSlippageChange = useCallback((slippage) => {\n setSlippage(slippage);\n }, []);\n\n const handleDeadlineChange = useCallback((deadline) => {\n setDeadline(deadline);\n }, []);\n\n const handleSourceChange = useCallback((event) => {\n // NOTE: only native-to-native or wrapped-to-wrapped swaps are currently supported\n if (event.target.value === WMATIC_TOKEN_INFO.name) {\n setSourceTokenInfo(WMATIC_TOKEN_INFO);\n setTargetTokenInfo(WETH_TOKEN_INFO);\n } else if (event.target.value === WETH_TOKEN_INFO.name) {\n setSourceTokenInfo(WETH_TOKEN_INFO);\n setTargetTokenInfo(WMATIC_TOKEN_INFO);\n } else if (event.target.value === ETH_TOKEN_INFO.name) {\n setSourceTokenInfo(ETH_TOKEN_INFO);\n setTargetTokenInfo(MATIC_TOKEN_INFO);\n } else {\n setSourceTokenInfo(MATIC_TOKEN_INFO);\n setTargetTokenInfo(ETH_TOKEN_INFO);\n }\n setAmountIn(\"\");\n setAmountOut(\"\");\n }, []);\n\n const reset = useCallback(() => {\n setIsSwapping(false);\n setHasQuote(false);\n setIsFirstSwapComplete(false);\n setIsSecondSwapComplete(false);\n setAmountIn(\"\");\n setAmountOut(\"\");\n setSourceTxBlockNumber(undefined);\n setRelayerTimeoutString(\"\");\n }, []);\n\n const handleSwapClick = useCallback(async () => {\n if (provider && signer && executor) {\n try {\n setIsSwapping(true);\n setIsFirstSwapComplete(false);\n setHasSignedVAA(false);\n setIsSecondSwapComplete(false);\n setRelayerTimeoutString(\"\");\n await switchProviderNetwork(provider, sourceTokenInfo.chainId);\n\n const sourceReceipt = await executor.approveAndSwap(signer);\n console.info(\n \"firstSwapTransactionHash:\",\n sourceReceipt.transactionHash\n );\n setIsFirstSwapComplete(true);\n setSourceTxBlockNumber(sourceReceipt.blockNumber);\n\n // Wait for the guardian network to reach consensus and emit the signedVAA\n const { vaaBytes } = await getSignedVAAWithRetry(\n WORMHOLE_RPC_HOSTS,\n executor.srcExecutionParams.wormhole.chainId,\n executor.vaaSearchParams.emitterAddress,\n executor.vaaSearchParams.sequence\n );\n setHasSignedVAA(true);\n // Check if the signedVAA has redeemed by the relayer\n const isCompleted = await getIsTransferCompletedEvmWithRetry(\n executor.dstExecutionParams.wormhole.tokenBridgeAddress,\n executor.quoter.dstProvider,\n vaaBytes,\n // retry for two minutes\n 3000,\n 40\n );\n if (!isCompleted) {\n // If the relayer hasn't redeemed the signedVAA, then manually redeem it ourselves\n setRelayerTimeoutString(\n \"Timed out waiting for relayer to complete swap. You'll need to complete it yourself.\"\n );\n await switchProviderNetwork(provider, targetTokenInfo.chainId);\n const targetReceipt = await executor.fetchVaaAndSwap(signer);\n console.info(\n \"secondSwapTransactionHash:\",\n targetReceipt.transactionHash\n );\n }\n setIsSecondSwapComplete(true);\n } catch (e: any) {\n reset();\n console.error(e);\n enqueueSnackbar(null, {\n content: {parseError(e)},\n });\n }\n }\n }, [\n provider,\n signer,\n executor,\n enqueueSnackbar,\n sourceTokenInfo,\n targetTokenInfo,\n reset,\n ]);\n\n const readyToSwap = provider && signer && hasQuote;\n\n return (\n
\n \n
\n \n Wormhole NativeSwap Demo\n \n
\n \n \n \n \n Send\n \n {parseFloat(amountIn) > sourceTokenInfo.maxAmount ? (\n {`The max input amount is ${sourceTokenInfo.maxAmount} ${sourceTokenInfo.name}`}\n ) : null}\n
\n {}}\n disabled={true}\n >\n Receive (estimated)\n \n {`Slippage tolerance: ${slippage}%`}\n {!isSwapping && }\n sourceTokenInfo.maxAmount}\n showLoader={isSwapping}\n onClick={handleSwapClick}\n >\n Swap\n \n \n \n
\n \n
\n \n {`Your ${sourceTokenInfo.name} is being swapped to ${targetTokenInfo.name}`}\n \n
\n \n \n
\n \n Swap completed!\n reset()}>\n Swap more tokens!\n \n
\n
\n
\n {hasQuote && (\n \n {`${amountIn} ${sourceTokenInfo.name}`}\n \n {`${amountInUST} UST `}\n \n {`${amountOut} ${targetTokenInfo.name}`}\n \n )}\n {isFirstSwapComplete &&\n !isSecondSwapComplete &&\n !relayerTimeoutString && (\n \n )}\n {relayerTimeoutString && (\n {relayerTimeoutString}\n )}\n
\n \n WARNING: this is a Testnet release only\n \n \n
\n \n {\"powered by wormhole\"}\n \n \"Wormhole\"\n
\n \n Goerli faucet\n \n
\n Mumbai faucet\n \n
\n );\n}\n","import Home from \"./views/Home\";\n\nexport default function App() {\n return ;\n}\n","import { Typography } from \"@material-ui/core\";\nimport React from \"react\";\n\nexport default class ErrorBoundary extends React.Component {\n constructor(props) {\n super(props);\n this.state = { hasError: false };\n }\n\n static getDerivedStateFromError(error) {\n return { hasError: true };\n }\n\n componentDidCatch(error, errorInfo) {\n console.error(error, errorInfo);\n }\n\n render() {\n if (this.state.hasError) {\n return (\n \n \"An unexpected error has occurred. Please refresh the page.\"\n \n );\n }\n\n return this.props.children;\n }\n}\n","import { CssBaseline } from \"@material-ui/core\";\nimport { ThemeProvider } from \"@material-ui/core/styles\";\nimport { SnackbarProvider } from \"notistack\";\nimport ReactDOM from \"react-dom\";\nimport App from \"./App\";\nimport ErrorBoundary from \"./components/ErrorBoundary\";\nimport { EthereumProviderProvider } from \"./contexts/EthereumProviderContext\";\nimport { theme } from \"./muiTheme\";\n\nReactDOM.render(\n \n \n \n \n \n \n \n \n \n \n ,\n document.getElementById(\"root\")\n);\n"],"sourceRoot":""} \ No newline at end of file diff --git a/static/js/main.6d2c5267.chunk.js.map b/static/js/main.6d2c5267.chunk.js.map deleted file mode 100644 index 2a87187..0000000 --- a/static/js/main.6d2c5267.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["components/ButtonWithLoader.tsx","contexts/EthereumProviderContext.tsx","components/ToggleConnectedButton.tsx","components/EthereumSignerKey.tsx","components/TokenSelect.tsx","icons/eth.svg","icons/polygon.svg","utils/consts.ts","muiTheme.js","icons/wormhole-network.svg","route/generic.ts","route/evm.ts","route/uniswap-core.ts","route/cross-quote.ts","route/uniswap-v2.ts","route/quickswap.ts","route/uniswap-v3.ts","swapper/util.ts","swapper/swapper.ts","addresses/goerli.ts","addresses/mumbai.ts","utils/parseError.ts","components/Settings.tsx","utils/getIsTransferCompletedWithRetry.ts","components/CircleLoader.tsx","components/SwapProgress.tsx","views/Home.tsx","App.tsx","components/ErrorBoundary.js","index.js"],"names":["useStyles","makeStyles","theme","root","position","button","marginTop","spacing","textTransform","width","loader","bottom","left","marginLeft","marginBottom","error","textAlign","ButtonWithLoader","disabled","onClick","showLoader","children","className","classes","Button","color","variant","CircularProgress","size","Typography","EthereumProviderContext","React","createContext","connect","disconnect","provider","undefined","chainId","signer","signerAddress","providerError","EthereumProviderProvider","useState","setProviderError","setProvider","setChainId","setSigner","setSignerAddress","useCallback","detectEthereumProvider","then","detectedProvider","ethers","providers","Web3Provider","send","getNetwork","network","catch","getSigner","getAddress","address","on","BigNumber","from","toNumber","e","accounts","contextValue","useMemo","Provider","value","useEthereumProvider","useContext","display","margin","maxWidth","ToggleConnectedButton","connected","pk","is0x","startsWith","Tooltip","title","substring","substr","length","EthereumSignerKey","select","alignItems","listItemIcon","minWidth","icon","height","TokenSelect","tokens","onChange","TextField","fullWidth","map","token","name","logo","MenuItem","ListItemIcon","src","alt","ListItemText","createTokenMenuItem","MATIC_TOKEN_INFO","CHAIN_ID_POLYGON","polygonIcon","isNative","maxAmount","WMATIC_TOKEN_INFO","ETH_TOKEN_INFO","CHAIN_ID_ETH","ethIcon","WETH_TOKEN_INFO","TOKEN_INFOS","POLYGON_NETWORK_CHAIN_ID","getEvmChainId","WORMHOLE_RPC_HOSTS","COLORS","responsiveFontSizes","createTheme","palette","type","background","default","paper","divider","text","primary","main","light","secondary","typography","fontFamily","h1","fontWeight","h2","h4","overrides","MuiCssBaseline","scrollbarWidth","scrollbarColor","backgroundColor","borderRadius","MuiAccordion","rounded","borderTopLeftRadius","borderTopRightRadius","borderBottomLeftRadius","borderBottomRightRadius","MuiAlert","border","MuiButton","MuiLink","MuiPaper","MuiStepper","padding","MuiStep","MuiStepConnector","lineVertical","borderLeftWidth","MuiStepContent","MuiStepLabel","label","fontSize","MuiTab","GenericToken","EvmToken","decimals","tokenAddress","a","makeErc20Contract","this","getDecimals","balanceOf","balanceBeforeDecimals","utils","formatUnits","toString","amount","parseUnits","unitAmount","right","FixedNumber","addUnsafe","round","subUnsafe","o","initialize","Contract","Erc20Abi","UniEvmToken","erc20","uniToken","Token","getContract","getBalanceOf","computeUnitAmount","formatAmount","CurrencyAmount","fromRawAmount","getUniToken","addAmounts","subtractAmounts","makeUniEvmToken","create","QuoteType","UniswapRouterCore","deadline","Math","floor","Date","now","add","PROTOCOL","SingleAmmSwapRouter","factoryAddress","pairContract","pair","tokenIn","tokenOut","Error","computePairAddress","tokenA","tokenB","pairAddress","computePoolAddress","poolContract","IUniswapV2PairABI","factory","Promise","all","token0","getReserves","reserves","reserve0","_reserve0","reserve1","_reserve1","toLowerCase","Pair","amountIn","slippage","createPool","route","Route","currencyAmountIn","computeCurrencyAmount","quote","Trade","TradeType","EXACT_INPUT","minAmountOut","outputAmount","toSignificant","slippageMultiplier","minAmountOutWithSlippage","mulUnsafe","amountOut","currencyAmountOut","EXACT_OUTPUT","maxAmountIn","inputAmount","slippageDivisor","maxAmountInWithSlippage","divUnsafe","QuickswapRouter","pool","poolFee","FeeAmount","MEDIUM","fee","IUniswapV3PoolABI","poolAddress","liquidity","slot0","slot","sqrtPriceX96","tick","bigLiq","JSBI","BigInt","negBigLiq","multiply","tickConstructorArgs","index","nearestUsableTick","TickMath","MIN_TICK","TICK_SPACINGS","liquidityNet","liquidityGross","MAX_TICK","Pool","fromRoute","computeTradeExactIn","trade","computeTradeExactOut","makeRouter","id","UniswapV3Router","getUstAddress","splitSlippageInHalf","totalSlippage","divisor","UniswapToUniswapQuoter","srcProvider","dstProvider","srcNetwork","dstNetwork","srcRouter","dstRouter","srcTokenIn","srcTokenOut","dstTokenIn","dstTokenOut","tokenInAddress","ustOutAddress","router","makeToken","tokenOutAddress","ustInAddress","computeAndVerifyPoolAddress","relayerFeeUst","singleSlippage","fetchQuoteAmountOut","srcMinAmountOut","dstAmountIn","Number","dstAmountInAfterFee","dstMinAmountOut","srcParameters","protocol","getProtocol","getPoolFee","getTradeDeadline","path","dstParameters","params","dst","relayerFee","fetchQuoteAmountIn","dstMaxAmountIn","srcAmountOut","srcAmountOutBeforeFee","srcMaxAmountIn","setDeadline","CROSSCHAINSWAP_GAS_PARAMETERS","gasLimit","maxFeePerGas","maxPriorityFeePerGas","swapExactInFromVaaNative","swapContractWithSigner","signedVaa","recvAndSwapExactNativeIn","tx","wait","swapExactInFromVaaToken","recvAndSwapExactIn","swapExactOutFromVaaNative","recvAndSwapExactNativeOut","swapExactOutFromVaaToken","recvAndSwapExactOut","EXECUTION_PARAMETERS_ETHEREUM","crossChainSwap","wormhole","WORMHOLE_CHAIN_ID_ETHEREUM","coreBridgeAddress","tokenBridgeAddress","EXECUTION_PARAMETERS_POLYGON","WORMHOLE_CHAIN_ID_POLYGON","makeExecutionParameters","approveContractTokenSpend","tokenContract","swapContractAddress","populateTransaction","approve","unsignedTx","gas_limit","getGasPrice","gasPrice","parsedGasPrice","hexlify","parseInt","console","log","getTransactionCount","nonce","sendTransaction","makeCrossChainSwapContract","contractAddress","PROTOCOL_UNISWAP_V2","SWAP_CONTRACT_V2_ABI","makeCrossChainSwapV2Contract","SWAP_CONTRACT_V3_ABI","makeCrossChainSwapV3Contract","addressToBytes32","wormholeChainId","hexString","nativeToHexString","hexToUint8Array","approveAndSwapExactIn","srcWallet","quoteParams","srcExecutionParams","dstExecutionParams","swapContractParams","swapContract","contractWithSigner","swapParams","pathArray","concat","dstWormholeChainId","dstContractAddress","bridgeNonce","gasPlusValue","info","swapExactNativeInAndTransfer","swapExactInAndTransfer","approveAndSwapExactOut","swapExactNativeOutAndTransfer","swapExactOutAndTransfer","swapExactInFromVaa","dstWallet","dstProtocol","swapExactOutFromVaa","makeProvider","url","process","StaticJsonRpcProvider","UniswapToUniswapExecutor","quoter","cachedExactInParams","cachedExactOutParams","quoteType","relayerFeeAmount","transportFactory","vaaSearchParams","vaaBytes","srcReceipt","dstReceipt","makeTokens","setDeadlines","makeSrcTokens","makeDstTokens","srcIn","srcOut","dstIn","dstOut","computeAndVerifySrcPoolAddress","computeAndVerifyDstPoolAddress","areSwapParametersUndefined","computeExactInParameters","ExactIn","computeExactOutParameters","ExactOut","wallet","getSrcProvider","fetchAndSetEmitterAndSequence","receipt","wormholeParams","sequence","parseSequenceFromLogEth","emitterAddress","getEmitterAddressEth","getSignedVAAWithRetry","vaaResponse","fetchSignedVaaFromSwap","getDstProvider","MM_ERR_WITH_INFO_START","parseError","data","message","replace","response","topScrollPaper","topPaperScrollBody","verticalAlign","float","clamp","min","max","isNaN","Settings","onSlippageChange","onDeadlineChange","dialogIsOpen","setDialogIsOpen","dialog","Dialog","open","onClose","scroll","DialogTitle","DialogContent","InputProps","endAdornment","InputAdornment","event","target","parseFloat","disableRipple","endIcon","getIsTransferCompletedEvmWithRetry","signedVAA","retryTimeoutMs","retryAttempts","result","attempts","getIsTransferCompletedEth","resolve","setTimeout","CircleLoader","TransactionProgress","txBlockNumber","step","currentBlock","setCurrentBlock","useEffect","isEVMChain","cancelled","getBlockNumber","newBlock","valueBuffer","blockDiff","LinearProgress","bg","flexDirection","minHeight","centeredContainer","mainPaper","numberField","flexGrow","caretShape","webkitAppearance","gradientButton","backgroundImage","transition","backgroundSize","boxShadow","backgroundPosition","spacer","titleBar","alignSelf","tokenSelectWrapper","wormholeIcon","filter","loaderHolder","justifyContent","successIcon","swapPath","switchProviderNetwork","evmChainId","hexStripZeros","Home","sourceTokenInfo","setSourceTokenInfo","targetTokenInfo","setTargetTokenInfo","setAmountIn","amountInUST","setAmountInUST","setAmountOut","setSlippage","executor","setExecutor","isSwapping","setIsSwapping","isComputingQuote","setIsComputingQuote","hasQuote","setHasQuote","enqueueSnackbar","useSnackbar","isFirstSwapComplete","setIsFirstSwapComplete","isSecondSwapComplete","setIsSecondSwapComplete","sourceTxBlockNumber","setSourceTxBlockNumber","hasSignedVAA","setHasSignedVAA","relayerTimeoutString","setRelayerTimeoutString","computeQuote","setRelayerFee","computeQuoteExactIn","toFixed","content","Alert","severity","debouncedComputeQuote","useDebouncedCallback","handleAmountChange","handleSlippageChange","handleDeadlineChange","handleSourceChange","reset","handleSwapClick","approveAndSwap","sourceReceipt","transactionHash","blockNumber","fetchVaaAndSwap","targetReceipt","readyToSwap","Container","Paper","Collapse","in","disableUnderline","placeholder","autoFocus","inputProps","readOnly","CheckCircleOutlineRounded","ArrowForward","style","Wormhole","Link","href","App","ErrorBoundary","props","state","hasError","errorInfo","Component","ReactDOM","render","ThemeProvider","CssBaseline","maxSnack","document","getElementById"],"mappings":"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","file":"static/js/main.6d2c5267.chunk.js","sourcesContent":["import {\n Button,\n CircularProgress,\n makeStyles,\n Typography,\n} from \"@material-ui/core\";\nimport { ReactChild } from \"react\";\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n position: \"relative\",\n },\n button: {\n marginTop: theme.spacing(2),\n textTransform: \"none\",\n width: \"100%\",\n },\n loader: {\n position: \"absolute\",\n bottom: 0,\n left: \"50%\",\n marginLeft: -12,\n marginBottom: 6,\n },\n error: {\n marginTop: theme.spacing(1),\n textAlign: \"center\",\n },\n}));\n\nexport default function ButtonWithLoader({\n disabled,\n onClick,\n showLoader,\n error,\n children,\n className,\n}: {\n disabled?: boolean;\n onClick: () => void;\n showLoader?: boolean;\n error?: string;\n children: ReactChild;\n className?: string;\n}) {\n const classes = useStyles();\n return (\n <>\n
\n \n {children}\n \n {showLoader ? (\n \n ) : null}\n
\n {error ? (\n \n {error}\n \n ) : null}\n \n );\n}\n","import detectEthereumProvider from \"@metamask/detect-provider\";\nimport { BigNumber, ethers } from \"ethers\";\nimport React, {\n ReactChildren,\n useCallback,\n useContext,\n useMemo,\n useState,\n} from \"react\";\n\nexport type Provider = ethers.providers.Web3Provider | undefined;\nexport type Signer = ethers.Signer | undefined;\n\ninterface IEthereumProviderContext {\n connect(): void;\n disconnect(): void;\n provider: Provider;\n chainId: number | undefined;\n signer: Signer;\n signerAddress: string | undefined;\n providerError: string | null;\n}\n\nconst EthereumProviderContext = React.createContext({\n connect: () => {},\n disconnect: () => {},\n provider: undefined,\n chainId: undefined,\n signer: undefined,\n signerAddress: undefined,\n providerError: null,\n});\nexport const EthereumProviderProvider = ({\n children,\n}: {\n children: ReactChildren;\n}) => {\n const [providerError, setProviderError] = useState(null);\n const [provider, setProvider] = useState(undefined);\n const [chainId, setChainId] = useState(undefined);\n const [signer, setSigner] = useState(undefined);\n const [signerAddress, setSignerAddress] = useState(\n undefined\n );\n const connect = useCallback(() => {\n setProviderError(null);\n detectEthereumProvider()\n .then((detectedProvider) => {\n if (detectedProvider) {\n const provider = new ethers.providers.Web3Provider(\n // @ts-ignore\n detectedProvider,\n \"any\"\n );\n provider\n .send(\"eth_requestAccounts\", [])\n .then(() => {\n setProviderError(null);\n setProvider(provider);\n provider\n .getNetwork()\n .then((network) => {\n setChainId(network.chainId);\n })\n .catch(() => {\n setProviderError(\n \"An error occurred while getting the network\"\n );\n });\n const signer = provider.getSigner();\n setSigner(signer);\n signer\n .getAddress()\n .then((address) => {\n setSignerAddress(address);\n })\n .catch(() => {\n setProviderError(\n \"An error occurred while getting the signer address\"\n );\n });\n // TODO: try using ethers directly\n // @ts-ignore\n if (detectedProvider && detectedProvider.on) {\n // @ts-ignore\n detectedProvider.on(\"chainChanged\", (chainId) => {\n try {\n setChainId(BigNumber.from(chainId).toNumber());\n } catch (e) {}\n });\n // @ts-ignore\n detectedProvider.on(\"accountsChanged\", (accounts) => {\n try {\n const signer = provider.getSigner();\n setSigner(signer);\n signer\n .getAddress()\n .then((address) => {\n setSignerAddress(address);\n })\n .catch(() => {\n setProviderError(\n \"An error occurred while getting the signer address\"\n );\n });\n } catch (e) {}\n });\n }\n })\n .catch(() => {\n setProviderError(\n \"An error occurred while requesting eth accounts\"\n );\n });\n } else {\n setProviderError(\"Please install MetaMask\");\n }\n })\n .catch(() => {\n setProviderError(\"Please install MetaMask\");\n });\n }, []);\n const disconnect = useCallback(() => {\n setProviderError(null);\n setProvider(undefined);\n setChainId(undefined);\n setSigner(undefined);\n setSignerAddress(undefined);\n }, []);\n const contextValue = useMemo(\n () => ({\n connect,\n disconnect,\n provider,\n chainId,\n signer,\n signerAddress,\n providerError,\n }),\n [\n connect,\n disconnect,\n provider,\n chainId,\n signer,\n signerAddress,\n providerError,\n ]\n );\n return (\n \n {children}\n \n );\n};\nexport const useEthereumProvider = () => {\n return useContext(EthereumProviderContext);\n};\n","import { Button, makeStyles, Tooltip } from \"@material-ui/core\";\n\nconst useStyles = makeStyles((theme) => ({\n button: {\n display: \"block\",\n margin: `${theme.spacing(1)}px auto`,\n width: \"100%\",\n maxWidth: 400,\n },\n}));\n\nconst ToggleConnectedButton = ({\n connect,\n disconnect,\n connected,\n pk,\n}: {\n connect(): any;\n disconnect(): any;\n connected: boolean;\n pk: string;\n}) => {\n const classes = useStyles();\n const is0x = pk.startsWith(\"0x\");\n return connected ? (\n \n \n Disconnect {pk.substring(0, is0x ? 6 : 3)}...\n {pk.substr(pk.length - (is0x ? 4 : 3))}\n \n \n ) : (\n \n Connect Wallet\n \n );\n};\n\nexport default ToggleConnectedButton;\n","import { Typography } from \"@material-ui/core\";\nimport { useEthereumProvider } from \"../contexts/EthereumProviderContext\";\nimport ToggleConnectedButton from \"./ToggleConnectedButton\";\n\nconst EthereumSignerKey = () => {\n const { connect, disconnect, signerAddress, providerError } =\n useEthereumProvider();\n return (\n <>\n \n {providerError ? (\n \n {providerError}\n \n ) : null}\n \n );\n};\n\nexport default EthereumSignerKey;\n","import {\n ListItemIcon,\n ListItemText,\n makeStyles,\n MenuItem,\n TextField,\n} from \"@material-ui/core\";\nimport { TokenInfo } from \"../utils/consts\";\n\nconst useStyles = makeStyles((theme) => ({\n select: {\n \"& .MuiSelect-root\": {\n display: \"flex\",\n alignItems: \"center\",\n },\n },\n listItemIcon: {\n minWidth: 40,\n },\n icon: {\n height: 24,\n maxWidth: 24,\n },\n}));\n\nconst createTokenMenuItem = ({ name, logo }: TokenInfo, classes: any) => (\n \n \n {name}\n \n {name}\n \n);\n\ninterface TokenSelectProps {\n tokens: TokenInfo[];\n value: string;\n onChange: (event: any) => void;\n disabled: boolean;\n}\n\nexport default function TokenSelect({\n tokens,\n value,\n onChange,\n disabled,\n}: TokenSelectProps) {\n const classes = useStyles();\n\n return (\n \n {tokens.map((token) => createTokenMenuItem(token, classes))}\n \n );\n}\n","export default __webpack_public_path__ + \"static/media/eth.364436c5.svg\";","export default __webpack_public_path__ + \"static/media/polygon.97ff139c.svg\";","import {\n ChainId,\n CHAIN_ID_ETH,\n CHAIN_ID_POLYGON,\n} from \"@certusone/wormhole-sdk\";\nimport ethIcon from \"../icons/eth.svg\";\nimport polygonIcon from \"../icons/polygon.svg\";\n\nexport interface TokenInfo {\n name: string;\n address: string;\n chainId: ChainId;\n logo: string;\n isNative: boolean;\n maxAmount: number;\n}\n\nexport const MATIC_TOKEN_INFO: TokenInfo = {\n name: \"MATIC\",\n address: \"0x9c3c9283d3e44854697cd22d3faa240cfb032889\", // used to compute quote\n chainId: CHAIN_ID_POLYGON,\n logo: polygonIcon,\n isNative: true,\n maxAmount: 0.1,\n};\n\nexport const WMATIC_TOKEN_INFO: TokenInfo = {\n name: \"WMATIC\",\n address: \"0x9c3c9283d3e44854697cd22d3faa240cfb032889\",\n chainId: CHAIN_ID_POLYGON,\n logo: polygonIcon,\n isNative: false,\n maxAmount: 0.1,\n};\n\nexport const ETH_TOKEN_INFO: TokenInfo = {\n name: \"ETH\",\n address: \"0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6\", // used to compute quote\n chainId: CHAIN_ID_ETH,\n logo: ethIcon,\n isNative: true,\n maxAmount: 0.01,\n};\n\nexport const WETH_TOKEN_INFO: TokenInfo = {\n name: \"WETH\",\n address: \"0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6\",\n chainId: CHAIN_ID_ETH,\n logo: ethIcon,\n isNative: false,\n maxAmount: 0.01,\n};\n\nexport const TOKEN_INFOS = [\n MATIC_TOKEN_INFO,\n WMATIC_TOKEN_INFO,\n ETH_TOKEN_INFO,\n WETH_TOKEN_INFO,\n];\n\nexport const ETH_NETWORK_CHAIN_ID = 5;\n\nexport const POLYGON_NETWORK_CHAIN_ID = 80001;\n\nexport const getEvmChainId = (chainId: ChainId) =>\n chainId === CHAIN_ID_ETH\n ? ETH_NETWORK_CHAIN_ID\n : chainId === CHAIN_ID_POLYGON\n ? POLYGON_NETWORK_CHAIN_ID\n : undefined;\n\nexport const RELAYER_FEE_UST = \"0.25\";\n\nexport const WORMHOLE_RPC_HOSTS = [\n \"https://wormhole-v2-testnet-api.certus.one\",\n];\n\nexport const CORE_BRIDGE_ADDRESS_ETHEREUM =\n \"0x706abc4E45D419950511e474C7B9Ed348A4a716c\";\n\nexport const CORE_BRIDGE_ADDRESS_POLYGON =\n \"0x0CBE91CF822c73C2315FB05100C2F714765d5c20\";\n\nexport const TOKEN_BRIDGE_ADDRESS_ETHEREUM =\n \"0xF890982f9310df57d00f659cf4fd87e65adEd8d7\";\n\nexport const TOKEN_BRIDGE_ADDRESS_POLYGON =\n \"0x377D55a7928c046E18eEbb61977e714d2a76472a\";\n\nexport const QUICKSWAP_FACTORY_ADDRESS =\n \"0x5757371414417b8C6CAad45bAeF941aBc7d3Ab32\";\n\nexport const UNISWAP_V3_FACTORY_ADDRESS =\n \"0x1F98431c8aD98523631AE4a59f267346ea31F984\";\n\nexport const APPROVAL_GAS_LIMIT = \"100000\";\n","import { createTheme, responsiveFontSizes } from \"@material-ui/core\";\n\nexport const COLORS = {\n blue: \"#1975e6\",\n blueWithTransparency: \"rgba(25, 117, 230, 0.8)\",\n gray: \"#4e4e54\",\n green: \"#0ac2af\",\n greenWithTransparency: \"rgba(10, 194, 175, 0.8)\",\n lightGreen: \"rgba(51, 242, 223, 1)\",\n lightBlue: \"#83b9fc\",\n nearBlack: \"#000008\",\n nearBlackWithMinorTransparency: \"rgba(0,0,0,.25)\",\n red: \"#aa0818\",\n darkRed: \"#810612\",\n};\n\nexport const theme = responsiveFontSizes(\n createTheme({\n palette: {\n type: \"dark\",\n background: {\n default: COLORS.nearBlack,\n paper: COLORS.nearBlack,\n },\n divider: COLORS.gray,\n text: {\n primary: \"rgba(255,255,255,0.98)\",\n },\n primary: {\n main: COLORS.blueWithTransparency,\n light: COLORS.lightBlue,\n },\n secondary: {\n main: COLORS.greenWithTransparency,\n light: COLORS.lightGreen,\n },\n error: {\n main: COLORS.red,\n },\n },\n typography: {\n fontFamily: \"'Sora', sans-serif\",\n h1: {\n fontWeight: \"200\",\n },\n h2: {\n fontWeight: \"200\",\n },\n h4: {\n fontWeight: \"500\",\n },\n },\n overrides: {\n MuiCssBaseline: {\n \"@global\": {\n \"*\": {\n scrollbarWidth: \"thin\",\n scrollbarColor: `${COLORS.gray} ${COLORS.nearBlackWithMinorTransparency}`,\n },\n \"*::-webkit-scrollbar\": {\n width: \"8px\",\n height: \"8px\",\n backgroundColor: COLORS.nearBlackWithMinorTransparency,\n },\n \"*::-webkit-scrollbar-thumb\": {\n backgroundColor: COLORS.gray,\n borderRadius: \"4px\",\n },\n \"*::-webkit-scrollbar-corner\": {\n // this hides an annoying white box which appears when both scrollbars are present\n backgroundColor: \"transparent\",\n },\n },\n },\n MuiAccordion: {\n root: {\n backgroundColor: COLORS.nearBlackWithMinorTransparency,\n \"&:before\": {\n display: \"none\",\n },\n },\n rounded: {\n \"&:first-child\": {\n borderTopLeftRadius: \"16px\",\n borderTopRightRadius: \"16px\",\n },\n \"&:last-child\": {\n borderBottomLeftRadius: \"16px\",\n borderBottomRightRadius: \"16px\",\n },\n },\n },\n MuiAlert: {\n root: {\n borderRadius: \"8px\",\n border: \"1px solid\",\n },\n },\n MuiButton: {\n root: {\n borderRadius: \"5px\",\n textTransform: \"none\",\n },\n },\n MuiLink: {\n root: {\n color: COLORS.lightBlue,\n },\n },\n MuiPaper: {\n rounded: {\n borderRadius: \"16px\",\n },\n },\n MuiStepper: {\n root: {\n backgroundColor: \"transparent\",\n padding: 0,\n },\n },\n MuiStep: {\n root: {\n backgroundColor: COLORS.nearBlackWithMinorTransparency,\n borderRadius: \"16px\",\n padding: 16,\n },\n },\n MuiStepConnector: {\n lineVertical: {\n borderLeftWidth: 0,\n },\n },\n MuiStepContent: {\n root: {\n borderLeftWidth: 0,\n },\n },\n MuiStepLabel: {\n label: {\n fontSize: 16,\n fontWeight: \"300\",\n \"&.MuiStepLabel-active\": {\n fontWeight: \"300\",\n },\n \"&.MuiStepLabel-completed\": {\n fontWeight: \"300\",\n },\n },\n },\n MuiTab: {\n root: {\n fontSize: 18,\n fontWeight: \"300\",\n padding: 12,\n textTransform: \"none\",\n },\n },\n },\n })\n);\n","export default __webpack_public_path__ + \"static/media/wormhole-network.5bb90ed1.svg\";","export abstract class DexRouter {\n abstract makeToken(tokenAddress: string): any;\n abstract quoteLot(tokenA: any, tokenB: any, amount: string): Promise;\n abstract setSlippage(slippage: string): void;\n}\n\nexport abstract class GenericToken {\n abstract getAddress(): string;\n\n abstract getDecimals(): number;\n}\n\n// TODO: wrap SwapRoute and other routes\nexport class GenericRoute {\n route: any;\n\n constructor(route: any) {\n this.route = route;\n }\n\n getRoute(): any {\n return this.route;\n }\n}\n","import { ethers } from \"ethers\";\n\nimport { GenericToken } from \"./generic\";\n\n// erc20 spec\nimport { abi as Erc20Abi } from \"../abi/erc20.json\";\nimport {\n TransactionReceipt,\n TransactionRequest,\n TransactionResponse,\n} from \"@ethersproject/abstract-provider\";\nimport { APPROVAL_GAS_LIMIT } from \"../utils/consts\";\n\nexport class EvmToken extends GenericToken {\n token: ethers.Contract;\n decimals: number;\n\n async initialize(provider: ethers.providers.Provider, tokenAddress: string) {\n this.token = await makeErc20Contract(provider, tokenAddress);\n this.decimals = await this.token.decimals();\n }\n\n static async create(\n provider: ethers.providers.Provider,\n tokenAddress: string\n ): Promise {\n const o = new EvmToken();\n await o.initialize(provider, tokenAddress);\n return o;\n }\n\n getAddress(): string {\n return this.token.address;\n }\n\n getDecimals(): number {\n return this.decimals;\n }\n\n getContract(): ethers.Contract {\n return this.token;\n }\n\n async getBalanceOf(signer: ethers.Wallet) {\n const decimals = this.getDecimals();\n const balanceBeforeDecimals = await this.token.balanceOf(signer.address);\n return ethers.utils.formatUnits(balanceBeforeDecimals.toString(), decimals);\n }\n\n computeUnitAmount(amount: string): ethers.BigNumber {\n return ethers.utils.parseUnits(amount, this.getDecimals());\n }\n\n formatAmount(unitAmount: ethers.BigNumber): string {\n return ethers.utils.formatUnits(unitAmount, this.getDecimals());\n }\n\n addAmounts(left: string, right: string): string {\n const sum = ethers.FixedNumber.from(left).addUnsafe(\n ethers.FixedNumber.from(right)\n );\n return sum.round(this.getDecimals()).toString();\n }\n\n subtractAmounts(left: string, right: string): string {\n const sum = ethers.FixedNumber.from(left).subUnsafe(\n ethers.FixedNumber.from(right)\n );\n return sum.round(this.getDecimals()).toString();\n }\n}\n\nexport async function makeErc20Contract(\n provider: ethers.providers.Provider,\n tokenAddress: string\n): Promise {\n return new ethers.Contract(tokenAddress, Erc20Abi, provider);\n}\n\nexport async function approveContractTokenSpend(\n provider: ethers.providers.Provider,\n signer: ethers.Wallet,\n tokenContract: ethers.Contract,\n smartContractAddress: string,\n swapAmount: ethers.BigNumber\n): Promise {\n // build transaction for token spending\n const unsignedTx: TransactionRequest =\n await tokenContract.populateTransaction.approve(\n smartContractAddress,\n swapAmount\n );\n const nonce = await provider.getTransactionCount(signer.address, \"latest\");\n\n const gasPrice = await signer.getGasPrice();\n const parsedGasPrice = ethers.utils.hexlify(parseInt(gasPrice.toString()));\n\n unsignedTx.nonce = nonce;\n unsignedTx.gasLimit = ethers.BigNumber.from(APPROVAL_GAS_LIMIT);\n unsignedTx.gasPrice = ethers.BigNumber.from(parsedGasPrice);\n\n // sign and send transaction\n const tx: TransactionResponse = await signer.sendTransaction(unsignedTx);\n return tx.wait();\n}\n","import { ethers } from \"ethers\";\nimport { CurrencyAmount, Token } from \"@uniswap/sdk-core\";\n\nimport { EvmToken } from \"./evm\";\n\nexport function computeTradeDeadline(deadline: string): ethers.BigNumber {\n return ethers.BigNumber.from(Math.floor(Date.now() / 1000)).add(deadline);\n}\n\nexport class UniEvmToken {\n erc20: EvmToken;\n uniToken: Token;\n\n constructor(chainId: number, erc20: EvmToken) {\n this.erc20 = erc20;\n\n const address = this.getAddress();\n const decimals = this.getDecimals();\n\n this.uniToken = new Token(chainId, address, decimals);\n }\n\n getUniToken(): Token {\n return this.uniToken;\n }\n\n getEvmToken(): EvmToken {\n return this.erc20;\n }\n\n getDecimals(): number {\n return this.erc20.getDecimals();\n }\n\n getContract(): ethers.Contract {\n return this.erc20.getContract();\n }\n\n getAddress(): string {\n return this.erc20.getAddress();\n }\n\n async getBalanceOf(signer: ethers.Wallet) {\n return this.erc20.getBalanceOf(signer);\n }\n\n computeUnitAmount(amount: string): ethers.BigNumber {\n return this.erc20.computeUnitAmount(amount);\n }\n\n formatAmount(unitAmount: ethers.BigNumber): string {\n return this.erc20.formatAmount(unitAmount);\n }\n\n computeCurrencyAmount(amount: string): CurrencyAmount {\n const unitAmount = this.computeUnitAmount(amount);\n return CurrencyAmount.fromRawAmount(\n this.getUniToken(),\n unitAmount.toString()\n );\n }\n\n addAmounts(left: string, right: string): string {\n return this.erc20.addAmounts(left, right);\n }\n\n subtractAmounts(left: string, right: string): string {\n return this.erc20.subtractAmounts(left, right);\n }\n}\n\nexport async function makeUniEvmToken(\n provider: ethers.providers.Provider,\n chainId: number,\n tokenAddress: string\n): Promise {\n const erc20 = await EvmToken.create(provider, tokenAddress);\n return new UniEvmToken(chainId, erc20);\n}\n\nexport abstract class UniswapRouterCore {\n provider: ethers.providers.Provider;\n\n // params\n deadline: string = \"\";\n\n constructor(provider: ethers.providers.Provider) {\n this.provider = provider;\n }\n\n public async makeToken(tokenAddress: string): Promise {\n const network = await this.provider.getNetwork();\n return makeUniEvmToken(this.provider, network.chainId, tokenAddress);\n }\n\n abstract computePoolAddress(\n tokenIn: UniEvmToken,\n tokenOut: UniEvmToken\n ): string;\n\n abstract computeAndVerifyPoolAddress(\n tokenIn: UniEvmToken,\n tokenOut: UniEvmToken\n ): Promise;\n\n abstract fetchQuoteAmountOut(\n tokenIn: UniEvmToken,\n tokenOut: UniEvmToken,\n amountOut: string,\n slippage: string\n ): Promise;\n\n abstract fetchQuoteAmountIn(\n tokenIn: UniEvmToken,\n tokenOut: UniEvmToken,\n amountOut: string,\n slippage: string\n ): Promise;\n\n abstract getProtocol(): string;\n\n public getPoolFee(): string {\n return \"\";\n }\n\n public setDeadline(deadline: string): void {\n this.deadline = deadline;\n }\n\n public getTradeDeadline(): ethers.BigNumber {\n return computeTradeDeadline(this.deadline);\n }\n}\n","import { ethers } from \"ethers\";\nimport { UniEvmToken } from \"./uniswap-core\";\nimport { QuickswapRouter } from \"./quickswap\";\nimport { SingleAmmSwapRouter as UniswapV3Router } from \"./uniswap-v3\";\nimport {\n ETH_NETWORK_CHAIN_ID,\n POLYGON_NETWORK_CHAIN_ID,\n} from \"../utils/consts\";\n\nexport { PROTOCOL as PROTOCOL_UNISWAP_V2 } from \"./uniswap-v2\";\nexport { PROTOCOL as PROTOCOL_UNISWAP_V3 } from \"./uniswap-v3\";\n\nexport enum QuoteType {\n ExactIn = 1,\n ExactOut,\n}\n\nfunction makeRouter(provider: ethers.providers.Provider, id: number) {\n switch (id) {\n case ETH_NETWORK_CHAIN_ID: {\n return new UniswapV3Router(provider);\n }\n case POLYGON_NETWORK_CHAIN_ID: {\n return new QuickswapRouter(provider);\n }\n default: {\n throw Error(\"unrecognized chain id\");\n }\n }\n}\n\nexport function getUstAddress(id: number): string {\n switch (id) {\n case ETH_NETWORK_CHAIN_ID: {\n return \"0x36Ed51Afc79619b299b238898E72ce482600568a\";\n }\n case POLYGON_NETWORK_CHAIN_ID: {\n return \"0xe3a1c77e952b57b5883f6c906fc706fcc7d4392c\";\n }\n default: {\n throw Error(\"unrecognized chain id\");\n }\n }\n}\n\nfunction splitSlippageInHalf(totalSlippage: string): string {\n const divisor = ethers.FixedNumber.from(\"2\");\n return ethers.FixedNumber.from(totalSlippage)\n .divUnsafe(divisor)\n .round(4)\n .toString();\n}\n\ninterface RelayerFee {\n amount: ethers.BigNumber;\n tokenAddress: string;\n}\n\nexport interface ExactInParameters {\n protocol: string;\n amountIn: ethers.BigNumber;\n minAmountOut: ethers.BigNumber;\n deadline: ethers.BigNumber;\n poolFee: string;\n path: [string, string];\n}\n\nexport interface ExactInCrossParameters {\n src: ExactInParameters;\n dst: ExactInParameters;\n relayerFee: RelayerFee;\n}\n\nexport interface ExactOutParameters {\n protocol: string;\n amountOut: ethers.BigNumber;\n maxAmountIn: ethers.BigNumber;\n deadline: ethers.BigNumber;\n poolFee: string;\n path: [string, string];\n}\n\nexport interface ExactOutCrossParameters {\n src: ExactOutParameters;\n dst: ExactOutParameters;\n relayerFee: RelayerFee;\n}\n\nexport class UniswapToUniswapQuoter {\n // providers\n srcProvider: ethers.providers.Provider;\n dstProvider: ethers.providers.Provider;\n\n // networks\n srcNetwork: ethers.providers.Network;\n dstNetwork: ethers.providers.Network;\n\n // routers\n srcRouter: UniswapV3Router | QuickswapRouter;\n dstRouter: UniswapV3Router | QuickswapRouter;\n\n // tokens\n srcTokenIn: UniEvmToken;\n srcTokenOut: UniEvmToken;\n dstTokenIn: UniEvmToken;\n dstTokenOut: UniEvmToken;\n\n constructor(\n srcProvider: ethers.providers.Provider,\n dstProvider: ethers.providers.Provider\n ) {\n this.srcProvider = srcProvider;\n this.dstProvider = dstProvider;\n }\n\n async initialize(): Promise {\n [this.srcNetwork, this.dstNetwork] = await Promise.all([\n this.srcProvider.getNetwork(),\n this.dstProvider.getNetwork(),\n ]);\n\n this.srcRouter = makeRouter(this.srcProvider, this.srcNetwork.chainId);\n this.dstRouter = makeRouter(this.dstProvider, this.dstNetwork.chainId);\n return;\n }\n\n sameChain(): boolean {\n return this.srcNetwork.chainId === this.dstNetwork.chainId;\n }\n\n async makeSrcTokens(\n tokenInAddress: string\n ): Promise<[UniEvmToken, UniEvmToken]> {\n const ustOutAddress = getUstAddress(this.srcNetwork.chainId);\n\n const router = this.srcRouter;\n\n [this.srcTokenIn, this.srcTokenOut] = await Promise.all([\n router.makeToken(tokenInAddress),\n router.makeToken(ustOutAddress),\n ]);\n return [this.srcTokenIn, this.srcTokenOut];\n }\n\n async makeDstTokens(\n tokenOutAddress: string\n ): Promise<[UniEvmToken, UniEvmToken]> {\n const ustInAddress = getUstAddress(this.dstNetwork.chainId);\n\n const router = this.dstRouter;\n\n [this.dstTokenIn, this.dstTokenOut] = await Promise.all([\n router.makeToken(ustInAddress),\n router.makeToken(tokenOutAddress),\n ]);\n return [this.dstTokenIn, this.dstTokenOut];\n }\n\n async computeAndVerifySrcPoolAddress(): Promise {\n return this.srcRouter.computeAndVerifyPoolAddress(\n this.srcTokenIn,\n this.srcTokenOut\n );\n }\n\n async computeAndVerifyDstPoolAddress(): Promise {\n return this.dstRouter.computeAndVerifyPoolAddress(\n this.dstTokenIn,\n this.dstTokenOut\n );\n }\n\n async computeExactInParameters(\n amountIn: string,\n slippage: string,\n relayerFeeUst: string\n ): Promise {\n const singleSlippage = splitSlippageInHalf(slippage);\n\n // src quote\n const srcRouter = this.srcRouter;\n const srcTokenIn = this.srcTokenIn;\n const srcTokenOut = this.srcTokenOut;\n const srcMinAmountOut = await srcRouter.fetchQuoteAmountOut(\n srcTokenIn,\n srcTokenOut,\n amountIn,\n singleSlippage\n );\n\n // dst quote\n const dstRouter = this.dstRouter;\n const dstAmountIn = this.srcTokenOut.formatAmount(srcMinAmountOut);\n if (Number(dstAmountIn) < Number(relayerFeeUst)) {\n throw Error(\n `srcAmountOut <= relayerFeeUst. ${dstAmountIn} vs ${relayerFeeUst}`\n );\n }\n\n const dstTokenIn = this.dstTokenIn;\n const dstTokenOut = this.dstTokenOut;\n const dstAmountInAfterFee = dstTokenIn.subtractAmounts(\n dstAmountIn,\n relayerFeeUst\n );\n\n const dstMinAmountOut = await dstRouter.fetchQuoteAmountOut(\n dstTokenIn,\n dstTokenOut,\n dstAmountInAfterFee,\n singleSlippage\n );\n\n const srcParameters: ExactInParameters = {\n protocol: srcRouter.getProtocol(),\n amountIn: srcTokenIn.computeUnitAmount(amountIn),\n minAmountOut: srcMinAmountOut,\n poolFee: srcRouter.getPoolFee(),\n deadline: srcRouter.getTradeDeadline(),\n path: [srcTokenIn.getAddress(), srcTokenOut.getAddress()],\n };\n\n const dstParameters: ExactInParameters = {\n protocol: dstRouter.getProtocol(),\n amountIn: dstTokenIn.computeUnitAmount(dstAmountInAfterFee),\n minAmountOut: dstMinAmountOut,\n poolFee: dstRouter.getPoolFee(),\n deadline: dstRouter.getTradeDeadline(),\n path: [dstTokenIn.getAddress(), dstTokenOut.getAddress()],\n };\n\n const params: ExactInCrossParameters = {\n src: srcParameters,\n dst: dstParameters,\n relayerFee: {\n amount: dstTokenIn.computeUnitAmount(relayerFeeUst),\n tokenAddress: this.dstTokenIn.getAddress(),\n },\n };\n return params;\n }\n\n async computeExactOutParameters(\n amountOut: string,\n slippage: string,\n relayerFeeUst: string\n ): Promise {\n const singleSlippage = splitSlippageInHalf(slippage);\n\n // dst quote first\n const dstRouter = this.dstRouter;\n const dstTokenIn = this.dstTokenIn;\n const dstTokenOut = this.dstTokenOut;\n const dstMaxAmountIn = await dstRouter.fetchQuoteAmountIn(\n dstTokenIn,\n dstTokenOut,\n amountOut,\n singleSlippage\n );\n\n // src quote\n const srcRouter = this.srcRouter;\n const srcAmountOut = this.dstTokenIn.formatAmount(dstMaxAmountIn);\n if (Number(srcAmountOut) < Number(relayerFeeUst)) {\n throw Error(\n `dstAmountIn <= relayerFeeUst. ${srcAmountOut} vs ${relayerFeeUst}`\n );\n }\n\n const srcTokenIn = this.srcTokenIn;\n const srcTokenOut = this.srcTokenOut;\n const srcAmountOutBeforeFee = srcTokenOut.addAmounts(\n srcAmountOut,\n relayerFeeUst\n );\n\n const srcMaxAmountIn = await srcRouter.fetchQuoteAmountIn(\n srcTokenIn,\n srcTokenOut,\n srcAmountOutBeforeFee,\n singleSlippage\n );\n\n const srcParameters: ExactOutParameters = {\n protocol: srcRouter.getProtocol(),\n amountOut: srcTokenOut.computeUnitAmount(srcAmountOutBeforeFee),\n maxAmountIn: srcMaxAmountIn,\n poolFee: srcRouter.getPoolFee(),\n deadline: srcRouter.getTradeDeadline(),\n path: [srcTokenIn.getAddress(), srcTokenOut.getAddress()],\n };\n\n const dstParameters: ExactOutParameters = {\n protocol: dstRouter.getProtocol(),\n amountOut: dstTokenOut.computeUnitAmount(amountOut),\n maxAmountIn: dstMaxAmountIn,\n poolFee: dstRouter.getPoolFee(),\n deadline: dstRouter.getTradeDeadline(),\n path: [dstTokenIn.getAddress(), dstTokenOut.getAddress()],\n };\n\n const params: ExactOutCrossParameters = {\n src: srcParameters,\n dst: dstParameters,\n relayerFee: {\n amount: dstTokenIn.computeUnitAmount(relayerFeeUst),\n tokenAddress: this.dstTokenIn.getAddress(),\n },\n };\n return params;\n }\n\n setDeadlines(deadline: string): void {\n this.srcRouter.setDeadline(deadline);\n this.dstRouter.setDeadline(deadline);\n }\n}\n","import { ethers } from \"ethers\";\nimport { CurrencyAmount, TradeType } from \"@uniswap/sdk-core\";\nimport { abi as IUniswapV2PairABI } from \"@uniswap/v2-core/build/UniswapV2Pair.json\";\nimport { computePairAddress, Pair, Route, Trade } from \"@uniswap/v2-sdk\";\n\nimport { UniEvmToken, UniswapRouterCore } from \"./uniswap-core\";\n\nexport const PROTOCOL = \"UniswapV2\";\n\nexport class SingleAmmSwapRouter extends UniswapRouterCore {\n factoryAddress: string;\n pairContract: ethers.Contract;\n pair: Pair;\n\n setFactoryAddress(factoryAddress: string) {\n this.factoryAddress = factoryAddress;\n return;\n }\n\n computePoolAddress(tokenIn: UniEvmToken, tokenOut: UniEvmToken): string {\n if (this.factoryAddress === undefined) {\n throw Error(\"factoryAddress is undefined. use setFactoryAddress\");\n }\n\n return computePairAddress({\n factoryAddress: this.factoryAddress,\n tokenA: tokenIn.getUniToken(),\n tokenB: tokenOut.getUniToken(),\n });\n }\n\n async computeAndVerifyPoolAddress(\n tokenIn: UniEvmToken,\n tokenOut: UniEvmToken\n ): Promise {\n const pairAddress = this.computePoolAddress(tokenIn, tokenOut);\n\n // verify by attempting to call factory()\n const poolContract = new ethers.Contract(\n pairAddress,\n IUniswapV2PairABI,\n this.provider\n );\n await poolContract.factory();\n\n return pairAddress;\n }\n\n async createPool(tokenIn: UniEvmToken, tokenOut: UniEvmToken): Promise {\n const pairAddress = this.computePoolAddress(tokenIn, tokenOut);\n\n const pairContract = new ethers.Contract(\n pairAddress,\n IUniswapV2PairABI,\n this.provider\n );\n\n const [token0, reserves] = await Promise.all([\n pairContract.token0(),\n pairContract.getReserves(),\n ]);\n\n const reserve0 = reserves._reserve0.toString();\n const reserve1 = reserves._reserve1.toString();\n\n if (token0.toLowerCase() === tokenIn.getAddress().toLowerCase()) {\n return new Pair(\n CurrencyAmount.fromRawAmount(tokenIn.getUniToken(), reserve0),\n CurrencyAmount.fromRawAmount(tokenOut.getUniToken(), reserve1)\n );\n }\n\n return new Pair(\n CurrencyAmount.fromRawAmount(tokenOut.getUniToken(), reserve0),\n CurrencyAmount.fromRawAmount(tokenIn.getUniToken(), reserve1)\n );\n }\n\n async fetchQuoteAmountOut(\n tokenIn: UniEvmToken,\n tokenOut: UniEvmToken,\n amountIn: string,\n slippage: string\n ): Promise {\n // create pool\n const pair = await this.createPool(tokenIn, tokenOut);\n // let's get that quote\n\n const route = new Route(\n [pair],\n tokenIn.getUniToken(),\n tokenOut.getUniToken()\n );\n const currencyAmountIn = tokenIn.computeCurrencyAmount(amountIn);\n\n const quote = new Trade(route, currencyAmountIn, TradeType.EXACT_INPUT);\n\n const decimals = tokenOut.getDecimals();\n const minAmountOut = ethers.FixedNumber.from(\n quote.outputAmount.toSignificant(decimals)\n );\n\n // calculate output amount with slippage\n const slippageMultiplier = ethers.FixedNumber.from(\"1\").subUnsafe(\n ethers.FixedNumber.from(slippage)\n );\n const minAmountOutWithSlippage = minAmountOut\n .mulUnsafe(slippageMultiplier)\n .round(decimals);\n\n return tokenOut.computeUnitAmount(minAmountOutWithSlippage.toString());\n }\n\n async fetchQuoteAmountIn(\n tokenIn: UniEvmToken,\n tokenOut: UniEvmToken,\n amountOut: string,\n slippage: string\n ): Promise {\n // create pool\n const pair = await this.createPool(tokenIn, tokenOut);\n // let's get that quote\n\n const route = new Route(\n [pair],\n tokenIn.getUniToken(),\n tokenOut.getUniToken()\n );\n const currencyAmountOut = tokenOut.computeCurrencyAmount(amountOut);\n\n const quote = new Trade(route, currencyAmountOut, TradeType.EXACT_OUTPUT);\n\n const decimals = tokenIn.getDecimals();\n const maxAmountIn = ethers.FixedNumber.from(\n quote.inputAmount.toSignificant(decimals)\n );\n\n const slippageDivisor = ethers.FixedNumber.from(\"1\").subUnsafe(\n ethers.FixedNumber.from(slippage)\n );\n const maxAmountInWithSlippage = maxAmountIn\n .divUnsafe(slippageDivisor)\n .round(decimals);\n\n return tokenIn.computeUnitAmount(maxAmountInWithSlippage.toString());\n }\n\n getProtocol(): string {\n return PROTOCOL;\n }\n}\n","import { ethers } from \"ethers\";\nimport { QUICKSWAP_FACTORY_ADDRESS } from \"../utils/consts\";\nimport { SingleAmmSwapRouter } from \"./uniswap-v2\";\n\nexport { PROTOCOL } from \"./uniswap-v2\";\n\nexport class QuickswapRouter extends SingleAmmSwapRouter {\n constructor(provider: ethers.providers.Provider) {\n super(provider);\n super.setFactoryAddress(QUICKSWAP_FACTORY_ADDRESS);\n }\n}\n","import { ethers } from \"ethers\";\nimport JSBI from \"jsbi\";\nimport { CurrencyAmount, Token, TradeType } from \"@uniswap/sdk-core\";\nimport { abi as IUniswapV3PoolABI } from \"@uniswap/v3-core/artifacts/contracts/interfaces/IUniswapV3Pool.sol/IUniswapV3Pool.json\";\nimport {\n computePoolAddress,\n FeeAmount,\n nearestUsableTick,\n Pool,\n Route,\n TickMath,\n TICK_SPACINGS,\n Trade,\n} from \"@uniswap/v3-sdk\";\n\nimport { UniEvmToken, UniswapRouterCore } from \"./uniswap-core\";\nimport { UNISWAP_V3_FACTORY_ADDRESS } from \"../utils/consts\";\n\nexport const PROTOCOL = \"UniswapV3\";\n\nexport class SingleAmmSwapRouter extends UniswapRouterCore {\n poolContract: ethers.Contract;\n pool: Pool;\n poolFee: FeeAmount;\n\n constructor(provider: ethers.providers.Provider) {\n super(provider);\n\n // set fee amount for our example\n this.poolFee = FeeAmount.MEDIUM;\n }\n\n getPoolFee(): string {\n return this.poolFee.toString();\n }\n\n computePoolAddress(tokenIn: UniEvmToken, tokenOut: UniEvmToken): string {\n return computePoolAddress({\n factoryAddress: UNISWAP_V3_FACTORY_ADDRESS,\n fee: this.poolFee,\n tokenA: tokenIn.getUniToken(),\n tokenB: tokenOut.getUniToken(),\n });\n }\n\n async computeAndVerifyPoolAddress(\n tokenIn: UniEvmToken,\n tokenOut: UniEvmToken\n ): Promise {\n const pairAddress = this.computePoolAddress(tokenIn, tokenOut);\n\n // verify by attempting to call factory()\n const poolContract = new ethers.Contract(\n pairAddress,\n IUniswapV3PoolABI,\n this.provider\n );\n await poolContract.factory();\n\n return pairAddress;\n }\n\n async createPool(tokenIn: UniEvmToken, tokenOut: UniEvmToken): Promise {\n const poolAddress = this.computePoolAddress(tokenIn, tokenOut);\n\n const poolContract = new ethers.Contract(\n poolAddress,\n IUniswapV3PoolABI,\n this.provider\n );\n this.poolContract = poolContract;\n\n const [liquidity, slot] = await Promise.all([\n poolContract.liquidity(),\n poolContract.slot0(),\n ]);\n\n // grab necessary data from slot\n const sqrtPriceX96 = slot[0];\n const tick = slot[1];\n\n // create JSBI version of liquidity numbers\n const bigLiq = JSBI.BigInt(liquidity);\n const negBigLiq = JSBI.multiply(bigLiq, JSBI.BigInt(-1));\n\n const tickConstructorArgs = [\n {\n index: nearestUsableTick(\n TickMath.MIN_TICK,\n TICK_SPACINGS[this.poolFee]\n ),\n liquidityNet: bigLiq,\n liquidityGross: bigLiq,\n },\n {\n index: nearestUsableTick(\n TickMath.MAX_TICK,\n TICK_SPACINGS[this.poolFee]\n ),\n liquidityNet: negBigLiq,\n liquidityGross: bigLiq,\n },\n ];\n\n return new Pool(\n tokenIn.getUniToken(),\n tokenOut.getUniToken(),\n this.poolFee,\n sqrtPriceX96.toString(), //note the description discrepancy - sqrtPriceX96 and sqrtRatioX96 are interchangable values\n liquidity,\n tick,\n tickConstructorArgs\n );\n }\n\n async computeTradeExactIn(\n tokenIn: UniEvmToken,\n tokenOut: UniEvmToken,\n amount: string\n ): Promise> {\n // create pool\n const pool = await this.createPool(tokenIn, tokenOut);\n // let's get that quote\n const amountIn = tokenIn.computeUnitAmount(amount);\n\n const route = new Route(\n [pool],\n tokenIn.getUniToken(),\n tokenOut.getUniToken()\n );\n return Trade.fromRoute(\n route,\n CurrencyAmount.fromRawAmount(tokenIn.getUniToken(), amountIn.toString()),\n TradeType.EXACT_INPUT\n );\n }\n\n async computeTradeExactOut(\n tokenIn: UniEvmToken,\n tokenOut: UniEvmToken,\n amount: string\n ): Promise> {\n // create pool\n const pool = await this.createPool(tokenIn, tokenOut);\n // let's get that quote\n const amountOut = tokenOut.computeUnitAmount(amount);\n\n const route = new Route(\n [pool],\n tokenIn.getUniToken(),\n tokenOut.getUniToken()\n );\n return Trade.fromRoute(\n route,\n CurrencyAmount.fromRawAmount(\n tokenOut.getUniToken(),\n amountOut.toString()\n ),\n TradeType.EXACT_OUTPUT\n );\n }\n\n async fetchQuoteAmountOut(\n tokenIn: UniEvmToken,\n tokenOut: UniEvmToken,\n amountIn: string,\n slippage: string\n ): Promise {\n // get the quote\n const trade = await this.computeTradeExactIn(tokenIn, tokenOut, amountIn);\n\n const decimals = tokenOut.getDecimals();\n\n // calculate output amount with slippage\n const minAmountOut = ethers.FixedNumber.from(\n trade.outputAmount.toSignificant(decimals)\n );\n\n const slippageMultiplier = ethers.FixedNumber.from(\"1\").subUnsafe(\n ethers.FixedNumber.from(slippage)\n );\n const minAmountOutWithSlippage = minAmountOut\n .mulUnsafe(slippageMultiplier)\n .round(decimals);\n\n return tokenOut.computeUnitAmount(minAmountOutWithSlippage.toString());\n }\n\n async fetchQuoteAmountIn(\n tokenIn: UniEvmToken,\n tokenOut: UniEvmToken,\n amountOut: string,\n slippage: string\n ): Promise {\n // get the quote\n const trade = await this.computeTradeExactOut(tokenIn, tokenOut, amountOut);\n\n const decimals = tokenIn.getDecimals();\n\n // calculate output amount with slippage\n const maxAmountIn = ethers.FixedNumber.from(\n trade.inputAmount.toSignificant(decimals)\n );\n\n const slippageDivisor = ethers.FixedNumber.from(\"1\").subUnsafe(\n ethers.FixedNumber.from(slippage)\n );\n const maxAmountInWithSlippage = maxAmountIn\n .divUnsafe(slippageDivisor)\n .round(decimals);\n\n return tokenIn.computeUnitAmount(maxAmountInWithSlippage.toString());\n }\n\n getProtocol(): string {\n return PROTOCOL;\n }\n}\n","import { ethers } from \"ethers\";\nimport { TransactionReceipt } from \"@ethersproject/abstract-provider\";\n\nexport const CROSSCHAINSWAP_GAS_PARAMETERS = {\n gasLimit: \"550000\",\n maxFeePerGas: \"250000000000\",\n maxPriorityFeePerGas: \"1690000000\",\n};\n\n// exact in\n//\nexport async function swapExactInFromVaaNative(\n swapContractWithSigner: ethers.Contract,\n signedVaa: Uint8Array\n): Promise {\n const tx = await swapContractWithSigner.recvAndSwapExactNativeIn(\n signedVaa,\n CROSSCHAINSWAP_GAS_PARAMETERS\n );\n return tx.wait();\n}\n\nexport async function swapExactInFromVaaToken(\n swapContractWithSigner: ethers.Contract,\n signedVaa: Uint8Array\n): Promise {\n const tx = await swapContractWithSigner.recvAndSwapExactIn(\n signedVaa,\n CROSSCHAINSWAP_GAS_PARAMETERS\n );\n return tx.wait();\n}\n\n// exact out (TODO: add to util)\n//\nexport async function swapExactOutFromVaaNative(\n swapContractWithSigner: ethers.Contract,\n signedVaa: Uint8Array\n): Promise {\n const tx = await swapContractWithSigner.recvAndSwapExactNativeOut(\n signedVaa,\n CROSSCHAINSWAP_GAS_PARAMETERS\n );\n return tx.wait();\n}\n\nexport async function swapExactOutFromVaaToken(\n swapContractWithSigner: ethers.Contract,\n signedVaa: Uint8Array\n): Promise {\n const tx = await swapContractWithSigner.recvAndSwapExactOut(\n signedVaa,\n CROSSCHAINSWAP_GAS_PARAMETERS\n );\n return tx.wait();\n}\n","import { ethers } from \"ethers\";\nimport { TransactionReceipt } from \"@ethersproject/abstract-provider\";\nimport {\n CHAIN_ID_POLYGON as WORMHOLE_CHAIN_ID_POLYGON,\n CHAIN_ID_ETH as WORMHOLE_CHAIN_ID_ETHEREUM,\n ChainId,\n getEmitterAddressEth,\n hexToUint8Array,\n nativeToHexString,\n parseSequenceFromLogEth,\n getSignedVAAWithRetry,\n} from \"@certusone/wormhole-sdk\";\nimport { grpc } from \"@improbable-eng/grpc-web\";\nimport { UniEvmToken } from \"../route/uniswap-core\";\nimport {\n PROTOCOL_UNISWAP_V2,\n // PROTOCOL_UNISWAP_V3,\n ExactInCrossParameters,\n ExactOutCrossParameters,\n QuoteType,\n UniswapToUniswapQuoter,\n} from \"../route/cross-quote\";\nimport {\n TOKEN_BRIDGE_ADDRESS_POLYGON,\n CORE_BRIDGE_ADDRESS_ETHEREUM,\n CORE_BRIDGE_ADDRESS_POLYGON,\n TOKEN_BRIDGE_ADDRESS_ETHEREUM,\n WORMHOLE_RPC_HOSTS,\n POLYGON_NETWORK_CHAIN_ID,\n ETH_NETWORK_CHAIN_ID,\n WETH_TOKEN_INFO,\n WMATIC_TOKEN_INFO,\n} from \"../utils/consts\";\nimport {\n CROSSCHAINSWAP_GAS_PARAMETERS,\n swapExactInFromVaaNative,\n swapExactInFromVaaToken,\n swapExactOutFromVaaNative,\n swapExactOutFromVaaToken,\n} from \"./util\";\nimport { abi as SWAP_CONTRACT_V2_ABI } from \"../abi/contracts/CrossChainSwapV2.json\";\nimport { abi as SWAP_CONTRACT_V3_ABI } from \"../abi/contracts/CrossChainSwapV3.json\";\nimport { SWAP_CONTRACT_ADDRESS as CROSSCHAINSWAP_CONTRACT_ADDRESS_ETHEREUM } from \"../addresses/goerli\";\nimport { SWAP_CONTRACT_ADDRESS as CROSSCHAINSWAP_CONTRACT_ADDRESS_POLYGON } from \"../addresses/mumbai\";\n\ninterface SwapContractParameters {\n address: string;\n}\n\ninterface WormholeParameters {\n chainId: ChainId;\n coreBridgeAddress: string;\n tokenBridgeAddress: string;\n}\n\ninterface ExecutionParameters {\n crossChainSwap: SwapContractParameters;\n wormhole: WormholeParameters;\n}\n\nconst EXECUTION_PARAMETERS_ETHEREUM: ExecutionParameters = {\n crossChainSwap: {\n address: CROSSCHAINSWAP_CONTRACT_ADDRESS_ETHEREUM,\n },\n wormhole: {\n chainId: WORMHOLE_CHAIN_ID_ETHEREUM,\n coreBridgeAddress: CORE_BRIDGE_ADDRESS_ETHEREUM,\n tokenBridgeAddress: TOKEN_BRIDGE_ADDRESS_ETHEREUM,\n },\n};\n\nconst EXECUTION_PARAMETERS_POLYGON: ExecutionParameters = {\n crossChainSwap: {\n address: CROSSCHAINSWAP_CONTRACT_ADDRESS_POLYGON,\n },\n wormhole: {\n chainId: WORMHOLE_CHAIN_ID_POLYGON,\n coreBridgeAddress: CORE_BRIDGE_ADDRESS_POLYGON,\n tokenBridgeAddress: TOKEN_BRIDGE_ADDRESS_POLYGON,\n },\n};\n\nfunction makeExecutionParameters(id: number): ExecutionParameters {\n switch (id) {\n case ETH_NETWORK_CHAIN_ID: {\n return EXECUTION_PARAMETERS_ETHEREUM;\n }\n case POLYGON_NETWORK_CHAIN_ID: {\n return EXECUTION_PARAMETERS_POLYGON;\n }\n default: {\n throw Error(\"unrecognized chain id\");\n }\n }\n}\n\nasync function approveContractTokenSpend(\n provider: ethers.providers.Provider,\n signer: ethers.Signer,\n tokenContract: ethers.Contract,\n swapContractAddress: string,\n amount: ethers.BigNumber\n): Promise {\n // build transaction for token spending\n const unsignedTx = await tokenContract.populateTransaction.approve(\n swapContractAddress,\n amount\n );\n\n const address = await signer.getAddress();\n\n // gas calcs\n const gas_limit = \"0x100000\";\n const gasPrice = await signer.getGasPrice();\n const parsedGasPrice = ethers.utils.hexlify(parseInt(gasPrice.toString()));\n\n console.log(\"gettingTranscationCount\", provider);\n\n unsignedTx.nonce = await provider.getTransactionCount(address, \"latest\");\n unsignedTx.gasLimit = ethers.BigNumber.from(ethers.utils.hexlify(gas_limit));\n unsignedTx.gasPrice = ethers.BigNumber.from(parsedGasPrice);\n console.log(\"done gettingTranscationCount\");\n\n // sign and send transaction\n const tx = await signer.sendTransaction(unsignedTx);\n return tx.wait();\n}\n\nfunction makeCrossChainSwapV3Contract(\n contractAddress: string,\n provider: ethers.providers.Provider\n): ethers.Contract {\n return new ethers.Contract(contractAddress, SWAP_CONTRACT_V3_ABI, provider);\n}\n\nfunction makeCrossChainSwapV2Contract(\n contractAddress: string,\n provider: ethers.providers.Provider\n): ethers.Contract {\n return new ethers.Contract(contractAddress, SWAP_CONTRACT_V2_ABI, provider);\n}\n\nfunction makeCrossChainSwapContract(\n provider: ethers.providers.Provider,\n protocol: string,\n contractAddress: string\n): ethers.Contract {\n if (protocol === PROTOCOL_UNISWAP_V2) {\n return makeCrossChainSwapV2Contract(contractAddress, provider);\n } else {\n return makeCrossChainSwapV3Contract(contractAddress, provider);\n }\n}\n\nfunction addressToBytes32(\n address: string,\n wormholeChainId: ChainId\n): Uint8Array {\n const hexString = nativeToHexString(address, wormholeChainId);\n if (hexString === null) {\n throw new Error(\"nativeToHexString returned null\");\n }\n return hexToUint8Array(hexString);\n}\n\nasync function approveAndSwapExactIn(\n srcProvider: ethers.providers.Provider,\n srcWallet: ethers.Signer,\n srcTokenIn: UniEvmToken,\n quoteParams: ExactInCrossParameters,\n srcExecutionParams: ExecutionParameters,\n dstExecutionParams: ExecutionParameters,\n isNative: boolean\n): Promise {\n const swapContractParams = srcExecutionParams.crossChainSwap;\n\n const protocol = quoteParams.src.protocol;\n const swapContract = makeCrossChainSwapContract(\n srcProvider,\n protocol,\n swapContractParams.address\n );\n const contractWithSigner = swapContract.connect(srcWallet);\n\n // approve and swap this amount\n const amountIn = quoteParams.src.amountIn;\n\n const address = await srcWallet.getAddress();\n\n const swapParams = [\n amountIn,\n quoteParams.src.minAmountOut,\n quoteParams.dst.minAmountOut,\n address,\n quoteParams.src.deadline,\n quoteParams.dst.poolFee || quoteParams.src.poolFee,\n ];\n\n const pathArray = quoteParams.src.path.concat(quoteParams.dst.path);\n\n const dstWormholeChainId = dstExecutionParams.wormhole.chainId;\n const dstContractAddress = addressToBytes32(\n dstExecutionParams.crossChainSwap.address,\n dstWormholeChainId\n );\n const bridgeNonce = 69;\n\n // do the swap\n if (isNative) {\n const gasPlusValue = {\n value: amountIn,\n gasLimit: CROSSCHAINSWAP_GAS_PARAMETERS.gasLimit,\n maxFeePerGas: CROSSCHAINSWAP_GAS_PARAMETERS.maxFeePerGas,\n maxPriorityFeePerGas: CROSSCHAINSWAP_GAS_PARAMETERS.maxPriorityFeePerGas,\n };\n\n console.info(\"swapExactNativeInAndTransfer\");\n const tx = await contractWithSigner.swapExactNativeInAndTransfer(\n swapParams,\n pathArray,\n quoteParams.relayerFee.amount,\n dstWormholeChainId,\n dstContractAddress,\n bridgeNonce,\n gasPlusValue\n );\n return tx.wait();\n } else {\n console.info(\"approving contract to spend token in\");\n await approveContractTokenSpend(\n srcProvider,\n srcWallet,\n srcTokenIn.getContract(),\n swapContract.address,\n amountIn\n );\n\n console.info(\"swapExactInAndTransfer\");\n const tx = await contractWithSigner.swapExactInAndTransfer(\n swapParams,\n pathArray,\n quoteParams.relayerFee.amount,\n dstWormholeChainId,\n dstContractAddress,\n bridgeNonce,\n CROSSCHAINSWAP_GAS_PARAMETERS\n );\n return tx.wait();\n }\n}\n\nasync function approveAndSwapExactOut(\n srcProvider: ethers.providers.Provider,\n srcWallet: ethers.Signer,\n srcTokenIn: UniEvmToken,\n quoteParams: ExactOutCrossParameters,\n srcExecutionParams: ExecutionParameters,\n dstExecutionParams: ExecutionParameters,\n isNative: boolean\n): Promise {\n const swapContractParams = srcExecutionParams.crossChainSwap;\n\n const protocol = quoteParams.src.protocol;\n const swapContract = makeCrossChainSwapContract(\n srcProvider,\n protocol,\n swapContractParams.address\n );\n const contractWithSigner = swapContract.connect(srcWallet);\n\n // approve and swap this amount\n const amountOut = quoteParams.src.amountOut;\n const maxAmountIn = quoteParams.src.maxAmountIn;\n\n const address = await srcWallet.getAddress();\n\n const swapParams = [\n amountOut,\n maxAmountIn,\n quoteParams.dst.amountOut,\n address,\n quoteParams.src.deadline,\n quoteParams.dst.poolFee || quoteParams.src.poolFee,\n ];\n const pathArray = quoteParams.src.path.concat(quoteParams.dst.path);\n\n const dstWormholeChainId = dstExecutionParams.wormhole.chainId;\n const dstContractAddress = addressToBytes32(\n dstExecutionParams.crossChainSwap.address,\n dstWormholeChainId\n );\n const bridgeNonce = 69;\n\n // do the swap\n if (isNative) {\n const gasPlusValue = {\n value: maxAmountIn,\n gasLimit: CROSSCHAINSWAP_GAS_PARAMETERS.gasLimit,\n maxFeePerGas: CROSSCHAINSWAP_GAS_PARAMETERS.maxFeePerGas,\n maxPriorityFeePerGas: CROSSCHAINSWAP_GAS_PARAMETERS.maxPriorityFeePerGas,\n };\n\n console.info(\"swapExactNativeOutAndTransfer\");\n const tx = await contractWithSigner.swapExactNativeOutAndTransfer(\n swapParams,\n pathArray,\n quoteParams.relayerFee.amount,\n dstWormholeChainId,\n dstContractAddress,\n bridgeNonce,\n gasPlusValue\n );\n return tx.wait();\n } else {\n console.info(\"approving contract to spend token in\");\n await approveContractTokenSpend(\n srcProvider,\n srcWallet,\n srcTokenIn.getContract(),\n swapContract.address,\n maxAmountIn\n );\n\n console.info(\"swapExactOutAndTransfer\");\n const tx = await contractWithSigner.swapExactOutAndTransfer(\n swapParams,\n pathArray,\n quoteParams.relayerFee.amount,\n dstWormholeChainId,\n dstContractAddress,\n bridgeNonce,\n CROSSCHAINSWAP_GAS_PARAMETERS\n );\n return tx.wait();\n }\n}\n\nasync function swapExactInFromVaa(\n dstProvider: ethers.providers.Provider,\n dstWallet: ethers.Signer,\n dstExecutionParams: ExecutionParameters,\n dstProtocol: string,\n signedVaa: Uint8Array,\n isNative: boolean\n): Promise {\n const swapContractParams = dstExecutionParams.crossChainSwap;\n\n const swapContract = makeCrossChainSwapContract(\n dstProvider,\n dstProtocol,\n swapContractParams.address\n );\n const contractWithSigner = swapContract.connect(dstWallet);\n\n if (isNative) {\n console.info(\"swapExactInFromVaaNative\");\n return swapExactInFromVaaNative(contractWithSigner, signedVaa);\n } else {\n console.info(\"swapExactInFromVaaToken\");\n return swapExactInFromVaaToken(contractWithSigner, signedVaa);\n }\n}\n\nasync function swapExactOutFromVaa(\n dstProvider: ethers.providers.Provider,\n dstWallet: ethers.Signer,\n dstExecutionParams: ExecutionParameters,\n dstProtocol: string,\n signedVaa: Uint8Array,\n isNative: boolean\n): Promise {\n const swapContractParams = dstExecutionParams.crossChainSwap;\n\n const swapContract = makeCrossChainSwapContract(\n dstProvider,\n dstProtocol,\n swapContractParams.address\n );\n const contractWithSigner = swapContract.connect(dstWallet);\n\n if (isNative) {\n console.info(\"swapExactOutFromVaaNative\");\n return swapExactOutFromVaaNative(contractWithSigner, signedVaa);\n } else {\n console.info(\"swapExactOutFromVaaToken\");\n return swapExactOutFromVaaToken(contractWithSigner, signedVaa);\n }\n}\n\ninterface CrossChainSwapTokens {\n srcIn: UniEvmToken;\n srcOut: UniEvmToken;\n dstIn: UniEvmToken;\n dstOut: UniEvmToken;\n}\n\ninterface VaaSearchParams {\n sequence: string;\n emitterAddress: string;\n}\n\nexport function makeProvider(tokenAddress: string) {\n switch (tokenAddress) {\n case WETH_TOKEN_INFO.address: {\n const url = process.env.REACT_APP_GOERLI_PROVIDER;\n if (!url) {\n throw new Error(\"Could not find REACT_APP_GOERLI_PROVIDER\");\n }\n return new ethers.providers.StaticJsonRpcProvider(url);\n }\n case WMATIC_TOKEN_INFO.address: {\n const url = process.env.REACT_APP_MUMBAI_PROVIDER;\n if (!url) {\n throw new Error(\"Could not find REACT_APP_MUMBAI_PROVIDER\");\n }\n return new ethers.providers.StaticJsonRpcProvider(url);\n }\n default: {\n throw Error(\"unrecognized token address\");\n }\n }\n}\n\nexport class UniswapToUniswapExecutor {\n // quoting\n quoter: UniswapToUniswapQuoter;\n cachedExactInParams: ExactInCrossParameters;\n cachedExactOutParams: ExactOutCrossParameters;\n quoteType: QuoteType;\n tokens: CrossChainSwapTokens;\n\n // swapping\n isNative: boolean;\n slippage: string;\n relayerFeeAmount: string;\n srcExecutionParams: ExecutionParameters;\n dstExecutionParams: ExecutionParameters;\n\n // vaa handling\n transportFactory: grpc.TransportFactory;\n vaaSearchParams: VaaSearchParams;\n vaaBytes: Uint8Array;\n srcReceipt: TransactionReceipt;\n dstReceipt: TransactionReceipt;\n\n async initialize(\n tokenInAddress: string,\n tokenOutAddress: string,\n isNative: boolean\n ): Promise {\n this.isNative = isNative;\n\n const srcProvider = makeProvider(tokenInAddress);\n const dstProvider = makeProvider(tokenOutAddress);\n\n this.quoter = new UniswapToUniswapQuoter(srcProvider, dstProvider);\n await this.quoter.initialize();\n\n await this.makeTokens(tokenInAddress, tokenOutAddress);\n\n // now that we have a chain id for each network, get contract info for each chain\n this.srcExecutionParams = makeExecutionParameters(\n this.quoter.srcNetwork.chainId\n );\n this.dstExecutionParams = makeExecutionParameters(\n this.quoter.dstNetwork.chainId\n );\n }\n\n setSlippage(slippage: string): void {\n this.slippage = slippage;\n }\n\n setRelayerFee(amount: string): void {\n this.relayerFeeAmount = amount;\n }\n\n areSwapParametersUndefined(): boolean {\n return this.slippage === undefined || this.relayerFeeAmount === undefined;\n }\n\n setDeadlines(deadline: string): void {\n this.quoter.setDeadlines(deadline);\n }\n\n async makeTokens(\n tokenInAddress: string,\n tokenOutAddress: string\n ): Promise {\n const quoter = this.quoter;\n\n const [srcTokenIn, srcTokenOut] = await quoter.makeSrcTokens(\n tokenInAddress\n );\n const [dstTokenIn, dstTokenOut] = await quoter.makeDstTokens(\n tokenOutAddress\n );\n\n this.tokens = {\n srcIn: srcTokenIn,\n srcOut: srcTokenOut,\n dstIn: dstTokenIn,\n dstOut: dstTokenOut,\n };\n }\n\n getTokens(): CrossChainSwapTokens {\n return this.tokens;\n }\n\n async computeAndVerifySrcPoolAddress(): Promise {\n return this.quoter.computeAndVerifySrcPoolAddress();\n }\n\n async computeAndVerifyDstPoolAddress(): Promise {\n return this.quoter.computeAndVerifyDstPoolAddress();\n }\n\n async computeQuoteExactIn(amountIn: string): Promise {\n if (this.areSwapParametersUndefined()) {\n throw Error(\"undefined swap parameters\");\n }\n\n this.cachedExactInParams = await this.quoter.computeExactInParameters(\n amountIn,\n this.slippage,\n this.relayerFeeAmount\n );\n this.quoteType = QuoteType.ExactIn;\n return this.cachedExactInParams;\n }\n\n async computeQuoteExactOut(\n amountOut: string\n ): Promise {\n if (this.areSwapParametersUndefined()) {\n throw Error(\"undefined swap parameters\");\n }\n\n this.cachedExactOutParams = await this.quoter.computeExactOutParameters(\n amountOut,\n this.slippage,\n this.relayerFeeAmount\n );\n this.quoteType = QuoteType.ExactOut;\n return this.cachedExactOutParams;\n }\n\n getSrcProvider(): ethers.providers.Provider {\n return this.quoter.srcProvider;\n }\n\n getDstProvider(): ethers.providers.Provider {\n return this.quoter.dstProvider;\n }\n\n async approveAndSwapExactIn(\n wallet: ethers.Signer\n ): Promise {\n return approveAndSwapExactIn(\n this.getSrcProvider(),\n wallet,\n this.tokens.srcIn,\n this.cachedExactInParams,\n this.srcExecutionParams,\n this.dstExecutionParams,\n this.isNative\n );\n }\n\n async approveAndSwapExactOut(\n wallet: ethers.Signer\n ): Promise {\n return approveAndSwapExactOut(\n this.getSrcProvider(),\n wallet,\n this.tokens.srcIn,\n this.cachedExactOutParams,\n this.srcExecutionParams,\n this.dstExecutionParams,\n this.isNative\n );\n }\n\n async approveAndSwap(wallet: ethers.Signer): Promise {\n const quoteType = this.quoteType;\n\n if (quoteType === QuoteType.ExactIn) {\n this.srcReceipt = await this.approveAndSwapExactIn(wallet);\n } else if (quoteType === QuoteType.ExactOut) {\n this.srcReceipt = await this.approveAndSwapExactOut(wallet);\n } else {\n throw Error(\"no quote found\");\n }\n\n this.fetchAndSetEmitterAndSequence();\n return this.srcReceipt;\n }\n\n fetchAndSetEmitterAndSequence(): void {\n const receipt = this.srcReceipt;\n if (receipt === undefined) {\n throw Error(\"no swap receipt found\");\n }\n\n const wormholeParams = this.srcExecutionParams.wormhole;\n\n this.vaaSearchParams = {\n sequence: parseSequenceFromLogEth(\n receipt,\n wormholeParams.coreBridgeAddress\n ),\n emitterAddress: getEmitterAddressEth(wormholeParams.tokenBridgeAddress),\n };\n }\n\n async fetchSignedVaaFromSwap(): Promise {\n const vaaSearchParams = this.vaaSearchParams;\n if (vaaSearchParams === undefined) {\n throw Error(\"no vaa search params found\");\n }\n const sequence = vaaSearchParams.sequence;\n const emitterAddress = vaaSearchParams.emitterAddress;\n console.info(`sequence: ${sequence}, emitterAddress: ${emitterAddress}`);\n // wait for VAA to be signed\n const vaaResponse = await getSignedVAAWithRetry(\n WORMHOLE_RPC_HOSTS,\n this.srcExecutionParams.wormhole.chainId,\n vaaSearchParams.emitterAddress,\n vaaSearchParams.sequence\n );\n // grab vaaBytes\n this.vaaBytes = vaaResponse.vaaBytes;\n }\n\n async fetchVaaAndSwap(wallet: ethers.Signer): Promise {\n await this.fetchSignedVaaFromSwap();\n\n const quoteType = this.quoteType;\n\n if (quoteType === QuoteType.ExactIn) {\n this.dstReceipt = await this.swapExactInFromVaa(wallet);\n } else if (quoteType === QuoteType.ExactOut) {\n this.dstReceipt = await this.swapExactOutFromVaa(wallet);\n } else {\n throw Error(\"no quote found\");\n }\n\n return this.dstReceipt;\n }\n\n async swapExactInFromVaa(wallet: ethers.Signer): Promise {\n return swapExactInFromVaa(\n this.getDstProvider(),\n wallet,\n this.dstExecutionParams,\n this.cachedExactInParams.dst.protocol,\n this.vaaBytes,\n this.isNative\n );\n }\n\n async swapExactOutFromVaa(\n wallet: ethers.Signer\n ): Promise {\n return swapExactOutFromVaa(\n this.getDstProvider(),\n wallet,\n this.dstExecutionParams,\n this.cachedExactOutParams.dst.protocol,\n this.vaaBytes,\n this.isNative\n );\n }\n\n //getSwapResult(\n // walletAddress: string,\n // onSwapResult: (result: boolean) => void\n //) {\n // console.log(this.cachedExactInParams.dst.protocol);\n // console.log(this.dstExecutionParams.crossChainSwap.address);\n // const contract = makeCrossChainSwapContract(\n // this.getDstProvider(),\n // this.quoteType === QuoteType.ExactIn\n // ? this.cachedExactInParams.dst.protocol\n // : this.cachedExactOutParams.dst.protocol,\n // this.dstExecutionParams.crossChainSwap.address\n // );\n // const filter = contract.filters.SwapResult(walletAddress);\n // contract.once(\n // filter,\n // (recipient, tokenAddress, caller, amount, success) => {\n // onSwapResult(success);\n // }\n // );\n //}\n}\n","export const SWAP_CONTRACT_ADDRESS =\n \"0xDE3a69BFd962Eb16Ae742FdbA42ac48bb3b4E8fD\";\n","export const SWAP_CONTRACT_ADDRESS =\n \"0xe34Bda733530C5687Bd2aCaB093218edCCA142E4\";\n","const MM_ERR_WITH_INFO_START =\n \"VM Exception while processing transaction: revert \";\nconst parseError = (e: any) =>\n e?.data?.message?.startsWith(MM_ERR_WITH_INFO_START)\n ? e.data.message.replace(MM_ERR_WITH_INFO_START, \"\")\n : e?.response?.data?.error // terra error\n ? e.response.data.error\n : e?.message\n ? e.message\n : \"An unknown error occurred\";\nexport default parseError;\n","import {\n Button,\n Dialog,\n DialogContent,\n DialogTitle,\n InputAdornment,\n TextField,\n} from \"@material-ui/core\";\nimport SettingsIcon from \"@material-ui/icons/Settings\";\nimport { makeStyles } from \"@material-ui/styles\";\nimport { useState } from \"react\";\n\nconst useStyles = makeStyles({\n topScrollPaper: {\n alignItems: \"flex-start\",\n },\n topPaperScrollBody: {\n verticalAlign: \"top\",\n },\n button: {\n float: \"right\",\n \"&:hover\": {\n backgroundColor: \"transparent\",\n },\n },\n});\n\nconst clamp = (value: number, min: number, max: number) => {\n if (isNaN(value)) {\n return value;\n }\n return Math.min(Math.max(min, value), max);\n};\n\nexport default function Settings({\n disabled,\n slippage,\n deadline,\n onSlippageChange,\n onDeadlineChange,\n}: {\n disabled: boolean;\n slippage: string;\n deadline: string;\n onSlippageChange: (slippage: string) => void;\n onDeadlineChange: (deadline: string) => void;\n}) {\n const classes = useStyles();\n const [dialogIsOpen, setDialogIsOpen] = useState(false);\n\n const dialog = (\n setDialogIsOpen(false)}\n maxWidth=\"xs\"\n scroll=\"paper\"\n >\n Transaction Settings\n \n %,\n }}\n margin=\"normal\"\n type=\"number\"\n onChange={(event) => {\n onSlippageChange(\n event.target.value === \"\"\n ? \"\"\n : clamp(parseFloat(event.target.value), 0, 100).toString()\n );\n }}\n >\n minutes\n ),\n }}\n margin=\"normal\"\n type=\"number\"\n onChange={(event) => {\n onDeadlineChange(\n event.target.value === \"\"\n ? \"\"\n : clamp(parseFloat(event.target.value), 1, 100).toString()\n );\n }}\n >\n \n \n );\n\n return (\n
\n {\n setDialogIsOpen(true);\n }}\n disabled={disabled}\n disableRipple\n endIcon={}\n />\n {dialog}\n
\n );\n}\n","import { getIsTransferCompletedEth } from \"@certusone/wormhole-sdk\";\nimport { ethers } from \"ethers\";\n\nexport default async function getIsTransferCompletedEvmWithRetry(\n tokenBridgeAddress: string,\n provider: ethers.providers.Provider,\n signedVAA: Uint8Array,\n retryTimeoutMs: number,\n retryAttempts: number\n) {\n let result = false;\n let attempts = 0;\n while (attempts < retryAttempts) {\n try {\n result = await getIsTransferCompletedEth(\n tokenBridgeAddress,\n provider,\n signedVAA\n );\n } catch (e) {\n console.error(e);\n }\n if (result) {\n break;\n }\n await new Promise((resolve) => setTimeout(resolve, retryTimeoutMs));\n attempts++;\n }\n return result;\n}\n","import \"../css/CircleLoader.css\";\n\nexport default function CircleLoader() {\n return (\n
\n
\n
\n
\n
\n );\n}\n","import { ChainId, CHAIN_ID_POLYGON, isEVMChain } from \"@certusone/wormhole-sdk\";\nimport { LinearProgress, makeStyles, Typography } from \"@material-ui/core\";\nimport { useEffect, useState } from \"react\";\nimport { useEthereumProvider } from \"../contexts/EthereumProviderContext\";\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n marginTop: theme.spacing(2),\n textAlign: \"center\",\n },\n message: {\n marginTop: theme.spacing(1),\n },\n}));\n\nexport default function TransactionProgress({\n chainId,\n txBlockNumber,\n step,\n}: {\n chainId: ChainId;\n txBlockNumber: number | undefined;\n step: number;\n}) {\n const classes = useStyles();\n const { provider } = useEthereumProvider();\n const [currentBlock, setCurrentBlock] = useState(0);\n useEffect(() => {\n if (step !== 1 || !txBlockNumber) return;\n if (isEVMChain(chainId) && provider) {\n let cancelled = false;\n (async () => {\n while (!cancelled) {\n await new Promise((resolve) => setTimeout(resolve, 500));\n try {\n const newBlock = await provider.getBlockNumber();\n if (!cancelled) {\n setCurrentBlock(newBlock);\n }\n } catch (e) {\n console.error(e);\n }\n }\n })();\n return () => {\n cancelled = true;\n };\n }\n }, [step, chainId, provider, txBlockNumber]);\n const blockDiff =\n txBlockNumber !== undefined && txBlockNumber && currentBlock\n ? currentBlock - txBlockNumber\n : 0;\n const expectedBlocks = 15;\n let value;\n let valueBuffer;\n let message;\n switch (step) {\n case 1:\n value = (blockDiff / expectedBlocks) * 50;\n valueBuffer = 50;\n message = `Waiting for ${blockDiff} / ${expectedBlocks} confirmations on ${\n chainId === CHAIN_ID_POLYGON ? \"Polygon\" : \"Ethereum\"\n }...`;\n break;\n case 2:\n value = 50;\n valueBuffer = 100;\n message = \"Waiting for relayer to complete swap...\";\n break;\n case 3:\n value = 100;\n valueBuffer = 100;\n message = \"\";\n break;\n }\n return (\n
\n \n \n {message}\n \n
\n );\n}\n","import {\n Collapse,\n Container,\n Link,\n makeStyles,\n Paper,\n TextField,\n Typography,\n} from \"@material-ui/core\";\nimport { ChainId, getSignedVAAWithRetry } from \"@certusone/wormhole-sdk\";\nimport { useCallback, useEffect, useState } from \"react\";\nimport ButtonWithLoader from \"../components/ButtonWithLoader\";\nimport EthereumSignerKey from \"../components/EthereumSignerKey\";\nimport TokenSelect from \"../components/TokenSelect\";\nimport { useEthereumProvider } from \"../contexts/EthereumProviderContext\";\nimport {\n ETH_TOKEN_INFO,\n getEvmChainId,\n MATIC_TOKEN_INFO,\n RELAYER_FEE_UST,\n TOKEN_INFOS,\n WETH_TOKEN_INFO,\n WMATIC_TOKEN_INFO,\n WORMHOLE_RPC_HOSTS,\n} from \"../utils/consts\";\nimport { COLORS } from \"../muiTheme\";\nimport Wormhole from \"../icons/wormhole-network.svg\";\nimport { UniswapToUniswapExecutor } from \"../swapper/swapper\";\nimport { Web3Provider } from \"@ethersproject/providers\";\nimport { hexlify, hexStripZeros } from \"ethers/lib/utils\";\nimport { useDebouncedCallback } from \"use-debounce\";\nimport { useSnackbar } from \"notistack\";\nimport { Alert } from \"@material-ui/lab\";\nimport parseError from \"../utils/parseError\";\nimport Settings from \"../components/Settings\";\nimport getIsTransferCompletedEvmWithRetry from \"../utils/getIsTransferCompletedWithRetry\";\nimport CircleLoader from \"../components/CircleLoader\";\nimport { ArrowForward, CheckCircleOutlineRounded } from \"@material-ui/icons\";\nimport SwapProgress from \"../components/SwapProgress\";\n\nconst useStyles = makeStyles((theme) => ({\n bg: {\n background:\n \"linear-gradient(160deg, rgba(69,74,117,.1) 0%, rgba(138,146,178,.1) 33%, rgba(69,74,117,.1) 66%, rgba(98,104,143,.1) 100%), linear-gradient(45deg, rgba(153,69,255,.1) 0%, rgba(121,98,231,.1) 20%, rgba(0,209,140,.1) 100%)\",\n display: \"flex\",\n flexDirection: \"column\",\n minHeight: \"100vh\",\n },\n centeredContainer: {\n textAlign: \"center\",\n width: \"100%\",\n },\n mainPaper: {\n padding: \"2rem\",\n backgroundColor: COLORS.nearBlackWithMinorTransparency,\n },\n numberField: {\n flexGrow: 1,\n \"& > * > .MuiInputBase-input\": {\n textAlign: \"center\",\n height: \"100%\",\n flexGrow: \"1\",\n fontSize: \"3rem\",\n fontFamily: \"Roboto Mono, monospace\",\n caretShape: \"block\",\n \"&::-webkit-outer-spin-button, &::-webkit-inner-spin-button\": {\n \"-webkit-appearance\": \"none\",\n \"-moz-appearance\": \"none\",\n margin: 0,\n },\n \"&[type=number]\": {\n \"-webkit-appearance\": \"textfield\",\n \"-moz-appearance\": \"textfield\",\n },\n },\n \"& > * > input::-webkit-inner-spin-button\": {\n webkitAppearance: \"none\",\n margin: \"0\",\n },\n },\n gradientButton: {\n backgroundImage: `linear-gradient(45deg, ${COLORS.blue} 0%, ${COLORS.nearBlack}20 50%, ${COLORS.blue}30 62%, ${COLORS.nearBlack}50 120%)`,\n transition: \"0.75s\",\n backgroundSize: \"200% auto\",\n boxShadow: \"0 0 20px #222\",\n \"&:hover\": {\n backgroundPosition:\n \"right center\" /* change the direction of the change here */,\n },\n width: \"100%\",\n height: \"3rem\",\n marginTop: \"1rem\",\n },\n disabled: {\n background: COLORS.gray,\n },\n spacer: {\n height: \"1rem\",\n },\n titleBar: {\n marginTop: \"10rem\",\n \"& > *\": {\n margin: \".5rem\",\n alignSelf: \"flex-end\",\n },\n },\n tokenSelectWrapper: {\n display: \"flex\",\n alignItems: \"center\",\n },\n wormholeIcon: {\n height: 60,\n filter: \"contrast(0)\",\n transition: \"filter 0.5s\",\n \"&:hover\": {\n filter: \"contrast(1)\",\n },\n verticalAlign: \"middle\",\n margin: \"1rem\",\n display: \"inline-block\",\n },\n loaderHolder: {\n display: \"flex\",\n justifyContent: \"center\",\n flexDirection: \"column\",\n alignItems: \"center\",\n },\n successIcon: {\n color: COLORS.green,\n fontSize: \"200px\",\n },\n swapPath: {\n display: \"inline-flex\",\n alignItems: \"center\",\n },\n}));\n\nconst switchProviderNetwork = async (\n provider: Web3Provider,\n chainId: ChainId\n) => {\n const evmChainId = getEvmChainId(chainId);\n if (evmChainId === undefined) {\n throw new Error(\"Unknown chainId\");\n }\n await provider.send(\"wallet_switchEthereumChain\", [\n { chainId: hexStripZeros(hexlify(evmChainId)) },\n ]);\n const network = await provider.getNetwork();\n if (network.chainId !== evmChainId) {\n throw new Error(\"Could not switch network\");\n }\n};\n\nexport default function Home() {\n const classes = useStyles();\n const [sourceTokenInfo, setSourceTokenInfo] = useState(MATIC_TOKEN_INFO);\n const [targetTokenInfo, setTargetTokenInfo] = useState(ETH_TOKEN_INFO);\n const [amountIn, setAmountIn] = useState(\"\");\n const [amountInUST, setAmountInUST] = useState(\"\");\n const [amountOut, setAmountOut] = useState(\"\");\n const [deadline, setDeadline] = useState(\"30\");\n const [slippage, setSlippage] = useState(\"1\");\n const [executor, setExecutor] = useState(\n null\n );\n const [isSwapping, setIsSwapping] = useState(false);\n const [isComputingQuote, setIsComputingQuote] = useState(false);\n const [hasQuote, setHasQuote] = useState(false);\n const { provider, signer } = useEthereumProvider();\n const { enqueueSnackbar } = useSnackbar();\n const [isFirstSwapComplete, setIsFirstSwapComplete] = useState(false);\n const [isSecondSwapComplete, setIsSecondSwapComplete] = useState(false);\n const [sourceTxBlockNumber, setSourceTxBlockNumber] = useState<\n number | undefined\n >(undefined);\n const [hasSignedVAA, setHasSignedVAA] = useState(false);\n const [relayerTimeoutString, setRelayerTimeoutString] = useState(\"\");\n\n const computeQuote = useCallback(() => {\n (async () => {\n setHasQuote(false);\n setIsComputingQuote(true);\n setAmountOut(\"\");\n setAmountInUST(\"\");\n try {\n if (\n parseFloat(amountIn) > 0 &&\n !isNaN(parseFloat(deadline)) &&\n !isNaN(parseFloat(slippage))\n ) {\n const executor = new UniswapToUniswapExecutor();\n await executor.initialize(\n sourceTokenInfo.address,\n targetTokenInfo.address,\n sourceTokenInfo.isNative\n );\n await executor.computeAndVerifySrcPoolAddress().catch((e) => {\n throw new Error(\"failed to verify source pool address\");\n });\n await executor.computeAndVerifyDstPoolAddress().catch((e) => {\n throw new Error(\"failed to verify dest pool address\");\n });\n executor.setDeadlines((parseFloat(deadline) * 60).toString());\n executor.setSlippage((parseFloat(slippage) / 100).toString());\n executor.setRelayerFee(RELAYER_FEE_UST);\n const quote = await executor.computeQuoteExactIn(amountIn);\n setExecutor(executor);\n setAmountOut(\n parseFloat(\n executor.tokens.dstOut.formatAmount(quote.dst.minAmountOut)\n ).toFixed(8)\n );\n setAmountInUST(\n parseFloat(\n executor.tokens.dstIn.formatAmount(quote.dst.amountIn)\n ).toFixed(2)\n );\n setHasQuote(true);\n }\n } catch (e) {\n console.error(e);\n enqueueSnackbar(null, {\n content: {parseError(e)},\n });\n }\n setIsComputingQuote(false);\n })();\n }, [\n sourceTokenInfo,\n targetTokenInfo,\n amountIn,\n deadline,\n slippage,\n enqueueSnackbar,\n ]);\n\n const debouncedComputeQuote = useDebouncedCallback(computeQuote, 1000);\n\n useEffect(() => {\n debouncedComputeQuote();\n }, [\n sourceTokenInfo,\n targetTokenInfo,\n amountIn,\n deadline,\n slippage,\n debouncedComputeQuote,\n ]);\n\n const handleAmountChange = useCallback((event) => {\n setAmountIn(event.target.value);\n }, []);\n\n const handleSlippageChange = useCallback((slippage) => {\n setSlippage(slippage);\n }, []);\n\n const handleDeadlineChange = useCallback((deadline) => {\n setDeadline(deadline);\n }, []);\n\n const handleSourceChange = useCallback((event) => {\n // NOTE: only native-to-native or wrapped-to-wrapped swaps are currently supported\n if (event.target.value === WMATIC_TOKEN_INFO.name) {\n setSourceTokenInfo(WMATIC_TOKEN_INFO);\n setTargetTokenInfo(WETH_TOKEN_INFO);\n } else if (event.target.value === WETH_TOKEN_INFO.name) {\n setSourceTokenInfo(WETH_TOKEN_INFO);\n setTargetTokenInfo(WMATIC_TOKEN_INFO);\n } else if (event.target.value === ETH_TOKEN_INFO.name) {\n setSourceTokenInfo(ETH_TOKEN_INFO);\n setTargetTokenInfo(MATIC_TOKEN_INFO);\n } else {\n setSourceTokenInfo(MATIC_TOKEN_INFO);\n setTargetTokenInfo(ETH_TOKEN_INFO);\n }\n setAmountIn(\"\");\n setAmountOut(\"\");\n }, []);\n\n const reset = useCallback(() => {\n setIsSwapping(false);\n setHasQuote(false);\n setIsFirstSwapComplete(false);\n setIsSecondSwapComplete(false);\n setAmountIn(\"\");\n setAmountOut(\"\");\n setSourceTxBlockNumber(undefined);\n setRelayerTimeoutString(\"\");\n }, []);\n\n const handleSwapClick = useCallback(async () => {\n if (provider && signer && executor) {\n try {\n setIsSwapping(true);\n setIsFirstSwapComplete(false);\n setHasSignedVAA(false);\n setIsSecondSwapComplete(false);\n setRelayerTimeoutString(\"\");\n await switchProviderNetwork(provider, sourceTokenInfo.chainId);\n\n const sourceReceipt = await executor.approveAndSwap(signer);\n console.info(\n \"firstSwapTransactionHash:\",\n sourceReceipt.transactionHash\n );\n setIsFirstSwapComplete(true);\n setSourceTxBlockNumber(sourceReceipt.blockNumber);\n\n // Wait for the guardian network to reach consensus and emit the signedVAA\n const { vaaBytes } = await getSignedVAAWithRetry(\n WORMHOLE_RPC_HOSTS,\n executor.srcExecutionParams.wormhole.chainId,\n executor.vaaSearchParams.emitterAddress,\n executor.vaaSearchParams.sequence\n );\n setHasSignedVAA(true);\n // Check if the signedVAA has redeemed by the relayer\n const isCompleted = await getIsTransferCompletedEvmWithRetry(\n executor.dstExecutionParams.wormhole.tokenBridgeAddress,\n executor.quoter.dstProvider,\n vaaBytes,\n // retry for two minutes\n 3000,\n 40\n );\n if (!isCompleted) {\n // If the relayer hasn't redeemed the signedVAA, then manually redeem it ourselves\n setRelayerTimeoutString(\n \"Timed out waiting for relayer to complete swap. You'll need to complete it yourself.\"\n );\n await switchProviderNetwork(provider, targetTokenInfo.chainId);\n const targetReceipt = await executor.fetchVaaAndSwap(signer);\n console.info(\n \"secondSwapTransactionHash:\",\n targetReceipt.transactionHash\n );\n }\n setIsSecondSwapComplete(true);\n } catch (e: any) {\n reset();\n console.error(e);\n enqueueSnackbar(null, {\n content: {parseError(e)},\n });\n }\n }\n }, [\n provider,\n signer,\n executor,\n enqueueSnackbar,\n sourceTokenInfo,\n targetTokenInfo,\n reset,\n ]);\n\n const readyToSwap = provider && signer && hasQuote;\n\n return (\n
\n \n
\n \n Wormhole NativeSwap Demo\n \n
\n \n \n \n \n Send\n sourceTokenInfo.maxAmount}\n InputProps={{ disableUnderline: true }}\n className={classes.numberField}\n onChange={handleAmountChange}\n placeholder=\"0.0\"\n >\n {parseFloat(amountIn) > sourceTokenInfo.maxAmount ? (\n {`The max input amount is ${sourceTokenInfo.maxAmount} ${sourceTokenInfo.name}`}\n ) : null}\n
\n {}}\n disabled={true}\n >\n Receive (estimated)\n \n {`Slippage tolerance: ${slippage}%`}\n {!isSwapping && }\n \n Swap\n \n \n \n
\n \n
\n \n {`Your ${sourceTokenInfo.name} is being swapped to ${targetTokenInfo.name}`}\n \n
\n \n \n
\n \n Swap completed!\n reset()}>\n Swap more tokens!\n \n
\n
\n
\n {hasQuote && (\n \n {`${amountIn} ${sourceTokenInfo.name}`}\n \n {`${amountInUST} UST `}\n \n {`${amountOut} ${targetTokenInfo.name}`}\n \n )}\n {isFirstSwapComplete &&\n !isSecondSwapComplete &&\n !relayerTimeoutString && (\n \n )}\n {relayerTimeoutString && (\n {relayerTimeoutString}\n )}\n
\n \n WARNING: this is a Testnet release only\n \n \n
\n \n {\"powered by wormhole\"}\n \n \"Wormhole\"\n
\n \n Goerli faucet\n \n
\n Mumbai faucet\n \n
\n );\n}\n","import Home from \"./views/Home\";\n\nexport default function App() {\n return ;\n}\n","import { Typography } from \"@material-ui/core\";\nimport React from \"react\";\n\nexport default class ErrorBoundary extends React.Component {\n constructor(props) {\n super(props);\n this.state = { hasError: false };\n }\n\n static getDerivedStateFromError(error) {\n return { hasError: true };\n }\n\n componentDidCatch(error, errorInfo) {\n console.error(error, errorInfo);\n }\n\n render() {\n if (this.state.hasError) {\n return (\n \n \"An unexpected error has occurred. Please refresh the page.\"\n \n );\n }\n\n return this.props.children;\n }\n}\n","import { CssBaseline } from \"@material-ui/core\";\nimport { ThemeProvider } from \"@material-ui/core/styles\";\nimport { SnackbarProvider } from \"notistack\";\nimport ReactDOM from \"react-dom\";\nimport App from \"./App\";\nimport ErrorBoundary from \"./components/ErrorBoundary\";\nimport { EthereumProviderProvider } from \"./contexts/EthereumProviderContext\";\nimport { theme } from \"./muiTheme\";\n\nReactDOM.render(\n \n \n \n \n \n \n \n \n \n \n ,\n document.getElementById(\"root\")\n);\n"],"sourceRoot":""} \ No newline at end of file