@shapeshiftoss/swap-widget 0.0.2 → 0.1.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.
- package/dist/index.d.ts +233 -0
- package/dist/index.js +63612 -0
- package/dist/style.css +1 -0
- package/package.json +69 -18
- package/Dockerfile +0 -87
- package/dist/assets/PhArrowCircleDown-B305t-Sh.js +0 -14
- package/dist/assets/PhArrowClockwise-CJPxQhr_.js +0 -14
- package/dist/assets/PhArrowDown-C4hT9BVu.js +0 -14
- package/dist/assets/PhArrowLeft-Way4Cu-r.js +0 -14
- package/dist/assets/PhArrowRight-Cp5ZME0F.js +0 -14
- package/dist/assets/PhArrowSquareOut-NnrK69c5.js +0 -14
- package/dist/assets/PhArrowUp-Dph6j8rm.js +0 -14
- package/dist/assets/PhArrowUpRight-BpJjRRRh.js +0 -14
- package/dist/assets/PhArrowsClockwise-CFUT8X7R.js +0 -14
- package/dist/assets/PhArrowsDownUp-BjBI4ckC.js +0 -14
- package/dist/assets/PhArrowsLeftRight-CuLpbKRk.js +0 -14
- package/dist/assets/PhBank-Dchr4XQJ.js +0 -14
- package/dist/assets/PhBrowser-dUu2TrC1.js +0 -14
- package/dist/assets/PhCaretDown-78IuKU3V.js +0 -14
- package/dist/assets/PhCaretLeft-_aiyH7n1.js +0 -14
- package/dist/assets/PhCaretRight-8zJQEuDX.js +0 -14
- package/dist/assets/PhCaretUp-CiCxKWwN.js +0 -14
- package/dist/assets/PhCheck-CcADx8br.js +0 -14
- package/dist/assets/PhCircleHalf-BYzSzd2h.js +0 -14
- package/dist/assets/PhClock-UItiXeJq.js +0 -14
- package/dist/assets/PhCompass-CUy3uA7t.js +0 -14
- package/dist/assets/PhCopy-C-PDgSlZ.js +0 -14
- package/dist/assets/PhCreditCard-CWRaUT6F.js +0 -14
- package/dist/assets/PhCurrencyDollar-Cqla3AXT.js +0 -14
- package/dist/assets/PhDesktop-BBIPrYLl.js +0 -14
- package/dist/assets/PhDeviceMobile-BdsPaATg.js +0 -14
- package/dist/assets/PhDotsThree-BMXCQl-0.js +0 -14
- package/dist/assets/PhEnvelope-yUsis6yU.js +0 -14
- package/dist/assets/PhFunnelSimple-Ba7BbWTp.js +0 -14
- package/dist/assets/PhGlobe-DgLxBk5U.js +0 -14
- package/dist/assets/PhIdentificationCard-Czjmq9Z3.js +0 -14
- package/dist/assets/PhImage-BAJ_erz6.js +0 -14
- package/dist/assets/PhInfo-Cr4DhVUE.js +0 -14
- package/dist/assets/PhLightbulb-BX_7duTr.js +0 -14
- package/dist/assets/PhMagnifyingGlass-Mygfryvz.js +0 -14
- package/dist/assets/PhPaperPlaneRight-BeuCA660.js +0 -14
- package/dist/assets/PhPlus-BMjcHjsT.js +0 -14
- package/dist/assets/PhPower-CGffGmdb.js +0 -14
- package/dist/assets/PhPuzzlePiece-wm_GpVSi.js +0 -14
- package/dist/assets/PhQrCode-DRwRzXCH.js +0 -14
- package/dist/assets/PhQuestion-M09j2U0T.js +0 -14
- package/dist/assets/PhQuestionMark-BP9EMB6h.js +0 -14
- package/dist/assets/PhSealCheck-BfG80yKn.js +0 -14
- package/dist/assets/PhSignOut-C5YOWlPT.js +0 -14
- package/dist/assets/PhSpinner-BXooDYzU.js +0 -14
- package/dist/assets/PhTrash-Biq6rmmL.js +0 -14
- package/dist/assets/PhUser-CAgZSpGe.js +0 -14
- package/dist/assets/PhVault-l2PHF38a.js +0 -14
- package/dist/assets/PhWallet-w25D16It.js +0 -14
- package/dist/assets/PhWarning-DPEydIPw.js +0 -14
- package/dist/assets/PhWarningCircle-BqjT745H.js +0 -14
- package/dist/assets/PhX-s-SmVExa.js +0 -14
- package/dist/assets/SwapController-If0bFrNc.js +0 -1
- package/dist/assets/ccip-BBB7uCdL.js +0 -1
- package/dist/assets/ccip-CkkdfKKI.js +0 -1
- package/dist/assets/data-capture-D4gAy-Yc.js +0 -242
- package/dist/assets/email-B1AJehis.js +0 -90
- package/dist/assets/embedded-wallet-Q6DQopDk.js +0 -410
- package/dist/assets/features-B6JAPAFb.js +0 -5
- package/dist/assets/index-5jd8RPN9.js +0 -7428
- package/dist/assets/index-B4kNtSTk.js +0 -1080
- package/dist/assets/index-B753eAob.js +0 -1
- package/dist/assets/index-BZoLTv77.js +0 -3
- package/dist/assets/index-Bcw9UURX.js +0 -3
- package/dist/assets/index-BkrV-ahK.js +0 -2
- package/dist/assets/index-CRQzQ_up.js +0 -9
- package/dist/assets/index-CSW0Gt5y.js +0 -132
- package/dist/assets/index-CZ4jTIsk.js +0 -138
- package/dist/assets/index-Cwa8SB3h.js +0 -61
- package/dist/assets/index-DEwQgT4r.js +0 -78
- package/dist/assets/index-DVfQiQ1d.js +0 -1
- package/dist/assets/index-cV3UdaMs.css +0 -1
- package/dist/assets/index-hAmu622O.js +0 -43
- package/dist/assets/onramp-XcPNCLRU.js +0 -422
- package/dist/assets/pay-with-exchange-BeHt4OF4.js +0 -280
- package/dist/assets/property-C9JG5tag.js +0 -27
- package/dist/assets/receive-7ff4he2S.js +0 -131
- package/dist/assets/send-CkMBIRXT.js +0 -554
- package/dist/assets/socials-DmmxuLrP.js +0 -250
- package/dist/assets/swaps-IHAYRQ0x.js +0 -1050
- package/dist/assets/transactions-9Cxdk7o9.js +0 -16
- package/dist/assets/v4-BOvFkHkt.js +0 -1
- package/dist/assets/w3m-modal-kJzFnBfB.js +0 -891
- package/dist/assets/wallet-standard-Dv8LMoUB.js +0 -1
- package/dist/favicon.png +0 -0
- package/dist/favicon.svg +0 -11
- package/dist/icon-192x192.png +0 -0
- package/dist/icon-512x512.png +0 -0
- package/dist/index.html +0 -33
- package/index.html +0 -32
- package/public/favicon.png +0 -0
- package/public/favicon.svg +0 -11
- package/public/icon-192x192.png +0 -0
- package/public/icon-512x512.png +0 -0
- package/railway.toml +0 -10
- package/src/api/client.ts +0 -95
- package/src/components/AddressInputModal.css +0 -173
- package/src/components/AddressInputModal.tsx +0 -250
- package/src/components/ApprovalStep.tsx +0 -92
- package/src/components/ExecutionStep.tsx +0 -27
- package/src/components/InputStep.tsx +0 -431
- package/src/components/QuoteSelector.css +0 -146
- package/src/components/QuoteSelector.tsx +0 -137
- package/src/components/QuotesModal.css +0 -250
- package/src/components/QuotesModal.tsx +0 -182
- package/src/components/SettingsModal.css +0 -145
- package/src/components/SettingsModal.tsx +0 -180
- package/src/components/StatusStep.tsx +0 -139
- package/src/components/SwapWidget.css +0 -713
- package/src/components/SwapWidget.tsx +0 -607
- package/src/components/TokenSelectModal.css +0 -438
- package/src/components/TokenSelectModal.tsx +0 -487
- package/src/components/WalletProvider.tsx +0 -92
- package/src/config/appkit.ts +0 -104
- package/src/config/wagmi.ts +0 -27
- package/src/constants/chains.ts +0 -72
- package/src/constants/defaults.ts +0 -28
- package/src/constants/swappers.ts +0 -48
- package/src/constants/viemChains.ts +0 -69
- package/src/contexts/SwapWalletContext.tsx +0 -25
- package/src/demo/App.css +0 -458
- package/src/demo/App.tsx +0 -481
- package/src/demo/main.tsx +0 -25
- package/src/hooks/useAssets.ts +0 -180
- package/src/hooks/useBalances.ts +0 -822
- package/src/hooks/useBitcoinSigning.ts +0 -276
- package/src/hooks/useMarketData.ts +0 -169
- package/src/hooks/useSolanaSigning.ts +0 -275
- package/src/hooks/useStatusPolling.ts +0 -137
- package/src/hooks/useSwapApproval.ts +0 -106
- package/src/hooks/useSwapDisplayValues.ts +0 -157
- package/src/hooks/useSwapExecution.ts +0 -199
- package/src/hooks/useSwapHandlers.ts +0 -119
- package/src/hooks/useSwapQuote.ts +0 -71
- package/src/hooks/useSwapQuoting.ts +0 -102
- package/src/hooks/useSwapRates.ts +0 -61
- package/src/index.ts +0 -43
- package/src/machines/SwapMachineContext.ts +0 -5
- package/src/machines/__tests__/guards.test.ts +0 -228
- package/src/machines/__tests__/setup.test.ts +0 -7
- package/src/machines/__tests__/swapMachine.test.ts +0 -544
- package/src/machines/__tests__/types.test.ts +0 -124
- package/src/machines/guards.ts +0 -33
- package/src/machines/swapMachine.ts +0 -288
- package/src/machines/types.ts +0 -54
- package/src/services/transactionStatus.ts +0 -322
- package/src/types/index.ts +0 -361
- package/src/utils/addressValidation.ts +0 -201
- package/src/utils/redirect.ts +0 -45
- package/src/vite-env.d.ts +0 -10
- package/tsconfig.json +0 -23
- package/tsconfig.node.json +0 -10
- package/vite.config.ts +0 -101
- 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>
|
package/dist/icon-192x192.png
DELETED
|
Binary file
|
package/dist/icon-512x512.png
DELETED
|
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>
|
package/public/favicon.png
DELETED
|
Binary file
|
package/public/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>
|
package/public/icon-192x192.png
DELETED
|
Binary file
|
package/public/icon-512x512.png
DELETED
|
Binary file
|
package/railway.toml
DELETED
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
|
-
}
|