UNPKG

@b3dotfun/anyspend-sdk

Version:

React Hooks and UI Components for AnySpend by B3

1,665 lines (1,622 loc) 84.4 kB
// src/types/chain.ts var ChainType = /* @__PURE__ */ ((ChainType2) => { ChainType2["EVM"] = "evm"; ChainType2["SOLANA"] = "solana"; return ChainType2; })(ChainType || {}); // src/types/globalWallet.ts import { z } from "zod"; var zGlobalWallet = z.object({ chain: z.number(), encryptedPrvkey: z.string(), address: z.string(), orderId: z.string().nullable() }); // src/types/nft.ts import { z as z3 } from "zod"; // src/types/token.ts import { z as z2 } from "zod"; var zToken = z2.object({ chainId: z2.number(), address: z2.string(), symbol: z2.string(), name: z2.string(), decimals: z2.number(), metadata: z2.object({ logoURI: z2.string().optional() }) }); // src/types/nft.ts var NftType = /* @__PURE__ */ ((NftType2) => { NftType2["ERC721"] = "erc721"; NftType2["ERC1155"] = "erc1155"; return NftType2; })(NftType || {}); var zBaseNft = z3.object({ type: z3.nativeEnum(NftType), contractAddress: z3.string(), name: z3.string(), description: z3.string(), imageUrl: z3.string() }); var zNft = z3.discriminatedUnion("type", [ zBaseNft.extend({ type: z3.literal("erc721" /* ERC721 */) }), zBaseNft.extend({ type: z3.literal("erc1155" /* ERC1155 */), tokenId: z3.number(), imageUrl: z3.string() }) ]); var zMintNftPayload = z3.object({ contractAddress: z3.string(), nftPrice: z3.string() }); var zMintNftMetadata = z3.object({ srcToken: zToken, dstToken: zToken, nft: zNft }); // src/types/onramp.ts import { z as z4 } from "zod"; var OnrampVendor = /* @__PURE__ */ ((OnrampVendor2) => { OnrampVendor2["Coinbase"] = "coinbase"; OnrampVendor2["Stripe"] = "stripe"; OnrampVendor2["StripeWeb2"] = "stripe-web2"; return OnrampVendor2; })(OnrampVendor || {}); var zOnrampMetadata = z4.object({ country: z4.string(), vendor: z4.nativeEnum(OnrampVendor), paymentMethod: z4.string(), ipAddress: z4.string().ip("Invalid IP address").optional(), redirectUrl: z4.string() }); // src/types/order.ts import { z as z9 } from "zod"; // src/types/permit.ts import { z as z5 } from "zod"; var zPermit = z5.object({ ownerAddress: z5.string(), deadline: z5.number(), v: z5.number(), r: z5.string(), s: z5.string() }); // src/types/swap.ts import { z as z6 } from "zod"; var zSwapPayload = z6.object({ expectedDstAmount: z6.string(), actualDstAmount: z6.string().nullable() }); var zSwapMetadata = z6.object({ srcToken: zToken, dstToken: zToken }); // src/types/tournament.ts import { z as z7 } from "zod"; var zTournament = z7.object({ slug: z7.string(), name: z7.string(), description: z7.string(), imageUrl: z7.string() }); var zJoinTournamentPayload = z7.object({ contractAddress: z7.string(), entryPrice: z7.string() }); var zFundTournamentPayload = z7.object({ contractAddress: z7.string(), fundAmount: z7.string() }); var zTournamentMetadata = z7.object({ srcToken: zToken, dstToken: zToken, tournament: zTournament }); // src/types/custom.ts import z8 from "zod"; var zCustomPayload = z8.object({ data: z8.string(), to: z8.string(), amount: z8.string() }); var zCustomMetadata = z8.object({ srcToken: zToken, dstToken: zToken, action: z8.string().optional() }); // src/types/order.ts var OrderStatus = /* @__PURE__ */ ((OrderStatus2) => { OrderStatus2["ScanningDepositTransaction"] = "scanning_deposit_transaction"; OrderStatus2["WaitingStripePayment"] = "waiting_stripe_payment"; OrderStatus2["ObtainToken"] = "obtain_token"; OrderStatus2["ObtainFailed"] = "obtain_failed"; OrderStatus2["Expired"] = "expired"; OrderStatus2["SendingTokenFromVault"] = "sending_token_from_vault"; OrderStatus2["Relay"] = "relay"; OrderStatus2["Executed"] = "executed"; OrderStatus2["Refunding"] = "refunding"; OrderStatus2["Refunded"] = "refunded"; OrderStatus2["Failure"] = "failure"; return OrderStatus2; })(OrderStatus || {}); var OrderType = /* @__PURE__ */ ((OrderType2) => { OrderType2["Swap"] = "swap"; OrderType2["MintNFT"] = "mint_nft"; OrderType2["JoinTournament"] = "join_tournament"; OrderType2["FundTournament"] = "fund_tournament"; OrderType2["Custom"] = "custom"; return OrderType2; })(OrderType || {}); var zBaseOrder = z9.object({ id: z9.string(), recipientAddress: z9.string(), globalAddress: z9.string(), srcChain: z9.number(), dstChain: z9.number(), srcTokenAddress: z9.string(), dstTokenAddress: z9.string(), srcAmount: z9.string(), status: z9.nativeEnum(OrderStatus), errorDetails: z9.string().nullable(), createdAt: z9.number(), expiredAt: z9.number(), onrampMetadata: zOnrampMetadata.nullable(), creatorAddress: z9.string().nullable(), oneClickBuyUrl: z9.string().nullable(), stripePaymentIntentId: z9.string().nullable(), permit: zPermit.nullable() }); var zOrder = z9.discriminatedUnion("type", [ zBaseOrder.extend({ type: z9.literal("swap" /* Swap */), payload: zSwapPayload, metadata: zSwapMetadata }), zBaseOrder.extend({ type: z9.literal("mint_nft" /* MintNFT */), payload: zMintNftPayload, metadata: zMintNftMetadata }), zBaseOrder.extend({ type: z9.literal("join_tournament" /* JoinTournament */), payload: zJoinTournamentPayload, metadata: zTournamentMetadata }), zBaseOrder.extend({ type: z9.literal("fund_tournament" /* FundTournament */), payload: zFundTournamentPayload, metadata: zTournamentMetadata }), zBaseOrder.extend({ type: z9.literal("custom" /* Custom */), payload: zCustomPayload, metadata: zCustomMetadata }) ]); // src/types/relay.ts import { z as z10 } from "zod"; var zRelayStatus = z10.enum(["refund", "delayed", "waiting", "failure", "pending", "success"]); var zRelayStepStatus = z10.enum(["complete", "incomplete"]); var TradeType = /* @__PURE__ */ ((TradeType2) => { TradeType2["EXACT_INPUT"] = "EXACT_INPUT"; TradeType2["EXPECTED_OUTPUT"] = "EXPECTED_OUTPUT"; TradeType2["EXACT_OUTPUT"] = "EXACT_OUTPUT"; return TradeType2; })(TradeType || {}); // src/types/transaction.ts import { z as z11 } from "zod"; var zDepositTransaction = z11.object({ orderId: z11.string(), chain: z11.number(), from: z11.string().nullable(), txHash: z11.string(), amount: z11.string(), createdAt: z11.number() }); var zRelayTransaction = z11.object({ orderId: z11.string(), chain: z11.number(), txHash: z11.string(), status: zRelayStatus, createdAt: z11.number() }); var zExecuteTransaction = z11.object({ orderId: z11.string(), chain: z11.number(), txHash: z11.string(), createdAt: z11.number() }); var zRefundTransaction = z11.object({ orderId: z11.string(), chain: z11.number(), txHash: z11.string(), amount: z11.string(), status: z11.enum(["success", "failure"]), createdAt: z11.number() }); // src/types/req-res/createOrder.ts import { z as z12 } from "zod"; var zBaseCreateOrderBody = z12.object({ recipientAddress: z12.string(), srcChain: z12.number(), dstChain: z12.number(), srcTokenAddress: z12.string(), dstTokenAddress: z12.string(), srcAmount: z12.string(), onramp: zOnrampMetadata.optional(), creatorAddress: z12.string().optional() }); var zCreateSwapOrderBody = zBaseCreateOrderBody.extend({ type: z12.literal("swap" /* Swap */), payload: zSwapPayload, metadata: zSwapMetadata }); var zCreateMintNftOrderBody = zBaseCreateOrderBody.extend({ type: z12.literal("mint_nft" /* MintNFT */), payload: zMintNftPayload, metadata: zMintNftMetadata }); var zCreateJoinTournamentOrderBody = zBaseCreateOrderBody.extend({ type: z12.literal("join_tournament" /* JoinTournament */), payload: zJoinTournamentPayload, metadata: zTournamentMetadata }); var zCreateFundTournamentOrderBody = zBaseCreateOrderBody.extend({ type: z12.literal("fund_tournament" /* FundTournament */), payload: zFundTournamentPayload, metadata: zTournamentMetadata }); var zCreateCustomOrderBody = zBaseCreateOrderBody.extend({ type: z12.literal("custom" /* Custom */), payload: zCustomPayload, metadata: zCustomMetadata }); var zCreateOrderRequest = z12.object({ body: z12.discriminatedUnion("type", [ zCreateSwapOrderBody, zCreateMintNftOrderBody, zCreateJoinTournamentOrderBody, zCreateFundTournamentOrderBody, zCreateCustomOrderBody ]) }); var zCreateOrderResponse = z12.object({ success: z12.boolean(), message: z12.string(), data: zOrder, statusCode: z12.number() }); // src/types/req-res/getCoinbaseOnrampOptions.ts import { z as z13 } from "zod"; var zNetwork = z13.object({ name: z13.string(), displayName: z13.string(), contractAddress: z13.string(), chainId: z13.string() }); var zPaymentLimit = z13.object({ id: z13.string(), min: z13.string(), max: z13.string() }); var zPaymentCurrency = z13.object({ id: z13.string(), limits: z13.array(zPaymentLimit) }); var zPurchaseCurrency = z13.object({ id: z13.string(), name: z13.string(), symbol: z13.string(), networks: z13.array(zNetwork), iconUrl: z13.string() }); var zGetCoinbaseOnrampOptionsResponse = z13.object({ paymentCurrencies: z13.array(zPaymentCurrency), purchaseCurrencies: z13.array(zPurchaseCurrency) }); // src/types/req-res/getOrderAndTransactions.ts import { z as z14 } from "zod"; var zGetOrderAndTransactionsRequest = z14.object({ params: z14.object({ orderId: z14.string() }) }); var zGetOrderAndTxsResponse = z14.object({ success: z14.boolean(), message: z14.string(), data: z14.object({ order: zOrder, depositTxs: z14.array(zDepositTransaction).nullable(), relayTx: zRelayTransaction.nullable(), executeTx: zExecuteTransaction.nullable(), refundTxs: z14.array(zRefundTransaction).nullable() }), statusCode: z14.number() }); // src/types/req-res/getOrderByCreator.ts import { z as z15 } from "zod"; var zGetOrdersByCreatorRequest = z15.object({ query: z15.object({ creatorAddress: z15.string().optional(), limit: z15.string().optional(), offset: z15.string().optional() }) }); // src/types/req-res/getOrderHistory.ts import { z as z16 } from "zod"; var zGetOrderHistoryResponse = z16.object({ success: z16.boolean(), message: z16.string(), data: z16.array(zOrder), statusCode: z16.number() }); // src/types/req-res/getQuote.ts import { z as z17 } from "zod"; var zGetQuoteBody = z17.object({ srcChain: z17.number(), dstChain: z17.number(), srcTokenAddress: z17.string(), dstTokenAddress: z17.string() }); var zGetQuoteForSwapOrderBody = zGetQuoteBody.extend({ type: z17.literal("swap" /* Swap */), tradeType: z17.nativeEnum(TradeType), amount: z17.string() }); var zGetQuoteForMintNftOrderBody = zGetQuoteBody.extend({ type: z17.literal("mint_nft" /* MintNFT */), contractAddress: z17.string(), price: z17.string() }); var zGetQuoteForJoinTournamentOrderBody = zGetQuoteBody.extend({ type: z17.literal("join_tournament" /* JoinTournament */), contractAddress: z17.string(), price: z17.string() }); var zGetQuoteForFundTournamentOrderBody = zGetQuoteBody.extend({ type: z17.literal("fund_tournament" /* FundTournament */), contractAddress: z17.string(), fundAmount: z17.string() }); var zGetQuoteForCustomOrderBody = zGetQuoteBody.extend({ type: z17.literal("custom" /* Custom */), payload: zCustomPayload }); var zGetQuoteRequest = z17.object({ body: z17.discriminatedUnion("type", [ zGetQuoteForSwapOrderBody, zGetQuoteForMintNftOrderBody, zGetQuoteForJoinTournamentOrderBody, zGetQuoteForFundTournamentOrderBody, zGetQuoteForCustomOrderBody ]) }); // src/types/req-res/getTokenList.ts import { z as z18 } from "zod"; var zGetTokenListResponse = z18.object({ success: z18.boolean(), message: z18.string(), data: z18.array( z18.object({ chainId: z18.number(), address: z18.string(), symbol: z18.string(), name: z18.string(), decimals: z18.number(), metadata: z18.object({ logoURI: z18.string().optional() }) }) ) }); // src/types/req-res/sendPermitData.ts import { z as z19 } from "zod"; var zSendPermitDataRequest = z19.object({ body: z19.object({ orderId: z19.string(), permitData: zPermit }) }); // src/utils/chain.ts import invariant from "invariant"; import { createPublicClient, createWalletClient, defineChain, http, parseEther } from "viem"; import { arbitrum, avalanche as avalanche2, b3, b3Sepolia, base as base2, baseSepolia, bsc as bsc2, mainnet, optimism, polygon as polygon2, sepolia } from "viem/chains"; // src/constants.ts import { base } from "viem/chains"; var ANYSPEND_MAINNET_BASE_URL = process.env.NEXT_PUBLIC_ANYSPEND_BASE_URL || "https://anyspend-mainnet.up.railway.app"; var ANYSPEND_TESTNET_BASE_URL = process.env.NEXT_PUBLIC_ANYSPEND_BASE_URL || "https://anyspend-testnet.up.railway.app"; var RELAY_ETH_ADDRESS = "0x0000000000000000000000000000000000000000"; var RELAY_SOL_ADDRESS = "11111111111111111111111111111111"; var RELAY_SOLANA_MAINNET_CHAIN_ID = 792703809; var SOLANA_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID = "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL"; var SOLANA_TOKEN_2022_PROGRAM_ID = "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb"; var B3_TOKEN = { chainId: 8453, address: "0xb3b32f9f8827d4634fe7d973fa1034ec9fddb3b3", decimals: 18, name: "B3", symbol: "B3", metadata: { logoURI: "https://s2.coinmarketcap.com/static/img/coins/64x64/35690.png" } }; var USDC_BASE = { symbol: "USDC", chainId: base.id, address: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", name: "USD Coin", decimals: 6, metadata: { logoURI: "https://polygonscan.com/token/images/usdc_32.png" } }; // src/utils/token.ts import { avalanche, bsc, polygon } from "viem/chains"; function isNativeToken(address) { return address.toLowerCase() === RELAY_ETH_ADDRESS || address.toLowerCase() === RELAY_SOL_ADDRESS; } function getSolanaToken() { return { chainId: RELAY_SOLANA_MAINNET_CHAIN_ID, address: RELAY_SOL_ADDRESS, symbol: "SOL", name: "Solana", decimals: 9, metadata: { logoURI: "https://assets.relay.link/icons/square/792703809/light.png" } }; } function getEthToken(chainId) { return { chainId, address: RELAY_ETH_ADDRESS, symbol: "ETH", name: "Ethereum", decimals: 18, metadata: { logoURI: "https://assets.relay.link/icons/square/1/light.png" } }; } function getPolToken() { return { chainId: polygon.id, address: RELAY_ETH_ADDRESS, symbol: "POL", name: "Polygon", decimals: 18, metadata: { logoURI: "https://s2.coinmarketcap.com/static/img/coins/64x64/28321.png" } }; } function getBnbToken() { return { chainId: bsc.id, address: RELAY_ETH_ADDRESS, symbol: "BNB", name: "BNB", decimals: 18, metadata: { logoURI: "https://s2.coinmarketcap.com/static/img/coins/64x64/1839.png" } }; } function getAvaxToken() { return { chainId: avalanche.id, address: RELAY_ETH_ADDRESS, symbol: "AVAX", name: "AVAX", decimals: 18, metadata: { logoURI: "https://s2.coinmarketcap.com/static/img/coins/64x64/5805.png" } }; } // src/utils/chain.ts function getCustomEvmChain(chain, rpcUrl) { return defineChain({ ...chain, rpcUrls: { default: { http: [rpcUrl] } } }); } var EVM_MAINNET = { [mainnet.id]: { id: mainnet.id, name: mainnet.name, type: "evm" /* EVM */, logoUrl: "https://assets.relay.link/icons/square/1/light.png", nativeRequired: parseEther("0.001"), canDepositNative: true, defaultToken: getEthToken(mainnet.id), nativeToken: getEthToken(mainnet.id), viem: getCustomEvmChain( mainnet, "https://quick-chaotic-film.quiknode.pro/39a7aae6a7078f9f36c435e6f34c071c641cf863/" ), pollingInterval: 4e3, // 4 seconds for Ethereum mainnet zapperEnum: "ETHEREUM_MAINNET", coingeckoName: "eth" }, [arbitrum.id]: { id: arbitrum.id, name: "Arbitrum", type: "evm" /* EVM */, logoUrl: "https://assets.relay.link/icons/square/42161/light.png", nativeRequired: parseEther("0.0001"), canDepositNative: true, defaultToken: getEthToken(arbitrum.id), nativeToken: getEthToken(arbitrum.id), viem: getCustomEvmChain( arbitrum, "https://proportionate-twilight-patina.arbitrum-mainnet.quiknode.pro/60e4825626515233a0f566f5915601af6043127b/" ), pollingInterval: 500, // 500ms for Arbitrum's fast blocks zapperEnum: "ARBITRUM_MAINNET", coingeckoName: "arbitrum" }, [base2.id]: { id: base2.id, name: base2.name, logoUrl: "https://assets.relay.link/icons/square/8453/light.png", type: "evm" /* EVM */, nativeRequired: parseEther("0.0001"), canDepositNative: true, defaultToken: getEthToken(base2.id), nativeToken: getEthToken(base2.id), viem: getCustomEvmChain( base2, "https://sly-indulgent-bird.base-mainnet.quiknode.pro/4e31fab6845eb29a2764723a43896999fe962e48/" ), pollingInterval: 1e3, // 1 second for Base zapperEnum: "BASE_MAINNET", coingeckoName: "base" }, [optimism.id]: { id: optimism.id, name: optimism.name, logoUrl: "https://assets.relay.link/icons/square/10/light.png", type: "evm" /* EVM */, nativeRequired: parseEther("0.0001"), canDepositNative: true, defaultToken: getEthToken(optimism.id), nativeToken: getEthToken(optimism.id), viem: getCustomEvmChain( optimism, "https://black-cosmopolitan-hexagon.optimism.quiknode.pro/18382925841f9d09f9e76eef954bf189aa234523/" ), pollingInterval: 1e3, // 1 second for Optimism zapperEnum: "OPTIMISM_MAINNET", coingeckoName: "optimism" }, [polygon2.id]: { id: polygon2.id, name: polygon2.name, logoUrl: "https://assets.relay.link/icons/square/137/light.png", type: "evm" /* EVM */, nativeRequired: parseEther("0.1"), canDepositNative: true, defaultToken: getPolToken(), nativeToken: getPolToken(), viem: getCustomEvmChain( polygon2, "https://purple-young-field.matic.quiknode.pro/ca54f365c1a4c7f970223eb8087e0fc579feba12/" ), pollingInterval: 1e3, // 1 second for Polygon zapperEnum: "POLYGON_MAINNET", coingeckoName: "polygon" }, [avalanche2.id]: { id: avalanche2.id, name: avalanche2.name, logoUrl: "https://assets.relay.link/icons/square/43114/light.png", type: "evm" /* EVM */, nativeRequired: parseEther("0.005"), canDepositNative: true, defaultToken: getAvaxToken(), nativeToken: getAvaxToken(), viem: getCustomEvmChain( avalanche2, "https://burned-billowing-pond.avalanche-mainnet.quiknode.pro/24289978a524a18ef42e568e04fe8cad8c7b6720/ext/bc/C/rpc/" ), pollingInterval: 1e3, // 1 second for Avalanche zapperEnum: "AVALANCHE_MAINNET", coingeckoName: "avalanche" }, [bsc2.id]: { id: bsc2.id, name: bsc2.name, logoUrl: "https://avatars.githubusercontent.com/u/45615063?s=280&v=4", type: "evm" /* EVM */, nativeRequired: parseEther("0.00001"), canDepositNative: false, defaultToken: getBnbToken(), nativeToken: getBnbToken(), viem: getCustomEvmChain(bsc2, "https://bsc-rpc.publicnode.com"), pollingInterval: 1e3, // 1 second for BSC zapperEnum: "BSC_MAINNET", coingeckoName: "bsc" }, [b3.id]: { id: b3.id, name: b3.name, logoUrl: "https://assets.relay.link/icons/square/8333/light.png", type: "evm" /* EVM */, nativeRequired: parseEther("0.0001"), canDepositNative: true, defaultToken: getEthToken(b3.id), nativeToken: getEthToken(b3.id), viem: getCustomEvmChain( b3, "https://late-dimensional-yard.b3-mainnet.quiknode.pro/461dbdbd44158cd7a7a764a58ffb01a67eef77f2/" ), pollingInterval: 1e3, // 1 second for B3 zapperEnum: "B3_MAINNET", coingeckoName: "b3" } }; var EVM_TESTNET = { [sepolia.id]: { id: sepolia.id, name: sepolia.name, logoUrl: "https://assets.relay.link/icons/square/1/light.png", type: "evm" /* EVM */, nativeRequired: parseEther("0.00001"), canDepositNative: true, defaultToken: getEthToken(sepolia.id), nativeToken: getEthToken(sepolia.id), viem: sepolia, pollingInterval: 1e3 // 1 second for Sepolia }, [baseSepolia.id]: { id: baseSepolia.id, name: baseSepolia.name, logoUrl: "https://assets.relay.link/icons/square/8453/light.png", type: "evm" /* EVM */, nativeRequired: parseEther("0.00001"), canDepositNative: true, defaultToken: getEthToken(baseSepolia.id), nativeToken: getEthToken(baseSepolia.id), viem: baseSepolia, pollingInterval: 1e3 // 1 second for Base Sepolia }, [b3Sepolia.id]: { id: b3Sepolia.id, name: b3Sepolia.name, logoUrl: "https://assets.relay.link/icons/square/8333/light.png", type: "evm" /* EVM */, nativeRequired: parseEther("0.00001"), canDepositNative: true, defaultToken: getEthToken(b3Sepolia.id), nativeToken: getEthToken(b3Sepolia.id), viem: b3Sepolia, pollingInterval: 1e3 // 1 second for B3 Sepolia } // [b4testnet.id]: { // id: b4testnet.id, // logoUrl: "https://cdn.b3.fun/b4-logo.png", // type: ChainType.EVM, // viem: b4testnet, // requireNativeBalance: parseEther("0.00001"), // supportDepositNative: true, // }, }; var SOLANA_MAINNET = { id: RELAY_SOLANA_MAINNET_CHAIN_ID, name: "Solana", logoUrl: "https://assets.relay.link/icons/square/792703809/light.png", type: "solana" /* SOLANA */, nativeRequired: BigInt(1e7), // 0.01 SOL canDepositNative: true, defaultToken: getSolanaToken(), nativeToken: getSolanaToken() }; var EVM_CHAINS = { ...EVM_MAINNET, ...EVM_TESTNET }; var SOLANA_CHAINS = { [RELAY_SOLANA_MAINNET_CHAIN_ID]: SOLANA_MAINNET }; var ALL_CHAINS = { ...EVM_CHAINS, ...SOLANA_CHAINS }; function getSolanaChains(network) { invariant(network === "mainnet", "Solana chain is only supported on mainnet"); return SOLANA_MAINNET; } function getAllEvmChains(network) { return network === "mainnet" ? EVM_MAINNET : EVM_TESTNET; } function getChainType(chainId) { invariant(ALL_CHAINS[chainId], `Chain ${chainId} is not supported`); return ALL_CHAINS[chainId].type; } function chainIdToPublicClient(chainId) { invariant(EVM_CHAINS[chainId], `Chain ${chainId} is not an EVM chain`); return createPublicClient({ chain: EVM_CHAINS[chainId].viem, transport: http(), pollingInterval: EVM_CHAINS[chainId].pollingInterval }); } function chainIdToWalletClient(chainId, account) { invariant(EVM_CHAINS[chainId], `Chain ${chainId} is not an EVM chain`); return createWalletClient({ chain: EVM_CHAINS[chainId].viem, transport: http(), account, pollingInterval: EVM_CHAINS[chainId].pollingInterval }); } function getNativeRequired(chainId) { invariant(ALL_CHAINS[chainId], `Chain ${chainId} is not supported`); return ALL_CHAINS[chainId].nativeRequired; } function canDepositNative(chainId) { invariant(ALL_CHAINS[chainId], `Chain ${chainId} is not supported`); return ALL_CHAINS[chainId].canDepositNative; } function isMainnet(chainId) { return EVM_MAINNET[chainId] !== void 0 || RELAY_SOLANA_MAINNET_CHAIN_ID === chainId; } function isTestnet(chainId) { return EVM_TESTNET[chainId] !== void 0; } function getDefaultToken(chainId) { invariant(ALL_CHAINS[chainId], `Chain ${chainId} is not supported`); return ALL_CHAINS[chainId].defaultToken; } function getChainName(chainId) { invariant(ALL_CHAINS[chainId], `Chain ${chainId} is not supported`); return EVM_CHAINS[chainId] ? EVM_CHAINS[chainId].viem.name : "Solana"; } function getPaymentUrl(address, amount, currency) { if (currency === "ETH") { return `ethereum:${address}?value=${amount.toString()}`; } return `ethereum:${address}`; } function getExplorerTxUrl(chainId, txHash) { if (EVM_CHAINS[chainId]) { return EVM_CHAINS[chainId].viem.blockExplorers?.default.url + "/tx/" + txHash; } return "https://solscan.io/tx/" + txHash; } function getExplorerAddressUrl(chainId, address) { if (EVM_CHAINS[chainId]) { return EVM_CHAINS[chainId].viem.blockExplorers?.default.url + "/address/" + address; } return "https://solscan.io/account/" + address; } function getMulticall3Address(chainId) { const chainType = getChainType(chainId); invariant(chainType === "evm" /* EVM */, "chainType must be EVM"); const multicall3 = EVM_CHAINS[chainId].viem.contracts?.multicall3; invariant(multicall3, `multicall3 of chain ${chainId} undefined`); return multicall3.address; } function getNativeToken(chainId) { invariant(ALL_CHAINS[chainId], `Chain ${chainId} undefined`); return ALL_CHAINS[chainId].nativeToken; } function isEvmChain(chainId) { return Boolean(EVM_CHAINS[chainId]); } // src/services/anyspend.ts import invariant2 from "invariant"; var anyspendService = { getTokenList: async (isMainnet2, chainId, query) => { const response = await fetch( `${isMainnet2 ? ANYSPEND_MAINNET_BASE_URL : ANYSPEND_TESTNET_BASE_URL}/chains/${chainId}/tokens?limit=100&term=${query}` ); const data = await response.json(); invariant2(response.status === 200, `Failed to fetch token list for chain ${chainId}`); const parsedData = zGetTokenListResponse.parse(data); return parsedData.data; }, getToken: async (isMainnet2, chainId, tokenAddress) => { if (isNativeToken(tokenAddress)) { return getNativeToken(chainId); } const tokenList = await anyspendService.getTokenList(isMainnet2, chainId, tokenAddress); const token = tokenList.find((t) => t.address.toLowerCase() === tokenAddress.toLowerCase()); if (!token) { throw new Error(`Token ${tokenAddress} not found on chain ${chainId}`); } return token; }, getQuote: async (isMainnet2, req) => { const url = `${isMainnet2 ? ANYSPEND_MAINNET_BASE_URL : ANYSPEND_TESTNET_BASE_URL}/orders/quote`; const response = await fetch(url, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(req) }); const data = await response.json(); if (response.status !== 200) throw new Error(data.message); return data; }, // Order related createOrder: async ({ isMainnet: isMainnet2, recipientAddress, type, srcChain, dstChain, srcTokenAddress, dstTokenAddress, srcAmount, payload, onramp, metadata, creatorAddress }) => { const response = await fetch(`${isMainnet2 ? ANYSPEND_MAINNET_BASE_URL : ANYSPEND_TESTNET_BASE_URL}/orders`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ recipientAddress, type, srcChain, dstChain, srcTokenAddress, dstTokenAddress, srcAmount, payload, onramp, metadata, creatorAddress }) }); const data = await response.json(); invariant2(data.statusCode === 200, data.message); return data; }, getOrderAndTransactions: async (isMainnet2, orderId) => { const response = await fetch( `${isMainnet2 ? ANYSPEND_MAINNET_BASE_URL : ANYSPEND_TESTNET_BASE_URL}/orders/${orderId}` ); const responseData = await response.json(); const data = zGetOrderAndTxsResponse.parse(responseData); return data; }, getOrderHistory: async (isMainnet2, creatorAddress, limit = 100, offset = 0) => { const params = new URLSearchParams({ limit: limit.toString(), offset: offset.toString() }); if (creatorAddress) { params.append("creatorAddress", creatorAddress); } const response = await fetch( `${isMainnet2 ? ANYSPEND_MAINNET_BASE_URL : ANYSPEND_TESTNET_BASE_URL}/orders?${params.toString()}` ); const responseData = await response.json(); const data = zGetOrderHistoryResponse.parse(responseData); return data; }, getCoinbaseOnrampOptions: async (isMainnet2, country) => { const params = new URLSearchParams({ country }); const response = await fetch( `${isMainnet2 ? ANYSPEND_MAINNET_BASE_URL : ANYSPEND_TESTNET_BASE_URL}/onramp/coinbase/options?${params.toString()}` ); const data = await response.json(); const parsedData = zGetCoinbaseOnrampOptionsResponse.parse(data.data); return parsedData; }, checkStripeSupport: async (isMainnet2, ipAddress, usdAmount) => { const params = new URLSearchParams({ ipAddress, usdAmount: usdAmount || "" }); const response = await fetch( `${isMainnet2 ? ANYSPEND_MAINNET_BASE_URL : ANYSPEND_TESTNET_BASE_URL}/onramp/stripe/supported?${params.toString()}` ); const data = await response.json(); invariant2(response.status === 200, "Failed to check Stripe support"); return data.data; }, sendPermitData: async ({ isMainnet: isMainnet2, orderId, permitData }) => { const response = await fetch( `${isMainnet2 ? ANYSPEND_MAINNET_BASE_URL : ANYSPEND_TESTNET_BASE_URL}/orders/send-permit`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ orderId, permitData }) } ); return response.json(); }, getStripeClientSecret: async (isMainnet2, paymentIntentId) => { const response = await fetch( `${isMainnet2 ? ANYSPEND_MAINNET_BASE_URL : ANYSPEND_TESTNET_BASE_URL}/stripe/clientSecret?paymentIntentId=${paymentIntentId}` ); const data = await response.json(); return data.data; } }; // src/utils/address.ts import { isAddress } from "viem"; function isSolanaAddress(address) { const solanaAddressRegex = /^[1-9A-HJ-NP-Za-km-z]{32,44}$/; return solanaAddressRegex.test(address); } function isEvmOrSolanaAddress(address) { return isAddress(address) || isSolanaAddress(address); } function normalizeAddress(address) { if (isSolanaAddress(address)) { return address; } return address.toLowerCase(); } function eqci(a, b) { if (a === "" && b === "") return true; if (!a || !b) return false; return a.toLowerCase() === b.toLowerCase(); } // src/hooks/useAnyspendCreateOnrampOrder.ts import { useMutation } from "@tanstack/react-query"; import { useMemo } from "react"; import { parseUnits } from "viem"; import { base as base3 } from "viem/chains"; // src/utils/orderPayload.ts var buildPayload = (orderType, params) => { const { nft, tournament, payload, expectedDstAmount } = params; switch (orderType) { case "swap" /* Swap */: return { expectedDstAmount, actualDstAmount: null }; case "mint_nft" /* MintNFT */: return { contractAddress: nft ? normalizeAddress(nft.contractAddress) : "", nftPrice: nft?.price || "" }; case "join_tournament" /* JoinTournament */: return { contractAddress: tournament?.contractAddress, entryPrice: tournament?.entryPriceOrFundAmount }; case "fund_tournament" /* FundTournament */: return { contractAddress: tournament?.contractAddress, fundAmount: tournament?.entryPriceOrFundAmount }; case "custom" /* Custom */: return { ...payload }; default: throw new Error(`Invalid order type: ${orderType}`); } }; var buildMetadata = (orderType, params) => { const { srcToken, dstToken, nft, tournament, payload } = params; const baseMetadata = { srcToken, dstToken }; switch (orderType) { case "swap" /* Swap */: return { ...baseMetadata }; case "mint_nft" /* MintNFT */: return { ...baseMetadata, nft }; case "join_tournament" /* JoinTournament */: case "fund_tournament" /* FundTournament */: return { ...baseMetadata, tournament }; case "custom" /* Custom */: return { ...baseMetadata, action: payload.action }; default: throw new Error(`Invalid order type: ${orderType}`); } }; // src/hooks/useAnyspendCreateOnrampOrder.ts function useAnyspendCreateOnrampOrder({ onSuccess, onError } = {}) { const { mutate: createOrder, isPending } = useMutation({ mutationFn: async (params) => { const { isMainnet: isMainnet2, recipientAddress, orderType, dstChain, dstToken, srcFiatAmount, onramp, creatorAddress, expectedDstAmount, nft, tournament, payload } = params; try { if (onramp.vendor === "stripe" && !onramp.ipAddress) { throw new Error("IP address is required for Stripe onramp"); } if (!onramp.vendor || !onramp.country) { throw new Error("Missing required onramp fields: vendor, country"); } const srcToken = USDC_BASE; const srcChain = base3.id; const srcAmountOnRampInWei = parseUnits(srcFiatAmount, USDC_BASE.decimals); return await anyspendService.createOrder({ isMainnet: isMainnet2, recipientAddress: normalizeAddress(recipientAddress), type: orderType, srcChain, srcTokenAddress: normalizeAddress(srcToken.address), dstChain, dstTokenAddress: normalizeAddress(dstToken.address), srcAmount: srcAmountOnRampInWei.toString(), payload: buildPayload(orderType, { orderType, srcToken, dstToken, expectedDstAmount, nft, tournament, payload }), onramp, metadata: buildMetadata(orderType, { orderType, srcToken, dstToken, expectedDstAmount, nft, tournament, payload }), creatorAddress: creatorAddress ? normalizeAddress(creatorAddress) : void 0 }); } catch (error) { if (error?.data) { throw error.data; } throw error; } }, onSuccess: (data) => { onSuccess?.(data); }, onError: (error) => { onError?.(error); } }); return useMemo( () => ({ createOrder, isCreatingOrder: isPending }), [createOrder, isPending] ); } // src/hooks/useAnyspendCreateOrder.ts import { useMutation as useMutation2 } from "@tanstack/react-query"; import { useMemo as useMemo2 } from "react"; function useAnyspendCreateOrder({ onSuccess, onError } = {}) { const { mutate: createOrder, isPending } = useMutation2({ mutationFn: async (params) => { const { isMainnet: isMainnet2, recipientAddress, orderType, srcChain, dstChain, srcToken, dstToken, srcAmount, creatorAddress } = params; try { return await anyspendService.createOrder({ isMainnet: isMainnet2, recipientAddress: normalizeAddress(recipientAddress), type: orderType, srcChain, dstChain, srcTokenAddress: normalizeAddress(srcToken.address), dstTokenAddress: normalizeAddress(dstToken.address), srcAmount, payload: buildPayload(orderType, { orderType, srcToken, dstToken, expectedDstAmount: params.expectedDstAmount, nft: params.nft, tournament: params.tournament, payload: params.payload }), metadata: buildMetadata(orderType, { orderType, srcToken, dstToken, expectedDstAmount: params.expectedDstAmount, nft: params.nft, tournament: params.tournament, payload: params.payload }), creatorAddress: creatorAddress ? normalizeAddress(creatorAddress) : void 0 }); } catch (error) { if (error?.data) { throw error.data; } throw error; } }, onSuccess: (data) => { onSuccess?.(data); }, onError: (error) => { onError?.(error); } }); return useMemo2( () => ({ createOrder, isCreatingOrder: isPending }), [createOrder, isPending] ); } // src/hooks/useAnyspendOrderAndTransactions.ts import { useQuery } from "@tanstack/react-query"; import isEqual from "lodash/isEqual.js"; import { useCallback, useMemo as useMemo3 } from "react"; function useAnyspendOrderAndTransactions(isMainnet2, orderId) { const selectFn = useCallback((data2) => { if (!data2) return void 0; return data2; }, []); const { data, isLoading, refetch, error } = useQuery({ queryKey: ["getAnyspendOrderAndTransactions", orderId], queryFn: () => anyspendService.getOrderAndTransactions(isMainnet2, orderId), enabled: Boolean(orderId), refetchInterval: 3e3, staleTime: 1e3, select: selectFn, structuralSharing: (oldData, newData) => { if (isEqual(oldData, newData)) return oldData; return newData; } }); return useMemo3( () => ({ orderAndTransactions: data, isLoadingOrderAndTransactions: isLoading, getOrderAndTransactionsError: error, refetchOrderAndTransactions: refetch }), [data, error, isLoading, refetch] ); } // src/hooks/useAnyspendOrderHistory.ts import { useQuery as useQuery2 } from "@tanstack/react-query"; function useAnyspendOrderHistory(isMainnet2, creatorAddress, limit = 100, offset = 0) { const { data: rawData = [], isLoading, refetch, error } = useQuery2({ queryKey: ["getOrderHistory", creatorAddress, limit, offset], queryFn: async () => { const response = await anyspendService.getOrderHistory(isMainnet2, creatorAddress, limit, offset); return response.data; } }); return { orderHistory: rawData, isLoadingOrderHistory: isLoading, getOrderHistoryError: error, refetchOrderHistory: refetch }; } // src/hooks/useAnyspendQuote.ts import { useQuery as useQuery3 } from "@tanstack/react-query"; import { useMemo as useMemo4 } from "react"; function useAnyspendQuote(isMainnet2, req) { const { data, isLoading, refetch, error } = useQuery3({ queryKey: ["useAnyspendQuote", isMainnet2, req], queryFn: () => { return anyspendService.getQuote(isMainnet2, req); }, enabled: Boolean( req.srcChain && req.dstChain && req.srcTokenAddress && req.dstTokenAddress && BigInt( req.type === "swap" /* Swap */ ? req.amount : req.type === "mint_nft" /* MintNFT */ ? req.price : req.type === "join_tournament" /* JoinTournament */ ? req.price : req.type === "fund_tournament" /* FundTournament */ ? req.fundAmount : req.payload.amount ) !== BigInt(0) ), refetchInterval: 1e4, retry: false }); return useMemo4( () => ({ anyspendQuote: data, isLoadingAnyspendQuote: isLoading, getAnyspendQuoteError: error, refetchAnyspendQuote: refetch }), [data, error, isLoading, refetch] ); } // src/hooks/useAnyspendSendPermitData.ts import { useMutation as useMutation3 } from "@tanstack/react-query"; function useAnyspendSendPermitData({ onSuccess, onError } = {}) { const { mutate: sendPermitData, isPending } = useMutation3({ mutationFn: async ({ isMainnet: isMainnet2, orderId, permitData }) => { try { const response = await anyspendService.sendPermitData({ isMainnet: isMainnet2, orderId, permitData }); if (response.statusCode !== 200) throw response; return response; } catch (error) { if (error.response?.data) { throw error.response.data; } throw error; } }, onSuccess: (data) => { onSuccess?.(data); }, onError: (error) => { onError?.(error); } }); return { sendPermitData, isSendingPermitData: isPending }; } // src/hooks/useAnyspendTokens.ts import { useQuery as useQuery4 } from "@tanstack/react-query"; import { useMemo as useMemo5 } from "react"; function useAnyspendTokenList(isMainnet2, chainId, query) { const { data = [], isLoading, refetch } = useQuery4({ queryKey: ["getAnyspendTokenList", chainId, query], queryFn: () => anyspendService.getTokenList(isMainnet2, chainId, query), enabled: true }); return useMemo5( () => ({ data, isLoading, refetch }), [data, isLoading, refetch] ); } // src/hooks/useCoinbaseOnrampOptions.ts import { useQuery as useQuery5 } from "@tanstack/react-query"; import { useMemo as useMemo6 } from "react"; function useCoinbaseOnrampOptions(isMainnet2, country) { const { data, isLoading, error, refetch } = useQuery5({ queryKey: ["getCoinbaseOnrampOptions", isMainnet2, country], queryFn: () => anyspendService.getCoinbaseOnrampOptions(isMainnet2, country), enabled: Boolean(country) }); return useMemo6( () => ({ coinbaseOnrampOptions: data, isLoadingCoinbaseOnrampOptions: isLoading, coinbaseOnrampOptionsError: error, refetchCoinbaseOnrampOptions: refetch }), [data, isLoading, error, refetch] ); } // src/hooks/useGeoOnrampOptions.ts import { useMemo as useMemo8 } from "react"; // src/hooks/useGetGeo.ts import { useQuery as useQuery6 } from "@tanstack/react-query"; async function fetchGeoData() { const response = await fetch("https://geo.basement.fun/"); if (!response.ok) { throw new Error("Failed to fetch geo data"); } return response.json(); } function useGetGeo() { const { data: geoData, isLoading: loading, error } = useQuery6({ queryKey: ["useGetGeo"], queryFn: fetchGeoData, retry: 3 }); return { geoData, loading, error }; } var useGetGeo_default = useGetGeo; // src/hooks/useStripeSupport.ts import { useQuery as useQuery7 } from "@tanstack/react-query"; import { useMemo as useMemo7 } from "react"; function useStripeSupport(isMainnet2, ipAddress, usdAmount) { const { data, isLoading, error, refetch } = useQuery7({ queryKey: ["useStripeSupport", isMainnet2, ipAddress, usdAmount], queryFn: () => anyspendService.checkStripeSupport(isMainnet2, ipAddress, usdAmount), enabled: !!ipAddress }); return useMemo7( () => ({ isStripeOnrampSupported: data?.stripeOnramp || false, isStripeWeb2Supported: data?.stripeWeb2 || false, isLoadingStripeSupport: isLoading, stripeSupportError: error, refetchStripeSupport: refetch }), [data, isLoading, error, refetch] ); } // src/hooks/useGeoOnrampOptions.ts function useGeoOnrampOptions(isMainnet2, srcFiatAmount) { const { geoData, loading: isLoadingGeo, error: geoError } = useGetGeo_default(); const { coinbaseOnrampOptions, isLoadingCoinbaseOnrampOptions, coinbaseOnrampOptionsError } = useCoinbaseOnrampOptions(isMainnet2, geoData?.country); const { isStripeOnrampSupported, isStripeWeb2Supported, isLoadingStripeSupport, stripeSupportError } = useStripeSupport(isMainnet2, geoData?.ip || "", srcFiatAmount); const coinbaseAvailablePaymentMethods = useMemo8(() => { if (!coinbaseOnrampOptions?.paymentCurrencies?.[0]?.limits || !srcFiatAmount) return []; const amountNum = parseFloat(srcFiatAmount); if (isNaN(amountNum)) return []; return coinbaseOnrampOptions.paymentCurrencies[0].limits.filter((limit) => { const min = parseFloat(limit.min); const max = parseFloat(limit.max); return amountNum >= min && amountNum <= max; }); }, [coinbaseOnrampOptions, srcFiatAmount]); return useMemo8( () => ({ geoData, coinbaseOnrampOptions, coinbaseAvailablePaymentMethods, isStripeOnrampSupported, isStripeWeb2Supported, isOnrampSupported: coinbaseAvailablePaymentMethods.length > 0 || isStripeOnrampSupported || isStripeWeb2Supported, isLoading: isLoadingGeo || isLoadingCoinbaseOnrampOptions || isLoadingStripeSupport, isLoadingGeo, isLoadingCoinbaseOnrampOptions, isLoadingStripeSupport, geoError, coinbaseOnrampOptionsError, stripeSupportError }), [ geoData, coinbaseOnrampOptions, coinbaseAvailablePaymentMethods, isStripeOnrampSupported, isStripeWeb2Supported, isLoadingGeo, isLoadingCoinbaseOnrampOptions, isLoadingStripeSupport, geoError, coinbaseOnrampOptionsError, stripeSupportError ] ); } // src/hooks/usePermitData.ts import { useQuery as useQuery8 } from "@tanstack/react-query"; // src/abis/abi-usdc-base.ts var ABI_USDC_BASE = [ { anonymous: false, inputs: [ { indexed: true, internalType: "address", name: "owner", type: "address" }, { indexed: true, internalType: "address", name: "spender", type: "address" }, { indexed: false, internalType: "uint256", name: "value", type: "uint256" } ], name: "Approval", type: "event" }, { anonymous: false, inputs: [ { indexed: true, internalType: "address", name: "authorizer", type: "address" }, { indexed: true, internalType: "bytes32", name: "nonce", type: "bytes32" } ], name: "AuthorizationCanceled", type: "event" }, { anonymous: false, inputs: [ { indexed: true, internalType: "address", name: "authorizer", type: "address" }, { indexed: true, internalType: "bytes32", name: "nonce", type: "bytes32" } ], name: "AuthorizationUsed", type: "event" }, { anonymous: false, inputs: [{ indexed: true, internalType: "address", name: "_account", type: "address" }], name: "Blacklisted", type: "event" }, { anonymous: false, inputs: [{ indexed: true, internalType: "address", name: "newBlacklister", type: "address" }], name: "BlacklisterChanged", type: "event" }, { anonymous: false, inputs: [ { indexed: true, internalType: "address", name: "burner", type: "address" }, { indexed: false, internalType: "uint256", name: "amount", type: "uint256" } ], name: "Burn", type: "event" }, { anonymous: false, inputs: [{ indexed: true, internalType: "address", name: "newMasterMinter", type: "address" }], name: "MasterMinterChanged", type: "event" }, { anonymous: false, inputs: [ { indexed: true, internalType: "address", name: "minter", type: "address" }, { indexed: true, internalType: "address", name: "to", type: "address" }, { indexed: false, internalType: "uint256", name: "amount", type: "uint256" } ], name: "Mint", type: "event" }, { anonymous: false, inputs: [ { indexed: true, internalType: "address", name: "minter", type: "address" }, { indexed: false, internalType: "uint256", name: "minterAllowedAmount", type: "uint256" } ], name: "MinterConfigured", type: "event" }, { anonymous: false, inputs: [{ indexed: true, internalType: "address", name: "oldMinter", type: "address" }], name: "MinterRemoved", type: "event" }, { anonymous: false, inputs: [ { indexed: false, internalType: "address", name: "previousOwner", type: "address" }, { indexed: false, internalType: "address", name: "newOwner", type: "address" } ], name: "OwnershipTransferred", type: "event" }, { anonymous: false, inputs: [], name: "Pause", type: "event" }, { anonymous: false, inputs: [{ indexed: true, internalType: "address", name: "newAddress", type: "address" }], name: "PauserChanged", type: "event" }, { anonymous: false, inputs: [{ indexed: true, internalType: "address", name: "newRescuer", type: "address" }], name: "RescuerChanged", type: "event" }, { anonymous: false, inputs: [ { indexed: true, internalType: "address", name: "from", type: "address" }, { indexed: true, internalType: "address", name: "to", type: "address" }, { indexed: false, internalType: "uint256", name: "value", type: "uint256" } ], name: "Transfer", type: "event" }, { anonymous: false, inputs: [{ indexed: true, internalType: "address", name: "_account", type: "address" }], name: "UnBlacklisted", type: "event" }, { anonymous: false, inputs: [], name: "Unpause", type: "event" }, { inputs: [], name: "CANCEL_AUTHORIZATION_TYPEHASH", outputs: [{ internalType: "bytes32", name: "", type: "bytes32" }], stateMutability: "view", type: "function" }, { inputs: [], name: "DOMAIN_SEPARATOR", outputs: [{ internalType: "bytes32", name: "", type: "bytes32" }], stateMutability: "view", type: "function" }, { inputs: [], name: "PERMIT_TYPEHASH", outputs: [{ internalType: "bytes32", name: "", type: "bytes32" }], stateMutability: "view", type: "function" }, { inputs: [], name: "RECEIVE_WITH_AUTHORIZATION_TYPEHASH", outputs: [{ internalType: "bytes32", name: "", type: "bytes32" }], stateMutability: "view", type: "function" }, { inputs: [], name: "TRANSFER_WITH_AUTHORIZATION_TYPEHASH", outputs: [{ internalType: "bytes32", name: "", type: "bytes32" }], stateMutability: "view", type: "function" }, { inputs: [ { internalType: "address", name: "owner", type: "address" }, { internalType: "address", name: "spender", type: "address" } ], name: "allowance", outputs: [{ internalType: "uint256", name: "", type: "uint256" }], stateMutability: "view", type: "function" }, { inputs: [ { internalType: "address", name: "spender", type: "address" }, { internalType: "uint256", name: "value", type: "uint256" } ], name: "approve", outputs: [{ internalType: "bool", name: "", type: "bool" }], stateMutability: "nonpayable", type: "function" }, { inputs: [ { internalType: "address", name: "authorizer", type: "address" }, { internalType: "bytes32", name: "nonce", type: "bytes32" } ], name: "authorizationState", outputs: [