@aastar/sdk 0.21.0 → 0.22.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.
- package/dist/UserClient-AJOGJXOC.cjs +15 -0
- package/dist/{UserClient-FOAOBLGK.cjs.map → UserClient-AJOGJXOC.cjs.map} +1 -1
- package/dist/UserClient-Y65JLJ23.js +6 -0
- package/dist/{UserClient-BDGP37PK.js.map → UserClient-Y65JLJ23.js.map} +1 -1
- package/dist/account.cjs +7 -7
- package/dist/account.js +2 -2
- package/dist/admin.cjs +3 -3
- package/dist/admin.js +2 -2
- package/dist/airaccount.cjs +1 -1
- package/dist/airaccount.js +1 -1
- package/dist/channel.cjs +6 -6
- package/dist/channel.js +2 -2
- package/dist/{chunk-M5WFKETT.js → chunk-2TS6T2WY.js} +1512 -66
- package/dist/chunk-2TS6T2WY.js.map +1 -0
- package/dist/{chunk-WR4OZUXR.cjs → chunk-3OIVYXUG.cjs} +6 -6
- package/dist/{chunk-WR4OZUXR.cjs.map → chunk-3OIVYXUG.cjs.map} +1 -1
- package/dist/{chunk-63JM67L7.cjs → chunk-6ISQM3SF.cjs} +26 -26
- package/dist/{chunk-63JM67L7.cjs.map → chunk-6ISQM3SF.cjs.map} +1 -1
- package/dist/{chunk-IJN776TA.cjs → chunk-7HO4IUHZ.cjs} +32 -32
- package/dist/{chunk-IJN776TA.cjs.map → chunk-7HO4IUHZ.cjs.map} +1 -1
- package/dist/{chunk-Z4GZ6DQA.cjs → chunk-7RNOKMAJ.cjs} +9 -9
- package/dist/{chunk-Z4GZ6DQA.cjs.map → chunk-7RNOKMAJ.cjs.map} +1 -1
- package/dist/{chunk-GAMSWXWI.cjs → chunk-BBZAD5G2.cjs} +33 -17
- package/dist/chunk-BBZAD5G2.cjs.map +1 -0
- package/dist/{chunk-Y4EJX7UA.cjs → chunk-BLA57KBS.cjs} +12 -12
- package/dist/{chunk-Y4EJX7UA.cjs.map → chunk-BLA57KBS.cjs.map} +1 -1
- package/dist/{chunk-5JFYTJOE.cjs → chunk-DOVGH7HB.cjs} +4 -4
- package/dist/{chunk-5JFYTJOE.cjs.map → chunk-DOVGH7HB.cjs.map} +1 -1
- package/dist/{chunk-M7HXR7G5.cjs → chunk-FZLBMUPN.cjs} +5 -5
- package/dist/{chunk-M7HXR7G5.cjs.map → chunk-FZLBMUPN.cjs.map} +1 -1
- package/dist/{chunk-5NKU5NT5.js → chunk-JCK7VAZF.js} +8 -8
- package/dist/{chunk-5NKU5NT5.js.map → chunk-JCK7VAZF.js.map} +1 -1
- package/dist/{chunk-EY2AJTGV.js → chunk-LKSQASFZ.js} +3 -3
- package/dist/{chunk-EY2AJTGV.js.map → chunk-LKSQASFZ.js.map} +1 -1
- package/dist/{chunk-3HZEIFBW.cjs → chunk-MG72SGVS.cjs} +5 -5
- package/dist/{chunk-3HZEIFBW.cjs.map → chunk-MG72SGVS.cjs.map} +1 -1
- package/dist/{chunk-ENSMYCU6.js → chunk-MQMTICTP.js} +3 -3
- package/dist/{chunk-ENSMYCU6.js.map → chunk-MQMTICTP.js.map} +1 -1
- package/dist/{chunk-DQBKE4ND.js → chunk-R3N7L7RE.js} +4 -4
- package/dist/{chunk-DQBKE4ND.js.map → chunk-R3N7L7RE.js.map} +1 -1
- package/dist/{chunk-DEUBKZH5.cjs → chunk-RF3MSLRW.cjs} +16 -16
- package/dist/{chunk-DEUBKZH5.cjs.map → chunk-RF3MSLRW.cjs.map} +1 -1
- package/dist/{chunk-RXPSL33E.js → chunk-SNVHOCU6.js} +25 -9
- package/dist/chunk-SNVHOCU6.js.map +1 -0
- package/dist/{chunk-MCALA6WM.js → chunk-T2GF4S3E.js} +6 -6
- package/dist/{chunk-MCALA6WM.js.map → chunk-T2GF4S3E.js.map} +1 -1
- package/dist/{chunk-CIEYY3A6.cjs → chunk-TS5CXRNI.cjs} +1541 -64
- package/dist/chunk-TS5CXRNI.cjs.map +1 -0
- package/dist/{chunk-57XLR2NT.js → chunk-UUT246S2.js} +3 -3
- package/dist/{chunk-57XLR2NT.js.map → chunk-UUT246S2.js.map} +1 -1
- package/dist/{chunk-DF4WVR2H.js → chunk-VUNNHEND.js} +9 -9
- package/dist/{chunk-DF4WVR2H.js.map → chunk-VUNNHEND.js.map} +1 -1
- package/dist/{chunk-KZERVPUR.js → chunk-XTF6MNIK.js} +3 -3
- package/dist/{chunk-KZERVPUR.js.map → chunk-XTF6MNIK.js.map} +1 -1
- package/dist/{chunk-E4CQFW75.js → chunk-XZDMKHKG.js} +3 -3
- package/dist/{chunk-E4CQFW75.js.map → chunk-XZDMKHKG.js.map} +1 -1
- package/dist/core.cjs +295 -171
- package/dist/core.d.cts +362 -27
- package/dist/core.d.ts +362 -27
- package/dist/core.js +1 -1
- package/dist/dapp.cjs +5 -5
- package/dist/dapp.js +2 -2
- package/dist/enduser.cjs +6 -6
- package/dist/enduser.js +3 -3
- package/dist/identity.cjs +5 -5
- package/dist/identity.js +2 -2
- package/dist/index.cjs +396 -272
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +15 -15
- package/dist/kms.cjs +1 -1
- package/dist/kms.js +1 -1
- package/dist/operator.cjs +6 -6
- package/dist/operator.js +2 -2
- package/dist/paymaster.cjs +15 -15
- package/dist/paymaster.d.cts +13 -0
- package/dist/paymaster.d.ts +13 -0
- package/dist/paymaster.js +2 -2
- package/dist/{src-RSN4U2T2.js → src-MDGW57S5.js} +4 -4
- package/dist/src-MDGW57S5.js.map +1 -0
- package/dist/src-SCR3OCME.js +5 -0
- package/dist/src-SCR3OCME.js.map +1 -0
- package/dist/{src-CUHI6G6W.cjs → src-UQ4RDCJG.cjs} +297 -173
- package/dist/src-UQ4RDCJG.cjs.map +1 -0
- package/dist/{src-KHCWIS4Q.cjs → src-WGYHZSLY.cjs} +17 -17
- package/dist/src-WGYHZSLY.cjs.map +1 -0
- package/dist/tokens.cjs +3 -3
- package/dist/tokens.js +2 -2
- package/dist/x402.cjs +25 -25
- package/dist/x402.js +2 -2
- package/package.json +1 -1
- package/dist/UserClient-BDGP37PK.js +0 -6
- package/dist/UserClient-FOAOBLGK.cjs +0 -15
- package/dist/chunk-CIEYY3A6.cjs.map +0 -1
- package/dist/chunk-GAMSWXWI.cjs.map +0 -1
- package/dist/chunk-M5WFKETT.js.map +0 -1
- package/dist/chunk-RXPSL33E.js.map +0 -1
- package/dist/src-CUHI6G6W.cjs.map +0 -1
- package/dist/src-KHCWIS4Q.cjs.map +0 -1
- package/dist/src-RSN4U2T2.js.map +0 -1
- package/dist/src-XCV6BTSV.js +0 -5
- package/dist/src-XCV6BTSV.js.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkTS5CXRNI_cjs = require('./chunk-TS5CXRNI.cjs');
|
|
4
4
|
var viem = require('viem');
|
|
5
5
|
|
|
6
6
|
var DEFAULT_VERIFICATION_GAS = 160000n;
|
|
@@ -30,7 +30,7 @@ async function checkEligibility(client, paymaster, user, operator) {
|
|
|
30
30
|
try {
|
|
31
31
|
const operatorData = await client.readContract({
|
|
32
32
|
address: paymaster,
|
|
33
|
-
abi:
|
|
33
|
+
abi: chunkTS5CXRNI_cjs.SuperPaymasterABI,
|
|
34
34
|
functionName: "operators",
|
|
35
35
|
args: [operator]
|
|
36
36
|
});
|
|
@@ -42,7 +42,7 @@ async function checkEligibility(client, paymaster, user, operator) {
|
|
|
42
42
|
}
|
|
43
43
|
const credit = await client.readContract({
|
|
44
44
|
address: paymaster,
|
|
45
|
-
abi:
|
|
45
|
+
abi: chunkTS5CXRNI_cjs.SuperPaymasterABI,
|
|
46
46
|
functionName: "getAvailableCredit",
|
|
47
47
|
args: [user, token]
|
|
48
48
|
});
|
|
@@ -66,7 +66,7 @@ var SuperPaymasterAdminClient = class {
|
|
|
66
66
|
async getOperator(operator) {
|
|
67
67
|
return this.client.readContract({
|
|
68
68
|
address: this.paymasterAddress,
|
|
69
|
-
abi:
|
|
69
|
+
abi: chunkTS5CXRNI_cjs.SuperPaymasterABI,
|
|
70
70
|
functionName: "operators",
|
|
71
71
|
args: [operator]
|
|
72
72
|
});
|
|
@@ -74,7 +74,7 @@ var SuperPaymasterAdminClient = class {
|
|
|
74
74
|
static async configureOperator(wallet, paymaster, token, treasury) {
|
|
75
75
|
return wallet.writeContract({
|
|
76
76
|
address: paymaster,
|
|
77
|
-
abi:
|
|
77
|
+
abi: chunkTS5CXRNI_cjs.SuperPaymasterABI,
|
|
78
78
|
functionName: "configureOperator",
|
|
79
79
|
args: [token, treasury],
|
|
80
80
|
chain: wallet.chain
|
|
@@ -83,7 +83,7 @@ var SuperPaymasterAdminClient = class {
|
|
|
83
83
|
static async setOperatorPaused(wallet, paymaster, operator, paused) {
|
|
84
84
|
return wallet.writeContract({
|
|
85
85
|
address: paymaster,
|
|
86
|
-
abi:
|
|
86
|
+
abi: chunkTS5CXRNI_cjs.SuperPaymasterABI,
|
|
87
87
|
functionName: "setOperatorPaused",
|
|
88
88
|
args: [operator, paused],
|
|
89
89
|
chain: wallet.chain
|
|
@@ -92,7 +92,7 @@ var SuperPaymasterAdminClient = class {
|
|
|
92
92
|
static async updateReputation(wallet, paymaster, operator, score) {
|
|
93
93
|
return wallet.writeContract({
|
|
94
94
|
address: paymaster,
|
|
95
|
-
abi:
|
|
95
|
+
abi: chunkTS5CXRNI_cjs.SuperPaymasterABI,
|
|
96
96
|
functionName: "updateReputation",
|
|
97
97
|
args: [operator, score],
|
|
98
98
|
chain: wallet.chain
|
|
@@ -101,7 +101,7 @@ var SuperPaymasterAdminClient = class {
|
|
|
101
101
|
static async setAPNTsToken(wallet, paymaster, token) {
|
|
102
102
|
return wallet.writeContract({
|
|
103
103
|
address: paymaster,
|
|
104
|
-
abi:
|
|
104
|
+
abi: chunkTS5CXRNI_cjs.SuperPaymasterABI,
|
|
105
105
|
functionName: "setAPNTsToken",
|
|
106
106
|
args: [token],
|
|
107
107
|
chain: wallet.chain
|
|
@@ -110,7 +110,7 @@ var SuperPaymasterAdminClient = class {
|
|
|
110
110
|
static async setXPNTsFactory(wallet, paymaster, factory) {
|
|
111
111
|
return wallet.writeContract({
|
|
112
112
|
address: paymaster,
|
|
113
|
-
abi:
|
|
113
|
+
abi: chunkTS5CXRNI_cjs.SuperPaymasterABI,
|
|
114
114
|
functionName: "setXPNTsFactory",
|
|
115
115
|
args: [factory],
|
|
116
116
|
chain: wallet.chain
|
|
@@ -249,6 +249,20 @@ var PaymasterClient = class _PaymasterClient {
|
|
|
249
249
|
*/
|
|
250
250
|
constructor() {
|
|
251
251
|
}
|
|
252
|
+
/**
|
|
253
|
+
* Sign a UserOp hash for the EntryPoint.
|
|
254
|
+
*
|
|
255
|
+
* airaccount-contract v0.20.0 `_validateSignature` routes on `signature[0]` as an algId
|
|
256
|
+
* prefix BEFORE the raw-65-byte fallback. A raw 65-byte ECDSA sig whose first byte happens
|
|
257
|
+
* to equal an algId const (e.g. `0x02` = ALG_ECDSA) is misrouted → intermittent AA24.
|
|
258
|
+
* For v0.20.0 AirAccounts pass `airAccountSig: true` to emit the deterministic algId-prefixed
|
|
259
|
+
* `[0x02][r][s][v]` (66-byte) format (matches `auth/hardware/ledger.ts`). Default is the raw
|
|
260
|
+
* 65-byte form — unchanged for SimpleAccount and other account types.
|
|
261
|
+
*/
|
|
262
|
+
static async signUserOpHash(wallet, userOpHash, airAccountSig) {
|
|
263
|
+
const raw = await wallet.account.signMessage({ message: { raw: userOpHash } });
|
|
264
|
+
return airAccountSig ? `0x02${raw.slice(2)}` : raw;
|
|
265
|
+
}
|
|
252
266
|
static makePlaceholderSignature(byteLength) {
|
|
253
267
|
const clamped = Math.max(0, Math.min(byteLength, 1e4));
|
|
254
268
|
return `0x${"11".repeat(clamped)}`;
|
|
@@ -424,7 +438,7 @@ var PaymasterClient = class _PaymasterClient {
|
|
|
424
438
|
}
|
|
425
439
|
partialUserOp.preVerificationGas = _PaymasterClient.estimatePreVerificationGasV07(partialUserOp) * 120n / 100n + 5000n;
|
|
426
440
|
const userOpHash = getUserOpHashV07(partialUserOp, entryPoint, BigInt(client.chain.id));
|
|
427
|
-
partialUserOp.signature = await
|
|
441
|
+
partialUserOp.signature = await _PaymasterClient.signUserOpHash(wallet, userOpHash, options?.airAccountSig);
|
|
428
442
|
const payload = {
|
|
429
443
|
jsonrpc: "2.0",
|
|
430
444
|
id: 1,
|
|
@@ -491,7 +505,9 @@ var PaymasterClient = class _PaymasterClient {
|
|
|
491
505
|
validityWindow: options?.validityWindow,
|
|
492
506
|
operator: options?.operator,
|
|
493
507
|
factory: options?.factory,
|
|
494
|
-
factoryData: options?.factoryData
|
|
508
|
+
factoryData: options?.factoryData,
|
|
509
|
+
airAccountSig: options?.airAccountSig
|
|
510
|
+
// forward so internal estimate signs in the same format (#115 H-1)
|
|
495
511
|
}
|
|
496
512
|
);
|
|
497
513
|
gasLimits.preVerificationGas = options?.preVerificationGas ?? est.preVerificationGas;
|
|
@@ -584,7 +600,7 @@ var PaymasterClient = class _PaymasterClient {
|
|
|
584
600
|
signature: "0x"
|
|
585
601
|
};
|
|
586
602
|
const userOpHash = getUserOpHashV07(userOp, entryPoint, BigInt(client.chain.id));
|
|
587
|
-
const signature = await
|
|
603
|
+
const signature = await _PaymasterClient.signUserOpHash(wallet, userOpHash, options?.airAccountSig);
|
|
588
604
|
userOp.signature = signature;
|
|
589
605
|
const bundlerType = detectBundlerType(bundlerUrl);
|
|
590
606
|
console.log(`[PaymasterClient] Using ${bundlerType} Bundler`);
|
|
@@ -622,7 +638,7 @@ var PaymasterClient = class _PaymasterClient {
|
|
|
622
638
|
viem.pad(viem.toHex(newMaxFee), { size: 16 })
|
|
623
639
|
]);
|
|
624
640
|
const newHash = getUserOpHashV07(userOp, entryPoint, BigInt(client.chain.id));
|
|
625
|
-
userOp.signature = await
|
|
641
|
+
userOp.signature = await _PaymasterClient.signUserOpHash(wallet, newHash, options?.airAccountSig);
|
|
626
642
|
continue;
|
|
627
643
|
}
|
|
628
644
|
const matchPriority = msg.match(/maxPriorityFeePerGas.*(?:at least|expected) (\d+)/i) || msg.match(/priority fee.*(?:at least|expected) (\d+)/i);
|
|
@@ -653,7 +669,7 @@ var PaymasterClient = class _PaymasterClient {
|
|
|
653
669
|
viem.pad(viem.toHex(newMaxFee), { size: 16 })
|
|
654
670
|
]);
|
|
655
671
|
const newHash = getUserOpHashV07(userOp, entryPoint, BigInt(client.chain.id));
|
|
656
|
-
userOp.signature = await
|
|
672
|
+
userOp.signature = await _PaymasterClient.signUserOpHash(wallet, newHash, options?.airAccountSig);
|
|
657
673
|
continue;
|
|
658
674
|
}
|
|
659
675
|
const matchPVG = msg.match(/preVerificationGas.*(?:at least|expected) (\d+)/i);
|
|
@@ -666,7 +682,7 @@ var PaymasterClient = class _PaymasterClient {
|
|
|
666
682
|
console.log(` -> Updating PVG from ${currentPVG} to ${bufferedPVG} (inc. buffer)`);
|
|
667
683
|
userOp.preVerificationGas = bufferedPVG;
|
|
668
684
|
const newHash = getUserOpHashV07(userOp, entryPoint, BigInt(client.chain.id));
|
|
669
|
-
userOp.signature = await
|
|
685
|
+
userOp.signature = await _PaymasterClient.signUserOpHash(wallet, newHash, options?.airAccountSig);
|
|
670
686
|
continue;
|
|
671
687
|
}
|
|
672
688
|
}
|
|
@@ -1164,5 +1180,5 @@ exports.getPaymasterV4Middleware = getPaymasterV4Middleware;
|
|
|
1164
1180
|
exports.getSuperPaymasterMiddleware = getSuperPaymasterMiddleware;
|
|
1165
1181
|
exports.getUserOpHashV07 = getUserOpHashV07;
|
|
1166
1182
|
exports.tuneGasLimit = tuneGasLimit;
|
|
1167
|
-
//# sourceMappingURL=chunk-
|
|
1168
|
-
//# sourceMappingURL=chunk-
|
|
1183
|
+
//# sourceMappingURL=chunk-BBZAD5G2.cjs.map
|
|
1184
|
+
//# sourceMappingURL=chunk-BBZAD5G2.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../paymaster/src/SuperPaymaster/index.ts","../../paymaster/src/V4/PaymasterUtils.ts","../../paymaster/src/V4/BundlerCompat.ts","../../paymaster/src/V4/PaymasterClient.ts","../../paymaster/src/V4/PaymasterOperator.ts","../../paymaster/src/V4/SuperPaymasterClient.ts","../../paymaster/src/PaymasterManager.ts"],"names":["concat","pad","toHex","SuperPaymasterABI","keccak256","encodeAbiParameters","toBytes","parseAbiParameters","parseAbi","chainId","isTestnet","encodeFunctionData"],"mappings":"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","file":"chunk-BBZAD5G2.cjs","sourcesContent":["import { type Address, concat, pad, toHex } from 'viem';\nimport { type PublicClient, SuperPaymasterABI as SUPERPAYMASTER_ABI } from '@aastar/core';\n\nexport type PaymasterConfig = {\n paymasterAddress: Address;\n operator: Address;\n maxRate?: bigint;\n verificationGasLimit?: bigint;\n postOpGasLimit?: bigint;\n};\n\nconst DEFAULT_VERIFICATION_GAS = 160000n;\nconst DEFAULT_POSTOP_GAS = 10000n;\n\n/**\n * Constructs the middleware for SuperPaymaster.\n * Returns the `paymasterAndData` hex string.\n */\nexport function getSuperPaymasterMiddleware(config: PaymasterConfig) {\n return {\n sponsorUserOperation: async (args: { userOperation: any }) => {\n const verGas = config.verificationGasLimit ?? DEFAULT_VERIFICATION_GAS;\n const postGas = config.postOpGasLimit ?? DEFAULT_POSTOP_GAS;\n const maxRate = config.maxRate ?? 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffn;\n\n // V3.2.1 Layout: [Paymaster(20)] [VerGas(16)] [PostOpGas(16)] [Operator(20)] [MaxRate(32)]\n // Offset 72 starts MaxRate.\n const paymasterAndData = concat([\n config.paymasterAddress,\n pad(toHex(verGas), { size: 16 }),\n pad(toHex(postGas), { size: 16 }),\n config.operator,\n pad(toHex(maxRate), { size: 32 })\n ]);\n\n return {\n paymasterAndData,\n verificationGasLimit: verGas,\n preVerificationGas: args.userOperation.preVerificationGas, \n };\n }\n };\n}\n\n/**\n * Enhanced eligibility check for SuperPaymaster V3.\n * Validates that user has sufficient credit with the given operator.\n */\nexport async function checkEligibility(\n client: any, \n paymaster: Address, \n user: Address, \n operator: Address\n): Promise<{ eligible: boolean; credit?: bigint; token?: Address }> {\n try {\n // 1. Fetch operator's configured token\n const operatorData = await client.readContract({\n address: paymaster,\n abi: SUPERPAYMASTER_ABI,\n functionName: 'operators',\n args: [operator]\n });\n \n // operatorData structure: [token, treasury, isConfigured, isPaused, exchangeRate, ...]\n const token = operatorData[0] as Address;\n const isConfigured = operatorData[2] as boolean;\n const isPaused = operatorData[3] as boolean;\n \n if (!isConfigured || isPaused) {\n return { eligible: false };\n }\n \n // 2. Check available credit\n const credit = await client.readContract({\n address: paymaster,\n abi: SUPERPAYMASTER_ABI,\n functionName: 'getAvailableCredit',\n args: [user, token]\n });\n \n return { \n eligible: (credit as bigint) > 0n, \n credit: credit as bigint,\n token\n };\n } catch (e) {\n console.warn('Eligibility check failed:', e);\n return { eligible: false };\n }\n}\n\n/**\n * Admin Client for SuperPaymaster V3\n */\nexport class SuperPaymasterAdminClient {\n private client: any;\n private paymasterAddress: Address;\n\n constructor(client: any, paymasterAddress: Address) {\n this.client = client;\n this.paymasterAddress = paymasterAddress;\n }\n\n async getOperator(operator: Address) {\n return this.client.readContract({\n address: this.paymasterAddress,\n abi: SUPERPAYMASTER_ABI,\n functionName: 'operators',\n args: [operator]\n });\n }\n\n static async configureOperator(\n wallet: any,\n paymaster: Address,\n token: Address,\n treasury: Address\n ) {\n return wallet.writeContract({\n address: paymaster,\n abi: SUPERPAYMASTER_ABI,\n functionName: 'configureOperator',\n args: [token, treasury],\n chain: wallet.chain\n } as any);\n }\n\n static async setOperatorPaused(wallet: any, paymaster: Address, operator: Address, paused: boolean) {\n return wallet.writeContract({\n address: paymaster,\n abi: SUPERPAYMASTER_ABI,\n functionName: 'setOperatorPaused',\n args: [operator, paused],\n chain: wallet.chain\n } as any);\n }\n\n static async updateReputation(wallet: any, paymaster: Address, operator: Address, score: bigint) {\n return wallet.writeContract({\n address: paymaster,\n abi: SUPERPAYMASTER_ABI,\n functionName: 'updateReputation',\n args: [operator, score],\n chain: wallet.chain\n } as any);\n }\n\n static async setAPNTsToken(wallet: any, paymaster: Address, token: Address) {\n return wallet.writeContract({\n address: paymaster,\n abi: SUPERPAYMASTER_ABI,\n functionName: 'setAPNTsToken',\n args: [token],\n chain: wallet.chain\n } as any);\n }\n\n static async setXPNTsFactory(wallet: any, paymaster: Address, factory: Address) {\n return wallet.writeContract({\n address: paymaster,\n abi: SUPERPAYMASTER_ABI,\n functionName: 'setXPNTsFactory',\n args: [factory],\n chain: wallet.chain\n } as any);\n }\n}\n","import { type Address, concat, pad, toHex, keccak256, encodeAbiParameters, type Hex, toBytes } from 'viem';\n\nexport type PaymasterV4MiddlewareConfig = {\n paymasterAddress: Address;\n gasToken: Address;\n verificationGasLimit?: bigint;\n postOpGasLimit?: bigint;\n};\n\nexport type GaslessReadinessReport = {\n isReady: boolean;\n issues: string[];\n details: {\n paymasterStake: bigint;\n paymasterDeposit: bigint;\n ethUsdPrice: bigint;\n tokenSupported: boolean;\n tokenPrice: bigint;\n userTokenBalance: bigint;\n userPaymasterDeposit: bigint;\n };\n};\n\nconst DEFAULT_VERIFICATION_GAS_V4 = 1500000n; // ~1.5M for safety\nconst DEFAULT_POSTOP_GAS_V4 = 300000n; // ~300k for postOp logic\n\n/**\n * Constructs the middleware for Paymaster V4.\n * Returns the `paymasterAndData` hex string.\n */\nexport function getPaymasterV4Middleware(config: PaymasterV4MiddlewareConfig) {\n return {\n sponsorUserOperation: async (args: { userOperation: any }) => {\n const verGas = config.verificationGasLimit ?? DEFAULT_VERIFICATION_GAS_V4;\n const postGas = config.postOpGasLimit ?? DEFAULT_POSTOP_GAS_V4;\n\n // Layout: [Paymaster(20)] [VerGas(16)] [PostOpGas(16)] [Token(20)]\n const paymasterAndData = concat([\n config.paymasterAddress,\n pad(toHex(verGas), { size: 16 }),\n pad(toHex(postGas), { size: 16 }),\n config.gasToken\n ]);\n\n return {\n paymasterAndData,\n verificationGasLimit: verGas,\n preVerificationGas: args.userOperation.preVerificationGas\n };\n }\n };\n}\n\n/**\n * Build paymasterAndData for gasless UserOperation.\n * Layout: [Paymaster(20)] [VerificationGasLimit(16)] [PostOpGasLimit(16)] [Token(20)] [ValidUntil(6)] [ValidAfter(6)]\n */\nexport function buildPaymasterData(\n paymasterAddress: Address,\n token: Address,\n options?: {\n validityWindow?: number;\n verificationGasLimit?: bigint;\n postOpGasLimit?: bigint;\n }\n): `0x${string}` {\n const validityWindow = options?.validityWindow ?? 3600;\n const verGas = options?.verificationGasLimit ?? 200000n; // Increased for estimation\n const postGas = options?.postOpGasLimit ?? 100000n;\n \n const now = Math.floor(Date.now() / 1000);\n const validUntil = now + validityWindow;\n const validAfter = now - 100; // 100 seconds grace period\n\n return concat([\n paymasterAddress,\n pad(toHex(verGas), { size: 16 }),\n pad(toHex(postGas), { size: 16 }),\n token,\n pad(toHex(validUntil), { size: 6 }),\n pad(toHex(validAfter), { size: 6 })\n ]);\n}\n\n/**\n * Build paymasterAndData for SuperPaymaster V3.\n * Layout: [Paymaster(20)] [verGas(16)] [postGas(16)] [operator(20)] [maxRate(32)]\n * Total: 104 bytes\n * \n * IMPORTANT: SuperPaymaster contract generates validUntil internally using:\n * validUntil = cachedPrice.updatedAt + priceStalenessThreshold\n * Do NOT include validUntil/validAfter in paymasterAndData!\n */\nexport function buildSuperPaymasterData(\n paymasterAddress: Address,\n operator: Address,\n options?: {\n verificationGasLimit?: bigint;\n postOpGasLimit?: bigint;\n maxRate?: bigint;\n }\n): `0x${string}` {\n const verGas = options?.verificationGasLimit ?? 80000n;\n const postGas = options?.postOpGasLimit ?? 100000n;\n const maxRate = options?.maxRate ?? ((1n << 256n) - 1n); // Default: max uint256, no rate limit\n \n return concat([\n paymasterAddress,\n pad(toHex(verGas), { size: 16 }),\n pad(toHex(postGas), { size: 16 }),\n operator,\n pad(toHex(maxRate), { size: 32 }) // Optional rate commitment (rug pull protection)\n ]);\n}\n\n/**\n * Helper to format UserOp for Alchemy/Standard Bundlers (v0.7 Decomposed)\n */\nexport function formatUserOpV07(userOp: any) {\n const result: any = {\n sender: userOp.sender,\n nonce: toHex(userOp.nonce),\n callData: userOp.callData,\n preVerificationGas: toHex(userOp.preVerificationGas),\n signature: userOp.signature\n };\n\n // Only include factory/factoryData if account is NOT deployed (initCode not empty)\n if (userOp.initCode && userOp.initCode !== '0x' && userOp.initCode.length > 2) {\n result.initCode = userOp.initCode;\n if (userOp.initCode.length > 42) {\n result.factory = userOp.initCode.slice(0, 42);\n result.factoryData = '0x' + userOp.initCode.slice(42);\n } else {\n result.factory = '0x0000000000000000000000000000000000000000';\n result.factoryData = '0x';\n }\n }\n // If account is deployed, don't include any factory fields at all\n\n // Unpack accountGasLimits: [verificationGasLimit(16)][callGasLimit(16)]\n if (userOp.accountGasLimits && userOp.accountGasLimits !== '0x') {\n const packed = userOp.accountGasLimits.replace('0x', '').padStart(64, '0');\n result.verificationGasLimit = '0x' + BigInt('0x' + packed.slice(0, 32)).toString(16);\n result.callGasLimit = '0x' + BigInt('0x' + packed.slice(32, 64)).toString(16);\n }\n\n // Unpack gasFees: [maxPriorityFee(16)][maxFee(16)]\n if (userOp.gasFees && userOp.gasFees !== '0x') {\n const packed = userOp.gasFees.replace('0x', '').padStart(64, '0');\n result.maxPriorityFeePerGas = '0x' + BigInt('0x' + packed.slice(0, 32)).toString(16);\n result.maxFeePerGas = '0x' + BigInt('0x' + packed.slice(32, 64)).toString(16);\n }\n\n // Unpack paymasterAndData: [paymaster(20)][verificationGas(16)][postOpGas(16)][paymasterData]\n if (userOp.paymasterAndData && userOp.paymasterAndData !== '0x') {\n const packed = userOp.paymasterAndData.replace('0x', '');\n if (packed.length >= 104) {\n result.paymaster = '0x' + packed.slice(0, 40);\n result.paymasterVerificationGasLimit = '0x' + BigInt('0x' + packed.slice(40, 72)).toString(16);\n result.paymasterPostOpGasLimit = '0x' + BigInt('0x' + packed.slice(72, 104)).toString(16);\n result.paymasterData = '0x' + packed.slice(104);\n }\n }\n\n return result;\n}\n\nexport function getUserOpHashV07(userOp: any, entryPoint: Address, chainId: bigint): Hex {\n const hashedUserOp = keccak256(encodeAbiParameters(\n ['address', 'uint256', 'bytes32', 'bytes32', 'bytes32', 'uint256', 'bytes32', 'bytes32'].map(t => ({ type: t } as any)),\n [\n userOp.sender,\n userOp.nonce,\n keccak256(toBytes(userOp.initCode as Hex)),\n keccak256(toBytes(userOp.callData as Hex)),\n userOp.accountGasLimits as Hex,\n toHex(userOp.preVerificationGas),\n userOp.gasFees as Hex,\n keccak256(toBytes(userOp.paymasterAndData as Hex))\n ]\n ));\n return keccak256(encodeAbiParameters(\n ['bytes32', 'address', 'uint256'].map(t => ({ type: t } as any)),\n [hashedUserOp, entryPoint, chainId]\n ));\n}\n\n/**\n * Tune gas limit using a dynamic nominal ceiling to satisfy Bundler efficiency (0.4)\n * Target: Actual / Limit >= targetEfficiency\n */\nexport function tuneGasLimit(estimate: bigint, nominalActual: bigint, targetEfficiency = 0.45): bigint {\n if (estimate === 0n) return 0n;\n // targetEfficiency = actual / ceiling => ceiling = actual / targetEfficiency\n const ceiling = (nominalActual * 100n) / BigInt(Math.floor(targetEfficiency * 100));\n // Return the more restrictive limit to ensure efficiency ratio is met\n return estimate < ceiling ? estimate : ceiling;\n}\n","import { type Address, type PublicClient, type Transport, type Chain } from 'viem';\n\n/**\n * Bundler types we support\n */\nexport enum BundlerType {\n ALCHEMY = 'alchemy',\n PIMLICO = 'pimlico',\n STACKUP = 'stackup',\n CANDIDE = 'candide',\n UNKNOWN = 'unknown'\n}\n\n/**\n * Detect bundler type from URL\n */\nexport function detectBundlerType(bundlerUrl: string): BundlerType {\n const url = bundlerUrl.toLowerCase();\n if (url.includes('alchemy.com')) return BundlerType.ALCHEMY;\n if (url.includes('pimlico.io')) return BundlerType.PIMLICO;\n if (url.includes('stackup')) return BundlerType.STACKUP;\n if (url.includes('candide.dev')) return BundlerType.CANDIDE;\n return BundlerType.UNKNOWN;\n}\n\n/**\n * Minimal interface to satisfy basic Pimlico/Bundler needs \n * without bringing in heavy permissionless types that might conflict\n */\nexport interface BundlerConfig {\n type: BundlerType;\n url: string;\n entryPoint: Address;\n}\n\n/**\n * Create a bundler client config\n */\nexport function createBundlerClient(bundlerUrl: string, entryPoint: Address): BundlerConfig {\n const bundlerType = detectBundlerType(bundlerUrl);\n \n return {\n type: bundlerType,\n url: bundlerUrl,\n entryPoint\n };\n}\n","import { type Address, type Hex, parseAbi, encodePacked, keccak256, toBytes, concat, pad, toHex, encodeFunctionData, encodeAbiParameters, parseAbiParameters } from 'viem';\nimport { type PublicClient } from '@aastar/core';\nimport { buildPaymasterData, buildSuperPaymasterData, formatUserOpV07, getUserOpHashV07, tuneGasLimit } from './PaymasterUtils.js';\nimport { detectBundlerType, BundlerType } from './BundlerCompat.js';\n\n/**\n * PaymasterClient\n * Focus: Integration, Funding, Interaction.\n */\nexport class PaymasterClient {\n /**\n * @private\n * Static utility class, should not be instantiated.\n */\n private constructor() {}\n\n /**\n * Sign a UserOp hash for the EntryPoint.\n *\n * airaccount-contract v0.20.0 `_validateSignature` routes on `signature[0]` as an algId\n * prefix BEFORE the raw-65-byte fallback. A raw 65-byte ECDSA sig whose first byte happens\n * to equal an algId const (e.g. `0x02` = ALG_ECDSA) is misrouted → intermittent AA24.\n * For v0.20.0 AirAccounts pass `airAccountSig: true` to emit the deterministic algId-prefixed\n * `[0x02][r][s][v]` (66-byte) format (matches `auth/hardware/ledger.ts`). Default is the raw\n * 65-byte form — unchanged for SimpleAccount and other account types.\n */\n private static async signUserOpHash(\n wallet: any,\n userOpHash: `0x${string}`,\n airAccountSig?: boolean\n ): Promise<`0x${string}`> {\n const raw = (await wallet.account.signMessage({ message: { raw: userOpHash } })) as `0x${string}`;\n return airAccountSig ? (`0x02${raw.slice(2)}` as `0x${string}`) : raw;\n }\n\n private static makePlaceholderSignature(byteLength: number): `0x${string}` {\n const clamped = Math.max(0, Math.min(byteLength, 10_000));\n return (`0x${'11'.repeat(clamped)}`) as `0x${string}`;\n }\n\n private static estimatePreVerificationGasV07(userOp: {\n sender: Address;\n nonce: bigint;\n initCode: Hex;\n callData: Hex;\n accountGasLimits: Hex;\n preVerificationGas: bigint;\n gasFees: Hex;\n paymasterAndData: Hex;\n signature: Hex;\n }): bigint {\n const encoded = encodeAbiParameters(\n parseAbiParameters('(address,uint256,bytes,bytes,bytes32,uint256,bytes32,bytes,bytes)'),\n [\n [\n userOp.sender,\n userOp.nonce,\n userOp.initCode,\n userOp.callData,\n userOp.accountGasLimits,\n userOp.preVerificationGas,\n userOp.gasFees,\n userOp.paymasterAndData,\n userOp.signature\n ]\n ]\n );\n\n const bytes = toBytes(encoded);\n let calldataCost = 0n;\n for (const b of bytes) calldataCost += b === 0 ? 4n : 16n;\n\n return calldataCost + 26000n;\n }\n \n /**\n * Get user's deposited balance on the Paymaster.\n */\n static async getDepositedBalance(publicClient: any, address: Address, user: Address, token: Address): Promise<bigint> {\n return publicClient.readContract({\n address,\n abi: [{\n name: 'balances',\n type: 'function',\n inputs: [\n { name: 'user', type: 'address' },\n { name: 'token', type: 'address' }\n ],\n outputs: [{ name: '', type: 'uint256' }],\n stateMutability: 'view'\n }],\n functionName: 'balances',\n args: [user, token]\n });\n }\n\n /**\n * Deposit tokens to Paymaster for a user (enables gasless transactions).\n */\n static async depositFor(wallet: any, address: Address, user: Address, token: Address, amount: bigint) {\n return wallet.writeContract({\n address,\n abi: parseAbi(['function depositFor(address user, address token, uint256 amount) external']),\n functionName: 'depositFor',\n args: [user, token, amount],\n chain: wallet.chain\n } as any);\n }\n\n /**\n * Approve the Paymaster (or any spender) to spend gas tokens.\n */\n static async approveGasToken(wallet: any, token: Address, spender: Address, amount: bigint) {\n return wallet.writeContract({\n address: token,\n abi: parseAbi(['function approve(address spender, uint256 amount) external returns (bool)']),\n functionName: 'approve',\n args: [spender, amount],\n chain: wallet.chain\n } as any);\n }\n\n /**\n * Estimate Gas for a UserOperation.\n */\n static async estimateUserOperationGas(\n client: any,\n wallet: any,\n aaAddress: Address,\n entryPoint: Address,\n paymasterAddress: Address,\n token: Address,\n bundlerUrl: string,\n callData: `0x${string}`,\n options?: {\n validityWindow?: number;\n airAccountSig?: boolean; // v0.20.0 AirAccount: emit algId-prefixed [0x02] sig to avoid intermittent AA24\n operator?: Address; // For SuperPaymaster\n factory?: Address;\n factoryData?: Hex;\n }\n ) {\n // 0. Check cachedPrice (Critical for Paymaster V4)\n if (!options?.operator) { // Only for Paymaster V4, not SuperPaymaster\n try {\n const cache = await client.readContract({\n address: paymasterAddress,\n abi: parseAbi(['function cachedPrice() view returns (uint208 price, uint48 updatedAt)']),\n functionName: 'cachedPrice'\n }) as any;\n \n const cachedPrice: bigint = BigInt(cache?.price ?? cache?.[0] ?? 0);\n const cachedUpdatedAt: bigint = BigInt(cache?.updatedAt ?? cache?.[1] ?? 0);\n const now = BigInt(Math.floor(Date.now() / 1000));\n let stalenessThreshold = 0n;\n\n try {\n stalenessThreshold = await client.readContract({\n address: paymasterAddress,\n abi: parseAbi(['function priceStalenessThreshold() view returns (uint256)']),\n functionName: 'priceStalenessThreshold'\n }) as bigint;\n } catch {}\n\n const isStale =\n cachedPrice === 0n ||\n cachedUpdatedAt === 0n ||\n (stalenessThreshold > 0n && cachedUpdatedAt + stalenessThreshold < now);\n\n if (isStale) {\n // Check if we're on testnet (chainId 11155111 = Sepolia, 11155420 = OP Sepolia)\n const chainId = client.chain?.id || await client.getChainId();\n const isTestnet = [11155111, 11155420, 31337].includes(chainId);\n\n if (isTestnet) {\n const updateHash = await wallet.writeContract({\n address: paymasterAddress,\n abi: parseAbi(['function updatePrice() external']),\n functionName: 'updatePrice'\n });\n await client.waitForTransactionReceipt({ hash: updateHash });\n console.log('[PaymasterClient] ✅ cachedPrice refreshed via updatePrice()');\n } else {\n throw new Error(\n `Paymaster cachedPrice is stale on Mainnet (chainId: ${chainId}). ` +\n `This requires Keeper to call updatePrice(). Please ensure Keeper is running.`\n );\n }\n }\n } catch (e: any) {\n // If error is our mainnet check, re-throw\n if (e.message?.includes('requires Keeper')) throw e;\n // Otherwise log and continue (might be old Paymaster without cachedPrice)\n console.log('[PaymasterClient] ⚠️ Failed to check cachedPrice:', e.message?.slice(0, 50));\n }\n }\n \n // 1. Construct a dummy UserOp for estimation\n let paymasterAndData: Hex;\n \n if (options?.operator) {\n paymasterAndData = buildSuperPaymasterData(paymasterAddress, options.operator, {\n verificationGasLimit: 300000n,\n postOpGasLimit: 300000n\n });\n } else {\n paymasterAndData = buildPaymasterData(paymasterAddress, token, {\n validityWindow: options?.validityWindow,\n verificationGasLimit: 250000n, \n postOpGasLimit: 150000n \n });\n }\n\n // 1.5. Get gas fees from network\n // Strategy: testnets use aggressive floor (bundlers require higher minimums);\n // mainnet uses dynamic estimation with 1.5x buffer for cost efficiency.\n const chainId = client.chain?.id || await client.getChainId();\n const isTestnet = [11155111, 11155420, 31337].includes(chainId);\n const TESTNET_PRIORITY_FLOOR = 500_000_000n; // 0.5 Gwei — Alchemy bundler minimum on testnets\n\n let maxFeePerGas = 0n;\n let maxPriorityFeePerGas = 0n;\n try {\n const feeData = await client.estimateFeesPerGas();\n maxFeePerGas = ((feeData.maxFeePerGas ?? 0n) * 115n) / 100n;\n maxPriorityFeePerGas = ((feeData.maxPriorityFeePerGas ?? 0n) * 115n) / 100n;\n } catch {}\n if (!maxFeePerGas) {\n try {\n const gasPrice = await client.getGasPrice();\n maxFeePerGas = (gasPrice * 120n) / 100n;\n } catch {}\n }\n // Testnet floor: bundlers like Alchemy require higher priority than network reports\n if (isTestnet) {\n if (maxPriorityFeePerGas < TESTNET_PRIORITY_FLOOR) maxPriorityFeePerGas = TESTNET_PRIORITY_FLOOR;\n if (maxFeePerGas < TESTNET_PRIORITY_FLOOR * 2n) maxFeePerGas = TESTNET_PRIORITY_FLOOR * 2n;\n }\n if (!maxFeePerGas) maxFeePerGas = 1n;\n if (maxFeePerGas < maxPriorityFeePerGas) maxFeePerGas = maxPriorityFeePerGas + 1n;\n\n const partialUserOp = {\n sender: aaAddress,\n nonce: 0n,\n initCode: (options?.factory && options?.factoryData) \n ? concat([options.factory, options.factoryData]) \n : '0x' as Hex,\n callData,\n accountGasLimits: concat([pad(toHex(250000n), { size: 16 }), pad(toHex(500000n), { size: 16 })]), \n preVerificationGas: 0n, \n gasFees: concat([pad(toHex(maxPriorityFeePerGas), { size: 16 }), pad(toHex(maxFeePerGas), { size: 16 })]),\n paymasterAndData,\n signature: PaymasterClient.makePlaceholderSignature(65)\n };\n\n // Get actual nonce\n try {\n const nonce = await client.readContract({\n address: aaAddress,\n abi: parseAbi(['function getNonce() view returns (uint256)']),\n functionName: 'getNonce'\n });\n partialUserOp.nonce = BigInt(nonce);\n } catch (e) {}\n\n partialUserOp.preVerificationGas = (PaymasterClient.estimatePreVerificationGasV07(partialUserOp) * 120n) / 100n + 5000n;\n\n const userOpHash = getUserOpHashV07(partialUserOp, entryPoint, BigInt(client.chain.id));\n partialUserOp.signature = await PaymasterClient.signUserOpHash(wallet, userOpHash, options?.airAccountSig);\n\n const payload = {\n jsonrpc: '2.0',\n id: 1,\n method: 'eth_estimateUserOperationGas',\n params: [formatUserOpV07(partialUserOp), entryPoint]\n };\n\n const response = await fetch(bundlerUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload, (_, v) => typeof v === 'bigint' ? '0x' + v.toString(16) : v)\n });\n\n const result = await response.json();\n \n // Debug logging for Candide\n if (bundlerUrl.includes('candide')) {\n console.log('[PaymasterClient] Candide Request:', JSON.stringify(payload.params[0], null, 2));\n console.log('[PaymasterClient] Candide Response:', JSON.stringify(result, null, 2));\n }\n\n const data = result.result;\n\n // Debug logging for estimation\n console.log('[PaymasterClient] Gas Estimation Result:', JSON.stringify(data, null, 2));\n\n // Anvil Fallback for Estimation\n if (result.error && (result.error.code === -32601 || result.error.message?.includes('Method not found'))) {\n console.log('[PaymasterClient] EstimateUserOp failed (Method not found). Using Anvil defaults.');\n return {\n preVerificationGas: partialUserOp.preVerificationGas,\n verificationGasLimit: 1000000n, \n callGasLimit: 2000000n,\n paymasterVerificationGasLimit: 100000n,\n paymasterPostOpGasLimit: 100000n\n };\n }\n\n if (result.error) throw new Error(`Estimation Error: ${JSON.stringify(result.error)}`);\n \n // Dynamic tuning: use estimated values directly to maintain efficiency\n // Bundler efficiency check: actual_used / limit >= 0.4\n const estVGL = BigInt(data.verificationGasLimit);\n const estPMVGL = data.paymasterVerificationGasLimit ? BigInt(data.paymasterVerificationGasLimit) : 100000n;\n\n return {\n preVerificationGas: (BigInt(data.preVerificationGas) * 120n) / 100n + 5000n,\n verificationGasLimit: tuneGasLimit(estVGL, 35_000n, 0.45), \n callGasLimit: (BigInt(data.callGasLimit) * 110n) / 100n, // Small 1.1x buffer\n paymasterVerificationGasLimit: tuneGasLimit(estPMVGL, 35_000n, 0.45),\n paymasterPostOpGasLimit: data.paymasterPostOpGasLimit ? BigInt(data.paymasterPostOpGasLimit) : 100000n\n };\n }\n\n /**\n * High-level API to submit a gasless UserOperation.\n * Automatically handles nonce fetching, gas estimation (if not provided), signing, and submission.\n */\n static async submitGaslessUserOperation(\n client: any,\n wallet: any,\n aaAddress: Address,\n entryPoint: Address,\n paymasterAddress: Address,\n token: Address,\n bundlerUrl: string,\n callData: `0x${string}`,\n options?: {\n validityWindow?: number;\n airAccountSig?: boolean; // v0.20.0 AirAccount: emit algId-prefixed [0x02] sig to avoid intermittent AA24\n verificationGasLimit?: bigint;\n callGasLimit?: bigint;\n preVerificationGas?: bigint;\n maxFeePerGas?: bigint;\n maxPriorityFeePerGas?: bigint;\n autoEstimate?: boolean;\n operator?: Address; // For SuperPaymaster\n paymasterVerificationGasLimit?: bigint;\n paymasterPostOpGasLimit?: bigint;\n factory?: Address;\n factoryData?: Hex;\n }\n ): Promise<`0x${string}`> {\n // 0. Auto-Estimate if requested or if limits missing\n let gasLimits = {\n preVerificationGas: options?.preVerificationGas,\n verificationGasLimit: options?.verificationGasLimit,\n callGasLimit: options?.callGasLimit,\n paymasterVerificationGasLimit: options?.paymasterVerificationGasLimit,\n paymasterPostOpGasLimit: options?.paymasterPostOpGasLimit ?? 200_000n\n };\n\n if (options?.autoEstimate !== false && (!gasLimits.verificationGasLimit || !gasLimits.callGasLimit)) {\n const est = await this.estimateUserOperationGas(\n client, wallet, aaAddress, entryPoint, paymasterAddress, token, bundlerUrl, callData,\n {\n validityWindow: options?.validityWindow,\n operator: options?.operator,\n factory: options?.factory,\n factoryData: options?.factoryData,\n airAccountSig: options?.airAccountSig // forward so internal estimate signs in the same format (#115 H-1)\n }\n );\n gasLimits.preVerificationGas = options?.preVerificationGas ?? est.preVerificationGas;\n gasLimits.verificationGasLimit = options?.verificationGasLimit ?? est.verificationGasLimit;\n gasLimits.callGasLimit = options?.callGasLimit ?? est.callGasLimit;\n gasLimits.paymasterVerificationGasLimit = options?.paymasterVerificationGasLimit ?? est.paymasterVerificationGasLimit;\n // SuperPaymaster postOp calls burnFromWithOpHash (~40k) + storage writes.\n // Apply 100k buffer with 200k floor. Pure BigInt to avoid Number precision loss.\n if (!options?.paymasterPostOpGasLimit) {\n const _base = est.paymasterPostOpGasLimit + 100_000n;\n gasLimits.paymasterPostOpGasLimit = _base > 200_000n ? _base : 200_000n;\n }\n }\n\n // 1. Get Nonce\n const nonce = await client.readContract({\n address: aaAddress,\n abi: parseAbi(['function getNonce() view returns (uint256)']),\n functionName: 'getNonce'\n });\n\n // 1.5 Get Gas Prices from Network if not provided\n // Strategy: testnets use aggressive floor; mainnet uses dynamic + 1.5x buffer\n const chainId = client.chain?.id || await client.getChainId();\n const isTestnet = [11155111, 11155420, 31337].includes(chainId);\n const TESTNET_PRIORITY_FLOOR = 500_000_000n; // 0.5 Gwei\n\n let maxFeePerGas = options?.maxFeePerGas;\n let maxPriorityFeePerGas = options?.maxPriorityFeePerGas;\n \n if (!maxFeePerGas || !maxPriorityFeePerGas) {\n try {\n const feeData = await client.estimateFeesPerGas();\n maxFeePerGas = maxFeePerGas ?? ((feeData.maxFeePerGas ?? 0n) * 115n) / 100n;\n maxPriorityFeePerGas = maxPriorityFeePerGas ?? ((feeData.maxPriorityFeePerGas ?? 0n) * 115n) / 100n;\n } catch (e) {\n maxFeePerGas = maxFeePerGas ?? undefined;\n maxPriorityFeePerGas = maxPriorityFeePerGas ?? undefined;\n }\n }\n if (!maxFeePerGas) {\n try {\n maxFeePerGas = (await client.getGasPrice()) * 150n / 100n;\n } catch {}\n }\n // Testnet floor: bundlers like Alchemy require higher priority than network reports\n if (isTestnet) {\n maxPriorityFeePerGas = maxPriorityFeePerGas ?? TESTNET_PRIORITY_FLOOR;\n if (maxPriorityFeePerGas < TESTNET_PRIORITY_FLOOR) maxPriorityFeePerGas = TESTNET_PRIORITY_FLOOR;\n if (!maxFeePerGas || maxFeePerGas < TESTNET_PRIORITY_FLOOR * 2n) maxFeePerGas = TESTNET_PRIORITY_FLOOR * 2n;\n }\n maxFeePerGas = maxFeePerGas ?? 1n;\n maxPriorityFeePerGas = maxPriorityFeePerGas ?? 0n;\n if (maxFeePerGas < maxPriorityFeePerGas) maxFeePerGas = maxPriorityFeePerGas + 1n;\n console.log(`[PaymasterClient] Gas Pricing: ${isTestnet ? 'TESTNET (0.5 Gwei floor)' : 'MAINNET (dynamic)'} | priority=${maxPriorityFeePerGas} maxFee=${maxFeePerGas}`);\n\n // 2. Build paymasterAndData\n let paymasterAndData: Hex;\n if (options?.operator) {\n paymasterAndData = buildSuperPaymasterData(paymasterAddress, options.operator, {\n verificationGasLimit: gasLimits.paymasterVerificationGasLimit ?? gasLimits.verificationGasLimit ?? 150000n,\n postOpGasLimit: gasLimits.paymasterPostOpGasLimit ?? 100000n\n });\n } else {\n // MATH: Target Efficiency = PVG / (PVG + VGL + PMVGL) >= 0.4\n // Since PVG is ~100k, (VGL + PMVGL) must be <= 150k.\n // We set each to 75k to safely pass the 0.4 efficiency guard.\n const pmVerGas = gasLimits.paymasterVerificationGasLimit ?? 75000n; \n \n paymasterAndData = buildPaymasterData(paymasterAddress, token, {\n validityWindow: options?.validityWindow,\n verificationGasLimit: pmVerGas,\n postOpGasLimit: gasLimits.paymasterPostOpGasLimit ?? 100000n\n });\n }\n\n // 3. Construct UserOp\n const initCode = ((options?.factory && options?.factoryData) ? concat([options.factory, options.factoryData]) : '0x') as Hex;\n const accountGasLimits = concat([\n pad(toHex(gasLimits.verificationGasLimit ?? 75000n), { size: 16 }),\n pad(toHex(gasLimits.callGasLimit ?? 500000n), { size: 16 })\n ]) as Hex;\n const gasFees = concat([\n pad(toHex(maxPriorityFeePerGas), { size: 16 }),\n pad(toHex(maxFeePerGas), { size: 16 })\n ]) as Hex;\n const preVerificationGas =\n gasLimits.preVerificationGas ??\n (PaymasterClient.estimatePreVerificationGasV07({\n sender: aaAddress,\n nonce: BigInt(nonce),\n initCode,\n callData,\n accountGasLimits,\n preVerificationGas: 0n,\n gasFees,\n paymasterAndData,\n signature: PaymasterClient.makePlaceholderSignature(65)\n }) * 120n) / 100n + 5000n;\n\n const userOp = {\n sender: aaAddress,\n nonce: BigInt(nonce),\n initCode,\n callData,\n accountGasLimits,\n preVerificationGas,\n gasFees,\n paymasterAndData,\n signature: '0x' as `0x${string}`\n };\n \n // Debug logs (Commented out for production)\n /*\n console.log(\"DEBUG: UserOp Gas Limits:\", {\n accountGasLimits: userOp.accountGasLimits,\n preVerificationGas: userOp.preVerificationGas,\n gasFees: userOp.gasFees,\n paymasterAndData: userOp.paymasterAndData\n });\n */\n\n\n // 4. Final Hashing and Signing\n const userOpHash = getUserOpHashV07(userOp, entryPoint, BigInt(client.chain.id));\n const signature = await PaymasterClient.signUserOpHash(wallet, userOpHash, options?.airAccountSig);\n userOp.signature = signature;\n\n\n // 6. Submit to Bundler (Unified JSON-RPC)\n const bundlerType = detectBundlerType(bundlerUrl);\n console.log(`[PaymasterClient] Using ${bundlerType} Bundler`);\n \n // Retry Loop: Up to 4 retries for compound errors (PVG + fee bump + replacement)\n for (let attempt = 0; attempt < 5; attempt++) {\n // Use standard JSON-RPC for all bundlers (Pimlico/Alchemy/Stackup/etc)\n const response = await fetch(bundlerUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 1,\n method: 'eth_sendUserOperation',\n params: [formatUserOpV07(userOp), entryPoint]\n }, (_, v) => typeof v === 'bigint' ? '0x' + v.toString(16) : v)\n });\n\n const result = await response.json();\n \n // 7. Error Handling & Retry Logic (Fee Bump)\n if (result.error && attempt < 4) {\n const msg = result.error.message || '';\n const errData = result.error.data || {};\n \n // Case A: Replacement Underpriced (Nonce collision in mempool)\n // e.g. {\"code\":-32602,\"message\":\"replacement underpriced\",\"data\":{\"currentMaxPriorityFee\":\"0x5f5e100\",\"currentMaxFee\":\"0xf6a44be\"}}\n if (result.error.code === -32602 || msg.includes('replacement underpriced')) {\n console.log(`[PaymasterClient] ⚠️ Replacement Underpriced. Bumping fees to replace pending UserOp...`);\n let newMaxPriority = userOp.gasFees ? BigInt('0x' + userOp.gasFees.slice(2, 34)) : 0n;\n let newMaxFee = userOp.gasFees ? BigInt('0x' + userOp.gasFees.slice(34)) : 0n;\n\n // Extract from data if available (Alchemy/Pimlico standard)\n if (errData.currentMaxPriorityFee && errData.currentMaxFee) {\n const currentPriority = BigInt(errData.currentMaxPriorityFee);\n const currentMax = BigInt(errData.currentMaxFee);\n \n // Bump by 10% to ensure replacement (Geth/Alchemy minimum)\n newMaxPriority = (currentPriority * 110n) / 100n;\n newMaxFee = (currentMax * 110n) / 100n;\n } else {\n // Fallback: Bump current values by 15% if data missing\n newMaxPriority = (newMaxPriority * 115n) / 100n;\n newMaxFee = (newMaxFee * 115n) / 100n;\n }\n\n console.log(` -> New Priority: ${newMaxPriority}, New MaxFee: ${newMaxFee}`);\n \n // Update UserOp\n userOp.gasFees = concat([\n pad(toHex(newMaxPriority), { size: 16 }),\n pad(toHex(newMaxFee), { size: 16 })\n ]) as Hex;\n\n // Re-Sign\n const newHash = getUserOpHashV07(userOp, entryPoint, BigInt(client.chain.id));\n userOp.signature = await PaymasterClient.signUserOpHash(wallet, newHash, options?.airAccountSig);\n \n continue; // Retry\n }\n\n // Case B: Priority Fee too low\n // e.g. \"maxPriorityFeePerGas ... is 1007884 but must be at least 100000000\"\n const matchPriority = msg.match(/maxPriorityFeePerGas.*(?:at least|expected) (\\d+)/i) || msg.match(/priority fee.*(?:at least|expected) (\\d+)/i);\n \n // Case C: Max Fee too low (often happens after bumping priority)\n // e.g. \"maxFeePerGas is 339637908 but must be at least 392531063\"\n const matchMaxFee = msg.match(/maxFeePerGas.*(?:at least|expected) (\\d+)/i);\n\n if (matchPriority || matchMaxFee) {\n console.log(`[PaymasterClient] ⚠️ Fee Error: ${msg}. Retrying with higher fees...`);\n \n let newMaxPriority = userOp.gasFees ? BigInt('0x' + userOp.gasFees.slice(2, 34)) : 0n;\n let newMaxFee = userOp.gasFees ? BigInt('0x' + userOp.gasFees.slice(34)) : 0n;\n\n if (matchPriority && matchPriority[1]) {\n const required = BigInt(matchPriority[1]);\n if (required > newMaxPriority) {\n console.log(` -> Bumping Priority Fee to ${required}`);\n // Bump maxFee by at least the delta\n const delta = required - newMaxPriority;\n newMaxPriority = required;\n newMaxFee += delta;\n }\n }\n\n if (matchMaxFee && matchMaxFee[1]) {\n const required = BigInt(matchMaxFee[1]);\n if (required > newMaxFee) {\n console.log(` -> Bumping Max Fee to ${required}`);\n newMaxFee = required;\n }\n }\n\n // Double check maxFee >= maxPriority\n if (newMaxFee < newMaxPriority) newMaxFee = newMaxPriority + 1n; // Minimal bump\n\n // Update UserOp\n userOp.gasFees = concat([\n pad(toHex(newMaxPriority), { size: 16 }),\n pad(toHex(newMaxFee), { size: 16 })\n ]) as Hex;\n\n // Re-Sign\n const newHash = getUserOpHashV07(userOp, entryPoint, BigInt(client.chain.id));\n userOp.signature = await PaymasterClient.signUserOpHash(wallet, newHash, options?.airAccountSig);\n \n continue; // Retry\n }\n\n // Case D: PreVerificationGas too low (common on L2s like Optimism)\n // e.g. \"precheck failed: preVerificationGas is 57368 but must be at least 108901\"\n const matchPVG = msg.match(/preVerificationGas.*(?:at least|expected) (\\d+)/i);\n if (matchPVG && matchPVG[1]) {\n const requiredPVG = BigInt(matchPVG[1]);\n const currentPVG = BigInt(userOp.preVerificationGas);\n \n if (requiredPVG > currentPVG) {\n console.log(`[PaymasterClient] ⚠️ PVG Error: ${msg}. Updating preVerificationGas...`);\n \n // Add 5% buffer to avoid \"chasing\" the requirement on L2s\n const bufferedPVG = (requiredPVG * 105n) / 100n;\n console.log(` -> Updating PVG from ${currentPVG} to ${bufferedPVG} (inc. buffer)`);\n \n // Update PVG and re-sign\n userOp.preVerificationGas = bufferedPVG;\n const newHash = getUserOpHashV07(userOp, entryPoint, BigInt(client.chain.id));\n userOp.signature = await PaymasterClient.signUserOpHash(wallet, newHash, options?.airAccountSig);\n \n continue; // Retry\n }\n }\n }\n\n if (result.error && (result.error.code === -32601 || result.error.message?.includes('Method not found'))) {\n console.log('[PaymasterClient] SendUserOp failed (Method not found). Falling back to direct handleOps...');\n \n const caller = wallet.account?.address ? wallet.account.address : wallet.account;\n\n return await wallet.writeContract({\n address: entryPoint,\n abi: parseAbi(['function handleOps((address,uint256,bytes,bytes,bytes32,uint256,bytes32,bytes,bytes)[], address) external']),\n functionName: 'handleOps',\n args: [[userOp], caller],\n chain: wallet.chain,\n account: wallet.account\n });\n }\n\n if (result.error) throw new Error(`Bundler Error: ${JSON.stringify(result.error)}`);\n console.log('[PaymasterClient] ✅ Submitted via', bundlerType, 'hash:', result.result);\n return result.result;\n }\n\n throw new Error(\"Failed to submit UserOp after retries\");\n }\n\n /**\n * Helper to extract the actual Gas Token fee from a UserOperation receipt.\n * Looks for the 'PostOpProcessed' event emitted by the Paymaster.\n */\n static getFeeFromReceipt(receipt: any, paymasterAddress: Address): { tokenCost: bigint, actualGasCostWei: bigint } | null {\n // Event Signature: PostOpProcessed(address indexed user, address indexed token, uint256 actualGasCostWei, uint256 tokenCost, uint256 protocolRevenue)\n // Topic0: 0x62544d7f48b11c32334310ebd306b47224fca220163218d4a7264322c52ae073\n const TOPIC_POST_OP = '0x62544d7f48b11c32334310ebd306b47224fca220163218d4a7264322c52ae073';\n\n for (const log of receipt.logs) {\n if (log.address.toLowerCase() === paymasterAddress.toLowerCase() && log.topics[0] === TOPIC_POST_OP) {\n // Decode Data: actualGasCostWei, tokenCost, protocolRevenue (3x uint256)\n // We manually decode or use viem's decodeEventLog if available.\n // Here we use a lightweight manual decode for the data part (non-indexed).\n // Data is 3 * 32 bytes.\n const data = log.data.replace('0x', '');\n if (data.length >= 192) { // 3 * 64 hex chars = 192\n const actualGasCostWei = BigInt('0x' + data.slice(0, 64));\n const tokenCost = BigInt('0x' + data.slice(64, 128));\n // const protocolRevenue = BigInt('0x' + data.slice(128, 192));\n return { tokenCost, actualGasCostWei };\n }\n }\n }\n return null;\n }\n\n /**\n * Get the fee for a specific transaction hash.\n * Fetches the receipt (no scanning required) and decodes the log.\n */\n static async getTransactionFee(publicClient: any, txHash: `0x${string}`, paymasterAddress: Address) {\n const receipt = await publicClient.getTransactionReceipt({ hash: txHash });\n return this.getFeeFromReceipt(receipt, paymasterAddress);\n }\n\n // ===========================================\n // 🛠️ Semantic CallData Builders (For DX)\n // ===========================================\n\n /**\n * Helper: Encode a standardized ERC-20 Transfer.\n * Returns the raw function data: `transfer(to, amount)`\n */\n static encodeTokenTransfer(recipient: Address, amount: bigint): `0x${string}` {\n return encodeFunctionData({\n abi: parseAbi(['function transfer(address to, uint256 amount) external returns (bool)']),\n functionName: 'transfer',\n args: [recipient, amount]\n });\n }\n\n /**\n * Helper: Encode a SimpleAccount execution.\n * Wraps the inner call into: `execute(target, value, data)`\n * This is the payload signed by the user.\n */\n static encodeExecution(target: Address, value: bigint, data: `0x${string}`): `0x${string}` {\n return encodeFunctionData({\n abi: parseAbi(['function execute(address dest, uint256 value, bytes func) external']),\n functionName: 'execute',\n args: [target, value, data]\n });\n }\n\n /**\n * More robust version of waitForUserOperationReceipt.\n * Catches timeouts and returns a cleaner result.\n */\n static async waitForUserOperation(bundlerClient: any, hash: `0x${string}`, timeout = 180000) {\n try {\n return await bundlerClient.waitForUserOperationReceipt({ hash, timeout });\n } catch (error: any) {\n const errName = error.name || '';\n const errMsg = error.message || '';\n if (\n errName === 'TimeoutError' || \n errName === 'WaitForUserOperationReceiptTimeoutError' || \n /timed? out/i.test(errMsg)\n ) {\n return { timeout: true, hash };\n }\n throw error;\n }\n }\n}\n","import { type Address, parseAbi } from 'viem';\nimport { type GaslessReadinessReport, type PaymasterV4MiddlewareConfig } from './PaymasterUtils';\n\n/**\n * PaymasterOperator\n * Focus: Deployment, Configuration, Maintenance, Keeper Bots.\n */\nexport class PaymasterOperator {\n\n /**\n * Update the cached ETH/USD price from Chainlink Oracle.\n * Must be called if cachedPrice is 0 (uninitialized).\n */\n static async updatePrice(wallet: any, address: Address) {\n return wallet.writeContract({\n address,\n abi: parseAbi(['function updatePrice() external']),\n functionName: 'updatePrice',\n chain: wallet.chain\n } as any);\n }\n\n /**\n * Set the token price (in 8 decimals, e.g., 1e8 = $1 USD).\n */\n static async setTokenPrice(wallet: any, address: Address, token: Address, priceUSD: bigint) {\n return wallet.writeContract({\n address,\n abi: parseAbi(['function setTokenPrice(address token, uint256 price) external']),\n functionName: 'setTokenPrice',\n args: [token, priceUSD],\n chain: wallet.chain\n } as any);\n }\n\n static async getCachedPrice(publicClient: any, address: Address): Promise<{ price: bigint; updatedAt: bigint }> {\n const result = await publicClient.readContract({\n address,\n abi: [{\n name: 'cachedPrice',\n type: 'function',\n inputs: [],\n outputs: [\n { name: 'price', type: 'uint208' },\n { name: 'updatedAt', type: 'uint48' }\n ],\n stateMutability: 'view'\n }],\n functionName: 'cachedPrice'\n });\n return { price: result[0], updatedAt: result[1] };\n }\n\n static async getTokenPrice(publicClient: any, address: Address, token: Address): Promise<bigint> {\n return publicClient.readContract({\n address,\n abi: [{\n name: 'tokenPrices',\n type: 'function',\n inputs: [{ name: 'token', type: 'address' }],\n outputs: [{ name: '', type: 'uint256' }],\n stateMutability: 'view'\n }],\n functionName: 'tokenPrices',\n args: [token]\n });\n }\n\n static async getDepositedBalance(publicClient: any, address: Address, user: Address, token: Address): Promise<bigint> {\n return publicClient.readContract({\n address,\n abi: [{\n name: 'balances',\n type: 'function',\n inputs: [\n { name: 'user', type: 'address' },\n { name: 'token', type: 'address' }\n ],\n outputs: [{ name: '', type: 'uint256' }],\n stateMutability: 'view'\n }],\n functionName: 'balances',\n args: [user, token]\n });\n }\n\n static async ensurePriceInitialized(wallet: any, publicClient: any, address: Address): Promise<boolean> {\n const { price } = await this.getCachedPrice(publicClient, address);\n if (price === 0n) {\n await this.updatePrice(wallet, address);\n return true;\n }\n return false;\n }\n\n static async addStake(wallet: any, address: Address, amount: bigint, unstakeDelaySec: number) {\n return wallet.writeContract({\n address,\n abi: parseAbi(['function addStake(uint32 unstakeDelaySec) external payable']),\n functionName: 'addStake',\n args: [unstakeDelaySec],\n value: amount,\n chain: wallet.chain\n } as any);\n }\n\n static async addDeposit(wallet: any, address: Address, amount: bigint) {\n return wallet.writeContract({\n address,\n abi: parseAbi(['function addDeposit() external payable']),\n functionName: 'addDeposit',\n value: amount,\n chain: wallet.chain\n } as any);\n }\n\n static async addGasToken(wallet: any, address: Address, token: Address) {\n return wallet.writeContract({\n address,\n abi: ['function addGasToken(address token)'],\n functionName: 'addGasToken',\n args: [token],\n chain: wallet.chain\n } as any);\n }\n\n static async removeGasToken(wallet: any, address: Address, token: Address) {\n return wallet.writeContract({\n address,\n abi: ['function removeGasToken(address token)'],\n functionName: 'removeGasToken',\n args: [token],\n chain: wallet.chain\n } as any);\n }\n\n static async setServiceFeeRate(wallet: any, address: Address, rate: bigint) {\n return wallet.writeContract({\n address,\n abi: ['function setServiceFeeRate(uint256 rate)'],\n functionName: 'setServiceFeeRate',\n args: [rate],\n chain: wallet.chain\n } as any);\n }\n\n static async setMaxGasCostCap(wallet: any, address: Address, cap: bigint) {\n return wallet.writeContract({\n address,\n abi: ['function setMaxGasCostCap(uint256 cap)'],\n functionName: 'setMaxGasCostCap',\n args: [cap],\n chain: wallet.chain\n } as any);\n }\n\n static async withdrawPNT(wallet: any, address: Address, to: Address, token: Address, amount: bigint) {\n return wallet.writeContract({\n address,\n abi: ['function withdrawPNT(address to, address token, uint256 amount)'],\n functionName: 'withdrawPNT',\n args: [to, token, amount],\n chain: wallet.chain\n } as any);\n }\n \n // --- Diagnostics & Automation ---\n\n static async checkGaslessReadiness(\n publicClient: any,\n entryPoint: Address,\n paymasterAddress: Address,\n user: Address,\n token: Address\n ): Promise<GaslessReadinessReport> {\n const issues: string[] = [];\n \n // 1. EntryPoint Stake/Deposit\n const depositInfo = await publicClient.readContract({\n address: entryPoint,\n abi: parseAbi(['function getDepositInfo(address account) external view returns (uint256 deposit, bool staked, uint256 stake, uint32 unstakeDelaySec, uint48 withdrawTime)']),\n functionName: 'getDepositInfo',\n args: [paymasterAddress]\n });\n\n if (depositInfo[2] < 50000000000000000n) issues.push('Paymaster stake in EntryPoint is less than 0.05 ETH');\n if (depositInfo[3] < 86400) issues.push('Paymaster unstake delay is less than 1 day');\n if (depositInfo[0] < 100000000000000000n) issues.push('Paymaster deposit in EntryPoint is less than 0.1 ETH');\n\n // 2. Oracle Price\n const ethPrice = await publicClient.readContract({\n address: paymasterAddress,\n abi: parseAbi(['function cachedPrice() external view returns (uint208 price, uint48 updatedAt)']),\n functionName: 'cachedPrice'\n }).catch(() => [0n, 0n] as const);\n\n if (ethPrice[0] === 0n) issues.push('Paymaster ETH/USD price not initialized');\n\n // 3. Token Support & Price\n const [tokenPrice, userTokenBal, userPMDeposit] = await Promise.all([\n this.getTokenPrice(publicClient, paymasterAddress, token),\n publicClient.readContract({\n address: token,\n abi: parseAbi(['function balanceOf(address account) external view returns (uint256)']),\n functionName: 'balanceOf',\n args: [user]\n }),\n this.getDepositedBalance(publicClient, paymasterAddress, user, token)\n ]);\n\n if (tokenPrice === 0n) issues.push('Token price not set in Paymaster');\n if (userPMDeposit === 0n) issues.push('User has no deposit in Paymaster');\n\n return {\n isReady: issues.length === 0,\n issues,\n details: {\n paymasterStake: depositInfo[2],\n paymasterDeposit: depositInfo[0],\n ethUsdPrice: ethPrice.price,\n tokenSupported: true,\n tokenPrice: tokenPrice,\n userTokenBalance: userTokenBal,\n userPaymasterDeposit: userPMDeposit\n }\n };\n }\n\n static async prepareGaslessEnvironment(\n operatorWallet: any,\n publicClient: any,\n entryPoint: Address,\n paymasterAddress: Address,\n token: Address,\n options: {\n minStake?: bigint;\n minDeposit?: bigint;\n tokenPriceUSD?: bigint;\n } = {}\n ) {\n const report = await this.checkGaslessReadiness(publicClient, entryPoint, paymasterAddress, operatorWallet.account.address, token);\n const results: { step: string, hash?: string, status: string }[] = [];\n\n // 1. Stake\n if (report.details.paymasterStake < (options.minStake || 50000000000000000n)) {\n const hash = await this.addStake(operatorWallet, paymasterAddress, options.minStake || 50000000000000000n, 86400);\n await publicClient.waitForTransactionReceipt({ hash });\n results.push({ step: 'Stake', hash, status: 'Confirmed' });\n }\n\n // 2. Deposit (EntryPoint)\n if (report.details.paymasterDeposit < (options.minDeposit || 100000000000000000n)) {\n const hash = await this.addDeposit(operatorWallet, paymasterAddress, options.minDeposit || 300000000000000000n);\n await publicClient.waitForTransactionReceipt({ hash });\n results.push({ step: 'Deposit', hash, status: 'Confirmed' });\n }\n\n // 3. Oracle Price\n if (report.details.ethUsdPrice === 0n) {\n const hash = await this.updatePrice(operatorWallet, paymasterAddress);\n await publicClient.waitForTransactionReceipt({ hash });\n results.push({ step: 'OraclePrice', hash, status: 'Confirmed' });\n }\n\n // 4. Token Support & Price\n if (report.details.tokenPrice === 0n) {\n try {\n const hash = await this.addGasToken(operatorWallet, paymasterAddress, token);\n await publicClient.waitForTransactionReceipt({ hash });\n results.push({ step: 'AddGasToken', hash, status: 'Confirmed' });\n } catch (e) {}\n\n if (options.tokenPriceUSD) {\n const hash = await this.setTokenPrice(operatorWallet, paymasterAddress, token, options.tokenPriceUSD);\n await publicClient.waitForTransactionReceipt({ hash });\n results.push({ step: 'TokenPrice', hash, status: 'Confirmed' });\n }\n }\n\n return results;\n }\n}\n","import { type Address, type Hex, concat, pad, toHex, encodeFunctionData, parseAbi } from 'viem';\nimport { type PublicClient } from '@aastar/core';\nimport { PaymasterClient } from './PaymasterClient';\nimport { buildSuperPaymasterData, formatUserOpV07, getUserOpHashV07, tuneGasLimit } from './PaymasterUtils';\n\nexport type GaslessTransactionConfig = {\n token: Address;\n recipient: Address;\n amount: bigint;\n operator: Address;\n paymasterAddress: Address;\n factory?: Address;\n factoryData?: Hex;\n};\n\n/**\n * SuperPaymasterClient\n * High-level API for SuperPaymaster operations, including dynamic gas estimation.\n */\nexport class SuperPaymasterClient {\n /**\n * @private\n * Static utility class, should not be instantiated.\n */\n private constructor() {}\n\n\n /**\n * Submit a gasless transaction using SuperPaymaster.\n * Automatically handles gas estimation with a smart efficiency buffer.\n */\n static async submitGaslessTransaction(\n client: any,\n wallet: any,\n aaAddress: Address,\n entryPoint: Address,\n bundlerUrl: string,\n config: GaslessTransactionConfig\n ): Promise<Hex> {\n \n // 1. Prepare Calldata (Standard ERC20 Transfer)\n const callData = encodeFunctionData({\n abi: parseAbi(['function execute(address dest, uint256 value, bytes func) external']),\n functionName: 'execute',\n args: [\n config.token,\n 0n,\n encodeFunctionData({\n abi: parseAbi(['function transfer(address to, uint256 amount) external returns (bool)']),\n functionName: 'transfer',\n args: [config.recipient, config.amount]\n })\n ]\n });\n\n // 2. Initial Gas Estimation (Bundler Query)\n console.log(`[SuperPaymasterClient] 🎯 Target Info:`);\n console.log(` - Paymaster: ${config.paymasterAddress}`);\n console.log(` - Token: ${config.token}`);\n console.log(` - Operator: ${config.operator}`);\n\n console.log('[SuperPaymasterClient] ☁️ Estimating Gas usage...');\n const est = await PaymasterClient.estimateUserOperationGas(\n client,\n wallet,\n aaAddress,\n entryPoint,\n config.paymasterAddress,\n config.token,\n bundlerUrl,\n callData,\n { \n operator: config.operator,\n factory: config.factory,\n factoryData: config.factoryData\n }\n );\n\n console.log('[SuperPaymasterClient] ☁️ Bundler Estimates:', est);\n\n // 3. Apply Smart Buffer Strategy\n // We need to ensure:\n // A. verificationGasLimit >= est.verificationGasLimit (Bundler's minimum)\n // B. verificationGasLimit >= SuperPaymaster's Actual Usage (~80k-100k)\n // C. verificationGasLimit / PreVerificationGas > 0.4 (Efficiency Ratio) PRE-CHECK\n // Actually, the Bundler checks: (gas limits) / (actual gas used) > efficiency.\n // So we must NOT set limits WAY higher than actual usage. \n // Best strategy: Use Bundler's Estimate + Small Buffer (e.g. 10-20k).\n \n // SuperPaymaster Logic Cost: ~80,000 to 120,000 gas depending on cold storage\n // Bundler Estimate usually returns the *actual execution path* gas.\n \n\n\n // CRITICAL FIX: Set paymasterVerificationGasLimit for optimal efficiency\n // Bundler requires efficiency ratio >= 0.4 (actual_gas_used / gas_limit >= 0.4)\n // SuperPaymaster validatePaymasterUserOp uses ~110-120k gas (measured)\n // Analysis (Jan 19 Update-Final-Final):\n // Instead of fixed percentage, use \"Dynamic Nominal Gas Tuning\".\n // SuperPaymaster validation common case is ~58k-66k. Worst case (refresh) 115k.\n // Setting nominal benchmark to 60k gives Ceiling = 60k / 0.45 = 133,333.\n // This satisfies 0.4 efficiency (58/133=0.43) AND execution (115 < 133).\n \n // 1. Tune Account Verification Gas Limit (VGL)\n // Bundler might return huge VGL (e.g. 250k) which kills efficiency if usage is low.\n // We need to clamp VGL down closer to actual usage.\n // Let's assume standard account validation + execution is ~35k.\n // Target: 35k / 0.45 = 77k Limit.\n const tunedVGL = tuneGasLimit(est.verificationGasLimit, 35_000n, 0.45);\n\n // 2. Tune Paymaster Verification Gas Limit (PMVGL)\n // Ensure bundler estimate is respected as floor for PMVGL\n const bundlerEstimateVGL = est.paymasterVerificationGasLimit || 100000n;\n const tunedPMVerificationGas = tuneGasLimit(bundlerEstimateVGL, 60_000n, 0.45);\n\n // SuperPaymaster postOp calls burnFromWithOpHash (~40k gas) + storage writes.\n // Add 100k buffer; floor at 200k to prevent OOG. Pure BigInt to avoid Number precision loss.\n const _postOpBase = est.paymasterPostOpGasLimit + 100_000n;\n const tunedPostOp = _postOpBase > 200_000n ? _postOpBase : 200_000n;\n\n console.log(`[SuperPaymasterClient] 🔧 Tuned Limits: VGL=${tunedVGL}, PMVGL=${tunedPMVerificationGas}, PostOp=${tunedPostOp}`);\n\n // 4. Submit with Tuned Limits\n return PaymasterClient.submitGaslessUserOperation(\n client,\n wallet,\n aaAddress,\n entryPoint,\n config.paymasterAddress,\n config.token,\n bundlerUrl,\n callData,\n {\n operator: config.operator,\n verificationGasLimit: tunedVGL,\n callGasLimit: est.callGasLimit, \n preVerificationGas: est.preVerificationGas,\n paymasterVerificationGasLimit: tunedPMVerificationGas, // EXPLICIT PM LIMIT\n paymasterPostOpGasLimit: tunedPostOp,\n autoEstimate: false, // We did it ourselves\n factory: config.factory,\n factoryData: config.factoryData\n }\n );\n }\n}\n","import { type Address, type Hex } from 'viem';\nimport {\n buildPaymasterData as buildPaymasterDataV4,\n buildSuperPaymasterData\n} from './V4/PaymasterUtils.js';\n\n/**\n * Supported paymaster types.\n * - 'v4' → PaymasterV4 layout (84 bytes): [paymaster(20)][verGas(16)][postGas(16)][token(20)][validUntil(6)][validAfter(6)]\n * - 'super' → SuperPaymaster layout (104 bytes): [paymaster(20)][verGas(16)][postGas(16)][operator(20)][maxRate(32)]\n */\nexport type PaymasterType = 'v4' | 'super';\n\n/**\n * Unified parameters for building `paymasterAndData`.\n *\n * The byte layout differs by paymaster type; this shape carries the union of\n * both packers' inputs. `buildPaymasterData` validates that the fields required\n * for the resolved type are present, and dispatches to the correct existing\n * packer. Callers no longer need to know which format a given paymaster uses.\n */\nexport interface BuildPaymasterDataParams {\n /**\n * Explicit paymaster type. Preferred over address-based heuristics.\n * If omitted, the type is resolved from `paymasterAddress` against the\n * manager's registered known-paymaster map (throws if unresolved).\n */\n type?: PaymasterType;\n /** Paymaster contract address (first 20 bytes of the layout). */\n paymasterAddress: Address;\n /** Paymaster verification gas limit (16-byte field, both layouts). */\n verificationGasLimit?: bigint;\n /** Paymaster postOp gas limit (16-byte field, both layouts). */\n postOpGasLimit?: bigint;\n\n // ── PaymasterV4-specific fields ──\n /** Gas token address. Required for type 'v4'. */\n token?: Address;\n /** Validity window in seconds (used to compute validUntil/validAfter). 'v4' only. */\n validityWindow?: number;\n\n // ── SuperPaymaster-specific fields ──\n /** Operator address. Required for type 'super'. */\n operator?: Address;\n /** Optional max rate commitment (rug-pull protection). 'super' only. */\n maxRate?: bigint;\n}\n\n/**\n * PaymasterManager — unifies the per-type `paymasterAndData` packers behind a\n * single `buildPaymasterData` entry point that AUTO-SELECTS the correct byte\n * format by paymaster type.\n *\n * Type resolution order:\n * 1. Explicit `params.type` (preferred — no guessing).\n * 2. Address-based lookup against the registered known-paymaster map.\n *\n * The underlying packers (`buildPaymasterData` / `buildSuperPaymasterData` in\n * PaymasterUtils) remain exported and are reused verbatim here — this class\n * does NOT reimplement byte-packing.\n */\nexport class PaymasterManager {\n private readonly knownPaymasters: Map<string, PaymasterType>;\n\n constructor(opts?: { knownPaymasters?: Record<string, PaymasterType> }) {\n this.knownPaymasters = new Map();\n if (opts?.knownPaymasters) {\n for (const [address, type] of Object.entries(opts.knownPaymasters)) {\n this.setKnownPaymaster(address as Address, type);\n }\n }\n }\n\n /**\n * Register a known paymaster address → type mapping so that callers can\n * omit the explicit `type` and have it resolved from the address.\n */\n registerPaymaster(address: Address, type: PaymasterType): void {\n this.setKnownPaymaster(address, type);\n }\n\n /**\n * Record an address → type mapping, throwing on a CONFLICTING re-registration.\n * Silently overwriting a v4 address with `super` (or vice-versa) would later\n * pack the wrong-length paymasterData for a `type`-less call, so a conflicting\n * re-registration is treated as a programmer error. Re-registering the SAME\n * type (including a case-variant of the address) is an idempotent no-op.\n */\n private setKnownPaymaster(address: Address, type: PaymasterType): void {\n const normalized = address.toLowerCase();\n const existing = this.knownPaymasters.get(normalized);\n if (existing && existing !== type) {\n throw new Error(\n `Paymaster ${address} is already registered as '${existing}'; ` +\n `refusing to re-register as '${type}'`\n );\n }\n this.knownPaymasters.set(normalized, type);\n }\n\n /**\n * Resolve a paymaster's type from a registered address. Returns undefined\n * if the address is not registered.\n */\n resolveType(address: Address): PaymasterType | undefined {\n return this.knownPaymasters.get(address.toLowerCase());\n }\n\n /**\n * Build `paymasterAndData`, auto-selecting the correct byte layout for the\n * paymaster type. Dispatches to the existing per-type packers.\n */\n buildPaymasterData(params: BuildPaymasterDataParams): Hex {\n const type = params.type ?? this.resolveType(params.paymasterAddress);\n if (!type) {\n throw new Error(\n `PaymasterManager: cannot resolve paymaster type for ${params.paymasterAddress}. ` +\n `Pass an explicit \\`type\\` ('v4' | 'super') or register the address via registerPaymaster().`\n );\n }\n return PaymasterManager.dispatch(type, params);\n }\n\n /**\n * Static helper: build `paymasterAndData` for an explicit type without an\n * instance. Useful when the caller already knows the type.\n */\n static buildPaymasterData(type: PaymasterType, params: Omit<BuildPaymasterDataParams, 'type'>): Hex {\n return PaymasterManager.dispatch(type, params);\n }\n\n private static dispatch(type: PaymasterType, params: BuildPaymasterDataParams): Hex {\n switch (type) {\n case 'v4': {\n if (!params.token) {\n throw new Error(\"PaymasterManager: type 'v4' requires `token`.\");\n }\n return buildPaymasterDataV4(params.paymasterAddress, params.token, {\n validityWindow: params.validityWindow,\n verificationGasLimit: params.verificationGasLimit,\n postOpGasLimit: params.postOpGasLimit\n });\n }\n case 'super': {\n if (!params.operator) {\n throw new Error(\"PaymasterManager: type 'super' requires `operator`.\");\n }\n return buildSuperPaymasterData(params.paymasterAddress, params.operator, {\n verificationGasLimit: params.verificationGasLimit,\n postOpGasLimit: params.postOpGasLimit,\n maxRate: params.maxRate\n });\n }\n default: {\n // Exhaustiveness guard.\n const _never: never = type;\n throw new Error(`PaymasterManager: unsupported paymaster type '${_never}'.`);\n }\n }\n }\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkTS5CXRNI_cjs = require('./chunk-TS5CXRNI.cjs');
|
|
4
4
|
var viem = require('viem');
|
|
5
5
|
|
|
6
6
|
var STAKING_ABI = viem.parseAbi([
|
|
@@ -28,7 +28,7 @@ var FinanceClient = class _FinanceClient {
|
|
|
28
28
|
static async depositToPaymaster(wallet, paymaster, amount) {
|
|
29
29
|
return wallet.writeContract({
|
|
30
30
|
address: paymaster,
|
|
31
|
-
abi:
|
|
31
|
+
abi: chunkTS5CXRNI_cjs.SuperPaymasterABI,
|
|
32
32
|
functionName: "deposit",
|
|
33
33
|
args: [amount],
|
|
34
34
|
chain: wallet.chain
|
|
@@ -65,7 +65,7 @@ var FinanceClient = class _FinanceClient {
|
|
|
65
65
|
static async withdrawProtocolRevenue(wallet, paymaster, to, amount) {
|
|
66
66
|
return wallet.writeContract({
|
|
67
67
|
address: paymaster,
|
|
68
|
-
abi:
|
|
68
|
+
abi: chunkTS5CXRNI_cjs.SuperPaymasterABI,
|
|
69
69
|
functionName: "withdrawProtocolRevenue",
|
|
70
70
|
args: [to, amount],
|
|
71
71
|
chain: wallet.chain
|
|
@@ -95,7 +95,7 @@ var FinanceClient = class _FinanceClient {
|
|
|
95
95
|
static async operatorDeposit(wallet, paymaster, amount) {
|
|
96
96
|
return wallet.writeContract({
|
|
97
97
|
address: paymaster,
|
|
98
|
-
abi:
|
|
98
|
+
abi: chunkTS5CXRNI_cjs.SuperPaymasterABI,
|
|
99
99
|
functionName: "deposit",
|
|
100
100
|
args: [amount],
|
|
101
101
|
chain: wallet.chain
|
|
@@ -105,7 +105,7 @@ var FinanceClient = class _FinanceClient {
|
|
|
105
105
|
static async operatorNotifyDeposit(wallet, paymaster, amount) {
|
|
106
106
|
return wallet.writeContract({
|
|
107
107
|
address: paymaster,
|
|
108
|
-
abi:
|
|
108
|
+
abi: chunkTS5CXRNI_cjs.SuperPaymasterABI,
|
|
109
109
|
functionName: "notifyDeposit",
|
|
110
110
|
args: [amount],
|
|
111
111
|
chain: wallet.chain
|
|
@@ -116,7 +116,7 @@ var FinanceClient = class _FinanceClient {
|
|
|
116
116
|
* Get GToken balance
|
|
117
117
|
*/
|
|
118
118
|
async getGTokenBalance(address) {
|
|
119
|
-
const { CORE_ADDRESSES } = await import('./src-
|
|
119
|
+
const { CORE_ADDRESSES } = await import('./src-UQ4RDCJG.cjs');
|
|
120
120
|
return this.publicClient.readContract({
|
|
121
121
|
address: CORE_ADDRESSES.gToken,
|
|
122
122
|
abi: ERC20_ABI,
|
|
@@ -128,7 +128,7 @@ var FinanceClient = class _FinanceClient {
|
|
|
128
128
|
* Get aPNTs balance
|
|
129
129
|
*/
|
|
130
130
|
async getAPNTsBalance(address) {
|
|
131
|
-
const { CORE_ADDRESSES } = await import('./src-
|
|
131
|
+
const { CORE_ADDRESSES } = await import('./src-UQ4RDCJG.cjs');
|
|
132
132
|
return this.publicClient.readContract({
|
|
133
133
|
address: CORE_ADDRESSES.aPNTs,
|
|
134
134
|
abi: ERC20_ABI,
|
|
@@ -145,7 +145,7 @@ var FinanceClient = class _FinanceClient {
|
|
|
145
145
|
async approveAndStake(amount) {
|
|
146
146
|
const account = this.walletClient.account;
|
|
147
147
|
if (!account) throw new Error("Account required");
|
|
148
|
-
const { CORE_ADDRESSES } = await import('./src-
|
|
148
|
+
const { CORE_ADDRESSES } = await import('./src-UQ4RDCJG.cjs');
|
|
149
149
|
const gTokenAddress = CORE_ADDRESSES.gToken;
|
|
150
150
|
const stakingAddress = CORE_ADDRESSES.gTokenStaking;
|
|
151
151
|
const allowance = await this.publicClient.readContract({
|
|
@@ -174,7 +174,7 @@ var FinanceClient = class _FinanceClient {
|
|
|
174
174
|
* Get circulating supply (total - locked)
|
|
175
175
|
*/
|
|
176
176
|
async getCirculatingSupply() {
|
|
177
|
-
const { CORE_ADDRESSES } = await import('./src-
|
|
177
|
+
const { CORE_ADDRESSES } = await import('./src-UQ4RDCJG.cjs');
|
|
178
178
|
const gTokenAddress = CORE_ADDRESSES.gToken;
|
|
179
179
|
const total = await this.publicClient.readContract({
|
|
180
180
|
address: gTokenAddress,
|
|
@@ -192,7 +192,7 @@ var FinanceClient = class _FinanceClient {
|
|
|
192
192
|
* Get comprehensive tokenomics data
|
|
193
193
|
*/
|
|
194
194
|
async getTokenomicsOverview() {
|
|
195
|
-
const { CORE_ADDRESSES } = await import('./src-
|
|
195
|
+
const { CORE_ADDRESSES } = await import('./src-UQ4RDCJG.cjs');
|
|
196
196
|
const [totalSupply, totalStaked, blackholeBalance] = await Promise.all([
|
|
197
197
|
this.publicClient.readContract({
|
|
198
198
|
address: CORE_ADDRESSES.gToken,
|
|
@@ -224,5 +224,5 @@ var FinanceClient = class _FinanceClient {
|
|
|
224
224
|
};
|
|
225
225
|
|
|
226
226
|
exports.FinanceClient = FinanceClient;
|
|
227
|
-
//# sourceMappingURL=chunk-
|
|
228
|
-
//# sourceMappingURL=chunk-
|
|
227
|
+
//# sourceMappingURL=chunk-BLA57KBS.cjs.map
|
|
228
|
+
//# sourceMappingURL=chunk-BLA57KBS.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../tokens/src/index.ts"],"names":["parseAbi","SuperPaymasterABI","formatEther"],"mappings":";;;;;AAGA,IAAM,cAAcA,aAAA,CAAS;AAAA,EACzB,yBAAA;AAAA,EACA;AACJ,CAAC,CAAA;AAED,IAAM,YAAYA,aAAA,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,EAAKC,mCAAA;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,EAAKA,mCAAA;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,EAAKD,aAAA,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,EAAKA,aAAA,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,EAAKC,mCAAA;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,EAAKA,mCAAA;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,oBAAc,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,oBAAc,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,oBAAc,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,EAAKD,aAAA,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,EAA6BE,gBAAA,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,EAAKF,aAAA,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,oBAAc,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,oBAAc,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,EAAKA,aAAA,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,EAAKA,aAAA,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,EAAKA,aAAA,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,CAAOE,gBAAA,CAAY,WAAW,CAAC,IAAI,MAAA,CAAOA,gBAAA,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-Y4EJX7UA.cjs","sourcesContent":["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"]}
|
|
1
|
+
{"version":3,"sources":["../../tokens/src/index.ts"],"names":["parseAbi","SuperPaymasterABI","formatEther"],"mappings":"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","file":"chunk-BLA57KBS.cjs","sourcesContent":["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"]}
|