{"version":3,"sources":["../../tokens/src/tokenSale.ts","../../tokens/src/index.ts"],"names":["getLaunchSaleAddresses","SaleContractV2ABI","APNTsSaleContractABI","ERC20ABI","getDvtRelayerUrlsForChain","parseAbi","SuperPaymasterABI","formatEther"],"mappings":"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","file":"chunk-TDFCI5AF.cjs","sourcesContent":["import { type Address, type Hash, type Hex } from 'viem';\nimport {\n  ERC20ABI,\n  SaleContractV2ABI,\n  APNTsSaleContractABI,\n  getLaunchSaleAddresses,\n  getDvtRelayerUrlsForChain,\n  type LaunchSaleAddresses,\n  type PublicClient,\n  type WalletClient,\n} from '@aastar/core';\n\n/** Which token to buy from the launch sale stack. */\nexport type SaleTokenKind = 'GTOKEN' | 'APNTS';\n/** Stablecoin used to pay (both 6-decimal). Gasless supports USDC only. */\nexport type PayToken = 'USDC' | 'USDT';\n\n/** Live USD prices (6-decimal) for one unit of each sale token. */\nexport interface SalePrices {\n  /** USD price per GToken, 6-decimal (e.g. 150000n = $0.15). */\n  gToken: bigint;\n  /** USD price per aPNTs, 6-decimal. */\n  aPNTs: bigint;\n}\n\n/** Wallet balances relevant to the sale (raw base units). */\nexport interface SaleBalances {\n  /** Native ETH (wei). */\n  eth: bigint;\n  /** USDC (6-decimal). */\n  usdc: bigint;\n  /** USDT (6-decimal). */\n  usdt: bigint;\n  /** GToken (18-decimal). */\n  gToken: bigint;\n  /** aPNTs (18-decimal). */\n  aPNTs: bigint;\n}\n\n/** Result of a completed buy (self-pay or gasless). */\nexport interface BuyResult {\n  /** Transaction hash (gasless: the relayer-submitted tx). */\n  txHash: Hash;\n  /** Relayer rule that matched (gasless only). */\n  matchedRule?: string;\n}\n\nexport interface TokenSaleClientOptions {\n  /**\n   * Chain id. Defaults to `publicClient.chain?.id` / `walletClient.chain?.id`.\n   * Used to look up {@link getLaunchSaleAddresses}.\n   */\n  chainId?: number;\n  /** Explicit address group override (skips the per-chain lookup). */\n  addresses?: LaunchSaleAddresses;\n}\n\ninterface SelfPayParams {\n  token: SaleTokenKind;\n  /** USD to spend, in 6-decimal base units (use {@link usd}). */\n  usdAmount: bigint;\n  /** Payment stablecoin. Default `'USDC'`. */\n  payToken?: PayToken;\n  /** Minimum tokens out (slippage guard, 18-decimal). Default `0n`. */\n  minOut?: bigint;\n  /**\n   * Deliver the purchased tokens to this address instead of the payer (e.g. buy USDT-paid aPNTs\n   * straight into an AirAccount). Routes through `buyTokensFor` / `buyAPNTsFor` (launch#21).\n   * Default: the payer. (aPNTs has no on-chain slippage param, so `minOut` is still rejected for it.)\n   */\n  recipient?: Address;\n}\n\ninterface GaslessParams {\n  token: SaleTokenKind;\n  /** USD to spend, in 6-decimal base units (use {@link usd}). Paid in USDC. */\n  usdAmount: bigint;\n  /** Recipient of the purchased tokens. Default: the buyer. */\n  recipient?: Address;\n  /** Minimum tokens out (18-decimal). Default `0n`. */\n  minOut?: bigint;\n  /** Authorization validity window in seconds. Default `1800` (30 min). */\n  deadlineSeconds?: number;\n  /** Override the relayer base URL (default: the address group's `relayerUrl`). */\n  relayerUrl?: string;\n}\n\n/** Convert a human USD amount to 6-decimal base units. `usd(1.5)` → `1500000n`. */\nexport function usd(amount: number): bigint {\n  return BigInt(Math.round(amount * 1e6));\n}\n\n/**\n * TokenSaleClient — buy aPoints (aPNTs) and the governance token (GToken) from the\n * MushroomDAO launch sale stack. Abstraction of the `launch.mushroom.cv/join` page.\n *\n * Two flows:\n *  - {@link buySelfPay}: user pays gas; `approve` (if needed) then `buyTokens` / `buyAPNTs`.\n *  - {@link buyGasless}: zero-gas; signs EIP-3009 (USDC) + an EIP-712 `BuyIntent` and posts\n *    them to the relayer, which executes the buy via BuyHelper.\n *\n * The token actually paid out is read ON-CHAIN from the sale contract (`gToken()` / `aPNTs()`),\n * never from a stored address — so it stays correct across sale redeploys.\n *\n * @example\n * ```ts\n * const sale = new TokenSaleClient(publicClient, walletClient);\n * await sale.buyGasless({ token: 'GTOKEN', usdAmount: usd(5) }); // $5, zero gas\n * ```\n */\nexport class TokenSaleClient {\n  private readonly addrs: LaunchSaleAddresses;\n  private readonly chainId: number;\n  /** Cache of on-chain-resolved payout token addresses. */\n  private payoutToken: Partial<Record<SaleTokenKind, Address>> = {};\n\n  constructor(\n    private readonly publicClient: PublicClient,\n    private readonly walletClient?: WalletClient,\n    options: TokenSaleClientOptions = {},\n  ) {\n    const chainId =\n      options.chainId ??\n      (publicClient as any)?.chain?.id ??\n      (walletClient as any)?.chain?.id;\n    if (!chainId) {\n      throw new Error('TokenSaleClient: cannot determine chainId; pass options.chainId');\n    }\n    this.chainId = chainId;\n    const addrs = options.addresses ?? getLaunchSaleAddresses(chainId);\n    if (!addrs) {\n      throw new Error(\n        `TokenSaleClient: no launch sale address group for chainId ${chainId}; pass options.addresses`,\n      );\n    }\n    this.addrs = addrs;\n  }\n\n  /** The resolved address group in use. */\n  get addresses(): LaunchSaleAddresses {\n    return this.addrs;\n  }\n\n  /** Sale contract address for a token kind. */\n  private saleFor(token: SaleTokenKind): Address {\n    return token === 'GTOKEN' ? this.addrs.saleGToken : this.addrs.saleAPNTs;\n  }\n\n  /**\n   * Resolve (and cache) the ERC-20 the sale actually pays out, by reading the sale\n   * contract's `gToken()` / `aPNTs()` immutable getter. This is the single source of\n   * truth for the payout token — no address is duplicated in the config.\n   */\n  async getPayoutToken(token: SaleTokenKind): Promise<Address> {\n    const cached = this.payoutToken[token];\n    if (cached) return cached;\n    const resolved = (await this.publicClient.readContract({\n      address: this.saleFor(token),\n      abi: token === 'GTOKEN' ? SaleContractV2ABI : APNTsSaleContractABI,\n      functionName: token === 'GTOKEN' ? 'gToken' : 'aPNTs',\n    } as any)) as Address;\n    this.payoutToken[token] = resolved;\n    return resolved;\n  }\n\n  /** Read live USD prices (6-decimal) for both sale tokens. */\n  async getPrices(): Promise<SalePrices> {\n    const [gToken, aPNTs] = await Promise.all([\n      this.publicClient.readContract({\n        address: this.addrs.saleGToken,\n        abi: SaleContractV2ABI,\n        functionName: 'getCurrentPriceUSD',\n      } as any) as Promise<bigint>,\n      this.publicClient.readContract({\n        address: this.addrs.saleAPNTs,\n        abi: APNTsSaleContractABI,\n        functionName: 'priceUSD',\n      } as any) as Promise<bigint>,\n    ]);\n    return { gToken, aPNTs };\n  }\n\n  /**\n   * Quote how many tokens (18-decimal) a USD amount buys, via the sale's on-chain\n   * pricing (`getTokensForUSD` / `getAPNTsForUSD`).\n   */\n  async quote(token: SaleTokenKind, usdAmount: bigint): Promise<bigint> {\n    return (await this.publicClient.readContract({\n      address: this.saleFor(token),\n      abi: token === 'GTOKEN' ? SaleContractV2ABI : APNTsSaleContractABI,\n      functionName: token === 'GTOKEN' ? 'getTokensForUSD' : 'getAPNTsForUSD',\n      args: [usdAmount],\n    } as any)) as bigint;\n  }\n\n  /** Read ETH / USDC / USDT / GToken / aPNTs balances for an account. */\n  async getBalances(account: Address): Promise<SaleBalances> {\n    const erc20 = (address: Address) =>\n      this.publicClient.readContract({\n        address,\n        abi: ERC20ABI,\n        functionName: 'balanceOf',\n        args: [account],\n      } as any) as Promise<bigint>;\n    const [gTokenAddr, aPNTsAddr] = await Promise.all([\n      this.getPayoutToken('GTOKEN'),\n      this.getPayoutToken('APNTS'),\n    ]);\n    const [eth, usdc, usdt, gToken, aPNTs] = await Promise.all([\n      this.publicClient.getBalance({ address: account }),\n      erc20(this.addrs.usdc),\n      erc20(this.addrs.usdt).catch(() => 0n),\n      erc20(gTokenAddr),\n      erc20(aPNTsAddr),\n    ]);\n    return { eth, usdc, usdt, gToken, aPNTs };\n  }\n\n  // ─── Self-pay flow (buyer pays gas) ──────────────────────────────────────\n  /**\n   * Buy with the user paying gas: ensures allowance (approves if short) then calls\n   * `buyTokens` / `buyAPNTs`. Tokens are sent to the buyer. Waits for both receipts.\n   */\n  async buySelfPay(params: SelfPayParams): Promise<BuyResult> {\n    const wallet = this.requireWallet();\n    const { account: signer, address: account } = this.signer(wallet);\n    const { token, usdAmount } = params;\n    const payToken = params.payToken ?? 'USDC';\n    const minOut = params.minOut ?? 0n;\n    // aPNTs self-pay has NO slippage param on-chain (`APNTsSaleContract.buyAPNTs(usdAmount,\n    // paymentToken)`), so a caller-supplied minOut could NOT be enforced. Fail closed rather than\n    // silently dropping it (which would give a false sense of protection). GToken self-pay and the\n    // gasless path (BuyIntent.minOut) do enforce minOut.\n    if (token === 'APNTS' && minOut > 0n) {\n      throw new Error(\n        'buySelfPay: aPNTs self-pay does not support minOut (APNTsSaleContract.buyAPNTs has no ' +\n          'slippage param). Use buyGasless for aPNTs slippage protection, or omit minOut.'\n      );\n    }\n    const payAddr = payToken === 'USDC' ? this.addrs.usdc : this.addrs.usdt;\n    const saleAddr = this.saleFor(token);\n\n    const allowance = (await this.publicClient.readContract({\n      address: payAddr,\n      abi: ERC20ABI,\n      functionName: 'allowance',\n      args: [account, saleAddr],\n    } as any)) as bigint;\n\n    if (allowance < usdAmount) {\n      const approveHash = (await wallet.writeContract({\n        address: payAddr,\n        abi: ERC20ABI,\n        functionName: 'approve',\n        args: [saleAddr, usdAmount],\n        account: signer,\n        chain: (wallet as any).chain,\n      } as any)) as Hash;\n      const r = await this.publicClient.waitForTransactionReceipt({ hash: approveHash });\n      if (r.status !== 'success') throw new Error(`approve reverted: ${approveHash}`);\n    }\n\n    // Deliver to `recipient` (e.g. an AirAccount) via the *For variants, else to the payer.\n    const to = params.recipient;\n    const buyHash = (await wallet.writeContract(\n      token === 'GTOKEN'\n        ? {\n            address: saleAddr,\n            abi: SaleContractV2ABI,\n            functionName: to ? 'buyTokensFor' : 'buyTokens',\n            args: to ? [to, usdAmount, payAddr, minOut] : [usdAmount, payAddr, minOut],\n            account: signer,\n            chain: (wallet as any).chain,\n          }\n        : ({\n            address: saleAddr,\n            abi: APNTsSaleContractABI,\n            functionName: to ? 'buyAPNTsFor' : 'buyAPNTs',\n            args: to ? [to, usdAmount, payAddr] : [usdAmount, payAddr],\n            account: signer,\n            chain: (wallet as any).chain,\n          } as any),\n    )) as Hash;\n\n    const receipt = await this.publicClient.waitForTransactionReceipt({ hash: buyHash });\n    if (receipt.status !== 'success') throw new Error(`buy reverted: ${buyHash}`);\n    return { txHash: buyHash };\n  }\n\n  // ─── Gasless flow (EIP-3009 + BuyIntent → relayer) ───────────────────────\n  /**\n   * Buy with zero gas: signs an EIP-3009 USDC `ReceiveWithAuthorization` (to BuyHelper)\n   * and an EIP-712 `BuyIntent`, then posts both to the relayer's `/v3/relay`. Returns the\n   * relayer-submitted tx hash after on-chain confirmation. Payment is always USDC.\n   */\n  async buyGasless(params: GaslessParams): Promise<BuyResult> {\n    const wallet = this.requireWallet();\n    const { account: signer, address: account } = this.signer(wallet);\n    const { token, usdAmount } = params;\n    const minOut = params.minOut ?? 0n;\n    const recipient = params.recipient ?? account;\n    const targetToken = await this.getPayoutToken(token);\n    const usdc = this.addrs.usdc;\n    const buyHelper = this.addrs.buyHelper;\n\n    const deadline = BigInt(Math.floor(Date.now() / 1000) + (params.deadlineSeconds ?? 1800));\n    const nonce = randomNonce();\n\n    // ① EIP-3009 USDC ReceiveWithAuthorization → BuyHelper\n    const transferSig = await (wallet as any).signTypedData({\n      account: signer,\n      domain: { name: 'USDC', version: '2', chainId: this.chainId, verifyingContract: usdc },\n      types: {\n        ReceiveWithAuthorization: [\n          { name: 'from', type: 'address' },\n          { name: 'to', type: 'address' },\n          { name: 'value', type: 'uint256' },\n          { name: 'validAfter', type: 'uint256' },\n          { name: 'validBefore', type: 'uint256' },\n          { name: 'nonce', type: 'bytes32' },\n        ],\n      },\n      primaryType: 'ReceiveWithAuthorization',\n      message: {\n        from: account,\n        to: buyHelper,\n        value: usdAmount,\n        validAfter: 0n,\n        validBefore: deadline,\n        nonce,\n      },\n    });\n\n    // ② EIP-712 BuyIntent (domain MyceliumBuyHelper v1, verifyingContract = BuyHelper)\n    const buyIntentSig = await (wallet as any).signTypedData({\n      account: signer,\n      domain: { name: 'MyceliumBuyHelper', version: '1', chainId: this.chainId, verifyingContract: buyHelper },\n      types: {\n        BuyIntent: [\n          { name: 'buyer', type: 'address' },\n          { name: 'paymentToken', type: 'address' },\n          { name: 'paymentAmount', type: 'uint256' },\n          { name: 'targetToken', type: 'address' },\n          { name: 'recipient', type: 'address' },\n          { name: 'minOut', type: 'uint256' },\n          { name: 'deadline', type: 'uint256' },\n          { name: 'nonce', type: 'bytes32' },\n        ],\n      },\n      primaryType: 'BuyIntent',\n      message: {\n        buyer: account,\n        paymentToken: usdc,\n        paymentAmount: usdAmount,\n        targetToken,\n        recipient,\n        minOut,\n        deadline,\n        nonce,\n      },\n    });\n\n    // Split the EIP-3009 signature into v/r/s (the relayer calls the 7-arg 3009 variant).\n    const r_ = transferSig.slice(0, 66) as Hex;\n    const s_ = ('0x' + transferSig.slice(66, 130)) as Hex;\n    let v_ = parseInt(transferSig.slice(130, 132), 16);\n    if (v_ < 27) v_ += 27;\n\n    const payload = JSON.stringify({\n      intent: {\n        buyer: account,\n        paymentToken: usdc,\n        paymentAmount: usdAmount.toString(),\n        targetToken,\n        recipient,\n        minOut: minOut.toString(),\n        deadline: Number(deadline),\n        nonce,\n      },\n      buyIntentSig,\n      transferAuth: { validAfter: 0, v: v_, r: r_, s: s_ },\n    });\n\n    // Load-balance across the DVT relayer pool (random start) + fail over on 5xx / network errors.\n    // A 4xx is the request's own fault (bad sig / not whitelisted / rate-limited) — identical on\n    // every node, so don't retry it. A submitted tx that reverts on-chain is final (not retried).\n    const candidates = this.relayerCandidates(params.relayerUrl);\n    let lastErr: Error | undefined;\n    for (const base of candidates) {\n      let resp: Response;\n      try {\n        resp = await fetch(base.replace(/\\/$/, '') + '/v3/relay', {\n          method: 'POST',\n          headers: { 'Content-Type': 'application/json' },\n          body: payload,\n        });\n      } catch (e: any) {\n        lastErr = new Error(`relayer ${base} unreachable: ${e?.message ?? e}`);\n        continue; // network/timeout → try next node\n      }\n      const body: any = await resp.json().catch(() => ({}));\n      if (resp.ok && body?.txHash) {\n        const receipt = await this.publicClient.waitForTransactionReceipt({ hash: body.txHash as Hash });\n        if (receipt.status !== 'success') throw new Error(`gasless buy reverted on-chain: ${body.txHash}`);\n        return { txHash: body.txHash as Hash, matchedRule: body.matchedRule };\n      }\n      const err = new Error(`relayer rejected: [${body?.code ?? resp.status}] ${body?.error ?? resp.statusText}`);\n      if (resp.status >= 400 && resp.status < 500) throw err; // client error — same on every node\n      lastErr = err; // 5xx (incl. INFRA_NOT_READY) → try next node\n    }\n    throw lastErr ?? new Error('no relayer available');\n  }\n\n  /**\n   * Build the ordered relayer candidate list: an explicit override wins; otherwise load-balance\n   * across the DVT relay pool — the SINGLE source of truth `getDvtRelayerUrlsForChain(chainId)`\n   * (random start) — with the legacy `relayerUrl` (Cloudflare Worker) appended as a final fallback.\n   * Pure ordering — no network. (Math.random for LB spread is fine here.)\n   */\n  private relayerCandidates(override?: string): string[] {\n    if (override) return [override];\n    const pool = [...getDvtRelayerUrlsForChain(this.chainId)];\n    if (pool.length > 1) {\n      const start = Math.floor(Math.random() * pool.length);\n      pool.push(...pool.splice(0, start)); // rotate start for round-robin-ish spread\n    }\n    if (this.addrs.relayerUrl && !pool.includes(this.addrs.relayerUrl)) pool.push(this.addrs.relayerUrl);\n    if (pool.length === 0 && this.addrs.relayerUrl) return [this.addrs.relayerUrl];\n    return pool;\n  }\n\n  private requireWallet(): WalletClient {\n    if (!this.walletClient) {\n      throw new Error('TokenSaleClient: a walletClient is required for write operations');\n    }\n    return this.walletClient;\n  }\n\n  /**\n   * Resolve the signing account. Returns the viem account OBJECT (a LocalAccount, or a\n   * JsonRpcAccount for injected wallets) for the `account` field of write/sign calls, plus\n   * its address for message fields. Passing the object — not a bare address string — is what\n   * lets a local private-key account sign locally instead of routing to `eth_signTypedData_v4`\n   * on the (key-less) RPC transport.\n   */\n  private signer(wallet: WalletClient): { account: any; address: Address } {\n    const acc = (wallet as any).account;\n    const address = (acc?.address ?? acc) as Address;\n    if (!address) throw new Error('TokenSaleClient: walletClient has no account');\n    return { account: acc ?? address, address };\n  }\n}\n\n/** 32-byte random hex nonce for EIP-3009 / BuyIntent. */\nfunction randomNonce(): Hex {\n  const bytes = new Uint8Array(32);\n  globalThis.crypto.getRandomValues(bytes);\n  return ('0x' + Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('')) as Hex;\n}\n","import { type Address, parseAbi, type Hash, formatEther } from 'viem';\nimport { SuperPaymasterABI as SUPERPAYMASTER_ABI, CONTRACTS, type PublicClient, type WalletClient } from '@aastar/core';\n\nconst STAKING_ABI = parseAbi([\n    'function stake(uint256)',\n    'function withdraw(uint256)'\n]);\n\nconst ERC20_ABI = parseAbi([\n    'function balanceOf(address) view returns (uint256)',\n    'function totalSupply() view returns (uint256)',\n    'function approve(address,uint256) returns (bool)',\n    'function transfer(address,uint256) returns (bool)'\n]);\n\nexport class FinanceClient {\n    /**\n     * Initialize FinanceClient\n     * @param publicClient The public client for queries\n     * @param walletClient The wallet client for transactions\n     */\n    constructor(\n        private publicClient: PublicClient,\n        private walletClient: WalletClient\n    ) {}\n\n    // ========== Existing static methods (preserved for backward compatibility) ==========\n    \n    /** @deprecated Use instance methods instead */\n    static async depositToPaymaster(wallet: WalletClient, paymaster: Address, amount: bigint) {\n        return wallet.writeContract({\n            address: paymaster,\n            abi: SUPERPAYMASTER_ABI,\n            functionName: 'deposit',\n            args: [amount],\n            chain: wallet.chain\n        } as any);\n    }\n\n    /** @deprecated Use instance methods instead */\n    static async depositViaTransferAndCall(wallet: WalletClient, token: Address, paymaster: Address, amount: bigint) {\n        const ERC1363_ABI = [{\n            name: 'transferAndCall',\n            type: 'function',\n            stateMutability: 'nonpayable',\n            inputs: [{ type: 'address', name: 'to' }, { type: 'uint256', name: 'value' }],\n            outputs: [{ type: 'bool' }]\n        }] as const;\n\n        return wallet.writeContract({\n            address: token,\n            abi: ERC1363_ABI,\n            functionName: 'transferAndCall',\n            args: [paymaster, amount],\n            chain: wallet.chain\n        } as any);\n    }\n\n    /** @deprecated Use instance methods instead */\n    static async stakeGToken(wallet: WalletClient, stakingAddr: Address, amount: bigint) {\n         return wallet.writeContract({\n            address: stakingAddr,\n            abi: STAKING_ABI,\n            functionName: 'stake',\n            args: [amount],\n            chain: wallet.chain\n        } as any);\n    }\n\n    /** @deprecated Use instance methods instead */\n    static async withdrawProtocolRevenue(wallet: WalletClient, paymaster: Address, to: Address, amount: bigint) {\n        return wallet.writeContract({\n            address: paymaster,\n            abi: SUPERPAYMASTER_ABI,\n            functionName: 'withdrawProtocolRevenue',\n            args: [to, amount],\n            chain: wallet.chain\n        } as any);\n    }\n\n    /** @deprecated Use instance methods instead */\n    static async depositToEntryPoint(wallet: WalletClient, entryPoint: Address, paymaster: Address, amount: bigint) {\n        return wallet.writeContract({\n            address: entryPoint,\n            abi: parseAbi(['function depositTo(address) payable']),\n            functionName: 'depositTo',\n            args: [paymaster],\n            value: amount,\n            chain: wallet.chain\n        } as any);\n    }\n\n    /** @deprecated Use instance methods instead */\n    static async getEntryPointBalance(client: any, entryPoint: Address, account: Address): Promise<bigint> {\n        return client.readContract({\n            address: entryPoint,\n            abi: parseAbi(['function balanceOf(address) view returns (uint256)']),\n            functionName: 'balanceOf',\n            args: [account]\n        });\n    }\n\n    /** @deprecated Use instance methods instead */\n    static async operatorDeposit(wallet: WalletClient, paymaster: Address, amount: bigint) {\n        return wallet.writeContract({\n            address: paymaster,\n            abi: SUPERPAYMASTER_ABI,\n            functionName: 'deposit',\n            args: [amount],\n            chain: wallet.chain\n        } as any);\n    }\n\n    /** @deprecated Use instance methods instead */\n    static async operatorNotifyDeposit(wallet: WalletClient, paymaster: Address, amount: bigint) {\n        return wallet.writeContract({\n            address: paymaster,\n            abi: SUPERPAYMASTER_ABI,\n            functionName: 'notifyDeposit',\n            args: [amount],\n            chain: wallet.chain\n        } as any);\n    }\n\n    // ========== New instance methods (business primitives) ==========\n\n    /**\n     * Get GToken balance\n     */\n    async getGTokenBalance(address: Address): Promise<bigint> {\n        const { CORE_ADDRESSES } = await import('@aastar/core');\n        return this.publicClient.readContract({\n            address: CORE_ADDRESSES.gToken,\n            abi: ERC20_ABI,\n            functionName: 'balanceOf',\n            args: [address]\n        }) as Promise<bigint>;\n    }\n\n    /**\n     * Get aPNTs balance\n     */\n    async getAPNTsBalance(address: Address): Promise<bigint> {\n        const { CORE_ADDRESSES } = await import('@aastar/core');\n        return this.publicClient.readContract({\n            address: CORE_ADDRESSES.aPNTs,\n            abi: ERC20_ABI,\n            functionName: 'balanceOf',\n            args: [address]\n        }) as Promise<bigint>;\n    }\n\n    /**\n     * One-step stake: Approve (if needed) + Stake\n     * \n     * @param amount Amount of GToken to stake\n     * @returns Transaction hash of the stake action\n     */\n    async approveAndStake(amount: bigint): Promise<Hash> {\n        const account = this.walletClient.account;\n        if (!account) throw new Error(\"Account required\");\n\n        const { CORE_ADDRESSES } = await import('@aastar/core');\n        const gTokenAddress = CORE_ADDRESSES.gToken;\n        const stakingAddress = CORE_ADDRESSES.gTokenStaking;\n        \n        // 1. Check Allowance\n        const allowance = await this.publicClient.readContract({\n            address: gTokenAddress,\n            abi: parseAbi(['function allowance(address owner, address spender) view returns (uint256)']),\n            functionName: 'allowance',\n            args: [account.address, stakingAddress]\n        }); // as bigint\n\n        if ((allowance as bigint) < amount) {\n            console.log(`[FinanceClient] Approving ${formatEther(amount)} GToken...`);\n            const approveTx = await this.walletClient.writeContract({\n                address: gTokenAddress,\n                abi: parseAbi(['function approve(address spender, uint256 amount) returns (bool)']),\n                functionName: 'approve',\n                args: [stakingAddress, amount],\n                chain: this.walletClient.chain,\n                account\n            });\n            await this.publicClient.waitForTransactionReceipt({ hash: approveTx });\n            console.log(`[FinanceClient] Approved.`);\n        }\n\n        // 2. Stake\n        console.log(`[FinanceClient] Staking...`);\n        return FinanceClient.stakeGToken(this.walletClient, stakingAddress, amount);\n    }\n\n    /**\n     * Get circulating supply (total - locked)\n     */\n    async getCirculatingSupply(): Promise<{\n        total: bigint;\n        locked: bigint;\n        circulating: bigint;\n    }> {\n        const { CORE_ADDRESSES } = await import('@aastar/core');\n        const gTokenAddress = CORE_ADDRESSES.gToken;\n\n        const total = await this.publicClient.readContract({\n            address: gTokenAddress,\n            abi: ERC20_ABI,\n            functionName: 'totalSupply'\n        }) as bigint;\n\n        // In a real scenario, we might query GTokenStaking's totalStaked\n        const locked = 0n;\n\n        return {\n            total,\n            locked,\n            circulating: total - locked\n        };\n    }\n\n    /**\n     * Get comprehensive tokenomics data\n     */\n    async getTokenomicsOverview(): Promise<{\n        totalSupply: bigint;\n        totalStaked: bigint;\n        totalBurned: bigint;\n        circulatingSupply: bigint;\n        stakingRatio: number;\n    }> {\n        const { CORE_ADDRESSES } = await import('@aastar/core');\n        \n        const [totalSupply, totalStaked, blackholeBalance] = await Promise.all([\n            this.publicClient.readContract({\n                address: CORE_ADDRESSES.gToken,\n                abi: parseAbi(['function totalSupply() view returns (uint256)']),\n                functionName: 'totalSupply'\n            }) as Promise<bigint>,\n            this.publicClient.readContract({\n                address: CORE_ADDRESSES.gTokenStaking,\n                abi: parseAbi(['function totalStaked() view returns (uint256)']),\n                functionName: 'totalStaked'\n            }) as Promise<bigint>,\n            this.publicClient.readContract({\n                address: CORE_ADDRESSES.gToken,\n                abi: parseAbi(['function balanceOf(address) view returns (uint256)']),\n                functionName: 'balanceOf',\n                args: ['0x000000000000000000000000000000000000dEaD']\n            }) as Promise<bigint>\n        ]);\n\n        const circulating = totalSupply - totalStaked - blackholeBalance;\n        const ratio = Number(formatEther(totalStaked)) / Number(formatEther(totalSupply)) * 100;\n\n        return {\n            totalSupply,\n            totalStaked,\n            totalBurned: blackholeBalance,\n            circulatingSupply: circulating,\n            stakingRatio: ratio\n        };\n    }\n}\n\n// MushroomDAO launch token-sale (aPoints + governance-token) — abstraction of the\n// launch.mushroom.cv/join page. See tokenSale.ts.\nexport {\n    TokenSaleClient,\n    usd,\n    type SaleTokenKind,\n    type PayToken,\n    type SalePrices,\n    type SaleBalances,\n    type BuyResult,\n    type TokenSaleClientOptions,\n} from './tokenSale.js';\n"]}