@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,504 @@
1
+ 'use strict';
2
+
3
+ var chunkKOWTQJIX_cjs = require('./chunk-KOWTQJIX.cjs');
4
+ var chunkG33MXEHU_cjs = require('./chunk-G33MXEHU.cjs');
5
+ var viem = require('viem');
6
+
7
+ // ../tokens/src/tokenSale.ts
8
+ function usd(amount) {
9
+ return BigInt(Math.round(amount * 1e6));
10
+ }
11
+ var TokenSaleClient = class {
12
+ constructor(publicClient, walletClient, options = {}) {
13
+ this.publicClient = publicClient;
14
+ this.walletClient = walletClient;
15
+ const chainId = options.chainId ?? publicClient?.chain?.id ?? walletClient?.chain?.id;
16
+ if (!chainId) {
17
+ throw new Error("TokenSaleClient: cannot determine chainId; pass options.chainId");
18
+ }
19
+ this.chainId = chainId;
20
+ const addrs = options.addresses ?? chunkG33MXEHU_cjs.getLaunchSaleAddresses(chainId);
21
+ if (!addrs) {
22
+ throw new Error(
23
+ `TokenSaleClient: no launch sale address group for chainId ${chainId}; pass options.addresses`
24
+ );
25
+ }
26
+ this.addrs = addrs;
27
+ }
28
+ addrs;
29
+ chainId;
30
+ /** Cache of on-chain-resolved payout token addresses. */
31
+ payoutToken = {};
32
+ /** The resolved address group in use. */
33
+ get addresses() {
34
+ return this.addrs;
35
+ }
36
+ /** Sale contract address for a token kind. */
37
+ saleFor(token) {
38
+ return token === "GTOKEN" ? this.addrs.saleGToken : this.addrs.saleAPNTs;
39
+ }
40
+ /**
41
+ * Resolve (and cache) the ERC-20 the sale actually pays out, by reading the sale
42
+ * contract's `gToken()` / `aPNTs()` immutable getter. This is the single source of
43
+ * truth for the payout token — no address is duplicated in the config.
44
+ */
45
+ async getPayoutToken(token) {
46
+ const cached = this.payoutToken[token];
47
+ if (cached) return cached;
48
+ const resolved = await this.publicClient.readContract({
49
+ address: this.saleFor(token),
50
+ abi: token === "GTOKEN" ? chunkKOWTQJIX_cjs.SaleContractV2ABI : chunkKOWTQJIX_cjs.APNTsSaleContractABI,
51
+ functionName: token === "GTOKEN" ? "gToken" : "aPNTs"
52
+ });
53
+ this.payoutToken[token] = resolved;
54
+ return resolved;
55
+ }
56
+ /** Read live USD prices (6-decimal) for both sale tokens. */
57
+ async getPrices() {
58
+ const [gToken, aPNTs] = await Promise.all([
59
+ this.publicClient.readContract({
60
+ address: this.addrs.saleGToken,
61
+ abi: chunkKOWTQJIX_cjs.SaleContractV2ABI,
62
+ functionName: "getCurrentPriceUSD"
63
+ }),
64
+ this.publicClient.readContract({
65
+ address: this.addrs.saleAPNTs,
66
+ abi: chunkKOWTQJIX_cjs.APNTsSaleContractABI,
67
+ functionName: "priceUSD"
68
+ })
69
+ ]);
70
+ return { gToken, aPNTs };
71
+ }
72
+ /**
73
+ * Quote how many tokens (18-decimal) a USD amount buys, via the sale's on-chain
74
+ * pricing (`getTokensForUSD` / `getAPNTsForUSD`).
75
+ */
76
+ async quote(token, usdAmount) {
77
+ return await this.publicClient.readContract({
78
+ address: this.saleFor(token),
79
+ abi: token === "GTOKEN" ? chunkKOWTQJIX_cjs.SaleContractV2ABI : chunkKOWTQJIX_cjs.APNTsSaleContractABI,
80
+ functionName: token === "GTOKEN" ? "getTokensForUSD" : "getAPNTsForUSD",
81
+ args: [usdAmount]
82
+ });
83
+ }
84
+ /** Read ETH / USDC / USDT / GToken / aPNTs balances for an account. */
85
+ async getBalances(account) {
86
+ const erc20 = (address) => this.publicClient.readContract({
87
+ address,
88
+ abi: chunkKOWTQJIX_cjs.ERC20ABI,
89
+ functionName: "balanceOf",
90
+ args: [account]
91
+ });
92
+ const [gTokenAddr, aPNTsAddr] = await Promise.all([
93
+ this.getPayoutToken("GTOKEN"),
94
+ this.getPayoutToken("APNTS")
95
+ ]);
96
+ const [eth, usdc, usdt, gToken, aPNTs] = await Promise.all([
97
+ this.publicClient.getBalance({ address: account }),
98
+ erc20(this.addrs.usdc),
99
+ erc20(this.addrs.usdt).catch(() => 0n),
100
+ erc20(gTokenAddr),
101
+ erc20(aPNTsAddr)
102
+ ]);
103
+ return { eth, usdc, usdt, gToken, aPNTs };
104
+ }
105
+ // ─── Self-pay flow (buyer pays gas) ──────────────────────────────────────
106
+ /**
107
+ * Buy with the user paying gas: ensures allowance (approves if short) then calls
108
+ * `buyTokens` / `buyAPNTs`. Tokens are sent to the buyer. Waits for both receipts.
109
+ */
110
+ async buySelfPay(params) {
111
+ const wallet = this.requireWallet();
112
+ const { account: signer, address: account } = this.signer(wallet);
113
+ const { token, usdAmount } = params;
114
+ const payToken = params.payToken ?? "USDC";
115
+ const minOut = params.minOut ?? 0n;
116
+ const payAddr = payToken === "USDC" ? this.addrs.usdc : this.addrs.usdt;
117
+ const saleAddr = this.saleFor(token);
118
+ const allowance = await this.publicClient.readContract({
119
+ address: payAddr,
120
+ abi: chunkKOWTQJIX_cjs.ERC20ABI,
121
+ functionName: "allowance",
122
+ args: [account, saleAddr]
123
+ });
124
+ if (allowance < usdAmount) {
125
+ const approveHash = await wallet.writeContract({
126
+ address: payAddr,
127
+ abi: chunkKOWTQJIX_cjs.ERC20ABI,
128
+ functionName: "approve",
129
+ args: [saleAddr, usdAmount],
130
+ account: signer,
131
+ chain: wallet.chain
132
+ });
133
+ const r = await this.publicClient.waitForTransactionReceipt({ hash: approveHash });
134
+ if (r.status !== "success") throw new Error(`approve reverted: ${approveHash}`);
135
+ }
136
+ const buyHash = await wallet.writeContract(
137
+ token === "GTOKEN" ? {
138
+ address: saleAddr,
139
+ abi: chunkKOWTQJIX_cjs.SaleContractV2ABI,
140
+ functionName: "buyTokens",
141
+ args: [usdAmount, payAddr, minOut],
142
+ account: signer,
143
+ chain: wallet.chain
144
+ } : {
145
+ address: saleAddr,
146
+ abi: chunkKOWTQJIX_cjs.APNTsSaleContractABI,
147
+ functionName: "buyAPNTs",
148
+ args: [usdAmount, payAddr],
149
+ account: signer,
150
+ chain: wallet.chain
151
+ }
152
+ );
153
+ const receipt = await this.publicClient.waitForTransactionReceipt({ hash: buyHash });
154
+ if (receipt.status !== "success") throw new Error(`buy reverted: ${buyHash}`);
155
+ return { txHash: buyHash };
156
+ }
157
+ // ─── Gasless flow (EIP-3009 + BuyIntent → relayer) ───────────────────────
158
+ /**
159
+ * Buy with zero gas: signs an EIP-3009 USDC `TransferWithAuthorization` (to BuyHelper)
160
+ * and an EIP-712 `BuyIntent`, then posts both to the relayer's `/v3/relay`. Returns the
161
+ * relayer-submitted tx hash after on-chain confirmation. Payment is always USDC.
162
+ */
163
+ async buyGasless(params) {
164
+ const wallet = this.requireWallet();
165
+ const { account: signer, address: account } = this.signer(wallet);
166
+ const { token, usdAmount } = params;
167
+ const minOut = params.minOut ?? 0n;
168
+ const recipient = params.recipient ?? account;
169
+ const relayerBase = params.relayerUrl ?? this.addrs.relayerUrl;
170
+ const targetToken = await this.getPayoutToken(token);
171
+ const usdc = this.addrs.usdc;
172
+ const buyHelper = this.addrs.buyHelper;
173
+ const deadline = BigInt(Math.floor(Date.now() / 1e3) + (params.deadlineSeconds ?? 1800));
174
+ const nonce = randomNonce();
175
+ const transferSig = await wallet.signTypedData({
176
+ account: signer,
177
+ domain: { name: "USDC", version: "2", chainId: this.chainId, verifyingContract: usdc },
178
+ types: {
179
+ TransferWithAuthorization: [
180
+ { name: "from", type: "address" },
181
+ { name: "to", type: "address" },
182
+ { name: "value", type: "uint256" },
183
+ { name: "validAfter", type: "uint256" },
184
+ { name: "validBefore", type: "uint256" },
185
+ { name: "nonce", type: "bytes32" }
186
+ ]
187
+ },
188
+ primaryType: "TransferWithAuthorization",
189
+ message: {
190
+ from: account,
191
+ to: buyHelper,
192
+ value: usdAmount,
193
+ validAfter: 0n,
194
+ validBefore: deadline,
195
+ nonce
196
+ }
197
+ });
198
+ const buyIntentSig = await wallet.signTypedData({
199
+ account: signer,
200
+ domain: { name: "MyceliumBuyHelper", version: "1", chainId: this.chainId, verifyingContract: buyHelper },
201
+ types: {
202
+ BuyIntent: [
203
+ { name: "buyer", type: "address" },
204
+ { name: "paymentToken", type: "address" },
205
+ { name: "paymentAmount", type: "uint256" },
206
+ { name: "targetToken", type: "address" },
207
+ { name: "recipient", type: "address" },
208
+ { name: "minOut", type: "uint256" },
209
+ { name: "deadline", type: "uint256" },
210
+ { name: "nonce", type: "bytes32" }
211
+ ]
212
+ },
213
+ primaryType: "BuyIntent",
214
+ message: {
215
+ buyer: account,
216
+ paymentToken: usdc,
217
+ paymentAmount: usdAmount,
218
+ targetToken,
219
+ recipient,
220
+ minOut,
221
+ deadline,
222
+ nonce
223
+ }
224
+ });
225
+ const r_ = transferSig.slice(0, 66);
226
+ const s_ = "0x" + transferSig.slice(66, 130);
227
+ let v_ = parseInt(transferSig.slice(130, 132), 16);
228
+ if (v_ < 27) v_ += 27;
229
+ const resp = await fetch(relayerBase.replace(/\/$/, "") + "/v3/relay", {
230
+ method: "POST",
231
+ headers: { "Content-Type": "application/json" },
232
+ body: JSON.stringify({
233
+ intent: {
234
+ buyer: account,
235
+ paymentToken: usdc,
236
+ paymentAmount: usdAmount.toString(),
237
+ targetToken,
238
+ recipient,
239
+ minOut: minOut.toString(),
240
+ deadline: Number(deadline),
241
+ nonce
242
+ },
243
+ buyIntentSig,
244
+ transferAuth: { validAfter: 0, v: v_, r: r_, s: s_ }
245
+ })
246
+ });
247
+ const body = await resp.json().catch(() => ({}));
248
+ if (!resp.ok || !body?.txHash) {
249
+ throw new Error(`relayer rejected: [${body?.code ?? resp.status}] ${body?.error ?? resp.statusText}`);
250
+ }
251
+ const receipt = await this.publicClient.waitForTransactionReceipt({ hash: body.txHash });
252
+ if (receipt.status !== "success") throw new Error(`gasless buy reverted on-chain: ${body.txHash}`);
253
+ return { txHash: body.txHash, matchedRule: body.matchedRule };
254
+ }
255
+ requireWallet() {
256
+ if (!this.walletClient) {
257
+ throw new Error("TokenSaleClient: a walletClient is required for write operations");
258
+ }
259
+ return this.walletClient;
260
+ }
261
+ /**
262
+ * Resolve the signing account. Returns the viem account OBJECT (a LocalAccount, or a
263
+ * JsonRpcAccount for injected wallets) for the `account` field of write/sign calls, plus
264
+ * its address for message fields. Passing the object — not a bare address string — is what
265
+ * lets a local private-key account sign locally instead of routing to `eth_signTypedData_v4`
266
+ * on the (key-less) RPC transport.
267
+ */
268
+ signer(wallet) {
269
+ const acc = wallet.account;
270
+ const address = acc?.address ?? acc;
271
+ if (!address) throw new Error("TokenSaleClient: walletClient has no account");
272
+ return { account: acc ?? address, address };
273
+ }
274
+ };
275
+ function randomNonce() {
276
+ const bytes = new Uint8Array(32);
277
+ globalThis.crypto.getRandomValues(bytes);
278
+ return "0x" + Array.from(bytes, (b) => b.toString(16).padStart(2, "0")).join("");
279
+ }
280
+ var STAKING_ABI = viem.parseAbi([
281
+ "function stake(uint256)",
282
+ "function withdraw(uint256)"
283
+ ]);
284
+ var ERC20_ABI = viem.parseAbi([
285
+ "function balanceOf(address) view returns (uint256)",
286
+ "function totalSupply() view returns (uint256)",
287
+ "function approve(address,uint256) returns (bool)",
288
+ "function transfer(address,uint256) returns (bool)"
289
+ ]);
290
+ var FinanceClient = class _FinanceClient {
291
+ /**
292
+ * Initialize FinanceClient
293
+ * @param publicClient The public client for queries
294
+ * @param walletClient The wallet client for transactions
295
+ */
296
+ constructor(publicClient, walletClient) {
297
+ this.publicClient = publicClient;
298
+ this.walletClient = walletClient;
299
+ }
300
+ // ========== Existing static methods (preserved for backward compatibility) ==========
301
+ /** @deprecated Use instance methods instead */
302
+ static async depositToPaymaster(wallet, paymaster, amount) {
303
+ return wallet.writeContract({
304
+ address: paymaster,
305
+ abi: chunkKOWTQJIX_cjs.SuperPaymasterABI,
306
+ functionName: "deposit",
307
+ args: [amount],
308
+ chain: wallet.chain
309
+ });
310
+ }
311
+ /** @deprecated Use instance methods instead */
312
+ static async depositViaTransferAndCall(wallet, token, paymaster, amount) {
313
+ const ERC1363_ABI = [{
314
+ name: "transferAndCall",
315
+ type: "function",
316
+ stateMutability: "nonpayable",
317
+ inputs: [{ type: "address", name: "to" }, { type: "uint256", name: "value" }],
318
+ outputs: [{ type: "bool" }]
319
+ }];
320
+ return wallet.writeContract({
321
+ address: token,
322
+ abi: ERC1363_ABI,
323
+ functionName: "transferAndCall",
324
+ args: [paymaster, amount],
325
+ chain: wallet.chain
326
+ });
327
+ }
328
+ /** @deprecated Use instance methods instead */
329
+ static async stakeGToken(wallet, stakingAddr, amount) {
330
+ return wallet.writeContract({
331
+ address: stakingAddr,
332
+ abi: STAKING_ABI,
333
+ functionName: "stake",
334
+ args: [amount],
335
+ chain: wallet.chain
336
+ });
337
+ }
338
+ /** @deprecated Use instance methods instead */
339
+ static async withdrawProtocolRevenue(wallet, paymaster, to, amount) {
340
+ return wallet.writeContract({
341
+ address: paymaster,
342
+ abi: chunkKOWTQJIX_cjs.SuperPaymasterABI,
343
+ functionName: "withdrawProtocolRevenue",
344
+ args: [to, amount],
345
+ chain: wallet.chain
346
+ });
347
+ }
348
+ /** @deprecated Use instance methods instead */
349
+ static async depositToEntryPoint(wallet, entryPoint, paymaster, amount) {
350
+ return wallet.writeContract({
351
+ address: entryPoint,
352
+ abi: viem.parseAbi(["function depositTo(address) payable"]),
353
+ functionName: "depositTo",
354
+ args: [paymaster],
355
+ value: amount,
356
+ chain: wallet.chain
357
+ });
358
+ }
359
+ /** @deprecated Use instance methods instead */
360
+ static async getEntryPointBalance(client, entryPoint, account) {
361
+ return client.readContract({
362
+ address: entryPoint,
363
+ abi: viem.parseAbi(["function balanceOf(address) view returns (uint256)"]),
364
+ functionName: "balanceOf",
365
+ args: [account]
366
+ });
367
+ }
368
+ /** @deprecated Use instance methods instead */
369
+ static async operatorDeposit(wallet, paymaster, amount) {
370
+ return wallet.writeContract({
371
+ address: paymaster,
372
+ abi: chunkKOWTQJIX_cjs.SuperPaymasterABI,
373
+ functionName: "deposit",
374
+ args: [amount],
375
+ chain: wallet.chain
376
+ });
377
+ }
378
+ /** @deprecated Use instance methods instead */
379
+ static async operatorNotifyDeposit(wallet, paymaster, amount) {
380
+ return wallet.writeContract({
381
+ address: paymaster,
382
+ abi: chunkKOWTQJIX_cjs.SuperPaymasterABI,
383
+ functionName: "notifyDeposit",
384
+ args: [amount],
385
+ chain: wallet.chain
386
+ });
387
+ }
388
+ // ========== New instance methods (business primitives) ==========
389
+ /**
390
+ * Get GToken balance
391
+ */
392
+ async getGTokenBalance(address) {
393
+ const { CORE_ADDRESSES } = await import('./src-DNURNUIA.cjs');
394
+ return this.publicClient.readContract({
395
+ address: CORE_ADDRESSES.gToken,
396
+ abi: ERC20_ABI,
397
+ functionName: "balanceOf",
398
+ args: [address]
399
+ });
400
+ }
401
+ /**
402
+ * Get aPNTs balance
403
+ */
404
+ async getAPNTsBalance(address) {
405
+ const { CORE_ADDRESSES } = await import('./src-DNURNUIA.cjs');
406
+ return this.publicClient.readContract({
407
+ address: CORE_ADDRESSES.aPNTs,
408
+ abi: ERC20_ABI,
409
+ functionName: "balanceOf",
410
+ args: [address]
411
+ });
412
+ }
413
+ /**
414
+ * One-step stake: Approve (if needed) + Stake
415
+ *
416
+ * @param amount Amount of GToken to stake
417
+ * @returns Transaction hash of the stake action
418
+ */
419
+ async approveAndStake(amount) {
420
+ const account = this.walletClient.account;
421
+ if (!account) throw new Error("Account required");
422
+ const { CORE_ADDRESSES } = await import('./src-DNURNUIA.cjs');
423
+ const gTokenAddress = CORE_ADDRESSES.gToken;
424
+ const stakingAddress = CORE_ADDRESSES.gTokenStaking;
425
+ const allowance = await this.publicClient.readContract({
426
+ address: gTokenAddress,
427
+ abi: viem.parseAbi(["function allowance(address owner, address spender) view returns (uint256)"]),
428
+ functionName: "allowance",
429
+ args: [account.address, stakingAddress]
430
+ });
431
+ if (allowance < amount) {
432
+ console.log(`[FinanceClient] Approving ${viem.formatEther(amount)} GToken...`);
433
+ const approveTx = await this.walletClient.writeContract({
434
+ address: gTokenAddress,
435
+ abi: viem.parseAbi(["function approve(address spender, uint256 amount) returns (bool)"]),
436
+ functionName: "approve",
437
+ args: [stakingAddress, amount],
438
+ chain: this.walletClient.chain,
439
+ account
440
+ });
441
+ await this.publicClient.waitForTransactionReceipt({ hash: approveTx });
442
+ console.log(`[FinanceClient] Approved.`);
443
+ }
444
+ console.log(`[FinanceClient] Staking...`);
445
+ return _FinanceClient.stakeGToken(this.walletClient, stakingAddress, amount);
446
+ }
447
+ /**
448
+ * Get circulating supply (total - locked)
449
+ */
450
+ async getCirculatingSupply() {
451
+ const { CORE_ADDRESSES } = await import('./src-DNURNUIA.cjs');
452
+ const gTokenAddress = CORE_ADDRESSES.gToken;
453
+ const total = await this.publicClient.readContract({
454
+ address: gTokenAddress,
455
+ abi: ERC20_ABI,
456
+ functionName: "totalSupply"
457
+ });
458
+ const locked = 0n;
459
+ return {
460
+ total,
461
+ locked,
462
+ circulating: total - locked
463
+ };
464
+ }
465
+ /**
466
+ * Get comprehensive tokenomics data
467
+ */
468
+ async getTokenomicsOverview() {
469
+ const { CORE_ADDRESSES } = await import('./src-DNURNUIA.cjs');
470
+ const [totalSupply, totalStaked, blackholeBalance] = await Promise.all([
471
+ this.publicClient.readContract({
472
+ address: CORE_ADDRESSES.gToken,
473
+ abi: viem.parseAbi(["function totalSupply() view returns (uint256)"]),
474
+ functionName: "totalSupply"
475
+ }),
476
+ this.publicClient.readContract({
477
+ address: CORE_ADDRESSES.gTokenStaking,
478
+ abi: viem.parseAbi(["function totalStaked() view returns (uint256)"]),
479
+ functionName: "totalStaked"
480
+ }),
481
+ this.publicClient.readContract({
482
+ address: CORE_ADDRESSES.gToken,
483
+ abi: viem.parseAbi(["function balanceOf(address) view returns (uint256)"]),
484
+ functionName: "balanceOf",
485
+ args: ["0x000000000000000000000000000000000000dEaD"]
486
+ })
487
+ ]);
488
+ const circulating = totalSupply - totalStaked - blackholeBalance;
489
+ const ratio = Number(viem.formatEther(totalStaked)) / Number(viem.formatEther(totalSupply)) * 100;
490
+ return {
491
+ totalSupply,
492
+ totalStaked,
493
+ totalBurned: blackholeBalance,
494
+ circulatingSupply: circulating,
495
+ stakingRatio: ratio
496
+ };
497
+ }
498
+ };
499
+
500
+ exports.FinanceClient = FinanceClient;
501
+ exports.TokenSaleClient = TokenSaleClient;
502
+ exports.usd = usd;
503
+ //# sourceMappingURL=chunk-WTURYJEA.cjs.map
504
+ //# sourceMappingURL=chunk-WTURYJEA.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../tokens/src/tokenSale.ts","../../tokens/src/index.ts"],"names":["getLaunchSaleAddresses","SaleContractV2ABI","APNTsSaleContractABI","ERC20ABI","parseAbi","SuperPaymasterABI","formatEther"],"mappings":"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","file":"chunk-WTURYJEA.cjs","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"]}
@@ -1,4 +1,4 @@
1
- import { SuperPaymasterABI } from './chunk-EEWLL7GE.js';
1
+ import { SuperPaymasterABI } from './chunk-6DZCDV4Q.js';
2
2
  import { concat, pad, toHex, keccak256, encodeAbiParameters, toBytes, parseAbiParameters, parseAbi, encodeFunctionData } from 'viem';
3
3
 
4
4
  var DEFAULT_VERIFICATION_GAS = 160000n;
@@ -1166,5 +1166,5 @@ var PaymasterManager = class _PaymasterManager {
1166
1166
  };
1167
1167
 
1168
1168
  export { PaymasterClient, PaymasterManager, PaymasterOperator, SuperPaymasterAdminClient, SuperPaymasterClient, buildPaymasterData, buildSuperPaymasterData, checkEligibility, formatUserOpV07, getPaymasterV4Middleware, getSuperPaymasterMiddleware, getUserOpHashV07, tuneGasLimit };
1169
- //# sourceMappingURL=chunk-XBZGVJ5K.js.map
1170
- //# sourceMappingURL=chunk-XBZGVJ5K.js.map
1169
+ //# sourceMappingURL=chunk-YR7CTWY6.js.map
1170
+ //# sourceMappingURL=chunk-YR7CTWY6.js.map