@idosgames/wallet 0.1.9 → 0.1.11

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/README.md CHANGED
@@ -28,12 +28,27 @@ npm i wagmi viem @tanstack/react-query
28
28
  npm i @solana/web3.js @solana/wallet-adapter-react @solana/wallet-adapter-base @solana/wallet-adapter-wallets
29
29
  ```
30
30
 
31
- Two entry points:
31
+ Entry points:
32
32
 
33
33
  - `@idosgames/wallet` — framework-agnostic bridge functions (viem +
34
34
  `@solana/web3.js` only). Use these directly if you're not on React.
35
35
  - `@idosgames/wallet/react` — wagmi/React hooks + providers. Everything below
36
36
  uses these.
37
+ - `@idosgames/wallet/react/solana` — the Solana React bindings, kept off
38
+ `/react` so an EVM-only game doesn't bundle the Solana adapters.
39
+ - `@idosgames/wallet/react/lazy` — `LazyWalletLogin` /
40
+ `LazySolanaWalletLogin`: the same sign-in button, but it fetches the wallet
41
+ machinery on the player's first tap. This is the only entry with **no Reown
42
+ AppKit in its module graph**, which is what makes it safe on a login screen
43
+ in sandboxed/preview bundlers where AppKit isn't installable. It also
44
+ re-exports the supported chains as plain objects, so a login screen never has
45
+ to import the `wagmi/chains` / `viem/chains` barrel.
46
+
47
+ Every subpath declares a `browser` export condition pointing at the ESM build.
48
+ That is load-bearing, not cosmetic: some browser bundlers (CodeSandbox's
49
+ classic Sandpack bundler among them) rank the `require` condition above
50
+ `import` and would otherwise take the CommonJS build — where a dynamic
51
+ `import()` cannot survive, so the lazy entry would eagerly require AppKit.
37
52
 
38
53
  ## Operation category
39
54
 
@@ -1,2 +1,2 @@
1
- 'use strict';var wagmi=require('wagmi'),connectors=require('wagmi/connectors'),appkitAdapterWagmi=require('@reown/appkit-adapter-wagmi'),react=require('@reown/appkit/react'),reactQuery=require('@tanstack/react-query'),react$1=require('react'),jsxRuntime=require('react/jsx-runtime'),viem=require('viem'),core=require('@idosgames/core'),actions=require('wagmi/actions');var Y={id:1,name:"Ethereum",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://eth.llamarpc.com"]}},blockExplorers:{default:{name:"Etherscan",url:"https://etherscan.io"}}},z={id:56,name:"BNB Smart Chain",nativeCurrency:{name:"BNB",symbol:"BNB",decimals:18},rpcUrls:{default:{http:["https://bsc-dataseed.binance.org"]}},blockExplorers:{default:{name:"BscScan",url:"https://bscscan.com"}}},_={id:137,name:"Polygon",nativeCurrency:{name:"POL",symbol:"POL",decimals:18},rpcUrls:{default:{http:["https://polygon-rpc.com"]}},blockExplorers:{default:{name:"PolygonScan",url:"https://polygonscan.com"}}},Q={id:8453,name:"Base",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://mainnet.base.org"]}},blockExplorers:{default:{name:"BaseScan",url:"https://basescan.org"}}},V={id:42161,name:"Arbitrum One",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://arb1.arbitrum.io/rpc"]}},blockExplorers:{default:{name:"Arbiscan",url:"https://arbiscan.io"}}},Z={id:10,name:"OP Mainnet",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://mainnet.optimism.io"]}},blockExplorers:{default:{name:"Optimistic Etherscan",url:"https://optimistic.etherscan.io"}}},$={id:11155111,name:"Sepolia",testnet:true,nativeCurrency:{name:"Sepolia Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://rpc.sepolia.org"]}},blockExplorers:{default:{name:"Etherscan",url:"https://sepolia.etherscan.io"}}},J={id:80002,name:"Polygon Amoy",testnet:true,nativeCurrency:{name:"POL",symbol:"POL",decimals:18},rpcUrls:{default:{http:["https://rpc-amoy.polygon.technology"]}},blockExplorers:{default:{name:"PolygonScan",url:"https://amoy.polygonscan.com"}}},X={mainnet:Y,bsc:z,polygon:_,base:Q,arbitrum:V,optimism:Z,sepolia:$,polygonAmoy:J};function we(t){return Object.values(X).find(e=>e.id===t)}function ee(t){return {...t,chainNamespace:"eip155",caipNetworkId:`eip155:${t.id}`}}var te=null;function ne(t){te=t;}function N(){return te}function Ae(t){let{chains:e,walletConnectProjectId:n,appName:r,appUrl:o,appIcon:a,transports:d,connectors:c}=t,i={};for(let l of e)i[l.id]=d?.[l.id]??wagmi.http();let m=o??(typeof window<"u"?window.location.origin:""),p={name:r??"iDosGames",description:r??"iDosGames game",url:m,icons:a?[a]:[]};if(n&&!c){let l=e.map(ee),f=new appkitAdapterWagmi.WagmiAdapter({networks:l,projectId:n,transports:i});return ne(react.createAppKit({adapters:[f],networks:l,projectId:n,metadata:p,features:{analytics:false,email:false,socials:false}})),f.wagmiConfig}let u=c??[connectors.injected(),connectors.coinbaseWallet({appName:r??"iDosGames"})];return wagmi.createConfig({chains:e,connectors:u,transports:i})}function D(t){let{wagmiConfig:e,queryClient:n,children:r}=t,[o]=react$1.useState(()=>n??new reactQuery.QueryClient);return jsxRuntime.jsx(wagmi.WagmiProvider,{config:e,children:jsxRuntime.jsx(reactQuery.QueryClientProvider,{client:o,children:r})})}var E=[{type:"function",name:"depositERC20",stateMutability:"nonpayable",inputs:[{name:"token",type:"address"},{name:"amount",type:"uint256"},{name:"userID",type:"string"},{name:"titleID",type:"string"},{name:"category",type:"string"}],outputs:[{name:"",type:"bool"}]},{type:"function",name:"withdrawERC20",stateMutability:"nonpayable",inputs:[{name:"token",type:"address"},{name:"to",type:"address"},{name:"amount",type:"uint256"},{name:"burnAmount",type:"uint256"},{name:"nonce",type:"uint256"},{name:"signature",type:"bytes"},{name:"userID",type:"string"},{name:"titleID",type:"string"},{name:"category",type:"string"},{name:"deadline",type:"uint256"}],outputs:[]},{type:"function",name:"withdrawERC1155",stateMutability:"nonpayable",inputs:[{name:"token",type:"address"},{name:"to",type:"address"},{name:"id",type:"uint256"},{name:"amount",type:"uint256"},{name:"nonce",type:"uint256"},{name:"signature",type:"bytes"},{name:"userID",type:"string"},{name:"titleID",type:"string"},{name:"category",type:"string"},{name:"deadline",type:"uint256"}],outputs:[]},{type:"function",name:"withdrawERC721",stateMutability:"nonpayable",inputs:[{name:"token",type:"address"},{name:"to",type:"address"},{name:"tokenId",type:"uint256"},{name:"nonce",type:"uint256"},{name:"signature",type:"bytes"},{name:"userID",type:"string"},{name:"titleID",type:"string"},{name:"category",type:"string"},{name:"deadline",type:"uint256"}],outputs:[]}],oe=[{type:"function",name:"withdrawERC1155Mint",stateMutability:"nonpayable",inputs:[{name:"collection",type:"address"},{name:"to",type:"address"},{name:"id",type:"uint256"},{name:"amount",type:"uint256"},{name:"nonce",type:"uint256"},{name:"signature",type:"bytes"},{name:"userID",type:"string"},{name:"titleID",type:"string"},{name:"category",type:"string"},{name:"deadline",type:"uint256"}],outputs:[]},{type:"function",name:"withdrawERC721Mint",stateMutability:"nonpayable",inputs:[{name:"collection",type:"address"},{name:"to",type:"address"},{name:"tokenId",type:"uint256"},{name:"nonce",type:"uint256"},{name:"signature",type:"bytes"},{name:"userID",type:"string"},{name:"titleID",type:"string"},{name:"category",type:"string"},{name:"deadline",type:"uint256"}],outputs:[]}],P=[{type:"function",name:"approve",stateMutability:"nonpayable",inputs:[{name:"spender",type:"address"},{name:"amount",type:"uint256"}],outputs:[{name:"",type:"bool"}]},{type:"function",name:"allowance",stateMutability:"view",inputs:[{name:"owner",type:"address"},{name:"spender",type:"address"}],outputs:[{name:"",type:"uint256"}]},{type:"function",name:"decimals",stateMutability:"view",inputs:[],outputs:[{name:"",type:"uint8"}]},{type:"function",name:"balanceOf",stateMutability:"view",inputs:[{name:"account",type:"address"}],outputs:[{name:"",type:"uint256"}]}],ae=[{type:"function",name:"safeTransferFrom",stateMutability:"nonpayable",inputs:[{name:"from",type:"address"},{name:"to",type:"address"},{name:"id",type:"uint256"},{name:"amount",type:"uint256"},{name:"data",type:"bytes"}],outputs:[]},{type:"function",name:"isApprovedForAll",stateMutability:"view",inputs:[{name:"account",type:"address"},{name:"operator",type:"address"}],outputs:[{name:"",type:"bool"}]},{type:"function",name:"setApprovalForAll",stateMutability:"nonpayable",inputs:[{name:"operator",type:"address"},{name:"approved",type:"bool"}],outputs:[]},{type:"function",name:"balanceOf",stateMutability:"view",inputs:[{name:"account",type:"address"},{name:"id",type:"uint256"}],outputs:[{name:"",type:"uint256"}]}];function ie(t,e,n){return viem.encodeAbiParameters([{type:"string"},{type:"string"},{type:"string"}],[t,e,core.normalizeBlockchainCategory(n)])}async function y(t,e){let{walletClient:n,publicClient:r,account:o}=t,a=await n.writeContract({address:e.address,abi:e.abi,functionName:e.functionName,args:e.args,account:o,chain:n.chain,value:e.value});if((await r.waitForTransactionReceipt({hash:a})).status==="reverted")throw new Error(`On-chain transaction reverted (${a}).`);return a}function g(t){return t instanceof viem.BaseError?t.shortMessage:t instanceof Error?t.message:String(t)}function s(t,e,n){return {ok:false,stage:t,error:e,...n}}function h(t,e){return {ok:false,stage:t,error:e}}function se(t){let e=t.RewardPoolAddress;return e||null}async function le(t,e,n,r){return await t.publicClient.readContract({address:e,abi:P,functionName:"allowance",args:[t.account,n]})>=r?null:y(t,{address:e,abi:P,functionName:"approve",args:[n,r]})}async function I(t){let{client:e,clients:n,network:r,tokenAddress:o,amount:a,titleID:d,category:c}=t,i=e.auth.context?.userID;if(!i)return s("approve","Not logged in.");let m=se(r);if(!m)return s("approve","Network has no RewardPoolAddress.");if(a<=0n)return s("approve","Amount must be positive.");try{await le(n,o,m,a);}catch(l){return s("approve",g(l))}let p;try{p=await y(n,{address:m,abi:E,functionName:"depositERC20",args:[o,a,i,d,c??""]});}catch(l){return s("deposit-onchain",g(l))}let u=await e.blockchain.depositToken(r.NetworkID??"",p);return u.ok?{ok:true,onChainTxHash:p,data:u.data}:s("report",u.error,{onChainTxHash:p})}async function B(t){let{client:e,clients:n,network:r,nftContractAddress:o,tokenId:a,amount:d,titleID:c,category:i}=t,m=e.auth.context?.userID;if(!m)return s("deposit-onchain","Not logged in.");let p=se(r);if(!p)return s("deposit-onchain","Network has no RewardPoolAddress.");if(d<=0n)return s("deposit-onchain","Amount must be positive.");let u=ie(m,c,i),l;try{l=await y(n,{address:o,abi:ae,functionName:"safeTransferFrom",args:[n.account,p,a,d,u]});}catch(k){return s("deposit-onchain",g(k))}let f=await e.blockchain.depositNFT(r.NetworkID??"",l);return f.ok?{ok:true,onChainTxHash:l,data:f.data}:s("report",f.error,{onChainTxHash:l})}async function ce(t,e){return y(t,{address:e.ContractAddress,abi:E,functionName:"withdrawERC20",args:[e.TokenAddress,e.WalletAddress,BigInt(e.Amount??"0"),BigInt(e.BurnAmount??"0"),BigInt(e.Nonce??"0"),e.Signature??"0x",e.UserID??"",e.TitleID??"",e.Category??"",BigInt(e.Deadline??"0")]})}async function pe(t,e){return y(t,{address:e.ContractAddress,abi:oe,functionName:"withdrawERC1155Mint",args:[e.TokenAddress,e.WalletAddress,BigInt(e.TokenId??"0"),BigInt(e.Amount??"0"),BigInt(e.Nonce??"0"),e.Signature??"0x",e.UserID??"",e.TitleID??"",e.Category??"",BigInt(e.Deadline??"0")]})}async function R(t){let{client:e,clients:n,currencyID:r,networkID:o,walletAddress:a,amount:d,category:c}=t,i=await e.blockchain.requestTokenWithdrawal(r,o,a,d,c);if(!i.ok)return s("request",i.error);let m=i.data.EvmSignature,p=i.data.TitleTransactionID??void 0;if(!m)return s("request","Withdrawal response carried no EVM signature.",{titleTransactionID:p});let u;try{u=await ce(n,m);}catch(f){return s("withdraw-onchain",g(f),{titleTransactionID:p})}let l=await de(e,p,u);return l.ok?{ok:true,onChainTxHash:u,data:i.data}:l}async function S(t){let{client:e,clients:n,itemID:r,networkID:o,walletAddress:a,amount:d,category:c}=t,i=await e.blockchain.requestNFTWithdrawal(r,o,a,d,c);if(!i.ok)return s("request",i.error);let m=i.data.EvmSignature,p=i.data.TitleTransactionID??void 0;if(!m)return s("request","Withdrawal response carried no EVM signature.",{titleTransactionID:p});let u;try{u=await pe(n,m);}catch(f){return s("withdraw-onchain",g(f),{titleTransactionID:p})}let l=await de(e,p,u);return l.ok?{ok:true,onChainTxHash:u,data:i.data}:l}async function de(t,e,n){if(!e)return s("confirm","Missing TitleTransactionID.",{onChainTxHash:n});let r=await t.blockchain.confirmWithdrawal(e,n);return r.ok?{ok:true,onChainTxHash:n,data:r.data}:s("confirm",r.error,{onChainTxHash:n,titleTransactionID:e})}async function b(t){let{client:e,clients:n,networkID:r}=t,o=t.walletAddress??n.account,a=await e.auth.requestWalletChallenge(o,r);if(!a.ok)return h("challenge",a.error);let d;try{d=await n.walletClient.signMessage({account:n.account,message:a.data.Message});}catch(i){return h("sign",g(i))}let c=await e.auth.loginWithWallet(o,r,d);return c.ok?{ok:true,data:c.data}:h("login",c.error)}function A(){let{address:t}=wagmi.useAccount(),e=wagmi.usePublicClient(),{data:n}=wagmi.useWalletClient();return !t||!e||!n?null:{account:t,publicClient:e,walletClient:n}}var v="Wallet not connected.";function Fe(t,e){let n=A();return {connected:!!n,account:n?.account??null,loginWithWallet:(r,o)=>n?b({client:t,clients:n,networkID:r,walletAddress:o}):Promise.resolve(h("challenge",v)),depositToken:r=>n?I({client:t,clients:n,titleID:e,...r}):Promise.resolve(s("approve",v)),depositNft:r=>n?B({client:t,clients:n,titleID:e,...r}):Promise.resolve(s("deposit-onchain",v)),withdrawToken:r=>n?R({client:t,clients:n,...r}):Promise.resolve(s("withdraw-onchain",v)),withdrawNft:r=>n?S({client:t,clients:n,...r}):Promise.resolve(s("withdraw-onchain",v))}}function qe(t){let{wagmiConfig:e,...n}=t;return jsxRuntime.jsx(D,{wagmiConfig:e,children:jsxRuntime.jsx(fe,{...n})})}function je(t){return t instanceof Error&&(t.name==="ConnectorAlreadyConnectedError"||t.message.includes("already connected"))}function Ye(t){let e="Wallet sign-in failed. Please try again.";return t instanceof Error?t.name==="ProviderNotFoundError"||/provider not found/i.test(t.message)?"No crypto wallet found in this browser. Install a wallet extension (e.g. MetaMask) or open this page in your wallet's browser, then try again.":t.name==="UserRejectedRequestError"||/user (rejected|denied|cancelled|canceled)/i.test(t.message)?"Request declined in the wallet.":/timed? ?out/i.test(t.message)?"The wallet did not respond. Open your wallet and try again.":e:e}async function ze(t){let e=await actions.getWalletClient(t).catch(()=>null);if(!e)return null;let n=actions.getPublicClient(t);return n?{account:e.account.address,publicClient:n,walletClient:e}:null}function _e(t,e=18e4){return actions.getAccount(t).isConnected?Promise.resolve(true):new Promise(n=>{let r=false,o=c=>{r||(r=true,a(),clearTimeout(d),n(c));},a=actions.watchAccount(t,{onChange:c=>{c.isConnected&&o(true);}}),d=setTimeout(()=>o(false),e);})}function Qe(t){let e=o=>t.find(a=>a.id===o||a.type===o),n=e("injected"),r=typeof window<"u"&&window.ethereum!=null;return n&&r?n:e("walletConnect")??n??t[0]}var Ve=9e4;async function Ze(t){try{let r=(await actions.getAccount(t).connector?.getProvider?.())?.session?.peer?.metadata?.redirect,o=r?.native||r?.universal;return !o||typeof window>"u"?!1:(window.location.href=o,!0)}catch{return false}}function $e(t,e){return new Promise((n,r)=>{let o=setTimeout(()=>r(new Error("The wallet request timed out.")),e);t.then(a=>{clearTimeout(o),n(a);},a=>{clearTimeout(o),r(a instanceof Error?a:new Error(String(a)));});})}function fe(t){let{client:e,networkID:n,onAuthenticated:r,disabled:o,label:a,style:d,autoStart:c}=t,i=wagmi.useConfig(),{isConnected:m}=wagmi.useAccount(),{connectAsync:p,connectors:u}=wagmi.useConnect(),l=A(),[f,k]=react$1.useState(false),[H,w]=react$1.useState(null),[M,L]=react$1.useState(false),K=react$1.useRef(0),G=react$1.useRef(false),O=async()=>{let ye=++K.current,T=()=>K.current===ye;k(true),w(null);try{if(!m){let U=N();if(U){if(await U.open(),!await _e(i)){w("No wallet was connected.");return}}else {let q=Qe(u);if(!q){w("No wallet connector is configured.");return}try{await p({connector:q});}catch(j){if(!je(j))throw j}}}let C=l??await ze(i);if(!C){w("Wallet client is not available.");return}L(!0);let W=await $e(b({client:e,clients:C,networkID:n}),Ve);if(!T())return;if(W.ok){r();return}w(W.stage==="sign"?"Signature declined.":W.error??"Wallet sign-in failed.");}catch(C){if(!T())return;console.error("[idosgames/wallet] wallet sign-in failed:",C),w(Ye(C));}finally{T()&&(k(false),L(false));}};react$1.useEffect(()=>{!c||G.current||(G.current=true,O());},[c]);let ge=async()=>{await Ze(i)||await N()?.open();};return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("button",{type:"button",onClick:()=>{M?ge():O();},disabled:o,style:{...Je,...o?{opacity:.6,cursor:"default"}:null,...d},children:M?"Waiting for signature \u2014 tap to open wallet":f?"Check your wallet\u2026":m?a??"Sign in with wallet":"Connect wallet"}),H&&jsxRuntime.jsx("span",{role:"alert",style:Xe,children:H})]})}var Je={padding:"11px 16px",borderRadius:"8px",border:"none",background:"#4c3fa8",color:"#fff",font:"inherit",fontWeight:600,cursor:"pointer"},Xe={display:"block",marginTop:"6px",color:"#ff9b9b",fontSize:"13px",textAlign:"center"};
2
- exports.IDosGamesWalletProvider=D;exports.WalletLogin=qe;exports.WalletLoginButton=fe;exports.arbitrum=V;exports.base=Q;exports.bsc=z;exports.chainById=we;exports.createEvmWalletConfig=Ae;exports.idosChains=X;exports.mainnet=Y;exports.optimism=Z;exports.polygon=_;exports.polygonAmoy=J;exports.sepolia=$;exports.useEvmBridge=Fe;exports.useEvmBridgeClients=A;
1
+ 'use strict';var wagmi=require('wagmi'),connectors=require('wagmi/connectors'),appkitAdapterWagmi=require('@reown/appkit-adapter-wagmi'),react=require('@reown/appkit/react'),reactQuery=require('@tanstack/react-query'),react$1=require('react'),jsxRuntime=require('react/jsx-runtime'),viem=require('viem'),core=require('@idosgames/core'),actions=require('wagmi/actions');var _={id:1,name:"Ethereum",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://eth.llamarpc.com"]}},blockExplorers:{default:{name:"Etherscan",url:"https://etherscan.io"}}},z={id:56,name:"BNB Smart Chain",nativeCurrency:{name:"BNB",symbol:"BNB",decimals:18},rpcUrls:{default:{http:["https://bsc-dataseed.binance.org"]}},blockExplorers:{default:{name:"BscScan",url:"https://bscscan.com"}}},Q={id:137,name:"Polygon",nativeCurrency:{name:"POL",symbol:"POL",decimals:18},rpcUrls:{default:{http:["https://polygon-rpc.com"]}},blockExplorers:{default:{name:"PolygonScan",url:"https://polygonscan.com"}}},V={id:8453,name:"Base",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://mainnet.base.org"]}},blockExplorers:{default:{name:"BaseScan",url:"https://basescan.org"}}},Z={id:42161,name:"Arbitrum One",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://arb1.arbitrum.io/rpc"]}},blockExplorers:{default:{name:"Arbiscan",url:"https://arbiscan.io"}}},$={id:10,name:"OP Mainnet",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://mainnet.optimism.io"]}},blockExplorers:{default:{name:"Optimistic Etherscan",url:"https://optimistic.etherscan.io"}}},J={id:11155111,name:"Sepolia",testnet:true,nativeCurrency:{name:"Sepolia Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://rpc.sepolia.org"]}},blockExplorers:{default:{name:"Etherscan",url:"https://sepolia.etherscan.io"}}},X={id:80002,name:"Polygon Amoy",testnet:true,nativeCurrency:{name:"POL",symbol:"POL",decimals:18},rpcUrls:{default:{http:["https://rpc-amoy.polygon.technology"]}},blockExplorers:{default:{name:"PolygonScan",url:"https://amoy.polygonscan.com"}}},ee={mainnet:_,bsc:z,polygon:Q,base:V,arbitrum:Z,optimism:$,sepolia:J,polygonAmoy:X};function Ce(t){return Object.values(ee).find(e=>e.id===t)}function te(t){return {...t,chainNamespace:"eip155",caipNetworkId:`eip155:${t.id}`}}var ne=null;function re(t){ne=t;}function P(){return ne}function Te(t){let{chains:e,walletConnectProjectId:n,appName:r,appUrl:o,appIcon:a,transports:p,connectors:l}=t,i={};for(let c of e)i[c.id]=p?.[c.id]??wagmi.http();let u=o??(typeof window<"u"?window.location.origin:""),d={name:r??"iDosGames",description:r??"iDosGames game",url:u,icons:a?[a]:[]};if(n&&!l){let c=e.map(te),f=new appkitAdapterWagmi.WagmiAdapter({networks:c,projectId:n,transports:i});return re(react.createAppKit({adapters:[f],networks:c,projectId:n,metadata:d,features:{analytics:false,email:false,socials:false}})),f.wagmiConfig}let m=l??[connectors.injected(),connectors.coinbaseWallet({appName:r??"iDosGames"})];return wagmi.createConfig({chains:e,connectors:m,transports:i})}function I(t){let{wagmiConfig:e,queryClient:n,children:r}=t,[o]=react$1.useState(()=>n??new reactQuery.QueryClient);return jsxRuntime.jsx(wagmi.WagmiProvider,{config:e,children:jsxRuntime.jsx(reactQuery.QueryClientProvider,{client:o,children:r})})}var T=[{type:"function",name:"depositERC20",stateMutability:"nonpayable",inputs:[{name:"token",type:"address"},{name:"amount",type:"uint256"},{name:"userID",type:"string"},{name:"titleID",type:"string"},{name:"category",type:"string"}],outputs:[{name:"",type:"bool"}]},{type:"function",name:"withdrawERC20",stateMutability:"nonpayable",inputs:[{name:"token",type:"address"},{name:"to",type:"address"},{name:"amount",type:"uint256"},{name:"burnAmount",type:"uint256"},{name:"nonce",type:"uint256"},{name:"signature",type:"bytes"},{name:"userID",type:"string"},{name:"titleID",type:"string"},{name:"category",type:"string"},{name:"deadline",type:"uint256"}],outputs:[]},{type:"function",name:"withdrawERC1155",stateMutability:"nonpayable",inputs:[{name:"token",type:"address"},{name:"to",type:"address"},{name:"id",type:"uint256"},{name:"amount",type:"uint256"},{name:"nonce",type:"uint256"},{name:"signature",type:"bytes"},{name:"userID",type:"string"},{name:"titleID",type:"string"},{name:"category",type:"string"},{name:"deadline",type:"uint256"}],outputs:[]},{type:"function",name:"withdrawERC721",stateMutability:"nonpayable",inputs:[{name:"token",type:"address"},{name:"to",type:"address"},{name:"tokenId",type:"uint256"},{name:"nonce",type:"uint256"},{name:"signature",type:"bytes"},{name:"userID",type:"string"},{name:"titleID",type:"string"},{name:"category",type:"string"},{name:"deadline",type:"uint256"}],outputs:[]}],ae=[{type:"function",name:"withdrawERC1155Mint",stateMutability:"nonpayable",inputs:[{name:"collection",type:"address"},{name:"to",type:"address"},{name:"id",type:"uint256"},{name:"amount",type:"uint256"},{name:"nonce",type:"uint256"},{name:"signature",type:"bytes"},{name:"userID",type:"string"},{name:"titleID",type:"string"},{name:"category",type:"string"},{name:"deadline",type:"uint256"}],outputs:[]},{type:"function",name:"withdrawERC721Mint",stateMutability:"nonpayable",inputs:[{name:"collection",type:"address"},{name:"to",type:"address"},{name:"tokenId",type:"uint256"},{name:"nonce",type:"uint256"},{name:"signature",type:"bytes"},{name:"userID",type:"string"},{name:"titleID",type:"string"},{name:"category",type:"string"},{name:"deadline",type:"uint256"}],outputs:[]}],B=[{type:"function",name:"approve",stateMutability:"nonpayable",inputs:[{name:"spender",type:"address"},{name:"amount",type:"uint256"}],outputs:[{name:"",type:"bool"}]},{type:"function",name:"allowance",stateMutability:"view",inputs:[{name:"owner",type:"address"},{name:"spender",type:"address"}],outputs:[{name:"",type:"uint256"}]},{type:"function",name:"decimals",stateMutability:"view",inputs:[],outputs:[{name:"",type:"uint8"}]},{type:"function",name:"balanceOf",stateMutability:"view",inputs:[{name:"account",type:"address"}],outputs:[{name:"",type:"uint256"}]}],ie=[{type:"function",name:"safeTransferFrom",stateMutability:"nonpayable",inputs:[{name:"from",type:"address"},{name:"to",type:"address"},{name:"id",type:"uint256"},{name:"amount",type:"uint256"},{name:"data",type:"bytes"}],outputs:[]},{type:"function",name:"isApprovedForAll",stateMutability:"view",inputs:[{name:"account",type:"address"},{name:"operator",type:"address"}],outputs:[{name:"",type:"bool"}]},{type:"function",name:"setApprovalForAll",stateMutability:"nonpayable",inputs:[{name:"operator",type:"address"},{name:"approved",type:"bool"}],outputs:[]},{type:"function",name:"balanceOf",stateMutability:"view",inputs:[{name:"account",type:"address"},{name:"id",type:"uint256"}],outputs:[{name:"",type:"uint256"}]}];function se(t,e,n){return viem.encodeAbiParameters([{type:"string"},{type:"string"},{type:"string"}],[t,e,core.normalizeBlockchainCategory(n)])}async function w(t,e){let{walletClient:n,publicClient:r,account:o}=t,a=await n.writeContract({address:e.address,abi:e.abi,functionName:e.functionName,args:e.args,account:o,chain:n.chain,value:e.value});if((await r.waitForTransactionReceipt({hash:a})).status==="reverted")throw new Error(`On-chain transaction reverted (${a}).`);return a}function g(t){return t instanceof viem.BaseError?t.shortMessage:t instanceof Error?t.message:String(t)}function s(t,e,n){return {ok:false,stage:t,error:e,...n}}function C(t,e){return {ok:false,stage:t,error:e}}function le(t){let e=t.RewardPoolAddress;return e||null}async function ce(t,e,n,r){return await t.publicClient.readContract({address:e,abi:B,functionName:"allowance",args:[t.account,n]})>=r?null:w(t,{address:e,abi:B,functionName:"approve",args:[n,r]})}async function R(t){let{client:e,clients:n,network:r,tokenAddress:o,amount:a,titleID:p,category:l}=t,i=e.auth.context?.userID;if(!i)return s("approve","Not logged in.");let u=le(r);if(!u)return s("approve","Network has no RewardPoolAddress.");if(a<=0n)return s("approve","Amount must be positive.");try{await ce(n,o,u,a);}catch(c){return s("approve",g(c))}let d;try{d=await w(n,{address:u,abi:T,functionName:"depositERC20",args:[o,a,i,p,l??""]});}catch(c){return s("deposit-onchain",g(c))}let m=await e.blockchain.depositToken(r.NetworkID??"",d);return m.ok?{ok:true,onChainTxHash:d,data:m.data}:s("report",m.error,{onChainTxHash:d})}async function S(t){let{client:e,clients:n,network:r,nftContractAddress:o,tokenId:a,amount:p,titleID:l,category:i}=t,u=e.auth.context?.userID;if(!u)return s("deposit-onchain","Not logged in.");let d=le(r);if(!d)return s("deposit-onchain","Network has no RewardPoolAddress.");if(p<=0n)return s("deposit-onchain","Amount must be positive.");let m=se(u,l,i),c;try{c=await w(n,{address:o,abi:ie,functionName:"safeTransferFrom",args:[n.account,d,a,p,m]});}catch(A){return s("deposit-onchain",g(A))}let f=await e.blockchain.depositNFT(r.NetworkID??"",c);return f.ok?{ok:true,onChainTxHash:c,data:f.data}:s("report",f.error,{onChainTxHash:c})}async function pe(t,e){return w(t,{address:e.ContractAddress,abi:T,functionName:"withdrawERC20",args:[e.TokenAddress,e.WalletAddress,BigInt(e.Amount??"0"),BigInt(e.BurnAmount??"0"),BigInt(e.Nonce??"0"),e.Signature??"0x",e.UserID??"",e.TitleID??"",e.Category??"",BigInt(e.Deadline??"0")]})}async function de(t,e){return w(t,{address:e.ContractAddress,abi:ae,functionName:"withdrawERC1155Mint",args:[e.TokenAddress,e.WalletAddress,BigInt(e.TokenId??"0"),BigInt(e.Amount??"0"),BigInt(e.Nonce??"0"),e.Signature??"0x",e.UserID??"",e.TitleID??"",e.Category??"",BigInt(e.Deadline??"0")]})}async function F(t){let{client:e,clients:n,currencyID:r,networkID:o,walletAddress:a,amount:p,category:l}=t,i=await e.blockchain.requestTokenWithdrawal(r,o,a,p,l);if(!i.ok)return s("request",i.error);let u=i.data.EvmSignature,d=i.data.TitleTransactionID??void 0;if(!u)return s("request","Withdrawal response carried no EVM signature.",{titleTransactionID:d});let m;try{m=await pe(n,u);}catch(f){return s("withdraw-onchain",g(f),{titleTransactionID:d})}let c=await me(e,d,m);return c.ok?{ok:true,onChainTxHash:m,data:i.data}:c}async function H(t){let{client:e,clients:n,itemID:r,networkID:o,walletAddress:a,amount:p,category:l}=t,i=await e.blockchain.requestNFTWithdrawal(r,o,a,p,l);if(!i.ok)return s("request",i.error);let u=i.data.EvmSignature,d=i.data.TitleTransactionID??void 0;if(!u)return s("request","Withdrawal response carried no EVM signature.",{titleTransactionID:d});let m;try{m=await de(n,u);}catch(f){return s("withdraw-onchain",g(f),{titleTransactionID:d})}let c=await me(e,d,m);return c.ok?{ok:true,onChainTxHash:m,data:i.data}:c}async function me(t,e,n){if(!e)return s("confirm","Missing TitleTransactionID.",{onChainTxHash:n});let r=await t.blockchain.confirmWithdrawal(e,n);return r.ok?{ok:true,onChainTxHash:n,data:r.data}:s("confirm",r.error,{onChainTxHash:n,titleTransactionID:e})}async function b(t){let{client:e,clients:n,networkID:r}=t,o=t.walletAddress??n.account,a=await e.auth.requestWalletChallenge(o,r);if(!a.ok)return C("challenge",a.error);let p;try{p=await n.walletClient.signMessage({account:n.account,message:a.data.Message});}catch(i){return C("sign",g(i))}let l=await e.auth.loginWithWallet(o,r,p);return l.ok?{ok:true,data:l.data}:C("login",l.error)}function W(){let{address:t}=wagmi.useAccount(),e=wagmi.usePublicClient(),{data:n}=wagmi.useWalletClient();return !t||!e||!n?null:{account:t,publicClient:e,walletClient:n}}var k="Wallet not connected.";function Me(t,e){let n=W();return {connected:!!n,account:n?.account??null,loginWithWallet:(r,o)=>n?b({client:t,clients:n,networkID:r,walletAddress:o}):Promise.resolve(C("challenge",k)),depositToken:r=>n?R({client:t,clients:n,titleID:e,...r}):Promise.resolve(s("approve",k)),depositNft:r=>n?S({client:t,clients:n,titleID:e,...r}):Promise.resolve(s("deposit-onchain",k)),withdrawToken:r=>n?F({client:t,clients:n,...r}):Promise.resolve(s("withdraw-onchain",k)),withdrawNft:r=>n?H({client:t,clients:n,...r}):Promise.resolve(s("withdraw-onchain",k))}}function je(t){let{wagmiConfig:e,...n}=t;return jsxRuntime.jsx(I,{wagmiConfig:e,children:jsxRuntime.jsx(ye,{...n})})}function Ye(t){return t instanceof Error&&(t.name==="ConnectorAlreadyConnectedError"||t.message.includes("already connected"))}function _e(t){let e="Wallet sign-in failed. Please try again.";return t instanceof Error?t.name==="ProviderNotFoundError"||/provider not found/i.test(t.message)?"No crypto wallet found in this browser. Install a wallet extension (e.g. MetaMask) or open this page in your wallet's browser, then try again.":t.name==="UserRejectedRequestError"||/user (rejected|denied|cancelled|canceled)/i.test(t.message)?"Request declined in the wallet.":/timed? ?out/i.test(t.message)?"The wallet did not respond. Open your wallet and try again.":e:e}async function fe(t){let e=await actions.getWalletClient(t).catch(()=>null);if(!e)return null;let n=actions.getPublicClient(t);return n?{account:e.account.address,publicClient:n,walletClient:e}:null}function ze(t,e=18e4){return actions.getAccount(t).isConnected?Promise.resolve(true):new Promise(n=>{let r=false,o=l=>{r||(r=true,a(),clearTimeout(p),n(l));},a=actions.watchAccount(t,{onChange:l=>{l.isConnected&&o(true);}}),p=setTimeout(()=>o(false),e);})}function Qe(t,e=8e3){let n=r=>r==="reconnecting"||r==="connecting";return n(actions.getAccount(t).status)?new Promise(r=>{let o=false,a=()=>{o||(o=true,p(),clearTimeout(l),r());},p=actions.watchAccount(t,{onChange:i=>{n(i.status)||a();}}),l=setTimeout(a,e);}):Promise.resolve()}function Ve(t){let e=o=>t.find(a=>a.id===o||a.type===o),n=e("injected"),r=typeof window<"u"&&window.ethereum!=null;return n&&r?n:e("walletConnect")??n??t[0]}var Ze=9e4;async function $e(t){try{let r=(await actions.getAccount(t).connector?.getProvider?.())?.session?.peer?.metadata?.redirect,o=r?.native||r?.universal;return !o||typeof window>"u"?!1:(window.location.href=o,!0)}catch{return false}}function Je(t,e){return new Promise((n,r)=>{let o=setTimeout(()=>r(new Error("The wallet request timed out.")),e);t.then(a=>{clearTimeout(o),n(a);},a=>{clearTimeout(o),r(a instanceof Error?a:new Error(String(a)));});})}function ye(t){let{client:e,networkID:n,onAuthenticated:r,disabled:o,label:a,style:p,autoStart:l}=t,i=wagmi.useConfig(),{isConnected:u}=wagmi.useAccount(),{connectAsync:d,connectors:m}=wagmi.useConnect(),c=W(),[f,A]=react$1.useState(false),[L,h]=react$1.useState(null),[K,G]=react$1.useState(false),O=react$1.useRef(0),U=react$1.useRef(false),q=async()=>{let he=++O.current,v=()=>O.current===he;A(true),h(null);try{if(await Qe(i),!v())return;if(!actions.getAccount(i).isConnected){let x=P();if(x){if(await x.open(),!await ze(i)){h("No wallet was connected.");return}}else {let j=Ve(m);if(!j){h("No wallet connector is configured.");return}try{await d({connector:j});}catch(Y){if(!Ye(Y))throw Y}}}let y=c??await fe(i);if(!y&&actions.getAccount(i).isConnected&&(await new Promise(x=>setTimeout(x,300)),y=await fe(i),!v()))return;if(!y){h("Wallet client is not available.");return}G(!0);let D=await Je(b({client:e,clients:y,networkID:n}),Ze);if(!v())return;if(D.ok){r();return}h(D.stage==="sign"?"Signature declined.":D.error??"Wallet sign-in failed.");}catch(y){if(!v())return;console.error("[idosgames/wallet] wallet sign-in failed:",y),h(_e(y));}finally{v()&&(A(false),G(false));}};react$1.useEffect(()=>{!l||U.current||(U.current=true,q());},[l]);let we=async()=>{await $e(i)||await P()?.open();};return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("button",{type:"button",onClick:()=>{K?we():q();},disabled:o,style:{...Xe,...o?{opacity:.6,cursor:"default"}:null,...p},children:K?"Waiting for signature \u2014 tap to open wallet":f?"Check your wallet\u2026":u?a??"Sign in with wallet":"Connect wallet"}),L&&jsxRuntime.jsx("span",{role:"alert",style:et,children:L})]})}var Xe={padding:"11px 16px",borderRadius:"8px",border:"none",background:"#4c3fa8",color:"#fff",font:"inherit",fontWeight:600,cursor:"pointer"},et={display:"block",marginTop:"6px",color:"#ff9b9b",fontSize:"13px",textAlign:"center"};
2
+ exports.IDosGamesWalletProvider=I;exports.WalletLogin=je;exports.WalletLoginButton=ye;exports.arbitrum=Z;exports.base=V;exports.bsc=z;exports.chainById=Ce;exports.createEvmWalletConfig=Te;exports.idosChains=ee;exports.mainnet=_;exports.optimism=$;exports.polygon=Q;exports.polygonAmoy=X;exports.sepolia=J;exports.useEvmBridge=Me;exports.useEvmBridgeClients=W;
@@ -1 +1 @@
1
- import {o,n,i,h,p}from'../chunk-DMMHCUIU.js';import {a,b as b$1}from'../chunk-ZL42KPPC.js';import {b,c}from'../chunk-K62NMX3A.js';import {k}from'../chunk-HQNS6ZWL.js';export{e as arbitrum,d as base,b as bsc,j as chainById,i as idosChains,a as mainnet,f as optimism,c as polygon,h as polygonAmoy,g as sepolia}from'../chunk-HQNS6ZWL.js';import {http,createConfig,WagmiProvider,useAccount,usePublicClient,useWalletClient,useConfig,useConnect}from'wagmi';import {injected,coinbaseWallet}from'wagmi/connectors';import {WagmiAdapter}from'@reown/appkit-adapter-wagmi';import {createAppKit}from'@reown/appkit/react';import {QueryClient,QueryClientProvider}from'@tanstack/react-query';import {useState,useRef,useEffect}from'react';import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {getAccount,watchAccount,getWalletClient,getPublicClient}from'wagmi/actions';function me(e){let{chains:o,walletConnectProjectId:t,appName:n,appUrl:r,appIcon:i,transports:p,connectors:s}=e,a$1={};for(let l of o)a$1[l.id]=p?.[l.id]??http();let f=r??(typeof window<"u"?window.location.origin:""),v={name:n??"iDosGames",description:n??"iDosGames game",url:f,icons:i?[i]:[]};if(t&&!s){let l=o.map(k),g=new WagmiAdapter({networks:l,projectId:t,transports:a$1});return a(createAppKit({adapters:[g],networks:l,projectId:t,metadata:v,features:{analytics:false,email:false,socials:false}})),g.wagmiConfig}let h=s??[injected(),coinbaseWallet({appName:n??"iDosGames"})];return createConfig({chains:o,connectors:h,transports:a$1})}function T(e){let{wagmiConfig:o,queryClient:t,children:n}=e,[r]=useState(()=>t??new QueryClient);return jsx(WagmiProvider,{config:o,children:jsx(QueryClientProvider,{client:r,children:n})})}function C(){let{address:e}=useAccount(),o=usePublicClient(),{data:t}=useWalletClient();return !e||!o||!t?null:{account:e,publicClient:o,walletClient:t}}var u="Wallet not connected.";function ve(e,o$1){let t=C();return {connected:!!t,account:t?.account??null,loginWithWallet:(n,r)=>t?p({client:e,clients:t,networkID:n,walletAddress:r}):Promise.resolve(c("challenge",u)),depositToken:n=>t?h({client:e,clients:t,titleID:o$1,...n}):Promise.resolve(b("approve",u)),depositNft:n=>t?i({client:e,clients:t,titleID:o$1,...n}):Promise.resolve(b("deposit-onchain",u)),withdrawToken:n$1=>t?n({client:e,clients:t,...n$1}):Promise.resolve(b("withdraw-onchain",u)),withdrawNft:n=>t?o({client:e,clients:t,...n}):Promise.resolve(b("withdraw-onchain",u))}}function Ne(e){let{wagmiConfig:o,...t}=e;return jsx(T,{wagmiConfig:o,children:jsx(z,{...t})})}function De(e){return e instanceof Error&&(e.name==="ConnectorAlreadyConnectedError"||e.message.includes("already connected"))}function Ae(e){let o="Wallet sign-in failed. Please try again.";return e instanceof Error?e.name==="ProviderNotFoundError"||/provider not found/i.test(e.message)?"No crypto wallet found in this browser. Install a wallet extension (e.g. MetaMask) or open this page in your wallet's browser, then try again.":e.name==="UserRejectedRequestError"||/user (rejected|denied|cancelled|canceled)/i.test(e.message)?"Request declined in the wallet.":/timed? ?out/i.test(e.message)?"The wallet did not respond. Open your wallet and try again.":o:o}async function Re(e){let o=await getWalletClient(e).catch(()=>null);if(!o)return null;let t=getPublicClient(e);return t?{account:o.account.address,publicClient:t,walletClient:o}:null}function Be(e,o=18e4){return getAccount(e).isConnected?Promise.resolve(true):new Promise(t=>{let n=false,r=s=>{n||(n=true,i(),clearTimeout(p),t(s));},i=watchAccount(e,{onChange:s=>{s.isConnected&&r(true);}}),p=setTimeout(()=>r(false),o);})}function Ie(e){let o=r=>e.find(i=>i.id===r||i.type===r),t=o("injected"),n=typeof window<"u"&&window.ethereum!=null;return t&&n?t:o("walletConnect")??t??e[0]}var Se=9e4;async function xe(e){try{let n=(await getAccount(e).connector?.getProvider?.())?.session?.peer?.metadata?.redirect,r=n?.native||n?.universal;return !r||typeof window>"u"?!1:(window.location.href=r,!0)}catch{return false}}function Ge(e,o){return new Promise((t,n)=>{let r=setTimeout(()=>n(new Error("The wallet request timed out.")),o);e.then(i=>{clearTimeout(r),t(i);},i=>{clearTimeout(r),n(i instanceof Error?i:new Error(String(i)));});})}function z(e){let{client:o,networkID:t,onAuthenticated:n,disabled:r,label:i,style:p$1,autoStart:s}=e,a=useConfig(),{isConnected:f}=useAccount(),{connectAsync:v,connectors:h}=useConnect(),l=C(),[g,k]=useState(false),[N,c]=useState(null),[D,A]=useState(false),R=useRef(0),B=useRef(false),I=async()=>{let J=++R.current,P=()=>R.current===J;k(true),c(null);try{if(!f){let S=b$1();if(S){if(await S.open(),!await Be(a)){c("No wallet was connected.");return}}else {let x=Ie(h);if(!x){c("No wallet connector is configured.");return}try{await v({connector:x});}catch(G){if(!De(G))throw G}}}let m=l??await Re(a);if(!m){c("Wallet client is not available.");return}A(!0);let W=await Ge(p({client:o,clients:m,networkID:t}),Se);if(!P())return;if(W.ok){n();return}c(W.stage==="sign"?"Signature declined.":W.error??"Wallet sign-in failed.");}catch(m){if(!P())return;console.error("[idosgames/wallet] wallet sign-in failed:",m),c(Ae(m));}finally{P()&&(k(false),A(false));}};useEffect(()=>{!s||B.current||(B.current=true,I());},[s]);let H=async()=>{await xe(a)||await b$1()?.open();};return jsxs(Fragment,{children:[jsx("button",{type:"button",onClick:()=>{D?H():I();},disabled:r,style:{...Le,...r?{opacity:.6,cursor:"default"}:null,...p$1},children:D?"Waiting for signature \u2014 tap to open wallet":g?"Check your wallet\u2026":f?i??"Sign in with wallet":"Connect wallet"}),N&&jsx("span",{role:"alert",style:Oe,children:N})]})}var Le={padding:"11px 16px",borderRadius:"8px",border:"none",background:"#4c3fa8",color:"#fff",font:"inherit",fontWeight:600,cursor:"pointer"},Oe={display:"block",marginTop:"6px",color:"#ff9b9b",fontSize:"13px",textAlign:"center"};export{T as IDosGamesWalletProvider,Ne as WalletLogin,z as WalletLoginButton,me as createEvmWalletConfig,ve as useEvmBridge,C as useEvmBridgeClients};
1
+ import {o,n,i,h,p}from'../chunk-DMMHCUIU.js';import {a,b as b$1}from'../chunk-ZL42KPPC.js';import {b,c}from'../chunk-K62NMX3A.js';import {k as k$1}from'../chunk-HQNS6ZWL.js';export{e as arbitrum,d as base,b as bsc,j as chainById,i as idosChains,a as mainnet,f as optimism,c as polygon,h as polygonAmoy,g as sepolia}from'../chunk-HQNS6ZWL.js';import {http,createConfig,WagmiProvider,useAccount,usePublicClient,useWalletClient,useConfig,useConnect}from'wagmi';import {injected,coinbaseWallet}from'wagmi/connectors';import {WagmiAdapter}from'@reown/appkit-adapter-wagmi';import {createAppKit}from'@reown/appkit/react';import {QueryClient,QueryClientProvider}from'@tanstack/react-query';import {useState,useRef,useEffect}from'react';import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {getAccount,watchAccount,getWalletClient,getPublicClient}from'wagmi/actions';function ue(e){let{chains:o,walletConnectProjectId:t,appName:n,appUrl:r,appIcon:i,transports:l,connectors:a$1}=e,s={};for(let c of o)s[c.id]=l?.[c.id]??http();let P=r??(typeof window<"u"?window.location.origin:""),W={name:n??"iDosGames",description:n??"iDosGames game",url:P,icons:i?[i]:[]};if(t&&!a$1){let c=o.map(k$1),w=new WagmiAdapter({networks:c,projectId:t,transports:s});return a(createAppKit({adapters:[w],networks:c,projectId:t,metadata:W,features:{analytics:false,email:false,socials:false}})),w.wagmiConfig}let E=a$1??[injected(),coinbaseWallet({appName:n??"iDosGames"})];return createConfig({chains:o,connectors:E,transports:s})}function k(e){let{wagmiConfig:o,queryClient:t,children:n}=e,[r]=useState(()=>t??new QueryClient);return jsx(WagmiProvider,{config:o,children:jsx(QueryClientProvider,{client:r,children:n})})}function y(){let{address:e}=useAccount(),o=usePublicClient(),{data:t}=useWalletClient();return !e||!o||!t?null:{account:e,publicClient:o,walletClient:t}}var f="Wallet not connected.";function Pe(e,o$1){let t=y();return {connected:!!t,account:t?.account??null,loginWithWallet:(n,r)=>t?p({client:e,clients:t,networkID:n,walletAddress:r}):Promise.resolve(c("challenge",f)),depositToken:n=>t?h({client:e,clients:t,titleID:o$1,...n}):Promise.resolve(b("approve",f)),depositNft:n=>t?i({client:e,clients:t,titleID:o$1,...n}):Promise.resolve(b("deposit-onchain",f)),withdrawToken:n$1=>t?n({client:e,clients:t,...n$1}):Promise.resolve(b("withdraw-onchain",f)),withdrawNft:n=>t?o({client:e,clients:t,...n}):Promise.resolve(b("withdraw-onchain",f))}}function Ae(e){let{wagmiConfig:o,...t}=e;return jsx(k,{wagmiConfig:o,children:jsx(J,{...t})})}function De(e){return e instanceof Error&&(e.name==="ConnectorAlreadyConnectedError"||e.message.includes("already connected"))}function Re(e){let o="Wallet sign-in failed. Please try again.";return e instanceof Error?e.name==="ProviderNotFoundError"||/provider not found/i.test(e.message)?"No crypto wallet found in this browser. Install a wallet extension (e.g. MetaMask) or open this page in your wallet's browser, then try again.":e.name==="UserRejectedRequestError"||/user (rejected|denied|cancelled|canceled)/i.test(e.message)?"Request declined in the wallet.":/timed? ?out/i.test(e.message)?"The wallet did not respond. Open your wallet and try again.":o:o}async function z(e){let o=await getWalletClient(e).catch(()=>null);if(!o)return null;let t=getPublicClient(e);return t?{account:o.account.address,publicClient:t,walletClient:o}:null}function Be(e,o=18e4){return getAccount(e).isConnected?Promise.resolve(true):new Promise(t=>{let n=false,r=a=>{n||(n=true,i(),clearTimeout(l),t(a));},i=watchAccount(e,{onChange:a=>{a.isConnected&&r(true);}}),l=setTimeout(()=>r(false),o);})}function Ie(e,o=8e3){let t=n=>n==="reconnecting"||n==="connecting";return t(getAccount(e).status)?new Promise(n=>{let r=false,i=()=>{r||(r=true,l(),clearTimeout(a),n());},l=watchAccount(e,{onChange:s=>{t(s.status)||i();}}),a=setTimeout(i,o);}):Promise.resolve()}function Se(e){let o=r=>e.find(i=>i.id===r||i.type===r),t=o("injected"),n=typeof window<"u"&&window.ethereum!=null;return t&&n?t:o("walletConnect")??t??e[0]}var xe=9e4;async function Ge(e){try{let n=(await getAccount(e).connector?.getProvider?.())?.session?.peer?.metadata?.redirect,r=n?.native||n?.universal;return !r||typeof window>"u"?!1:(window.location.href=r,!0)}catch{return false}}function Le(e,o){return new Promise((t,n)=>{let r=setTimeout(()=>n(new Error("The wallet request timed out.")),o);e.then(i=>{clearTimeout(r),t(i);},i=>{clearTimeout(r),n(i instanceof Error?i:new Error(String(i)));});})}function J(e){let{client:o,networkID:t,onAuthenticated:n,disabled:r,label:i,style:l,autoStart:a}=e,s=useConfig(),{isConnected:P}=useAccount(),{connectAsync:W,connectors:E}=useConnect(),c=y(),[w,A]=useState(false),[D,m]=useState(null),[R,B]=useState(false),I=useRef(0),S=useRef(false),x=async()=>{let X=++I.current,d=()=>I.current===X;A(true),m(null);try{if(await Ie(s),!d())return;if(!getAccount(s).isConnected){let C=b$1();if(C){if(await C.open(),!await Be(s)){m("No wallet was connected.");return}}else {let G=Se(E);if(!G){m("No wallet connector is configured.");return}try{await W({connector:G});}catch(L){if(!De(L))throw L}}}let p$1=c??await z(s);if(!p$1&&getAccount(s).isConnected&&(await new Promise(C=>setTimeout(C,300)),p$1=await z(s),!d()))return;if(!p$1){m("Wallet client is not available.");return}B(!0);let T=await Le(p({client:o,clients:p$1,networkID:t}),xe);if(!d())return;if(T.ok){n();return}m(T.stage==="sign"?"Signature declined.":T.error??"Wallet sign-in failed.");}catch(p){if(!d())return;console.error("[idosgames/wallet] wallet sign-in failed:",p),m(Re(p));}finally{d()&&(A(false),B(false));}};useEffect(()=>{!a||S.current||(S.current=true,x());},[a]);let V=async()=>{await Ge(s)||await b$1()?.open();};return jsxs(Fragment,{children:[jsx("button",{type:"button",onClick:()=>{R?V():x();},disabled:r,style:{...Fe,...r?{opacity:.6,cursor:"default"}:null,...l},children:R?"Waiting for signature \u2014 tap to open wallet":w?"Check your wallet\u2026":P?i??"Sign in with wallet":"Connect wallet"}),D&&jsx("span",{role:"alert",style:Oe,children:D})]})}var Fe={padding:"11px 16px",borderRadius:"8px",border:"none",background:"#4c3fa8",color:"#fff",font:"inherit",fontWeight:600,cursor:"pointer"},Oe={display:"block",marginTop:"6px",color:"#ff9b9b",fontSize:"13px",textAlign:"center"};export{k as IDosGamesWalletProvider,Ae as WalletLogin,J as WalletLoginButton,ue as createEvmWalletConfig,Pe as useEvmBridge,y as useEvmBridgeClients};
@@ -1,2 +1,2 @@
1
- 'use strict';var wagmi=require('wagmi'),connectors=require('wagmi/connectors'),appkitAdapterWagmi=require('@reown/appkit-adapter-wagmi'),react$1=require('@reown/appkit/react'),reactQuery=require('@tanstack/react-query'),react=require('react'),jsxRuntime=require('react/jsx-runtime'),viem=require('viem'),core=require('@idosgames/core'),actions=require('wagmi/actions'),appkitAdapterSolana=require('@reown/appkit-adapter-solana');var pt=Object.defineProperty;var f=(t,e)=>()=>(t&&(e=t(t=0)),e);var Pe=(t,e)=>{for(var n in e)pt(t,n,{get:e[n],enumerable:true});};function ie(t){return Object.values(exports.idosChains).find(e=>e.id===t)}function Se(t){return {...t,chainNamespace:"eip155",caipNetworkId:`eip155:${t.id}`}}exports.mainnet=void 0;exports.bsc=void 0;exports.polygon=void 0;exports.base=void 0;exports.arbitrum=void 0;exports.optimism=void 0;exports.sepolia=void 0;exports.polygonAmoy=void 0;exports.idosChains=void 0;exports.solanaMainnet=void 0;exports.solanaDevnet=void 0;var E=f(()=>{exports.mainnet={id:1,name:"Ethereum",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://eth.llamarpc.com"]}},blockExplorers:{default:{name:"Etherscan",url:"https://etherscan.io"}}},exports.bsc={id:56,name:"BNB Smart Chain",nativeCurrency:{name:"BNB",symbol:"BNB",decimals:18},rpcUrls:{default:{http:["https://bsc-dataseed.binance.org"]}},blockExplorers:{default:{name:"BscScan",url:"https://bscscan.com"}}},exports.polygon={id:137,name:"Polygon",nativeCurrency:{name:"POL",symbol:"POL",decimals:18},rpcUrls:{default:{http:["https://polygon-rpc.com"]}},blockExplorers:{default:{name:"PolygonScan",url:"https://polygonscan.com"}}},exports.base={id:8453,name:"Base",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://mainnet.base.org"]}},blockExplorers:{default:{name:"BaseScan",url:"https://basescan.org"}}},exports.arbitrum={id:42161,name:"Arbitrum One",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://arb1.arbitrum.io/rpc"]}},blockExplorers:{default:{name:"Arbiscan",url:"https://arbiscan.io"}}},exports.optimism={id:10,name:"OP Mainnet",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://mainnet.optimism.io"]}},blockExplorers:{default:{name:"Optimistic Etherscan",url:"https://optimistic.etherscan.io"}}},exports.sepolia={id:11155111,name:"Sepolia",testnet:true,nativeCurrency:{name:"Sepolia Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://rpc.sepolia.org"]}},blockExplorers:{default:{name:"Etherscan",url:"https://sepolia.etherscan.io"}}},exports.polygonAmoy={id:80002,name:"Polygon Amoy",testnet:true,nativeCurrency:{name:"POL",symbol:"POL",decimals:18},rpcUrls:{default:{http:["https://rpc-amoy.polygon.technology"]}},blockExplorers:{default:{name:"PolygonScan",url:"https://amoy.polygonscan.com"}}},exports.idosChains={mainnet:exports.mainnet,bsc:exports.bsc,polygon:exports.polygon,base:exports.base,arbitrum:exports.arbitrum,optimism:exports.optimism,sepolia:exports.sepolia,polygonAmoy:exports.polygonAmoy};exports.solanaMainnet={id:"5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",name:"Solana",network:"solana-mainnet",nativeCurrency:{name:"Solana",symbol:"SOL",decimals:9},rpcUrls:{default:{http:["https://api.mainnet-beta.solana.com"]}},blockExplorers:{default:{name:"Solscan",url:"https://solscan.io"}},testnet:false,chainNamespace:"solana",caipNetworkId:"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp"},exports.solanaDevnet={id:"EtWTRABZaYq6iMfeYKouRu166VU2xqa1",name:"Solana Devnet",network:"solana-devnet",nativeCurrency:{name:"Solana",symbol:"SOL",decimals:9},rpcUrls:{default:{http:["https://api.devnet.solana.com"]}},blockExplorers:{default:{name:"Solscan",url:"https://solscan.io"}},testnet:true,chainNamespace:"solana",caipNetworkId:"solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1"};});function te(t){xe=t;}function D(){return xe}var xe,O=f(()=>{xe=null;});function Ee(t){let{chains:e,walletConnectProjectId:n,appName:o,appUrl:a,appIcon:r,transports:p,connectors:s}=t,i={};for(let u of e)i[u.id]=p?.[u.id]??wagmi.http();let c=a??(typeof window<"u"?window.location.origin:""),l={name:o??"iDosGames",description:o??"iDosGames game",url:c,icons:r?[r]:[]};if(n&&!s){let u=e.map(Se),g=new appkitAdapterWagmi.WagmiAdapter({networks:u,projectId:n,transports:i});return te(react$1.createAppKit({adapters:[g],networks:u,projectId:n,metadata:l,features:{analytics:false,email:false,socials:false}})),g.wagmiConfig}let m=s??[connectors.injected(),connectors.coinbaseWallet({appName:o??"iDosGames"})];return wagmi.createConfig({chains:e,connectors:m,transports:i})}var De=f(()=>{E();O();});function ne(t){let{wagmiConfig:e,queryClient:n,children:o}=t,[a]=react.useState(()=>n??new reactQuery.QueryClient);return jsxRuntime.jsx(wagmi.WagmiProvider,{config:e,children:jsxRuntime.jsx(reactQuery.QueryClientProvider,{client:a,children:o})})}var le=f(()=>{});var oe,Ne,ce,Re,pe=f(()=>{oe=[{type:"function",name:"depositERC20",stateMutability:"nonpayable",inputs:[{name:"token",type:"address"},{name:"amount",type:"uint256"},{name:"userID",type:"string"},{name:"titleID",type:"string"},{name:"category",type:"string"}],outputs:[{name:"",type:"bool"}]},{type:"function",name:"withdrawERC20",stateMutability:"nonpayable",inputs:[{name:"token",type:"address"},{name:"to",type:"address"},{name:"amount",type:"uint256"},{name:"burnAmount",type:"uint256"},{name:"nonce",type:"uint256"},{name:"signature",type:"bytes"},{name:"userID",type:"string"},{name:"titleID",type:"string"},{name:"category",type:"string"},{name:"deadline",type:"uint256"}],outputs:[]},{type:"function",name:"withdrawERC1155",stateMutability:"nonpayable",inputs:[{name:"token",type:"address"},{name:"to",type:"address"},{name:"id",type:"uint256"},{name:"amount",type:"uint256"},{name:"nonce",type:"uint256"},{name:"signature",type:"bytes"},{name:"userID",type:"string"},{name:"titleID",type:"string"},{name:"category",type:"string"},{name:"deadline",type:"uint256"}],outputs:[]},{type:"function",name:"withdrawERC721",stateMutability:"nonpayable",inputs:[{name:"token",type:"address"},{name:"to",type:"address"},{name:"tokenId",type:"uint256"},{name:"nonce",type:"uint256"},{name:"signature",type:"bytes"},{name:"userID",type:"string"},{name:"titleID",type:"string"},{name:"category",type:"string"},{name:"deadline",type:"uint256"}],outputs:[]}],Ne=[{type:"function",name:"withdrawERC1155Mint",stateMutability:"nonpayable",inputs:[{name:"collection",type:"address"},{name:"to",type:"address"},{name:"id",type:"uint256"},{name:"amount",type:"uint256"},{name:"nonce",type:"uint256"},{name:"signature",type:"bytes"},{name:"userID",type:"string"},{name:"titleID",type:"string"},{name:"category",type:"string"},{name:"deadline",type:"uint256"}],outputs:[]},{type:"function",name:"withdrawERC721Mint",stateMutability:"nonpayable",inputs:[{name:"collection",type:"address"},{name:"to",type:"address"},{name:"tokenId",type:"uint256"},{name:"nonce",type:"uint256"},{name:"signature",type:"bytes"},{name:"userID",type:"string"},{name:"titleID",type:"string"},{name:"category",type:"string"},{name:"deadline",type:"uint256"}],outputs:[]}],ce=[{type:"function",name:"approve",stateMutability:"nonpayable",inputs:[{name:"spender",type:"address"},{name:"amount",type:"uint256"}],outputs:[{name:"",type:"bool"}]},{type:"function",name:"allowance",stateMutability:"view",inputs:[{name:"owner",type:"address"},{name:"spender",type:"address"}],outputs:[{name:"",type:"uint256"}]},{type:"function",name:"decimals",stateMutability:"view",inputs:[],outputs:[{name:"",type:"uint8"}]},{type:"function",name:"balanceOf",stateMutability:"view",inputs:[{name:"account",type:"address"}],outputs:[{name:"",type:"uint256"}]}],Re=[{type:"function",name:"safeTransferFrom",stateMutability:"nonpayable",inputs:[{name:"from",type:"address"},{name:"to",type:"address"},{name:"id",type:"uint256"},{name:"amount",type:"uint256"},{name:"data",type:"bytes"}],outputs:[]},{type:"function",name:"isApprovedForAll",stateMutability:"view",inputs:[{name:"account",type:"address"},{name:"operator",type:"address"}],outputs:[{name:"",type:"bool"}]},{type:"function",name:"setApprovalForAll",stateMutability:"nonpayable",inputs:[{name:"operator",type:"address"},{name:"approved",type:"bool"}],outputs:[]},{type:"function",name:"balanceOf",stateMutability:"view",inputs:[{name:"account",type:"address"},{name:"id",type:"uint256"}],outputs:[{name:"",type:"uint256"}]}];});function Be(t,e,n){return viem.encodeAbiParameters([{type:"string"},{type:"string"},{type:"string"}],[t,e,core.normalizeBlockchainCategory(n)])}var Le=f(()=>{});async function S(t,e){let{walletClient:n,publicClient:o,account:a}=t,r=await n.writeContract({address:e.address,abi:e.abi,functionName:e.functionName,args:e.args,account:a,chain:n.chain,value:e.value});if((await o.waitForTransactionReceipt({hash:r})).status==="reverted")throw new Error(`On-chain transaction reverted (${r}).`);return r}var de=f(()=>{});function w(t){return t instanceof viem.BaseError?t.shortMessage:t instanceof Error?t.message:String(t)}function d(t,e,n){return {ok:false,stage:t,error:e,...n}}function h(t,e){return {ok:false,stage:t,error:e}}var T=f(()=>{});function Me(t){let e=t.RewardPoolAddress;return e||null}async function Fe(t,e,n,o){return await t.publicClient.readContract({address:e,abi:ce,functionName:"allowance",args:[t.account,n]})>=o?null:S(t,{address:e,abi:ce,functionName:"approve",args:[n,o]})}async function ue(t){let{client:e,clients:n,network:o,tokenAddress:a,amount:r,titleID:p,category:s}=t,i=e.auth.context?.userID;if(!i)return d("approve","Not logged in.");let c=Me(o);if(!c)return d("approve","Network has no RewardPoolAddress.");if(r<=0n)return d("approve","Amount must be positive.");try{await Fe(n,a,c,r);}catch(u){return d("approve",w(u))}let l;try{l=await S(n,{address:c,abi:oe,functionName:"depositERC20",args:[a,r,i,p,s??""]});}catch(u){return d("deposit-onchain",w(u))}let m=await e.blockchain.depositToken(o.NetworkID??"",l);return m.ok?{ok:true,onChainTxHash:l,data:m.data}:d("report",m.error,{onChainTxHash:l})}async function me(t){let{client:e,clients:n,network:o,nftContractAddress:a,tokenId:r,amount:p,titleID:s,category:i}=t,c=e.auth.context?.userID;if(!c)return d("deposit-onchain","Not logged in.");let l=Me(o);if(!l)return d("deposit-onchain","Network has no RewardPoolAddress.");if(p<=0n)return d("deposit-onchain","Amount must be positive.");let m=Be(c,s,i),u;try{u=await S(n,{address:a,abi:Re,functionName:"safeTransferFrom",args:[n.account,l,r,p,m]});}catch(y){return d("deposit-onchain",w(y))}let g=await e.blockchain.depositNFT(o.NetworkID??"",u);return g.ok?{ok:true,onChainTxHash:u,data:g.data}:d("report",g.error,{onChainTxHash:u})}var Ke=f(()=>{pe();Le();de();T();});async function He(t,e){return S(t,{address:e.ContractAddress,abi:oe,functionName:"withdrawERC20",args:[e.TokenAddress,e.WalletAddress,BigInt(e.Amount??"0"),BigInt(e.BurnAmount??"0"),BigInt(e.Nonce??"0"),e.Signature??"0x",e.UserID??"",e.TitleID??"",e.Category??"",BigInt(e.Deadline??"0")]})}async function Ge(t,e){return S(t,{address:e.ContractAddress,abi:Ne,functionName:"withdrawERC1155Mint",args:[e.TokenAddress,e.WalletAddress,BigInt(e.TokenId??"0"),BigInt(e.Amount??"0"),BigInt(e.Nonce??"0"),e.Signature??"0x",e.UserID??"",e.TitleID??"",e.Category??"",BigInt(e.Deadline??"0")]})}async function ge(t){let{client:e,clients:n,currencyID:o,networkID:a,walletAddress:r,amount:p,category:s}=t,i=await e.blockchain.requestTokenWithdrawal(o,a,r,p,s);if(!i.ok)return d("request",i.error);let c=i.data.EvmSignature,l=i.data.TitleTransactionID??void 0;if(!c)return d("request","Withdrawal response carried no EVM signature.",{titleTransactionID:l});let m;try{m=await He(n,c);}catch(g){return d("withdraw-onchain",w(g),{titleTransactionID:l})}let u=await Oe(e,l,m);return u.ok?{ok:true,onChainTxHash:m,data:i.data}:u}async function fe(t){let{client:e,clients:n,itemID:o,networkID:a,walletAddress:r,amount:p,category:s}=t,i=await e.blockchain.requestNFTWithdrawal(o,a,r,p,s);if(!i.ok)return d("request",i.error);let c=i.data.EvmSignature,l=i.data.TitleTransactionID??void 0;if(!c)return d("request","Withdrawal response carried no EVM signature.",{titleTransactionID:l});let m;try{m=await Ge(n,c);}catch(g){return d("withdraw-onchain",w(g),{titleTransactionID:l})}let u=await Oe(e,l,m);return u.ok?{ok:true,onChainTxHash:m,data:i.data}:u}async function Oe(t,e,n){if(!e)return d("confirm","Missing TitleTransactionID.",{onChainTxHash:n});let o=await t.blockchain.confirmWithdrawal(e,n);return o.ok?{ok:true,onChainTxHash:n,data:o.data}:d("confirm",o.error,{onChainTxHash:n,titleTransactionID:e})}var Ue=f(()=>{pe();de();T();});async function U(t){let{client:e,clients:n,networkID:o}=t,a=t.walletAddress??n.account,r=await e.auth.requestWalletChallenge(a,o);if(!r.ok)return h("challenge",r.error);let p;try{p=await n.walletClient.signMessage({account:n.account,message:r.data.Message});}catch(i){return h("sign",w(i))}let s=await e.auth.loginWithWallet(a,o,p);return s.ok?{ok:true,data:s.data}:h("login",s.error)}var qe=f(()=>{T();});var ye=f(()=>{Ke();Ue();qe();});function z(){let{address:t}=wagmi.useAccount(),e=wagmi.usePublicClient(),{data:n}=wagmi.useWalletClient();return !t||!e||!n?null:{account:t,publicClient:e,walletClient:n}}function ze(t,e){let n=z();return {connected:!!n,account:n?.account??null,loginWithWallet:(o,a)=>n?U({client:t,clients:n,networkID:o,walletAddress:a}):Promise.resolve(h("challenge",q)),depositToken:o=>n?ue({client:t,clients:n,titleID:e,...o}):Promise.resolve(d("approve",q)),depositNft:o=>n?me({client:t,clients:n,titleID:e,...o}):Promise.resolve(d("deposit-onchain",q)),withdrawToken:o=>n?ge({client:t,clients:n,...o}):Promise.resolve(d("withdraw-onchain",q)),withdrawNft:o=>n?fe({client:t,clients:n,...o}):Promise.resolve(d("withdraw-onchain",q))}}var q,we=f(()=>{ye();T();q="Wallet not connected.";});function Ye(t){let{wagmiConfig:e,...n}=t;return jsxRuntime.jsx(ne,{wagmiConfig:e,children:jsxRuntime.jsx(Ce,{...n})})}function Bt(t){return t instanceof Error&&(t.name==="ConnectorAlreadyConnectedError"||t.message.includes("already connected"))}function Lt(t){let e="Wallet sign-in failed. Please try again.";return t instanceof Error?t.name==="ProviderNotFoundError"||/provider not found/i.test(t.message)?"No crypto wallet found in this browser. Install a wallet extension (e.g. MetaMask) or open this page in your wallet's browser, then try again.":t.name==="UserRejectedRequestError"||/user (rejected|denied|cancelled|canceled)/i.test(t.message)?"Request declined in the wallet.":/timed? ?out/i.test(t.message)?"The wallet did not respond. Open your wallet and try again.":e:e}async function Mt(t){let e=await actions.getWalletClient(t).catch(()=>null);if(!e)return null;let n=actions.getPublicClient(t);return n?{account:e.account.address,publicClient:n,walletClient:e}:null}function Ft(t,e=18e4){return actions.getAccount(t).isConnected?Promise.resolve(true):new Promise(n=>{let o=false,a=s=>{o||(o=true,r(),clearTimeout(p),n(s));},r=actions.watchAccount(t,{onChange:s=>{s.isConnected&&a(true);}}),p=setTimeout(()=>a(false),e);})}function Kt(t){let e=a=>t.find(r=>r.id===a||r.type===a),n=e("injected"),o=typeof window<"u"&&window.ethereum!=null;return n&&o?n:e("walletConnect")??n??t[0]}async function Gt(t){try{let o=(await actions.getAccount(t).connector?.getProvider?.())?.session?.peer?.metadata?.redirect,a=o?.native||o?.universal;return !a||typeof window>"u"?!1:(window.location.href=a,!0)}catch{return false}}function Ot(t,e){return new Promise((n,o)=>{let a=setTimeout(()=>o(new Error("The wallet request timed out.")),e);t.then(r=>{clearTimeout(a),n(r);},r=>{clearTimeout(a),o(r instanceof Error?r:new Error(String(r)));});})}function Ce(t){let{client:e,networkID:n,onAuthenticated:o,disabled:a,label:r,style:p,autoStart:s}=t,i=wagmi.useConfig(),{isConnected:c}=wagmi.useAccount(),{connectAsync:l,connectors:m}=wagmi.useConnect(),u=z(),[g,y]=react.useState(false),[C,b]=react.useState(null),[R,B]=react.useState(false),P=react.useRef(0),L=react.useRef(false),v=async()=>{let F=++P.current,K=()=>P.current===F;y(true),b(null);try{if(!c){let x=D();if(x){if(await x.open(),!await Ft(i)){b("No wallet was connected.");return}}else {let H=Kt(m);if(!H){b("No wallet connector is configured.");return}try{await l({connector:H});}catch(k){if(!Bt(k))throw k}}}let W=u??await Mt(i);if(!W){b("Wallet client is not available.");return}B(!0);let A=await Ot(U({client:e,clients:W,networkID:n}),Ht);if(!K())return;if(A.ok){o();return}b(A.stage==="sign"?"Signature declined.":A.error??"Wallet sign-in failed.");}catch(W){if(!K())return;console.error("[idosgames/wallet] wallet sign-in failed:",W),b(Lt(W));}finally{K()&&(y(false),B(false));}};react.useEffect(()=>{!s||L.current||(L.current=true,v());},[s]);let M=async()=>{await Gt(i)||await D()?.open();};return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("button",{type:"button",onClick:()=>{R?M():v();},disabled:a,style:{...Ut,...a?{opacity:.6,cursor:"default"}:null,...p},children:R?"Waiting for signature \u2014 tap to open wallet":g?"Check your wallet\u2026":c?r??"Sign in with wallet":"Connect wallet"}),C&&jsxRuntime.jsx("span",{role:"alert",style:qt,children:C})]})}var Ht,Ut,qt,Qe=f(()=>{O();ye();le();we();Ht=9e4;Ut={padding:"11px 16px",borderRadius:"8px",border:"none",background:"#4c3fa8",color:"#fff",font:"inherit",fontWeight:600,cursor:"pointer"},qt={display:"block",marginTop:"6px",color:"#ff9b9b",fontSize:"13px",textAlign:"center"};});var Ve={};Pe(Ve,{IDosGamesWalletProvider:()=>ne,WalletLogin:()=>Ye,WalletLoginButton:()=>Ce,arbitrum:()=>exports.arbitrum,base:()=>exports.base,bsc:()=>exports.bsc,chainById:()=>ie,createEvmWalletConfig:()=>Ee,idosChains:()=>exports.idosChains,mainnet:()=>exports.mainnet,optimism:()=>exports.optimism,polygon:()=>exports.polygon,polygonAmoy:()=>exports.polygonAmoy,sepolia:()=>exports.sepolia,useEvmBridge:()=>ze,useEvmBridgeClients:()=>z});var Ze=f(()=>{De();E();le();we();Qe();});function $e(t){let{walletConnectProjectId:e,appName:n,appUrl:o,appIcon:a,wallets:r}=t,p=t.networks??[exports.solanaMainnet],s=o??(typeof window<"u"?window.location.origin:""),i={name:n??"iDosGames",description:n??"iDosGames game",url:s,icons:a?[a]:[]},c=new appkitAdapterSolana.SolanaAdapter(r?{wallets:r}:{});return te(react$1.createAppKit({adapters:[c],networks:p,projectId:e,metadata:i,features:{analytics:false,email:false,socials:false}})),c}var Je=f(()=>{E();O();});async function be(t){let{client:e,adapter:n,network:o,mint:a,amountRaw:r,titleID:p,category:s}=t,i=e.auth.context?.userID;if(!i)return d("deposit-onchain","Not logged in.");if(r<=0n)return d("deposit-onchain","Amount must be positive.");let c;try{c=await n.depositSpl({mint:a,amountRaw:r,userID:i,titleID:p,category:core.normalizeBlockchainCategory(s)});}catch(m){return d("deposit-onchain",w(m))}let l=await e.blockchain.depositToken(o.NetworkID??"",c);return l.ok?{ok:true,onChainTxHash:c,data:l.data}:d("report",l.error,{onChainTxHash:c})}async function ke(t){let{client:e,adapter:n,currencyID:o,networkID:a,walletAddress:r,amount:p,category:s}=t,i=await e.blockchain.requestTokenWithdrawal(o,a,r,p,s);if(!i.ok)return d("request",i.error);let c=i.data.SolanaSignature,l=i.data.TitleTransactionID??void 0;if(!c)return d("request","Withdrawal response carried no Solana signature.",{titleTransactionID:l});let m;try{m=await n.submitWithdrawal(c);}catch(g){return d("withdraw-onchain",w(g),{titleTransactionID:l})}if(!l)return d("confirm","Missing TitleTransactionID.",{onChainTxHash:m});let u=await e.blockchain.confirmWithdrawal(l,m);return u.ok?{ok:true,onChainTxHash:m,data:i.data}:d("confirm",u.error,{onChainTxHash:m,titleTransactionID:l})}var Xe=f(()=>{T();});async function j(t){let{client:e,networkID:n,walletAddress:o,signMessage:a}=t,r=await e.auth.requestWalletChallenge(o,n);if(!r.ok)return h("challenge",r.error);let p;try{let i=await a(new TextEncoder().encode(r.data.Message));p=Vt(i);}catch(i){return h("sign",w(i))}let s=await e.auth.loginWithWallet(o,n,p);return s.ok?{ok:true,data:s.data}:h("login",s.error)}function Vt(t){let e="0x";for(let n of t)e+=n.toString(16).padStart(2,"0");return e}var et=f(()=>{T();});var ve=f(()=>{Xe();et();});function nt(t,e,n){let{address:o}=react$1.useAppKitAccount(),{walletProvider:a}=react$1.useAppKitProvider("solana"),r=o??null,p=a?.signMessage?.bind(a);return {connected:!!r,account:r,loginWithWallet:(s,i)=>{let c=i??r;return c?p?j({client:t,networkID:s,walletAddress:c,signMessage:p}):Promise.resolve(h("sign","The connected wallet does not support message signing.")):Promise.resolve(h("challenge",tt))},depositToken:s=>be({client:t,adapter:n,titleID:e,...s}),withdrawToken:s=>{let i=s.walletAddress??r;return i?ke({client:t,adapter:n,...s,walletAddress:i}):Promise.resolve(d("request",tt))}}}var tt,ot=f(()=>{ve();T();tt="Wallet not connected.";});function nn(t){try{let n=t?.session?.peer?.metadata?.redirect,o=n?.native||n?.universal;return !o||typeof window>"u"?!1:(window.location.href=o,!0)}catch{return false}}function on(t,e){return new Promise((n,o)=>{let a=setTimeout(()=>o(new Error("The wallet request timed out.")),e);t.then(r=>{clearTimeout(a),n(r);},r=>{clearTimeout(a),o(r instanceof Error?r:new Error(String(r)));});})}function rn(t){let e="Wallet sign-in failed. Please try again.";return t instanceof Error?/user (rejected|denied|cancelled|canceled)|rejected the request/i.test(t.message)?"Request declined in the wallet.":/timed? ?out/i.test(t.message)?"The wallet did not respond. Open your wallet and try again.":e:e}function at(t){let{client:e,networkID:n,onAuthenticated:o,disabled:a,label:r,style:p,autoStart:s}=t,{address:i,isConnected:c}=react$1.useAppKitAccount(),{walletProvider:l}=react$1.useAppKitProvider("solana"),[m,u]=react.useState(false),[g,y]=react.useState(null),[C,b]=react.useState(false),[R,B]=react.useState(false),P=react.useRef(null),L=react.useRef(0),v=react.useCallback(()=>{P.current&&clearTimeout(P.current),P.current=null;},[]);react.useEffect(()=>v,[v]);let M=react.useRef(false),F=react.useCallback(async()=>{let A=++L.current,x=()=>L.current===A,H=l?.signMessage?.bind(l);if(!i||!H){y("The connected wallet cannot sign messages."),u(false);return}u(true),y(null);try{B(!0);let k=await on(j({client:e,networkID:n,walletAddress:i,signMessage:H}),tn);if(!x())return;if(k.ok){o();return}y(k.stage==="sign"?"Signature declined.":k.error??"Wallet sign-in failed.");}catch(k){if(!x())return;console.error("[idosgames/wallet] solana sign-in failed:",k),y(rn(k));}finally{x()&&(u(false),B(false));}},[i,l,e,n,o]),K=react.useCallback(()=>{nn(l)||D()?.open();},[l]);react.useEffect(()=>{!C||!c||!i||!l||(b(false),v(),F());},[C,c,i,l,F,v]);let W=()=>{if(R){K();return}if(y(null),M.current=true,c&&i&&l){F();return}let A=D();if(!A){y("Wallet sign-in is not configured for this title.");return}u(true),b(true),v(),P.current=setTimeout(()=>{b(false),u(false),y("No wallet was connected.");},en),A.open();};return react.useEffect(()=>{!s||M.current||(M.current=true,W());},[s]),jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("button",{type:"button",onClick:W,disabled:a,style:{...an,...a?{opacity:.6,cursor:"default"}:null,...p},children:R?"Waiting for signature \u2014 tap to open wallet":m?"Check your wallet\u2026":c?r??"Sign in with wallet":"Connect wallet"}),g&&jsxRuntime.jsx("span",{role:"alert",style:sn,children:g})]})}var en,tn,an,sn,it=f(()=>{ve();O();en=18e4,tn=9e4;an={padding:"11px 16px",borderRadius:"8px",border:"none",background:"#4c3fa8",color:"#fff",font:"inherit",fontWeight:600,cursor:"pointer"},sn={display:"block",marginTop:"6px",color:"#ff9b9b",fontSize:"13px",textAlign:"center"};});var st={};Pe(st,{SolanaWalletLogin:()=>at,createSolanaWalletConfig:()=>$e,solanaDevnet:()=>exports.solanaDevnet,solanaMainnet:()=>exports.solanaMainnet,useSolanaBridge:()=>nt});var lt=f(()=>{Je();ot();it();E();});var pn={padding:"11px 16px",borderRadius:"8px",border:"none",background:"#4c3fa8",color:"#fff",font:"inherit",fontWeight:600,cursor:"pointer"},dn={display:"block",marginTop:"6px",color:"#ff9b9b",fontSize:"13px",textAlign:"center"};function ct(t){let{loading:e,disabled:n,label:o,style:a,error:r,onClick:p}=t;return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("button",{type:"button",onClick:p,disabled:n||e,style:{...pn,...n||e?{opacity:.6,cursor:"default"}:null,...a},children:e?"Loading wallet\u2026":o??"Sign in with wallet"}),r&&jsxRuntime.jsx("span",{role:"alert",style:dn,children:r})]})}function un(t){let{chains:e,walletConnectProjectId:n,appName:o,disabled:a,label:r,style:p,...s}=t,[i,c]=react.useState(null),[l,m]=react.useState(false),[u,g]=react.useState(null),y=()=>{m(true),g(null),(async()=>{try{let C=await Promise.resolve().then(()=>(Ze(),Ve)),b=C.createEvmWalletConfig({chains:e,walletConnectProjectId:n,appName:o});c({mod:C,config:b});}catch(C){console.error("[idosgames/wallet] failed to load the wallet module:",C),g("Could not load the wallet. Please try again.");}finally{m(false);}})();};if(i){let{WalletLogin:C}=i.mod;return jsxRuntime.jsx(C,{...s,wagmiConfig:i.config,disabled:a,label:r,style:p,autoStart:true})}return jsxRuntime.jsx(ct,{loading:l,disabled:a,label:r,style:p,error:u,onClick:y})}function mn(t){let{walletConnectProjectId:e,appName:n,disabled:o,label:a,style:r,...p}=t,[s,i]=react.useState(null),[c,l]=react.useState(false),[m,u]=react.useState(null),g=()=>{l(true),u(null),(async()=>{try{let y=await Promise.resolve().then(()=>(lt(),st));e&&y.createSolanaWalletConfig({walletConnectProjectId:e,appName:n}),i(y);}catch(y){console.error("[idosgames/wallet] failed to load the wallet module:",y),u("Could not load the wallet. Please try again.");}finally{l(false);}})();};if(s){let{SolanaWalletLogin:y}=s;return jsxRuntime.jsx(y,{...p,disabled:o,label:a,style:r,autoStart:true})}return jsxRuntime.jsx(ct,{loading:c,disabled:o,label:a,style:r,error:m,onClick:g})}E();
2
- exports.LazySolanaWalletLogin=mn;exports.LazyWalletLogin=un;exports.chainById=ie;
1
+ 'use strict';var wagmi=require('wagmi'),connectors=require('wagmi/connectors'),appkitAdapterWagmi=require('@reown/appkit-adapter-wagmi'),react$1=require('@reown/appkit/react'),reactQuery=require('@tanstack/react-query'),react=require('react'),jsxRuntime=require('react/jsx-runtime'),viem=require('viem'),core=require('@idosgames/core'),actions=require('wagmi/actions'),appkitAdapterSolana=require('@reown/appkit-adapter-solana');var ut=Object.defineProperty;var f=(t,e)=>()=>(t&&(e=t(t=0)),e);var Se=(t,e)=>{for(var n in e)ut(t,n,{get:e[n],enumerable:true});};function se(t){return Object.values(exports.idosChains).find(e=>e.id===t)}function xe(t){return {...t,chainNamespace:"eip155",caipNetworkId:`eip155:${t.id}`}}exports.mainnet=void 0;exports.bsc=void 0;exports.polygon=void 0;exports.base=void 0;exports.arbitrum=void 0;exports.optimism=void 0;exports.sepolia=void 0;exports.polygonAmoy=void 0;exports.idosChains=void 0;exports.solanaMainnet=void 0;exports.solanaDevnet=void 0;var D=f(()=>{exports.mainnet={id:1,name:"Ethereum",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://eth.llamarpc.com"]}},blockExplorers:{default:{name:"Etherscan",url:"https://etherscan.io"}}},exports.bsc={id:56,name:"BNB Smart Chain",nativeCurrency:{name:"BNB",symbol:"BNB",decimals:18},rpcUrls:{default:{http:["https://bsc-dataseed.binance.org"]}},blockExplorers:{default:{name:"BscScan",url:"https://bscscan.com"}}},exports.polygon={id:137,name:"Polygon",nativeCurrency:{name:"POL",symbol:"POL",decimals:18},rpcUrls:{default:{http:["https://polygon-rpc.com"]}},blockExplorers:{default:{name:"PolygonScan",url:"https://polygonscan.com"}}},exports.base={id:8453,name:"Base",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://mainnet.base.org"]}},blockExplorers:{default:{name:"BaseScan",url:"https://basescan.org"}}},exports.arbitrum={id:42161,name:"Arbitrum One",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://arb1.arbitrum.io/rpc"]}},blockExplorers:{default:{name:"Arbiscan",url:"https://arbiscan.io"}}},exports.optimism={id:10,name:"OP Mainnet",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://mainnet.optimism.io"]}},blockExplorers:{default:{name:"Optimistic Etherscan",url:"https://optimistic.etherscan.io"}}},exports.sepolia={id:11155111,name:"Sepolia",testnet:true,nativeCurrency:{name:"Sepolia Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://rpc.sepolia.org"]}},blockExplorers:{default:{name:"Etherscan",url:"https://sepolia.etherscan.io"}}},exports.polygonAmoy={id:80002,name:"Polygon Amoy",testnet:true,nativeCurrency:{name:"POL",symbol:"POL",decimals:18},rpcUrls:{default:{http:["https://rpc-amoy.polygon.technology"]}},blockExplorers:{default:{name:"PolygonScan",url:"https://amoy.polygonscan.com"}}},exports.idosChains={mainnet:exports.mainnet,bsc:exports.bsc,polygon:exports.polygon,base:exports.base,arbitrum:exports.arbitrum,optimism:exports.optimism,sepolia:exports.sepolia,polygonAmoy:exports.polygonAmoy};exports.solanaMainnet={id:"5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",name:"Solana",network:"solana-mainnet",nativeCurrency:{name:"Solana",symbol:"SOL",decimals:9},rpcUrls:{default:{http:["https://api.mainnet-beta.solana.com"]}},blockExplorers:{default:{name:"Solscan",url:"https://solscan.io"}},testnet:false,chainNamespace:"solana",caipNetworkId:"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp"},exports.solanaDevnet={id:"EtWTRABZaYq6iMfeYKouRu166VU2xqa1",name:"Solana Devnet",network:"solana-devnet",nativeCurrency:{name:"Solana",symbol:"SOL",decimals:9},rpcUrls:{default:{http:["https://api.devnet.solana.com"]}},blockExplorers:{default:{name:"Solscan",url:"https://solscan.io"}},testnet:true,chainNamespace:"solana",caipNetworkId:"solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1"};});function ne(t){Ee=t;}function I(){return Ee}var Ee,O=f(()=>{Ee=null;});function De(t){let{chains:e,walletConnectProjectId:n,appName:o,appUrl:i,appIcon:r,transports:c,connectors:s}=t,a={};for(let u of e)a[u.id]=c?.[u.id]??wagmi.http();let p=i??(typeof window<"u"?window.location.origin:""),l={name:o??"iDosGames",description:o??"iDosGames game",url:p,icons:r?[r]:[]};if(n&&!s){let u=e.map(xe),g=new appkitAdapterWagmi.WagmiAdapter({networks:u,projectId:n,transports:a});return ne(react$1.createAppKit({adapters:[g],networks:u,projectId:n,metadata:l,features:{analytics:false,email:false,socials:false}})),g.wagmiConfig}let m=s??[connectors.injected(),connectors.coinbaseWallet({appName:o??"iDosGames"})];return wagmi.createConfig({chains:e,connectors:m,transports:a})}var Ie=f(()=>{D();O();});function oe(t){let{wagmiConfig:e,queryClient:n,children:o}=t,[i]=react.useState(()=>n??new reactQuery.QueryClient);return jsxRuntime.jsx(wagmi.WagmiProvider,{config:e,children:jsxRuntime.jsx(reactQuery.QueryClientProvider,{client:i,children:o})})}var ce=f(()=>{});var re,Re,pe,Be,de=f(()=>{re=[{type:"function",name:"depositERC20",stateMutability:"nonpayable",inputs:[{name:"token",type:"address"},{name:"amount",type:"uint256"},{name:"userID",type:"string"},{name:"titleID",type:"string"},{name:"category",type:"string"}],outputs:[{name:"",type:"bool"}]},{type:"function",name:"withdrawERC20",stateMutability:"nonpayable",inputs:[{name:"token",type:"address"},{name:"to",type:"address"},{name:"amount",type:"uint256"},{name:"burnAmount",type:"uint256"},{name:"nonce",type:"uint256"},{name:"signature",type:"bytes"},{name:"userID",type:"string"},{name:"titleID",type:"string"},{name:"category",type:"string"},{name:"deadline",type:"uint256"}],outputs:[]},{type:"function",name:"withdrawERC1155",stateMutability:"nonpayable",inputs:[{name:"token",type:"address"},{name:"to",type:"address"},{name:"id",type:"uint256"},{name:"amount",type:"uint256"},{name:"nonce",type:"uint256"},{name:"signature",type:"bytes"},{name:"userID",type:"string"},{name:"titleID",type:"string"},{name:"category",type:"string"},{name:"deadline",type:"uint256"}],outputs:[]},{type:"function",name:"withdrawERC721",stateMutability:"nonpayable",inputs:[{name:"token",type:"address"},{name:"to",type:"address"},{name:"tokenId",type:"uint256"},{name:"nonce",type:"uint256"},{name:"signature",type:"bytes"},{name:"userID",type:"string"},{name:"titleID",type:"string"},{name:"category",type:"string"},{name:"deadline",type:"uint256"}],outputs:[]}],Re=[{type:"function",name:"withdrawERC1155Mint",stateMutability:"nonpayable",inputs:[{name:"collection",type:"address"},{name:"to",type:"address"},{name:"id",type:"uint256"},{name:"amount",type:"uint256"},{name:"nonce",type:"uint256"},{name:"signature",type:"bytes"},{name:"userID",type:"string"},{name:"titleID",type:"string"},{name:"category",type:"string"},{name:"deadline",type:"uint256"}],outputs:[]},{type:"function",name:"withdrawERC721Mint",stateMutability:"nonpayable",inputs:[{name:"collection",type:"address"},{name:"to",type:"address"},{name:"tokenId",type:"uint256"},{name:"nonce",type:"uint256"},{name:"signature",type:"bytes"},{name:"userID",type:"string"},{name:"titleID",type:"string"},{name:"category",type:"string"},{name:"deadline",type:"uint256"}],outputs:[]}],pe=[{type:"function",name:"approve",stateMutability:"nonpayable",inputs:[{name:"spender",type:"address"},{name:"amount",type:"uint256"}],outputs:[{name:"",type:"bool"}]},{type:"function",name:"allowance",stateMutability:"view",inputs:[{name:"owner",type:"address"},{name:"spender",type:"address"}],outputs:[{name:"",type:"uint256"}]},{type:"function",name:"decimals",stateMutability:"view",inputs:[],outputs:[{name:"",type:"uint8"}]},{type:"function",name:"balanceOf",stateMutability:"view",inputs:[{name:"account",type:"address"}],outputs:[{name:"",type:"uint256"}]}],Be=[{type:"function",name:"safeTransferFrom",stateMutability:"nonpayable",inputs:[{name:"from",type:"address"},{name:"to",type:"address"},{name:"id",type:"uint256"},{name:"amount",type:"uint256"},{name:"data",type:"bytes"}],outputs:[]},{type:"function",name:"isApprovedForAll",stateMutability:"view",inputs:[{name:"account",type:"address"},{name:"operator",type:"address"}],outputs:[{name:"",type:"bool"}]},{type:"function",name:"setApprovalForAll",stateMutability:"nonpayable",inputs:[{name:"operator",type:"address"},{name:"approved",type:"bool"}],outputs:[]},{type:"function",name:"balanceOf",stateMutability:"view",inputs:[{name:"account",type:"address"},{name:"id",type:"uint256"}],outputs:[{name:"",type:"uint256"}]}];});function Le(t,e,n){return viem.encodeAbiParameters([{type:"string"},{type:"string"},{type:"string"}],[t,e,core.normalizeBlockchainCategory(n)])}var Me=f(()=>{});async function E(t,e){let{walletClient:n,publicClient:o,account:i}=t,r=await n.writeContract({address:e.address,abi:e.abi,functionName:e.functionName,args:e.args,account:i,chain:n.chain,value:e.value});if((await o.waitForTransactionReceipt({hash:r})).status==="reverted")throw new Error(`On-chain transaction reverted (${r}).`);return r}var ue=f(()=>{});function w(t){return t instanceof viem.BaseError?t.shortMessage:t instanceof Error?t.message:String(t)}function d(t,e,n){return {ok:false,stage:t,error:e,...n}}function h(t,e){return {ok:false,stage:t,error:e}}var P=f(()=>{});function Fe(t){let e=t.RewardPoolAddress;return e||null}async function Ke(t,e,n,o){return await t.publicClient.readContract({address:e,abi:pe,functionName:"allowance",args:[t.account,n]})>=o?null:E(t,{address:e,abi:pe,functionName:"approve",args:[n,o]})}async function me(t){let{client:e,clients:n,network:o,tokenAddress:i,amount:r,titleID:c,category:s}=t,a=e.auth.context?.userID;if(!a)return d("approve","Not logged in.");let p=Fe(o);if(!p)return d("approve","Network has no RewardPoolAddress.");if(r<=0n)return d("approve","Amount must be positive.");try{await Ke(n,i,p,r);}catch(u){return d("approve",w(u))}let l;try{l=await E(n,{address:p,abi:re,functionName:"depositERC20",args:[i,r,a,c,s??""]});}catch(u){return d("deposit-onchain",w(u))}let m=await e.blockchain.depositToken(o.NetworkID??"",l);return m.ok?{ok:true,onChainTxHash:l,data:m.data}:d("report",m.error,{onChainTxHash:l})}async function ge(t){let{client:e,clients:n,network:o,nftContractAddress:i,tokenId:r,amount:c,titleID:s,category:a}=t,p=e.auth.context?.userID;if(!p)return d("deposit-onchain","Not logged in.");let l=Fe(o);if(!l)return d("deposit-onchain","Network has no RewardPoolAddress.");if(c<=0n)return d("deposit-onchain","Amount must be positive.");let m=Le(p,s,a),u;try{u=await E(n,{address:i,abi:Be,functionName:"safeTransferFrom",args:[n.account,l,r,c,m]});}catch(y){return d("deposit-onchain",w(y))}let g=await e.blockchain.depositNFT(o.NetworkID??"",u);return g.ok?{ok:true,onChainTxHash:u,data:g.data}:d("report",g.error,{onChainTxHash:u})}var He=f(()=>{de();Me();ue();P();});async function Ge(t,e){return E(t,{address:e.ContractAddress,abi:re,functionName:"withdrawERC20",args:[e.TokenAddress,e.WalletAddress,BigInt(e.Amount??"0"),BigInt(e.BurnAmount??"0"),BigInt(e.Nonce??"0"),e.Signature??"0x",e.UserID??"",e.TitleID??"",e.Category??"",BigInt(e.Deadline??"0")]})}async function Oe(t,e){return E(t,{address:e.ContractAddress,abi:Re,functionName:"withdrawERC1155Mint",args:[e.TokenAddress,e.WalletAddress,BigInt(e.TokenId??"0"),BigInt(e.Amount??"0"),BigInt(e.Nonce??"0"),e.Signature??"0x",e.UserID??"",e.TitleID??"",e.Category??"",BigInt(e.Deadline??"0")]})}async function fe(t){let{client:e,clients:n,currencyID:o,networkID:i,walletAddress:r,amount:c,category:s}=t,a=await e.blockchain.requestTokenWithdrawal(o,i,r,c,s);if(!a.ok)return d("request",a.error);let p=a.data.EvmSignature,l=a.data.TitleTransactionID??void 0;if(!p)return d("request","Withdrawal response carried no EVM signature.",{titleTransactionID:l});let m;try{m=await Ge(n,p);}catch(g){return d("withdraw-onchain",w(g),{titleTransactionID:l})}let u=await Ue(e,l,m);return u.ok?{ok:true,onChainTxHash:m,data:a.data}:u}async function ye(t){let{client:e,clients:n,itemID:o,networkID:i,walletAddress:r,amount:c,category:s}=t,a=await e.blockchain.requestNFTWithdrawal(o,i,r,c,s);if(!a.ok)return d("request",a.error);let p=a.data.EvmSignature,l=a.data.TitleTransactionID??void 0;if(!p)return d("request","Withdrawal response carried no EVM signature.",{titleTransactionID:l});let m;try{m=await Oe(n,p);}catch(g){return d("withdraw-onchain",w(g),{titleTransactionID:l})}let u=await Ue(e,l,m);return u.ok?{ok:true,onChainTxHash:m,data:a.data}:u}async function Ue(t,e,n){if(!e)return d("confirm","Missing TitleTransactionID.",{onChainTxHash:n});let o=await t.blockchain.confirmWithdrawal(e,n);return o.ok?{ok:true,onChainTxHash:n,data:o.data}:d("confirm",o.error,{onChainTxHash:n,titleTransactionID:e})}var qe=f(()=>{de();ue();P();});async function U(t){let{client:e,clients:n,networkID:o}=t,i=t.walletAddress??n.account,r=await e.auth.requestWalletChallenge(i,o);if(!r.ok)return h("challenge",r.error);let c;try{c=await n.walletClient.signMessage({account:n.account,message:r.data.Message});}catch(a){return h("sign",w(a))}let s=await e.auth.loginWithWallet(i,o,c);return s.ok?{ok:true,data:s.data}:h("login",s.error)}var ze=f(()=>{P();});var we=f(()=>{He();qe();ze();});function z(){let{address:t}=wagmi.useAccount(),e=wagmi.usePublicClient(),{data:n}=wagmi.useWalletClient();return !t||!e||!n?null:{account:t,publicClient:e,walletClient:n}}function je(t,e){let n=z();return {connected:!!n,account:n?.account??null,loginWithWallet:(o,i)=>n?U({client:t,clients:n,networkID:o,walletAddress:i}):Promise.resolve(h("challenge",q)),depositToken:o=>n?me({client:t,clients:n,titleID:e,...o}):Promise.resolve(d("approve",q)),depositNft:o=>n?ge({client:t,clients:n,titleID:e,...o}):Promise.resolve(d("deposit-onchain",q)),withdrawToken:o=>n?fe({client:t,clients:n,...o}):Promise.resolve(d("withdraw-onchain",q)),withdrawNft:o=>n?ye({client:t,clients:n,...o}):Promise.resolve(d("withdraw-onchain",q))}}var q,he=f(()=>{we();P();q="Wallet not connected.";});function Ve(t){let{wagmiConfig:e,...n}=t;return jsxRuntime.jsx(oe,{wagmiConfig:e,children:jsxRuntime.jsx(be,{...n})})}function Lt(t){return t instanceof Error&&(t.name==="ConnectorAlreadyConnectedError"||t.message.includes("already connected"))}function Mt(t){let e="Wallet sign-in failed. Please try again.";return t instanceof Error?t.name==="ProviderNotFoundError"||/provider not found/i.test(t.message)?"No crypto wallet found in this browser. Install a wallet extension (e.g. MetaMask) or open this page in your wallet's browser, then try again.":t.name==="UserRejectedRequestError"||/user (rejected|denied|cancelled|canceled)/i.test(t.message)?"Request declined in the wallet.":/timed? ?out/i.test(t.message)?"The wallet did not respond. Open your wallet and try again.":e:e}async function Ye(t){let e=await actions.getWalletClient(t).catch(()=>null);if(!e)return null;let n=actions.getPublicClient(t);return n?{account:e.account.address,publicClient:n,walletClient:e}:null}function Ft(t,e=18e4){return actions.getAccount(t).isConnected?Promise.resolve(true):new Promise(n=>{let o=false,i=s=>{o||(o=true,r(),clearTimeout(c),n(s));},r=actions.watchAccount(t,{onChange:s=>{s.isConnected&&i(true);}}),c=setTimeout(()=>i(false),e);})}function Kt(t,e=8e3){let n=o=>o==="reconnecting"||o==="connecting";return n(actions.getAccount(t).status)?new Promise(o=>{let i=false,r=()=>{i||(i=true,c(),clearTimeout(s),o());},c=actions.watchAccount(t,{onChange:a=>{n(a.status)||r();}}),s=setTimeout(r,e);}):Promise.resolve()}function Ht(t){let e=i=>t.find(r=>r.id===i||r.type===i),n=e("injected"),o=typeof window<"u"&&window.ethereum!=null;return n&&o?n:e("walletConnect")??n??t[0]}async function Ot(t){try{let o=(await actions.getAccount(t).connector?.getProvider?.())?.session?.peer?.metadata?.redirect,i=o?.native||o?.universal;return !i||typeof window>"u"?!1:(window.location.href=i,!0)}catch{return false}}function Ut(t,e){return new Promise((n,o)=>{let i=setTimeout(()=>o(new Error("The wallet request timed out.")),e);t.then(r=>{clearTimeout(i),n(r);},r=>{clearTimeout(i),o(r instanceof Error?r:new Error(String(r)));});})}function be(t){let{client:e,networkID:n,onAuthenticated:o,disabled:i,label:r,style:c,autoStart:s}=t,a=wagmi.useConfig(),{isConnected:p}=wagmi.useAccount(),{connectAsync:l,connectors:m}=wagmi.useConnect(),u=z(),[g,y]=react.useState(false),[C,b]=react.useState(null),[B,L]=react.useState(false),S=react.useRef(0),M=react.useRef(false),W=async()=>{let K=++S.current,x=()=>S.current===K;y(true),b(null);try{if(await Kt(a),!x())return;if(!actions.getAccount(a).isConnected){let A=I();if(A){if(await A.open(),!await Ft(a)){b("No wallet was connected.");return}}else {let H=Ht(m);if(!H){b("No wallet connector is configured.");return}try{await l({connector:H});}catch(v){if(!Lt(v))throw v}}}let k=u??await Ye(a);if(!k&&actions.getAccount(a).isConnected&&(await new Promise(A=>setTimeout(A,300)),k=await Ye(a),!x()))return;if(!k){b("Wallet client is not available.");return}L(!0);let T=await Ut(U({client:e,clients:k,networkID:n}),Gt);if(!x())return;if(T.ok){o();return}b(T.stage==="sign"?"Signature declined.":T.error??"Wallet sign-in failed.");}catch(k){if(!x())return;console.error("[idosgames/wallet] wallet sign-in failed:",k),b(Mt(k));}finally{x()&&(y(false),L(false));}};react.useEffect(()=>{!s||M.current||(M.current=true,W());},[s]);let F=async()=>{await Ot(a)||await I()?.open();};return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("button",{type:"button",onClick:()=>{B?F():W();},disabled:i,style:{...qt,...i?{opacity:.6,cursor:"default"}:null,...c},children:B?"Waiting for signature \u2014 tap to open wallet":g?"Check your wallet\u2026":p?r??"Sign in with wallet":"Connect wallet"}),C&&jsxRuntime.jsx("span",{role:"alert",style:zt,children:C})]})}var Gt,qt,zt,Ze=f(()=>{O();we();ce();he();Gt=9e4;qt={padding:"11px 16px",borderRadius:"8px",border:"none",background:"#4c3fa8",color:"#fff",font:"inherit",fontWeight:600,cursor:"pointer"},zt={display:"block",marginTop:"6px",color:"#ff9b9b",fontSize:"13px",textAlign:"center"};});var $e={};Se($e,{IDosGamesWalletProvider:()=>oe,WalletLogin:()=>Ve,WalletLoginButton:()=>be,arbitrum:()=>exports.arbitrum,base:()=>exports.base,bsc:()=>exports.bsc,chainById:()=>se,createEvmWalletConfig:()=>De,idosChains:()=>exports.idosChains,mainnet:()=>exports.mainnet,optimism:()=>exports.optimism,polygon:()=>exports.polygon,polygonAmoy:()=>exports.polygonAmoy,sepolia:()=>exports.sepolia,useEvmBridge:()=>je,useEvmBridgeClients:()=>z});var Je=f(()=>{Ie();D();ce();he();Ze();});function Xe(t){let{walletConnectProjectId:e,appName:n,appUrl:o,appIcon:i,wallets:r}=t,c=t.networks??[exports.solanaMainnet],s=o??(typeof window<"u"?window.location.origin:""),a={name:n??"iDosGames",description:n??"iDosGames game",url:s,icons:i?[i]:[]},p=new appkitAdapterSolana.SolanaAdapter(r?{wallets:r}:{});return ne(react$1.createAppKit({adapters:[p],networks:c,projectId:e,metadata:a,features:{analytics:false,email:false,socials:false}})),p}var et=f(()=>{D();O();});async function ke(t){let{client:e,adapter:n,network:o,mint:i,amountRaw:r,titleID:c,category:s}=t,a=e.auth.context?.userID;if(!a)return d("deposit-onchain","Not logged in.");if(r<=0n)return d("deposit-onchain","Amount must be positive.");let p;try{p=await n.depositSpl({mint:i,amountRaw:r,userID:a,titleID:c,category:core.normalizeBlockchainCategory(s)});}catch(m){return d("deposit-onchain",w(m))}let l=await e.blockchain.depositToken(o.NetworkID??"",p);return l.ok?{ok:true,onChainTxHash:p,data:l.data}:d("report",l.error,{onChainTxHash:p})}async function ve(t){let{client:e,adapter:n,currencyID:o,networkID:i,walletAddress:r,amount:c,category:s}=t,a=await e.blockchain.requestTokenWithdrawal(o,i,r,c,s);if(!a.ok)return d("request",a.error);let p=a.data.SolanaSignature,l=a.data.TitleTransactionID??void 0;if(!p)return d("request","Withdrawal response carried no Solana signature.",{titleTransactionID:l});let m;try{m=await n.submitWithdrawal(p);}catch(g){return d("withdraw-onchain",w(g),{titleTransactionID:l})}if(!l)return d("confirm","Missing TitleTransactionID.",{onChainTxHash:m});let u=await e.blockchain.confirmWithdrawal(l,m);return u.ok?{ok:true,onChainTxHash:m,data:a.data}:d("confirm",u.error,{onChainTxHash:m,titleTransactionID:l})}var tt=f(()=>{P();});async function _(t){let{client:e,networkID:n,walletAddress:o,signMessage:i}=t,r=await e.auth.requestWalletChallenge(o,n);if(!r.ok)return h("challenge",r.error);let c;try{let a=await i(new TextEncoder().encode(r.data.Message));c=Zt(a);}catch(a){return h("sign",w(a))}let s=await e.auth.loginWithWallet(o,n,c);return s.ok?{ok:true,data:s.data}:h("login",s.error)}function Zt(t){let e="0x";for(let n of t)e+=n.toString(16).padStart(2,"0");return e}var nt=f(()=>{P();});var We=f(()=>{tt();nt();});function rt(t,e,n){let{address:o}=react$1.useAppKitAccount(),{walletProvider:i}=react$1.useAppKitProvider("solana"),r=o??null,c=i?.signMessage?.bind(i);return {connected:!!r,account:r,loginWithWallet:(s,a)=>{let p=a??r;return p?c?_({client:t,networkID:s,walletAddress:p,signMessage:c}):Promise.resolve(h("sign","The connected wallet does not support message signing.")):Promise.resolve(h("challenge",ot))},depositToken:s=>ke({client:t,adapter:n,titleID:e,...s}),withdrawToken:s=>{let a=s.walletAddress??r;return a?ve({client:t,adapter:n,...s,walletAddress:a}):Promise.resolve(d("request",ot))}}}var ot,at=f(()=>{We();P();ot="Wallet not connected.";});function on(t){try{let n=t?.session?.peer?.metadata?.redirect,o=n?.native||n?.universal;return !o||typeof window>"u"?!1:(window.location.href=o,!0)}catch{return false}}function rn(t,e){return new Promise((n,o)=>{let i=setTimeout(()=>o(new Error("The wallet request timed out.")),e);t.then(r=>{clearTimeout(i),n(r);},r=>{clearTimeout(i),o(r instanceof Error?r:new Error(String(r)));});})}function an(t){let e="Wallet sign-in failed. Please try again.";return t instanceof Error?/user (rejected|denied|cancelled|canceled)|rejected the request/i.test(t.message)?"Request declined in the wallet.":/timed? ?out/i.test(t.message)?"The wallet did not respond. Open your wallet and try again.":e:e}function st(t){let{client:e,networkID:n,onAuthenticated:o,disabled:i,label:r,style:c,autoStart:s}=t,{address:a,isConnected:p}=react$1.useAppKitAccount(),{walletProvider:l}=react$1.useAppKitProvider("solana"),[m,u]=react.useState(false),[g,y]=react.useState(null),[C,b]=react.useState(false),[B,L]=react.useState(false),S=react.useRef(null),M=react.useRef(0),W=react.useCallback(()=>{S.current&&clearTimeout(S.current),S.current=null;},[]);react.useEffect(()=>W,[W]);let F=react.useRef(false),K=react.useCallback(async()=>{let T=++M.current,A=()=>M.current===T,H=l?.signMessage?.bind(l);if(!a||!H){y("The connected wallet cannot sign messages."),u(false);return}u(true),y(null);try{L(!0);let v=await rn(_({client:e,networkID:n,walletAddress:a,signMessage:H}),nn);if(!A())return;if(v.ok){o();return}y(v.stage==="sign"?"Signature declined.":v.error??"Wallet sign-in failed.");}catch(v){if(!A())return;console.error("[idosgames/wallet] solana sign-in failed:",v),y(an(v));}finally{A()&&(u(false),L(false));}},[a,l,e,n,o]),x=react.useCallback(()=>{on(l)||I()?.open();},[l]);react.useEffect(()=>{!C||!p||!a||!l||(b(false),W(),K());},[C,p,a,l,K,W]);let k=()=>{if(B){x();return}if(y(null),F.current=true,p&&a&&l){K();return}let T=I();if(!T){y("Wallet sign-in is not configured for this title.");return}u(true),b(true),W(),S.current=setTimeout(()=>{b(false),u(false),y("No wallet was connected.");},tn),T.open();};return react.useEffect(()=>{!s||F.current||(F.current=true,k());},[s]),jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("button",{type:"button",onClick:k,disabled:i,style:{...sn,...i?{opacity:.6,cursor:"default"}:null,...c},children:B?"Waiting for signature \u2014 tap to open wallet":m?"Check your wallet\u2026":p?r??"Sign in with wallet":"Connect wallet"}),g&&jsxRuntime.jsx("span",{role:"alert",style:ln,children:g})]})}var tn,nn,sn,ln,lt=f(()=>{We();O();tn=18e4,nn=9e4;sn={padding:"11px 16px",borderRadius:"8px",border:"none",background:"#4c3fa8",color:"#fff",font:"inherit",fontWeight:600,cursor:"pointer"},ln={display:"block",marginTop:"6px",color:"#ff9b9b",fontSize:"13px",textAlign:"center"};});var ct={};Se(ct,{SolanaWalletLogin:()=>st,createSolanaWalletConfig:()=>Xe,solanaDevnet:()=>exports.solanaDevnet,solanaMainnet:()=>exports.solanaMainnet,useSolanaBridge:()=>rt});var pt=f(()=>{et();at();lt();D();});var dn={padding:"11px 16px",borderRadius:"8px",border:"none",background:"#4c3fa8",color:"#fff",font:"inherit",fontWeight:600,cursor:"pointer"},un={display:"block",marginTop:"6px",color:"#ff9b9b",fontSize:"13px",textAlign:"center"};function dt(t){let{loading:e,disabled:n,label:o,style:i,error:r,onClick:c}=t;return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("button",{type:"button",onClick:c,disabled:n||e,style:{...dn,...n||e?{opacity:.6,cursor:"default"}:null,...i},children:e?"Loading wallet\u2026":o??"Sign in with wallet"}),r&&jsxRuntime.jsx("span",{role:"alert",style:un,children:r})]})}function mn(t){let{chains:e,walletConnectProjectId:n,appName:o,disabled:i,label:r,style:c,...s}=t,[a,p]=react.useState(null),[l,m]=react.useState(false),[u,g]=react.useState(null),y=()=>{m(true),g(null),(async()=>{try{let C=await Promise.resolve().then(()=>(Je(),$e)),b=C.createEvmWalletConfig({chains:e,walletConnectProjectId:n,appName:o});p({mod:C,config:b});}catch(C){console.error("[idosgames/wallet] failed to load the wallet module:",C),g("Could not load the wallet. Please try again.");}finally{m(false);}})();};if(a){let{WalletLogin:C}=a.mod;return jsxRuntime.jsx(C,{...s,wagmiConfig:a.config,disabled:i,label:r,style:c,autoStart:true})}return jsxRuntime.jsx(dt,{loading:l,disabled:i,label:r,style:c,error:u,onClick:y})}function gn(t){let{walletConnectProjectId:e,appName:n,disabled:o,label:i,style:r,...c}=t,[s,a]=react.useState(null),[p,l]=react.useState(false),[m,u]=react.useState(null),g=()=>{l(true),u(null),(async()=>{try{let y=await Promise.resolve().then(()=>(pt(),ct));e&&y.createSolanaWalletConfig({walletConnectProjectId:e,appName:n}),a(y);}catch(y){console.error("[idosgames/wallet] failed to load the wallet module:",y),u("Could not load the wallet. Please try again.");}finally{l(false);}})();};if(s){let{SolanaWalletLogin:y}=s;return jsxRuntime.jsx(y,{...c,disabled:o,label:i,style:r,autoStart:true})}return jsxRuntime.jsx(dt,{loading:p,disabled:o,label:i,style:r,error:m,onClick:g})}D();
2
+ exports.LazySolanaWalletLogin=gn;exports.LazyWalletLogin=mn;exports.chainById=se;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@idosgames/wallet",
3
- "version": "0.1.9",
3
+ "version": "0.1.11",
4
4
  "description": "Wallet-bridge companion to @idosgames/core: connect browser & mobile wallets (EVM via wagmi/viem/WalletConnect, Solana via wallet-adapter) and move tokens/NFTs in and out of the game through client.blockchain.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -32,24 +32,29 @@
32
32
  "main": "./dist/index.cjs",
33
33
  "module": "./dist/index.js",
34
34
  "types": "./dist/index.d.ts",
35
+ "//exports": "Каждый подпуть объявляет \"browser\" -> ESM, и это НЕ косметика. Классический бандлер Sandpack (живое превью AI-кодера) матчит условия по СВОЕМУ списку приоритетов ['browser','development','default','require','import'] — 'require' ВЫШЕ 'import', то есть без 'browser' он берёт .cjs даже в браузере. Для ./react/lazy это фатально: в CJS нет ленивого импорта, tsup инлайнит туда весь ./react и поднимает require('@reown/appkit-adapter-wagmi') наверх файла — превью падает с «Could not find dependency», потому что AppKit намеренно не объявлен в зависимостях проекта (пакаджер CodeSandbox отдаёт на нём 504). С 'browser' бандлер берёт lazyIndex.js, где import() остаётся настоящим ленивым рубежом. Для остальных подпутей 'browser' держит браузерный граф на ОДНОЙ (ESM) копии модуля — иначе ленивый вход тянул бы .js, а панель кошелька .cjs, и в игре оказалось бы два независимых экземпляра wagmi. Node условие 'browser' не знает и по-прежнему получает 'require' -> .cjs. Проверено на реальном bundler'е, не по докам.",
35
36
  "exports": {
36
37
  ".": {
37
38
  "types": "./dist/index.d.ts",
39
+ "browser": "./dist/index.js",
38
40
  "import": "./dist/index.js",
39
41
  "require": "./dist/index.cjs"
40
42
  },
41
43
  "./react": {
42
44
  "types": "./dist/react/index.d.ts",
45
+ "browser": "./dist/react/index.js",
43
46
  "import": "./dist/react/index.js",
44
47
  "require": "./dist/react/index.cjs"
45
48
  },
46
49
  "./react/solana": {
47
50
  "types": "./dist/react/solanaIndex.d.ts",
51
+ "browser": "./dist/react/solanaIndex.js",
48
52
  "import": "./dist/react/solanaIndex.js",
49
53
  "require": "./dist/react/solanaIndex.cjs"
50
54
  },
51
55
  "./react/lazy": {
52
56
  "types": "./dist/react/lazyIndex.d.ts",
57
+ "browser": "./dist/react/lazyIndex.js",
53
58
  "import": "./dist/react/lazyIndex.js",
54
59
  "require": "./dist/react/lazyIndex.cjs"
55
60
  }