@shapeshiftoss/swap-widget 0.0.2 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (158) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +18 -11
  3. package/package.json +77 -28
  4. package/Dockerfile +0 -87
  5. package/dist/assets/PhArrowCircleDown-B305t-Sh.js +0 -14
  6. package/dist/assets/PhArrowClockwise-CJPxQhr_.js +0 -14
  7. package/dist/assets/PhArrowDown-C4hT9BVu.js +0 -14
  8. package/dist/assets/PhArrowLeft-Way4Cu-r.js +0 -14
  9. package/dist/assets/PhArrowRight-Cp5ZME0F.js +0 -14
  10. package/dist/assets/PhArrowSquareOut-NnrK69c5.js +0 -14
  11. package/dist/assets/PhArrowUp-Dph6j8rm.js +0 -14
  12. package/dist/assets/PhArrowUpRight-BpJjRRRh.js +0 -14
  13. package/dist/assets/PhArrowsClockwise-CFUT8X7R.js +0 -14
  14. package/dist/assets/PhArrowsDownUp-BjBI4ckC.js +0 -14
  15. package/dist/assets/PhArrowsLeftRight-CuLpbKRk.js +0 -14
  16. package/dist/assets/PhBank-Dchr4XQJ.js +0 -14
  17. package/dist/assets/PhBrowser-dUu2TrC1.js +0 -14
  18. package/dist/assets/PhCaretDown-78IuKU3V.js +0 -14
  19. package/dist/assets/PhCaretLeft-_aiyH7n1.js +0 -14
  20. package/dist/assets/PhCaretRight-8zJQEuDX.js +0 -14
  21. package/dist/assets/PhCaretUp-CiCxKWwN.js +0 -14
  22. package/dist/assets/PhCheck-CcADx8br.js +0 -14
  23. package/dist/assets/PhCircleHalf-BYzSzd2h.js +0 -14
  24. package/dist/assets/PhClock-UItiXeJq.js +0 -14
  25. package/dist/assets/PhCompass-CUy3uA7t.js +0 -14
  26. package/dist/assets/PhCopy-C-PDgSlZ.js +0 -14
  27. package/dist/assets/PhCreditCard-CWRaUT6F.js +0 -14
  28. package/dist/assets/PhCurrencyDollar-Cqla3AXT.js +0 -14
  29. package/dist/assets/PhDesktop-BBIPrYLl.js +0 -14
  30. package/dist/assets/PhDeviceMobile-BdsPaATg.js +0 -14
  31. package/dist/assets/PhDotsThree-BMXCQl-0.js +0 -14
  32. package/dist/assets/PhEnvelope-yUsis6yU.js +0 -14
  33. package/dist/assets/PhFunnelSimple-Ba7BbWTp.js +0 -14
  34. package/dist/assets/PhGlobe-DgLxBk5U.js +0 -14
  35. package/dist/assets/PhIdentificationCard-Czjmq9Z3.js +0 -14
  36. package/dist/assets/PhImage-BAJ_erz6.js +0 -14
  37. package/dist/assets/PhInfo-Cr4DhVUE.js +0 -14
  38. package/dist/assets/PhLightbulb-BX_7duTr.js +0 -14
  39. package/dist/assets/PhMagnifyingGlass-Mygfryvz.js +0 -14
  40. package/dist/assets/PhPaperPlaneRight-BeuCA660.js +0 -14
  41. package/dist/assets/PhPlus-BMjcHjsT.js +0 -14
  42. package/dist/assets/PhPower-CGffGmdb.js +0 -14
  43. package/dist/assets/PhPuzzlePiece-wm_GpVSi.js +0 -14
  44. package/dist/assets/PhQrCode-DRwRzXCH.js +0 -14
  45. package/dist/assets/PhQuestion-M09j2U0T.js +0 -14
  46. package/dist/assets/PhQuestionMark-BP9EMB6h.js +0 -14
  47. package/dist/assets/PhSealCheck-BfG80yKn.js +0 -14
  48. package/dist/assets/PhSignOut-C5YOWlPT.js +0 -14
  49. package/dist/assets/PhSpinner-BXooDYzU.js +0 -14
  50. package/dist/assets/PhTrash-Biq6rmmL.js +0 -14
  51. package/dist/assets/PhUser-CAgZSpGe.js +0 -14
  52. package/dist/assets/PhVault-l2PHF38a.js +0 -14
  53. package/dist/assets/PhWallet-w25D16It.js +0 -14
  54. package/dist/assets/PhWarning-DPEydIPw.js +0 -14
  55. package/dist/assets/PhWarningCircle-BqjT745H.js +0 -14
  56. package/dist/assets/PhX-s-SmVExa.js +0 -14
  57. package/dist/assets/SwapController-If0bFrNc.js +0 -1
  58. package/dist/assets/ccip-BBB7uCdL.js +0 -1
  59. package/dist/assets/ccip-CkkdfKKI.js +0 -1
  60. package/dist/assets/data-capture-D4gAy-Yc.js +0 -242
  61. package/dist/assets/email-B1AJehis.js +0 -90
  62. package/dist/assets/embedded-wallet-Q6DQopDk.js +0 -410
  63. package/dist/assets/features-B6JAPAFb.js +0 -5
  64. package/dist/assets/index-5jd8RPN9.js +0 -7428
  65. package/dist/assets/index-B4kNtSTk.js +0 -1080
  66. package/dist/assets/index-B753eAob.js +0 -1
  67. package/dist/assets/index-BZoLTv77.js +0 -3
  68. package/dist/assets/index-Bcw9UURX.js +0 -3
  69. package/dist/assets/index-BkrV-ahK.js +0 -2
  70. package/dist/assets/index-CRQzQ_up.js +0 -9
  71. package/dist/assets/index-CSW0Gt5y.js +0 -132
  72. package/dist/assets/index-CZ4jTIsk.js +0 -138
  73. package/dist/assets/index-Cwa8SB3h.js +0 -61
  74. package/dist/assets/index-DEwQgT4r.js +0 -78
  75. package/dist/assets/index-DVfQiQ1d.js +0 -1
  76. package/dist/assets/index-cV3UdaMs.css +0 -1
  77. package/dist/assets/index-hAmu622O.js +0 -43
  78. package/dist/assets/onramp-XcPNCLRU.js +0 -422
  79. package/dist/assets/pay-with-exchange-BeHt4OF4.js +0 -280
  80. package/dist/assets/property-C9JG5tag.js +0 -27
  81. package/dist/assets/receive-7ff4he2S.js +0 -131
  82. package/dist/assets/send-CkMBIRXT.js +0 -554
  83. package/dist/assets/socials-DmmxuLrP.js +0 -250
  84. package/dist/assets/swaps-IHAYRQ0x.js +0 -1050
  85. package/dist/assets/transactions-9Cxdk7o9.js +0 -16
  86. package/dist/assets/v4-BOvFkHkt.js +0 -1
  87. package/dist/assets/w3m-modal-kJzFnBfB.js +0 -891
  88. package/dist/assets/wallet-standard-Dv8LMoUB.js +0 -1
  89. package/dist/favicon.png +0 -0
  90. package/dist/favicon.svg +0 -11
  91. package/dist/icon-192x192.png +0 -0
  92. package/dist/icon-512x512.png +0 -0
  93. package/dist/index.html +0 -33
  94. package/index.html +0 -32
  95. package/public/favicon.png +0 -0
  96. package/public/favicon.svg +0 -11
  97. package/public/icon-192x192.png +0 -0
  98. package/public/icon-512x512.png +0 -0
  99. package/railway.toml +0 -10
  100. package/src/api/client.ts +0 -95
  101. package/src/components/AddressInputModal.css +0 -173
  102. package/src/components/AddressInputModal.tsx +0 -250
  103. package/src/components/ApprovalStep.tsx +0 -92
  104. package/src/components/ExecutionStep.tsx +0 -27
  105. package/src/components/InputStep.tsx +0 -431
  106. package/src/components/QuoteSelector.css +0 -146
  107. package/src/components/QuoteSelector.tsx +0 -137
  108. package/src/components/QuotesModal.css +0 -250
  109. package/src/components/QuotesModal.tsx +0 -182
  110. package/src/components/SettingsModal.css +0 -145
  111. package/src/components/SettingsModal.tsx +0 -180
  112. package/src/components/StatusStep.tsx +0 -139
  113. package/src/components/SwapWidget.css +0 -713
  114. package/src/components/SwapWidget.tsx +0 -607
  115. package/src/components/TokenSelectModal.css +0 -438
  116. package/src/components/TokenSelectModal.tsx +0 -487
  117. package/src/components/WalletProvider.tsx +0 -92
  118. package/src/config/appkit.ts +0 -104
  119. package/src/config/wagmi.ts +0 -27
  120. package/src/constants/chains.ts +0 -72
  121. package/src/constants/defaults.ts +0 -28
  122. package/src/constants/swappers.ts +0 -48
  123. package/src/constants/viemChains.ts +0 -69
  124. package/src/contexts/SwapWalletContext.tsx +0 -25
  125. package/src/demo/App.css +0 -458
  126. package/src/demo/App.tsx +0 -481
  127. package/src/demo/main.tsx +0 -25
  128. package/src/hooks/useAssets.ts +0 -180
  129. package/src/hooks/useBalances.ts +0 -822
  130. package/src/hooks/useBitcoinSigning.ts +0 -276
  131. package/src/hooks/useMarketData.ts +0 -169
  132. package/src/hooks/useSolanaSigning.ts +0 -275
  133. package/src/hooks/useStatusPolling.ts +0 -137
  134. package/src/hooks/useSwapApproval.ts +0 -106
  135. package/src/hooks/useSwapDisplayValues.ts +0 -157
  136. package/src/hooks/useSwapExecution.ts +0 -199
  137. package/src/hooks/useSwapHandlers.ts +0 -119
  138. package/src/hooks/useSwapQuote.ts +0 -71
  139. package/src/hooks/useSwapQuoting.ts +0 -102
  140. package/src/hooks/useSwapRates.ts +0 -61
  141. package/src/index.ts +0 -43
  142. package/src/machines/SwapMachineContext.ts +0 -5
  143. package/src/machines/__tests__/guards.test.ts +0 -228
  144. package/src/machines/__tests__/setup.test.ts +0 -7
  145. package/src/machines/__tests__/swapMachine.test.ts +0 -544
  146. package/src/machines/__tests__/types.test.ts +0 -124
  147. package/src/machines/guards.ts +0 -33
  148. package/src/machines/swapMachine.ts +0 -288
  149. package/src/machines/types.ts +0 -54
  150. package/src/services/transactionStatus.ts +0 -322
  151. package/src/types/index.ts +0 -361
  152. package/src/utils/addressValidation.ts +0 -201
  153. package/src/utils/redirect.ts +0 -45
  154. package/src/vite-env.d.ts +0 -10
  155. package/tsconfig.json +0 -23
  156. package/tsconfig.node.json +0 -10
  157. package/vite.config.ts +0 -101
  158. package/vitest.config.ts +0 -18
@@ -1 +0,0 @@
1
- import{a5 as B,a6 as X,a7 as G,a8 as p,R as tt,a9 as x,aa as Y,ab as Q,ac as at}from"./index-5jd8RPN9.js";const nt={ton:["ton_sendMessage","ton_signData"],solana:["solana_signMessage","solana_signTransaction","solana_requestAccounts","solana_getAccounts","solana_signAllTransactions","solana_signAndSendTransaction"],eip155:["eth_accounts","eth_requestAccounts","eth_sendRawTransaction","eth_sign","eth_signTransaction","eth_signTypedData","eth_signTypedData_v3","eth_signTypedData_v4","eth_sendTransaction","personal_sign","wallet_switchEthereumChain","wallet_addEthereumChain","wallet_getPermissions","wallet_requestPermissions","wallet_registerOnboarding","wallet_watchAsset","wallet_scanQRCode","wallet_getCallsStatus","wallet_showCallsStatus","wallet_sendCalls","wallet_getCapabilities","wallet_grantPermissions","wallet_revokePermissions","wallet_getAssets"],bip122:["sendTransfer","signMessage","signPsbt","getAccountAddresses"]},y={mainnet:"5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",deprecatedMainnet:"4sGjMW1sUnHzSxGspuhpqLDx6wiyjNtZ",devnet:"EtWTRABZaYq6iMfeYKouRu166VU2xqa1",deprecatedDevnet:"8E9rvCKLFQia2Y35HXjjpWzj8weVo44K"};function et(i){return nt[i]||[]}function st(i){return{methods:et(i),events:["accountsChanged","chainChanged"],chains:[],rpcMap:{}}}function it(i){return i.reduce((n,t)=>{const{id:a,chainNamespace:s,rpcUrls:o}=t,r=o.default.http[0];n[s]||(n[s]=st(s));const h=`${s}:${a}`,l=n[s];switch(l==null||l.chains.push(h),h){case y.mainnet:l.chains.push(y.deprecatedMainnet);break;case y.devnet:l.chains.push(y.deprecatedDevnet);break}return l!=null&&l.rpcMap&&r&&(l.rpcMap[a]=r),n},{})}const Z=["solana:mainnet","solana:devnet","solana:testnet","solana:localnet"];var T=function(i,n,t,a){if(t==="a"&&!a)throw new TypeError("Private accessor was defined without a getter");if(typeof n=="function"?i!==n||!a:!n.has(i))throw new TypeError("Cannot read private member from an object whose class did not declare it");return t==="m"?a:t==="a"?a.call(i):a?a.value:n.get(i)},g=function(i,n,t,a,s){if(a==="m")throw new TypeError("Private method is not writable");if(a==="a"&&!s)throw new TypeError("Private accessor was defined without a setter");if(typeof n=="function"?i!==n||!s:!n.has(i))throw new TypeError("Cannot write private member to an object whose class did not declare it");return a==="a"?s.call(i,t):s?s.value=t:n.set(i,t),t},S,z,E,W,C,L;class ot{get address(){return T(this,S,"f")}get publicKey(){return T(this,z,"f").slice()}get chains(){return T(this,E,"f").slice()}get features(){return T(this,W,"f").slice()}get label(){return T(this,C,"f")}get icon(){return T(this,L,"f")}constructor({address:n,publicKey:t,label:a,icon:s}){S.set(this,void 0),z.set(this,void 0),E.set(this,void 0),W.set(this,void 0),C.set(this,void 0),L.set(this,void 0),g(this,S,n,"f"),g(this,z,t,"f"),g(this,E,Z,"f"),g(this,W,["solana:signAndSendTransaction","solana:signTransaction","solana:signMessage"],"f"),g(this,C,a,"f"),g(this,L,s,"f")}}S=new WeakMap,z=new WeakMap,E=new WeakMap,W=new WeakMap,C=new WeakMap,L=new WeakMap;function k(i){return Z.includes(i)}function _(i){return"version"in i}var e=function(i,n,t,a){if(t==="a"&&!a)throw new TypeError("Private accessor was defined without a getter");if(typeof n=="function"?i!==n||!a:!n.has(i))throw new TypeError("Cannot read private member from an object whose class did not declare it");return t==="m"?a:t==="a"?a.call(i):a?a.value:n.get(i)},A=function(i,n,t,a,s){if(a==="m")throw new TypeError("Private method is not writable");if(a==="a"&&!s)throw new TypeError("Private accessor was defined without a setter");if(typeof n=="function"?i!==n||!s:!n.has(i))throw new TypeError("Cannot write private member to an object whose class did not declare it");return a==="a"?s.call(i,t):s?s.value=t:n.set(i,t),t},j,f,b,d,m,P,M,q,K,V,N,I,v,F,H,U,R,O;function rt(i){return{"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp":"solana:mainnet","solana:4sGjMW1sUnHzSxGspuhpqLDx6wiyjNtZ":"solana:mainnet","solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z":"solana:testnet","solana:8E9rvCKLFQia2Y35HXjjpWzj8weVo44K":"solana:devnet","solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1":"solana:devnet"}[i]}class J{static register(n){const t=new J(n);B(t)}get version(){return e(this,b,"f")}get name(){return e(this,m,"f")}get icon(){return e(this,P,"f")}get chains(){return Z.slice()}get features(){return{"standard:connect":{version:"1.0.0",connect:e(this,F,"f")},"standard:disconnect":{version:"1.0.0",disconnect:e(this,H,"f")},"standard:events":{version:"1.0.0",on:e(this,q,"f")},"solana:signAndSendTransaction":{version:"1.0.0",supportedTransactionVersions:["legacy",0],signAndSendTransaction:e(this,U,"f")},"solana:signTransaction":{version:"1.0.0",supportedTransactionVersions:["legacy",0],signTransaction:e(this,R,"f")},"solana:signMessage":{version:"1.0.0",signMessage:e(this,O,"f")}}}get accounts(){var a,s,o;const n=(s=(a=e(this,d,"f").session)==null?void 0:a.namespaces)==null?void 0:s.solana,t=(o=n==null?void 0:n.chains)==null?void 0:o.map(r=>rt(r));return(n==null?void 0:n.accounts.map(r=>{const{address:h}=X.parseCaipAddress(r),l=new G(p.decode(h));return{address:h,publicKey:l.toBytes(),chains:t,features:["solana:signAndSendTransaction","solana:signTransaction","solana:signMessage"]}}))||[]}constructor(n){j.add(this),f.set(this,{}),b.set(this,"1.0.0"),d.set(this,void 0),m.set(this,"WalletConnect"),P.set(this,"data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjE4NSIgdmlld0JveD0iMCAwIDMwMCAxODUiIHdpZHRoPSIzMDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0ibTYxLjQzODU0MjkgMzYuMjU2MjYxMmM0OC45MTEyMjQxLTQ3Ljg4ODE2NjMgMTI4LjIxMTk4NzEtNDcuODg4MTY2MyAxNzcuMTIzMjA5MSAwbDUuODg2NTQ1IDUuNzYzNDE3NGMyLjQ0NTU2MSAyLjM5NDQwODEgMi40NDU1NjEgNi4yNzY1MTEyIDAgOC42NzA5MjA0bC0yMC4xMzY2OTUgMTkuNzE1NTAzYy0xLjIyMjc4MSAxLjE5NzIwNTEtMy4yMDUzIDEuMTk3MjA1MS00LjQyODA4MSAwbC04LjEwMDU4NC03LjkzMTE0NzljLTM0LjEyMTY5Mi0zMy40MDc5ODE3LTg5LjQ0Mzg4Ni0zMy40MDc5ODE3LTEyMy41NjU1Nzg4IDBsLTguNjc1MDU2MiA4LjQ5MzYwNTFjLTEuMjIyNzgxNiAxLjE5NzIwNDEtMy4yMDUzMDEgMS4xOTcyMDQxLTQuNDI4MDgwNiAwbC0yMC4xMzY2OTQ5LTE5LjcxNTUwMzFjLTIuNDQ1NTYxMi0yLjM5NDQwOTItMi40NDU1NjEyLTYuMjc2NTEyMiAwLTguNjcwOTIwNHptMjE4Ljc2Nzc5NjEgNDAuNzczNzQ0OSAxNy45MjE2OTcgMTcuNTQ2ODk3YzIuNDQ1NTQ5IDIuMzk0Mzk2OSAyLjQ0NTU2MyA2LjI3NjQ3NjkuMDAwMDMxIDguNjcwODg5OWwtODAuODEwMTcxIDc5LjEyMTEzNGMtMi40NDU1NDQgMi4zOTQ0MjYtNi40MTA1ODIgMi4zOTQ0NTMtOC44NTYxNi4wMDAwNjItLjAwMDAxLS4wMDAwMS0uMDAwMDIyLS4wMDAwMjItLjAwMDAzMi0uMDAwMDMybC01Ny4zNTQxNDMtNTYuMTU0NTcyYy0uNjExMzktLjU5ODYwMi0xLjYwMjY1LS41OTg2MDItMi4yMTQwNCAwLS4wMDAwMDQuMDAwMDA0LS4wMDAwMDcuMDAwMDA4LS4wMDAwMTEuMDAwMDExbC01Ny4zNTI5MjEyIDU2LjE1NDUzMWMtMi40NDU1MzY4IDIuMzk0NDMyLTYuNDEwNTc1NSAyLjM5NDQ3Mi04Ljg1NjE2MTIuMDAwMDg3LS4wMDAwMTQzLS4wMDAwMTQtLjAwMDAyOTYtLjAwMDAyOC0uMDAwMDQ0OS0uMDAwMDQ0bC04MC44MTI0MTk0My03OS4xMjIxODVjLTIuNDQ1NTYwMjEtMi4zOTQ0MDgtMi40NDU1NjAyMS02LjI3NjUxMTUgMC04LjY3MDkxOTdsMTcuOTIxNzI5NjMtMTcuNTQ2ODY3M2MyLjQ0NTU2MDItMi4zOTQ0MDgyIDYuNDEwNTk4OS0yLjM5NDQwODIgOC44NTYxNjAyIDBsNTcuMzU0OTc3NSA1Ni4xNTUzNTdjLjYxMTM5MDguNTk4NjAyIDEuNjAyNjQ5LjU5ODYwMiAyLjIxNDAzOTggMCAuMDAwMDA5Mi0uMDAwMDA5LjAwMDAxNzQtLjAwMDAxNy4wMDAwMjY1LS4wMDAwMjRsNTcuMzUyMTAzMS01Ni4xNTUzMzNjMi40NDU1MDUtMi4zOTQ0NjMzIDYuNDEwNTQ0LTIuMzk0NTUzMSA4Ljg1NjE2MS0uMDAwMi4wMDAwMzQuMDAwMDMzNi4wMDAwNjguMDAwMDY3My4wMDAxMDEuMDAwMTAxbDU3LjM1NDkwMiA1Ni4xNTU0MzJjLjYxMTM5LjU5ODYwMSAxLjYwMjY1LjU5ODYwMSAyLjIxNDA0IDBsNTcuMzUzOTc1LTU2LjE1NDMyNDljMi40NDU1NjEtMi4zOTQ0MDkyIDYuNDEwNTk5LTIuMzk0NDA5MiA4Ljg1NjE2IDB6IiBmaWxsPSIjM2I5OWZjIi8+PC9zdmc+"),M.set(this,null),q.set(this,(t,a)=>(e(this,f,"f")[t]||(e(this,f,"f")[t]=[]),e(this,f,"f")[t].push(a),()=>e(this,j,"m",V).call(this,t,a))),N.set(this,()=>{const t=this.accounts[0];(t==null?void 0:t.publicKey)&&(A(this,M,new ot(t),"f"),e(this,j,"m",K).call(this,"change",{accounts:this.accounts}))}),I.set(this,()=>{e(this,M,"f")&&(A(this,M,null,"f"),e(this,j,"m",K).call(this,"change",{accounts:this.accounts}))}),v.set(this,()=>{var t,a,s;(s=(a=(t=e(this,d,"f").session)==null?void 0:t.namespaces)==null?void 0:a.solana)!=null&&s.accounts.length?e(this,N,"f").call(this):e(this,I,"f").call(this)}),F.set(this,async()=>(e(this,M,"f")||(tt.push("ConnectingWalletConnect"),await e(this,d,"f").connect({namespaces:it([at.DEFAULT_CHAIN])})),e(this,N,"f").call(this),{accounts:this.accounts})),H.set(this,async()=>{await e(this,d,"f").disconnect()}),U.set(this,async(...t)=>{var s;if(!e(this,M,"f"))throw new Error("not connected");const a=[];if(t.length===1){const{transaction:o,account:r,chain:h,options:l}=t[0]||{},{minContextSlot:c,preflightCommitment:w,skipPreflight:D,maxRetries:u}=l||{};if((r==null?void 0:r.address)!==((s=e(this,M,"f"))==null?void 0:s.address))throw new Error("invalid account");if(!k(h||":"))throw new Error("invalid chain");if(!o)throw new Error("invalid transaction");const $=await e(this,d,"f").request({method:"solana_signAndSendTransaction",params:{transaction:o,pubkey:e(this,M,"f").address,sendOptions:{preflightCommitment:w,minContextSlot:c,maxRetries:u,skipPreflight:D}}});a.push({signature:p.decode($.signature)})}else if(t.length>1){const o=await Promise.all(t.map(r=>e(this,U,"f").call(this,r)));for(const r of o)a.push(...r)}return a}),R.set(this,async(...t)=>{var s;if(!e(this,M,"f"))throw new Error("not connected");const a=[];if(t.length===1){const{transaction:o,account:r,chain:h}=t[0]||{};if((r==null?void 0:r.address)!==e(this,M,"f").address)throw new Error("invalid account");if(h&&!k(h))throw new Error("invalid chain");if(!o)throw new Error("invalid transaction");const l=x.from(o);let c;const w=await e(this,d,"f").request({method:"solana_signTransaction",params:{transaction:o,pubkey:e(this,M,"f").address}});if("signature"in w){const u=p.decode(w.signature);l.addSignature(new G(e(this,M,"f").publicKey),Y.from(u)),c=l}else{const u=Y.from(w.transaction,"base64");_(l)&&(c=Q.deserialize(new Uint8Array(u))),c=x.from(u)}if(!c)throw new Error("invalid transaction");const D=_(c)?c.serialize():new Uint8Array(c.serialize({requireAllSignatures:!1,verifySignatures:!1}));a.push({signedTransaction:D})}else if(t.length>1){let o;for(const c of t){if(((s=c.account)==null?void 0:s.address)!==e(this,M,"f").address)throw new Error("invalid account");if(c.chain){if(!k(c.chain))throw new Error("invalid chain");if(o&&c.chain!==o)throw new Error("conflicting chain");o=c.chain}}const r=t.map(({transaction:c})=>Q.deserialize(c)),l=(await e(this,d,"f").request({method:"solana_signAllTransactions",params:{transactions:r}})).transactions.map((c,w)=>{const D=r[w];if(!D)throw new Error("Invalid transactions response");const u=Y.from(c,"base64");return _(D)?Q.deserialize(new Uint8Array(u)):x.from(u)});a.push(...l.map(c=>({signedTransaction:_(c)?c.serialize():new Uint8Array(c.serialize({requireAllSignatures:!1,verifySignatures:!1}))})))}return a}),O.set(this,async(...t)=>{if(!e(this,M,"f"))throw new Error("not connected");const a=[];if(t.length===1){const{message:s,account:o}=t[0]||{};if((o==null?void 0:o.address)!==e(this,M,"f").address)throw new Error("invalid account");if(!s)throw new Error("invalid message");const r=await e(this,d,"f").request({method:"solana_signMessage",params:{message:s,pubkey:e(this,M,"f").address}});a.push({signedMessage:s,signature:p.decode(r.signature)})}else if(t.length>1){const s=await Promise.all(t.map(o=>e(this,O,"f").call(this,o)));for(const o of s)a.push(...o)}return a}),A(this,d,n,"f"),this.setProvider(n),B(this)}setProvider(n){A(this,d,n,"f"),A(this,m,"WalletConnect","f"),n.on("connect",()=>e(this,N,"f").call(this)),n.on("disconnect",()=>e(this,I,"f").call(this)),n.on("accountsChanged",()=>e(this,v,"f").call(this)),n.on("chainChanged",()=>e(this,v,"f").call(this)),e(this,N,"f").call(this)}}f=new WeakMap,b=new WeakMap,d=new WeakMap,m=new WeakMap,P=new WeakMap,M=new WeakMap,q=new WeakMap,N=new WeakMap,I=new WeakMap,v=new WeakMap,F=new WeakMap,H=new WeakMap,U=new WeakMap,R=new WeakMap,O=new WeakMap,j=new WeakSet,K=function(n,...t){var a;(a=e(this,f,"f")[n])==null||a.forEach(s=>s.apply(null,t))},V=function(n,t){var a;e(this,f,"f")[n]=(a=e(this,f,"f")[n])==null?void 0:a.filter(s=>t!==s)};export{J as SolanaWalletConnectStandardWallet};
package/dist/favicon.png DELETED
Binary file
package/dist/favicon.svg DELETED
@@ -1,11 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <svg width="31px" height="34px" viewBox="0 0 31 34" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3
- <title>favicon</title>
4
- <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
5
- <g id="favicon" transform="translate(0.000000, 1.000000)" fill="#3761F9" fill-rule="nonzero" stroke="#3761F9">
6
- <g transform="translate(1.000000, 0.000000)" id="Shape">
7
- <path d="M29.2298507,0.044198895 L19.0965415,4.06629834 L9.66969383,4.06629834 L0,0 L2.18561573,13.281768 L0.0883077062,20.4640884 L5.58546242,23.7569061 C8.19053975,25.3038674 10.508617,27.2707182 12.5176174,29.5469613 L14.6590792,32 L16.9109257,29.4143646 C18.8316183,27.2044199 21.0834649,25.3038674 23.5781576,23.7790055 L28.9649276,20.4640884 L27.0221581,13.281768 L29.2298507,0.044198895 Z M22.540542,22.4530387 C20.7081571,23.5801105 19.0082338,24.9281768 17.4628489,26.4088398 L15.5863101,24.3756906 L22.540542,22.4530387 Z M13.6435406,24.3535912 L11.8111557,26.3867403 C10.2657708,24.9060773 8.54377057,23.6022099 6.71138567,22.4751381 L13.6435406,24.3535912 Z M11.8332326,22.1436464 L2.09730802,19.4917127 L3.42192361,14.9392265 L11.8332326,22.1436464 Z M8.16846282,5.25966851 L3.55438517,11.2928177 L2.14146187,2.71823204 L8.16846282,5.25966851 Z M23.9534653,14.1657459 L14.6149254,22.320442 L5.09977003,14.1657459 L23.9534653,14.1657459 Z M4.74653921,12.4861878 L9.91254002,5.72375691 L18.8757722,5.72375691 L24.6157731,12.4861878 L4.74653921,12.4861878 Z M25.7196194,14.8287293 L26.9780042,19.4917127 L17.3524643,22.1436464 L25.7196194,14.8287293 Z M27.0883889,2.67403315 L25.6754656,11.1823204 L20.6419263,5.25966851 L27.0883889,2.67403315 Z"></path>
8
- </g>
9
- </g>
10
- </g>
11
- </svg>
Binary file
Binary file
package/dist/index.html DELETED
@@ -1,33 +0,0 @@
1
- <!doctype html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8" />
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
- <link rel="apple-touch-icon" sizes="192x192" href="/icon-192x192.png" />
7
- <link rel="apple-touch-icon" sizes="512x512" href="/icon-512x512.png" />
8
- <link rel="icon" type="image/png" href="/favicon.png" />
9
- <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
10
- <title>ShapeShift Widget</title>
11
- <style>
12
- * {
13
- box-sizing: border-box;
14
- }
15
- html,
16
- body {
17
- margin: 0;
18
- padding: 0;
19
- width: 100%;
20
- min-height: 100vh;
21
- }
22
- #root {
23
- width: 100%;
24
- min-height: 100vh;
25
- }
26
- </style>
27
- <script type="module" crossorigin src="/assets/index-5jd8RPN9.js"></script>
28
- <link rel="stylesheet" crossorigin href="/assets/index-cV3UdaMs.css">
29
- </head>
30
- <body>
31
- <div id="root"></div>
32
- </body>
33
- </html>
package/index.html DELETED
@@ -1,32 +0,0 @@
1
- <!doctype html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8" />
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
- <link rel="apple-touch-icon" sizes="192x192" href="/icon-192x192.png" />
7
- <link rel="apple-touch-icon" sizes="512x512" href="/icon-512x512.png" />
8
- <link rel="icon" type="image/png" href="/favicon.png" />
9
- <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
10
- <title>ShapeShift Widget</title>
11
- <style>
12
- * {
13
- box-sizing: border-box;
14
- }
15
- html,
16
- body {
17
- margin: 0;
18
- padding: 0;
19
- width: 100%;
20
- min-height: 100vh;
21
- }
22
- #root {
23
- width: 100%;
24
- min-height: 100vh;
25
- }
26
- </style>
27
- </head>
28
- <body>
29
- <div id="root"></div>
30
- <script type="module" src="/src/demo/main.tsx"></script>
31
- </body>
32
- </html>
Binary file
@@ -1,11 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <svg width="31px" height="34px" viewBox="0 0 31 34" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3
- <title>favicon</title>
4
- <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
5
- <g id="favicon" transform="translate(0.000000, 1.000000)" fill="#3761F9" fill-rule="nonzero" stroke="#3761F9">
6
- <g transform="translate(1.000000, 0.000000)" id="Shape">
7
- <path d="M29.2298507,0.044198895 L19.0965415,4.06629834 L9.66969383,4.06629834 L0,0 L2.18561573,13.281768 L0.0883077062,20.4640884 L5.58546242,23.7569061 C8.19053975,25.3038674 10.508617,27.2707182 12.5176174,29.5469613 L14.6590792,32 L16.9109257,29.4143646 C18.8316183,27.2044199 21.0834649,25.3038674 23.5781576,23.7790055 L28.9649276,20.4640884 L27.0221581,13.281768 L29.2298507,0.044198895 Z M22.540542,22.4530387 C20.7081571,23.5801105 19.0082338,24.9281768 17.4628489,26.4088398 L15.5863101,24.3756906 L22.540542,22.4530387 Z M13.6435406,24.3535912 L11.8111557,26.3867403 C10.2657708,24.9060773 8.54377057,23.6022099 6.71138567,22.4751381 L13.6435406,24.3535912 Z M11.8332326,22.1436464 L2.09730802,19.4917127 L3.42192361,14.9392265 L11.8332326,22.1436464 Z M8.16846282,5.25966851 L3.55438517,11.2928177 L2.14146187,2.71823204 L8.16846282,5.25966851 Z M23.9534653,14.1657459 L14.6149254,22.320442 L5.09977003,14.1657459 L23.9534653,14.1657459 Z M4.74653921,12.4861878 L9.91254002,5.72375691 L18.8757722,5.72375691 L24.6157731,12.4861878 L4.74653921,12.4861878 Z M25.7196194,14.8287293 L26.9780042,19.4917127 L17.3524643,22.1436464 L25.7196194,14.8287293 Z M27.0883889,2.67403315 L25.6754656,11.1823204 L20.6419263,5.25966851 L27.0883889,2.67403315 Z"></path>
8
- </g>
9
- </g>
10
- </g>
11
- </svg>
Binary file
Binary file
package/railway.toml DELETED
@@ -1,10 +0,0 @@
1
- [build]
2
- builder = "dockerfile"
3
- dockerfilePath = "packages/swap-widget/Dockerfile"
4
- watchPatterns = [
5
- "packages/swap-widget/**"
6
- ]
7
-
8
- [deploy]
9
- restartPolicyType = "on_failure"
10
- restartPolicyMaxRetries = 10
package/src/api/client.ts DELETED
@@ -1,95 +0,0 @@
1
- import type { AssetId, AssetsResponse, QuoteResponse, RatesResponse } from '../types'
2
-
3
- const DEFAULT_API_BASE_URL =
4
- import.meta.env.VITE_SWAP_WIDGET_API_URL ?? 'https://api.shapeshift.com'
5
-
6
- export type ApiClientConfig = {
7
- baseUrl?: string
8
- affiliateAddress?: string
9
- }
10
-
11
- export const createApiClient = (config: ApiClientConfig = {}) => {
12
- const baseUrl = config.baseUrl ?? DEFAULT_API_BASE_URL
13
-
14
- const fetchWithConfig = async <T>(
15
- endpoint: string,
16
- params?: Record<string, string>,
17
- method: 'GET' | 'POST' = 'GET',
18
- timeoutMs = 30000,
19
- ): Promise<T> => {
20
- const url = new URL(`${baseUrl}${endpoint}`)
21
- const headers: Record<string, string> = {
22
- 'Content-Type': 'application/json',
23
- }
24
- if (config.affiliateAddress) {
25
- headers['x-affiliate-address'] = config.affiliateAddress
26
- }
27
-
28
- const controller = new AbortController()
29
- const timeoutId = setTimeout(() => controller.abort(), timeoutMs)
30
-
31
- const fetchOptions: RequestInit = {
32
- headers,
33
- method,
34
- signal: controller.signal,
35
- }
36
-
37
- if (method === 'GET' && params) {
38
- Object.entries(params).forEach(([key, value]) => {
39
- url.searchParams.append(key, value)
40
- })
41
- } else if (method === 'POST' && params) {
42
- fetchOptions.body = JSON.stringify(params)
43
- }
44
-
45
- const response = await fetch(url.toString(), fetchOptions).finally(() => {
46
- clearTimeout(timeoutId)
47
- })
48
- if (!response.ok) {
49
- throw new Error(`API error: ${response.status} ${response.statusText}`)
50
- }
51
- return response.json() as Promise<T>
52
- }
53
-
54
- return {
55
- getAssets: () => fetchWithConfig<AssetsResponse>('/v1/assets'),
56
-
57
- getRates: (params: {
58
- sellAssetId: AssetId
59
- buyAssetId: AssetId
60
- sellAmountCryptoBaseUnit: string
61
- }) =>
62
- fetchWithConfig<RatesResponse>('/v1/swap/rates', {
63
- sellAssetId: params.sellAssetId,
64
- buyAssetId: params.buyAssetId,
65
- sellAmountCryptoBaseUnit: params.sellAmountCryptoBaseUnit,
66
- }),
67
-
68
- getQuote: (params: {
69
- sellAssetId: AssetId
70
- buyAssetId: AssetId
71
- sellAmountCryptoBaseUnit: string
72
- sendAddress: string
73
- receiveAddress: string
74
- swapperName: string
75
- slippageTolerancePercentageDecimal?: string
76
- }) =>
77
- fetchWithConfig<QuoteResponse>(
78
- '/v1/swap/quote',
79
- {
80
- sellAssetId: params.sellAssetId,
81
- buyAssetId: params.buyAssetId,
82
- sellAmountCryptoBaseUnit: params.sellAmountCryptoBaseUnit,
83
- sendAddress: params.sendAddress,
84
- receiveAddress: params.receiveAddress,
85
- swapperName: params.swapperName,
86
- ...(params.slippageTolerancePercentageDecimal && {
87
- slippageTolerancePercentageDecimal: params.slippageTolerancePercentageDecimal,
88
- }),
89
- },
90
- 'POST',
91
- ),
92
- }
93
- }
94
-
95
- export type ApiClient = ReturnType<typeof createApiClient>
@@ -1,173 +0,0 @@
1
- .ssw-address-modal {
2
- background: var(--ssw-bg-secondary);
3
- border-radius: var(--ssw-radius-lg);
4
- width: 90%;
5
- max-width: 420px;
6
- max-height: 90vh;
7
- overflow: hidden;
8
- display: flex;
9
- flex-direction: column;
10
- animation: ssw-address-slide-up 0.2s ease;
11
- }
12
-
13
- @keyframes ssw-address-slide-up {
14
- from {
15
- opacity: 0;
16
- transform: translateY(10px);
17
- }
18
- to {
19
- opacity: 1;
20
- transform: translateY(0);
21
- }
22
- }
23
-
24
- .ssw-address-content {
25
- padding: 16px;
26
- display: flex;
27
- flex-direction: column;
28
- gap: 12px;
29
- }
30
-
31
- .ssw-address-label {
32
- font-size: 14px;
33
- color: var(--ssw-text-secondary);
34
- }
35
-
36
- .ssw-address-input-wrapper {
37
- display: flex;
38
- align-items: center;
39
- gap: 8px;
40
- background: var(--ssw-bg-tertiary);
41
- border: 1px solid var(--ssw-border);
42
- border-radius: var(--ssw-radius-sm);
43
- padding: 12px 16px;
44
- transition: border-color 0.15s ease;
45
- }
46
-
47
- .ssw-address-input-wrapper:focus-within {
48
- border-color: var(--ssw-accent);
49
- }
50
-
51
- .ssw-address-input-wrapper.ssw-invalid {
52
- border-color: var(--ssw-error);
53
- }
54
-
55
- .ssw-address-input {
56
- flex: 1;
57
- background: none;
58
- border: none;
59
- outline: none;
60
- color: var(--ssw-text-primary);
61
- font-size: 14px;
62
- font-family: monospace;
63
- }
64
-
65
- .ssw-address-input::placeholder {
66
- color: var(--ssw-text-muted);
67
- }
68
-
69
- .ssw-address-clear-btn {
70
- display: flex;
71
- align-items: center;
72
- justify-content: center;
73
- padding: 4px;
74
- border: none;
75
- background: none;
76
- color: var(--ssw-text-muted);
77
- cursor: pointer;
78
- border-radius: var(--ssw-radius-2xs);
79
- transition: all 0.15s ease;
80
- }
81
-
82
- .ssw-address-clear-btn:hover {
83
- color: var(--ssw-text-primary);
84
- background: var(--ssw-bg-hover);
85
- }
86
-
87
- .ssw-address-error {
88
- display: flex;
89
- align-items: center;
90
- gap: 6px;
91
- font-size: 13px;
92
- color: var(--ssw-error);
93
- }
94
-
95
- .ssw-use-wallet-btn {
96
- display: flex;
97
- align-items: center;
98
- justify-content: center;
99
- gap: 8px;
100
- padding: 10px 16px;
101
- background: var(--ssw-bg-tertiary);
102
- border: 1px solid var(--ssw-border);
103
- border-radius: var(--ssw-radius-sm);
104
- color: var(--ssw-text-secondary);
105
- font-size: 14px;
106
- cursor: pointer;
107
- transition: all 0.15s ease;
108
- }
109
-
110
- .ssw-use-wallet-btn:hover {
111
- background: var(--ssw-bg-hover);
112
- color: var(--ssw-text-primary);
113
- }
114
-
115
- .ssw-address-actions {
116
- display: flex;
117
- gap: 12px;
118
- margin-top: 8px;
119
- }
120
-
121
- .ssw-address-btn {
122
- flex: 1;
123
- padding: 14px 16px;
124
- border-radius: var(--ssw-radius-sm);
125
- font-size: 14px;
126
- font-weight: 600;
127
- cursor: pointer;
128
- transition: all 0.15s ease;
129
- }
130
-
131
- .ssw-address-btn-secondary {
132
- background: var(--ssw-bg-tertiary);
133
- border: 1px solid var(--ssw-border);
134
- color: var(--ssw-text-secondary);
135
- }
136
-
137
- .ssw-address-btn-secondary:hover {
138
- background: var(--ssw-bg-hover);
139
- color: var(--ssw-text-primary);
140
- }
141
-
142
- .ssw-address-btn-primary {
143
- background: var(--ssw-accent);
144
- border: none;
145
- color: white;
146
- }
147
-
148
- .ssw-address-btn-primary:hover:not(:disabled) {
149
- filter: brightness(1.1);
150
- }
151
-
152
- .ssw-address-btn-primary:disabled {
153
- background: var(--ssw-bg-tertiary);
154
- color: var(--ssw-text-muted);
155
- cursor: not-allowed;
156
- }
157
-
158
- .ssw-btn-outline .ssw-address-btn-primary {
159
- background: transparent;
160
- border: 1px solid var(--ssw-accent);
161
- color: var(--ssw-accent);
162
- }
163
-
164
- .ssw-btn-outline .ssw-address-btn-primary:hover:not(:disabled) {
165
- background: var(--ssw-accent-light);
166
- filter: none;
167
- }
168
-
169
- .ssw-btn-outline .ssw-address-btn-primary:disabled {
170
- background: transparent;
171
- border-color: var(--ssw-border);
172
- color: var(--ssw-text-muted);
173
- }
@@ -1,250 +0,0 @@
1
- import './AddressInputModal.css'
2
-
3
- import { useCallback, useEffect, useMemo, useRef, useState } from 'react'
4
-
5
- import type { ChainId } from '../types'
6
- import { getAddressFormatHint, validateAddress } from '../utils/addressValidation'
7
-
8
- const useLockBodyScroll = (isLocked: boolean) => {
9
- useEffect(() => {
10
- if (!isLocked) return
11
- const originalOverflow = document.body.style.overflow
12
- document.body.style.overflow = 'hidden'
13
- return () => {
14
- document.body.style.overflow = originalOverflow
15
- }
16
- }, [isLocked])
17
- }
18
-
19
- type AddressInputModalProps = {
20
- isOpen: boolean
21
- onClose: () => void
22
- chainId: ChainId
23
- chainName: string
24
- currentAddress: string
25
- onAddressChange: (address: string) => void
26
- walletAddress?: string
27
- }
28
-
29
- export const AddressInputModal = ({
30
- isOpen,
31
- onClose,
32
- chainId,
33
- chainName,
34
- currentAddress,
35
- onAddressChange,
36
- walletAddress,
37
- }: AddressInputModalProps) => {
38
- useLockBodyScroll(isOpen)
39
- const [inputValue, setInputValue] = useState(currentAddress)
40
- const [hasInteracted, setHasInteracted] = useState(false)
41
- const backdropRef = useRef<HTMLDivElement>(null)
42
-
43
- useEffect(() => {
44
- if (isOpen) {
45
- setInputValue(currentAddress)
46
- setHasInteracted(false)
47
- backdropRef.current?.focus()
48
- }
49
- }, [isOpen, currentAddress])
50
-
51
- useEffect(() => {
52
- if (!isOpen) return
53
- const handleKeyDown = (e: KeyboardEvent) => {
54
- if (e.key === 'Escape') onClose()
55
- }
56
- document.addEventListener('keydown', handleKeyDown)
57
- return () => document.removeEventListener('keydown', handleKeyDown)
58
- }, [isOpen, onClose])
59
-
60
- const validation = useMemo(() => {
61
- if (!inputValue || !hasInteracted) {
62
- return { valid: true, error: undefined }
63
- }
64
- return validateAddress(inputValue, chainId)
65
- }, [inputValue, chainId, hasInteracted])
66
-
67
- const formatHint = useMemo(() => getAddressFormatHint(chainId), [chainId])
68
-
69
- const handleInputChange = useCallback((value: string) => {
70
- setInputValue(value)
71
- setHasInteracted(true)
72
- }, [])
73
-
74
- const handleUseWalletAddress = useCallback(() => {
75
- if (walletAddress) {
76
- setInputValue(walletAddress)
77
- setHasInteracted(true)
78
- }
79
- }, [walletAddress])
80
-
81
- const handleConfirm = useCallback(() => {
82
- const result = validateAddress(inputValue, chainId)
83
- if (result.valid) {
84
- onAddressChange(inputValue)
85
- onClose()
86
- }
87
- }, [inputValue, chainId, onAddressChange, onClose])
88
-
89
- const handleClear = useCallback(() => {
90
- setInputValue('')
91
- setHasInteracted(false)
92
- onAddressChange('')
93
- onClose()
94
- }, [onAddressChange, onClose])
95
-
96
- const handleBackdropClick = useCallback(
97
- (e: React.MouseEvent) => {
98
- if (e.target === e.currentTarget) {
99
- onClose()
100
- }
101
- },
102
- [onClose],
103
- )
104
-
105
- const handleBackdropKeyDown = useCallback(
106
- (e: React.KeyboardEvent) => {
107
- if (e.key === 'Escape') {
108
- onClose()
109
- }
110
- },
111
- [onClose],
112
- )
113
-
114
- const isConfirmDisabled = useMemo(() => {
115
- if (!inputValue) return true
116
- return !validateAddress(inputValue, chainId).valid
117
- }, [inputValue, chainId])
118
-
119
- if (!isOpen) return null
120
-
121
- return (
122
- // eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions
123
- <div
124
- ref={backdropRef}
125
- className='ssw-modal-backdrop'
126
- onClick={handleBackdropClick}
127
- onKeyDown={handleBackdropKeyDown}
128
- role='dialog'
129
- aria-modal='true'
130
- aria-labelledby='address-modal-title'
131
- tabIndex={-1}
132
- >
133
- <div className='ssw-address-modal'>
134
- <div className='ssw-modal-header'>
135
- <h2 id='address-modal-title' className='ssw-modal-title'>
136
- Receive Address
137
- </h2>
138
- <button className='ssw-modal-close' onClick={onClose} type='button'>
139
- <svg
140
- width='20'
141
- height='20'
142
- viewBox='0 0 24 24'
143
- fill='none'
144
- stroke='currentColor'
145
- strokeWidth='2'
146
- >
147
- <path d='M18 6L6 18M6 6l12 12' />
148
- </svg>
149
- </button>
150
- </div>
151
-
152
- <div className='ssw-address-content'>
153
- <div className='ssw-address-label'>
154
- <span>Enter {chainName} address</span>
155
- </div>
156
-
157
- <div
158
- className={`ssw-address-input-wrapper ${
159
- !validation.valid && hasInteracted ? 'ssw-invalid' : ''
160
- }`}
161
- >
162
- <input
163
- type='text'
164
- className='ssw-address-input'
165
- placeholder={formatHint}
166
- value={inputValue}
167
- onChange={e => handleInputChange(e.target.value)}
168
- autoFocus
169
- spellCheck={false}
170
- autoComplete='off'
171
- />
172
- {inputValue && (
173
- <button
174
- className='ssw-address-clear-btn'
175
- onClick={() => {
176
- setInputValue('')
177
- setHasInteracted(false)
178
- }}
179
- type='button'
180
- >
181
- <svg
182
- width='16'
183
- height='16'
184
- viewBox='0 0 24 24'
185
- fill='none'
186
- stroke='currentColor'
187
- strokeWidth='2'
188
- >
189
- <path d='M18 6L6 18M6 6l12 12' />
190
- </svg>
191
- </button>
192
- )}
193
- </div>
194
-
195
- {!validation.valid && hasInteracted && validation.error && (
196
- <div className='ssw-address-error'>
197
- <svg
198
- width='14'
199
- height='14'
200
- viewBox='0 0 24 24'
201
- fill='none'
202
- stroke='currentColor'
203
- strokeWidth='2'
204
- >
205
- <circle cx='12' cy='12' r='10' />
206
- <path d='M12 8v4M12 16h.01' />
207
- </svg>
208
- <span>{validation.error}</span>
209
- </div>
210
- )}
211
-
212
- {walletAddress && (
213
- <button className='ssw-use-wallet-btn' onClick={handleUseWalletAddress} type='button'>
214
- <svg
215
- width='16'
216
- height='16'
217
- viewBox='0 0 24 24'
218
- fill='none'
219
- stroke='currentColor'
220
- strokeWidth='2'
221
- >
222
- <path d='M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2a1 1 0 0 0-1-1' />
223
- <path d='M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4' />
224
- </svg>
225
- <span>Use connected wallet</span>
226
- </button>
227
- )}
228
-
229
- <div className='ssw-address-actions'>
230
- <button
231
- className='ssw-address-btn ssw-address-btn-secondary'
232
- onClick={handleClear}
233
- type='button'
234
- >
235
- Reset to Wallet
236
- </button>
237
- <button
238
- className='ssw-address-btn ssw-address-btn-primary'
239
- onClick={handleConfirm}
240
- disabled={isConfirmDisabled}
241
- type='button'
242
- >
243
- Confirm
244
- </button>
245
- </div>
246
- </div>
247
- </div>
248
- </div>
249
- )
250
- }