@idosgames/wallet 0.1.17 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  import { SolanaWithdrawalSignature, IDosGamesClient, BlockchainNetworkDefinition, DepositTokenResponse, TokenWithdrawalResponse } from '@idosgames/core';
2
- import { a as BridgeResult } from './types-C11zAA05.js';
2
+ import { B as BridgeResult } from './types-CeUVf1tr.js';
3
3
 
4
4
  /**
5
5
  * The on-chain half of the Solana bridge, delegated to the title's own program integration.
@@ -1,5 +1,5 @@
1
1
  import { SolanaWithdrawalSignature, IDosGamesClient, BlockchainNetworkDefinition, DepositTokenResponse, TokenWithdrawalResponse } from '@idosgames/core';
2
- import { a as BridgeResult } from './types-C11zAA05.cjs';
2
+ import { B as BridgeResult } from './types-CeUVf1tr.cjs';
3
3
 
4
4
  /**
5
5
  * The on-chain half of the Solana bridge, delegated to the title's own program integration.
@@ -0,0 +1 @@
1
+ import {b,a,c}from'./chunk-K62NMX3A.js';import {encodeAbiParameters,parseUnits}from'viem';import {normalizeBlockchainCategory}from'@idosgames/core';var h=[{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:"splits",type:"tuple[]",components:[{name:"to",type:"address"},{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:"withdrawERC1155",stateMutability:"nonpayable",inputs:[{name:"token",type:"address"},{name:"to",type:"address"},{name:"id",type:"uint256"},{name:"amount",type:"uint256"},{name:"splits",type:"tuple[]",components:[{name:"to",type:"address"},{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:[]}],D=[{type:"function",name:"withdrawERC1155Mint",stateMutability:"nonpayable",inputs:[{name:"collection",type:"address"},{name:"to",type:"address"},{name:"id",type:"uint256"},{name:"amount",type:"uint256"},{name:"splits",type:"tuple[]",components:[{name:"to",type:"address"},{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:[]}],A=[{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"}]}],v=[{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"}]}],C=[{type:"function",name:"safeTransferFrom",stateMutability:"nonpayable",inputs:[{name:"from",type:"address"},{name:"to",type:"address"},{name:"tokenId",type:"uint256"},{name:"data",type:"bytes"}],outputs:[]}];function k(e,t,n){return encodeAbiParameters([{type:"string"},{type:"string"},{type:"string"}],[e,t,normalizeBlockchainCategory(n)])}async function g(e,t){let{walletClient:n,publicClient:i,account:s}=e,o=await n.writeContract({address:t.address,abi:t.abi,functionName:t.functionName,args:t.args,account:s,chain:n.chain,value:t.value});if((await i.waitForTransactionReceipt({hash:o})).status==="reverted")throw new Error(`On-chain transaction reverted (${o}).`);return o}function I(e){let t=e.RewardPoolAddress;return t||null}async function x(e,t,n,i){return await e.publicClient.readContract({address:t,abi:A,functionName:"allowance",args:[e.account,n]})>=i?null:g(e,{address:t,abi:A,functionName:"approve",args:[n,i]})}async function E(e){let{client:t,clients:n,network:i,tokenAddress:s,amount:o,titleID:c,category:u}=e,r=t.auth.context?.userID;if(!r)return b("approve","Not logged in.");let l=I(i);if(!l)return b("approve","Network has no RewardPoolAddress.");if(o<=0n)return b("approve","Amount must be positive.");try{await x(n,s,l,o);}catch(d){return b("approve",a(d))}let p;try{p=await g(n,{address:l,abi:h,functionName:"depositERC20",args:[s,o,r,c,u??""]});}catch(d){return b("deposit-onchain",a(d))}let m=await t.blockchain.depositToken(i.NetworkID??"",p);return m.ok?{ok:true,onChainTxHash:p,data:m.data}:b("report",m.error,{onChainTxHash:p})}async function M(e){let{clients:t,poolAddress:n,tokenAddress:i,amount:s,userID:o,titleID:c,category:u}=e;if(!o)return b("approve","userID is required.");if(s<=0n)return b("approve","Amount must be positive.");try{await x(t,i,n,s);}catch(r){return b("approve",a(r))}try{let r=await g(t,{address:n,abi:h,functionName:"depositERC20",args:[i,s,o,c,u??""]});return {ok:!0,onChainTxHash:r,data:{txHash:r}}}catch(r){return b("deposit-onchain",a(r))}}async function F(e){let{client:t,clients:n,network:i,nftContractAddress:s,tokenId:o,amount:c,titleID:u,category:r}=e,l=t.auth.context?.userID;if(!l)return b("deposit-onchain","Not logged in.");let p=I(i);if(!p)return b("deposit-onchain","Network has no RewardPoolAddress.");if(c<=0n)return b("deposit-onchain","Amount must be positive.");let m=k(l,u,r),d;try{d=await g(n,{address:s,abi:v,functionName:"safeTransferFrom",args:[n.account,p,o,c,m]});}catch(w){return b("deposit-onchain",a(w))}let y=await t.blockchain.depositNFT(i.NetworkID??"",d);return y.ok?{ok:true,onChainTxHash:d,data:y.data}:b("report",y.error,{onChainTxHash:d})}async function S(e){let{client:t,clients:n,network:i,nftContractAddress:s,tokenId:o,titleID:c,category:u}=e,r=t.auth.context?.userID;if(!r)return b("deposit-onchain","Not logged in.");let l=I(i);if(!l)return b("deposit-onchain","Network has no RewardPoolAddress.");let p=k(r,c,u),m;try{m=await g(n,{address:s,abi:C,functionName:"safeTransferFrom",args:[n.account,l,o,p]});}catch(y){return b("deposit-onchain",a(y))}let d=await t.blockchain.depositNFT(i.NetworkID??"",m);return d.ok?{ok:true,onChainTxHash:m,data:d.data}:b("report",d.error,{onChainTxHash:m})}function T(e){return (e.Splits??[]).map(t=>({to:t.To,amount:BigInt(t.Amount??"0")}))}async function N(e,t){return g(e,{address:t.ContractAddress,abi:h,functionName:"withdrawERC20",args:[t.TokenAddress,t.WalletAddress,BigInt(t.Amount??"0"),BigInt(t.BurnAmount??"0"),T(t),BigInt(t.Nonce??"0"),t.Signature??"0x",t.UserID??"",t.TitleID??"",t.Category??"",BigInt(t.Deadline??"0")]})}async function W(e,t){return g(e,{address:t.ContractAddress,abi:D,functionName:"withdrawERC1155Mint",args:[t.TokenAddress,t.WalletAddress,BigInt(t.TokenId??"0"),BigInt(t.Amount??"0"),T(t),BigInt(t.Nonce??"0"),t.Signature??"0x",t.UserID??"",t.TitleID??"",t.Category??"",BigInt(t.Deadline??"0")]})}async function G(e,t){return g(e,{address:t.ContractAddress,abi:D,functionName:"withdrawERC721Mint",args:[t.TokenAddress,t.WalletAddress,BigInt(t.TokenId??"0"),BigInt(t.Nonce??"0"),t.Signature??"0x",t.UserID??"",t.TitleID??"",t.Category??"",BigInt(t.Deadline??"0")]})}async function O(e){let{client:t,clients:n,currencyID:i,networkID:s,walletAddress:o,amount:c,category:u}=e,r=await t.blockchain.requestTokenWithdrawal(i,s,o,c,u);if(!r.ok)return b("request",r.error);let l=r.data.EvmSignature,p=r.data.TitleTransactionID??void 0;if(!l)return b("request","Withdrawal response carried no EVM signature.",{titleTransactionID:p});let m;try{m=await N(n,l);}catch(y){return b("withdraw-onchain",a(y),{titleTransactionID:p})}let d=await P(t,p,m);return d.ok?{ok:true,onChainTxHash:m,data:r.data}:d}async function q(e){let{client:t,clients:n,itemID:i,networkID:s,walletAddress:o,amount:c,category:u}=e,r=await t.blockchain.requestNFTWithdrawal(i,s,o,c,u);if(!r.ok)return b("request",r.error);let l=r.data.EvmSignature,p=r.data.TitleTransactionID??void 0;if(!l)return b("request","Withdrawal response carried no EVM signature.",{titleTransactionID:p});let m;try{m=await W(n,l);}catch(y){return b("withdraw-onchain",a(y),{titleTransactionID:p})}let d=await P(t,p,m);return d.ok?{ok:true,onChainTxHash:m,data:r.data}:d}async function P(e,t,n){if(!t)return b("confirm","Missing TitleTransactionID.",{onChainTxHash:n});let i=await e.blockchain.confirmWithdrawal(t,n);return i.ok?{ok:true,onChainTxHash:n,data:i.data}:b("confirm",i.error,{onChainTxHash:n,titleTransactionID:t})}async function L(e){let{client:t,clients:n,networkID:i}=e,s=e.walletAddress??n.account,o=await t.auth.requestWalletChallenge(s,i);if(!o.ok)return c("challenge",o.error);let c$1;try{c$1=await n.walletClient.signMessage({account:n.account,message:o.data.Message});}catch(r){return c("sign",a(r))}let u=await t.auth.loginWithWallet(s,i,c$1);return u.ok?{ok:true,data:u.data}:c("login",u.error)}async function $(e){let{client:t,clients:n,network:i,tokenAddress:s,decimals:o,titleID:c,shortfall:u,completePurchase:r,bufferRatio:l=0,category:p}=e;if(u.missing<=0)return b("approve","Nothing to deposit.");let m=u.missing*(1+Math.max(0,l)),d;try{d=parseUnits(V(m,o),o);}catch(B){return b("approve",a(B))}let y=await E({client:t,clients:n,network:i,tokenAddress:s,amount:d,titleID:c,category:p});if(!y.ok)return y;let w=await r();return w.ok?{ok:true,onChainTxHash:y.onChainTxHash,data:w.data}:b("report",w.error,{onChainTxHash:y.onChainTxHash})}function V(e,t){return e.toFixed(Math.min(t,18)).replace(/0+$/,"").replace(/\.$/,"")||"0"}export{h as a,A as b,v as c,C as d,k as e,g as f,x as g,E as h,M as i,F as j,S as k,N as l,W as m,G as n,O as o,q as p,L as q,$ as r};
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- 'use strict';var viem=require('viem'),core=require('@idosgames/core');function g(e){return e instanceof viem.BaseError?e.shortMessage:e instanceof Error?e.message:String(e)}function a(e,t,n){return {ok:false,stage:e,error:t,...n}}function h(e,t){return {ok:false,stage:e,error:t}}var B={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"}}},P={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"}}},R={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"}}},H={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"}}},M={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"}}},F={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"}}},L={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"}}},U={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"}}},q={mainnet:B,bsc:P,polygon:R,base:H,arbitrum:M,optimism:F,sepolia:L,polygonAmoy:U};function at(e){return Object.values(q).find(t=>t.id===e)}function rt(e){return {...e,chainNamespace:"eip155",caipNetworkId:`eip155:${e.id}`}}var ot={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"},it={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"};var w=[{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:"splits",type:"tuple[]",components:[{name:"to",type:"address"},{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:"withdrawERC1155",stateMutability:"nonpayable",inputs:[{name:"token",type:"address"},{name:"to",type:"address"},{name:"id",type:"uint256"},{name:"amount",type:"uint256"},{name:"splits",type:"tuple[]",components:[{name:"to",type:"address"},{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:[]}],x=[{type:"function",name:"withdrawERC1155Mint",stateMutability:"nonpayable",inputs:[{name:"collection",type:"address"},{name:"to",type:"address"},{name:"id",type:"uint256"},{name:"amount",type:"uint256"},{name:"splits",type:"tuple[]",components:[{name:"to",type:"address"},{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:[]}],k=[{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"}]}],A=[{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"}]}],C=[{type:"function",name:"safeTransferFrom",stateMutability:"nonpayable",inputs:[{name:"from",type:"address"},{name:"to",type:"address"},{name:"tokenId",type:"uint256"},{name:"data",type:"bytes"}],outputs:[]}];function b(e,t,n){return viem.encodeAbiParameters([{type:"string"},{type:"string"},{type:"string"}],[e,t,core.normalizeBlockchainCategory(n)])}async function f(e,t){let{walletClient:n,publicClient:o,account:c}=e,i=await n.writeContract({address:t.address,abi:t.abi,functionName:t.functionName,args:t.args,account:c,chain:n.chain,value:t.value});if((await o.waitForTransactionReceipt({hash:i})).status==="reverted")throw new Error(`On-chain transaction reverted (${i}).`);return i}function D(e){let t=e.RewardPoolAddress;return t||null}async function E(e,t,n,o){return await e.publicClient.readContract({address:t,abi:k,functionName:"allowance",args:[e.account,n]})>=o?null:f(e,{address:t,abi:k,functionName:"approve",args:[n,o]})}async function K(e){let{client:t,clients:n,network:o,tokenAddress:c,amount:i,titleID:d,category:m}=e,r=t.auth.context?.userID;if(!r)return a("approve","Not logged in.");let p=D(o);if(!p)return a("approve","Network has no RewardPoolAddress.");if(i<=0n)return a("approve","Amount must be positive.");try{await E(n,c,p,i);}catch(u){return a("approve",g(u))}let s;try{s=await f(n,{address:p,abi:w,functionName:"depositERC20",args:[c,i,r,d,m??""]});}catch(u){return a("deposit-onchain",g(u))}let l=await t.blockchain.depositToken(o.NetworkID??"",s);return l.ok?{ok:true,onChainTxHash:s,data:l.data}:a("report",l.error,{onChainTxHash:s})}async function Y(e){let{client:t,clients:n,network:o,nftContractAddress:c,tokenId:i,amount:d,titleID:m,category:r}=e,p=t.auth.context?.userID;if(!p)return a("deposit-onchain","Not logged in.");let s=D(o);if(!s)return a("deposit-onchain","Network has no RewardPoolAddress.");if(d<=0n)return a("deposit-onchain","Amount must be positive.");let l=b(p,m,r),u;try{u=await f(n,{address:c,abi:A,functionName:"safeTransferFrom",args:[n.account,s,i,d,l]});}catch(N){return a("deposit-onchain",g(N))}let y=await t.blockchain.depositNFT(o.NetworkID??"",u);return y.ok?{ok:true,onChainTxHash:u,data:y.data}:a("report",y.error,{onChainTxHash:u})}async function z(e){let{client:t,clients:n,network:o,nftContractAddress:c,tokenId:i,titleID:d,category:m}=e,r=t.auth.context?.userID;if(!r)return a("deposit-onchain","Not logged in.");let p=D(o);if(!p)return a("deposit-onchain","Network has no RewardPoolAddress.");let s=b(r,d,m),l;try{l=await f(n,{address:c,abi:C,functionName:"safeTransferFrom",args:[n.account,p,i,s]});}catch(y){return a("deposit-onchain",g(y))}let u=await t.blockchain.depositNFT(o.NetworkID??"",l);return u.ok?{ok:true,onChainTxHash:l,data:u.data}:a("report",u.error,{onChainTxHash:l})}function v(e){return (e.Splits??[]).map(t=>({to:t.To,amount:BigInt(t.Amount??"0")}))}async function T(e,t){return f(e,{address:t.ContractAddress,abi:w,functionName:"withdrawERC20",args:[t.TokenAddress,t.WalletAddress,BigInt(t.Amount??"0"),BigInt(t.BurnAmount??"0"),v(t),BigInt(t.Nonce??"0"),t.Signature??"0x",t.UserID??"",t.TitleID??"",t.Category??"",BigInt(t.Deadline??"0")]})}async function I(e,t){return f(e,{address:t.ContractAddress,abi:x,functionName:"withdrawERC1155Mint",args:[t.TokenAddress,t.WalletAddress,BigInt(t.TokenId??"0"),BigInt(t.Amount??"0"),v(t),BigInt(t.Nonce??"0"),t.Signature??"0x",t.UserID??"",t.TitleID??"",t.Category??"",BigInt(t.Deadline??"0")]})}async function V(e,t){return f(e,{address:t.ContractAddress,abi:x,functionName:"withdrawERC721Mint",args:[t.TokenAddress,t.WalletAddress,BigInt(t.TokenId??"0"),BigInt(t.Nonce??"0"),t.Signature??"0x",t.UserID??"",t.TitleID??"",t.Category??"",BigInt(t.Deadline??"0")]})}async function Z(e){let{client:t,clients:n,currencyID:o,networkID:c,walletAddress:i,amount:d,category:m}=e,r=await t.blockchain.requestTokenWithdrawal(o,c,i,d,m);if(!r.ok)return a("request",r.error);let p=r.data.EvmSignature,s=r.data.TitleTransactionID??void 0;if(!p)return a("request","Withdrawal response carried no EVM signature.",{titleTransactionID:s});let l;try{l=await T(n,p);}catch(y){return a("withdraw-onchain",g(y),{titleTransactionID:s})}let u=await W(t,s,l);return u.ok?{ok:true,onChainTxHash:l,data:r.data}:u}async function $(e){let{client:t,clients:n,itemID:o,networkID:c,walletAddress:i,amount:d,category:m}=e,r=await t.blockchain.requestNFTWithdrawal(o,c,i,d,m);if(!r.ok)return a("request",r.error);let p=r.data.EvmSignature,s=r.data.TitleTransactionID??void 0;if(!p)return a("request","Withdrawal response carried no EVM signature.",{titleTransactionID:s});let l;try{l=await I(n,p);}catch(y){return a("withdraw-onchain",g(y),{titleTransactionID:s})}let u=await W(t,s,l);return u.ok?{ok:true,onChainTxHash:l,data:r.data}:u}async function W(e,t,n){if(!t)return a("confirm","Missing TitleTransactionID.",{onChainTxHash:n});let o=await e.blockchain.confirmWithdrawal(t,n);return o.ok?{ok:true,onChainTxHash:n,data:o.data}:a("confirm",o.error,{onChainTxHash:n,titleTransactionID:t})}async function J(e){let{client:t,clients:n,networkID:o}=e,c=e.walletAddress??n.account,i=await t.auth.requestWalletChallenge(c,o);if(!i.ok)return h("challenge",i.error);let d;try{d=await n.walletClient.signMessage({account:n.account,message:i.data.Message});}catch(r){return h("sign",g(r))}let m=await t.auth.loginWithWallet(c,o,d);return m.ok?{ok:true,data:m.data}:h("login",m.error)}async function Q(e){let{client:t,adapter:n,network:o,mint:c,amountRaw:i,titleID:d,category:m}=e,r=t.auth.context?.userID;if(!r)return a("deposit-onchain","Not logged in.");if(i<=0n)return a("deposit-onchain","Amount must be positive.");let p;try{p=await n.depositSpl({mint:c,amountRaw:i,userID:r,titleID:d,category:core.normalizeBlockchainCategory(m)});}catch(l){return a("deposit-onchain",g(l))}let s=await t.blockchain.depositToken(o.NetworkID??"",p);return s.ok?{ok:true,onChainTxHash:p,data:s.data}:a("report",s.error,{onChainTxHash:p})}async function X(e){let{client:t,adapter:n,currencyID:o,networkID:c,walletAddress:i,amount:d,category:m}=e,r=await t.blockchain.requestTokenWithdrawal(o,c,i,d,m);if(!r.ok)return a("request",r.error);let p=r.data.SolanaSignature,s=r.data.TitleTransactionID??void 0;if(!p)return a("request","Withdrawal response carried no Solana signature.",{titleTransactionID:s});let l;try{l=await n.submitWithdrawal(p);}catch(y){return a("withdraw-onchain",g(y),{titleTransactionID:s})}if(!s)return a("confirm","Missing TitleTransactionID.",{onChainTxHash:l});let u=await t.blockchain.confirmWithdrawal(s,l);return u.ok?{ok:true,onChainTxHash:l,data:r.data}:a("confirm",u.error,{onChainTxHash:l,titleTransactionID:s})}async function _(e){let{client:t,networkID:n,walletAddress:o,signMessage:c}=e,i=await t.auth.requestWalletChallenge(o,n);if(!i.ok)return h("challenge",i.error);let d;try{let r=await c(new TextEncoder().encode(i.data.Message));d=tt(r);}catch(r){return h("sign",g(r))}let m=await t.auth.loginWithWallet(o,n,d);return m.ok?{ok:true,data:m.data}:h("login",m.error)}function tt(e){let t="0x";for(let n of e)t+=n.toString(16).padStart(2,"0");return t}
2
- exports.arbitrum=M;exports.base=H;exports.bridgeFail=a;exports.bsc=P;exports.chainById=at;exports.depositNftEvm=Y;exports.depositNftEvm721=z;exports.depositTokenEvm=K;exports.depositTokenSolana=Q;exports.encodeNftDepositData=b;exports.ensureErc20Allowance=E;exports.erc1155Abi=A;exports.erc20Abi=k;exports.erc721Abi=C;exports.idosChains=q;exports.loginWithWalletEvm=J;exports.loginWithWalletSolana=_;exports.mainnet=B;exports.optimism=F;exports.polygon=R;exports.polygonAmoy=U;exports.rewardPoolAbi=w;exports.sepolia=L;exports.solanaDevnet=it;exports.solanaMainnet=ot;exports.submitEvmNftWithdrawal=I;exports.submitEvmNftWithdrawal721=V;exports.submitEvmTokenWithdrawal=T;exports.toAppKitNetwork=rt;exports.toErrorMessage=g;exports.walletLoginFail=h;exports.withdrawNftEvm=$;exports.withdrawTokenEvm=Z;exports.withdrawTokenSolana=X;exports.writeAndWait=f;
1
+ 'use strict';var viem=require('viem'),core=require('@idosgames/core');function g(e){return e instanceof viem.BaseError?e.shortMessage:e instanceof Error?e.message:String(e)}function a(e,t,n){return {ok:false,stage:e,error:t,...n}}function f(e,t){return {ok:false,stage:e,error:t}}var R={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"}}},H={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"}}},M={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"}}},F={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"}}},L={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"}}},U={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"}}},q={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"}}},O={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"}}},G={mainnet:R,bsc:H,polygon:M,base:F,arbitrum:L,optimism:U,sepolia:q,polygonAmoy:O};function lt(e){return Object.values(G).find(t=>t.id===e)}function pt(e){return {...e,chainNamespace:"eip155",caipNetworkId:`eip155:${e.id}`}}var ct={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"},dt={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"};var w=[{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:"splits",type:"tuple[]",components:[{name:"to",type:"address"},{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:"withdrawERC1155",stateMutability:"nonpayable",inputs:[{name:"token",type:"address"},{name:"to",type:"address"},{name:"id",type:"uint256"},{name:"amount",type:"uint256"},{name:"splits",type:"tuple[]",components:[{name:"to",type:"address"},{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:[]}],C=[{type:"function",name:"withdrawERC1155Mint",stateMutability:"nonpayable",inputs:[{name:"collection",type:"address"},{name:"to",type:"address"},{name:"id",type:"uint256"},{name:"amount",type:"uint256"},{name:"splits",type:"tuple[]",components:[{name:"to",type:"address"},{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"}]}],A=[{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"}]}],D=[{type:"function",name:"safeTransferFrom",stateMutability:"nonpayable",inputs:[{name:"from",type:"address"},{name:"to",type:"address"},{name:"tokenId",type:"uint256"},{name:"data",type:"bytes"}],outputs:[]}];function x(e,t,n){return viem.encodeAbiParameters([{type:"string"},{type:"string"},{type:"string"}],[e,t,core.normalizeBlockchainCategory(n)])}async function h(e,t){let{walletClient:n,publicClient:o,account:l}=e,i=await n.writeContract({address:t.address,abi:t.abi,functionName:t.functionName,args:t.args,account:l,chain:n.chain,value:t.value});if((await o.waitForTransactionReceipt({hash:i})).status==="reverted")throw new Error(`On-chain transaction reverted (${i}).`);return i}function T(e){let t=e.RewardPoolAddress;return t||null}async function v(e,t,n,o){return await e.publicClient.readContract({address:t,abi:b,functionName:"allowance",args:[e.account,n]})>=o?null:h(e,{address:t,abi:b,functionName:"approve",args:[n,o]})}async function E(e){let{client:t,clients:n,network:o,tokenAddress:l,amount:i,titleID:d,category:c}=e,r=t.auth.context?.userID;if(!r)return a("approve","Not logged in.");let m=T(o);if(!m)return a("approve","Network has no RewardPoolAddress.");if(i<=0n)return a("approve","Amount must be positive.");try{await v(n,l,m,i);}catch(u){return a("approve",g(u))}let s;try{s=await h(n,{address:m,abi:w,functionName:"depositERC20",args:[l,i,r,d,c??""]});}catch(u){return a("deposit-onchain",g(u))}let p=await t.blockchain.depositToken(o.NetworkID??"",s);return p.ok?{ok:true,onChainTxHash:s,data:p.data}:a("report",p.error,{onChainTxHash:s})}async function $(e){let{clients:t,poolAddress:n,tokenAddress:o,amount:l,userID:i,titleID:d,category:c}=e;if(!i)return a("approve","userID is required.");if(l<=0n)return a("approve","Amount must be positive.");try{await v(t,o,n,l);}catch(r){return a("approve",g(r))}try{let r=await h(t,{address:n,abi:w,functionName:"depositERC20",args:[o,l,i,d,c??""]});return {ok:!0,onChainTxHash:r,data:{txHash:r}}}catch(r){return a("deposit-onchain",g(r))}}async function z(e){let{client:t,clients:n,network:o,nftContractAddress:l,tokenId:i,amount:d,titleID:c,category:r}=e,m=t.auth.context?.userID;if(!m)return a("deposit-onchain","Not logged in.");let s=T(o);if(!s)return a("deposit-onchain","Network has no RewardPoolAddress.");if(d<=0n)return a("deposit-onchain","Amount must be positive.");let p=x(m,c,r),u;try{u=await h(n,{address:l,abi:A,functionName:"safeTransferFrom",args:[n.account,s,i,d,p]});}catch(k){return a("deposit-onchain",g(k))}let y=await t.blockchain.depositNFT(o.NetworkID??"",u);return y.ok?{ok:true,onChainTxHash:u,data:y.data}:a("report",y.error,{onChainTxHash:u})}async function V(e){let{client:t,clients:n,network:o,nftContractAddress:l,tokenId:i,titleID:d,category:c}=e,r=t.auth.context?.userID;if(!r)return a("deposit-onchain","Not logged in.");let m=T(o);if(!m)return a("deposit-onchain","Network has no RewardPoolAddress.");let s=x(r,d,c),p;try{p=await h(n,{address:l,abi:D,functionName:"safeTransferFrom",args:[n.account,m,i,s]});}catch(y){return a("deposit-onchain",g(y))}let u=await t.blockchain.depositNFT(o.NetworkID??"",p);return u.ok?{ok:true,onChainTxHash:p,data:u.data}:a("report",u.error,{onChainTxHash:p})}function I(e){return (e.Splits??[]).map(t=>({to:t.To,amount:BigInt(t.Amount??"0")}))}async function W(e,t){return h(e,{address:t.ContractAddress,abi:w,functionName:"withdrawERC20",args:[t.TokenAddress,t.WalletAddress,BigInt(t.Amount??"0"),BigInt(t.BurnAmount??"0"),I(t),BigInt(t.Nonce??"0"),t.Signature??"0x",t.UserID??"",t.TitleID??"",t.Category??"",BigInt(t.Deadline??"0")]})}async function N(e,t){return h(e,{address:t.ContractAddress,abi:C,functionName:"withdrawERC1155Mint",args:[t.TokenAddress,t.WalletAddress,BigInt(t.TokenId??"0"),BigInt(t.Amount??"0"),I(t),BigInt(t.Nonce??"0"),t.Signature??"0x",t.UserID??"",t.TitleID??"",t.Category??"",BigInt(t.Deadline??"0")]})}async function Z(e,t){return h(e,{address:t.ContractAddress,abi:C,functionName:"withdrawERC721Mint",args:[t.TokenAddress,t.WalletAddress,BigInt(t.TokenId??"0"),BigInt(t.Nonce??"0"),t.Signature??"0x",t.UserID??"",t.TitleID??"",t.Category??"",BigInt(t.Deadline??"0")]})}async function J(e){let{client:t,clients:n,currencyID:o,networkID:l,walletAddress:i,amount:d,category:c}=e,r=await t.blockchain.requestTokenWithdrawal(o,l,i,d,c);if(!r.ok)return a("request",r.error);let m=r.data.EvmSignature,s=r.data.TitleTransactionID??void 0;if(!m)return a("request","Withdrawal response carried no EVM signature.",{titleTransactionID:s});let p;try{p=await W(n,m);}catch(y){return a("withdraw-onchain",g(y),{titleTransactionID:s})}let u=await B(t,s,p);return u.ok?{ok:true,onChainTxHash:p,data:r.data}:u}async function j(e){let{client:t,clients:n,itemID:o,networkID:l,walletAddress:i,amount:d,category:c}=e,r=await t.blockchain.requestNFTWithdrawal(o,l,i,d,c);if(!r.ok)return a("request",r.error);let m=r.data.EvmSignature,s=r.data.TitleTransactionID??void 0;if(!m)return a("request","Withdrawal response carried no EVM signature.",{titleTransactionID:s});let p;try{p=await N(n,m);}catch(y){return a("withdraw-onchain",g(y),{titleTransactionID:s})}let u=await B(t,s,p);return u.ok?{ok:true,onChainTxHash:p,data:r.data}:u}async function B(e,t,n){if(!t)return a("confirm","Missing TitleTransactionID.",{onChainTxHash:n});let o=await e.blockchain.confirmWithdrawal(t,n);return o.ok?{ok:true,onChainTxHash:n,data:o.data}:a("confirm",o.error,{onChainTxHash:n,titleTransactionID:t})}async function Q(e){let{client:t,clients:n,networkID:o}=e,l=e.walletAddress??n.account,i=await t.auth.requestWalletChallenge(l,o);if(!i.ok)return f("challenge",i.error);let d;try{d=await n.walletClient.signMessage({account:n.account,message:i.data.Message});}catch(r){return f("sign",g(r))}let c=await t.auth.loginWithWallet(l,o,d);return c.ok?{ok:true,data:c.data}:f("login",c.error)}async function _(e){let{client:t,clients:n,network:o,tokenAddress:l,decimals:i,titleID:d,shortfall:c,completePurchase:r,bufferRatio:m=0,category:s}=e;if(c.missing<=0)return a("approve","Nothing to deposit.");let p=c.missing*(1+Math.max(0,m)),u;try{u=viem.parseUnits(tt(p,i),i);}catch(P){return a("approve",g(P))}let y=await E({client:t,clients:n,network:o,tokenAddress:l,amount:u,titleID:d,category:s});if(!y.ok)return y;let k=await r();return k.ok?{ok:true,onChainTxHash:y.onChainTxHash,data:k.data}:a("report",k.error,{onChainTxHash:y.onChainTxHash})}function tt(e,t){return e.toFixed(Math.min(t,18)).replace(/0+$/,"").replace(/\.$/,"")||"0"}async function nt(e){let{client:t,adapter:n,network:o,mint:l,amountRaw:i,titleID:d,category:c}=e,r=t.auth.context?.userID;if(!r)return a("deposit-onchain","Not logged in.");if(i<=0n)return a("deposit-onchain","Amount must be positive.");let m;try{m=await n.depositSpl({mint:l,amountRaw:i,userID:r,titleID:d,category:core.normalizeBlockchainCategory(c)});}catch(p){return a("deposit-onchain",g(p))}let s=await t.blockchain.depositToken(o.NetworkID??"",m);return s.ok?{ok:true,onChainTxHash:m,data:s.data}:a("report",s.error,{onChainTxHash:m})}async function at(e){let{client:t,adapter:n,currencyID:o,networkID:l,walletAddress:i,amount:d,category:c}=e,r=await t.blockchain.requestTokenWithdrawal(o,l,i,d,c);if(!r.ok)return a("request",r.error);let m=r.data.SolanaSignature,s=r.data.TitleTransactionID??void 0;if(!m)return a("request","Withdrawal response carried no Solana signature.",{titleTransactionID:s});let p;try{p=await n.submitWithdrawal(m);}catch(y){return a("withdraw-onchain",g(y),{titleTransactionID:s})}if(!s)return a("confirm","Missing TitleTransactionID.",{onChainTxHash:p});let u=await t.blockchain.confirmWithdrawal(s,p);return u.ok?{ok:true,onChainTxHash:p,data:r.data}:a("confirm",u.error,{onChainTxHash:p,titleTransactionID:s})}async function rt(e){let{client:t,networkID:n,walletAddress:o,signMessage:l}=e,i=await t.auth.requestWalletChallenge(o,n);if(!i.ok)return f("challenge",i.error);let d;try{let r=await l(new TextEncoder().encode(i.data.Message));d=ot(r);}catch(r){return f("sign",g(r))}let c=await t.auth.loginWithWallet(o,n,d);return c.ok?{ok:true,data:c.data}:f("login",c.error)}function ot(e){let t="0x";for(let n of e)t+=n.toString(16).padStart(2,"0");return t}
2
+ exports.arbitrum=L;exports.base=F;exports.bridgeFail=a;exports.bsc=H;exports.chainById=lt;exports.depositNftEvm=z;exports.depositNftEvm721=V;exports.depositTokenEvm=E;exports.depositTokenOnChainEvm=$;exports.depositTokenSolana=nt;exports.encodeNftDepositData=x;exports.ensureErc20Allowance=v;exports.erc1155Abi=A;exports.erc20Abi=b;exports.erc721Abi=D;exports.idosChains=G;exports.loginWithWalletEvm=Q;exports.loginWithWalletSolana=rt;exports.mainnet=R;exports.optimism=U;exports.payWithWalletEvm=_;exports.polygon=M;exports.polygonAmoy=O;exports.rewardPoolAbi=w;exports.sepolia=q;exports.solanaDevnet=dt;exports.solanaMainnet=ct;exports.submitEvmNftWithdrawal=N;exports.submitEvmNftWithdrawal721=Z;exports.submitEvmTokenWithdrawal=W;exports.toAppKitNetwork=pt;exports.toErrorMessage=g;exports.walletLoginFail=f;exports.withdrawNftEvm=j;exports.withdrawTokenEvm=J;exports.withdrawTokenSolana=at;exports.writeAndWait=h;
package/dist/index.d.cts CHANGED
@@ -1,11 +1,11 @@
1
- import { W as WalletLoginResult } from './types-C11zAA05.cjs';
2
- export { B as BridgeFailure, a as BridgeResult, b as BridgeStage, c as BridgeSuccess, d as WalletLoginFailure, e as WalletLoginStage, f as WalletLoginSuccess, g as bridgeFail, t as toErrorMessage, w as walletLoginFail } from './types-C11zAA05.cjs';
1
+ import { W as WalletLoginResult, B as BridgeResult } from './types-CeUVf1tr.cjs';
2
+ export { a as BridgeFailure, b as BridgeStage, c as BridgeSuccess, d as WalletLoginFailure, e as WalletLoginStage, f as WalletLoginSuccess, g as bridgeFail, t as toErrorMessage, w as walletLoginFail } from './types-CeUVf1tr.cjs';
3
3
  export { A as AppKitEvmNetwork, a as AppKitSolanaNetwork, b as arbitrum, c as base, d as bsc, e as chainById, i as idosChains, m as mainnet, o as optimism, p as polygon, f as polygonAmoy, s as sepolia, g as solanaDevnet, h as solanaMainnet, t as toAppKitNetwork } from './chains-B_P3u8_S.cjs';
4
- import { Hex } from 'viem';
5
- import { E as EvmBridgeClients } from './withdraw-CwX4HY2X.cjs';
6
- export { D as DepositNft721EvmParams, a as DepositNftEvmParams, b as DepositTokenEvmParams, W as WithdrawNftEvmParams, c as WithdrawTokenEvmParams, d as depositNftEvm, e as depositNftEvm721, f as depositTokenEvm, g as ensureErc20Allowance, s as submitEvmNftWithdrawal, h as submitEvmNftWithdrawal721, i as submitEvmTokenWithdrawal, w as withdrawNftEvm, j as withdrawTokenEvm, k as writeAndWait } from './withdraw-CwX4HY2X.cjs';
7
- import { IDosGamesClient, ClientState } from '@idosgames/core';
8
- export { D as DepositTokenSolanaParams, S as SolanaProgramAdapter, W as WithdrawTokenSolanaParams, d as depositTokenSolana, w as withdrawTokenSolana } from './bridge-CoVqGUFt.cjs';
4
+ import { Hex, Address } from 'viem';
5
+ import { E as EvmBridgeClients } from './withdraw-C5y67V7i.cjs';
6
+ export { D as DepositNft721EvmParams, a as DepositNftEvmParams, b as DepositTokenEvmParams, c as DepositTokenOnChainParams, W as WithdrawNftEvmParams, d as WithdrawTokenEvmParams, e as depositNftEvm, f as depositNftEvm721, g as depositTokenEvm, h as depositTokenOnChainEvm, i as ensureErc20Allowance, s as submitEvmNftWithdrawal, j as submitEvmNftWithdrawal721, k as submitEvmTokenWithdrawal, w as withdrawNftEvm, l as withdrawTokenEvm, m as writeAndWait } from './withdraw-C5y67V7i.cjs';
7
+ import { IDosGamesClient, ClientState, BlockchainNetworkDefinition, CryptoShortfall, OperationResult } from '@idosgames/core';
8
+ export { D as DepositTokenSolanaParams, S as SolanaProgramAdapter, W as WithdrawTokenSolanaParams, d as depositTokenSolana, w as withdrawTokenSolana } from './bridge-f3pZbjqs.cjs';
9
9
 
10
10
  declare const rewardPoolAbi: readonly [{
11
11
  readonly type: "function";
@@ -333,6 +333,42 @@ interface LoginWithWalletEvmParams {
333
333
  */
334
334
  declare function loginWithWalletEvm(params: LoginWithWalletEvmParams): Promise<WalletLoginResult<ClientState>>;
335
335
 
336
+ interface PayWithWalletParams<T> {
337
+ client: IDosGamesClient;
338
+ clients: EvmBridgeClients;
339
+ network: BlockchainNetworkDefinition;
340
+ /** ERC-20 contract of the currency the price is denominated in. */
341
+ tokenAddress: Address;
342
+ /** On-chain decimals of that token in this network (`CryptoNetworkBinding.Decimals`). */
343
+ decimals: number;
344
+ titleID: string;
345
+ /** What the player is short on — from `client.checkout.cryptoShortfallOf(option.Cost)`. */
346
+ shortfall: CryptoShortfall;
347
+ /**
348
+ * The purchase itself: `client.store.purchase(...)`, `client.lootbox.open(...)`, … Called ONLY
349
+ * after the deposit is credited. Kept as a callback because only the calling module knows the
350
+ * rest of the request (count, ids, idempotency key).
351
+ */
352
+ completePurchase: () => Promise<OperationResult<T>>;
353
+ /** Extra tokens to deposit on top of the shortfall, as a fraction (0.02 = +2%). */
354
+ bufferRatio?: number;
355
+ /** Operation kind echoed into the deposit tx; defaults to the backend's "game_topup". */
356
+ category?: string;
357
+ }
358
+ /**
359
+ * Pays for something with the player's own wallet when their in-game balance is short.
360
+ *
361
+ * ⚠ This is TWO steps, and it cannot be one. A deposit is confirmed on-chain, so the money lands
362
+ * on the in-game balance in one request and the purchase happens in the next. If the game dies in
363
+ * between, nothing is lost — the tokens are credited and the purchase can be retried — but the
364
+ * caller must be able to resume: keep the intent (what was being bought) locally and offer to
365
+ * finish it on the next launch. `completePurchase` is that second half made explicit.
366
+ *
367
+ * The deposit covers only the SHORTFALL, not the whole price: whatever the player already holds
368
+ * in-game is spent first, and asking them to deposit the full amount would strand the rest.
369
+ */
370
+ declare function payWithWalletEvm<T>(params: PayWithWalletParams<T>): Promise<BridgeResult<T>>;
371
+
336
372
  /**
337
373
  * A wallet-adapter message signer: signs raw bytes and returns the 64-byte ed25519 signature.
338
374
  * This is exactly the shape of `@solana/wallet-adapter-react`'s `useWallet().signMessage`.
@@ -356,4 +392,4 @@ interface LoginWithWalletSolanaParams {
356
392
  */
357
393
  declare function loginWithWalletSolana(params: LoginWithWalletSolanaParams): Promise<WalletLoginResult<ClientState>>;
358
394
 
359
- export { EvmBridgeClients, type LoginWithWalletEvmParams, type LoginWithWalletSolanaParams, type SolanaMessageSigner, WalletLoginResult, encodeNftDepositData, erc1155Abi, erc20Abi, erc721Abi, loginWithWalletEvm, loginWithWalletSolana, rewardPoolAbi };
395
+ export { BridgeResult, EvmBridgeClients, type LoginWithWalletEvmParams, type LoginWithWalletSolanaParams, type PayWithWalletParams, type SolanaMessageSigner, WalletLoginResult, encodeNftDepositData, erc1155Abi, erc20Abi, erc721Abi, loginWithWalletEvm, loginWithWalletSolana, payWithWalletEvm, rewardPoolAbi };
package/dist/index.d.ts CHANGED
@@ -1,11 +1,11 @@
1
- import { W as WalletLoginResult } from './types-C11zAA05.js';
2
- export { B as BridgeFailure, a as BridgeResult, b as BridgeStage, c as BridgeSuccess, d as WalletLoginFailure, e as WalletLoginStage, f as WalletLoginSuccess, g as bridgeFail, t as toErrorMessage, w as walletLoginFail } from './types-C11zAA05.js';
1
+ import { W as WalletLoginResult, B as BridgeResult } from './types-CeUVf1tr.js';
2
+ export { a as BridgeFailure, b as BridgeStage, c as BridgeSuccess, d as WalletLoginFailure, e as WalletLoginStage, f as WalletLoginSuccess, g as bridgeFail, t as toErrorMessage, w as walletLoginFail } from './types-CeUVf1tr.js';
3
3
  export { A as AppKitEvmNetwork, a as AppKitSolanaNetwork, b as arbitrum, c as base, d as bsc, e as chainById, i as idosChains, m as mainnet, o as optimism, p as polygon, f as polygonAmoy, s as sepolia, g as solanaDevnet, h as solanaMainnet, t as toAppKitNetwork } from './chains-B_P3u8_S.js';
4
- import { Hex } from 'viem';
5
- import { E as EvmBridgeClients } from './withdraw-C-sFNUnQ.js';
6
- export { D as DepositNft721EvmParams, a as DepositNftEvmParams, b as DepositTokenEvmParams, W as WithdrawNftEvmParams, c as WithdrawTokenEvmParams, d as depositNftEvm, e as depositNftEvm721, f as depositTokenEvm, g as ensureErc20Allowance, s as submitEvmNftWithdrawal, h as submitEvmNftWithdrawal721, i as submitEvmTokenWithdrawal, w as withdrawNftEvm, j as withdrawTokenEvm, k as writeAndWait } from './withdraw-C-sFNUnQ.js';
7
- import { IDosGamesClient, ClientState } from '@idosgames/core';
8
- export { D as DepositTokenSolanaParams, S as SolanaProgramAdapter, W as WithdrawTokenSolanaParams, d as depositTokenSolana, w as withdrawTokenSolana } from './bridge-nELtKkuz.js';
4
+ import { Hex, Address } from 'viem';
5
+ import { E as EvmBridgeClients } from './withdraw-BKVcklPB.js';
6
+ export { D as DepositNft721EvmParams, a as DepositNftEvmParams, b as DepositTokenEvmParams, c as DepositTokenOnChainParams, W as WithdrawNftEvmParams, d as WithdrawTokenEvmParams, e as depositNftEvm, f as depositNftEvm721, g as depositTokenEvm, h as depositTokenOnChainEvm, i as ensureErc20Allowance, s as submitEvmNftWithdrawal, j as submitEvmNftWithdrawal721, k as submitEvmTokenWithdrawal, w as withdrawNftEvm, l as withdrawTokenEvm, m as writeAndWait } from './withdraw-BKVcklPB.js';
7
+ import { IDosGamesClient, ClientState, BlockchainNetworkDefinition, CryptoShortfall, OperationResult } from '@idosgames/core';
8
+ export { D as DepositTokenSolanaParams, S as SolanaProgramAdapter, W as WithdrawTokenSolanaParams, d as depositTokenSolana, w as withdrawTokenSolana } from './bridge-BSTHFExV.js';
9
9
 
10
10
  declare const rewardPoolAbi: readonly [{
11
11
  readonly type: "function";
@@ -333,6 +333,42 @@ interface LoginWithWalletEvmParams {
333
333
  */
334
334
  declare function loginWithWalletEvm(params: LoginWithWalletEvmParams): Promise<WalletLoginResult<ClientState>>;
335
335
 
336
+ interface PayWithWalletParams<T> {
337
+ client: IDosGamesClient;
338
+ clients: EvmBridgeClients;
339
+ network: BlockchainNetworkDefinition;
340
+ /** ERC-20 contract of the currency the price is denominated in. */
341
+ tokenAddress: Address;
342
+ /** On-chain decimals of that token in this network (`CryptoNetworkBinding.Decimals`). */
343
+ decimals: number;
344
+ titleID: string;
345
+ /** What the player is short on — from `client.checkout.cryptoShortfallOf(option.Cost)`. */
346
+ shortfall: CryptoShortfall;
347
+ /**
348
+ * The purchase itself: `client.store.purchase(...)`, `client.lootbox.open(...)`, … Called ONLY
349
+ * after the deposit is credited. Kept as a callback because only the calling module knows the
350
+ * rest of the request (count, ids, idempotency key).
351
+ */
352
+ completePurchase: () => Promise<OperationResult<T>>;
353
+ /** Extra tokens to deposit on top of the shortfall, as a fraction (0.02 = +2%). */
354
+ bufferRatio?: number;
355
+ /** Operation kind echoed into the deposit tx; defaults to the backend's "game_topup". */
356
+ category?: string;
357
+ }
358
+ /**
359
+ * Pays for something with the player's own wallet when their in-game balance is short.
360
+ *
361
+ * ⚠ This is TWO steps, and it cannot be one. A deposit is confirmed on-chain, so the money lands
362
+ * on the in-game balance in one request and the purchase happens in the next. If the game dies in
363
+ * between, nothing is lost — the tokens are credited and the purchase can be retried — but the
364
+ * caller must be able to resume: keep the intent (what was being bought) locally and offer to
365
+ * finish it on the next launch. `completePurchase` is that second half made explicit.
366
+ *
367
+ * The deposit covers only the SHORTFALL, not the whole price: whatever the player already holds
368
+ * in-game is spent first, and asking them to deposit the full amount would strand the rest.
369
+ */
370
+ declare function payWithWalletEvm<T>(params: PayWithWalletParams<T>): Promise<BridgeResult<T>>;
371
+
336
372
  /**
337
373
  * A wallet-adapter message signer: signs raw bytes and returns the 64-byte ed25519 signature.
338
374
  * This is exactly the shape of `@solana/wallet-adapter-react`'s `useWallet().signMessage`.
@@ -356,4 +392,4 @@ interface LoginWithWalletSolanaParams {
356
392
  */
357
393
  declare function loginWithWalletSolana(params: LoginWithWalletSolanaParams): Promise<WalletLoginResult<ClientState>>;
358
394
 
359
- export { EvmBridgeClients, type LoginWithWalletEvmParams, type LoginWithWalletSolanaParams, type SolanaMessageSigner, WalletLoginResult, encodeNftDepositData, erc1155Abi, erc20Abi, erc721Abi, loginWithWalletEvm, loginWithWalletSolana, rewardPoolAbi };
395
+ export { BridgeResult, EvmBridgeClients, type LoginWithWalletEvmParams, type LoginWithWalletSolanaParams, type PayWithWalletParams, type SolanaMessageSigner, WalletLoginResult, encodeNftDepositData, erc1155Abi, erc20Abi, erc721Abi, loginWithWalletEvm, loginWithWalletSolana, payWithWalletEvm, rewardPoolAbi };
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- export{i as depositNftEvm,j as depositNftEvm721,h as depositTokenEvm,e as encodeNftDepositData,g as ensureErc20Allowance,c as erc1155Abi,b as erc20Abi,d as erc721Abi,p as loginWithWalletEvm,a as rewardPoolAbi,l as submitEvmNftWithdrawal,m as submitEvmNftWithdrawal721,k as submitEvmTokenWithdrawal,o as withdrawNftEvm,n as withdrawTokenEvm,f as writeAndWait}from'./chunk-OWJXQVDR.js';export{a as depositTokenSolana,c as loginWithWalletSolana,b as withdrawTokenSolana}from'./chunk-44AGTUFV.js';export{b as bridgeFail,a as toErrorMessage,c as walletLoginFail}from'./chunk-K62NMX3A.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,m as solanaDevnet,l as solanaMainnet,k as toAppKitNetwork}from'./chunk-HQNS6ZWL.js';
1
+ export{j as depositNftEvm,k as depositNftEvm721,h as depositTokenEvm,i as depositTokenOnChainEvm,e as encodeNftDepositData,g as ensureErc20Allowance,c as erc1155Abi,b as erc20Abi,d as erc721Abi,q as loginWithWalletEvm,r as payWithWalletEvm,a as rewardPoolAbi,m as submitEvmNftWithdrawal,n as submitEvmNftWithdrawal721,l as submitEvmTokenWithdrawal,p as withdrawNftEvm,o as withdrawTokenEvm,f as writeAndWait}from'./chunk-ZHQHOW45.js';export{a as depositTokenSolana,c as loginWithWalletSolana,b as withdrawTokenSolana}from'./chunk-44AGTUFV.js';export{b as bridgeFail,a as toErrorMessage,c as walletLoginFail}from'./chunk-K62NMX3A.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,m as solanaDevnet,l as solanaMainnet,k as toAppKitNetwork}from'./chunk-HQNS6ZWL.js';
@@ -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 j={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"}}},_={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"}}},z={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"}}},$={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"}}},Y={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"}}},Q={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"}}},Z={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"}}},Ce={mainnet:j,bsc:_,polygon:z,base:V,arbitrum:$,optimism:Y,sepolia:Q,polygonAmoy:Z};function je(e){return Object.values(Ce).find(t=>t.id===e)}function be(e){return {...e,chainNamespace:"eip155",caipNetworkId:`eip155:${e.id}`}}var ve=null;function ke(e){ve=e;}function ae(){return ve}var Ee=[j,_,z,V,$,Y,Q,Z],ie=new Map;function se(e){let{chains:t=Ee,walletConnectProjectId:n,appName:o,appUrl:r,appIcon:a,transports:p,connectors:l}=e,i=n??"__extension_only__";if(!l){let y=ie.get(i);if(y)return y}let u={};for(let y of t)u[y.id]=p?.[y.id]??wagmi.http();let d=r??(typeof window<"u"?window.location.origin:""),m={name:o??"iDosGames",description:o??"iDosGames game",url:d,icons:a?[a]:[]};if(n&&!l){let y=t.map(be),D=new appkitAdapterWagmi.WagmiAdapter({networks:y,projectId:n,transports:u});return ke(react.createAppKit({adapters:[D],networks:y,projectId:n,metadata:m,features:{analytics:false,email:false,socials:false}})),ie.set(i,D.wagmiConfig),D.wagmiConfig}let f=l??[connectors.injected(),connectors.coinbaseWallet({appName:o??"iDosGames"})],h=wagmi.createConfig({chains:t,connectors:f,transports:u});return l||ie.set(i,h),h}function G(e){let{wagmiConfig:t,queryClient:n,children:o}=e,[r]=react$1.useState(()=>n??new reactQuery.QueryClient);return jsxRuntime.jsx(wagmi.WagmiProvider,{config:t,children:jsxRuntime.jsx(reactQuery.QueryClientProvider,{client:r,children:o})})}var J=[{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:"splits",type:"tuple[]",components:[{name:"to",type:"address"},{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:"withdrawERC1155",stateMutability:"nonpayable",inputs:[{name:"token",type:"address"},{name:"to",type:"address"},{name:"id",type:"uint256"},{name:"amount",type:"uint256"},{name:"splits",type:"tuple[]",components:[{name:"to",type:"address"},{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:"splits",type:"tuple[]",components:[{name:"to",type:"address"},{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:[]}],le=[{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"}]}],De=[{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 Ne(e,t,n){return viem.encodeAbiParameters([{type:"string"},{type:"string"},{type:"string"}],[e,t,core.normalizeBlockchainCategory(n)])}async function T(e,t){let{walletClient:n,publicClient:o,account:r}=e,a=await n.writeContract({address:t.address,abi:t.abi,functionName:t.functionName,args:t.args,account:r,chain:n.chain,value:t.value});if((await o.waitForTransactionReceipt({hash:a})).status==="reverted")throw new Error(`On-chain transaction reverted (${a}).`);return a}function A(e){return e instanceof viem.BaseError?e.shortMessage:e instanceof Error?e.message:String(e)}function c(e,t,n){return {ok:false,stage:e,error:t,...n}}function M(e,t){return {ok:false,stage:e,error:t}}function Pe(e){let t=e.RewardPoolAddress;return t||null}async function Ie(e,t,n,o){return await e.publicClient.readContract({address:t,abi:le,functionName:"allowance",args:[e.account,n]})>=o?null:T(e,{address:t,abi:le,functionName:"approve",args:[n,o]})}async function ce(e){let{client:t,clients:n,network:o,tokenAddress:r,amount:a,titleID:p,category:l}=e,i=t.auth.context?.userID;if(!i)return c("approve","Not logged in.");let u=Pe(o);if(!u)return c("approve","Network has no RewardPoolAddress.");if(a<=0n)return c("approve","Amount must be positive.");try{await Ie(n,r,u,a);}catch(f){return c("approve",A(f))}let d;try{d=await T(n,{address:u,abi:J,functionName:"depositERC20",args:[r,a,i,p,l??""]});}catch(f){return c("deposit-onchain",A(f))}let m=await t.blockchain.depositToken(o.NetworkID??"",d);return m.ok?{ok:true,onChainTxHash:d,data:m.data}:c("report",m.error,{onChainTxHash:d})}async function pe(e){let{client:t,clients:n,network:o,nftContractAddress:r,tokenId:a,amount:p,titleID:l,category:i}=e,u=t.auth.context?.userID;if(!u)return c("deposit-onchain","Not logged in.");let d=Pe(o);if(!d)return c("deposit-onchain","Network has no RewardPoolAddress.");if(p<=0n)return c("deposit-onchain","Amount must be positive.");let m=Ne(u,l,i),f;try{f=await T(n,{address:r,abi:De,functionName:"safeTransferFrom",args:[n.account,d,a,p,m]});}catch(y){return c("deposit-onchain",A(y))}let h=await t.blockchain.depositNFT(o.NetworkID??"",f);return h.ok?{ok:true,onChainTxHash:f,data:h.data}:c("report",h.error,{onChainTxHash:f})}function We(e){return (e.Splits??[]).map(t=>({to:t.To,amount:BigInt(t.Amount??"0")}))}async function Te(e,t){return T(e,{address:t.ContractAddress,abi:J,functionName:"withdrawERC20",args:[t.TokenAddress,t.WalletAddress,BigInt(t.Amount??"0"),BigInt(t.BurnAmount??"0"),We(t),BigInt(t.Nonce??"0"),t.Signature??"0x",t.UserID??"",t.TitleID??"",t.Category??"",BigInt(t.Deadline??"0")]})}async function Se(e,t){return T(e,{address:t.ContractAddress,abi:Ae,functionName:"withdrawERC1155Mint",args:[t.TokenAddress,t.WalletAddress,BigInt(t.TokenId??"0"),BigInt(t.Amount??"0"),We(t),BigInt(t.Nonce??"0"),t.Signature??"0x",t.UserID??"",t.TitleID??"",t.Category??"",BigInt(t.Deadline??"0")]})}async function de(e){let{client:t,clients:n,currencyID:o,networkID:r,walletAddress:a,amount:p,category:l}=e,i=await t.blockchain.requestTokenWithdrawal(o,r,a,p,l);if(!i.ok)return c("request",i.error);let u=i.data.EvmSignature,d=i.data.TitleTransactionID??void 0;if(!u)return c("request","Withdrawal response carried no EVM signature.",{titleTransactionID:d});let m;try{m=await Te(n,u);}catch(h){return c("withdraw-onchain",A(h),{titleTransactionID:d})}let f=await Be(t,d,m);return f.ok?{ok:true,onChainTxHash:m,data:i.data}:f}async function ue(e){let{client:t,clients:n,itemID:o,networkID:r,walletAddress:a,amount:p,category:l}=e,i=await t.blockchain.requestNFTWithdrawal(o,r,a,p,l);if(!i.ok)return c("request",i.error);let u=i.data.EvmSignature,d=i.data.TitleTransactionID??void 0;if(!u)return c("request","Withdrawal response carried no EVM signature.",{titleTransactionID:d});let m;try{m=await Se(n,u);}catch(h){return c("withdraw-onchain",A(h),{titleTransactionID:d})}let f=await Be(t,d,m);return f.ok?{ok:true,onChainTxHash:m,data:i.data}:f}async function Be(e,t,n){if(!t)return c("confirm","Missing TitleTransactionID.",{onChainTxHash:n});let o=await e.blockchain.confirmWithdrawal(t,n);return o.ok?{ok:true,onChainTxHash:n,data:o.data}:c("confirm",o.error,{onChainTxHash:n,titleTransactionID:t})}async function O(e){let{client:t,clients:n,networkID:o}=e,r=e.walletAddress??n.account,a=await t.auth.requestWalletChallenge(r,o);if(!a.ok)return M("challenge",a.error);let p;try{p=await n.walletClient.signMessage({account:n.account,message:a.data.Message});}catch(i){return M("sign",A(i))}let l=await t.auth.loginWithWallet(r,o,p);return l.ok?{ok:true,data:l.data}:M("login",l.error)}function X(){let{address:e}=wagmi.useAccount(),t=wagmi.usePublicClient(),{data:n}=wagmi.useWalletClient();return !e||!t||!n?null:{account:e,publicClient:t,walletClient:n}}var U="Wallet not connected.";function me(e,t){let n=X();return {connected:!!n,account:n?.account??null,loginWithWallet:(o,r)=>n?O({client:e,clients:n,networkID:o,walletAddress:r}):Promise.resolve(M("challenge",U)),depositToken:o=>n?ce({client:e,clients:n,titleID:t,...o}):Promise.resolve(c("approve",U)),depositNft:o=>n?pe({client:e,clients:n,titleID:t,...o}):Promise.resolve(c("deposit-onchain",U)),withdrawToken:o=>n?de({client:e,clients:n,...o}):Promise.resolve(c("withdraw-onchain",U)),withdrawNft:o=>n?ue({client:e,clients:n,...o}):Promise.resolve(c("withdraw-onchain",U))}}function mt(e){let{wagmiConfig:t,...n}=e;return jsxRuntime.jsx(G,{wagmiConfig:t,children:jsxRuntime.jsx(He,{...n})})}function ft(e){return e instanceof Error&&(e.name==="ConnectorAlreadyConnectedError"||e.message.includes("already connected"))}function gt(e){let t="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.":t:t}async function Fe(e){let t=await actions.getWalletClient(e).catch(()=>null);if(!t)return null;let n=actions.getPublicClient(e);return n?{account:t.account.address,publicClient:n,walletClient:t}:null}function yt(e,t=18e4){return actions.getAccount(e).isConnected?Promise.resolve(true):new Promise(n=>{let o=false,r=l=>{o||(o=true,a(),clearTimeout(p),n(l));},a=actions.watchAccount(e,{onChange:l=>{l.isConnected&&r(true);}}),p=setTimeout(()=>r(false),t);})}function wt(e,t=8e3){let n=o=>o==="reconnecting"||o==="connecting";return n(actions.getAccount(e).status)?new Promise(o=>{let r=false,a=()=>{r||(r=true,p(),clearTimeout(l),o());},p=actions.watchAccount(e,{onChange:i=>{n(i.status)||a();}}),l=setTimeout(a,t);}):Promise.resolve()}function ht(e){let t=r=>e.find(a=>a.id===r||a.type===r),n=t("injected"),o=typeof window<"u"&&window.ethereum!=null;return n&&o?n:t("walletConnect")??n??e[0]}var Ct=9e4;async function bt(e){try{let o=(await actions.getAccount(e).connector?.getProvider?.())?.session?.peer?.metadata?.redirect,r=o?.native||o?.universal;return !r||typeof window>"u"?!1:(window.location.href=r,!0)}catch{return false}}function vt(e,t){return new Promise((n,o)=>{let r=setTimeout(()=>o(new Error("The wallet request timed out.")),t);e.then(a=>{clearTimeout(r),n(a);},a=>{clearTimeout(r),o(a instanceof Error?a:new Error(String(a)));});})}function He(e){let{client:t,networkID:n,onAuthenticated:o,disabled:r,label:a,style:p,autoStart:l}=e,i=wagmi.useConfig(),{isConnected:u}=wagmi.useAccount(),{connectAsync:d,connectors:m}=wagmi.useConnect(),f=X(),[h,y]=react$1.useState(false),[D,C]=react$1.useState(null),[H,E]=react$1.useState(false),L=react$1.useRef(0),B=react$1.useRef(false),q=async()=>{let I=++L.current,N=()=>L.current===I;y(true),C(null);try{if(await wt(i),!N())return;if(!actions.getAccount(i).isConnected){let k=ae();if(k){if(await k.open(),!await yt(i)){C("No wallet was connected.");return}}else {let oe=ht(m);if(!oe){C("No wallet connector is configured.");return}try{await d({connector:oe});}catch(W){if(!ft(W))throw W}}}let b=f??await Fe(i);if(!b&&actions.getAccount(i).isConnected&&(await new Promise(k=>setTimeout(k,300)),b=await Fe(i),!N()))return;if(!b){C("Wallet client is not available.");return}E(!0);let x=await vt(O({client:t,clients:b,networkID:n}),Ct);if(!N())return;if(x.ok){o();return}C(x.stage==="sign"?"Signature declined.":x.error??"Wallet sign-in failed.");}catch(b){if(!N())return;console.error("[idosgames/wallet] wallet sign-in failed:",b),C(gt(b));}finally{N()&&(y(false),E(false));}};react$1.useEffect(()=>{!l||B.current||(B.current=true,q());},[l]);let R=async()=>{await bt(i)||await ae()?.open();};return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("button",{type:"button",onClick:()=>{H?R():q();},disabled:r,style:{...kt,...r?{opacity:.6,cursor:"default"}:null,...p},children:H?"Waiting for signature \u2014 tap to open wallet":h?"Check your wallet\u2026":u?a??"Sign in with wallet":"Connect wallet"}),D&&jsxRuntime.jsx("span",{role:"alert",style:Et,children:D})]})}var kt={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"};var St={pointerEvents:"auto",background:"#04276bf5",border:"1px solid #1e59c8",borderRadius:12,padding:16,color:"#fff",width:320,boxSizing:"border-box",fontFamily:"system-ui, sans-serif",display:"flex",flexDirection:"column",gap:10,maxHeight:"80vh",overflow:"auto"},Bt={fontWeight:700,fontSize:16},S={fontSize:12,opacity:.7},ge={background:"#052e7e",border:"1px solid #1e59c8",borderRadius:8,color:"#fff",padding:"8px 10px",width:"100%",boxSizing:"border-box"},Rt={background:"#0d66fe",color:"#fff",border:"none",borderRadius:8,padding:"9px 14px",fontWeight:700,cursor:"pointer"},te={background:"#1e59c8",color:"#fff",border:"none",borderRadius:8,padding:"7px 12px",fontWeight:600,cursor:"pointer"},ye={display:"flex",gap:8};function Ft(e){let{client:t,walletConnectProjectId:n,appName:o,onClose:r,style:a}=e,[p,l]=react$1.useState(n??"");react$1.useEffect(()=>{if(n)return;let u=true;return (async()=>{let d=await t.blockchain.getDefinitions();if(!u||!d.ok)return;let m=d.data.Blockchain?.WalletLogin?.WalletConnectProjectId;m&&l(m);})(),()=>{u=false;}},[t,n]);let i=react$1.useMemo(()=>se({walletConnectProjectId:p||void 0,appName:o}),[p,o]);return jsxRuntime.jsx(G,{wagmiConfig:i,children:jsxRuntime.jsx(Mt,{client:t,appName:o,onClose:r,style:a})})}function Mt({client:e,onClose:t,style:n}){let o=me(e,e.titleID),{address:r,isConnected:a,chainId:p}=wagmi.useAccount(),{connect:l,connectors:i}=wagmi.useConnect(),{disconnect:u}=wagmi.useDisconnect(),{switchChainAsync:d}=wagmi.useSwitchChain(),[,m]=react$1.useReducer(s=>s+1,0),[f,h]=react$1.useState({}),[y,D]=react$1.useState({}),[C,H]=react$1.useState(""),[E,L]=react$1.useState(""),[B,q]=react$1.useState(""),[R,I]=react$1.useState(false),[N,b]=react$1.useState(null);react$1.useEffect(()=>{let s=true;return (async()=>{let w=await e.blockchain.getDefinitions();if(await e.blockchain.getUserState(),!s||!w.ok)return;let F=w.data.Blockchain?.Networks??{},re={};for(let[qe,he]of Object.entries(F))he.Type==="EVM"&&(re[qe]=he);h(re),D(w.data.CryptoCurrencies??{});let Ke=Object.keys(re)[0]??"";H(Ke);})(),()=>{s=false;}},[e]),react$1.useEffect(()=>e.on("user:anyUpdated",m),[e]);let x=react$1.useMemo(()=>Object.entries(y).filter(([,s])=>s.Networks?.some(w=>w.NetworkID===C&&!!w.ContractAddress)),[y,C]);react$1.useEffect(()=>{let s=x[0]?.[0]??"";L(w=>x.some(([F])=>F===w)?w:s);},[x]);let k=C?f[C]:void 0,W=(E?y[E]:void 0)?.Networks?.find(s=>s.NetworkID===C),Ge=E?e.data.user.getCryptoCurrencyAmount(E):"0";async function we(){if(!k?.ChainID||p===k.ChainID)return true;try{return await d({chainId:k.ChainID}),!0}catch{return b({ok:false,stage:"approve",error:`Switch your wallet to chain ${k.ChainID} to continue.`}),false}}async function Oe(){if(!(!k||!W?.ContractAddress)){if(I(true),b(null),await we()){let s=W.Decimals??18,w;try{w=viem.parseUnits(B||"0",s);}catch{b({ok:false,stage:"approve",error:"Invalid amount."}),I(false);return}let F=await o.depositToken({network:k,tokenAddress:W.ContractAddress,amount:w});b(F),F.ok&&await e.blockchain.getUserState();}I(false);}}async function Ue(){if(!(!k||!o.account)){if(I(true),b(null),await we()){let s=await o.withdrawToken({currencyID:E,networkID:C,walletAddress:o.account,amount:B||"0"});b(s),s.ok&&await e.blockchain.getUserState();}I(false);}}return jsxRuntime.jsxs("div",{style:{...St,...n},children:[jsxRuntime.jsxs("div",{style:{...ye,justifyContent:"space-between"},children:[jsxRuntime.jsx("span",{style:Bt,children:"Crypto wallet"}),t&&jsxRuntime.jsx("button",{type:"button",style:te,onClick:t,children:"\u2715"})]}),a?jsxRuntime.jsxs("div",{style:ye,children:[jsxRuntime.jsxs("span",{style:{...S,flex:1,alignSelf:"center"},children:[r?.slice(0,6),"\u2026",r?.slice(-4)]}),jsxRuntime.jsx("button",{type:"button",style:te,onClick:()=>u(),children:"Disconnect"})]}):jsxRuntime.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:6},children:[jsxRuntime.jsx("span",{style:S,children:"Connect a browser or mobile wallet"}),i.map(s=>jsxRuntime.jsx("button",{type:"button",style:te,onClick:()=>l({connector:s}),children:s.name},s.uid))]}),Object.keys(f).length===0?jsxRuntime.jsx("span",{style:S,children:"No EVM networks configured for this title."}):jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsxs("div",{children:[jsxRuntime.jsx("div",{style:S,children:"Network"}),jsxRuntime.jsx("select",{style:ge,value:C,onChange:s=>H(s.target.value),children:Object.entries(f).map(([s,w])=>jsxRuntime.jsx("option",{value:s,children:w.DisplayName??s},s))})]}),jsxRuntime.jsxs("div",{children:[jsxRuntime.jsx("div",{style:S,children:"Token"}),jsxRuntime.jsxs("select",{style:ge,value:E,onChange:s=>L(s.target.value),children:[x.length===0&&jsxRuntime.jsx("option",{value:"",children:"\u2014 no depositable tokens \u2014"}),x.map(([s,w])=>jsxRuntime.jsx("option",{value:s,children:w.DisplayName??s},s))]})]}),jsxRuntime.jsxs("div",{style:S,children:["In-game balance: ",jsxRuntime.jsx("b",{children:Ge})," ",E]}),jsxRuntime.jsxs("div",{children:[jsxRuntime.jsx("div",{style:S,children:"Amount"}),jsxRuntime.jsx("input",{style:ge,inputMode:"decimal",placeholder:"0.0",value:B,onChange:s=>q(s.target.value)})]}),jsxRuntime.jsxs("div",{style:ye,children:[jsxRuntime.jsx("button",{type:"button",style:{...Rt,flex:1,opacity:R?.6:1},disabled:R||!a||!W?.ContractAddress,onClick:()=>{Oe();},children:"Deposit"}),jsxRuntime.jsx("button",{type:"button",style:{...te,flex:1,opacity:R?.6:1},disabled:R||!a||!E,onClick:()=>{Ue();},children:"Withdraw"})]})]}),N&&jsxRuntime.jsx(Ht,{result:N})]})}function Ht({result:e}){let t={fontSize:12,borderRadius:8,padding:"8px 10px",background:e.ok?"#1e3a2a":"#3a1e28",color:e.ok?"#8ef0b0":"#f2a0b4",wordBreak:"break-all"};return e.ok?jsxRuntime.jsxs("div",{style:t,children:["\u2713 Done \xB7 tx ",e.onChainTxHash]}):jsxRuntime.jsxs("div",{style:t,children:["\u2715 [",e.stage,"] ",e.error,e.titleTransactionID?` \xB7 already debited (tx ${e.titleTransactionID}) \u2014 retry/confirm, don't re-request`:""]})}
2
- exports.DEFAULT_EVM_CHAINS=Ee;exports.IDosGamesWalletProvider=G;exports.WalletLogin=mt;exports.WalletLoginButton=He;exports.WalletPanel=Ft;exports.arbitrum=$;exports.base=V;exports.bsc=_;exports.chainById=je;exports.createEvmWalletConfig=se;exports.idosChains=Ce;exports.mainnet=j;exports.optimism=Y;exports.polygon=z;exports.polygonAmoy=Z;exports.sepolia=Q;exports.useEvmBridge=me;exports.useEvmBridgeClients=X;
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 j={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"}}},_={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"}}},z={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"}}},$={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"}}},Y={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"}}},Q={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"}}},Z={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"}}},Ce={mainnet:j,bsc:_,polygon:z,base:V,arbitrum:$,optimism:Y,sepolia:Q,polygonAmoy:Z};function je(e){return Object.values(Ce).find(t=>t.id===e)}function be(e){return {...e,chainNamespace:"eip155",caipNetworkId:`eip155:${e.id}`}}var ve=null;function ke(e){ve=e;}function ae(){return ve}var Ee=[j,_,z,V,$,Y,Q,Z],ie=new Map;function se(e){let{chains:t=Ee,walletConnectProjectId:n,appName:o,appUrl:r,appIcon:a,transports:p,connectors:l}=e,i=n??"__extension_only__";if(!l){let y=ie.get(i);if(y)return y}let u={};for(let y of t)u[y.id]=p?.[y.id]??wagmi.http();let d=r??(typeof window<"u"?window.location.origin:""),m={name:o??"iDosGames",description:o??"iDosGames game",url:d,icons:a?[a]:[]};if(n&&!l){let y=t.map(be),D=new appkitAdapterWagmi.WagmiAdapter({networks:y,projectId:n,transports:u});return ke(react.createAppKit({adapters:[D],networks:y,projectId:n,metadata:m,features:{analytics:false,email:false,socials:false}})),ie.set(i,D.wagmiConfig),D.wagmiConfig}let f=l??[connectors.injected(),connectors.coinbaseWallet({appName:o??"iDosGames"})],h=wagmi.createConfig({chains:t,connectors:f,transports:u});return l||ie.set(i,h),h}function O(e){let{wagmiConfig:t,queryClient:n,children:o}=e,[r]=react$1.useState(()=>n??new reactQuery.QueryClient);return jsxRuntime.jsx(wagmi.WagmiProvider,{config:t,children:jsxRuntime.jsx(reactQuery.QueryClientProvider,{client:r,children:o})})}var J=[{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:"splits",type:"tuple[]",components:[{name:"to",type:"address"},{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:"withdrawERC1155",stateMutability:"nonpayable",inputs:[{name:"token",type:"address"},{name:"to",type:"address"},{name:"id",type:"uint256"},{name:"amount",type:"uint256"},{name:"splits",type:"tuple[]",components:[{name:"to",type:"address"},{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:"splits",type:"tuple[]",components:[{name:"to",type:"address"},{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:[]}],le=[{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"}]}],De=[{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 Pe(e,t,n){return viem.encodeAbiParameters([{type:"string"},{type:"string"},{type:"string"}],[e,t,core.normalizeBlockchainCategory(n)])}async function W(e,t){let{walletClient:n,publicClient:o,account:r}=e,a=await n.writeContract({address:t.address,abi:t.abi,functionName:t.functionName,args:t.args,account:r,chain:n.chain,value:t.value});if((await o.waitForTransactionReceipt({hash:a})).status==="reverted")throw new Error(`On-chain transaction reverted (${a}).`);return a}function A(e){return e instanceof viem.BaseError?e.shortMessage:e instanceof Error?e.message:String(e)}function c(e,t,n){return {ok:false,stage:e,error:t,...n}}function H(e,t){return {ok:false,stage:e,error:t}}function Ne(e){let t=e.RewardPoolAddress;return t||null}async function Ie(e,t,n,o){return await e.publicClient.readContract({address:t,abi:le,functionName:"allowance",args:[e.account,n]})>=o?null:W(e,{address:t,abi:le,functionName:"approve",args:[n,o]})}async function ce(e){let{client:t,clients:n,network:o,tokenAddress:r,amount:a,titleID:p,category:l}=e,i=t.auth.context?.userID;if(!i)return c("approve","Not logged in.");let u=Ne(o);if(!u)return c("approve","Network has no RewardPoolAddress.");if(a<=0n)return c("approve","Amount must be positive.");try{await Ie(n,r,u,a);}catch(f){return c("approve",A(f))}let d;try{d=await W(n,{address:u,abi:J,functionName:"depositERC20",args:[r,a,i,p,l??""]});}catch(f){return c("deposit-onchain",A(f))}let m=await t.blockchain.depositToken(o.NetworkID??"",d);return m.ok?{ok:true,onChainTxHash:d,data:m.data}:c("report",m.error,{onChainTxHash:d})}async function pe(e){let{client:t,clients:n,network:o,nftContractAddress:r,tokenId:a,amount:p,titleID:l,category:i}=e,u=t.auth.context?.userID;if(!u)return c("deposit-onchain","Not logged in.");let d=Ne(o);if(!d)return c("deposit-onchain","Network has no RewardPoolAddress.");if(p<=0n)return c("deposit-onchain","Amount must be positive.");let m=Pe(u,l,i),f;try{f=await W(n,{address:r,abi:De,functionName:"safeTransferFrom",args:[n.account,d,a,p,m]});}catch(y){return c("deposit-onchain",A(y))}let h=await t.blockchain.depositNFT(o.NetworkID??"",f);return h.ok?{ok:true,onChainTxHash:f,data:h.data}:c("report",h.error,{onChainTxHash:f})}function Te(e){return (e.Splits??[]).map(t=>({to:t.To,amount:BigInt(t.Amount??"0")}))}async function We(e,t){return W(e,{address:t.ContractAddress,abi:J,functionName:"withdrawERC20",args:[t.TokenAddress,t.WalletAddress,BigInt(t.Amount??"0"),BigInt(t.BurnAmount??"0"),Te(t),BigInt(t.Nonce??"0"),t.Signature??"0x",t.UserID??"",t.TitleID??"",t.Category??"",BigInt(t.Deadline??"0")]})}async function Be(e,t){return W(e,{address:t.ContractAddress,abi:Ae,functionName:"withdrawERC1155Mint",args:[t.TokenAddress,t.WalletAddress,BigInt(t.TokenId??"0"),BigInt(t.Amount??"0"),Te(t),BigInt(t.Nonce??"0"),t.Signature??"0x",t.UserID??"",t.TitleID??"",t.Category??"",BigInt(t.Deadline??"0")]})}async function de(e){let{client:t,clients:n,currencyID:o,networkID:r,walletAddress:a,amount:p,category:l}=e,i=await t.blockchain.requestTokenWithdrawal(o,r,a,p,l);if(!i.ok)return c("request",i.error);let u=i.data.EvmSignature,d=i.data.TitleTransactionID??void 0;if(!u)return c("request","Withdrawal response carried no EVM signature.",{titleTransactionID:d});let m;try{m=await We(n,u);}catch(h){return c("withdraw-onchain",A(h),{titleTransactionID:d})}let f=await Se(t,d,m);return f.ok?{ok:true,onChainTxHash:m,data:i.data}:f}async function ue(e){let{client:t,clients:n,itemID:o,networkID:r,walletAddress:a,amount:p,category:l}=e,i=await t.blockchain.requestNFTWithdrawal(o,r,a,p,l);if(!i.ok)return c("request",i.error);let u=i.data.EvmSignature,d=i.data.TitleTransactionID??void 0;if(!u)return c("request","Withdrawal response carried no EVM signature.",{titleTransactionID:d});let m;try{m=await Be(n,u);}catch(h){return c("withdraw-onchain",A(h),{titleTransactionID:d})}let f=await Se(t,d,m);return f.ok?{ok:true,onChainTxHash:m,data:i.data}:f}async function Se(e,t,n){if(!t)return c("confirm","Missing TitleTransactionID.",{onChainTxHash:n});let o=await e.blockchain.confirmWithdrawal(t,n);return o.ok?{ok:true,onChainTxHash:n,data:o.data}:c("confirm",o.error,{onChainTxHash:n,titleTransactionID:t})}async function G(e){let{client:t,clients:n,networkID:o}=e,r=e.walletAddress??n.account,a=await t.auth.requestWalletChallenge(r,o);if(!a.ok)return H("challenge",a.error);let p;try{p=await n.walletClient.signMessage({account:n.account,message:a.data.Message});}catch(i){return H("sign",A(i))}let l=await t.auth.loginWithWallet(r,o,p);return l.ok?{ok:true,data:l.data}:H("login",l.error)}function X(){let{address:e}=wagmi.useAccount(),t=wagmi.usePublicClient(),{data:n}=wagmi.useWalletClient();return !e||!t||!n?null:{account:e,publicClient:t,walletClient:n}}var U="Wallet not connected.";function me(e,t){let n=X();return {connected:!!n,account:n?.account??null,loginWithWallet:(o,r)=>n?G({client:e,clients:n,networkID:o,walletAddress:r}):Promise.resolve(H("challenge",U)),depositToken:o=>n?ce({client:e,clients:n,titleID:t,...o}):Promise.resolve(c("approve",U)),depositNft:o=>n?pe({client:e,clients:n,titleID:t,...o}):Promise.resolve(c("deposit-onchain",U)),withdrawToken:o=>n?de({client:e,clients:n,...o}):Promise.resolve(c("withdraw-onchain",U)),withdrawNft:o=>n?ue({client:e,clients:n,...o}):Promise.resolve(c("withdraw-onchain",U))}}function mt(e){let{wagmiConfig:t,...n}=e;return jsxRuntime.jsx(O,{wagmiConfig:t,children:jsxRuntime.jsx(Me,{...n})})}function ft(e){return e instanceof Error&&(e.name==="ConnectorAlreadyConnectedError"||e.message.includes("already connected"))}function gt(e){let t="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.":t:t}async function Fe(e){let t=await actions.getWalletClient(e).catch(()=>null);if(!t)return null;let n=actions.getPublicClient(e);return n?{account:t.account.address,publicClient:n,walletClient:t}:null}function yt(e,t=18e4){return actions.getAccount(e).isConnected?Promise.resolve(true):new Promise(n=>{let o=false,r=l=>{o||(o=true,a(),clearTimeout(p),n(l));},a=actions.watchAccount(e,{onChange:l=>{l.isConnected&&r(true);}}),p=setTimeout(()=>r(false),t);})}function wt(e,t=8e3){let n=o=>o==="reconnecting"||o==="connecting";return n(actions.getAccount(e).status)?new Promise(o=>{let r=false,a=()=>{r||(r=true,p(),clearTimeout(l),o());},p=actions.watchAccount(e,{onChange:i=>{n(i.status)||a();}}),l=setTimeout(a,t);}):Promise.resolve()}function ht(e){let t=r=>e.find(a=>a.id===r||a.type===r),n=t("injected"),o=typeof window<"u"&&window.ethereum!=null;return n&&o?n:t("walletConnect")??n??e[0]}var Ct=9e4;async function bt(e){try{let o=(await actions.getAccount(e).connector?.getProvider?.())?.session?.peer?.metadata?.redirect,r=o?.native||o?.universal;return !r||typeof window>"u"?!1:(window.location.href=r,!0)}catch{return false}}function vt(e,t){return new Promise((n,o)=>{let r=setTimeout(()=>o(new Error("The wallet request timed out.")),t);e.then(a=>{clearTimeout(r),n(a);},a=>{clearTimeout(r),o(a instanceof Error?a:new Error(String(a)));});})}function Me(e){let{client:t,networkID:n,onAuthenticated:o,disabled:r,label:a,style:p,autoStart:l}=e,i=wagmi.useConfig(),{isConnected:u}=wagmi.useAccount(),{connectAsync:d,connectors:m}=wagmi.useConnect(),f=X(),[h,y]=react$1.useState(false),[D,C]=react$1.useState(null),[M,E]=react$1.useState(false),L=react$1.useRef(0),S=react$1.useRef(false),q=async()=>{let I=++L.current,P=()=>L.current===I;y(true),C(null);try{if(await wt(i),!P())return;if(!actions.getAccount(i).isConnected){let k=ae();if(k){if(await k.open(),!await yt(i)){C("No wallet was connected.");return}}else {let oe=ht(m);if(!oe){C("No wallet connector is configured.");return}try{await d({connector:oe});}catch(T){if(!ft(T))throw T}}}let b=f??await Fe(i);if(!b&&actions.getAccount(i).isConnected&&(await new Promise(k=>setTimeout(k,300)),b=await Fe(i),!P()))return;if(!b){C("Wallet client is not available.");return}E(!0);let x=await vt(G({client:t,clients:b,networkID:n}),Ct);if(!P())return;if(x.ok){o();return}C(x.stage==="sign"?"Signature declined.":x.error??"Wallet sign-in failed.");}catch(b){if(!P())return;console.error("[idosgames/wallet] wallet sign-in failed:",b),C(gt(b));}finally{P()&&(y(false),E(false));}};react$1.useEffect(()=>{!l||S.current||(S.current=true,q());},[l]);let R=async()=>{await bt(i)||await ae()?.open();};return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("button",{type:"button",onClick:()=>{M?R():q();},disabled:r,style:{...kt,...r?{opacity:.6,cursor:"default"}:null,...p},children:M?"Waiting for signature \u2014 tap to open wallet":h?"Check your wallet\u2026":u?a??"Sign in with wallet":"Connect wallet"}),D&&jsxRuntime.jsx("span",{role:"alert",style:Et,children:D})]})}var kt={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"};var Bt={pointerEvents:"auto",background:"#04276bf5",border:"1px solid #1e59c8",borderRadius:12,padding:16,color:"#fff",width:320,boxSizing:"border-box",fontFamily:"system-ui, sans-serif",display:"flex",flexDirection:"column",gap:10,maxHeight:"80vh",overflow:"auto"},St={fontWeight:700,fontSize:16},B={fontSize:12,opacity:.7},ge={background:"#052e7e",border:"1px solid #1e59c8",borderRadius:8,color:"#fff",padding:"8px 10px",width:"100%",boxSizing:"border-box"},Rt={background:"#0d66fe",color:"#fff",border:"none",borderRadius:8,padding:"9px 14px",fontWeight:700,cursor:"pointer"},te={background:"#1e59c8",color:"#fff",border:"none",borderRadius:8,padding:"7px 12px",fontWeight:600,cursor:"pointer"},ye={display:"flex",gap:8};function Ft(e){let{client:t,walletConnectProjectId:n,appName:o,onClose:r,style:a}=e,[p,l]=react$1.useState(n??"");react$1.useEffect(()=>{if(n)return;let u=true;return (async()=>{let d=await t.blockchain.getDefinitions();if(!u||!d.ok)return;let m=d.data.Blockchain?.WalletLogin?.WalletConnectProjectId;m&&l(m);})(),()=>{u=false;}},[t,n]);let i=react$1.useMemo(()=>se({walletConnectProjectId:p||void 0,appName:o}),[p,o]);return jsxRuntime.jsx(O,{wagmiConfig:i,children:jsxRuntime.jsx(Ht,{client:t,appName:o,onClose:r,style:a})})}function Ht({client:e,onClose:t,style:n}){let o=me(e,e.titleID),{address:r,isConnected:a,chainId:p}=wagmi.useAccount(),{connect:l,connectors:i}=wagmi.useConnect(),{disconnect:u}=wagmi.useDisconnect(),{switchChainAsync:d}=wagmi.useSwitchChain(),[,m]=react$1.useReducer(s=>s+1,0),[f,h]=react$1.useState({}),[y,D]=react$1.useState({}),[C,M]=react$1.useState(""),[E,L]=react$1.useState(""),[S,q]=react$1.useState(""),[R,I]=react$1.useState(false),[P,b]=react$1.useState(null);react$1.useEffect(()=>{let s=true;return (async()=>{let w=await e.blockchain.getDefinitions();if(await e.blockchain.getUserState(),!s||!w.ok)return;let F=w.data.Blockchain?.Networks??{},re={};for(let[qe,he]of Object.entries(F))he.Type==="EVM"&&(re[qe]=he);h(re),D(w.data.CryptoCurrencies??{});let Ke=Object.keys(re)[0]??"";M(Ke);})(),()=>{s=false;}},[e]),react$1.useEffect(()=>e.on("user:anyUpdated",m),[e]);let x=react$1.useMemo(()=>Object.entries(y).filter(([,s])=>s.Networks?.some(w=>w.NetworkID===C&&!!w.ContractAddress)),[y,C]);react$1.useEffect(()=>{let s=x[0]?.[0]??"";L(w=>x.some(([F])=>F===w)?w:s);},[x]);let k=C?f[C]:void 0,T=(E?y[E]:void 0)?.Networks?.find(s=>s.NetworkID===C),Oe=E?e.data.user.getCryptoCurrencyAmount(E):"0";async function we(){if(!k?.ChainID||p===k.ChainID)return true;try{return await d({chainId:k.ChainID}),!0}catch{return b({ok:false,stage:"approve",error:`Switch your wallet to chain ${k.ChainID} to continue.`}),false}}async function Ge(){if(!(!k||!T?.ContractAddress)){if(I(true),b(null),await we()){let s=T.Decimals??18,w;try{w=viem.parseUnits(S||"0",s);}catch{b({ok:false,stage:"approve",error:"Invalid amount."}),I(false);return}let F=await o.depositToken({network:k,tokenAddress:T.ContractAddress,amount:w});b(F),F.ok&&await e.blockchain.getUserState();}I(false);}}async function Ue(){if(!(!k||!o.account)){if(I(true),b(null),await we()){let s=await o.withdrawToken({currencyID:E,networkID:C,walletAddress:o.account,amount:S||"0"});b(s),s.ok&&await e.blockchain.getUserState();}I(false);}}return jsxRuntime.jsxs("div",{style:{...Bt,...n},children:[jsxRuntime.jsxs("div",{style:{...ye,justifyContent:"space-between"},children:[jsxRuntime.jsx("span",{style:St,children:"Crypto wallet"}),t&&jsxRuntime.jsx("button",{type:"button",style:te,onClick:t,children:"\u2715"})]}),a?jsxRuntime.jsxs("div",{style:ye,children:[jsxRuntime.jsxs("span",{style:{...B,flex:1,alignSelf:"center"},children:[r?.slice(0,6),"\u2026",r?.slice(-4)]}),jsxRuntime.jsx("button",{type:"button",style:te,onClick:()=>u(),children:"Disconnect"})]}):jsxRuntime.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:6},children:[jsxRuntime.jsx("span",{style:B,children:"Connect a browser or mobile wallet"}),i.map(s=>jsxRuntime.jsx("button",{type:"button",style:te,onClick:()=>l({connector:s}),children:s.name},s.uid))]}),Object.keys(f).length===0?jsxRuntime.jsx("span",{style:B,children:"No EVM networks configured for this title."}):jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsxs("div",{children:[jsxRuntime.jsx("div",{style:B,children:"Network"}),jsxRuntime.jsx("select",{style:ge,value:C,onChange:s=>M(s.target.value),children:Object.entries(f).map(([s,w])=>jsxRuntime.jsx("option",{value:s,children:w.DisplayName??s},s))})]}),jsxRuntime.jsxs("div",{children:[jsxRuntime.jsx("div",{style:B,children:"Token"}),jsxRuntime.jsxs("select",{style:ge,value:E,onChange:s=>L(s.target.value),children:[x.length===0&&jsxRuntime.jsx("option",{value:"",children:"\u2014 no depositable tokens \u2014"}),x.map(([s,w])=>jsxRuntime.jsx("option",{value:s,children:w.DisplayName??s},s))]})]}),jsxRuntime.jsxs("div",{style:B,children:["In-game balance: ",jsxRuntime.jsx("b",{children:Oe})," ",E]}),jsxRuntime.jsxs("div",{children:[jsxRuntime.jsx("div",{style:B,children:"Amount"}),jsxRuntime.jsx("input",{style:ge,inputMode:"decimal",placeholder:"0.0",value:S,onChange:s=>q(s.target.value)})]}),jsxRuntime.jsxs("div",{style:ye,children:[jsxRuntime.jsx("button",{type:"button",style:{...Rt,flex:1,opacity:R?.6:1},disabled:R||!a||!T?.ContractAddress,onClick:()=>{Ge();},children:"Deposit"}),jsxRuntime.jsx("button",{type:"button",style:{...te,flex:1,opacity:R?.6:1},disabled:R||!a||!E,onClick:()=>{Ue();},children:"Withdraw"})]})]}),P&&jsxRuntime.jsx(Mt,{result:P})]})}function Mt({result:e}){let t={fontSize:12,borderRadius:8,padding:"8px 10px",background:e.ok?"#1e3a2a":"#3a1e28",color:e.ok?"#8ef0b0":"#f2a0b4",wordBreak:"break-all"};return e.ok?jsxRuntime.jsxs("div",{style:t,children:["\u2713 Done \xB7 tx ",e.onChainTxHash]}):jsxRuntime.jsxs("div",{style:t,children:["\u2715 [",e.stage,"] ",e.error,e.titleTransactionID?` \xB7 already debited (tx ${e.titleTransactionID}) \u2014 retry/confirm, don't re-request`:""]})}
2
+ exports.DEFAULT_EVM_CHAINS=Ee;exports.IDosGamesWalletProvider=O;exports.WalletLogin=mt;exports.WalletLoginButton=Me;exports.WalletPanel=Ft;exports.arbitrum=$;exports.base=V;exports.bsc=_;exports.chainById=je;exports.createEvmWalletConfig=se;exports.idosChains=Ce;exports.mainnet=j;exports.optimism=Y;exports.polygon=z;exports.polygonAmoy=Z;exports.sepolia=Q;exports.useEvmBridge=me;exports.useEvmBridgeClients=X;
@@ -5,8 +5,8 @@ import * as react from 'react';
5
5
  import { ReactNode, CSSProperties } from 'react';
6
6
  import { QueryClient } from '@tanstack/react-query';
7
7
  import { ClientState, DepositTokenResponse, DepositNFTResponse, TokenWithdrawalResponse, NFTWithdrawalResponse, IDosGamesClient } from '@idosgames/core';
8
- import { b as DepositTokenEvmParams, a as DepositNftEvmParams, c as WithdrawTokenEvmParams, W as WithdrawNftEvmParams, E as EvmBridgeClients } from '../withdraw-CwX4HY2X.cjs';
9
- import { W as WalletLoginResult, a as BridgeResult } from '../types-C11zAA05.cjs';
8
+ import { b as DepositTokenEvmParams, a as DepositNftEvmParams, d as WithdrawTokenEvmParams, W as WithdrawNftEvmParams, E as EvmBridgeClients } from '../withdraw-C5y67V7i.cjs';
9
+ import { W as WalletLoginResult, B as BridgeResult } from '../types-CeUVf1tr.cjs';
10
10
 
11
11
  /**
12
12
  * The EVM chains a game supports out of the box. Both the sign-in button and the in-game wallet
@@ -5,8 +5,8 @@ import * as react from 'react';
5
5
  import { ReactNode, CSSProperties } from 'react';
6
6
  import { QueryClient } from '@tanstack/react-query';
7
7
  import { ClientState, DepositTokenResponse, DepositNFTResponse, TokenWithdrawalResponse, NFTWithdrawalResponse, IDosGamesClient } from '@idosgames/core';
8
- import { b as DepositTokenEvmParams, a as DepositNftEvmParams, c as WithdrawTokenEvmParams, W as WithdrawNftEvmParams, E as EvmBridgeClients } from '../withdraw-C-sFNUnQ.js';
9
- import { W as WalletLoginResult, a as BridgeResult } from '../types-C11zAA05.js';
8
+ import { b as DepositTokenEvmParams, a as DepositNftEvmParams, d as WithdrawTokenEvmParams, W as WithdrawNftEvmParams, E as EvmBridgeClients } from '../withdraw-BKVcklPB.js';
9
+ import { W as WalletLoginResult, B as BridgeResult } from '../types-CeUVf1tr.js';
10
10
 
11
11
  /**
12
12
  * The EVM chains a game supports out of the box. Both the sign-in button and the in-game wallet
@@ -1 +1 @@
1
- import {o,n,i,h as h$1,p}from'../chunk-OWJXQVDR.js';import {a as a$1,b as b$2}from'../chunk-ZL42KPPC.js';import {b as b$1,c as c$1}from'../chunk-K62NMX3A.js';import {a,b,c,d,e,f,g,h,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,useDisconnect,useSwitchChain}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,useMemo,useReducer}from'react';import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {getAccount,watchAccount,getWalletClient,getPublicClient}from'wagmi/actions';import {parseUnits}from'viem';var we=[a,b,c,d,e,f,g,h],oe=new Map;function ne(e){let{chains:o=we,walletConnectProjectId:t,appName:n,appUrl:i,appIcon:s,transports:g,connectors:l}=e,c=t??"__extension_only__";if(!l){let p=oe.get(c);if(p)return p}let C={};for(let p of o)C[p.id]=g?.[p.id]??http();let h=i??(typeof window<"u"?window.location.origin:""),b={name:n??"iDosGames",description:n??"iDosGames game",url:h,icons:s?[s]:[]};if(t&&!l){let p=o.map(k),k$1=new WagmiAdapter({networks:p,projectId:t,transports:C});return a$1(createAppKit({adapters:[k$1],networks:p,projectId:t,metadata:b,features:{analytics:false,email:false,socials:false}})),oe.set(c,k$1.wagmiConfig),k$1.wagmiConfig}let D=l??[injected(),coinbaseWallet({appName:n??"iDosGames"})],I=createConfig({chains:o,connectors:D,transports:C});return l||oe.set(c,I),I}function j(e){let{wagmiConfig:o,queryClient:t,children:n}=e,[i]=useState(()=>t??new QueryClient);return jsx(WagmiProvider,{config:o,children:jsx(QueryClientProvider,{client:i,children:n})})}function U(){let{address:e}=useAccount(),o=usePublicClient(),{data:t}=useWalletClient();return !e||!o||!t?null:{account:e,publicClient:o,walletClient:t}}var L="Wallet not connected.";function re(e,o$1){let t=U();return {connected:!!t,account:t?.account??null,loginWithWallet:(n,i)=>t?p({client:e,clients:t,networkID:n,walletAddress:i}):Promise.resolve(c$1("challenge",L)),depositToken:n=>t?h$1({client:e,clients:t,titleID:o$1,...n}):Promise.resolve(b$1("approve",L)),depositNft:n=>t?i({client:e,clients:t,titleID:o$1,...n}):Promise.resolve(b$1("deposit-onchain",L)),withdrawToken:n$1=>t?n({client:e,clients:t,...n$1}):Promise.resolve(b$1("withdraw-onchain",L)),withdrawNft:n=>t?o({client:e,clients:t,...n}):Promise.resolve(b$1("withdraw-onchain",L))}}function Je(e){let{wagmiConfig:o,...t}=e;return jsx(j,{wagmiConfig:o,children:jsx(ke,{...t})})}function Xe(e){return e instanceof Error&&(e.name==="ConnectorAlreadyConnectedError"||e.message.includes("already connected"))}function Ye(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 he(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 Ze(e,o=18e4){return getAccount(e).isConnected?Promise.resolve(true):new Promise(t=>{let n=false,i=l=>{n||(n=true,s(),clearTimeout(g),t(l));},s=watchAccount(e,{onChange:l=>{l.isConnected&&i(true);}}),g=setTimeout(()=>i(false),o);})}function et(e,o=8e3){let t=n=>n==="reconnecting"||n==="connecting";return t(getAccount(e).status)?new Promise(n=>{let i=false,s=()=>{i||(i=true,g(),clearTimeout(l),n());},g=watchAccount(e,{onChange:c=>{t(c.status)||s();}}),l=setTimeout(s,o);}):Promise.resolve()}function tt(e){let o=i=>e.find(s=>s.id===i||s.type===i),t=o("injected"),n=typeof window<"u"&&window.ethereum!=null;return t&&n?t:o("walletConnect")??t??e[0]}var ot=9e4;async function nt(e){try{let n=(await getAccount(e).connector?.getProvider?.())?.session?.peer?.metadata?.redirect,i=n?.native||n?.universal;return !i||typeof window>"u"?!1:(window.location.href=i,!0)}catch{return false}}function rt(e,o){return new Promise((t,n)=>{let i=setTimeout(()=>n(new Error("The wallet request timed out.")),o);e.then(s=>{clearTimeout(i),t(s);},s=>{clearTimeout(i),n(s instanceof Error?s:new Error(String(s)));});})}function ke(e){let{client:o,networkID:t,onAuthenticated:n,disabled:i,label:s,style:g,autoStart:l}=e,c=useConfig(),{isConnected:C}=useAccount(),{connectAsync:h,connectors:b}=useConnect(),D=U(),[I,p$1]=useState(false),[k,u]=useState(null),[A,w]=useState(false),B=useRef(0),T=useRef(false),F=async()=>{let S=++B.current,P=()=>B.current===S;p$1(true),u(null);try{if(await et(c),!P())return;if(!getAccount(c).isConnected){let y=b$2();if(y){if(await y.open(),!await Ze(c)){u("No wallet was connected.");return}}else {let z=tt(b);if(!z){u("No wallet connector is configured.");return}try{await h({connector:z});}catch(N){if(!Xe(N))throw N}}}let f=D??await he(c);if(!f&&getAccount(c).isConnected&&(await new Promise(y=>setTimeout(y,300)),f=await he(c),!P()))return;if(!f){u("Wallet client is not available.");return}w(!0);let v=await rt(p({client:o,clients:f,networkID:t}),ot);if(!P())return;if(v.ok){n();return}u(v.stage==="sign"?"Signature declined.":v.error??"Wallet sign-in failed.");}catch(f){if(!P())return;console.error("[idosgames/wallet] wallet sign-in failed:",f),u(Ye(f));}finally{P()&&(p$1(false),w(false));}};useEffect(()=>{!l||T.current||(T.current=true,F());},[l]);let x=async()=>{await nt(c)||await b$2()?.open();};return jsxs(Fragment,{children:[jsx("button",{type:"button",onClick:()=>{A?x():F();},disabled:i,style:{...it,...i?{opacity:.6,cursor:"default"}:null,...g},children:A?"Waiting for signature \u2014 tap to open wallet":I?"Check your wallet\u2026":C?s??"Sign in with wallet":"Connect wallet"}),k&&jsx("span",{role:"alert",style:st,children:k})]})}var it={padding:"11px 16px",borderRadius:"8px",border:"none",background:"#4c3fa8",color:"#fff",font:"inherit",fontWeight:600,cursor:"pointer"},st={display:"block",marginTop:"6px",color:"#ff9b9b",fontSize:"13px",textAlign:"center"};var gt={pointerEvents:"auto",background:"#04276bf5",border:"1px solid #1e59c8",borderRadius:12,padding:16,color:"#fff",width:320,boxSizing:"border-box",fontFamily:"system-ui, sans-serif",display:"flex",flexDirection:"column",gap:10,maxHeight:"80vh",overflow:"auto"},yt={fontWeight:700,fontSize:16},E={fontSize:12,opacity:.7},se={background:"#052e7e",border:"1px solid #1e59c8",borderRadius:8,color:"#fff",padding:"8px 10px",width:"100%",boxSizing:"border-box"},wt={background:"#0d66fe",color:"#fff",border:"none",borderRadius:8,padding:"9px 14px",fontWeight:700,cursor:"pointer"},K={background:"#1e59c8",color:"#fff",border:"none",borderRadius:8,padding:"7px 12px",fontWeight:600,cursor:"pointer"},ae={display:"flex",gap:8};function Ct(e){let{client:o,walletConnectProjectId:t,appName:n,onClose:i,style:s}=e,[g,l]=useState(t??"");useEffect(()=>{if(t)return;let C=true;return (async()=>{let h=await o.blockchain.getDefinitions();if(!C||!h.ok)return;let b=h.data.Blockchain?.WalletLogin?.WalletConnectProjectId;b&&l(b);})(),()=>{C=false;}},[o,t]);let c=useMemo(()=>ne({walletConnectProjectId:g||void 0,appName:n}),[g,n]);return jsx(j,{wagmiConfig:c,children:jsx(vt,{client:o,appName:n,onClose:i,style:s})})}function vt({client:e,onClose:o,style:t}){let n=re(e,e.titleID),{address:i,isConnected:s,chainId:g}=useAccount(),{connect:l,connectors:c}=useConnect(),{disconnect:C}=useDisconnect(),{switchChainAsync:h}=useSwitchChain(),[,b]=useReducer(r=>r+1,0),[D,I]=useState({}),[p,k]=useState({}),[u,A]=useState(""),[w,B]=useState(""),[T,F]=useState(""),[x,S]=useState(false),[P,f]=useState(null);useEffect(()=>{let r=true;return (async()=>{let d=await e.blockchain.getDefinitions();if(await e.blockchain.getUserState(),!r||!d.ok)return;let R=d.data.Blockchain?.Networks??{},H={};for(let[Ee,ce]of Object.entries(R))ce.Type==="EVM"&&(H[Ee]=ce);I(H),k(d.data.CryptoCurrencies??{});let Ne=Object.keys(H)[0]??"";A(Ne);})(),()=>{r=false;}},[e]),useEffect(()=>e.on("user:anyUpdated",b),[e]);let v=useMemo(()=>Object.entries(p).filter(([,r])=>r.Networks?.some(d=>d.NetworkID===u&&!!d.ContractAddress)),[p,u]);useEffect(()=>{let r=v[0]?.[0]??"";B(d=>v.some(([R])=>R===d)?d:r);},[v]);let y=u?D[u]:void 0,N=(w?p[w]:void 0)?.Networks?.find(r=>r.NetworkID===u),We=w?e.data.user.getCryptoCurrencyAmount(w):"0";async function le(){if(!y?.ChainID||g===y.ChainID)return true;try{return await h({chainId:y.ChainID}),!0}catch{return f({ok:false,stage:"approve",error:`Switch your wallet to chain ${y.ChainID} to continue.`}),false}}async function De(){if(!(!y||!N?.ContractAddress)){if(S(true),f(null),await le()){let r=N.Decimals??18,d;try{d=parseUnits(T||"0",r);}catch{f({ok:false,stage:"approve",error:"Invalid amount."}),S(false);return}let R=await n.depositToken({network:y,tokenAddress:N.ContractAddress,amount:d});f(R),R.ok&&await e.blockchain.getUserState();}S(false);}}async function Se(){if(!(!y||!n.account)){if(S(true),f(null),await le()){let r=await n.withdrawToken({currencyID:w,networkID:u,walletAddress:n.account,amount:T||"0"});f(r),r.ok&&await e.blockchain.getUserState();}S(false);}}return jsxs("div",{style:{...gt,...t},children:[jsxs("div",{style:{...ae,justifyContent:"space-between"},children:[jsx("span",{style:yt,children:"Crypto wallet"}),o&&jsx("button",{type:"button",style:K,onClick:o,children:"\u2715"})]}),s?jsxs("div",{style:ae,children:[jsxs("span",{style:{...E,flex:1,alignSelf:"center"},children:[i?.slice(0,6),"\u2026",i?.slice(-4)]}),jsx("button",{type:"button",style:K,onClick:()=>C(),children:"Disconnect"})]}):jsxs("div",{style:{display:"flex",flexDirection:"column",gap:6},children:[jsx("span",{style:E,children:"Connect a browser or mobile wallet"}),c.map(r=>jsx("button",{type:"button",style:K,onClick:()=>l({connector:r}),children:r.name},r.uid))]}),Object.keys(D).length===0?jsx("span",{style:E,children:"No EVM networks configured for this title."}):jsxs(Fragment,{children:[jsxs("div",{children:[jsx("div",{style:E,children:"Network"}),jsx("select",{style:se,value:u,onChange:r=>A(r.target.value),children:Object.entries(D).map(([r,d])=>jsx("option",{value:r,children:d.DisplayName??r},r))})]}),jsxs("div",{children:[jsx("div",{style:E,children:"Token"}),jsxs("select",{style:se,value:w,onChange:r=>B(r.target.value),children:[v.length===0&&jsx("option",{value:"",children:"\u2014 no depositable tokens \u2014"}),v.map(([r,d])=>jsx("option",{value:r,children:d.DisplayName??r},r))]})]}),jsxs("div",{style:E,children:["In-game balance: ",jsx("b",{children:We})," ",w]}),jsxs("div",{children:[jsx("div",{style:E,children:"Amount"}),jsx("input",{style:se,inputMode:"decimal",placeholder:"0.0",value:T,onChange:r=>F(r.target.value)})]}),jsxs("div",{style:ae,children:[jsx("button",{type:"button",style:{...wt,flex:1,opacity:x?.6:1},disabled:x||!s||!N?.ContractAddress,onClick:()=>{De();},children:"Deposit"}),jsx("button",{type:"button",style:{...K,flex:1,opacity:x?.6:1},disabled:x||!s||!w,onClick:()=>{Se();},children:"Withdraw"})]})]}),P&&jsx(ht,{result:P})]})}function ht({result:e}){let o={fontSize:12,borderRadius:8,padding:"8px 10px",background:e.ok?"#1e3a2a":"#3a1e28",color:e.ok?"#8ef0b0":"#f2a0b4",wordBreak:"break-all"};return e.ok?jsxs("div",{style:o,children:["\u2713 Done \xB7 tx ",e.onChainTxHash]}):jsxs("div",{style:o,children:["\u2715 [",e.stage,"] ",e.error,e.titleTransactionID?` \xB7 already debited (tx ${e.titleTransactionID}) \u2014 retry/confirm, don't re-request`:""]})}export{we as DEFAULT_EVM_CHAINS,j as IDosGamesWalletProvider,Je as WalletLogin,ke as WalletLoginButton,Ct as WalletPanel,ne as createEvmWalletConfig,re as useEvmBridge,U as useEvmBridgeClients};
1
+ import {p,o,j as j$1,h as h$1,q}from'../chunk-ZHQHOW45.js';import {a as a$1,b as b$2}from'../chunk-ZL42KPPC.js';import {b as b$1,c as c$1}from'../chunk-K62NMX3A.js';import {a,b,c,d,e,f,g,h,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,useDisconnect,useSwitchChain}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,useMemo,useReducer}from'react';import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {getAccount,watchAccount,getWalletClient,getPublicClient}from'wagmi/actions';import {parseUnits}from'viem';var we=[a,b,c,d,e,f,g,h],oe=new Map;function ne(e){let{chains:o=we,walletConnectProjectId:t,appName:n,appUrl:i,appIcon:s,transports:g,connectors:l}=e,c=t??"__extension_only__";if(!l){let p=oe.get(c);if(p)return p}let C={};for(let p of o)C[p.id]=g?.[p.id]??http();let h=i??(typeof window<"u"?window.location.origin:""),b={name:n??"iDosGames",description:n??"iDosGames game",url:h,icons:s?[s]:[]};if(t&&!l){let p=o.map(k),k$1=new WagmiAdapter({networks:p,projectId:t,transports:C});return a$1(createAppKit({adapters:[k$1],networks:p,projectId:t,metadata:b,features:{analytics:false,email:false,socials:false}})),oe.set(c,k$1.wagmiConfig),k$1.wagmiConfig}let D=l??[injected(),coinbaseWallet({appName:n??"iDosGames"})],I=createConfig({chains:o,connectors:D,transports:C});return l||oe.set(c,I),I}function j(e){let{wagmiConfig:o,queryClient:t,children:n}=e,[i]=useState(()=>t??new QueryClient);return jsx(WagmiProvider,{config:o,children:jsx(QueryClientProvider,{client:i,children:n})})}function U(){let{address:e}=useAccount(),o=usePublicClient(),{data:t}=useWalletClient();return !e||!o||!t?null:{account:e,publicClient:o,walletClient:t}}var L="Wallet not connected.";function re(e,o$1){let t=U();return {connected:!!t,account:t?.account??null,loginWithWallet:(n,i)=>t?q({client:e,clients:t,networkID:n,walletAddress:i}):Promise.resolve(c$1("challenge",L)),depositToken:n=>t?h$1({client:e,clients:t,titleID:o$1,...n}):Promise.resolve(b$1("approve",L)),depositNft:n=>t?j$1({client:e,clients:t,titleID:o$1,...n}):Promise.resolve(b$1("deposit-onchain",L)),withdrawToken:n=>t?o({client:e,clients:t,...n}):Promise.resolve(b$1("withdraw-onchain",L)),withdrawNft:n=>t?p({client:e,clients:t,...n}):Promise.resolve(b$1("withdraw-onchain",L))}}function Je(e){let{wagmiConfig:o,...t}=e;return jsx(j,{wagmiConfig:o,children:jsx(ke,{...t})})}function Xe(e){return e instanceof Error&&(e.name==="ConnectorAlreadyConnectedError"||e.message.includes("already connected"))}function Ye(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 he(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 Ze(e,o=18e4){return getAccount(e).isConnected?Promise.resolve(true):new Promise(t=>{let n=false,i=l=>{n||(n=true,s(),clearTimeout(g),t(l));},s=watchAccount(e,{onChange:l=>{l.isConnected&&i(true);}}),g=setTimeout(()=>i(false),o);})}function et(e,o=8e3){let t=n=>n==="reconnecting"||n==="connecting";return t(getAccount(e).status)?new Promise(n=>{let i=false,s=()=>{i||(i=true,g(),clearTimeout(l),n());},g=watchAccount(e,{onChange:c=>{t(c.status)||s();}}),l=setTimeout(s,o);}):Promise.resolve()}function tt(e){let o=i=>e.find(s=>s.id===i||s.type===i),t=o("injected"),n=typeof window<"u"&&window.ethereum!=null;return t&&n?t:o("walletConnect")??t??e[0]}var ot=9e4;async function nt(e){try{let n=(await getAccount(e).connector?.getProvider?.())?.session?.peer?.metadata?.redirect,i=n?.native||n?.universal;return !i||typeof window>"u"?!1:(window.location.href=i,!0)}catch{return false}}function rt(e,o){return new Promise((t,n)=>{let i=setTimeout(()=>n(new Error("The wallet request timed out.")),o);e.then(s=>{clearTimeout(i),t(s);},s=>{clearTimeout(i),n(s instanceof Error?s:new Error(String(s)));});})}function ke(e){let{client:o,networkID:t,onAuthenticated:n,disabled:i,label:s,style:g,autoStart:l}=e,c=useConfig(),{isConnected:C}=useAccount(),{connectAsync:h,connectors:b}=useConnect(),D=U(),[I,p]=useState(false),[k,u]=useState(null),[A,w]=useState(false),B=useRef(0),T=useRef(false),F=async()=>{let S=++B.current,P=()=>B.current===S;p(true),u(null);try{if(await et(c),!P())return;if(!getAccount(c).isConnected){let y=b$2();if(y){if(await y.open(),!await Ze(c)){u("No wallet was connected.");return}}else {let z=tt(b);if(!z){u("No wallet connector is configured.");return}try{await h({connector:z});}catch(N){if(!Xe(N))throw N}}}let f=D??await he(c);if(!f&&getAccount(c).isConnected&&(await new Promise(y=>setTimeout(y,300)),f=await he(c),!P()))return;if(!f){u("Wallet client is not available.");return}w(!0);let v=await rt(q({client:o,clients:f,networkID:t}),ot);if(!P())return;if(v.ok){n();return}u(v.stage==="sign"?"Signature declined.":v.error??"Wallet sign-in failed.");}catch(f){if(!P())return;console.error("[idosgames/wallet] wallet sign-in failed:",f),u(Ye(f));}finally{P()&&(p(false),w(false));}};useEffect(()=>{!l||T.current||(T.current=true,F());},[l]);let x=async()=>{await nt(c)||await b$2()?.open();};return jsxs(Fragment,{children:[jsx("button",{type:"button",onClick:()=>{A?x():F();},disabled:i,style:{...it,...i?{opacity:.6,cursor:"default"}:null,...g},children:A?"Waiting for signature \u2014 tap to open wallet":I?"Check your wallet\u2026":C?s??"Sign in with wallet":"Connect wallet"}),k&&jsx("span",{role:"alert",style:st,children:k})]})}var it={padding:"11px 16px",borderRadius:"8px",border:"none",background:"#4c3fa8",color:"#fff",font:"inherit",fontWeight:600,cursor:"pointer"},st={display:"block",marginTop:"6px",color:"#ff9b9b",fontSize:"13px",textAlign:"center"};var gt={pointerEvents:"auto",background:"#04276bf5",border:"1px solid #1e59c8",borderRadius:12,padding:16,color:"#fff",width:320,boxSizing:"border-box",fontFamily:"system-ui, sans-serif",display:"flex",flexDirection:"column",gap:10,maxHeight:"80vh",overflow:"auto"},yt={fontWeight:700,fontSize:16},E={fontSize:12,opacity:.7},se={background:"#052e7e",border:"1px solid #1e59c8",borderRadius:8,color:"#fff",padding:"8px 10px",width:"100%",boxSizing:"border-box"},wt={background:"#0d66fe",color:"#fff",border:"none",borderRadius:8,padding:"9px 14px",fontWeight:700,cursor:"pointer"},K={background:"#1e59c8",color:"#fff",border:"none",borderRadius:8,padding:"7px 12px",fontWeight:600,cursor:"pointer"},ae={display:"flex",gap:8};function Ct(e){let{client:o,walletConnectProjectId:t,appName:n,onClose:i,style:s}=e,[g,l]=useState(t??"");useEffect(()=>{if(t)return;let C=true;return (async()=>{let h=await o.blockchain.getDefinitions();if(!C||!h.ok)return;let b=h.data.Blockchain?.WalletLogin?.WalletConnectProjectId;b&&l(b);})(),()=>{C=false;}},[o,t]);let c=useMemo(()=>ne({walletConnectProjectId:g||void 0,appName:n}),[g,n]);return jsx(j,{wagmiConfig:c,children:jsx(vt,{client:o,appName:n,onClose:i,style:s})})}function vt({client:e,onClose:o,style:t}){let n=re(e,e.titleID),{address:i,isConnected:s,chainId:g}=useAccount(),{connect:l,connectors:c}=useConnect(),{disconnect:C}=useDisconnect(),{switchChainAsync:h}=useSwitchChain(),[,b]=useReducer(r=>r+1,0),[D,I]=useState({}),[p,k]=useState({}),[u,A]=useState(""),[w,B]=useState(""),[T,F]=useState(""),[x,S]=useState(false),[P,f]=useState(null);useEffect(()=>{let r=true;return (async()=>{let d=await e.blockchain.getDefinitions();if(await e.blockchain.getUserState(),!r||!d.ok)return;let R=d.data.Blockchain?.Networks??{},H={};for(let[Ee,ce]of Object.entries(R))ce.Type==="EVM"&&(H[Ee]=ce);I(H),k(d.data.CryptoCurrencies??{});let Ne=Object.keys(H)[0]??"";A(Ne);})(),()=>{r=false;}},[e]),useEffect(()=>e.on("user:anyUpdated",b),[e]);let v=useMemo(()=>Object.entries(p).filter(([,r])=>r.Networks?.some(d=>d.NetworkID===u&&!!d.ContractAddress)),[p,u]);useEffect(()=>{let r=v[0]?.[0]??"";B(d=>v.some(([R])=>R===d)?d:r);},[v]);let y=u?D[u]:void 0,N=(w?p[w]:void 0)?.Networks?.find(r=>r.NetworkID===u),We=w?e.data.user.getCryptoCurrencyAmount(w):"0";async function le(){if(!y?.ChainID||g===y.ChainID)return true;try{return await h({chainId:y.ChainID}),!0}catch{return f({ok:false,stage:"approve",error:`Switch your wallet to chain ${y.ChainID} to continue.`}),false}}async function De(){if(!(!y||!N?.ContractAddress)){if(S(true),f(null),await le()){let r=N.Decimals??18,d;try{d=parseUnits(T||"0",r);}catch{f({ok:false,stage:"approve",error:"Invalid amount."}),S(false);return}let R=await n.depositToken({network:y,tokenAddress:N.ContractAddress,amount:d});f(R),R.ok&&await e.blockchain.getUserState();}S(false);}}async function Se(){if(!(!y||!n.account)){if(S(true),f(null),await le()){let r=await n.withdrawToken({currencyID:w,networkID:u,walletAddress:n.account,amount:T||"0"});f(r),r.ok&&await e.blockchain.getUserState();}S(false);}}return jsxs("div",{style:{...gt,...t},children:[jsxs("div",{style:{...ae,justifyContent:"space-between"},children:[jsx("span",{style:yt,children:"Crypto wallet"}),o&&jsx("button",{type:"button",style:K,onClick:o,children:"\u2715"})]}),s?jsxs("div",{style:ae,children:[jsxs("span",{style:{...E,flex:1,alignSelf:"center"},children:[i?.slice(0,6),"\u2026",i?.slice(-4)]}),jsx("button",{type:"button",style:K,onClick:()=>C(),children:"Disconnect"})]}):jsxs("div",{style:{display:"flex",flexDirection:"column",gap:6},children:[jsx("span",{style:E,children:"Connect a browser or mobile wallet"}),c.map(r=>jsx("button",{type:"button",style:K,onClick:()=>l({connector:r}),children:r.name},r.uid))]}),Object.keys(D).length===0?jsx("span",{style:E,children:"No EVM networks configured for this title."}):jsxs(Fragment,{children:[jsxs("div",{children:[jsx("div",{style:E,children:"Network"}),jsx("select",{style:se,value:u,onChange:r=>A(r.target.value),children:Object.entries(D).map(([r,d])=>jsx("option",{value:r,children:d.DisplayName??r},r))})]}),jsxs("div",{children:[jsx("div",{style:E,children:"Token"}),jsxs("select",{style:se,value:w,onChange:r=>B(r.target.value),children:[v.length===0&&jsx("option",{value:"",children:"\u2014 no depositable tokens \u2014"}),v.map(([r,d])=>jsx("option",{value:r,children:d.DisplayName??r},r))]})]}),jsxs("div",{style:E,children:["In-game balance: ",jsx("b",{children:We})," ",w]}),jsxs("div",{children:[jsx("div",{style:E,children:"Amount"}),jsx("input",{style:se,inputMode:"decimal",placeholder:"0.0",value:T,onChange:r=>F(r.target.value)})]}),jsxs("div",{style:ae,children:[jsx("button",{type:"button",style:{...wt,flex:1,opacity:x?.6:1},disabled:x||!s||!N?.ContractAddress,onClick:()=>{De();},children:"Deposit"}),jsx("button",{type:"button",style:{...K,flex:1,opacity:x?.6:1},disabled:x||!s||!w,onClick:()=>{Se();},children:"Withdraw"})]})]}),P&&jsx(ht,{result:P})]})}function ht({result:e}){let o={fontSize:12,borderRadius:8,padding:"8px 10px",background:e.ok?"#1e3a2a":"#3a1e28",color:e.ok?"#8ef0b0":"#f2a0b4",wordBreak:"break-all"};return e.ok?jsxs("div",{style:o,children:["\u2713 Done \xB7 tx ",e.onChainTxHash]}):jsxs("div",{style:o,children:["\u2715 [",e.stage,"] ",e.error,e.titleTransactionID?` \xB7 already debited (tx ${e.titleTransactionID}) \u2014 retry/confirm, don't re-request`:""]})}export{we as DEFAULT_EVM_CHAINS,j as IDosGamesWalletProvider,Je as WalletLogin,ke as WalletLoginButton,Ct as WalletPanel,ne as createEvmWalletConfig,re as useEvmBridge,U 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 Ht=Object.defineProperty;var w=(t,e)=>()=>(t&&(e=t(t=0)),e);var $e=(t,e)=>{for(var n in e)Ht(t,n,{get:e[n],enumerable:true});};function ke(t){return Object.values(exports.idosChains).find(e=>e.id===t)}function Ye(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 X=w(()=>{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 de(t){Qe=t;}function ee(){return Qe}var Qe,oe=w(()=>{Qe=null;});function pe(t){let{chains:e=Pe,walletConnectProjectId:n,appName:o,appUrl:i,appIcon:r,transports:l,connectors:s}=t,a=n??"__extension_only__";if(!s){let f=Se.get(a);if(f)return f}let d={};for(let f of e)d[f.id]=l?.[f.id]??wagmi.http();let c=i??(typeof window<"u"?window.location.origin:""),u={name:o??"iDosGames",description:o??"iDosGames game",url:c,icons:r?[r]:[]};if(n&&!s){let f=e.map(Ye),b=new appkitAdapterWagmi.WagmiAdapter({networks:f,projectId:n,transports:d});return de(react$1.createAppKit({adapters:[b],networks:f,projectId:n,metadata:u,features:{analytics:false,email:false,socials:false}})),Se.set(a,b.wagmiConfig),b.wagmiConfig}let m=s??[connectors.injected(),connectors.coinbaseWallet({appName:o??"iDosGames"})],y=wagmi.createConfig({chains:e,connectors:m,transports:d});return s||Se.set(a,y),y}var Pe,Se,We=w(()=>{X();oe();Pe=[exports.mainnet,exports.bsc,exports.polygon,exports.base,exports.arbitrum,exports.optimism,exports.sepolia,exports.polygonAmoy],Se=new Map;});function te(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 ue=w(()=>{});var me,Je,xe,Xe,Ae=w(()=>{me=[{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:"splits",type:"tuple[]",components:[{name:"to",type:"address"},{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:"withdrawERC1155",stateMutability:"nonpayable",inputs:[{name:"token",type:"address"},{name:"to",type:"address"},{name:"id",type:"uint256"},{name:"amount",type:"uint256"},{name:"splits",type:"tuple[]",components:[{name:"to",type:"address"},{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:[]}],Je=[{type:"function",name:"withdrawERC1155Mint",stateMutability:"nonpayable",inputs:[{name:"collection",type:"address"},{name:"to",type:"address"},{name:"id",type:"uint256"},{name:"amount",type:"uint256"},{name:"splits",type:"tuple[]",components:[{name:"to",type:"address"},{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:[]}],xe=[{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"}]}],Xe=[{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 et(t,e,n){return viem.encodeAbiParameters([{type:"string"},{type:"string"},{type:"string"}],[t,e,core.normalizeBlockchainCategory(n)])}var tt=w(()=>{});async function O(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 Te=w(()=>{});function A(t){return t instanceof viem.BaseError?t.shortMessage:t instanceof Error?t.message:String(t)}function p(t,e,n){return {ok:false,stage:t,error:e,...n}}function D(t,e){return {ok:false,stage:t,error:e}}var F=w(()=>{});function nt(t){let e=t.RewardPoolAddress;return e||null}async function ot(t,e,n,o){return await t.publicClient.readContract({address:e,abi:xe,functionName:"allowance",args:[t.account,n]})>=o?null:O(t,{address:e,abi:xe,functionName:"approve",args:[n,o]})}async function De(t){let{client:e,clients:n,network:o,tokenAddress:i,amount:r,titleID:l,category:s}=t,a=e.auth.context?.userID;if(!a)return p("approve","Not logged in.");let d=nt(o);if(!d)return p("approve","Network has no RewardPoolAddress.");if(r<=0n)return p("approve","Amount must be positive.");try{await ot(n,i,d,r);}catch(m){return p("approve",A(m))}let c;try{c=await O(n,{address:d,abi:me,functionName:"depositERC20",args:[i,r,a,l,s??""]});}catch(m){return p("deposit-onchain",A(m))}let u=await e.blockchain.depositToken(o.NetworkID??"",c);return u.ok?{ok:true,onChainTxHash:c,data:u.data}:p("report",u.error,{onChainTxHash:c})}async function Ee(t){let{client:e,clients:n,network:o,nftContractAddress:i,tokenId:r,amount:l,titleID:s,category:a}=t,d=e.auth.context?.userID;if(!d)return p("deposit-onchain","Not logged in.");let c=nt(o);if(!c)return p("deposit-onchain","Network has no RewardPoolAddress.");if(l<=0n)return p("deposit-onchain","Amount must be positive.");let u=et(d,s,a),m;try{m=await O(n,{address:i,abi:Xe,functionName:"safeTransferFrom",args:[n.account,c,r,l,u]});}catch(f){return p("deposit-onchain",A(f))}let y=await e.blockchain.depositNFT(o.NetworkID??"",m);return y.ok?{ok:true,onChainTxHash:m,data:y.data}:p("report",y.error,{onChainTxHash:m})}var rt=w(()=>{Ae();tt();Te();F();});function at(t){return (t.Splits??[]).map(e=>({to:e.To,amount:BigInt(e.Amount??"0")}))}async function it(t,e){return O(t,{address:e.ContractAddress,abi:me,functionName:"withdrawERC20",args:[e.TokenAddress,e.WalletAddress,BigInt(e.Amount??"0"),BigInt(e.BurnAmount??"0"),at(e),BigInt(e.Nonce??"0"),e.Signature??"0x",e.UserID??"",e.TitleID??"",e.Category??"",BigInt(e.Deadline??"0")]})}async function st(t,e){return O(t,{address:e.ContractAddress,abi:Je,functionName:"withdrawERC1155Mint",args:[e.TokenAddress,e.WalletAddress,BigInt(e.TokenId??"0"),BigInt(e.Amount??"0"),at(e),BigInt(e.Nonce??"0"),e.Signature??"0x",e.UserID??"",e.TitleID??"",e.Category??"",BigInt(e.Deadline??"0")]})}async function Ie(t){let{client:e,clients:n,currencyID:o,networkID:i,walletAddress:r,amount:l,category:s}=t,a=await e.blockchain.requestTokenWithdrawal(o,i,r,l,s);if(!a.ok)return p("request",a.error);let d=a.data.EvmSignature,c=a.data.TitleTransactionID??void 0;if(!d)return p("request","Withdrawal response carried no EVM signature.",{titleTransactionID:c});let u;try{u=await it(n,d);}catch(y){return p("withdraw-onchain",A(y),{titleTransactionID:c})}let m=await lt(e,c,u);return m.ok?{ok:true,onChainTxHash:u,data:a.data}:m}async function Ne(t){let{client:e,clients:n,itemID:o,networkID:i,walletAddress:r,amount:l,category:s}=t,a=await e.blockchain.requestNFTWithdrawal(o,i,r,l,s);if(!a.ok)return p("request",a.error);let d=a.data.EvmSignature,c=a.data.TitleTransactionID??void 0;if(!d)return p("request","Withdrawal response carried no EVM signature.",{titleTransactionID:c});let u;try{u=await st(n,d);}catch(y){return p("withdraw-onchain",A(y),{titleTransactionID:c})}let m=await lt(e,c,u);return m.ok?{ok:true,onChainTxHash:u,data:a.data}:m}async function lt(t,e,n){if(!e)return p("confirm","Missing TitleTransactionID.",{onChainTxHash:n});let o=await t.blockchain.confirmWithdrawal(e,n);return o.ok?{ok:true,onChainTxHash:n,data:o.data}:p("confirm",o.error,{onChainTxHash:n,titleTransactionID:e})}var ct=w(()=>{Ae();Te();F();});async function re(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 D("challenge",r.error);let l;try{l=await n.walletClient.signMessage({account:n.account,message:r.data.Message});}catch(a){return D("sign",A(a))}let s=await e.auth.loginWithWallet(i,o,l);return s.ok?{ok:true,data:s.data}:D("login",s.error)}var dt=w(()=>{F();});var Re=w(()=>{rt();ct();dt();});function ie(){let{address:t}=wagmi.useAccount(),e=wagmi.usePublicClient(),{data:n}=wagmi.useWalletClient();return !t||!e||!n?null:{account:t,publicClient:e,walletClient:n}}function fe(t,e){let n=ie();return {connected:!!n,account:n?.account??null,loginWithWallet:(o,i)=>n?re({client:t,clients:n,networkID:o,walletAddress:i}):Promise.resolve(D("challenge",ae)),depositToken:o=>n?De({client:t,clients:n,titleID:e,...o}):Promise.resolve(p("approve",ae)),depositNft:o=>n?Ee({client:t,clients:n,titleID:e,...o}):Promise.resolve(p("deposit-onchain",ae)),withdrawToken:o=>n?Ie({client:t,clients:n,...o}):Promise.resolve(p("withdraw-onchain",ae)),withdrawNft:o=>n?Ne({client:t,clients:n,...o}):Promise.resolve(p("withdraw-onchain",ae))}}var ae,ge=w(()=>{Re();F();ae="Wallet not connected.";});function ft(t){let{wagmiConfig:e,...n}=t;return jsxRuntime.jsx(te,{wagmiConfig:e,children:jsxRuntime.jsx(Le,{...n})})}function ln(t){return t instanceof Error&&(t.name==="ConnectorAlreadyConnectedError"||t.message.includes("already connected"))}function cn(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 ut(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 dn(t,e=18e4){return actions.getAccount(t).isConnected?Promise.resolve(true):new Promise(n=>{let o=false,i=s=>{o||(o=true,r(),clearTimeout(l),n(s));},r=actions.watchAccount(t,{onChange:s=>{s.isConnected&&i(true);}}),l=setTimeout(()=>i(false),e);})}function pn(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,l(),clearTimeout(s),o());},l=actions.watchAccount(t,{onChange:a=>{n(a.status)||r();}}),s=setTimeout(r,e);}):Promise.resolve()}function un(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 fn(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 gn(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 Le(t){let{client:e,networkID:n,onAuthenticated:o,disabled:i,label:r,style:l,autoStart:s}=t,a=wagmi.useConfig(),{isConnected:d}=wagmi.useAccount(),{connectAsync:c,connectors:u}=wagmi.useConnect(),m=ie(),[y,f]=react.useState(false),[b,h]=react.useState(null),[M,P]=react.useState(false),I=react.useRef(0),L=react.useRef(false),N=async()=>{let E=++I.current,B=()=>I.current===E;f(true),h(null);try{if(await pn(a),!B())return;if(!actions.getAccount(a).isConnected){let v=ee();if(v){if(await v.open(),!await dn(a)){h("No wallet was connected.");return}}else {let z=un(u);if(!z){h("No wallet connector is configured.");return}try{await c({connector:z});}catch(x){if(!ln(x))throw x}}}let k=m??await ut(a);if(!k&&actions.getAccount(a).isConnected&&(await new Promise(v=>setTimeout(v,300)),k=await ut(a),!B()))return;if(!k){h("Wallet client is not available.");return}P(!0);let W=await gn(re({client:e,clients:k,networkID:n}),mn);if(!B())return;if(W.ok){o();return}h(W.stage==="sign"?"Signature declined.":W.error??"Wallet sign-in failed.");}catch(k){if(!B())return;console.error("[idosgames/wallet] wallet sign-in failed:",k),h(cn(k));}finally{B()&&(f(false),P(false));}};react.useEffect(()=>{!s||L.current||(L.current=true,N());},[s]);let R=async()=>{await fn(a)||await ee()?.open();};return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("button",{type:"button",onClick:()=>{M?R():N();},disabled:i,style:{...yn,...i?{opacity:.6,cursor:"default"}:null,...l},children:M?"Waiting for signature \u2014 tap to open wallet":y?"Check your wallet\u2026":d?r??"Sign in with wallet":"Connect wallet"}),b&&jsxRuntime.jsx("span",{role:"alert",style:wn,children:b})]})}var mn,yn,wn,gt=w(()=>{oe();Re();ue();ge();mn=9e4;yn={padding:"11px 16px",borderRadius:"8px",border:"none",background:"#4c3fa8",color:"#fff",font:"inherit",fontWeight:600,cursor:"pointer"},wn={display:"block",marginTop:"6px",color:"#ff9b9b",fontSize:"13px",textAlign:"center"};});function wt(t){let{client:e,walletConnectProjectId:n,appName:o,onClose:i,style:r}=t,[l,s]=react.useState(n??"");react.useEffect(()=>{if(n)return;let d=true;return (async()=>{let c=await e.blockchain.getDefinitions();if(!d||!c.ok)return;let u=c.data.Blockchain?.WalletLogin?.WalletConnectProjectId;u&&s(u);})(),()=>{d=false;}},[e,n]);let a=react.useMemo(()=>pe({walletConnectProjectId:l||void 0,appName:o}),[l,o]);return jsxRuntime.jsx(te,{wagmiConfig:a,children:jsxRuntime.jsx(Dn,{client:e,appName:o,onClose:i,style:r})})}function Dn({client:t,onClose:e,style:n}){let o=fe(t,t.titleID),{address:i,isConnected:r,chainId:l}=wagmi.useAccount(),{connect:s,connectors:a}=wagmi.useConnect(),{disconnect:d}=wagmi.useDisconnect(),{switchChainAsync:c}=wagmi.useSwitchChain(),[,u]=react.useReducer(g=>g+1,0),[m,y]=react.useState({}),[f,b]=react.useState({}),[h,M]=react.useState(""),[P,I]=react.useState(""),[L,N]=react.useState(""),[R,E]=react.useState(false),[B,k]=react.useState(null);react.useEffect(()=>{let g=true;return (async()=>{let S=await t.blockchain.getDefinitions();if(await t.blockchain.getUserState(),!g||!S.ok)return;let q=S.data.Blockchain?.Networks??{},be={};for(let[Ft,Ve]of Object.entries(q))Ve.Type==="EVM"&&(be[Ft]=Ve);y(be),b(S.data.CryptoCurrencies??{});let Mt=Object.keys(be)[0]??"";M(Mt);})(),()=>{g=false;}},[t]),react.useEffect(()=>t.on("user:anyUpdated",u),[t]);let W=react.useMemo(()=>Object.entries(f).filter(([,g])=>g.Networks?.some(S=>S.NetworkID===h&&!!S.ContractAddress)),[f,h]);react.useEffect(()=>{let g=W[0]?.[0]??"";I(S=>W.some(([q])=>q===S)?S:g);},[W]);let v=h?m[h]:void 0,x=(P?f[P]:void 0)?.Networks?.find(g=>g.NetworkID===h),Rt=P?t.data.user.getCryptoCurrencyAmount(P):"0";async function _e(){if(!v?.ChainID||l===v.ChainID)return true;try{return await c({chainId:v.ChainID}),!0}catch{return k({ok:false,stage:"approve",error:`Switch your wallet to chain ${v.ChainID} to continue.`}),false}}async function Bt(){if(!(!v||!x?.ContractAddress)){if(E(true),k(null),await _e()){let g=x.Decimals??18,S;try{S=viem.parseUnits(L||"0",g);}catch{k({ok:false,stage:"approve",error:"Invalid amount."}),E(false);return}let q=await o.depositToken({network:v,tokenAddress:x.ContractAddress,amount:S});k(q),q.ok&&await t.blockchain.getUserState();}E(false);}}async function Lt(){if(!(!v||!o.account)){if(E(true),k(null),await _e()){let g=await o.withdrawToken({currencyID:P,networkID:h,walletAddress:o.account,amount:L||"0"});k(g),g.ok&&await t.blockchain.getUserState();}E(false);}}return jsxRuntime.jsxs("div",{style:{...xn,...n},children:[jsxRuntime.jsxs("div",{style:{...Fe,justifyContent:"space-between"},children:[jsxRuntime.jsx("span",{style:An,children:"Crypto wallet"}),e&&jsxRuntime.jsx("button",{type:"button",style:we,onClick:e,children:"\u2715"})]}),r?jsxRuntime.jsxs("div",{style:Fe,children:[jsxRuntime.jsxs("span",{style:{...U,flex:1,alignSelf:"center"},children:[i?.slice(0,6),"\u2026",i?.slice(-4)]}),jsxRuntime.jsx("button",{type:"button",style:we,onClick:()=>d(),children:"Disconnect"})]}):jsxRuntime.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:6},children:[jsxRuntime.jsx("span",{style:U,children:"Connect a browser or mobile wallet"}),a.map(g=>jsxRuntime.jsx("button",{type:"button",style:we,onClick:()=>s({connector:g}),children:g.name},g.uid))]}),Object.keys(m).length===0?jsxRuntime.jsx("span",{style:U,children:"No EVM networks configured for this title."}):jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsxs("div",{children:[jsxRuntime.jsx("div",{style:U,children:"Network"}),jsxRuntime.jsx("select",{style:Me,value:h,onChange:g=>M(g.target.value),children:Object.entries(m).map(([g,S])=>jsxRuntime.jsx("option",{value:g,children:S.DisplayName??g},g))})]}),jsxRuntime.jsxs("div",{children:[jsxRuntime.jsx("div",{style:U,children:"Token"}),jsxRuntime.jsxs("select",{style:Me,value:P,onChange:g=>I(g.target.value),children:[W.length===0&&jsxRuntime.jsx("option",{value:"",children:"\u2014 no depositable tokens \u2014"}),W.map(([g,S])=>jsxRuntime.jsx("option",{value:g,children:S.DisplayName??g},g))]})]}),jsxRuntime.jsxs("div",{style:U,children:["In-game balance: ",jsxRuntime.jsx("b",{children:Rt})," ",P]}),jsxRuntime.jsxs("div",{children:[jsxRuntime.jsx("div",{style:U,children:"Amount"}),jsxRuntime.jsx("input",{style:Me,inputMode:"decimal",placeholder:"0.0",value:L,onChange:g=>N(g.target.value)})]}),jsxRuntime.jsxs("div",{style:Fe,children:[jsxRuntime.jsx("button",{type:"button",style:{...Tn,flex:1,opacity:R?.6:1},disabled:R||!r||!x?.ContractAddress,onClick:()=>{Bt();},children:"Deposit"}),jsxRuntime.jsx("button",{type:"button",style:{...we,flex:1,opacity:R?.6:1},disabled:R||!r||!P,onClick:()=>{Lt();},children:"Withdraw"})]})]}),B&&jsxRuntime.jsx(En,{result:B})]})}function En({result:t}){let e={fontSize:12,borderRadius:8,padding:"8px 10px",background:t.ok?"#1e3a2a":"#3a1e28",color:t.ok?"#8ef0b0":"#f2a0b4",wordBreak:"break-all"};return t.ok?jsxRuntime.jsxs("div",{style:e,children:["\u2713 Done \xB7 tx ",t.onChainTxHash]}):jsxRuntime.jsxs("div",{style:e,children:["\u2715 [",t.stage,"] ",t.error,t.titleTransactionID?` \xB7 already debited (tx ${t.titleTransactionID}) \u2014 retry/confirm, don't re-request`:""]})}var xn,An,U,Me,Tn,we,Fe,ht=w(()=>{We();ue();ge();xn={pointerEvents:"auto",background:"#04276bf5",border:"1px solid #1e59c8",borderRadius:12,padding:16,color:"#fff",width:320,boxSizing:"border-box",fontFamily:"system-ui, sans-serif",display:"flex",flexDirection:"column",gap:10,maxHeight:"80vh",overflow:"auto"},An={fontWeight:700,fontSize:16},U={fontSize:12,opacity:.7},Me={background:"#052e7e",border:"1px solid #1e59c8",borderRadius:8,color:"#fff",padding:"8px 10px",width:"100%",boxSizing:"border-box"},Tn={background:"#0d66fe",color:"#fff",border:"none",borderRadius:8,padding:"9px 14px",fontWeight:700,cursor:"pointer"},we={background:"#1e59c8",color:"#fff",border:"none",borderRadius:8,padding:"7px 12px",fontWeight:600,cursor:"pointer"},Fe={display:"flex",gap:8};});var He={};$e(He,{DEFAULT_EVM_CHAINS:()=>Pe,IDosGamesWalletProvider:()=>te,WalletLogin:()=>ft,WalletLoginButton:()=>Le,WalletPanel:()=>wt,arbitrum:()=>exports.arbitrum,base:()=>exports.base,bsc:()=>exports.bsc,chainById:()=>ke,createEvmWalletConfig:()=>pe,idosChains:()=>exports.idosChains,mainnet:()=>exports.mainnet,optimism:()=>exports.optimism,polygon:()=>exports.polygon,polygonAmoy:()=>exports.polygonAmoy,sepolia:()=>exports.sepolia,useEvmBridge:()=>fe,useEvmBridgeClients:()=>ie});var Ke=w(()=>{We();X();ue();ge();gt();ht();});function Ct(t){let{walletConnectProjectId:e,appName:n,appUrl:o,appIcon:i,wallets:r}=t,l=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]:[]},d=new appkitAdapterSolana.SolanaAdapter(r?{wallets:r}:{});return de(react$1.createAppKit({adapters:[d],networks:l,projectId:e,metadata:a,features:{analytics:false,email:false,socials:false}})),d}var bt=w(()=>{X();oe();});async function Ge(t){let{client:e,adapter:n,network:o,mint:i,amountRaw:r,titleID:l,category:s}=t,a=e.auth.context?.userID;if(!a)return p("deposit-onchain","Not logged in.");if(r<=0n)return p("deposit-onchain","Amount must be positive.");let d;try{d=await n.depositSpl({mint:i,amountRaw:r,userID:a,titleID:l,category:core.normalizeBlockchainCategory(s)});}catch(u){return p("deposit-onchain",A(u))}let c=await e.blockchain.depositToken(o.NetworkID??"",d);return c.ok?{ok:true,onChainTxHash:d,data:c.data}:p("report",c.error,{onChainTxHash:d})}async function Oe(t){let{client:e,adapter:n,currencyID:o,networkID:i,walletAddress:r,amount:l,category:s}=t,a=await e.blockchain.requestTokenWithdrawal(o,i,r,l,s);if(!a.ok)return p("request",a.error);let d=a.data.SolanaSignature,c=a.data.TitleTransactionID??void 0;if(!d)return p("request","Withdrawal response carried no Solana signature.",{titleTransactionID:c});let u;try{u=await n.submitWithdrawal(d);}catch(y){return p("withdraw-onchain",A(y),{titleTransactionID:c})}if(!c)return p("confirm","Missing TitleTransactionID.",{onChainTxHash:u});let m=await e.blockchain.confirmWithdrawal(c,u);return m.ok?{ok:true,onChainTxHash:u,data:a.data}:p("confirm",m.error,{onChainTxHash:u,titleTransactionID:c})}var kt=w(()=>{F();});async function le(t){let{client:e,networkID:n,walletAddress:o,signMessage:i}=t,r=await e.auth.requestWalletChallenge(o,n);if(!r.ok)return D("challenge",r.error);let l;try{let a=await i(new TextEncoder().encode(r.data.Message));l=Ln(a);}catch(a){return D("sign",A(a))}let s=await e.auth.loginWithWallet(o,n,l);return s.ok?{ok:true,data:s.data}:D("login",s.error)}function Ln(t){let e="0x";for(let n of t)e+=n.toString(16).padStart(2,"0");return e}var vt=w(()=>{F();});var Ue=w(()=>{kt();vt();});function Pt(t,e,n){let{address:o}=react$1.useAppKitAccount(),{walletProvider:i}=react$1.useAppKitProvider("solana"),r=o??null,l=i?.signMessage?.bind(i);return {connected:!!r,account:r,loginWithWallet:(s,a)=>{let d=a??r;return d?l?le({client:t,networkID:s,walletAddress:d,signMessage:l}):Promise.resolve(D("sign","The connected wallet does not support message signing.")):Promise.resolve(D("challenge",St))},depositToken:s=>Ge({client:t,adapter:n,titleID:e,...s}),withdrawToken:s=>{let a=s.walletAddress??r;return a?Oe({client:t,adapter:n,...s,walletAddress:a}):Promise.resolve(p("request",St))}}}var St,Wt=w(()=>{Ue();F();St="Wallet not connected.";});function Un(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 zn(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 qn(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:i,label:r,style:l,autoStart:s}=t,{address:a,isConnected:d}=react$1.useAppKitAccount(),{walletProvider:c}=react$1.useAppKitProvider("solana"),[u,m]=react.useState(false),[y,f]=react.useState(null),[b,h]=react.useState(false),[M,P]=react.useState(false),I=react.useRef(null),L=react.useRef(0),N=react.useCallback(()=>{I.current&&clearTimeout(I.current),I.current=null;},[]);react.useEffect(()=>N,[N]);let R=react.useRef(false),E=react.useCallback(async()=>{let W=++L.current,v=()=>L.current===W,z=c?.signMessage?.bind(c);if(!a||!z){f("The connected wallet cannot sign messages."),m(false);return}m(true),f(null);try{P(!0);let x=await zn(le({client:e,networkID:n,walletAddress:a,signMessage:z}),On);if(!v())return;if(x.ok){o();return}f(x.stage==="sign"?"Signature declined.":x.error??"Wallet sign-in failed.");}catch(x){if(!v())return;console.error("[idosgames/wallet] solana sign-in failed:",x),f(qn(x));}finally{v()&&(m(false),P(false));}},[a,c,e,n,o]),B=react.useCallback(()=>{Un(c)||ee()?.open();},[c]);react.useEffect(()=>{!b||!d||!a||!c||(h(false),N(),E());},[b,d,a,c,E,N]);let k=()=>{if(M){B();return}if(f(null),R.current=true,d&&a&&c){E();return}let W=ee();if(!W){f("Wallet sign-in is not configured for this title.");return}m(true),h(true),N(),I.current=setTimeout(()=>{h(false),m(false),f("No wallet was connected.");},Gn),W.open();};return react.useEffect(()=>{!s||R.current||(R.current=true,k());},[s]),jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("button",{type:"button",onClick:k,disabled:i,style:{...jn,...i?{opacity:.6,cursor:"default"}:null,...l},children:M?"Waiting for signature \u2014 tap to open wallet":u?"Check your wallet\u2026":d?r??"Sign in with wallet":"Connect wallet"}),y&&jsxRuntime.jsx("span",{role:"alert",style:_n,children:y})]})}var Gn,On,jn,_n,Tt=w(()=>{Ue();oe();Gn=18e4,On=9e4;jn={padding:"11px 16px",borderRadius:"8px",border:"none",background:"#4c3fa8",color:"#fff",font:"inherit",fontWeight:600,cursor:"pointer"},_n={display:"block",marginTop:"6px",color:"#ff9b9b",fontSize:"13px",textAlign:"center"};});var Dt={};$e(Dt,{SolanaWalletLogin:()=>At,createSolanaWalletConfig:()=>Ct,solanaDevnet:()=>exports.solanaDevnet,solanaMainnet:()=>exports.solanaMainnet,useSolanaBridge:()=>Pt});var Et=w(()=>{bt();Wt();Tt();X();});var Qn={padding:"11px 16px",borderRadius:"8px",border:"none",background:"#4c3fa8",color:"#fff",font:"inherit",fontWeight:600,cursor:"pointer"},Zn={display:"block",marginTop:"6px",color:"#ff9b9b",fontSize:"13px",textAlign:"center"};function It(t){let{loading:e,disabled:n,label:o,style:i,error:r,onClick:l}=t;return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("button",{type:"button",onClick:l,disabled:n||e,style:{...Qn,...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:Zn,children:r})]})}function Jn(t){let{chains:e,walletConnectProjectId:n,appName:o,disabled:i,label:r,style:l,...s}=t,[a,d]=react.useState(null),[c,u]=react.useState(false),[m,y]=react.useState(null),f=()=>{u(true),y(null),(async()=>{try{let b=await Promise.resolve().then(()=>(Ke(),He)),h=b.createEvmWalletConfig({chains:e,walletConnectProjectId:n,appName:o});d({mod:b,config:h});}catch(b){console.error("[idosgames/wallet] failed to load the wallet module:",b),y("Could not load the wallet. Please try again.");}finally{u(false);}})();};if(a){let{WalletLogin:b}=a.mod;return jsxRuntime.jsx(b,{...s,wagmiConfig:a.config,disabled:i,label:r,style:l,autoStart:true})}return jsxRuntime.jsx(It,{loading:c,disabled:i,label:r,style:l,error:m,onClick:f})}function Xn(t){let{walletConnectProjectId:e,appName:n,disabled:o,label:i,style:r,...l}=t,[s,a]=react.useState(null),[d,c]=react.useState(false),[u,m]=react.useState(null),y=()=>{c(true),m(null),(async()=>{try{let f=await Promise.resolve().then(()=>(Et(),Dt));e&&f.createSolanaWalletConfig({walletConnectProjectId:e,appName:n}),a(f);}catch(f){console.error("[idosgames/wallet] failed to load the wallet module:",f),m("Could not load the wallet. Please try again.");}finally{c(false);}})();};if(s){let{SolanaWalletLogin:f}=s;return jsxRuntime.jsx(f,{...l,disabled:o,label:i,style:r,autoStart:true})}return jsxRuntime.jsx(It,{loading:d,disabled:o,label:i,style:r,error:u,onClick:y})}var eo={pointerEvents:"auto",background:"#04276bf5",border:"1px solid #1e59c8",borderRadius:12,padding:16,color:"#fff",width:320,boxSizing:"border-box",fontFamily:"system-ui, sans-serif",fontSize:13};function to(t){let{onClose:e,style:n}=t,[o,i]=react.useState(null),[r,l]=react.useState(null);return react.useEffect(()=>{let s=true;return (async()=>{try{let a=await Promise.resolve().then(()=>(Ke(),He));s&&i(a);}catch(a){console.error("[idosgames/wallet] failed to load the wallet panel:",a),s&&l("Could not load the wallet.");}})(),()=>{s=false;}},[]),o?jsxRuntime.jsx(o.WalletPanel,{...t}):jsxRuntime.jsxs("div",{style:{...eo,...n},children:[r??"Loading wallet\u2026",e&&jsxRuntime.jsx("button",{type:"button",onClick:e,style:{background:"#1e59c8",color:"#fff",border:"none",borderRadius:8,padding:"7px 12px",fontWeight:600,cursor:"pointer",marginLeft:10},children:"\u2715"})]})}X();
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 Ht=Object.defineProperty;var w=(t,e)=>()=>(t&&(e=t(t=0)),e);var $e=(t,e)=>{for(var n in e)Ht(t,n,{get:e[n],enumerable:true});};function ke(t){return Object.values(exports.idosChains).find(e=>e.id===t)}function Ye(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 X=w(()=>{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 de(t){Qe=t;}function ee(){return Qe}var Qe,oe=w(()=>{Qe=null;});function pe(t){let{chains:e=Se,walletConnectProjectId:n,appName:o,appUrl:i,appIcon:r,transports:l,connectors:s}=t,a=n??"__extension_only__";if(!s){let f=Pe.get(a);if(f)return f}let d={};for(let f of e)d[f.id]=l?.[f.id]??wagmi.http();let c=i??(typeof window<"u"?window.location.origin:""),u={name:o??"iDosGames",description:o??"iDosGames game",url:c,icons:r?[r]:[]};if(n&&!s){let f=e.map(Ye),b=new appkitAdapterWagmi.WagmiAdapter({networks:f,projectId:n,transports:d});return de(react$1.createAppKit({adapters:[b],networks:f,projectId:n,metadata:u,features:{analytics:false,email:false,socials:false}})),Pe.set(a,b.wagmiConfig),b.wagmiConfig}let m=s??[connectors.injected(),connectors.coinbaseWallet({appName:o??"iDosGames"})],y=wagmi.createConfig({chains:e,connectors:m,transports:d});return s||Pe.set(a,y),y}var Se,Pe,We=w(()=>{X();oe();Se=[exports.mainnet,exports.bsc,exports.polygon,exports.base,exports.arbitrum,exports.optimism,exports.sepolia,exports.polygonAmoy],Pe=new Map;});function te(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 ue=w(()=>{});var me,Je,xe,Xe,Ae=w(()=>{me=[{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:"splits",type:"tuple[]",components:[{name:"to",type:"address"},{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:"withdrawERC1155",stateMutability:"nonpayable",inputs:[{name:"token",type:"address"},{name:"to",type:"address"},{name:"id",type:"uint256"},{name:"amount",type:"uint256"},{name:"splits",type:"tuple[]",components:[{name:"to",type:"address"},{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:[]}],Je=[{type:"function",name:"withdrawERC1155Mint",stateMutability:"nonpayable",inputs:[{name:"collection",type:"address"},{name:"to",type:"address"},{name:"id",type:"uint256"},{name:"amount",type:"uint256"},{name:"splits",type:"tuple[]",components:[{name:"to",type:"address"},{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:[]}],xe=[{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"}]}],Xe=[{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 et(t,e,n){return viem.encodeAbiParameters([{type:"string"},{type:"string"},{type:"string"}],[t,e,core.normalizeBlockchainCategory(n)])}var tt=w(()=>{});async function G(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 Te=w(()=>{});function A(t){return t instanceof viem.BaseError?t.shortMessage:t instanceof Error?t.message:String(t)}function p(t,e,n){return {ok:false,stage:t,error:e,...n}}function D(t,e){return {ok:false,stage:t,error:e}}var F=w(()=>{});function nt(t){let e=t.RewardPoolAddress;return e||null}async function ot(t,e,n,o){return await t.publicClient.readContract({address:e,abi:xe,functionName:"allowance",args:[t.account,n]})>=o?null:G(t,{address:e,abi:xe,functionName:"approve",args:[n,o]})}async function De(t){let{client:e,clients:n,network:o,tokenAddress:i,amount:r,titleID:l,category:s}=t,a=e.auth.context?.userID;if(!a)return p("approve","Not logged in.");let d=nt(o);if(!d)return p("approve","Network has no RewardPoolAddress.");if(r<=0n)return p("approve","Amount must be positive.");try{await ot(n,i,d,r);}catch(m){return p("approve",A(m))}let c;try{c=await G(n,{address:d,abi:me,functionName:"depositERC20",args:[i,r,a,l,s??""]});}catch(m){return p("deposit-onchain",A(m))}let u=await e.blockchain.depositToken(o.NetworkID??"",c);return u.ok?{ok:true,onChainTxHash:c,data:u.data}:p("report",u.error,{onChainTxHash:c})}async function Ee(t){let{client:e,clients:n,network:o,nftContractAddress:i,tokenId:r,amount:l,titleID:s,category:a}=t,d=e.auth.context?.userID;if(!d)return p("deposit-onchain","Not logged in.");let c=nt(o);if(!c)return p("deposit-onchain","Network has no RewardPoolAddress.");if(l<=0n)return p("deposit-onchain","Amount must be positive.");let u=et(d,s,a),m;try{m=await G(n,{address:i,abi:Xe,functionName:"safeTransferFrom",args:[n.account,c,r,l,u]});}catch(f){return p("deposit-onchain",A(f))}let y=await e.blockchain.depositNFT(o.NetworkID??"",m);return y.ok?{ok:true,onChainTxHash:m,data:y.data}:p("report",y.error,{onChainTxHash:m})}var rt=w(()=>{Ae();tt();Te();F();});function at(t){return (t.Splits??[]).map(e=>({to:e.To,amount:BigInt(e.Amount??"0")}))}async function it(t,e){return G(t,{address:e.ContractAddress,abi:me,functionName:"withdrawERC20",args:[e.TokenAddress,e.WalletAddress,BigInt(e.Amount??"0"),BigInt(e.BurnAmount??"0"),at(e),BigInt(e.Nonce??"0"),e.Signature??"0x",e.UserID??"",e.TitleID??"",e.Category??"",BigInt(e.Deadline??"0")]})}async function st(t,e){return G(t,{address:e.ContractAddress,abi:Je,functionName:"withdrawERC1155Mint",args:[e.TokenAddress,e.WalletAddress,BigInt(e.TokenId??"0"),BigInt(e.Amount??"0"),at(e),BigInt(e.Nonce??"0"),e.Signature??"0x",e.UserID??"",e.TitleID??"",e.Category??"",BigInt(e.Deadline??"0")]})}async function Ie(t){let{client:e,clients:n,currencyID:o,networkID:i,walletAddress:r,amount:l,category:s}=t,a=await e.blockchain.requestTokenWithdrawal(o,i,r,l,s);if(!a.ok)return p("request",a.error);let d=a.data.EvmSignature,c=a.data.TitleTransactionID??void 0;if(!d)return p("request","Withdrawal response carried no EVM signature.",{titleTransactionID:c});let u;try{u=await it(n,d);}catch(y){return p("withdraw-onchain",A(y),{titleTransactionID:c})}let m=await lt(e,c,u);return m.ok?{ok:true,onChainTxHash:u,data:a.data}:m}async function Ne(t){let{client:e,clients:n,itemID:o,networkID:i,walletAddress:r,amount:l,category:s}=t,a=await e.blockchain.requestNFTWithdrawal(o,i,r,l,s);if(!a.ok)return p("request",a.error);let d=a.data.EvmSignature,c=a.data.TitleTransactionID??void 0;if(!d)return p("request","Withdrawal response carried no EVM signature.",{titleTransactionID:c});let u;try{u=await st(n,d);}catch(y){return p("withdraw-onchain",A(y),{titleTransactionID:c})}let m=await lt(e,c,u);return m.ok?{ok:true,onChainTxHash:u,data:a.data}:m}async function lt(t,e,n){if(!e)return p("confirm","Missing TitleTransactionID.",{onChainTxHash:n});let o=await t.blockchain.confirmWithdrawal(e,n);return o.ok?{ok:true,onChainTxHash:n,data:o.data}:p("confirm",o.error,{onChainTxHash:n,titleTransactionID:e})}var ct=w(()=>{Ae();Te();F();});async function re(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 D("challenge",r.error);let l;try{l=await n.walletClient.signMessage({account:n.account,message:r.data.Message});}catch(a){return D("sign",A(a))}let s=await e.auth.loginWithWallet(i,o,l);return s.ok?{ok:true,data:s.data}:D("login",s.error)}var dt=w(()=>{F();});var Re=w(()=>{rt();ct();dt();});function ie(){let{address:t}=wagmi.useAccount(),e=wagmi.usePublicClient(),{data:n}=wagmi.useWalletClient();return !t||!e||!n?null:{account:t,publicClient:e,walletClient:n}}function fe(t,e){let n=ie();return {connected:!!n,account:n?.account??null,loginWithWallet:(o,i)=>n?re({client:t,clients:n,networkID:o,walletAddress:i}):Promise.resolve(D("challenge",ae)),depositToken:o=>n?De({client:t,clients:n,titleID:e,...o}):Promise.resolve(p("approve",ae)),depositNft:o=>n?Ee({client:t,clients:n,titleID:e,...o}):Promise.resolve(p("deposit-onchain",ae)),withdrawToken:o=>n?Ie({client:t,clients:n,...o}):Promise.resolve(p("withdraw-onchain",ae)),withdrawNft:o=>n?Ne({client:t,clients:n,...o}):Promise.resolve(p("withdraw-onchain",ae))}}var ae,ge=w(()=>{Re();F();ae="Wallet not connected.";});function ft(t){let{wagmiConfig:e,...n}=t;return jsxRuntime.jsx(te,{wagmiConfig:e,children:jsxRuntime.jsx(Le,{...n})})}function ln(t){return t instanceof Error&&(t.name==="ConnectorAlreadyConnectedError"||t.message.includes("already connected"))}function cn(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 ut(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 dn(t,e=18e4){return actions.getAccount(t).isConnected?Promise.resolve(true):new Promise(n=>{let o=false,i=s=>{o||(o=true,r(),clearTimeout(l),n(s));},r=actions.watchAccount(t,{onChange:s=>{s.isConnected&&i(true);}}),l=setTimeout(()=>i(false),e);})}function pn(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,l(),clearTimeout(s),o());},l=actions.watchAccount(t,{onChange:a=>{n(a.status)||r();}}),s=setTimeout(r,e);}):Promise.resolve()}function un(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 fn(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 gn(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 Le(t){let{client:e,networkID:n,onAuthenticated:o,disabled:i,label:r,style:l,autoStart:s}=t,a=wagmi.useConfig(),{isConnected:d}=wagmi.useAccount(),{connectAsync:c,connectors:u}=wagmi.useConnect(),m=ie(),[y,f]=react.useState(false),[b,h]=react.useState(null),[M,S]=react.useState(false),I=react.useRef(0),L=react.useRef(false),N=async()=>{let E=++I.current,B=()=>I.current===E;f(true),h(null);try{if(await pn(a),!B())return;if(!actions.getAccount(a).isConnected){let v=ee();if(v){if(await v.open(),!await dn(a)){h("No wallet was connected.");return}}else {let z=un(u);if(!z){h("No wallet connector is configured.");return}try{await c({connector:z});}catch(x){if(!ln(x))throw x}}}let k=m??await ut(a);if(!k&&actions.getAccount(a).isConnected&&(await new Promise(v=>setTimeout(v,300)),k=await ut(a),!B()))return;if(!k){h("Wallet client is not available.");return}S(!0);let W=await gn(re({client:e,clients:k,networkID:n}),mn);if(!B())return;if(W.ok){o();return}h(W.stage==="sign"?"Signature declined.":W.error??"Wallet sign-in failed.");}catch(k){if(!B())return;console.error("[idosgames/wallet] wallet sign-in failed:",k),h(cn(k));}finally{B()&&(f(false),S(false));}};react.useEffect(()=>{!s||L.current||(L.current=true,N());},[s]);let R=async()=>{await fn(a)||await ee()?.open();};return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("button",{type:"button",onClick:()=>{M?R():N();},disabled:i,style:{...yn,...i?{opacity:.6,cursor:"default"}:null,...l},children:M?"Waiting for signature \u2014 tap to open wallet":y?"Check your wallet\u2026":d?r??"Sign in with wallet":"Connect wallet"}),b&&jsxRuntime.jsx("span",{role:"alert",style:wn,children:b})]})}var mn,yn,wn,gt=w(()=>{oe();Re();ue();ge();mn=9e4;yn={padding:"11px 16px",borderRadius:"8px",border:"none",background:"#4c3fa8",color:"#fff",font:"inherit",fontWeight:600,cursor:"pointer"},wn={display:"block",marginTop:"6px",color:"#ff9b9b",fontSize:"13px",textAlign:"center"};});function wt(t){let{client:e,walletConnectProjectId:n,appName:o,onClose:i,style:r}=t,[l,s]=react.useState(n??"");react.useEffect(()=>{if(n)return;let d=true;return (async()=>{let c=await e.blockchain.getDefinitions();if(!d||!c.ok)return;let u=c.data.Blockchain?.WalletLogin?.WalletConnectProjectId;u&&s(u);})(),()=>{d=false;}},[e,n]);let a=react.useMemo(()=>pe({walletConnectProjectId:l||void 0,appName:o}),[l,o]);return jsxRuntime.jsx(te,{wagmiConfig:a,children:jsxRuntime.jsx(Dn,{client:e,appName:o,onClose:i,style:r})})}function Dn({client:t,onClose:e,style:n}){let o=fe(t,t.titleID),{address:i,isConnected:r,chainId:l}=wagmi.useAccount(),{connect:s,connectors:a}=wagmi.useConnect(),{disconnect:d}=wagmi.useDisconnect(),{switchChainAsync:c}=wagmi.useSwitchChain(),[,u]=react.useReducer(g=>g+1,0),[m,y]=react.useState({}),[f,b]=react.useState({}),[h,M]=react.useState(""),[S,I]=react.useState(""),[L,N]=react.useState(""),[R,E]=react.useState(false),[B,k]=react.useState(null);react.useEffect(()=>{let g=true;return (async()=>{let P=await t.blockchain.getDefinitions();if(await t.blockchain.getUserState(),!g||!P.ok)return;let q=P.data.Blockchain?.Networks??{},be={};for(let[Ft,Ve]of Object.entries(q))Ve.Type==="EVM"&&(be[Ft]=Ve);y(be),b(P.data.CryptoCurrencies??{});let Mt=Object.keys(be)[0]??"";M(Mt);})(),()=>{g=false;}},[t]),react.useEffect(()=>t.on("user:anyUpdated",u),[t]);let W=react.useMemo(()=>Object.entries(f).filter(([,g])=>g.Networks?.some(P=>P.NetworkID===h&&!!P.ContractAddress)),[f,h]);react.useEffect(()=>{let g=W[0]?.[0]??"";I(P=>W.some(([q])=>q===P)?P:g);},[W]);let v=h?m[h]:void 0,x=(S?f[S]:void 0)?.Networks?.find(g=>g.NetworkID===h),Rt=S?t.data.user.getCryptoCurrencyAmount(S):"0";async function _e(){if(!v?.ChainID||l===v.ChainID)return true;try{return await c({chainId:v.ChainID}),!0}catch{return k({ok:false,stage:"approve",error:`Switch your wallet to chain ${v.ChainID} to continue.`}),false}}async function Bt(){if(!(!v||!x?.ContractAddress)){if(E(true),k(null),await _e()){let g=x.Decimals??18,P;try{P=viem.parseUnits(L||"0",g);}catch{k({ok:false,stage:"approve",error:"Invalid amount."}),E(false);return}let q=await o.depositToken({network:v,tokenAddress:x.ContractAddress,amount:P});k(q),q.ok&&await t.blockchain.getUserState();}E(false);}}async function Lt(){if(!(!v||!o.account)){if(E(true),k(null),await _e()){let g=await o.withdrawToken({currencyID:S,networkID:h,walletAddress:o.account,amount:L||"0"});k(g),g.ok&&await t.blockchain.getUserState();}E(false);}}return jsxRuntime.jsxs("div",{style:{...xn,...n},children:[jsxRuntime.jsxs("div",{style:{...Fe,justifyContent:"space-between"},children:[jsxRuntime.jsx("span",{style:An,children:"Crypto wallet"}),e&&jsxRuntime.jsx("button",{type:"button",style:we,onClick:e,children:"\u2715"})]}),r?jsxRuntime.jsxs("div",{style:Fe,children:[jsxRuntime.jsxs("span",{style:{...U,flex:1,alignSelf:"center"},children:[i?.slice(0,6),"\u2026",i?.slice(-4)]}),jsxRuntime.jsx("button",{type:"button",style:we,onClick:()=>d(),children:"Disconnect"})]}):jsxRuntime.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:6},children:[jsxRuntime.jsx("span",{style:U,children:"Connect a browser or mobile wallet"}),a.map(g=>jsxRuntime.jsx("button",{type:"button",style:we,onClick:()=>s({connector:g}),children:g.name},g.uid))]}),Object.keys(m).length===0?jsxRuntime.jsx("span",{style:U,children:"No EVM networks configured for this title."}):jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsxs("div",{children:[jsxRuntime.jsx("div",{style:U,children:"Network"}),jsxRuntime.jsx("select",{style:Me,value:h,onChange:g=>M(g.target.value),children:Object.entries(m).map(([g,P])=>jsxRuntime.jsx("option",{value:g,children:P.DisplayName??g},g))})]}),jsxRuntime.jsxs("div",{children:[jsxRuntime.jsx("div",{style:U,children:"Token"}),jsxRuntime.jsxs("select",{style:Me,value:S,onChange:g=>I(g.target.value),children:[W.length===0&&jsxRuntime.jsx("option",{value:"",children:"\u2014 no depositable tokens \u2014"}),W.map(([g,P])=>jsxRuntime.jsx("option",{value:g,children:P.DisplayName??g},g))]})]}),jsxRuntime.jsxs("div",{style:U,children:["In-game balance: ",jsxRuntime.jsx("b",{children:Rt})," ",S]}),jsxRuntime.jsxs("div",{children:[jsxRuntime.jsx("div",{style:U,children:"Amount"}),jsxRuntime.jsx("input",{style:Me,inputMode:"decimal",placeholder:"0.0",value:L,onChange:g=>N(g.target.value)})]}),jsxRuntime.jsxs("div",{style:Fe,children:[jsxRuntime.jsx("button",{type:"button",style:{...Tn,flex:1,opacity:R?.6:1},disabled:R||!r||!x?.ContractAddress,onClick:()=>{Bt();},children:"Deposit"}),jsxRuntime.jsx("button",{type:"button",style:{...we,flex:1,opacity:R?.6:1},disabled:R||!r||!S,onClick:()=>{Lt();},children:"Withdraw"})]})]}),B&&jsxRuntime.jsx(En,{result:B})]})}function En({result:t}){let e={fontSize:12,borderRadius:8,padding:"8px 10px",background:t.ok?"#1e3a2a":"#3a1e28",color:t.ok?"#8ef0b0":"#f2a0b4",wordBreak:"break-all"};return t.ok?jsxRuntime.jsxs("div",{style:e,children:["\u2713 Done \xB7 tx ",t.onChainTxHash]}):jsxRuntime.jsxs("div",{style:e,children:["\u2715 [",t.stage,"] ",t.error,t.titleTransactionID?` \xB7 already debited (tx ${t.titleTransactionID}) \u2014 retry/confirm, don't re-request`:""]})}var xn,An,U,Me,Tn,we,Fe,ht=w(()=>{We();ue();ge();xn={pointerEvents:"auto",background:"#04276bf5",border:"1px solid #1e59c8",borderRadius:12,padding:16,color:"#fff",width:320,boxSizing:"border-box",fontFamily:"system-ui, sans-serif",display:"flex",flexDirection:"column",gap:10,maxHeight:"80vh",overflow:"auto"},An={fontWeight:700,fontSize:16},U={fontSize:12,opacity:.7},Me={background:"#052e7e",border:"1px solid #1e59c8",borderRadius:8,color:"#fff",padding:"8px 10px",width:"100%",boxSizing:"border-box"},Tn={background:"#0d66fe",color:"#fff",border:"none",borderRadius:8,padding:"9px 14px",fontWeight:700,cursor:"pointer"},we={background:"#1e59c8",color:"#fff",border:"none",borderRadius:8,padding:"7px 12px",fontWeight:600,cursor:"pointer"},Fe={display:"flex",gap:8};});var He={};$e(He,{DEFAULT_EVM_CHAINS:()=>Se,IDosGamesWalletProvider:()=>te,WalletLogin:()=>ft,WalletLoginButton:()=>Le,WalletPanel:()=>wt,arbitrum:()=>exports.arbitrum,base:()=>exports.base,bsc:()=>exports.bsc,chainById:()=>ke,createEvmWalletConfig:()=>pe,idosChains:()=>exports.idosChains,mainnet:()=>exports.mainnet,optimism:()=>exports.optimism,polygon:()=>exports.polygon,polygonAmoy:()=>exports.polygonAmoy,sepolia:()=>exports.sepolia,useEvmBridge:()=>fe,useEvmBridgeClients:()=>ie});var Ke=w(()=>{We();X();ue();ge();gt();ht();});function Ct(t){let{walletConnectProjectId:e,appName:n,appUrl:o,appIcon:i,wallets:r}=t,l=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]:[]},d=new appkitAdapterSolana.SolanaAdapter(r?{wallets:r}:{});return de(react$1.createAppKit({adapters:[d],networks:l,projectId:e,metadata:a,features:{analytics:false,email:false,socials:false}})),d}var bt=w(()=>{X();oe();});async function Oe(t){let{client:e,adapter:n,network:o,mint:i,amountRaw:r,titleID:l,category:s}=t,a=e.auth.context?.userID;if(!a)return p("deposit-onchain","Not logged in.");if(r<=0n)return p("deposit-onchain","Amount must be positive.");let d;try{d=await n.depositSpl({mint:i,amountRaw:r,userID:a,titleID:l,category:core.normalizeBlockchainCategory(s)});}catch(u){return p("deposit-onchain",A(u))}let c=await e.blockchain.depositToken(o.NetworkID??"",d);return c.ok?{ok:true,onChainTxHash:d,data:c.data}:p("report",c.error,{onChainTxHash:d})}async function Ge(t){let{client:e,adapter:n,currencyID:o,networkID:i,walletAddress:r,amount:l,category:s}=t,a=await e.blockchain.requestTokenWithdrawal(o,i,r,l,s);if(!a.ok)return p("request",a.error);let d=a.data.SolanaSignature,c=a.data.TitleTransactionID??void 0;if(!d)return p("request","Withdrawal response carried no Solana signature.",{titleTransactionID:c});let u;try{u=await n.submitWithdrawal(d);}catch(y){return p("withdraw-onchain",A(y),{titleTransactionID:c})}if(!c)return p("confirm","Missing TitleTransactionID.",{onChainTxHash:u});let m=await e.blockchain.confirmWithdrawal(c,u);return m.ok?{ok:true,onChainTxHash:u,data:a.data}:p("confirm",m.error,{onChainTxHash:u,titleTransactionID:c})}var kt=w(()=>{F();});async function le(t){let{client:e,networkID:n,walletAddress:o,signMessage:i}=t,r=await e.auth.requestWalletChallenge(o,n);if(!r.ok)return D("challenge",r.error);let l;try{let a=await i(new TextEncoder().encode(r.data.Message));l=Ln(a);}catch(a){return D("sign",A(a))}let s=await e.auth.loginWithWallet(o,n,l);return s.ok?{ok:true,data:s.data}:D("login",s.error)}function Ln(t){let e="0x";for(let n of t)e+=n.toString(16).padStart(2,"0");return e}var vt=w(()=>{F();});var Ue=w(()=>{kt();vt();});function St(t,e,n){let{address:o}=react$1.useAppKitAccount(),{walletProvider:i}=react$1.useAppKitProvider("solana"),r=o??null,l=i?.signMessage?.bind(i);return {connected:!!r,account:r,loginWithWallet:(s,a)=>{let d=a??r;return d?l?le({client:t,networkID:s,walletAddress:d,signMessage:l}):Promise.resolve(D("sign","The connected wallet does not support message signing.")):Promise.resolve(D("challenge",Pt))},depositToken:s=>Oe({client:t,adapter:n,titleID:e,...s}),withdrawToken:s=>{let a=s.walletAddress??r;return a?Ge({client:t,adapter:n,...s,walletAddress:a}):Promise.resolve(p("request",Pt))}}}var Pt,Wt=w(()=>{Ue();F();Pt="Wallet not connected.";});function Un(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 zn(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 qn(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:i,label:r,style:l,autoStart:s}=t,{address:a,isConnected:d}=react$1.useAppKitAccount(),{walletProvider:c}=react$1.useAppKitProvider("solana"),[u,m]=react.useState(false),[y,f]=react.useState(null),[b,h]=react.useState(false),[M,S]=react.useState(false),I=react.useRef(null),L=react.useRef(0),N=react.useCallback(()=>{I.current&&clearTimeout(I.current),I.current=null;},[]);react.useEffect(()=>N,[N]);let R=react.useRef(false),E=react.useCallback(async()=>{let W=++L.current,v=()=>L.current===W,z=c?.signMessage?.bind(c);if(!a||!z){f("The connected wallet cannot sign messages."),m(false);return}m(true),f(null);try{S(!0);let x=await zn(le({client:e,networkID:n,walletAddress:a,signMessage:z}),Gn);if(!v())return;if(x.ok){o();return}f(x.stage==="sign"?"Signature declined.":x.error??"Wallet sign-in failed.");}catch(x){if(!v())return;console.error("[idosgames/wallet] solana sign-in failed:",x),f(qn(x));}finally{v()&&(m(false),S(false));}},[a,c,e,n,o]),B=react.useCallback(()=>{Un(c)||ee()?.open();},[c]);react.useEffect(()=>{!b||!d||!a||!c||(h(false),N(),E());},[b,d,a,c,E,N]);let k=()=>{if(M){B();return}if(f(null),R.current=true,d&&a&&c){E();return}let W=ee();if(!W){f("Wallet sign-in is not configured for this title.");return}m(true),h(true),N(),I.current=setTimeout(()=>{h(false),m(false),f("No wallet was connected.");},On),W.open();};return react.useEffect(()=>{!s||R.current||(R.current=true,k());},[s]),jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("button",{type:"button",onClick:k,disabled:i,style:{...jn,...i?{opacity:.6,cursor:"default"}:null,...l},children:M?"Waiting for signature \u2014 tap to open wallet":u?"Check your wallet\u2026":d?r??"Sign in with wallet":"Connect wallet"}),y&&jsxRuntime.jsx("span",{role:"alert",style:_n,children:y})]})}var On,Gn,jn,_n,Tt=w(()=>{Ue();oe();On=18e4,Gn=9e4;jn={padding:"11px 16px",borderRadius:"8px",border:"none",background:"#4c3fa8",color:"#fff",font:"inherit",fontWeight:600,cursor:"pointer"},_n={display:"block",marginTop:"6px",color:"#ff9b9b",fontSize:"13px",textAlign:"center"};});var Dt={};$e(Dt,{SolanaWalletLogin:()=>At,createSolanaWalletConfig:()=>Ct,solanaDevnet:()=>exports.solanaDevnet,solanaMainnet:()=>exports.solanaMainnet,useSolanaBridge:()=>St});var Et=w(()=>{bt();Wt();Tt();X();});var Qn={padding:"11px 16px",borderRadius:"8px",border:"none",background:"#4c3fa8",color:"#fff",font:"inherit",fontWeight:600,cursor:"pointer"},Zn={display:"block",marginTop:"6px",color:"#ff9b9b",fontSize:"13px",textAlign:"center"};function It(t){let{loading:e,disabled:n,label:o,style:i,error:r,onClick:l}=t;return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("button",{type:"button",onClick:l,disabled:n||e,style:{...Qn,...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:Zn,children:r})]})}function Jn(t){let{chains:e,walletConnectProjectId:n,appName:o,disabled:i,label:r,style:l,...s}=t,[a,d]=react.useState(null),[c,u]=react.useState(false),[m,y]=react.useState(null),f=()=>{u(true),y(null),(async()=>{try{let b=await Promise.resolve().then(()=>(Ke(),He)),h=b.createEvmWalletConfig({chains:e,walletConnectProjectId:n,appName:o});d({mod:b,config:h});}catch(b){console.error("[idosgames/wallet] failed to load the wallet module:",b),y("Could not load the wallet. Please try again.");}finally{u(false);}})();};if(a){let{WalletLogin:b}=a.mod;return jsxRuntime.jsx(b,{...s,wagmiConfig:a.config,disabled:i,label:r,style:l,autoStart:true})}return jsxRuntime.jsx(It,{loading:c,disabled:i,label:r,style:l,error:m,onClick:f})}function Xn(t){let{walletConnectProjectId:e,appName:n,disabled:o,label:i,style:r,...l}=t,[s,a]=react.useState(null),[d,c]=react.useState(false),[u,m]=react.useState(null),y=()=>{c(true),m(null),(async()=>{try{let f=await Promise.resolve().then(()=>(Et(),Dt));e&&f.createSolanaWalletConfig({walletConnectProjectId:e,appName:n}),a(f);}catch(f){console.error("[idosgames/wallet] failed to load the wallet module:",f),m("Could not load the wallet. Please try again.");}finally{c(false);}})();};if(s){let{SolanaWalletLogin:f}=s;return jsxRuntime.jsx(f,{...l,disabled:o,label:i,style:r,autoStart:true})}return jsxRuntime.jsx(It,{loading:d,disabled:o,label:i,style:r,error:u,onClick:y})}var eo={pointerEvents:"auto",background:"#04276bf5",border:"1px solid #1e59c8",borderRadius:12,padding:16,color:"#fff",width:320,boxSizing:"border-box",fontFamily:"system-ui, sans-serif",fontSize:13};function to(t){let{onClose:e,style:n}=t,[o,i]=react.useState(null),[r,l]=react.useState(null);return react.useEffect(()=>{let s=true;return (async()=>{try{let a=await Promise.resolve().then(()=>(Ke(),He));s&&i(a);}catch(a){console.error("[idosgames/wallet] failed to load the wallet panel:",a),s&&l("Could not load the wallet.");}})(),()=>{s=false;}},[]),o?jsxRuntime.jsx(o.WalletPanel,{...t}):jsxRuntime.jsxs("div",{style:{...eo,...n},children:[r??"Loading wallet\u2026",e&&jsxRuntime.jsx("button",{type:"button",onClick:e,style:{background:"#1e59c8",color:"#fff",border:"none",borderRadius:8,padding:"7px 12px",fontWeight:600,cursor:"pointer",marginLeft:10},children:"\u2715"})]})}X();
2
2
  exports.LazySolanaWalletLogin=Xn;exports.LazyWalletLogin=Jn;exports.LazyWalletPanel=to;exports.chainById=ke;
@@ -3,8 +3,8 @@ import { BaseWalletAdapter } from '@solana/wallet-adapter-base';
3
3
  import { a as AppKitSolanaNetwork } from '../chains-B_P3u8_S.cjs';
4
4
  export { g as solanaDevnet, h as solanaMainnet } from '../chains-B_P3u8_S.cjs';
5
5
  import { ClientState, DepositTokenResponse, TokenWithdrawalResponse, IDosGamesClient } from '@idosgames/core';
6
- import { D as DepositTokenSolanaParams, W as WithdrawTokenSolanaParams, S as SolanaProgramAdapter } from '../bridge-CoVqGUFt.cjs';
7
- import { W as WalletLoginResult, a as BridgeResult } from '../types-C11zAA05.cjs';
6
+ import { D as DepositTokenSolanaParams, W as WithdrawTokenSolanaParams, S as SolanaProgramAdapter } from '../bridge-f3pZbjqs.cjs';
7
+ import { W as WalletLoginResult, B as BridgeResult } from '../types-CeUVf1tr.cjs';
8
8
  import { CSSProperties, ReactNode } from 'react';
9
9
  import 'viem';
10
10
 
@@ -3,8 +3,8 @@ import { BaseWalletAdapter } from '@solana/wallet-adapter-base';
3
3
  import { a as AppKitSolanaNetwork } from '../chains-B_P3u8_S.js';
4
4
  export { g as solanaDevnet, h as solanaMainnet } from '../chains-B_P3u8_S.js';
5
5
  import { ClientState, DepositTokenResponse, TokenWithdrawalResponse, IDosGamesClient } from '@idosgames/core';
6
- import { D as DepositTokenSolanaParams, W as WithdrawTokenSolanaParams, S as SolanaProgramAdapter } from '../bridge-nELtKkuz.js';
7
- import { W as WalletLoginResult, a as BridgeResult } from '../types-C11zAA05.js';
6
+ import { D as DepositTokenSolanaParams, W as WithdrawTokenSolanaParams, S as SolanaProgramAdapter } from '../bridge-BSTHFExV.js';
7
+ import { W as WalletLoginResult, B as BridgeResult } from '../types-CeUVf1tr.js';
8
8
  import { CSSProperties, ReactNode } from 'react';
9
9
  import 'viem';
10
10
 
@@ -54,4 +54,4 @@ interface WalletLoginFailure {
54
54
  type WalletLoginResult<T> = WalletLoginSuccess<T> | WalletLoginFailure;
55
55
  declare function walletLoginFail(stage: WalletLoginStage, error: string): WalletLoginFailure;
56
56
 
57
- export { type BridgeFailure as B, type WalletLoginResult as W, type BridgeResult as a, type BridgeStage as b, type BridgeSuccess as c, type WalletLoginFailure as d, type WalletLoginStage as e, type WalletLoginSuccess as f, bridgeFail as g, toErrorMessage as t, walletLoginFail as w };
57
+ export { type BridgeResult as B, type WalletLoginResult as W, type BridgeFailure as a, type BridgeStage as b, type BridgeSuccess as c, type WalletLoginFailure as d, type WalletLoginStage as e, type WalletLoginSuccess as f, bridgeFail as g, toErrorMessage as t, walletLoginFail as w };
@@ -54,4 +54,4 @@ interface WalletLoginFailure {
54
54
  type WalletLoginResult<T> = WalletLoginSuccess<T> | WalletLoginFailure;
55
55
  declare function walletLoginFail(stage: WalletLoginStage, error: string): WalletLoginFailure;
56
56
 
57
- export { type BridgeFailure as B, type WalletLoginResult as W, type BridgeResult as a, type BridgeStage as b, type BridgeSuccess as c, type WalletLoginFailure as d, type WalletLoginStage as e, type WalletLoginSuccess as f, bridgeFail as g, toErrorMessage as t, walletLoginFail as w };
57
+ export { type BridgeResult as B, type WalletLoginResult as W, type BridgeFailure as a, type BridgeStage as b, type BridgeSuccess as c, type WalletLoginFailure as d, type WalletLoginStage as e, type WalletLoginSuccess as f, bridgeFail as g, toErrorMessage as t, walletLoginFail as w };
@@ -1,6 +1,6 @@
1
1
  import { PublicClient, WalletClient, Address, Abi, ContractFunctionName, ContractFunctionArgs, Hex } from 'viem';
2
2
  import { IDosGamesClient, BlockchainNetworkDefinition, DepositNFTResponse, DepositTokenResponse, WithdrawalSignatureResponse, NFTWithdrawalResponse, TokenWithdrawalResponse } from '@idosgames/core';
3
- import { a as BridgeResult } from './types-C11zAA05.js';
3
+ import { B as BridgeResult } from './types-CeUVf1tr.js';
4
4
 
5
5
  /**
6
6
  * The viem clients + signing account the EVM bridge needs. wagmi supplies all three:
@@ -51,6 +51,34 @@ interface DepositTokenEvmParams {
51
51
  * updated by `client.blockchain.depositToken`.
52
52
  */
53
53
  declare function depositTokenEvm(params: DepositTokenEvmParams): Promise<BridgeResult<DepositTokenResponse>>;
54
+ interface DepositTokenOnChainParams {
55
+ clients: EvmBridgeClients;
56
+ /** RewardPool contract of the target network. */
57
+ poolAddress: Address;
58
+ /** ERC-20 contract of the token being deposited. */
59
+ tokenAddress: Address;
60
+ /** Raw on-chain amount, already scaled by the token's decimals. */
61
+ amount: bigint;
62
+ /** Player whose in-game balance the pool credits — the backend reads it off the event. */
63
+ userID: string;
64
+ titleID: string;
65
+ category?: string;
66
+ }
67
+ /**
68
+ * The ON-CHAIN half of a token deposit: approve (if needed) → `depositERC20` → wait for the
69
+ * receipt. Returns the confirmed tx hash and reports nothing to the backend.
70
+ *
71
+ * Split out for hosts that own a session the JS side does not have — a Unity WebGL build is the
72
+ * case it exists for: the page can sign (the wallet stack lives here), but the game's session
73
+ * lives in Unity, so Unity registers the deposit itself. Handing the page a logged-in client
74
+ * instead would give every script on it full access to the player's account.
75
+ *
76
+ * ⚠ Return only after the receipt: the caller reports this hash to the backend immediately, and
77
+ * the backend cannot find a transaction that is not yet mined.
78
+ */
79
+ declare function depositTokenOnChainEvm(params: DepositTokenOnChainParams): Promise<BridgeResult<{
80
+ txHash: Hex;
81
+ }>>;
54
82
  interface DepositNftEvmParams {
55
83
  client: IDosGamesClient;
56
84
  clients: EvmBridgeClients;
@@ -145,4 +173,4 @@ interface WithdrawNftEvmParams {
145
173
  /** Full EVM NFT-withdrawal flow: `requestNFTWithdrawal` → `withdrawERC1155` → `confirmWithdrawal`. */
146
174
  declare function withdrawNftEvm(params: WithdrawNftEvmParams): Promise<BridgeResult<NFTWithdrawalResponse>>;
147
175
 
148
- export { type DepositNft721EvmParams as D, type EvmBridgeClients as E, type WithdrawNftEvmParams as W, type DepositNftEvmParams as a, type DepositTokenEvmParams as b, type WithdrawTokenEvmParams as c, depositNftEvm as d, depositNftEvm721 as e, depositTokenEvm as f, ensureErc20Allowance as g, submitEvmNftWithdrawal721 as h, submitEvmTokenWithdrawal as i, withdrawTokenEvm as j, writeAndWait as k, submitEvmNftWithdrawal as s, withdrawNftEvm as w };
176
+ export { type DepositNft721EvmParams as D, type EvmBridgeClients as E, type WithdrawNftEvmParams as W, type DepositNftEvmParams as a, type DepositTokenEvmParams as b, type DepositTokenOnChainParams as c, type WithdrawTokenEvmParams as d, depositNftEvm as e, depositNftEvm721 as f, depositTokenEvm as g, depositTokenOnChainEvm as h, ensureErc20Allowance as i, submitEvmNftWithdrawal721 as j, submitEvmTokenWithdrawal as k, withdrawTokenEvm as l, writeAndWait as m, submitEvmNftWithdrawal as s, withdrawNftEvm as w };
@@ -1,6 +1,6 @@
1
1
  import { PublicClient, WalletClient, Address, Abi, ContractFunctionName, ContractFunctionArgs, Hex } from 'viem';
2
2
  import { IDosGamesClient, BlockchainNetworkDefinition, DepositNFTResponse, DepositTokenResponse, WithdrawalSignatureResponse, NFTWithdrawalResponse, TokenWithdrawalResponse } from '@idosgames/core';
3
- import { a as BridgeResult } from './types-C11zAA05.cjs';
3
+ import { B as BridgeResult } from './types-CeUVf1tr.cjs';
4
4
 
5
5
  /**
6
6
  * The viem clients + signing account the EVM bridge needs. wagmi supplies all three:
@@ -51,6 +51,34 @@ interface DepositTokenEvmParams {
51
51
  * updated by `client.blockchain.depositToken`.
52
52
  */
53
53
  declare function depositTokenEvm(params: DepositTokenEvmParams): Promise<BridgeResult<DepositTokenResponse>>;
54
+ interface DepositTokenOnChainParams {
55
+ clients: EvmBridgeClients;
56
+ /** RewardPool contract of the target network. */
57
+ poolAddress: Address;
58
+ /** ERC-20 contract of the token being deposited. */
59
+ tokenAddress: Address;
60
+ /** Raw on-chain amount, already scaled by the token's decimals. */
61
+ amount: bigint;
62
+ /** Player whose in-game balance the pool credits — the backend reads it off the event. */
63
+ userID: string;
64
+ titleID: string;
65
+ category?: string;
66
+ }
67
+ /**
68
+ * The ON-CHAIN half of a token deposit: approve (if needed) → `depositERC20` → wait for the
69
+ * receipt. Returns the confirmed tx hash and reports nothing to the backend.
70
+ *
71
+ * Split out for hosts that own a session the JS side does not have — a Unity WebGL build is the
72
+ * case it exists for: the page can sign (the wallet stack lives here), but the game's session
73
+ * lives in Unity, so Unity registers the deposit itself. Handing the page a logged-in client
74
+ * instead would give every script on it full access to the player's account.
75
+ *
76
+ * ⚠ Return only after the receipt: the caller reports this hash to the backend immediately, and
77
+ * the backend cannot find a transaction that is not yet mined.
78
+ */
79
+ declare function depositTokenOnChainEvm(params: DepositTokenOnChainParams): Promise<BridgeResult<{
80
+ txHash: Hex;
81
+ }>>;
54
82
  interface DepositNftEvmParams {
55
83
  client: IDosGamesClient;
56
84
  clients: EvmBridgeClients;
@@ -145,4 +173,4 @@ interface WithdrawNftEvmParams {
145
173
  /** Full EVM NFT-withdrawal flow: `requestNFTWithdrawal` → `withdrawERC1155` → `confirmWithdrawal`. */
146
174
  declare function withdrawNftEvm(params: WithdrawNftEvmParams): Promise<BridgeResult<NFTWithdrawalResponse>>;
147
175
 
148
- export { type DepositNft721EvmParams as D, type EvmBridgeClients as E, type WithdrawNftEvmParams as W, type DepositNftEvmParams as a, type DepositTokenEvmParams as b, type WithdrawTokenEvmParams as c, depositNftEvm as d, depositNftEvm721 as e, depositTokenEvm as f, ensureErc20Allowance as g, submitEvmNftWithdrawal721 as h, submitEvmTokenWithdrawal as i, withdrawTokenEvm as j, writeAndWait as k, submitEvmNftWithdrawal as s, withdrawNftEvm as w };
176
+ export { type DepositNft721EvmParams as D, type EvmBridgeClients as E, type WithdrawNftEvmParams as W, type DepositNftEvmParams as a, type DepositTokenEvmParams as b, type DepositTokenOnChainParams as c, type WithdrawTokenEvmParams as d, depositNftEvm as e, depositNftEvm721 as f, depositTokenEvm as g, depositTokenOnChainEvm as h, ensureErc20Allowance as i, submitEvmNftWithdrawal721 as j, submitEvmTokenWithdrawal as k, withdrawTokenEvm as l, writeAndWait as m, submitEvmNftWithdrawal as s, withdrawNftEvm as w };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@idosgames/wallet",
3
- "version": "0.1.17",
3
+ "version": "0.2.0",
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",
@@ -70,7 +70,7 @@
70
70
  },
71
71
  "//": "@idosgames/core не '*': опубликованный пакет обязан назвать диапазон, иначе установка wallet притянет любую версию core, включая будущую ломающую. На 0.x '^' даёт >=0.1.0 <0.2.0 — ровно ту зону, где core обещает совместимость (см. RELEASING.md). Поднимать при мажорном/минорном бампе core.",
72
72
  "dependencies": {
73
- "@idosgames/core": "^0.6.0",
73
+ "@idosgames/core": "^0.7.0",
74
74
  "viem": "^2.55.2"
75
75
  },
76
76
  "peerDependencies": {
@@ -1 +0,0 @@
1
- import {b as b$1,a,c}from'./chunk-K62NMX3A.js';import {encodeAbiParameters}from'viem';import {normalizeBlockchainCategory}from'@idosgames/core';var w=[{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:"splits",type:"tuple[]",components:[{name:"to",type:"address"},{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:"withdrawERC1155",stateMutability:"nonpayable",inputs:[{name:"token",type:"address"},{name:"to",type:"address"},{name:"id",type:"uint256"},{name:"amount",type:"uint256"},{name:"splits",type:"tuple[]",components:[{name:"to",type:"address"},{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:[]}],k=[{type:"function",name:"withdrawERC1155Mint",stateMutability:"nonpayable",inputs:[{name:"collection",type:"address"},{name:"to",type:"address"},{name:"id",type:"uint256"},{name:"amount",type:"uint256"},{name:"splits",type:"tuple[]",components:[{name:"to",type:"address"},{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"}]}],D=[{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"}]}],v=[{type:"function",name:"safeTransferFrom",stateMutability:"nonpayable",inputs:[{name:"from",type:"address"},{name:"to",type:"address"},{name:"tokenId",type:"uint256"},{name:"data",type:"bytes"}],outputs:[]}];function A(e,t,n){return encodeAbiParameters([{type:"string"},{type:"string"},{type:"string"}],[e,t,normalizeBlockchainCategory(n)])}async function f(e,t){let{walletClient:n,publicClient:r,account:m}=e,o=await n.writeContract({address:t.address,abi:t.abi,functionName:t.functionName,args:t.args,account:m,chain:n.chain,value:t.value});if((await r.waitForTransactionReceipt({hash:o})).status==="reverted")throw new Error(`On-chain transaction reverted (${o}).`);return o}function I(e){let t=e.RewardPoolAddress;return t||null}async function C(e,t,n,r){return await e.publicClient.readContract({address:t,abi:b,functionName:"allowance",args:[e.account,n]})>=r?null:f(e,{address:t,abi:b,functionName:"approve",args:[n,r]})}async function R(e){let{client:t,clients:n,network:r,tokenAddress:m,amount:o,titleID:u,category:l}=e,i=t.auth.context?.userID;if(!i)return b$1("approve","Not logged in.");let c=I(r);if(!c)return b$1("approve","Network has no RewardPoolAddress.");if(o<=0n)return b$1("approve","Amount must be positive.");try{await C(n,m,c,o);}catch(d){return b$1("approve",a(d))}let p;try{p=await f(n,{address:c,abi:w,functionName:"depositERC20",args:[m,o,i,u,l??""]});}catch(d){return b$1("deposit-onchain",a(d))}let s=await t.blockchain.depositToken(r.NetworkID??"",p);return s.ok?{ok:true,onChainTxHash:p,data:s.data}:b$1("report",s.error,{onChainTxHash:p})}async function H(e){let{client:t,clients:n,network:r,nftContractAddress:m,tokenId:o,amount:u,titleID:l,category:i}=e,c=t.auth.context?.userID;if(!c)return b$1("deposit-onchain","Not logged in.");let p=I(r);if(!p)return b$1("deposit-onchain","Network has no RewardPoolAddress.");if(u<=0n)return b$1("deposit-onchain","Amount must be positive.");let s=A(c,l,i),d;try{d=await f(n,{address:m,abi:D,functionName:"safeTransferFrom",args:[n.account,p,o,u,s]});}catch(W){return b$1("deposit-onchain",a(W))}let g=await t.blockchain.depositNFT(r.NetworkID??"",d);return g.ok?{ok:true,onChainTxHash:d,data:g.data}:b$1("report",g.error,{onChainTxHash:d})}async function M(e){let{client:t,clients:n,network:r,nftContractAddress:m,tokenId:o,titleID:u,category:l}=e,i=t.auth.context?.userID;if(!i)return b$1("deposit-onchain","Not logged in.");let c=I(r);if(!c)return b$1("deposit-onchain","Network has no RewardPoolAddress.");let p=A(i,u,l),s;try{s=await f(n,{address:m,abi:v,functionName:"safeTransferFrom",args:[n.account,c,o,p]});}catch(g){return b$1("deposit-onchain",a(g))}let d=await t.blockchain.depositNFT(r.NetworkID??"",s);return d.ok?{ok:true,onChainTxHash:s,data:d.data}:b$1("report",d.error,{onChainTxHash:s})}function E(e){return (e.Splits??[]).map(t=>({to:t.To,amount:BigInt(t.Amount??"0")}))}async function x(e,t){return f(e,{address:t.ContractAddress,abi:w,functionName:"withdrawERC20",args:[t.TokenAddress,t.WalletAddress,BigInt(t.Amount??"0"),BigInt(t.BurnAmount??"0"),E(t),BigInt(t.Nonce??"0"),t.Signature??"0x",t.UserID??"",t.TitleID??"",t.Category??"",BigInt(t.Deadline??"0")]})}async function N(e,t){return f(e,{address:t.ContractAddress,abi:k,functionName:"withdrawERC1155Mint",args:[t.TokenAddress,t.WalletAddress,BigInt(t.TokenId??"0"),BigInt(t.Amount??"0"),E(t),BigInt(t.Nonce??"0"),t.Signature??"0x",t.UserID??"",t.TitleID??"",t.Category??"",BigInt(t.Deadline??"0")]})}async function F(e,t){return f(e,{address:t.ContractAddress,abi:k,functionName:"withdrawERC721Mint",args:[t.TokenAddress,t.WalletAddress,BigInt(t.TokenId??"0"),BigInt(t.Nonce??"0"),t.Signature??"0x",t.UserID??"",t.TitleID??"",t.Category??"",BigInt(t.Deadline??"0")]})}async function S(e){let{client:t,clients:n,currencyID:r,networkID:m,walletAddress:o,amount:u,category:l}=e,i=await t.blockchain.requestTokenWithdrawal(r,m,o,u,l);if(!i.ok)return b$1("request",i.error);let c=i.data.EvmSignature,p=i.data.TitleTransactionID??void 0;if(!c)return b$1("request","Withdrawal response carried no EVM signature.",{titleTransactionID:p});let s;try{s=await x(n,c);}catch(g){return b$1("withdraw-onchain",a(g),{titleTransactionID:p})}let d=await T(t,p,s);return d.ok?{ok:true,onChainTxHash:s,data:i.data}:d}async function G(e){let{client:t,clients:n,itemID:r,networkID:m,walletAddress:o,amount:u,category:l}=e,i=await t.blockchain.requestNFTWithdrawal(r,m,o,u,l);if(!i.ok)return b$1("request",i.error);let c=i.data.EvmSignature,p=i.data.TitleTransactionID??void 0;if(!c)return b$1("request","Withdrawal response carried no EVM signature.",{titleTransactionID:p});let s;try{s=await N(n,c);}catch(g){return b$1("withdraw-onchain",a(g),{titleTransactionID:p})}let d=await T(t,p,s);return d.ok?{ok:true,onChainTxHash:s,data:i.data}:d}async function T(e,t,n){if(!t)return b$1("confirm","Missing TitleTransactionID.",{onChainTxHash:n});let r=await e.blockchain.confirmWithdrawal(t,n);return r.ok?{ok:true,onChainTxHash:n,data:r.data}:b$1("confirm",r.error,{onChainTxHash:n,titleTransactionID:t})}async function L(e){let{client:t,clients:n,networkID:r}=e,m=e.walletAddress??n.account,o=await t.auth.requestWalletChallenge(m,r);if(!o.ok)return c("challenge",o.error);let u;try{u=await n.walletClient.signMessage({account:n.account,message:o.data.Message});}catch(i){return c("sign",a(i))}let l=await t.auth.loginWithWallet(m,r,u);return l.ok?{ok:true,data:l.data}:c("login",l.error)}export{w as a,b,D as c,v as d,A as e,f,C as g,R as h,H as i,M as j,x as k,N as l,F as m,S as n,G as o,L as p};