@aastar/sdk 0.24.2 → 0.26.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.
Files changed (126) hide show
  1. package/dist/UserClient-5PQP6APK.js +6 -0
  2. package/dist/{UserClient-DPJ6E2XL.js.map → UserClient-5PQP6APK.js.map} +1 -1
  3. package/dist/UserClient-CD7R3335.cjs +15 -0
  4. package/dist/{UserClient-4MRK2D7W.cjs.map → UserClient-CD7R3335.cjs.map} +1 -1
  5. package/dist/account.cjs +8 -8
  6. package/dist/account.js +3 -3
  7. package/dist/addresses-D12T3kLs.d.cts +210 -0
  8. package/dist/addresses-D12T3kLs.d.ts +210 -0
  9. package/dist/admin.cjs +4 -4
  10. package/dist/admin.js +3 -3
  11. package/dist/airaccount.cjs +135 -103
  12. package/dist/airaccount.d.cts +1 -1
  13. package/dist/airaccount.d.ts +1 -1
  14. package/dist/airaccount.js +3 -3
  15. package/dist/channel.cjs +7 -7
  16. package/dist/channel.js +3 -3
  17. package/dist/{chunk-S7IUUQ5E.cjs → chunk-2RHBOBL7.cjs} +6 -6
  18. package/dist/{chunk-S7IUUQ5E.cjs.map → chunk-2RHBOBL7.cjs.map} +1 -1
  19. package/dist/{chunk-BPAAWQQA.js → chunk-4GJSK7E6.js} +557 -115
  20. package/dist/chunk-4GJSK7E6.js.map +1 -0
  21. package/dist/{chunk-EEWLL7GE.js → chunk-6DZCDV4Q.js} +2137 -13
  22. package/dist/chunk-6DZCDV4Q.js.map +1 -0
  23. package/dist/{chunk-MCDFQ5JH.cjs → chunk-7HTUDNH3.cjs} +11 -11
  24. package/dist/{chunk-MCDFQ5JH.cjs.map → chunk-7HTUDNH3.cjs.map} +1 -1
  25. package/dist/{chunk-UJPW54CK.js → chunk-7JVL5CU3.js} +3 -3
  26. package/dist/{chunk-UJPW54CK.js.map → chunk-7JVL5CU3.js.map} +1 -1
  27. package/dist/{chunk-7FLPD3V4.js → chunk-A4FO6FKN.js} +3 -3
  28. package/dist/{chunk-7FLPD3V4.js.map → chunk-A4FO6FKN.js.map} +1 -1
  29. package/dist/{chunk-MANVOQY7.cjs → chunk-CI4UJW5Y.cjs} +5 -5
  30. package/dist/{chunk-MANVOQY7.cjs.map → chunk-CI4UJW5Y.cjs.map} +1 -1
  31. package/dist/{chunk-PUE5GEKK.js → chunk-COTHBCR2.js} +3 -3
  32. package/dist/{chunk-PUE5GEKK.js.map → chunk-COTHBCR2.js.map} +1 -1
  33. package/dist/{chunk-TQIRRSGL.cjs → chunk-FIMXPANS.cjs} +4 -4
  34. package/dist/{chunk-TQIRRSGL.cjs.map → chunk-FIMXPANS.cjs.map} +1 -1
  35. package/dist/{chunk-MXJEULSE.cjs → chunk-G33MXEHU.cjs} +29 -2
  36. package/dist/chunk-G33MXEHU.cjs.map +1 -0
  37. package/dist/{chunk-FUY4MHPM.cjs → chunk-GASCTLKR.cjs} +9 -9
  38. package/dist/{chunk-FUY4MHPM.cjs.map → chunk-GASCTLKR.cjs.map} +1 -1
  39. package/dist/{chunk-W73Y6JWZ.js → chunk-IG4BG25C.js} +6 -6
  40. package/dist/{chunk-W73Y6JWZ.js.map → chunk-IG4BG25C.js.map} +1 -1
  41. package/dist/{chunk-TGEVD7OR.cjs → chunk-J3UAXGNP.cjs} +16 -16
  42. package/dist/{chunk-TGEVD7OR.cjs.map → chunk-J3UAXGNP.cjs.map} +1 -1
  43. package/dist/{chunk-Y5QM4LI4.js → chunk-JCEUTCFZ.js} +4 -4
  44. package/dist/{chunk-Y5QM4LI4.js.map → chunk-JCEUTCFZ.js.map} +1 -1
  45. package/dist/{chunk-IB3KOSHW.cjs → chunk-KOWTQJIX.cjs} +2177 -49
  46. package/dist/chunk-KOWTQJIX.cjs.map +1 -0
  47. package/dist/chunk-L6D2AGTF.js +500 -0
  48. package/dist/chunk-L6D2AGTF.js.map +1 -0
  49. package/dist/{chunk-KYXXIKEI.cjs → chunk-LRPAX5AG.cjs} +32 -32
  50. package/dist/{chunk-KYXXIKEI.cjs.map → chunk-LRPAX5AG.cjs.map} +1 -1
  51. package/dist/{chunk-UCLK6LTB.js → chunk-MBWBHKUE.js} +28 -3
  52. package/dist/chunk-MBWBHKUE.js.map +1 -0
  53. package/dist/{chunk-3FRNYRWI.cjs → chunk-NHDZQPDE.cjs} +26 -26
  54. package/dist/{chunk-3FRNYRWI.cjs.map → chunk-NHDZQPDE.cjs.map} +1 -1
  55. package/dist/{chunk-HP44S5U5.cjs → chunk-OBPTMV5W.cjs} +5 -5
  56. package/dist/{chunk-HP44S5U5.cjs.map → chunk-OBPTMV5W.cjs.map} +1 -1
  57. package/dist/{chunk-SX5GUCTF.js → chunk-QTXPAGNX.js} +9 -9
  58. package/dist/{chunk-SX5GUCTF.js.map → chunk-QTXPAGNX.js.map} +1 -1
  59. package/dist/{chunk-PTVXBXZX.js → chunk-UANSP3OK.js} +3 -3
  60. package/dist/{chunk-PTVXBXZX.js.map → chunk-UANSP3OK.js.map} +1 -1
  61. package/dist/{chunk-P3B6UTED.js → chunk-UTSFTWFC.js} +3 -3
  62. package/dist/{chunk-P3B6UTED.js.map → chunk-UTSFTWFC.js.map} +1 -1
  63. package/dist/{chunk-4Q6FADF6.cjs → chunk-UZE7IPOK.cjs} +571 -121
  64. package/dist/chunk-UZE7IPOK.cjs.map +1 -0
  65. package/dist/chunk-WTURYJEA.cjs +504 -0
  66. package/dist/chunk-WTURYJEA.cjs.map +1 -0
  67. package/dist/{chunk-XBZGVJ5K.js → chunk-YR7CTWY6.js} +3 -3
  68. package/dist/{chunk-XBZGVJ5K.js.map → chunk-YR7CTWY6.js.map} +1 -1
  69. package/dist/{contract-addresses-RABD77VP.cjs → contract-addresses-6K6IB5OB.cjs} +13 -13
  70. package/dist/{contract-addresses-RABD77VP.cjs.map → contract-addresses-6K6IB5OB.cjs.map} +1 -1
  71. package/dist/{contract-addresses-TVXSRQ7I.js → contract-addresses-CHZ7PK5H.js} +3 -3
  72. package/dist/{contract-addresses-TVXSRQ7I.js.map → contract-addresses-CHZ7PK5H.js.map} +1 -1
  73. package/dist/core.cjs +285 -261
  74. package/dist/core.d.cts +6 -175
  75. package/dist/core.d.ts +6 -175
  76. package/dist/core.js +2 -2
  77. package/dist/dapp.cjs +6 -6
  78. package/dist/dapp.js +3 -3
  79. package/dist/enduser.cjs +7 -7
  80. package/dist/enduser.js +4 -4
  81. package/dist/identity.cjs +6 -6
  82. package/dist/identity.js +3 -3
  83. package/dist/index.cjs +406 -374
  84. package/dist/index.d.cts +3 -2
  85. package/dist/index.d.ts +3 -2
  86. package/dist/index.js +17 -17
  87. package/dist/kms.cjs +135 -103
  88. package/dist/kms.d.cts +330 -26
  89. package/dist/kms.d.ts +330 -26
  90. package/dist/kms.js +3 -3
  91. package/dist/operator.cjs +7 -7
  92. package/dist/operator.js +3 -3
  93. package/dist/paymaster.cjs +16 -16
  94. package/dist/paymaster.js +3 -3
  95. package/dist/{src-VO7TXJPG.cjs → src-DNURNUIA.cjs} +287 -263
  96. package/dist/src-DNURNUIA.cjs.map +1 -0
  97. package/dist/{src-RM6DDR7K.cjs → src-DZDH3BSU.cjs} +18 -18
  98. package/dist/src-DZDH3BSU.cjs.map +1 -0
  99. package/dist/{src-HKOFZ4V3.js → src-EVM7OESP.js} +5 -5
  100. package/dist/src-EVM7OESP.js.map +1 -0
  101. package/dist/src-FY3KAPPC.js +5 -0
  102. package/dist/src-FY3KAPPC.js.map +1 -0
  103. package/dist/tokens.cjs +12 -4
  104. package/dist/tokens.d.cts +133 -1
  105. package/dist/tokens.d.ts +133 -1
  106. package/dist/tokens.js +3 -3
  107. package/dist/x402.cjs +26 -26
  108. package/dist/x402.js +3 -3
  109. package/package.json +1 -1
  110. package/dist/UserClient-4MRK2D7W.cjs +0 -15
  111. package/dist/UserClient-DPJ6E2XL.js +0 -6
  112. package/dist/chunk-4Q6FADF6.cjs.map +0 -1
  113. package/dist/chunk-BPAAWQQA.js.map +0 -1
  114. package/dist/chunk-EEWLL7GE.js.map +0 -1
  115. package/dist/chunk-IB3KOSHW.cjs.map +0 -1
  116. package/dist/chunk-MXJEULSE.cjs.map +0 -1
  117. package/dist/chunk-O2CN77MV.js +0 -226
  118. package/dist/chunk-O2CN77MV.js.map +0 -1
  119. package/dist/chunk-UCLK6LTB.js.map +0 -1
  120. package/dist/chunk-V23XPVHO.cjs +0 -228
  121. package/dist/chunk-V23XPVHO.cjs.map +0 -1
  122. package/dist/src-HKOFZ4V3.js.map +0 -1
  123. package/dist/src-L2BLX34S.js +0 -5
  124. package/dist/src-L2BLX34S.js.map +0 -1
  125. package/dist/src-RM6DDR7K.cjs.map +0 -1
  126. package/dist/src-VO7TXJPG.cjs.map +0 -1
@@ -0,0 +1,500 @@
1
+ import { SaleContractV2ABI, APNTsSaleContractABI, ERC20ABI, SuperPaymasterABI } from './chunk-6DZCDV4Q.js';
2
+ import { getLaunchSaleAddresses } from './chunk-MBWBHKUE.js';
3
+ import { parseAbi, formatEther } from 'viem';
4
+
5
+ // ../tokens/src/tokenSale.ts
6
+ function usd(amount) {
7
+ return BigInt(Math.round(amount * 1e6));
8
+ }
9
+ var TokenSaleClient = class {
10
+ constructor(publicClient, walletClient, options = {}) {
11
+ this.publicClient = publicClient;
12
+ this.walletClient = walletClient;
13
+ const chainId = options.chainId ?? publicClient?.chain?.id ?? walletClient?.chain?.id;
14
+ if (!chainId) {
15
+ throw new Error("TokenSaleClient: cannot determine chainId; pass options.chainId");
16
+ }
17
+ this.chainId = chainId;
18
+ const addrs = options.addresses ?? getLaunchSaleAddresses(chainId);
19
+ if (!addrs) {
20
+ throw new Error(
21
+ `TokenSaleClient: no launch sale address group for chainId ${chainId}; pass options.addresses`
22
+ );
23
+ }
24
+ this.addrs = addrs;
25
+ }
26
+ addrs;
27
+ chainId;
28
+ /** Cache of on-chain-resolved payout token addresses. */
29
+ payoutToken = {};
30
+ /** The resolved address group in use. */
31
+ get addresses() {
32
+ return this.addrs;
33
+ }
34
+ /** Sale contract address for a token kind. */
35
+ saleFor(token) {
36
+ return token === "GTOKEN" ? this.addrs.saleGToken : this.addrs.saleAPNTs;
37
+ }
38
+ /**
39
+ * Resolve (and cache) the ERC-20 the sale actually pays out, by reading the sale
40
+ * contract's `gToken()` / `aPNTs()` immutable getter. This is the single source of
41
+ * truth for the payout token — no address is duplicated in the config.
42
+ */
43
+ async getPayoutToken(token) {
44
+ const cached = this.payoutToken[token];
45
+ if (cached) return cached;
46
+ const resolved = await this.publicClient.readContract({
47
+ address: this.saleFor(token),
48
+ abi: token === "GTOKEN" ? SaleContractV2ABI : APNTsSaleContractABI,
49
+ functionName: token === "GTOKEN" ? "gToken" : "aPNTs"
50
+ });
51
+ this.payoutToken[token] = resolved;
52
+ return resolved;
53
+ }
54
+ /** Read live USD prices (6-decimal) for both sale tokens. */
55
+ async getPrices() {
56
+ const [gToken, aPNTs] = await Promise.all([
57
+ this.publicClient.readContract({
58
+ address: this.addrs.saleGToken,
59
+ abi: SaleContractV2ABI,
60
+ functionName: "getCurrentPriceUSD"
61
+ }),
62
+ this.publicClient.readContract({
63
+ address: this.addrs.saleAPNTs,
64
+ abi: APNTsSaleContractABI,
65
+ functionName: "priceUSD"
66
+ })
67
+ ]);
68
+ return { gToken, aPNTs };
69
+ }
70
+ /**
71
+ * Quote how many tokens (18-decimal) a USD amount buys, via the sale's on-chain
72
+ * pricing (`getTokensForUSD` / `getAPNTsForUSD`).
73
+ */
74
+ async quote(token, usdAmount) {
75
+ return await this.publicClient.readContract({
76
+ address: this.saleFor(token),
77
+ abi: token === "GTOKEN" ? SaleContractV2ABI : APNTsSaleContractABI,
78
+ functionName: token === "GTOKEN" ? "getTokensForUSD" : "getAPNTsForUSD",
79
+ args: [usdAmount]
80
+ });
81
+ }
82
+ /** Read ETH / USDC / USDT / GToken / aPNTs balances for an account. */
83
+ async getBalances(account) {
84
+ const erc20 = (address) => this.publicClient.readContract({
85
+ address,
86
+ abi: ERC20ABI,
87
+ functionName: "balanceOf",
88
+ args: [account]
89
+ });
90
+ const [gTokenAddr, aPNTsAddr] = await Promise.all([
91
+ this.getPayoutToken("GTOKEN"),
92
+ this.getPayoutToken("APNTS")
93
+ ]);
94
+ const [eth, usdc, usdt, gToken, aPNTs] = await Promise.all([
95
+ this.publicClient.getBalance({ address: account }),
96
+ erc20(this.addrs.usdc),
97
+ erc20(this.addrs.usdt).catch(() => 0n),
98
+ erc20(gTokenAddr),
99
+ erc20(aPNTsAddr)
100
+ ]);
101
+ return { eth, usdc, usdt, gToken, aPNTs };
102
+ }
103
+ // ─── Self-pay flow (buyer pays gas) ──────────────────────────────────────
104
+ /**
105
+ * Buy with the user paying gas: ensures allowance (approves if short) then calls
106
+ * `buyTokens` / `buyAPNTs`. Tokens are sent to the buyer. Waits for both receipts.
107
+ */
108
+ async buySelfPay(params) {
109
+ const wallet = this.requireWallet();
110
+ const { account: signer, address: account } = this.signer(wallet);
111
+ const { token, usdAmount } = params;
112
+ const payToken = params.payToken ?? "USDC";
113
+ const minOut = params.minOut ?? 0n;
114
+ const payAddr = payToken === "USDC" ? this.addrs.usdc : this.addrs.usdt;
115
+ const saleAddr = this.saleFor(token);
116
+ const allowance = await this.publicClient.readContract({
117
+ address: payAddr,
118
+ abi: ERC20ABI,
119
+ functionName: "allowance",
120
+ args: [account, saleAddr]
121
+ });
122
+ if (allowance < usdAmount) {
123
+ const approveHash = await wallet.writeContract({
124
+ address: payAddr,
125
+ abi: ERC20ABI,
126
+ functionName: "approve",
127
+ args: [saleAddr, usdAmount],
128
+ account: signer,
129
+ chain: wallet.chain
130
+ });
131
+ const r = await this.publicClient.waitForTransactionReceipt({ hash: approveHash });
132
+ if (r.status !== "success") throw new Error(`approve reverted: ${approveHash}`);
133
+ }
134
+ const buyHash = await wallet.writeContract(
135
+ token === "GTOKEN" ? {
136
+ address: saleAddr,
137
+ abi: SaleContractV2ABI,
138
+ functionName: "buyTokens",
139
+ args: [usdAmount, payAddr, minOut],
140
+ account: signer,
141
+ chain: wallet.chain
142
+ } : {
143
+ address: saleAddr,
144
+ abi: APNTsSaleContractABI,
145
+ functionName: "buyAPNTs",
146
+ args: [usdAmount, payAddr],
147
+ account: signer,
148
+ chain: wallet.chain
149
+ }
150
+ );
151
+ const receipt = await this.publicClient.waitForTransactionReceipt({ hash: buyHash });
152
+ if (receipt.status !== "success") throw new Error(`buy reverted: ${buyHash}`);
153
+ return { txHash: buyHash };
154
+ }
155
+ // ─── Gasless flow (EIP-3009 + BuyIntent → relayer) ───────────────────────
156
+ /**
157
+ * Buy with zero gas: signs an EIP-3009 USDC `TransferWithAuthorization` (to BuyHelper)
158
+ * and an EIP-712 `BuyIntent`, then posts both to the relayer's `/v3/relay`. Returns the
159
+ * relayer-submitted tx hash after on-chain confirmation. Payment is always USDC.
160
+ */
161
+ async buyGasless(params) {
162
+ const wallet = this.requireWallet();
163
+ const { account: signer, address: account } = this.signer(wallet);
164
+ const { token, usdAmount } = params;
165
+ const minOut = params.minOut ?? 0n;
166
+ const recipient = params.recipient ?? account;
167
+ const relayerBase = params.relayerUrl ?? this.addrs.relayerUrl;
168
+ const targetToken = await this.getPayoutToken(token);
169
+ const usdc = this.addrs.usdc;
170
+ const buyHelper = this.addrs.buyHelper;
171
+ const deadline = BigInt(Math.floor(Date.now() / 1e3) + (params.deadlineSeconds ?? 1800));
172
+ const nonce = randomNonce();
173
+ const transferSig = await wallet.signTypedData({
174
+ account: signer,
175
+ domain: { name: "USDC", version: "2", chainId: this.chainId, verifyingContract: usdc },
176
+ types: {
177
+ TransferWithAuthorization: [
178
+ { name: "from", type: "address" },
179
+ { name: "to", type: "address" },
180
+ { name: "value", type: "uint256" },
181
+ { name: "validAfter", type: "uint256" },
182
+ { name: "validBefore", type: "uint256" },
183
+ { name: "nonce", type: "bytes32" }
184
+ ]
185
+ },
186
+ primaryType: "TransferWithAuthorization",
187
+ message: {
188
+ from: account,
189
+ to: buyHelper,
190
+ value: usdAmount,
191
+ validAfter: 0n,
192
+ validBefore: deadline,
193
+ nonce
194
+ }
195
+ });
196
+ const buyIntentSig = await wallet.signTypedData({
197
+ account: signer,
198
+ domain: { name: "MyceliumBuyHelper", version: "1", chainId: this.chainId, verifyingContract: buyHelper },
199
+ types: {
200
+ BuyIntent: [
201
+ { name: "buyer", type: "address" },
202
+ { name: "paymentToken", type: "address" },
203
+ { name: "paymentAmount", type: "uint256" },
204
+ { name: "targetToken", type: "address" },
205
+ { name: "recipient", type: "address" },
206
+ { name: "minOut", type: "uint256" },
207
+ { name: "deadline", type: "uint256" },
208
+ { name: "nonce", type: "bytes32" }
209
+ ]
210
+ },
211
+ primaryType: "BuyIntent",
212
+ message: {
213
+ buyer: account,
214
+ paymentToken: usdc,
215
+ paymentAmount: usdAmount,
216
+ targetToken,
217
+ recipient,
218
+ minOut,
219
+ deadline,
220
+ nonce
221
+ }
222
+ });
223
+ const r_ = transferSig.slice(0, 66);
224
+ const s_ = "0x" + transferSig.slice(66, 130);
225
+ let v_ = parseInt(transferSig.slice(130, 132), 16);
226
+ if (v_ < 27) v_ += 27;
227
+ const resp = await fetch(relayerBase.replace(/\/$/, "") + "/v3/relay", {
228
+ method: "POST",
229
+ headers: { "Content-Type": "application/json" },
230
+ body: JSON.stringify({
231
+ intent: {
232
+ buyer: account,
233
+ paymentToken: usdc,
234
+ paymentAmount: usdAmount.toString(),
235
+ targetToken,
236
+ recipient,
237
+ minOut: minOut.toString(),
238
+ deadline: Number(deadline),
239
+ nonce
240
+ },
241
+ buyIntentSig,
242
+ transferAuth: { validAfter: 0, v: v_, r: r_, s: s_ }
243
+ })
244
+ });
245
+ const body = await resp.json().catch(() => ({}));
246
+ if (!resp.ok || !body?.txHash) {
247
+ throw new Error(`relayer rejected: [${body?.code ?? resp.status}] ${body?.error ?? resp.statusText}`);
248
+ }
249
+ const receipt = await this.publicClient.waitForTransactionReceipt({ hash: body.txHash });
250
+ if (receipt.status !== "success") throw new Error(`gasless buy reverted on-chain: ${body.txHash}`);
251
+ return { txHash: body.txHash, matchedRule: body.matchedRule };
252
+ }
253
+ requireWallet() {
254
+ if (!this.walletClient) {
255
+ throw new Error("TokenSaleClient: a walletClient is required for write operations");
256
+ }
257
+ return this.walletClient;
258
+ }
259
+ /**
260
+ * Resolve the signing account. Returns the viem account OBJECT (a LocalAccount, or a
261
+ * JsonRpcAccount for injected wallets) for the `account` field of write/sign calls, plus
262
+ * its address for message fields. Passing the object — not a bare address string — is what
263
+ * lets a local private-key account sign locally instead of routing to `eth_signTypedData_v4`
264
+ * on the (key-less) RPC transport.
265
+ */
266
+ signer(wallet) {
267
+ const acc = wallet.account;
268
+ const address = acc?.address ?? acc;
269
+ if (!address) throw new Error("TokenSaleClient: walletClient has no account");
270
+ return { account: acc ?? address, address };
271
+ }
272
+ };
273
+ function randomNonce() {
274
+ const bytes = new Uint8Array(32);
275
+ globalThis.crypto.getRandomValues(bytes);
276
+ return "0x" + Array.from(bytes, (b) => b.toString(16).padStart(2, "0")).join("");
277
+ }
278
+ var STAKING_ABI = parseAbi([
279
+ "function stake(uint256)",
280
+ "function withdraw(uint256)"
281
+ ]);
282
+ var ERC20_ABI = parseAbi([
283
+ "function balanceOf(address) view returns (uint256)",
284
+ "function totalSupply() view returns (uint256)",
285
+ "function approve(address,uint256) returns (bool)",
286
+ "function transfer(address,uint256) returns (bool)"
287
+ ]);
288
+ var FinanceClient = class _FinanceClient {
289
+ /**
290
+ * Initialize FinanceClient
291
+ * @param publicClient The public client for queries
292
+ * @param walletClient The wallet client for transactions
293
+ */
294
+ constructor(publicClient, walletClient) {
295
+ this.publicClient = publicClient;
296
+ this.walletClient = walletClient;
297
+ }
298
+ // ========== Existing static methods (preserved for backward compatibility) ==========
299
+ /** @deprecated Use instance methods instead */
300
+ static async depositToPaymaster(wallet, paymaster, amount) {
301
+ return wallet.writeContract({
302
+ address: paymaster,
303
+ abi: SuperPaymasterABI,
304
+ functionName: "deposit",
305
+ args: [amount],
306
+ chain: wallet.chain
307
+ });
308
+ }
309
+ /** @deprecated Use instance methods instead */
310
+ static async depositViaTransferAndCall(wallet, token, paymaster, amount) {
311
+ const ERC1363_ABI = [{
312
+ name: "transferAndCall",
313
+ type: "function",
314
+ stateMutability: "nonpayable",
315
+ inputs: [{ type: "address", name: "to" }, { type: "uint256", name: "value" }],
316
+ outputs: [{ type: "bool" }]
317
+ }];
318
+ return wallet.writeContract({
319
+ address: token,
320
+ abi: ERC1363_ABI,
321
+ functionName: "transferAndCall",
322
+ args: [paymaster, amount],
323
+ chain: wallet.chain
324
+ });
325
+ }
326
+ /** @deprecated Use instance methods instead */
327
+ static async stakeGToken(wallet, stakingAddr, amount) {
328
+ return wallet.writeContract({
329
+ address: stakingAddr,
330
+ abi: STAKING_ABI,
331
+ functionName: "stake",
332
+ args: [amount],
333
+ chain: wallet.chain
334
+ });
335
+ }
336
+ /** @deprecated Use instance methods instead */
337
+ static async withdrawProtocolRevenue(wallet, paymaster, to, amount) {
338
+ return wallet.writeContract({
339
+ address: paymaster,
340
+ abi: SuperPaymasterABI,
341
+ functionName: "withdrawProtocolRevenue",
342
+ args: [to, amount],
343
+ chain: wallet.chain
344
+ });
345
+ }
346
+ /** @deprecated Use instance methods instead */
347
+ static async depositToEntryPoint(wallet, entryPoint, paymaster, amount) {
348
+ return wallet.writeContract({
349
+ address: entryPoint,
350
+ abi: parseAbi(["function depositTo(address) payable"]),
351
+ functionName: "depositTo",
352
+ args: [paymaster],
353
+ value: amount,
354
+ chain: wallet.chain
355
+ });
356
+ }
357
+ /** @deprecated Use instance methods instead */
358
+ static async getEntryPointBalance(client, entryPoint, account) {
359
+ return client.readContract({
360
+ address: entryPoint,
361
+ abi: parseAbi(["function balanceOf(address) view returns (uint256)"]),
362
+ functionName: "balanceOf",
363
+ args: [account]
364
+ });
365
+ }
366
+ /** @deprecated Use instance methods instead */
367
+ static async operatorDeposit(wallet, paymaster, amount) {
368
+ return wallet.writeContract({
369
+ address: paymaster,
370
+ abi: SuperPaymasterABI,
371
+ functionName: "deposit",
372
+ args: [amount],
373
+ chain: wallet.chain
374
+ });
375
+ }
376
+ /** @deprecated Use instance methods instead */
377
+ static async operatorNotifyDeposit(wallet, paymaster, amount) {
378
+ return wallet.writeContract({
379
+ address: paymaster,
380
+ abi: SuperPaymasterABI,
381
+ functionName: "notifyDeposit",
382
+ args: [amount],
383
+ chain: wallet.chain
384
+ });
385
+ }
386
+ // ========== New instance methods (business primitives) ==========
387
+ /**
388
+ * Get GToken balance
389
+ */
390
+ async getGTokenBalance(address) {
391
+ const { CORE_ADDRESSES } = await import('./src-FY3KAPPC.js');
392
+ return this.publicClient.readContract({
393
+ address: CORE_ADDRESSES.gToken,
394
+ abi: ERC20_ABI,
395
+ functionName: "balanceOf",
396
+ args: [address]
397
+ });
398
+ }
399
+ /**
400
+ * Get aPNTs balance
401
+ */
402
+ async getAPNTsBalance(address) {
403
+ const { CORE_ADDRESSES } = await import('./src-FY3KAPPC.js');
404
+ return this.publicClient.readContract({
405
+ address: CORE_ADDRESSES.aPNTs,
406
+ abi: ERC20_ABI,
407
+ functionName: "balanceOf",
408
+ args: [address]
409
+ });
410
+ }
411
+ /**
412
+ * One-step stake: Approve (if needed) + Stake
413
+ *
414
+ * @param amount Amount of GToken to stake
415
+ * @returns Transaction hash of the stake action
416
+ */
417
+ async approveAndStake(amount) {
418
+ const account = this.walletClient.account;
419
+ if (!account) throw new Error("Account required");
420
+ const { CORE_ADDRESSES } = await import('./src-FY3KAPPC.js');
421
+ const gTokenAddress = CORE_ADDRESSES.gToken;
422
+ const stakingAddress = CORE_ADDRESSES.gTokenStaking;
423
+ const allowance = await this.publicClient.readContract({
424
+ address: gTokenAddress,
425
+ abi: parseAbi(["function allowance(address owner, address spender) view returns (uint256)"]),
426
+ functionName: "allowance",
427
+ args: [account.address, stakingAddress]
428
+ });
429
+ if (allowance < amount) {
430
+ console.log(`[FinanceClient] Approving ${formatEther(amount)} GToken...`);
431
+ const approveTx = await this.walletClient.writeContract({
432
+ address: gTokenAddress,
433
+ abi: parseAbi(["function approve(address spender, uint256 amount) returns (bool)"]),
434
+ functionName: "approve",
435
+ args: [stakingAddress, amount],
436
+ chain: this.walletClient.chain,
437
+ account
438
+ });
439
+ await this.publicClient.waitForTransactionReceipt({ hash: approveTx });
440
+ console.log(`[FinanceClient] Approved.`);
441
+ }
442
+ console.log(`[FinanceClient] Staking...`);
443
+ return _FinanceClient.stakeGToken(this.walletClient, stakingAddress, amount);
444
+ }
445
+ /**
446
+ * Get circulating supply (total - locked)
447
+ */
448
+ async getCirculatingSupply() {
449
+ const { CORE_ADDRESSES } = await import('./src-FY3KAPPC.js');
450
+ const gTokenAddress = CORE_ADDRESSES.gToken;
451
+ const total = await this.publicClient.readContract({
452
+ address: gTokenAddress,
453
+ abi: ERC20_ABI,
454
+ functionName: "totalSupply"
455
+ });
456
+ const locked = 0n;
457
+ return {
458
+ total,
459
+ locked,
460
+ circulating: total - locked
461
+ };
462
+ }
463
+ /**
464
+ * Get comprehensive tokenomics data
465
+ */
466
+ async getTokenomicsOverview() {
467
+ const { CORE_ADDRESSES } = await import('./src-FY3KAPPC.js');
468
+ const [totalSupply, totalStaked, blackholeBalance] = await Promise.all([
469
+ this.publicClient.readContract({
470
+ address: CORE_ADDRESSES.gToken,
471
+ abi: parseAbi(["function totalSupply() view returns (uint256)"]),
472
+ functionName: "totalSupply"
473
+ }),
474
+ this.publicClient.readContract({
475
+ address: CORE_ADDRESSES.gTokenStaking,
476
+ abi: parseAbi(["function totalStaked() view returns (uint256)"]),
477
+ functionName: "totalStaked"
478
+ }),
479
+ this.publicClient.readContract({
480
+ address: CORE_ADDRESSES.gToken,
481
+ abi: parseAbi(["function balanceOf(address) view returns (uint256)"]),
482
+ functionName: "balanceOf",
483
+ args: ["0x000000000000000000000000000000000000dEaD"]
484
+ })
485
+ ]);
486
+ const circulating = totalSupply - totalStaked - blackholeBalance;
487
+ const ratio = Number(formatEther(totalStaked)) / Number(formatEther(totalSupply)) * 100;
488
+ return {
489
+ totalSupply,
490
+ totalStaked,
491
+ totalBurned: blackholeBalance,
492
+ circulatingSupply: circulating,
493
+ stakingRatio: ratio
494
+ };
495
+ }
496
+ };
497
+
498
+ export { FinanceClient, TokenSaleClient, usd };
499
+ //# sourceMappingURL=chunk-L6D2AGTF.js.map
500
+ //# sourceMappingURL=chunk-L6D2AGTF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../tokens/src/tokenSale.ts","../../tokens/src/index.ts"],"names":[],"mappings":";;;;;AAiFO,SAAS,IAAI,MAAA,EAAwB;AAC1C,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,GAAG,CAAC,CAAA;AACxC;AAoBO,IAAM,kBAAN,MAAsB;AAAA,EAM3B,WAAA,CACmB,YAAA,EACA,YAAA,EACjB,OAAA,GAAkC,EAAC,EACnC;AAHiB,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AACA,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AAGjB,IAAA,MAAM,UACJ,OAAA,CAAQ,OAAA,IACP,cAAsB,KAAA,EAAO,EAAA,IAC7B,cAAsB,KAAA,EAAO,EAAA;AAChC,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,IAAI,MAAM,iEAAiE,CAAA;AAAA,IACnF;AACA,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,SAAA,IAAa,sBAAA,CAAuB,OAAO,CAAA;AACjE,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,6DAA6D,OAAO,CAAA,wBAAA;AAAA,OACtE;AAAA,IACF;AACA,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AAAA,EAzBiB,KAAA;AAAA,EACA,OAAA;AAAA;AAAA,EAET,cAAuD,EAAC;AAAA;AAAA,EAyBhE,IAAI,SAAA,GAAiC;AACnC,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA;AAAA,EAGQ,QAAQ,KAAA,EAA+B;AAC7C,IAAA,OAAO,UAAU,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,UAAA,GAAa,KAAK,KAAA,CAAM,SAAA;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,eAAe,KAAA,EAAwC;AAC3D,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,CAAY,KAAK,CAAA;AACrC,IAAA,IAAI,QAAQ,OAAO,MAAA;AACnB,IAAA,MAAM,QAAA,GAAY,MAAM,IAAA,CAAK,YAAA,CAAa,YAAA,CAAa;AAAA,MACrD,OAAA,EAAS,IAAA,CAAK,OAAA,CAAQ,KAAK,CAAA;AAAA,MAC3B,GAAA,EAAK,KAAA,KAAU,QAAA,GAAW,iBAAA,GAAoB,oBAAA;AAAA,MAC9C,YAAA,EAAc,KAAA,KAAU,QAAA,GAAW,QAAA,GAAW;AAAA,KACxC,CAAA;AACR,IAAA,IAAA,CAAK,WAAA,CAAY,KAAK,CAAA,GAAI,QAAA;AAC1B,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,SAAA,GAAiC;AACrC,IAAA,MAAM,CAAC,MAAA,EAAQ,KAAK,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,MACxC,IAAA,CAAK,aAAa,YAAA,CAAa;AAAA,QAC7B,OAAA,EAAS,KAAK,KAAA,CAAM,UAAA;AAAA,QACpB,GAAA,EAAK,iBAAA;AAAA,QACL,YAAA,EAAc;AAAA,OACR,CAAA;AAAA,MACR,IAAA,CAAK,aAAa,YAAA,CAAa;AAAA,QAC7B,OAAA,EAAS,KAAK,KAAA,CAAM,SAAA;AAAA,QACpB,GAAA,EAAK,oBAAA;AAAA,QACL,YAAA,EAAc;AAAA,OACR;AAAA,KACT,CAAA;AACD,IAAA,OAAO,EAAE,QAAQ,KAAA,EAAM;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,KAAA,CAAM,KAAA,EAAsB,SAAA,EAAoC;AACpE,IAAA,OAAQ,MAAM,IAAA,CAAK,YAAA,CAAa,YAAA,CAAa;AAAA,MAC3C,OAAA,EAAS,IAAA,CAAK,OAAA,CAAQ,KAAK,CAAA;AAAA,MAC3B,GAAA,EAAK,KAAA,KAAU,QAAA,GAAW,iBAAA,GAAoB,oBAAA;AAAA,MAC9C,YAAA,EAAc,KAAA,KAAU,QAAA,GAAW,iBAAA,GAAoB,gBAAA;AAAA,MACvD,IAAA,EAAM,CAAC,SAAS;AAAA,KACV,CAAA;AAAA,EACV;AAAA;AAAA,EAGA,MAAM,YAAY,OAAA,EAAyC;AACzD,IAAA,MAAM,KAAA,GAAQ,CAAC,OAAA,KACb,IAAA,CAAK,aAAa,YAAA,CAAa;AAAA,MAC7B,OAAA;AAAA,MACA,GAAA,EAAK,QAAA;AAAA,MACL,YAAA,EAAc,WAAA;AAAA,MACd,IAAA,EAAM,CAAC,OAAO;AAAA,KACR,CAAA;AACV,IAAA,MAAM,CAAC,UAAA,EAAY,SAAS,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,MAChD,IAAA,CAAK,eAAe,QAAQ,CAAA;AAAA,MAC5B,IAAA,CAAK,eAAe,OAAO;AAAA,KAC5B,CAAA;AACD,IAAA,MAAM,CAAC,KAAK,IAAA,EAAM,IAAA,EAAM,QAAQ,KAAK,CAAA,GAAI,MAAM,OAAA,CAAQ,GAAA,CAAI;AAAA,MACzD,KAAK,YAAA,CAAa,UAAA,CAAW,EAAE,OAAA,EAAS,SAAS,CAAA;AAAA,MACjD,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAAA,MACrB,MAAM,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AAAA,MACrC,MAAM,UAAU,CAAA;AAAA,MAChB,MAAM,SAAS;AAAA,KAChB,CAAA;AACD,IAAA,OAAO,EAAE,GAAA,EAAK,IAAA,EAAM,IAAA,EAAM,QAAQ,KAAA,EAAM;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,WAAW,MAAA,EAA2C;AAC1D,IAAA,MAAM,MAAA,GAAS,KAAK,aAAA,EAAc;AAClC,IAAA,MAAM,EAAE,SAAS,MAAA,EAAQ,OAAA,EAAS,SAAQ,GAAI,IAAA,CAAK,OAAO,MAAM,CAAA;AAChE,IAAA,MAAM,EAAE,KAAA,EAAO,SAAA,EAAU,GAAI,MAAA;AAC7B,IAAA,MAAM,QAAA,GAAW,OAAO,QAAA,IAAY,MAAA;AACpC,IAAA,MAAM,MAAA,GAAS,OAAO,MAAA,IAAU,EAAA;AAChC,IAAA,MAAM,UAAU,QAAA,KAAa,MAAA,GAAS,KAAK,KAAA,CAAM,IAAA,GAAO,KAAK,KAAA,CAAM,IAAA;AACnE,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,KAAK,CAAA;AAEnC,IAAA,MAAM,SAAA,GAAa,MAAM,IAAA,CAAK,YAAA,CAAa,YAAA,CAAa;AAAA,MACtD,OAAA,EAAS,OAAA;AAAA,MACT,GAAA,EAAK,QAAA;AAAA,MACL,YAAA,EAAc,WAAA;AAAA,MACd,IAAA,EAAM,CAAC,OAAA,EAAS,QAAQ;AAAA,KAClB,CAAA;AAER,IAAA,IAAI,YAAY,SAAA,EAAW;AACzB,MAAA,MAAM,WAAA,GAAe,MAAM,MAAA,CAAO,aAAA,CAAc;AAAA,QAC9C,OAAA,EAAS,OAAA;AAAA,QACT,GAAA,EAAK,QAAA;AAAA,QACL,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,CAAC,QAAA,EAAU,SAAS,CAAA;AAAA,QAC1B,OAAA,EAAS,MAAA;AAAA,QACT,OAAQ,MAAA,CAAe;AAAA,OACjB,CAAA;AACR,MAAA,MAAM,CAAA,GAAI,MAAM,IAAA,CAAK,YAAA,CAAa,0BAA0B,EAAE,IAAA,EAAM,aAAa,CAAA;AACjF,MAAA,IAAI,CAAA,CAAE,WAAW,SAAA,EAAW,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,WAAW,CAAA,CAAE,CAAA;AAAA,IAChF;AAEA,IAAA,MAAM,OAAA,GAAW,MAAM,MAAA,CAAO,aAAA;AAAA,MAC5B,UAAU,QAAA,GACN;AAAA,QACE,OAAA,EAAS,QAAA;AAAA,QACT,GAAA,EAAK,iBAAA;AAAA,QACL,YAAA,EAAc,WAAA;AAAA,QACd,IAAA,EAAM,CAAC,SAAA,EAAW,OAAA,EAAS,MAAM,CAAA;AAAA,QACjC,OAAA,EAAS,MAAA;AAAA,QACT,OAAQ,MAAA,CAAe;AAAA,OACzB,GACC;AAAA,QACC,OAAA,EAAS,QAAA;AAAA,QACT,GAAA,EAAK,oBAAA;AAAA,QACL,YAAA,EAAc,UAAA;AAAA,QACd,IAAA,EAAM,CAAC,SAAA,EAAW,OAAO,CAAA;AAAA,QACzB,OAAA,EAAS,MAAA;AAAA,QACT,OAAQ,MAAA,CAAe;AAAA;AACzB,KACN;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,YAAA,CAAa,0BAA0B,EAAE,IAAA,EAAM,SAAS,CAAA;AACnF,IAAA,IAAI,OAAA,CAAQ,WAAW,SAAA,EAAW,MAAM,IAAI,KAAA,CAAM,CAAA,cAAA,EAAiB,OAAO,CAAA,CAAE,CAAA;AAC5E,IAAA,OAAO,EAAE,QAAQ,OAAA,EAAQ;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,WAAW,MAAA,EAA2C;AAC1D,IAAA,MAAM,MAAA,GAAS,KAAK,aAAA,EAAc;AAClC,IAAA,MAAM,EAAE,SAAS,MAAA,EAAQ,OAAA,EAAS,SAAQ,GAAI,IAAA,CAAK,OAAO,MAAM,CAAA;AAChE,IAAA,MAAM,EAAE,KAAA,EAAO,SAAA,EAAU,GAAI,MAAA;AAC7B,IAAA,MAAM,MAAA,GAAS,OAAO,MAAA,IAAU,EAAA;AAChC,IAAA,MAAM,SAAA,GAAY,OAAO,SAAA,IAAa,OAAA;AACtC,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,UAAA,IAAc,IAAA,CAAK,KAAA,CAAM,UAAA;AACpD,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,cAAA,CAAe,KAAK,CAAA;AACnD,IAAA,MAAM,IAAA,GAAO,KAAK,KAAA,CAAM,IAAA;AACxB,IAAA,MAAM,SAAA,GAAY,KAAK,KAAA,CAAM,SAAA;AAE7B,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,EAAI,GAAI,GAAI,CAAA,IAAK,MAAA,CAAO,eAAA,IAAmB,IAAA,CAAK,CAAA;AACxF,IAAA,MAAM,QAAQ,WAAA,EAAY;AAG1B,IAAA,MAAM,WAAA,GAAc,MAAO,MAAA,CAAe,aAAA,CAAc;AAAA,MACtD,OAAA,EAAS,MAAA;AAAA,MACT,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,KAAK,OAAA,EAAS,IAAA,CAAK,OAAA,EAAS,iBAAA,EAAmB,IAAA,EAAK;AAAA,MACrF,KAAA,EAAO;AAAA,QACL,yBAAA,EAA2B;AAAA,UACzB,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,SAAA,EAAU;AAAA,UAChC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AAAA,UAC9B,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,SAAA,EAAU;AAAA,UACjC,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,SAAA,EAAU;AAAA,UACtC,EAAE,IAAA,EAAM,aAAA,EAAe,IAAA,EAAM,SAAA,EAAU;AAAA,UACvC,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,SAAA;AAAU;AACnC,OACF;AAAA,MACA,WAAA,EAAa,2BAAA;AAAA,MACb,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,OAAA;AAAA,QACN,EAAA,EAAI,SAAA;AAAA,QACJ,KAAA,EAAO,SAAA;AAAA,QACP,UAAA,EAAY,EAAA;AAAA,QACZ,WAAA,EAAa,QAAA;AAAA,QACb;AAAA;AACF,KACD,CAAA;AAGD,IAAA,MAAM,YAAA,GAAe,MAAO,MAAA,CAAe,aAAA,CAAc;AAAA,MACvD,OAAA,EAAS,MAAA;AAAA,MACT,MAAA,EAAQ,EAAE,IAAA,EAAM,mBAAA,EAAqB,OAAA,EAAS,KAAK,OAAA,EAAS,IAAA,CAAK,OAAA,EAAS,iBAAA,EAAmB,SAAA,EAAU;AAAA,MACvG,KAAA,EAAO;AAAA,QACL,SAAA,EAAW;AAAA,UACT,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,SAAA,EAAU;AAAA,UACjC,EAAE,IAAA,EAAM,cAAA,EAAgB,IAAA,EAAM,SAAA,EAAU;AAAA,UACxC,EAAE,IAAA,EAAM,eAAA,EAAiB,IAAA,EAAM,SAAA,EAAU;AAAA,UACzC,EAAE,IAAA,EAAM,aAAA,EAAe,IAAA,EAAM,SAAA,EAAU;AAAA,UACvC,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,SAAA,EAAU;AAAA,UACrC,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,SAAA,EAAU;AAAA,UAClC,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,SAAA,EAAU;AAAA,UACpC,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,SAAA;AAAU;AACnC,OACF;AAAA,MACA,WAAA,EAAa,WAAA;AAAA,MACb,OAAA,EAAS;AAAA,QACP,KAAA,EAAO,OAAA;AAAA,QACP,YAAA,EAAc,IAAA;AAAA,QACd,aAAA,EAAe,SAAA;AAAA,QACf,WAAA;AAAA,QACA,SAAA;AAAA,QACA,MAAA;AAAA,QACA,QAAA;AAAA,QACA;AAAA;AACF,KACD,CAAA;AAGD,IAAA,MAAM,EAAA,GAAK,WAAA,CAAY,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAClC,IAAA,MAAM,EAAA,GAAM,IAAA,GAAO,WAAA,CAAY,KAAA,CAAM,IAAI,GAAG,CAAA;AAC5C,IAAA,IAAI,KAAK,QAAA,CAAS,WAAA,CAAY,MAAM,GAAA,EAAK,GAAG,GAAG,EAAE,CAAA;AACjD,IAAA,IAAI,EAAA,GAAK,IAAI,EAAA,IAAM,EAAA;AAEnB,IAAA,MAAM,IAAA,GAAO,MAAM,KAAA,CAAM,WAAA,CAAY,QAAQ,KAAA,EAAO,EAAE,IAAI,WAAA,EAAa;AAAA,MACrE,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,MAC9C,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,QACnB,MAAA,EAAQ;AAAA,UACN,KAAA,EAAO,OAAA;AAAA,UACP,YAAA,EAAc,IAAA;AAAA,UACd,aAAA,EAAe,UAAU,QAAA,EAAS;AAAA,UAClC,WAAA;AAAA,UACA,SAAA;AAAA,UACA,MAAA,EAAQ,OAAO,QAAA,EAAS;AAAA,UACxB,QAAA,EAAU,OAAO,QAAQ,CAAA;AAAA,UACzB;AAAA,SACF;AAAA,QACA,YAAA;AAAA,QACA,YAAA,EAAc,EAAE,UAAA,EAAY,CAAA,EAAG,GAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA;AAAG,OACpD;AAAA,KACF,CAAA;AAED,IAAA,MAAM,IAAA,GAAY,MAAM,IAAA,CAAK,IAAA,GAAO,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AACpD,IAAA,IAAI,CAAC,IAAA,CAAK,EAAA,IAAM,CAAC,MAAM,MAAA,EAAQ;AAC7B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mBAAA,EAAsB,IAAA,EAAM,IAAA,IAAQ,IAAA,CAAK,MAAM,CAAA,EAAA,EAAK,IAAA,EAAM,KAAA,IAAS,IAAA,CAAK,UAAU,CAAA,CAAE,CAAA;AAAA,IACtG;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,YAAA,CAAa,0BAA0B,EAAE,IAAA,EAAM,IAAA,CAAK,MAAA,EAAgB,CAAA;AAC/F,IAAA,IAAI,OAAA,CAAQ,WAAW,SAAA,EAAW,MAAM,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkC,IAAA,CAAK,MAAM,CAAA,CAAE,CAAA;AACjG,IAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAgB,WAAA,EAAa,KAAK,WAAA,EAAY;AAAA,EACtE;AAAA,EAEQ,aAAA,GAA8B;AACpC,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA,MAAM,IAAI,MAAM,kEAAkE,CAAA;AAAA,IACpF;AACA,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,OAAO,MAAA,EAA0D;AACvE,IAAA,MAAM,MAAO,MAAA,CAAe,OAAA;AAC5B,IAAA,MAAM,OAAA,GAAW,KAAK,OAAA,IAAW,GAAA;AACjC,IAAA,IAAI,CAAC,OAAA,EAAS,MAAM,IAAI,MAAM,8CAA8C,CAAA;AAC5E,IAAA,OAAO,EAAE,OAAA,EAAS,GAAA,IAAO,OAAA,EAAS,OAAA,EAAQ;AAAA,EAC5C;AACF;AAGA,SAAS,WAAA,GAAmB;AAC1B,EAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,EAAE,CAAA;AAC/B,EAAA,UAAA,CAAW,MAAA,CAAO,gBAAgB,KAAK,CAAA;AACvC,EAAA,OAAQ,OAAO,KAAA,CAAM,IAAA,CAAK,KAAA,EAAO,CAAC,MAAM,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,SAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,KAAK,EAAE,CAAA;AAClF;ACnZA,IAAM,cAAc,QAAA,CAAS;AAAA,EACzB,yBAAA;AAAA,EACA;AACJ,CAAC,CAAA;AAED,IAAM,YAAY,QAAA,CAAS;AAAA,EACvB,oDAAA;AAAA,EACA,+CAAA;AAAA,EACA,kDAAA;AAAA,EACA;AACJ,CAAC,CAAA;AAEM,IAAM,aAAA,GAAN,MAAM,cAAA,CAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMvB,WAAA,CACY,cACA,YAAA,EACV;AAFU,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AACA,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AAAA,EACT;AAAA;AAAA;AAAA,EAKH,aAAa,kBAAA,CAAmB,MAAA,EAAsB,SAAA,EAAoB,MAAA,EAAgB;AACtF,IAAA,OAAO,OAAO,aAAA,CAAc;AAAA,MACxB,OAAA,EAAS,SAAA;AAAA,MACT,GAAA,EAAK,iBAAA;AAAA,MACL,YAAA,EAAc,SAAA;AAAA,MACd,IAAA,EAAM,CAAC,MAAM,CAAA;AAAA,MACb,OAAO,MAAA,CAAO;AAAA,KACV,CAAA;AAAA,EACZ;AAAA;AAAA,EAGA,aAAa,yBAAA,CAA0B,MAAA,EAAsB,KAAA,EAAgB,WAAoB,MAAA,EAAgB;AAC7G,IAAA,MAAM,cAAc,CAAC;AAAA,MACjB,IAAA,EAAM,iBAAA;AAAA,MACN,IAAA,EAAM,UAAA;AAAA,MACN,eAAA,EAAiB,YAAA;AAAA,MACjB,MAAA,EAAQ,CAAC,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,IAAA,EAAK,EAAG,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,SAAS,CAAA;AAAA,MAC5E,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,QAAQ;AAAA,KAC7B,CAAA;AAED,IAAA,OAAO,OAAO,aAAA,CAAc;AAAA,MACxB,OAAA,EAAS,KAAA;AAAA,MACT,GAAA,EAAK,WAAA;AAAA,MACL,YAAA,EAAc,iBAAA;AAAA,MACd,IAAA,EAAM,CAAC,SAAA,EAAW,MAAM,CAAA;AAAA,MACxB,OAAO,MAAA,CAAO;AAAA,KACV,CAAA;AAAA,EACZ;AAAA;AAAA,EAGA,aAAa,WAAA,CAAY,MAAA,EAAsB,WAAA,EAAsB,MAAA,EAAgB;AAChF,IAAA,OAAO,OAAO,aAAA,CAAc;AAAA,MACzB,OAAA,EAAS,WAAA;AAAA,MACT,GAAA,EAAK,WAAA;AAAA,MACL,YAAA,EAAc,OAAA;AAAA,MACd,IAAA,EAAM,CAAC,MAAM,CAAA;AAAA,MACb,OAAO,MAAA,CAAO;AAAA,KACV,CAAA;AAAA,EACZ;AAAA;AAAA,EAGA,aAAa,uBAAA,CAAwB,MAAA,EAAsB,SAAA,EAAoB,IAAa,MAAA,EAAgB;AACxG,IAAA,OAAO,OAAO,aAAA,CAAc;AAAA,MACxB,OAAA,EAAS,SAAA;AAAA,MACT,GAAA,EAAK,iBAAA;AAAA,MACL,YAAA,EAAc,yBAAA;AAAA,MACd,IAAA,EAAM,CAAC,EAAA,EAAI,MAAM,CAAA;AAAA,MACjB,OAAO,MAAA,CAAO;AAAA,KACV,CAAA;AAAA,EACZ;AAAA;AAAA,EAGA,aAAa,mBAAA,CAAoB,MAAA,EAAsB,UAAA,EAAqB,WAAoB,MAAA,EAAgB;AAC5G,IAAA,OAAO,OAAO,aAAA,CAAc;AAAA,MACxB,OAAA,EAAS,UAAA;AAAA,MACT,GAAA,EAAK,QAAA,CAAS,CAAC,qCAAqC,CAAC,CAAA;AAAA,MACrD,YAAA,EAAc,WAAA;AAAA,MACd,IAAA,EAAM,CAAC,SAAS,CAAA;AAAA,MAChB,KAAA,EAAO,MAAA;AAAA,MACP,OAAO,MAAA,CAAO;AAAA,KACV,CAAA;AAAA,EACZ;AAAA;AAAA,EAGA,aAAa,oBAAA,CAAqB,MAAA,EAAa,UAAA,EAAqB,OAAA,EAAmC;AACnG,IAAA,OAAO,OAAO,YAAA,CAAa;AAAA,MACvB,OAAA,EAAS,UAAA;AAAA,MACT,GAAA,EAAK,QAAA,CAAS,CAAC,oDAAoD,CAAC,CAAA;AAAA,MACpE,YAAA,EAAc,WAAA;AAAA,MACd,IAAA,EAAM,CAAC,OAAO;AAAA,KACjB,CAAA;AAAA,EACL;AAAA;AAAA,EAGA,aAAa,eAAA,CAAgB,MAAA,EAAsB,SAAA,EAAoB,MAAA,EAAgB;AACnF,IAAA,OAAO,OAAO,aAAA,CAAc;AAAA,MACxB,OAAA,EAAS,SAAA;AAAA,MACT,GAAA,EAAK,iBAAA;AAAA,MACL,YAAA,EAAc,SAAA;AAAA,MACd,IAAA,EAAM,CAAC,MAAM,CAAA;AAAA,MACb,OAAO,MAAA,CAAO;AAAA,KACV,CAAA;AAAA,EACZ;AAAA;AAAA,EAGA,aAAa,qBAAA,CAAsB,MAAA,EAAsB,SAAA,EAAoB,MAAA,EAAgB;AACzF,IAAA,OAAO,OAAO,aAAA,CAAc;AAAA,MACxB,OAAA,EAAS,SAAA;AAAA,MACT,GAAA,EAAK,iBAAA;AAAA,MACL,YAAA,EAAc,eAAA;AAAA,MACd,IAAA,EAAM,CAAC,MAAM,CAAA;AAAA,MACb,OAAO,MAAA,CAAO;AAAA,KACV,CAAA;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,iBAAiB,OAAA,EAAmC;AACtD,IAAA,MAAM,EAAE,cAAA,EAAe,GAAI,MAAM,OAAO,mBAAc,CAAA;AACtD,IAAA,OAAO,IAAA,CAAK,aAAa,YAAA,CAAa;AAAA,MAClC,SAAS,cAAA,CAAe,MAAA;AAAA,MACxB,GAAA,EAAK,SAAA;AAAA,MACL,YAAA,EAAc,WAAA;AAAA,MACd,IAAA,EAAM,CAAC,OAAO;AAAA,KACjB,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,OAAA,EAAmC;AACrD,IAAA,MAAM,EAAE,cAAA,EAAe,GAAI,MAAM,OAAO,mBAAc,CAAA;AACtD,IAAA,OAAO,IAAA,CAAK,aAAa,YAAA,CAAa;AAAA,MAClC,SAAS,cAAA,CAAe,KAAA;AAAA,MACxB,GAAA,EAAK,SAAA;AAAA,MACL,YAAA,EAAc,WAAA;AAAA,MACd,IAAA,EAAM,CAAC,OAAO;AAAA,KACjB,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,gBAAgB,MAAA,EAA+B;AACjD,IAAA,MAAM,OAAA,GAAU,KAAK,YAAA,CAAa,OAAA;AAClC,IAAA,IAAI,CAAC,OAAA,EAAS,MAAM,IAAI,MAAM,kBAAkB,CAAA;AAEhD,IAAA,MAAM,EAAE,cAAA,EAAe,GAAI,MAAM,OAAO,mBAAc,CAAA;AACtD,IAAA,MAAM,gBAAgB,cAAA,CAAe,MAAA;AACrC,IAAA,MAAM,iBAAiB,cAAA,CAAe,aAAA;AAGtC,IAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,YAAA,CAAa,YAAA,CAAa;AAAA,MACnD,OAAA,EAAS,aAAA;AAAA,MACT,GAAA,EAAK,QAAA,CAAS,CAAC,2EAA2E,CAAC,CAAA;AAAA,MAC3F,YAAA,EAAc,WAAA;AAAA,MACd,IAAA,EAAM,CAAC,OAAA,CAAQ,OAAA,EAAS,cAAc;AAAA,KACzC,CAAA;AAED,IAAA,IAAK,YAAuB,MAAA,EAAQ;AAChC,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,0BAAA,EAA6B,WAAA,CAAY,MAAM,CAAC,CAAA,UAAA,CAAY,CAAA;AACxE,MAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,YAAA,CAAa,aAAA,CAAc;AAAA,QACpD,OAAA,EAAS,aAAA;AAAA,QACT,GAAA,EAAK,QAAA,CAAS,CAAC,kEAAkE,CAAC,CAAA;AAAA,QAClF,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,CAAC,cAAA,EAAgB,MAAM,CAAA;AAAA,QAC7B,KAAA,EAAO,KAAK,YAAA,CAAa,KAAA;AAAA,QACzB;AAAA,OACH,CAAA;AACD,MAAA,MAAM,KAAK,YAAA,CAAa,yBAAA,CAA0B,EAAE,IAAA,EAAM,WAAW,CAAA;AACrE,MAAA,OAAA,CAAQ,IAAI,CAAA,yBAAA,CAA2B,CAAA;AAAA,IAC3C;AAGA,IAAA,OAAA,CAAQ,IAAI,CAAA,0BAAA,CAA4B,CAAA;AACxC,IAAA,OAAO,cAAA,CAAc,WAAA,CAAY,IAAA,CAAK,YAAA,EAAc,gBAAgB,MAAM,CAAA;AAAA,EAC9E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAA,GAIH;AACC,IAAA,MAAM,EAAE,cAAA,EAAe,GAAI,MAAM,OAAO,mBAAc,CAAA;AACtD,IAAA,MAAM,gBAAgB,cAAA,CAAe,MAAA;AAErC,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,YAAA,CAAa,YAAA,CAAa;AAAA,MAC/C,OAAA,EAAS,aAAA;AAAA,MACT,GAAA,EAAK,SAAA;AAAA,MACL,YAAA,EAAc;AAAA,KACjB,CAAA;AAGD,IAAA,MAAM,MAAA,GAAS,EAAA;AAEf,IAAA,OAAO;AAAA,MACH,KAAA;AAAA,MACA,MAAA;AAAA,MACA,aAAa,KAAA,GAAQ;AAAA,KACzB;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBAAA,GAMH;AACC,IAAA,MAAM,EAAE,cAAA,EAAe,GAAI,MAAM,OAAO,mBAAc,CAAA;AAEtD,IAAA,MAAM,CAAC,WAAA,EAAa,WAAA,EAAa,gBAAgB,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,MACnE,IAAA,CAAK,aAAa,YAAA,CAAa;AAAA,QAC3B,SAAS,cAAA,CAAe,MAAA;AAAA,QACxB,GAAA,EAAK,QAAA,CAAS,CAAC,+CAA+C,CAAC,CAAA;AAAA,QAC/D,YAAA,EAAc;AAAA,OACjB,CAAA;AAAA,MACD,IAAA,CAAK,aAAa,YAAA,CAAa;AAAA,QAC3B,SAAS,cAAA,CAAe,aAAA;AAAA,QACxB,GAAA,EAAK,QAAA,CAAS,CAAC,+CAA+C,CAAC,CAAA;AAAA,QAC/D,YAAA,EAAc;AAAA,OACjB,CAAA;AAAA,MACD,IAAA,CAAK,aAAa,YAAA,CAAa;AAAA,QAC3B,SAAS,cAAA,CAAe,MAAA;AAAA,QACxB,GAAA,EAAK,QAAA,CAAS,CAAC,oDAAoD,CAAC,CAAA;AAAA,QACpE,YAAA,EAAc,WAAA;AAAA,QACd,IAAA,EAAM,CAAC,4CAA4C;AAAA,OACtD;AAAA,KACJ,CAAA;AAED,IAAA,MAAM,WAAA,GAAc,cAAc,WAAA,GAAc,gBAAA;AAChD,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,WAAA,CAAY,WAAW,CAAC,IAAI,MAAA,CAAO,WAAA,CAAY,WAAW,CAAC,CAAA,GAAI,GAAA;AAEpF,IAAA,OAAO;AAAA,MACH,WAAA;AAAA,MACA,WAAA;AAAA,MACA,WAAA,EAAa,gBAAA;AAAA,MACb,iBAAA,EAAmB,WAAA;AAAA,MACnB,YAAA,EAAc;AAAA,KAClB;AAAA,EACJ;AACJ","file":"chunk-L6D2AGTF.js","sourcesContent":["import { type Address, type Hash, type Hex } from 'viem';\nimport {\n ERC20ABI,\n SaleContractV2ABI,\n APNTsSaleContractABI,\n getLaunchSaleAddresses,\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\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 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 const buyHash = (await wallet.writeContract(\n token === 'GTOKEN'\n ? {\n address: saleAddr,\n abi: SaleContractV2ABI,\n functionName: 'buyTokens',\n args: [usdAmount, payAddr, minOut],\n account: signer,\n chain: (wallet as any).chain,\n }\n : ({\n address: saleAddr,\n abi: APNTsSaleContractABI,\n functionName: 'buyAPNTs',\n args: [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 `TransferWithAuthorization` (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 relayerBase = params.relayerUrl ?? this.addrs.relayerUrl;\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 TransferWithAuthorization → 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 TransferWithAuthorization: [\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: 'TransferWithAuthorization',\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 resp = await fetch(relayerBase.replace(/\\/$/, '') + '/v3/relay', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: 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\n const body: any = await resp.json().catch(() => ({}));\n if (!resp.ok || !body?.txHash) {\n throw new Error(`relayer rejected: [${body?.code ?? resp.status}] ${body?.error ?? resp.statusText}`);\n }\n\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\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"]}