@pafi-dev/core 0.9.6 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/README.md +146 -188
  2. package/dist/abi/index.cjs +2 -2
  3. package/dist/abi/index.cjs.map +1 -1
  4. package/dist/abi/index.d.cts +58 -106
  5. package/dist/abi/index.d.ts +58 -106
  6. package/dist/abi/index.js +3 -3
  7. package/dist/{chunk-Y5EYH2SQ.js → chunk-H3X3FYUU.js} +1 -10
  8. package/dist/chunk-H3X3FYUU.js.map +1 -0
  9. package/dist/{chunk-5NEAI2BH.cjs → chunk-NT2ZPF72.cjs} +50 -72
  10. package/dist/chunk-NT2ZPF72.cjs.map +1 -0
  11. package/dist/{chunk-BNO5SM25.cjs → chunk-TRYGIC2I.cjs} +2 -11
  12. package/dist/chunk-TRYGIC2I.cjs.map +1 -0
  13. package/dist/{chunk-HJYHGCMT.js → chunk-UEO4YN6T.js} +53 -75
  14. package/dist/chunk-UEO4YN6T.js.map +1 -0
  15. package/dist/{chunk-MIQA46E3.cjs → chunk-XXLIIWIF.cjs} +45 -53
  16. package/dist/chunk-XXLIIWIF.cjs.map +1 -0
  17. package/dist/{chunk-CWH4KOUW.js → chunk-ZJXXCG5P.js} +45 -53
  18. package/dist/chunk-ZJXXCG5P.js.map +1 -0
  19. package/dist/contract/index.cjs +2 -4
  20. package/dist/contract/index.cjs.map +1 -1
  21. package/dist/contract/index.d.cts +5 -15
  22. package/dist/contract/index.d.ts +5 -15
  23. package/dist/contract/index.js +1 -3
  24. package/dist/eip712/index.cjs +2 -8
  25. package/dist/eip712/index.cjs.map +1 -1
  26. package/dist/eip712/index.d.cts +29 -43
  27. package/dist/eip712/index.d.ts +29 -43
  28. package/dist/eip712/index.js +3 -9
  29. package/dist/index.cjs +141 -158
  30. package/dist/index.cjs.map +1 -1
  31. package/dist/index.d.cts +201 -182
  32. package/dist/index.d.ts +201 -182
  33. package/dist/index.js +135 -152
  34. package/dist/index.js.map +1 -1
  35. package/dist/{types-DWLZNgcw.d.cts → types-C17pznGz.d.cts} +72 -30
  36. package/dist/{types-DWLZNgcw.d.ts → types-C17pznGz.d.ts} +72 -30
  37. package/package.json +15 -5
  38. package/dist/chunk-5NEAI2BH.cjs.map +0 -1
  39. package/dist/chunk-BNO5SM25.cjs.map +0 -1
  40. package/dist/chunk-CWH4KOUW.js.map +0 -1
  41. package/dist/chunk-HJYHGCMT.js.map +0 -1
  42. package/dist/chunk-MIQA46E3.cjs.map +0 -1
  43. package/dist/chunk-Y5EYH2SQ.js.map +0 -1
@@ -1,4 +1,4 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
2
2
 
3
3
  var _chunkKRHGFUDIcjs = require('./chunk-KRHGFUDI.cjs');
4
4
 
@@ -79,25 +79,22 @@ var burnRequestTypes = {
79
79
  { name: "deadline", type: "uint256" }
80
80
  ]
81
81
  };
82
- var receiverConsentTypes = {
83
- ReceiverConsent: [
84
- { name: "onBehalfOf", type: "address" },
85
- { name: "originalReceiver", type: "address" },
86
- { name: "amount", type: "uint256" },
87
- { name: "nonce", type: "uint256" },
88
- { name: "deadline", type: "uint256" },
89
- { name: "extData", type: "bytes" }
90
- ]
91
- };
92
82
  var SUPPORTED_CHAINS = {
93
83
  8453: { name: "Base" }
94
84
  };
95
- var V4_QUOTER_ADDRESSES = {
96
- 8453: "0x0d5e0f971ed27fbff6c2837bf31316121532048d"
85
+ var QUOTER_V2_ADDRESSES = {
86
+ 8453: "0xa0765363D9EA1347Afcff6Ae21D6D7B9d36490D0"
97
87
  };
98
88
  var UNIVERSAL_ROUTER_ADDRESSES = {
99
- 8453: "0x6ff5693b99212da76ad316178a184ab56d299b43"
89
+ 8453: "0x008887C992A5bDC24097E717Bfb71CE89483c5A2"
90
+ };
91
+ var V3_SWAP_ROUTER_ADDRESSES = {
92
+ 8453: "0xca937aC69708b00B72cc3247440211d8DbDAaFF8"
93
+ };
94
+ var V3_FACTORY_ADDRESSES = {
95
+ 8453: "0x154bAFC6C311f3909080f28438294Cd5184c2924"
100
96
  };
97
+ var V3_POOL_INIT_CODE_HASH = "0x15380e4800aaa7f219c07d4e07d86cc0e3df225c6a518a1f14f8565f6d9c57c3";
101
98
  var COMMON_TOKENS = {
102
99
  // Base
103
100
  8453: {
@@ -107,23 +104,19 @@ var COMMON_TOKENS = {
107
104
  }
108
105
  };
109
106
  var COMMON_POOLS = {
110
- // Base — existing Uniswap V4 pools
107
+ // Base — Uniswap V3 pools (PAFI deployment)
111
108
  8453: [
112
109
  // WETH/USDC 0.3%
113
110
  {
114
- currency0: "0x4200000000000000000000000000000000000006",
115
- currency1: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
116
- fee: 3e3,
117
- tickSpacing: 60,
118
- hooks: "0x0000000000000000000000000000000000000000"
111
+ token0: "0x4200000000000000000000000000000000000006",
112
+ token1: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
113
+ fee: 3e3
119
114
  },
120
115
  // WETH/USDC 0.05%
121
116
  {
122
- currency0: "0x4200000000000000000000000000000000000006",
123
- currency1: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
124
- fee: 500,
125
- tickSpacing: 10,
126
- hooks: "0x0000000000000000000000000000000000000000"
117
+ token0: "0x4200000000000000000000000000000000000006",
118
+ token1: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
119
+ fee: 500
127
120
  }
128
121
  ]
129
122
  };
@@ -134,6 +127,18 @@ var ENTRY_POINT_V07 = "0x0000000071727De22E5E9d8BAf0edAc6f37da032";
134
127
  var ENTRY_POINT_V08 = "0x4337084d9e255ff0702461cf8895ce9e3b5ff108";
135
128
  var PERMIT2_ADDRESS = "0x000000000022D473030F116dDEE9F6B43aC78BA3";
136
129
 
130
+ // src/eip712/verifyDeadline.ts
131
+ function assertValidCurrentTimeSec(currentTimeSec) {
132
+ if (currentTimeSec === void 0) return;
133
+ if (!Number.isFinite(currentTimeSec) || currentTimeSec < 0) {
134
+ throw new Error(
135
+ `verifyDeadline: currentTimeSec must be a finite non-negative number (got ${String(
136
+ currentTimeSec
137
+ )})`
138
+ );
139
+ }
140
+ }
141
+
137
142
  // src/eip712/mintRequest.ts
138
143
  var PRIMARY_TYPE = "MintForRequest";
139
144
  function buildMintRequestTypedData(domain, message) {
@@ -160,7 +165,8 @@ async function signMintRequest(walletClient, domain, message) {
160
165
  serialized
161
166
  };
162
167
  }
163
- async function verifyMintRequest(domain, message, signature, expectedMinter) {
168
+ async function verifyMintRequest(domain, message, signature, expectedMinter, options) {
169
+ assertValidCurrentTimeSec(_optionalChain([options, 'optionalAccess', _ => _.currentTimeSec]));
164
170
  const recoveredAddress = await _viem.recoverTypedDataAddress.call(void 0, {
165
171
  domain: buildDomain(domain),
166
172
  types: mintRequestTypes,
@@ -168,8 +174,13 @@ async function verifyMintRequest(domain, message, signature, expectedMinter) {
168
174
  message,
169
175
  signature
170
176
  });
171
- const isValid = _viem.getAddress.call(void 0, recoveredAddress) === _viem.getAddress.call(void 0, expectedMinter);
172
- return { isValid, recoveredAddress };
177
+ if (_viem.getAddress.call(void 0, recoveredAddress) !== _viem.getAddress.call(void 0, expectedMinter)) {
178
+ return { isValid: false, recoveredAddress, reason: "INVALID_SIGNER" };
179
+ }
180
+ if (_optionalChain([options, 'optionalAccess', _2 => _2.currentTimeSec]) !== void 0 && message.deadline < BigInt(options.currentTimeSec)) {
181
+ return { isValid: false, recoveredAddress, reason: "DEADLINE_PASSED" };
182
+ }
183
+ return { isValid: true, recoveredAddress };
173
184
  }
174
185
 
175
186
  // src/eip712/burnRequest.ts
@@ -198,7 +209,8 @@ async function signBurnRequest(walletClient, domain, message) {
198
209
  serialized
199
210
  };
200
211
  }
201
- async function verifyBurnRequest(domain, message, signature, expectedBurner) {
212
+ async function verifyBurnRequest(domain, message, signature, expectedBurner, options) {
213
+ assertValidCurrentTimeSec(_optionalChain([options, 'optionalAccess', _3 => _3.currentTimeSec]));
202
214
  const recoveredAddress = await _viem.recoverTypedDataAddress.call(void 0, {
203
215
  domain: buildDomain(domain),
204
216
  types: burnRequestTypes,
@@ -206,46 +218,13 @@ async function verifyBurnRequest(domain, message, signature, expectedBurner) {
206
218
  message,
207
219
  signature
208
220
  });
209
- const isValid = _viem.getAddress.call(void 0, recoveredAddress) === _viem.getAddress.call(void 0, expectedBurner);
210
- return { isValid, recoveredAddress };
211
- }
212
-
213
- // src/eip712/receiverConsent.ts
214
-
215
- function buildReceiverConsentTypedData(domain, message) {
216
- return {
217
- domain: buildDomain(domain),
218
- types: receiverConsentTypes,
219
- primaryType: "ReceiverConsent",
220
- message
221
- };
222
- }
223
- async function signReceiverConsent(walletClient, domain, message) {
224
- const serialized = await walletClient.signTypedData({
225
- account: walletClient.account,
226
- domain: buildDomain(domain),
227
- types: receiverConsentTypes,
228
- primaryType: "ReceiverConsent",
229
- message
230
- });
231
- const { v, r, s } = _viem.parseSignature.call(void 0, serialized);
232
- return {
233
- v: Number(v),
234
- r,
235
- s,
236
- serialized
237
- };
238
- }
239
- async function verifyReceiverConsent(domain, message, signature, expectedReceiver) {
240
- const recoveredAddress = await _viem.recoverTypedDataAddress.call(void 0, {
241
- domain: buildDomain(domain),
242
- types: receiverConsentTypes,
243
- primaryType: "ReceiverConsent",
244
- message,
245
- signature
246
- });
247
- const isValid = _viem.getAddress.call(void 0, recoveredAddress) === _viem.getAddress.call(void 0, expectedReceiver);
248
- return { isValid, recoveredAddress };
221
+ if (_viem.getAddress.call(void 0, recoveredAddress) !== _viem.getAddress.call(void 0, expectedBurner)) {
222
+ return { isValid: false, recoveredAddress, reason: "INVALID_SIGNER" };
223
+ }
224
+ if (_optionalChain([options, 'optionalAccess', _4 => _4.currentTimeSec]) !== void 0 && message.deadline < BigInt(options.currentTimeSec)) {
225
+ return { isValid: false, recoveredAddress, reason: "DEADLINE_PASSED" };
226
+ }
227
+ return { isValid: true, recoveredAddress };
249
228
  }
250
229
 
251
230
 
@@ -272,6 +251,5 @@ async function verifyReceiverConsent(domain, message, signature, expectedReceive
272
251
 
273
252
 
274
253
 
275
-
276
- exports.mintRequestTypes = mintRequestTypes; exports.burnRequestTypes = burnRequestTypes; exports.receiverConsentTypes = receiverConsentTypes; exports.SUPPORTED_CHAINS = SUPPORTED_CHAINS; exports.V4_QUOTER_ADDRESSES = V4_QUOTER_ADDRESSES; exports.UNIVERSAL_ROUTER_ADDRESSES = UNIVERSAL_ROUTER_ADDRESSES; exports.COMMON_TOKENS = COMMON_TOKENS; exports.COMMON_POOLS = COMMON_POOLS; exports.POINT_TOKEN_POOLS = POINT_TOKEN_POOLS; exports.ENTRY_POINT_V07 = ENTRY_POINT_V07; exports.ENTRY_POINT_V08 = ENTRY_POINT_V08; exports.PERMIT2_ADDRESS = PERMIT2_ADDRESS; exports.buildDomain = buildDomain; exports.Eip712DomainMismatchError = Eip712DomainMismatchError; exports.assertDomainMatchesContract = assertDomainMatchesContract; exports.buildMintRequestTypedData = buildMintRequestTypedData; exports.signMintRequest = signMintRequest; exports.verifyMintRequest = verifyMintRequest; exports.buildBurnRequestTypedData = buildBurnRequestTypedData; exports.signBurnRequest = signBurnRequest; exports.verifyBurnRequest = verifyBurnRequest; exports.buildReceiverConsentTypedData = buildReceiverConsentTypedData; exports.signReceiverConsent = signReceiverConsent; exports.verifyReceiverConsent = verifyReceiverConsent;
277
- //# sourceMappingURL=chunk-5NEAI2BH.cjs.map
254
+ exports.mintRequestTypes = mintRequestTypes; exports.burnRequestTypes = burnRequestTypes; exports.SUPPORTED_CHAINS = SUPPORTED_CHAINS; exports.QUOTER_V2_ADDRESSES = QUOTER_V2_ADDRESSES; exports.UNIVERSAL_ROUTER_ADDRESSES = UNIVERSAL_ROUTER_ADDRESSES; exports.V3_SWAP_ROUTER_ADDRESSES = V3_SWAP_ROUTER_ADDRESSES; exports.V3_FACTORY_ADDRESSES = V3_FACTORY_ADDRESSES; exports.V3_POOL_INIT_CODE_HASH = V3_POOL_INIT_CODE_HASH; exports.COMMON_TOKENS = COMMON_TOKENS; exports.COMMON_POOLS = COMMON_POOLS; exports.POINT_TOKEN_POOLS = POINT_TOKEN_POOLS; exports.ENTRY_POINT_V07 = ENTRY_POINT_V07; exports.ENTRY_POINT_V08 = ENTRY_POINT_V08; exports.PERMIT2_ADDRESS = PERMIT2_ADDRESS; exports.buildDomain = buildDomain; exports.Eip712DomainMismatchError = Eip712DomainMismatchError; exports.assertDomainMatchesContract = assertDomainMatchesContract; exports.buildMintRequestTypedData = buildMintRequestTypedData; exports.signMintRequest = signMintRequest; exports.verifyMintRequest = verifyMintRequest; exports.buildBurnRequestTypedData = buildBurnRequestTypedData; exports.signBurnRequest = signBurnRequest; exports.verifyBurnRequest = verifyBurnRequest;
255
+ //# sourceMappingURL=chunk-NT2ZPF72.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/phitran/Pacific-Finance/pafi-backend/pafi-sdk/packages/core/dist/chunk-NT2ZPF72.cjs","../src/eip712/domain.ts","../src/eip712/mintRequest.ts","../src/constants.ts","../src/eip712/verifyDeadline.ts","../src/eip712/burnRequest.ts"],"names":["parseSignature","recoverTypedDataAddress","getAddress"],"mappings":"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","file":"/Users/phitran/Pacific-Finance/pafi-backend/pafi-sdk/packages/core/dist/chunk-NT2ZPF72.cjs","sourcesContent":[null,"import type { Address, PublicClient } from \"viem\";\nimport type { PointTokenDomainConfig } from \"../types\";\nimport { pointTokenAbi } from \"../abi/pointToken\";\n\n/**\n * Build the EIP-712 domain struct from a PointToken config. Uses\n * `config.version` when supplied; defaults to `\"1\"` for back-compat.\n */\nexport function buildDomain(config: PointTokenDomainConfig) {\n return {\n name: config.name,\n version: config.version ?? \"1\",\n chainId: config.chainId,\n verifyingContract: config.verifyingContract,\n };\n}\n\n/**\n * Domain mismatch error thrown by `assertDomainMatchesContract`.\n */\nexport class Eip712DomainMismatchError extends Error {\n constructor(\n public readonly field: \"name\" | \"version\" | \"chainId\" | \"verifyingContract\",\n public readonly expected: string,\n public readonly actual: string,\n ) {\n super(\n `EIP-712 domain mismatch on field \"${field}\": expected ${expected}, got ${actual}. ` +\n `Local SDK config is out of sync with deployed PointToken — signatures will be rejected on-chain. ` +\n `Update SDK config or contract before producing more signatures.`,\n );\n this.name = \"Eip712DomainMismatchError\";\n }\n}\n\n/**\n * One-RPC health check that the local EIP-712 domain config matches\n * what the deployed `PointToken` reports via `eip712Domain()`. If the\n * contract has bumped `version` from `\"1\"` to `\"2\"` (or any field\n * differs), every signature produced with the stale config will be\n * silently rejected on-chain (`ECDSA: invalid signature` — opaque to\n * the user).\n *\n * Recommended: call once at issuer-startup health check, not on every\n * mint. Throws `Eip712DomainMismatchError` describing the diverged\n * field.\n *\n * @example\n * ```ts\n * import { assertDomainMatchesContract, buildDomain } from \"@pafi-dev/core\";\n *\n * const expected = buildDomain({\n * name: \"PointToken\",\n * chainId: 8453,\n * verifyingContract: \"0x855c2046AD49AcF9B3B32557176FfCB1a1A38A22\",\n * });\n *\n * await assertDomainMatchesContract(publicClient, expected);\n * // → throws Eip712DomainMismatchError if version on-chain has bumped\n * ```\n */\nexport async function assertDomainMatchesContract(\n client: PublicClient,\n expected: ReturnType<typeof buildDomain>,\n): Promise<void> {\n const onChain = (await client.readContract({\n address: expected.verifyingContract as Address,\n abi: pointTokenAbi,\n functionName: \"eip712Domain\",\n })) as readonly [\n `0x${string}`, // fields (bytes1)\n string, // name\n string, // version\n bigint, // chainId\n Address, // verifyingContract\n `0x${string}`, // salt\n readonly bigint[], // extensions\n ];\n\n const [, name, version, chainId, verifyingContract] = onChain;\n\n if (name !== expected.name) {\n throw new Eip712DomainMismatchError(\"name\", expected.name, name);\n }\n if (version !== expected.version) {\n throw new Eip712DomainMismatchError(\n \"version\",\n expected.version,\n version,\n );\n }\n if (chainId !== BigInt(expected.chainId)) {\n throw new Eip712DomainMismatchError(\n \"chainId\",\n String(expected.chainId),\n chainId.toString(),\n );\n }\n if (\n verifyingContract.toLowerCase() !==\n expected.verifyingContract.toLowerCase()\n ) {\n throw new Eip712DomainMismatchError(\n \"verifyingContract\",\n expected.verifyingContract,\n verifyingContract,\n );\n }\n}\n","import { getAddress, parseSignature, recoverTypedDataAddress } from \"viem\";\nimport type { Address, Hex, WalletClient } from \"viem\";\nimport { mintRequestTypes } from \"../constants\";\nimport type {\n EIP712Signature,\n MintRequest,\n PointTokenDomainConfig,\n SignatureVerification,\n SignatureVerifyOptions,\n} from \"../types\";\nimport { buildDomain } from \"./domain\";\nimport { assertValidCurrentTimeSec } from \"./verifyDeadline\";\n\nconst PRIMARY_TYPE = \"MintForRequest\" as const;\n\n/**\n * Build the EIP-712 typed data object for a MintForRequest.\n * Returns the standard `{ domain, types, primaryType, message }` structure\n * that any EIP-712 signer (viem, ethers, Privy, WalletConnect) can consume.\n */\nexport function buildMintRequestTypedData(\n domain: PointTokenDomainConfig,\n message: MintRequest,\n) {\n return {\n domain: buildDomain(domain),\n types: mintRequestTypes,\n primaryType: PRIMARY_TYPE,\n message,\n };\n}\n\n/**\n * Sign a MintForRequest. Caller passes the full 5-field message:\n * - user = off-chain spender (drives nonce stream)\n * - receiver = on-chain caller (= msg.sender of `mint()`; wrapper or user)\n * - amount = PT amount\n * - nonce = pointToken.mintRequestNonces(user)\n * - deadline = unix seconds\n */\nexport async function signMintRequest(\n walletClient: WalletClient,\n domain: PointTokenDomainConfig,\n message: MintRequest,\n): Promise<EIP712Signature> {\n const serialized = await walletClient.signTypedData({\n account: walletClient.account!,\n domain: buildDomain(domain),\n types: mintRequestTypes,\n primaryType: PRIMARY_TYPE,\n message,\n });\n\n const { v, r, s } = parseSignature(serialized);\n\n return {\n v: Number(v),\n r,\n s,\n serialized,\n };\n}\n\n/**\n * Verify a MintForRequest signature. Always recovers the signer and\n * compares against `expectedMinter`. Pass `options.currentTimeSec`\n * (unix seconds) to additionally enforce the request's `deadline` —\n * the on-chain contract enforces `block.timestamp <= deadline`, so\n * a stale-but-cryptographically-valid sig will only revert\n * on-submission unless the caller pre-flights here.\n *\n * Result shape:\n * - `{ isValid: true, recoveredAddress }` — sig matches and (if\n * deadline check requested) deadline has not elapsed.\n * - `{ isValid: false, recoveredAddress, reason: 'INVALID_SIGNER' }`\n * — sig does not recover to `expectedMinter`.\n * - `{ isValid: false, recoveredAddress, reason: 'DEADLINE_PASSED' }`\n * — sig is valid but `deadline < currentTimeSec`.\n *\n * Throws (synchronous Promise rejection):\n * - When `options.currentTimeSec` is provided but not a finite,\n * non-negative number. Misusing the API should fail loudly.\n */\nexport async function verifyMintRequest(\n domain: PointTokenDomainConfig,\n message: MintRequest,\n signature: Hex,\n expectedMinter: Address,\n options?: SignatureVerifyOptions,\n): Promise<SignatureVerification> {\n assertValidCurrentTimeSec(options?.currentTimeSec);\n\n const recoveredAddress = await recoverTypedDataAddress({\n domain: buildDomain(domain),\n types: mintRequestTypes,\n primaryType: PRIMARY_TYPE,\n message,\n signature,\n });\n\n if (getAddress(recoveredAddress) !== getAddress(expectedMinter)) {\n return { isValid: false, recoveredAddress, reason: \"INVALID_SIGNER\" };\n }\n\n if (\n options?.currentTimeSec !== undefined &&\n message.deadline < BigInt(options.currentTimeSec)\n ) {\n return { isValid: false, recoveredAddress, reason: \"DEADLINE_PASSED\" };\n }\n\n return { isValid: true, recoveredAddress };\n}\n","import type { Address, Hex } from \"viem\";\nimport type { ChainConfig, PoolKey } from \"./types\";\n\n// -------------------------------------------------------------------------\n// EIP-712 type definitions for viem\n// -------------------------------------------------------------------------\n\n/**\n * EIP-712 typed data for the sig-gated mint path.\n *\n * Contract enforces:\n * - msg.sender == receiver (the on-chain caller of `mint`)\n * - nonce == mintRequestNonces[user] (per-user nonce stream)\n *\n * `user` is the off-chain spender (whose nonce advances), `receiver` is\n * the on-chain mint recipient. For direct mints `user == receiver` (user\n * calls PointToken.mint themselves). For wrapper-mediated mints `user ==\n * end-user`, `receiver == wrapper address`.\n */\nexport const mintRequestTypes = {\n MintForRequest: [\n { name: \"user\", type: \"address\" },\n { name: \"receiver\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n { name: \"nonce\", type: \"uint256\" },\n { name: \"deadline\", type: \"uint256\" },\n ],\n} as const;\n\nexport const burnRequestTypes = {\n BurnRequest: [\n { name: \"from\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n { name: \"nonce\", type: \"uint256\" },\n { name: \"deadline\", type: \"uint256\" },\n ],\n} as const;\n\n// Sponsored mints are implemented at the relayer layer (sponsor-relayer\n// pays gas for the sig-gated `MintForRequest`); the deployed PointToken\n// contract has no separate `ReceiverConsent` path, no extra EIP-712 type,\n// and no separate on-chain nonce mapping.\n\n// -------------------------------------------------------------------------\n// Chain-indexed constants — add entries here as new chains are supported\n// -------------------------------------------------------------------------\n\nexport const SUPPORTED_CHAINS: Record<number, ChainConfig> = {\n 8453: { name: \"Base\" },\n};\n\n/**\n * Uniswap V3 QuoterV2 — used by `findBestQuote` / `quoteExactInput` etc.\n * QuoterV2 (vs V1) reverts cleanly inside multicall and returns a 4-tuple\n * `(amountOut, sqrtPriceX96AfterList, initializedTicksCrossedList, gasEstimate)`.\n */\nexport const QUOTER_V2_ADDRESSES: Record<number, Address> = {\n 8453: \"0xa0765363D9EA1347Afcff6Ae21D6D7B9d36490D0\",\n};\n\n/**\n * Uniswap UniversalRouter — used for AA/batched swaps via PT delegated\n * accounts. Speaks V3 commands (`V3_SWAP_EXACT_IN = 0x00`,\n * `V3_SWAP_EXACT_OUT = 0x01`).\n */\nexport const UNIVERSAL_ROUTER_ADDRESSES: Record<number, Address> = {\n 8453: \"0x008887C992A5bDC24097E717Bfb71CE89483c5A2\",\n};\n\n/**\n * Uniswap V3 SwapRouter — used by `swapDirect`-style flows that bypass\n * the UniversalRouter. Takes `exactInput` / `exactOutput` with packed-bytes\n * paths directly.\n */\nexport const V3_SWAP_ROUTER_ADDRESSES: Record<number, Address> = {\n 8453: \"0xca937aC69708b00B72cc3247440211d8DbDAaFF8\",\n};\n\n/**\n * PAFI's Uniswap V3 factory — used together with `V3_POOL_INIT_CODE_HASH`\n * to derive pool addresses deterministically (`computeV3PoolAddress`).\n */\nexport const V3_FACTORY_ADDRESSES: Record<number, Address> = {\n 8453: \"0x154bAFC6C311f3909080f28438294Cd5184c2924\",\n};\n\n/**\n * Pool-init code hash for PAFI's V3 deployment. Combined with the factory\n * address + sorted tokens + fee, deterministically yields a pool's\n * address via the standard Uniswap V3 CREATE2 derivation.\n */\nexport const V3_POOL_INIT_CODE_HASH: Hex =\n \"0x15380e4800aaa7f219c07d4e07d86cc0e3df225c6a518a1f14f8565f6d9c57c3\";\n\nexport const COMMON_TOKENS: Record<number, Record<string, Address>> = {\n // Base\n 8453: {\n WETH: \"0x4200000000000000000000000000000000000006\",\n USDC: \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n USDT: \"0xfde4C96c8593536E31F229EA8f37b2ADa2699bb2\",\n },\n};\n\nexport const COMMON_POOLS: Record<number, PoolKey[]> = {\n // Base — Uniswap V3 pools (PAFI deployment)\n 8453: [\n // WETH/USDC 0.3%\n {\n token0: \"0x4200000000000000000000000000000000000006\",\n token1: \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n fee: 3000,\n },\n // WETH/USDC 0.05%\n {\n token0: \"0x4200000000000000000000000000000000000006\",\n token1: \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n fee: 500,\n },\n ],\n};\n\nexport const POINT_TOKEN_POOLS: Record<number, Record<Address, PoolKey[]>> = {\n // chainId → pointTokenAddress → PoolKey[]\n};\n\n// -------------------------------------------------------------------------\n// Protocol constants — chain-agnostic (same address on every EVM chain)\n// -------------------------------------------------------------------------\n\n/** ERC-4337 v0.7 EntryPoint — deployed deterministically across all EVM chains. */\nexport const ENTRY_POINT_V07: Address = \"0x0000000071727De22E5E9d8BAf0edAc6f37da032\";\n\n/**\n * ERC-4337 v0.8 EntryPoint — used by Pimlico's `Simple7702Account` impl\n * (`0xe6Cae83BdE06E4c305530e199D7217f42808555B`) and by permissionless's\n * `to7702SimpleSmartAccount`. EIP-7702 delegated EOAs in PAFI's flow\n * point at this EntryPoint, NOT v0.7.\n *\n * Why this matters: account.validateUserOp does\n * `require(msg.sender == entryPoint(), \"account: not from EntryPoint\")`.\n * If the bundler/paymaster sim runs against a different EntryPoint than\n * what the account's `entryPoint()` returns, the require fails and you\n * see `AA23 reverted account: not from EntryPoint`.\n */\nexport const ENTRY_POINT_V08: Address = \"0x4337084d9e255ff0702461cf8895ce9e3b5ff108\";\n\n/** Permit2 — Uniswap's universal approval contract, same address on all EVM chains. */\nexport const PERMIT2_ADDRESS: Address = \"0x000000000022D473030F116dDEE9F6B43aC78BA3\";\n","/**\n * Shared input validator for `verifyMintRequest` /\n * `verifyBurnRequest`'s `options.currentTimeSec`. Centralised so both\n * helpers fail in the same way on bad input — a quiet skip on\n * `NaN` / negative values would defeat the purpose of opting into\n * deadline checking.\n *\n * No-op when `currentTimeSec` is undefined: the caller did not opt in\n * to deadline checking.\n */\nexport function assertValidCurrentTimeSec(\n currentTimeSec: number | undefined,\n): void {\n if (currentTimeSec === undefined) return;\n if (!Number.isFinite(currentTimeSec) || currentTimeSec < 0) {\n throw new Error(\n `verifyDeadline: currentTimeSec must be a finite non-negative number (got ${String(\n currentTimeSec,\n )})`,\n );\n }\n}\n","import { getAddress, parseSignature, recoverTypedDataAddress } from \"viem\";\nimport type { Address, Hex, WalletClient } from \"viem\";\nimport { burnRequestTypes } from \"../constants\";\nimport type {\n BurnRequest,\n EIP712Signature,\n PointTokenDomainConfig,\n SignatureVerification,\n SignatureVerifyOptions,\n} from \"../types\";\nimport { buildDomain } from \"./domain\";\nimport { assertValidCurrentTimeSec } from \"./verifyDeadline\";\n\n/**\n * EIP-712 helpers for `BurnRequest` — consumed by the sig-gated burn\n * path on `PointToken`:\n *\n * burn(address from, uint256 amount, uint256 deadline, bytes burnerSig)\n *\n * Solidity type hash:\n * BurnRequest(address from,uint256 amount,uint256 nonce,uint256 deadline)\n *\n * Issuer backend signs with its burner signer (HSM/KMS). On-chain\n * `msg.sender` must equal `from`, and the recovered signer must be in\n * `burners[]`. Nonce comes from `burnRequestNonces[from]` and is\n * auto-incremented on success.\n */\nexport function buildBurnRequestTypedData(\n domain: PointTokenDomainConfig,\n message: BurnRequest,\n) {\n return {\n domain: buildDomain(domain),\n types: burnRequestTypes,\n primaryType: \"BurnRequest\" as const,\n message,\n };\n}\n\nexport async function signBurnRequest(\n walletClient: WalletClient,\n domain: PointTokenDomainConfig,\n message: BurnRequest,\n): Promise<EIP712Signature> {\n const serialized = await walletClient.signTypedData({\n account: walletClient.account!,\n domain: buildDomain(domain),\n types: burnRequestTypes,\n primaryType: \"BurnRequest\",\n message,\n });\n\n const { v, r, s } = parseSignature(serialized);\n\n return {\n v: Number(v),\n r,\n s,\n serialized,\n };\n}\n\n/**\n * Verify a BurnRequest signature. Symmetric with `verifyMintRequest`:\n * always recovers the signer; opt-in deadline check via\n * `options.currentTimeSec`. See that helper for the full contract.\n */\nexport async function verifyBurnRequest(\n domain: PointTokenDomainConfig,\n message: BurnRequest,\n signature: Hex,\n expectedBurner: Address,\n options?: SignatureVerifyOptions,\n): Promise<SignatureVerification> {\n assertValidCurrentTimeSec(options?.currentTimeSec);\n\n const recoveredAddress = await recoverTypedDataAddress({\n domain: buildDomain(domain),\n types: burnRequestTypes,\n primaryType: \"BurnRequest\",\n message,\n signature,\n });\n\n if (getAddress(recoveredAddress) !== getAddress(expectedBurner)) {\n return { isValid: false, recoveredAddress, reason: \"INVALID_SIGNER\" };\n }\n\n if (\n options?.currentTimeSec !== undefined &&\n message.deadline < BigInt(options.currentTimeSec)\n ) {\n return { isValid: false, recoveredAddress, reason: \"DEADLINE_PASSED\" };\n }\n\n return { isValid: true, recoveredAddress };\n}\n"]}
@@ -16,14 +16,6 @@ async function getMintRequestNonce(client, pointToken, receiver) {
16
16
  args: [receiver]
17
17
  });
18
18
  }
19
- async function getReceiverConsentNonce(client, pointToken, receiver) {
20
- return client.readContract({
21
- address: pointToken,
22
- abi: _chunkKRHGFUDIcjs.pointTokenAbi,
23
- functionName: "nonces",
24
- args: [receiver]
25
- });
26
- }
27
19
  async function isMinter(client, pointToken, account) {
28
20
  return client.readContract({
29
21
  address: pointToken,
@@ -176,6 +168,5 @@ async function getMintFeeRecipients(client, wrapperAddress, pointToken) {
176
168
 
177
169
 
178
170
 
179
-
180
- exports.getMintRequestNonce = getMintRequestNonce; exports.getReceiverConsentNonce = getReceiverConsentNonce; exports.isMinter = isMinter; exports.getTokenName = getTokenName; exports.getIssuer = getIssuer; exports.getPointTokenBalance = getPointTokenBalance; exports.getBurnRequestNonce = getBurnRequestNonce; exports.getIssuer2 = getIssuer2; exports.issuerRegistryGetIssuerFlatAbi = issuerRegistryGetIssuerFlatAbi; exports.isActiveIssuer = isActiveIssuer; exports.verifyMintCap = verifyMintCap; exports.getPointTokenIssuer = getPointTokenIssuer; exports.getTokenCap = getTokenCap; exports.getMintFeeBps = getMintFeeBps; exports.getMintFeeRecipients = getMintFeeRecipients;
181
- //# sourceMappingURL=chunk-BNO5SM25.cjs.map
171
+ exports.getMintRequestNonce = getMintRequestNonce; exports.isMinter = isMinter; exports.getTokenName = getTokenName; exports.getIssuer = getIssuer; exports.getPointTokenBalance = getPointTokenBalance; exports.getBurnRequestNonce = getBurnRequestNonce; exports.getIssuer2 = getIssuer2; exports.issuerRegistryGetIssuerFlatAbi = issuerRegistryGetIssuerFlatAbi; exports.isActiveIssuer = isActiveIssuer; exports.verifyMintCap = verifyMintCap; exports.getPointTokenIssuer = getPointTokenIssuer; exports.getTokenCap = getTokenCap; exports.getMintFeeBps = getMintFeeBps; exports.getMintFeeRecipients = getMintFeeRecipients;
172
+ //# sourceMappingURL=chunk-TRYGIC2I.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/phitran/Pacific-Finance/pafi-backend/pafi-sdk/packages/core/dist/chunk-TRYGIC2I.cjs","../src/contract/pointToken.ts","../src/contract/issuerRegistry.ts","../src/contract/mintingOracle.ts","../src/contract/mintFeeWrapper.ts"],"names":["getIssuer"],"mappings":"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","file":"/Users/phitran/Pacific-Finance/pafi-backend/pafi-sdk/packages/core/dist/chunk-TRYGIC2I.cjs","sourcesContent":[null,"import type { Address, PublicClient } from \"viem\";\nimport { pointTokenAbi } from \"../abi/pointToken\";\n\nexport async function getMintRequestNonce(\n client: PublicClient,\n pointToken: Address,\n receiver: Address,\n): Promise<bigint> {\n return client.readContract({\n address: pointToken,\n abi: pointTokenAbi,\n functionName: \"mintRequestNonces\",\n args: [receiver],\n });\n}\n\nexport async function isMinter(\n client: PublicClient,\n pointToken: Address,\n account: Address,\n): Promise<boolean> {\n return client.readContract({\n address: pointToken,\n abi: pointTokenAbi,\n functionName: \"minters\",\n args: [account],\n });\n}\n\nexport async function getTokenName(\n client: PublicClient,\n pointToken: Address,\n): Promise<string> {\n return client.readContract({\n address: pointToken,\n abi: pointTokenAbi,\n functionName: \"name\",\n });\n}\n\nexport async function getIssuer(\n client: PublicClient,\n pointToken: Address,\n): Promise<Address> {\n return client.readContract({\n address: pointToken,\n abi: pointTokenAbi,\n functionName: \"issuer\",\n });\n}\n\n/**\n * Read the ERC-20 on-chain balance for `holder`. Returned in raw 18-decimal\n * base units. Use alongside the issuer's off-chain ledger balance to render\n * a combined \"total balance\" in the app UI.\n */\nexport async function getPointTokenBalance(\n client: PublicClient,\n pointToken: Address,\n holder: Address,\n): Promise<bigint> {\n return client.readContract({\n address: pointToken,\n abi: pointTokenAbi,\n functionName: \"balanceOf\",\n args: [holder],\n });\n}\n\nexport async function getBurnRequestNonce(\n client: PublicClient,\n pointToken: Address,\n from: Address,\n): Promise<bigint> {\n return client.readContract({\n address: pointToken,\n abi: pointTokenAbi,\n functionName: \"burnRequestNonces\",\n args: [from],\n });\n}\n","import type { Address, PublicClient } from \"viem\";\nimport { issuerRegistryAbi } from \"../abi/issuerRegistry\";\nimport type { Issuer } from \"../types\";\n\n/**\n * Flat-output ABI for `getIssuer` — workaround for a viem decoding bug\n * (≤ 2.48.x) where `outputs: [{ type: 'tuple', components: [...] }]` with\n * mixed static + dynamic fields throws `IntegerOutOfRangeError` because\n * viem expects an outer offset that the actual on-chain return doesn't\n * carry (Solidity inlines `returns (Struct)` at the wire level).\n *\n * Using flat outputs (one entry per struct field) matches the on-chain\n * encoding and decodes correctly. We rebuild the named struct from the\n * resulting array.\n */\nconst GET_ISSUER_FLAT_ABI = [\n {\n type: \"function\",\n name: \"getIssuer\",\n inputs: [{ name: \"issuer\", type: \"address\" }],\n outputs: [\n { name: \"issuerAddress\", type: \"address\" },\n { name: \"signerAddress\", type: \"address\" },\n { name: \"name\", type: \"string\" },\n { name: \"symbol\", type: \"string\" },\n { name: \"active\", type: \"bool\" },\n { name: \"pointToken\", type: \"address\" },\n { name: \"mintingOracle\", type: \"address\" },\n ],\n stateMutability: \"view\",\n },\n] as const;\n\nexport async function getIssuer(\n client: PublicClient,\n registryAddress: Address,\n issuer: Address,\n): Promise<Issuer> {\n const result = (await client.readContract({\n address: registryAddress,\n abi: GET_ISSUER_FLAT_ABI,\n functionName: \"getIssuer\",\n args: [issuer],\n })) as readonly [\n Address,\n Address,\n string,\n string,\n boolean,\n Address,\n Address,\n ];\n return {\n issuerAddress: result[0],\n signerAddress: result[1],\n name: result[2],\n symbol: result[3],\n active: result[4],\n pointToken: result[5],\n mintingOracle: result[6],\n } as Issuer;\n}\n\n/**\n * Re-export the flat ABI so callers using `client.readContract` directly\n * (e.g. inside batched `Promise.all`) can use it instead of the\n * struct-returning entry from `issuerRegistryAbi`.\n */\nexport const issuerRegistryGetIssuerFlatAbi = GET_ISSUER_FLAT_ABI;\n\nexport async function isActiveIssuer(\n client: PublicClient,\n registryAddress: Address,\n issuer: Address,\n): Promise<boolean> {\n return client.readContract({\n address: registryAddress,\n abi: issuerRegistryAbi,\n functionName: \"isActiveIssuer\",\n args: [issuer],\n });\n}\n","import type { Address, PublicClient } from \"viem\";\nimport { mintingOracleAbi } from \"../abi/mintingOracle\";\n\n/**\n * Takes `pointToken` as the first arg so the oracle can look up the\n * per-token cap. Reverts if the cap would be exceeded.\n */\nexport async function verifyMintCap(\n client: PublicClient,\n oracleAddress: Address,\n pointToken: Address,\n issuer: Address,\n amount: bigint,\n): Promise<void> {\n await client.readContract({\n address: oracleAddress,\n abi: mintingOracleAbi,\n functionName: \"verifyMintCap\",\n args: [pointToken, issuer, amount],\n });\n}\n\nexport async function getPointTokenIssuer(\n client: PublicClient,\n oracleAddress: Address,\n pointToken: Address,\n): Promise<Address> {\n return client.readContract({\n address: oracleAddress,\n abi: mintingOracleAbi,\n functionName: \"pointTokenToIssuer\",\n args: [pointToken],\n });\n}\n\n/**\n * Read the per-PointToken cap config from the oracle. Returns\n * `{ declaredTotalSupply, capBasisPoints }`. The on-chain `_mint` path\n * computes `hardCap = declaredTotalSupply * capBasisPoints / 10000` and\n * reverts if `mintedSupply + amount > hardCap`. Issuers replicate this\n * math at pre-validate time to fail fast before the user signs.\n *\n * Returns `{ 0n, 0 }` when the token is not registered with the oracle —\n * caller treats that as \"no cap configured\", which means mints will\n * always revert on-chain (the oracle requires a non-zero cap).\n */\nexport async function getTokenCap(\n client: PublicClient,\n oracleAddress: Address,\n pointToken: Address,\n): Promise<{ declaredTotalSupply: bigint; capBasisPoints: number }> {\n const cap = await client.readContract({\n address: oracleAddress,\n abi: mintingOracleAbi,\n functionName: \"tokenCaps\",\n args: [pointToken],\n });\n return {\n declaredTotalSupply: cap.declaredTotalSupply,\n capBasisPoints: Number(cap.capBasisPoints),\n };\n}\n","import type { Address, PublicClient } from \"viem\";\nimport { mintFeeWrapperAbi } from \"../abi/mintFeeWrapper\";\n\n/**\n * Read the total fee in basis points (0–10000) for a specific PointToken\n * from the shared `MintFeeWrapper`. Each PointToken has its own recipient\n * list with per-recipient `basisPoints`; `totalFeeBps` is the sum.\n *\n * Returns 0 when no recipients are registered (mint goes through wrapper\n * with no fee deduction). Reverts only on RPC failure.\n */\nexport async function getMintFeeBps(\n client: PublicClient,\n wrapperAddress: Address,\n pointToken: Address,\n): Promise<number> {\n const fee = await client.readContract({\n address: wrapperAddress,\n abi: mintFeeWrapperAbi,\n functionName: \"totalFeeBps\",\n args: [pointToken],\n });\n return Number(fee);\n}\n\n/**\n * Read the recipient configuration for a PointToken — list of\n * `{ account, basisPoints }`. Useful for /config endpoints that want to\n * surface fee distribution to the frontend.\n */\nexport async function getMintFeeRecipients(\n client: PublicClient,\n wrapperAddress: Address,\n pointToken: Address,\n): Promise<readonly { account: Address; basisPoints: number }[]> {\n const recipients = await client.readContract({\n address: wrapperAddress,\n abi: mintFeeWrapperAbi,\n functionName: \"getRecipients\",\n args: [pointToken],\n });\n return recipients.map((r) => ({\n account: r.account,\n basisPoints: Number(r.basisPoints),\n }));\n}\n"]}
@@ -79,25 +79,22 @@ var burnRequestTypes = {
79
79
  { name: "deadline", type: "uint256" }
80
80
  ]
81
81
  };
82
- var receiverConsentTypes = {
83
- ReceiverConsent: [
84
- { name: "onBehalfOf", type: "address" },
85
- { name: "originalReceiver", type: "address" },
86
- { name: "amount", type: "uint256" },
87
- { name: "nonce", type: "uint256" },
88
- { name: "deadline", type: "uint256" },
89
- { name: "extData", type: "bytes" }
90
- ]
91
- };
92
82
  var SUPPORTED_CHAINS = {
93
83
  8453: { name: "Base" }
94
84
  };
95
- var V4_QUOTER_ADDRESSES = {
96
- 8453: "0x0d5e0f971ed27fbff6c2837bf31316121532048d"
85
+ var QUOTER_V2_ADDRESSES = {
86
+ 8453: "0xa0765363D9EA1347Afcff6Ae21D6D7B9d36490D0"
97
87
  };
98
88
  var UNIVERSAL_ROUTER_ADDRESSES = {
99
- 8453: "0x6ff5693b99212da76ad316178a184ab56d299b43"
89
+ 8453: "0x008887C992A5bDC24097E717Bfb71CE89483c5A2"
90
+ };
91
+ var V3_SWAP_ROUTER_ADDRESSES = {
92
+ 8453: "0xca937aC69708b00B72cc3247440211d8DbDAaFF8"
100
93
  };
94
+ var V3_FACTORY_ADDRESSES = {
95
+ 8453: "0x154bAFC6C311f3909080f28438294Cd5184c2924"
96
+ };
97
+ var V3_POOL_INIT_CODE_HASH = "0x15380e4800aaa7f219c07d4e07d86cc0e3df225c6a518a1f14f8565f6d9c57c3";
101
98
  var COMMON_TOKENS = {
102
99
  // Base
103
100
  8453: {
@@ -107,23 +104,19 @@ var COMMON_TOKENS = {
107
104
  }
108
105
  };
109
106
  var COMMON_POOLS = {
110
- // Base — existing Uniswap V4 pools
107
+ // Base — Uniswap V3 pools (PAFI deployment)
111
108
  8453: [
112
109
  // WETH/USDC 0.3%
113
110
  {
114
- currency0: "0x4200000000000000000000000000000000000006",
115
- currency1: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
116
- fee: 3e3,
117
- tickSpacing: 60,
118
- hooks: "0x0000000000000000000000000000000000000000"
111
+ token0: "0x4200000000000000000000000000000000000006",
112
+ token1: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
113
+ fee: 3e3
119
114
  },
120
115
  // WETH/USDC 0.05%
121
116
  {
122
- currency0: "0x4200000000000000000000000000000000000006",
123
- currency1: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
124
- fee: 500,
125
- tickSpacing: 10,
126
- hooks: "0x0000000000000000000000000000000000000000"
117
+ token0: "0x4200000000000000000000000000000000000006",
118
+ token1: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
119
+ fee: 500
127
120
  }
128
121
  ]
129
122
  };
@@ -134,6 +127,18 @@ var ENTRY_POINT_V07 = "0x0000000071727De22E5E9d8BAf0edAc6f37da032";
134
127
  var ENTRY_POINT_V08 = "0x4337084d9e255ff0702461cf8895ce9e3b5ff108";
135
128
  var PERMIT2_ADDRESS = "0x000000000022D473030F116dDEE9F6B43aC78BA3";
136
129
 
130
+ // src/eip712/verifyDeadline.ts
131
+ function assertValidCurrentTimeSec(currentTimeSec) {
132
+ if (currentTimeSec === void 0) return;
133
+ if (!Number.isFinite(currentTimeSec) || currentTimeSec < 0) {
134
+ throw new Error(
135
+ `verifyDeadline: currentTimeSec must be a finite non-negative number (got ${String(
136
+ currentTimeSec
137
+ )})`
138
+ );
139
+ }
140
+ }
141
+
137
142
  // src/eip712/mintRequest.ts
138
143
  var PRIMARY_TYPE = "MintForRequest";
139
144
  function buildMintRequestTypedData(domain, message) {
@@ -160,7 +165,8 @@ async function signMintRequest(walletClient, domain, message) {
160
165
  serialized
161
166
  };
162
167
  }
163
- async function verifyMintRequest(domain, message, signature, expectedMinter) {
168
+ async function verifyMintRequest(domain, message, signature, expectedMinter, options) {
169
+ assertValidCurrentTimeSec(options?.currentTimeSec);
164
170
  const recoveredAddress = await recoverTypedDataAddress({
165
171
  domain: buildDomain(domain),
166
172
  types: mintRequestTypes,
@@ -168,8 +174,13 @@ async function verifyMintRequest(domain, message, signature, expectedMinter) {
168
174
  message,
169
175
  signature
170
176
  });
171
- const isValid = getAddress(recoveredAddress) === getAddress(expectedMinter);
172
- return { isValid, recoveredAddress };
177
+ if (getAddress(recoveredAddress) !== getAddress(expectedMinter)) {
178
+ return { isValid: false, recoveredAddress, reason: "INVALID_SIGNER" };
179
+ }
180
+ if (options?.currentTimeSec !== void 0 && message.deadline < BigInt(options.currentTimeSec)) {
181
+ return { isValid: false, recoveredAddress, reason: "DEADLINE_PASSED" };
182
+ }
183
+ return { isValid: true, recoveredAddress };
173
184
  }
174
185
 
175
186
  // src/eip712/burnRequest.ts
@@ -198,7 +209,8 @@ async function signBurnRequest(walletClient, domain, message) {
198
209
  serialized
199
210
  };
200
211
  }
201
- async function verifyBurnRequest(domain, message, signature, expectedBurner) {
212
+ async function verifyBurnRequest(domain, message, signature, expectedBurner, options) {
213
+ assertValidCurrentTimeSec(options?.currentTimeSec);
202
214
  const recoveredAddress = await recoverTypedDataAddress2({
203
215
  domain: buildDomain(domain),
204
216
  types: burnRequestTypes,
@@ -206,55 +218,24 @@ async function verifyBurnRequest(domain, message, signature, expectedBurner) {
206
218
  message,
207
219
  signature
208
220
  });
209
- const isValid = getAddress2(recoveredAddress) === getAddress2(expectedBurner);
210
- return { isValid, recoveredAddress };
211
- }
212
-
213
- // src/eip712/receiverConsent.ts
214
- import { getAddress as getAddress3, parseSignature as parseSignature3, recoverTypedDataAddress as recoverTypedDataAddress3 } from "viem";
215
- function buildReceiverConsentTypedData(domain, message) {
216
- return {
217
- domain: buildDomain(domain),
218
- types: receiverConsentTypes,
219
- primaryType: "ReceiverConsent",
220
- message
221
- };
222
- }
223
- async function signReceiverConsent(walletClient, domain, message) {
224
- const serialized = await walletClient.signTypedData({
225
- account: walletClient.account,
226
- domain: buildDomain(domain),
227
- types: receiverConsentTypes,
228
- primaryType: "ReceiverConsent",
229
- message
230
- });
231
- const { v, r, s } = parseSignature3(serialized);
232
- return {
233
- v: Number(v),
234
- r,
235
- s,
236
- serialized
237
- };
238
- }
239
- async function verifyReceiverConsent(domain, message, signature, expectedReceiver) {
240
- const recoveredAddress = await recoverTypedDataAddress3({
241
- domain: buildDomain(domain),
242
- types: receiverConsentTypes,
243
- primaryType: "ReceiverConsent",
244
- message,
245
- signature
246
- });
247
- const isValid = getAddress3(recoveredAddress) === getAddress3(expectedReceiver);
248
- return { isValid, recoveredAddress };
221
+ if (getAddress2(recoveredAddress) !== getAddress2(expectedBurner)) {
222
+ return { isValid: false, recoveredAddress, reason: "INVALID_SIGNER" };
223
+ }
224
+ if (options?.currentTimeSec !== void 0 && message.deadline < BigInt(options.currentTimeSec)) {
225
+ return { isValid: false, recoveredAddress, reason: "DEADLINE_PASSED" };
226
+ }
227
+ return { isValid: true, recoveredAddress };
249
228
  }
250
229
 
251
230
  export {
252
231
  mintRequestTypes,
253
232
  burnRequestTypes,
254
- receiverConsentTypes,
255
233
  SUPPORTED_CHAINS,
256
- V4_QUOTER_ADDRESSES,
234
+ QUOTER_V2_ADDRESSES,
257
235
  UNIVERSAL_ROUTER_ADDRESSES,
236
+ V3_SWAP_ROUTER_ADDRESSES,
237
+ V3_FACTORY_ADDRESSES,
238
+ V3_POOL_INIT_CODE_HASH,
258
239
  COMMON_TOKENS,
259
240
  COMMON_POOLS,
260
241
  POINT_TOKEN_POOLS,
@@ -269,9 +250,6 @@ export {
269
250
  verifyMintRequest,
270
251
  buildBurnRequestTypedData,
271
252
  signBurnRequest,
272
- verifyBurnRequest,
273
- buildReceiverConsentTypedData,
274
- signReceiverConsent,
275
- verifyReceiverConsent
253
+ verifyBurnRequest
276
254
  };
277
- //# sourceMappingURL=chunk-HJYHGCMT.js.map
255
+ //# sourceMappingURL=chunk-UEO4YN6T.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/eip712/domain.ts","../src/eip712/mintRequest.ts","../src/constants.ts","../src/eip712/verifyDeadline.ts","../src/eip712/burnRequest.ts"],"sourcesContent":["import type { Address, PublicClient } from \"viem\";\nimport type { PointTokenDomainConfig } from \"../types\";\nimport { pointTokenAbi } from \"../abi/pointToken\";\n\n/**\n * Build the EIP-712 domain struct from a PointToken config. Uses\n * `config.version` when supplied; defaults to `\"1\"` for back-compat.\n */\nexport function buildDomain(config: PointTokenDomainConfig) {\n return {\n name: config.name,\n version: config.version ?? \"1\",\n chainId: config.chainId,\n verifyingContract: config.verifyingContract,\n };\n}\n\n/**\n * Domain mismatch error thrown by `assertDomainMatchesContract`.\n */\nexport class Eip712DomainMismatchError extends Error {\n constructor(\n public readonly field: \"name\" | \"version\" | \"chainId\" | \"verifyingContract\",\n public readonly expected: string,\n public readonly actual: string,\n ) {\n super(\n `EIP-712 domain mismatch on field \"${field}\": expected ${expected}, got ${actual}. ` +\n `Local SDK config is out of sync with deployed PointToken — signatures will be rejected on-chain. ` +\n `Update SDK config or contract before producing more signatures.`,\n );\n this.name = \"Eip712DomainMismatchError\";\n }\n}\n\n/**\n * One-RPC health check that the local EIP-712 domain config matches\n * what the deployed `PointToken` reports via `eip712Domain()`. If the\n * contract has bumped `version` from `\"1\"` to `\"2\"` (or any field\n * differs), every signature produced with the stale config will be\n * silently rejected on-chain (`ECDSA: invalid signature` — opaque to\n * the user).\n *\n * Recommended: call once at issuer-startup health check, not on every\n * mint. Throws `Eip712DomainMismatchError` describing the diverged\n * field.\n *\n * @example\n * ```ts\n * import { assertDomainMatchesContract, buildDomain } from \"@pafi-dev/core\";\n *\n * const expected = buildDomain({\n * name: \"PointToken\",\n * chainId: 8453,\n * verifyingContract: \"0x855c2046AD49AcF9B3B32557176FfCB1a1A38A22\",\n * });\n *\n * await assertDomainMatchesContract(publicClient, expected);\n * // → throws Eip712DomainMismatchError if version on-chain has bumped\n * ```\n */\nexport async function assertDomainMatchesContract(\n client: PublicClient,\n expected: ReturnType<typeof buildDomain>,\n): Promise<void> {\n const onChain = (await client.readContract({\n address: expected.verifyingContract as Address,\n abi: pointTokenAbi,\n functionName: \"eip712Domain\",\n })) as readonly [\n `0x${string}`, // fields (bytes1)\n string, // name\n string, // version\n bigint, // chainId\n Address, // verifyingContract\n `0x${string}`, // salt\n readonly bigint[], // extensions\n ];\n\n const [, name, version, chainId, verifyingContract] = onChain;\n\n if (name !== expected.name) {\n throw new Eip712DomainMismatchError(\"name\", expected.name, name);\n }\n if (version !== expected.version) {\n throw new Eip712DomainMismatchError(\n \"version\",\n expected.version,\n version,\n );\n }\n if (chainId !== BigInt(expected.chainId)) {\n throw new Eip712DomainMismatchError(\n \"chainId\",\n String(expected.chainId),\n chainId.toString(),\n );\n }\n if (\n verifyingContract.toLowerCase() !==\n expected.verifyingContract.toLowerCase()\n ) {\n throw new Eip712DomainMismatchError(\n \"verifyingContract\",\n expected.verifyingContract,\n verifyingContract,\n );\n }\n}\n","import { getAddress, parseSignature, recoverTypedDataAddress } from \"viem\";\nimport type { Address, Hex, WalletClient } from \"viem\";\nimport { mintRequestTypes } from \"../constants\";\nimport type {\n EIP712Signature,\n MintRequest,\n PointTokenDomainConfig,\n SignatureVerification,\n SignatureVerifyOptions,\n} from \"../types\";\nimport { buildDomain } from \"./domain\";\nimport { assertValidCurrentTimeSec } from \"./verifyDeadline\";\n\nconst PRIMARY_TYPE = \"MintForRequest\" as const;\n\n/**\n * Build the EIP-712 typed data object for a MintForRequest.\n * Returns the standard `{ domain, types, primaryType, message }` structure\n * that any EIP-712 signer (viem, ethers, Privy, WalletConnect) can consume.\n */\nexport function buildMintRequestTypedData(\n domain: PointTokenDomainConfig,\n message: MintRequest,\n) {\n return {\n domain: buildDomain(domain),\n types: mintRequestTypes,\n primaryType: PRIMARY_TYPE,\n message,\n };\n}\n\n/**\n * Sign a MintForRequest. Caller passes the full 5-field message:\n * - user = off-chain spender (drives nonce stream)\n * - receiver = on-chain caller (= msg.sender of `mint()`; wrapper or user)\n * - amount = PT amount\n * - nonce = pointToken.mintRequestNonces(user)\n * - deadline = unix seconds\n */\nexport async function signMintRequest(\n walletClient: WalletClient,\n domain: PointTokenDomainConfig,\n message: MintRequest,\n): Promise<EIP712Signature> {\n const serialized = await walletClient.signTypedData({\n account: walletClient.account!,\n domain: buildDomain(domain),\n types: mintRequestTypes,\n primaryType: PRIMARY_TYPE,\n message,\n });\n\n const { v, r, s } = parseSignature(serialized);\n\n return {\n v: Number(v),\n r,\n s,\n serialized,\n };\n}\n\n/**\n * Verify a MintForRequest signature. Always recovers the signer and\n * compares against `expectedMinter`. Pass `options.currentTimeSec`\n * (unix seconds) to additionally enforce the request's `deadline` —\n * the on-chain contract enforces `block.timestamp <= deadline`, so\n * a stale-but-cryptographically-valid sig will only revert\n * on-submission unless the caller pre-flights here.\n *\n * Result shape:\n * - `{ isValid: true, recoveredAddress }` — sig matches and (if\n * deadline check requested) deadline has not elapsed.\n * - `{ isValid: false, recoveredAddress, reason: 'INVALID_SIGNER' }`\n * — sig does not recover to `expectedMinter`.\n * - `{ isValid: false, recoveredAddress, reason: 'DEADLINE_PASSED' }`\n * — sig is valid but `deadline < currentTimeSec`.\n *\n * Throws (synchronous Promise rejection):\n * - When `options.currentTimeSec` is provided but not a finite,\n * non-negative number. Misusing the API should fail loudly.\n */\nexport async function verifyMintRequest(\n domain: PointTokenDomainConfig,\n message: MintRequest,\n signature: Hex,\n expectedMinter: Address,\n options?: SignatureVerifyOptions,\n): Promise<SignatureVerification> {\n assertValidCurrentTimeSec(options?.currentTimeSec);\n\n const recoveredAddress = await recoverTypedDataAddress({\n domain: buildDomain(domain),\n types: mintRequestTypes,\n primaryType: PRIMARY_TYPE,\n message,\n signature,\n });\n\n if (getAddress(recoveredAddress) !== getAddress(expectedMinter)) {\n return { isValid: false, recoveredAddress, reason: \"INVALID_SIGNER\" };\n }\n\n if (\n options?.currentTimeSec !== undefined &&\n message.deadline < BigInt(options.currentTimeSec)\n ) {\n return { isValid: false, recoveredAddress, reason: \"DEADLINE_PASSED\" };\n }\n\n return { isValid: true, recoveredAddress };\n}\n","import type { Address, Hex } from \"viem\";\nimport type { ChainConfig, PoolKey } from \"./types\";\n\n// -------------------------------------------------------------------------\n// EIP-712 type definitions for viem\n// -------------------------------------------------------------------------\n\n/**\n * EIP-712 typed data for the sig-gated mint path.\n *\n * Contract enforces:\n * - msg.sender == receiver (the on-chain caller of `mint`)\n * - nonce == mintRequestNonces[user] (per-user nonce stream)\n *\n * `user` is the off-chain spender (whose nonce advances), `receiver` is\n * the on-chain mint recipient. For direct mints `user == receiver` (user\n * calls PointToken.mint themselves). For wrapper-mediated mints `user ==\n * end-user`, `receiver == wrapper address`.\n */\nexport const mintRequestTypes = {\n MintForRequest: [\n { name: \"user\", type: \"address\" },\n { name: \"receiver\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n { name: \"nonce\", type: \"uint256\" },\n { name: \"deadline\", type: \"uint256\" },\n ],\n} as const;\n\nexport const burnRequestTypes = {\n BurnRequest: [\n { name: \"from\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n { name: \"nonce\", type: \"uint256\" },\n { name: \"deadline\", type: \"uint256\" },\n ],\n} as const;\n\n// Sponsored mints are implemented at the relayer layer (sponsor-relayer\n// pays gas for the sig-gated `MintForRequest`); the deployed PointToken\n// contract has no separate `ReceiverConsent` path, no extra EIP-712 type,\n// and no separate on-chain nonce mapping.\n\n// -------------------------------------------------------------------------\n// Chain-indexed constants — add entries here as new chains are supported\n// -------------------------------------------------------------------------\n\nexport const SUPPORTED_CHAINS: Record<number, ChainConfig> = {\n 8453: { name: \"Base\" },\n};\n\n/**\n * Uniswap V3 QuoterV2 — used by `findBestQuote` / `quoteExactInput` etc.\n * QuoterV2 (vs V1) reverts cleanly inside multicall and returns a 4-tuple\n * `(amountOut, sqrtPriceX96AfterList, initializedTicksCrossedList, gasEstimate)`.\n */\nexport const QUOTER_V2_ADDRESSES: Record<number, Address> = {\n 8453: \"0xa0765363D9EA1347Afcff6Ae21D6D7B9d36490D0\",\n};\n\n/**\n * Uniswap UniversalRouter — used for AA/batched swaps via PT delegated\n * accounts. Speaks V3 commands (`V3_SWAP_EXACT_IN = 0x00`,\n * `V3_SWAP_EXACT_OUT = 0x01`).\n */\nexport const UNIVERSAL_ROUTER_ADDRESSES: Record<number, Address> = {\n 8453: \"0x008887C992A5bDC24097E717Bfb71CE89483c5A2\",\n};\n\n/**\n * Uniswap V3 SwapRouter — used by `swapDirect`-style flows that bypass\n * the UniversalRouter. Takes `exactInput` / `exactOutput` with packed-bytes\n * paths directly.\n */\nexport const V3_SWAP_ROUTER_ADDRESSES: Record<number, Address> = {\n 8453: \"0xca937aC69708b00B72cc3247440211d8DbDAaFF8\",\n};\n\n/**\n * PAFI's Uniswap V3 factory — used together with `V3_POOL_INIT_CODE_HASH`\n * to derive pool addresses deterministically (`computeV3PoolAddress`).\n */\nexport const V3_FACTORY_ADDRESSES: Record<number, Address> = {\n 8453: \"0x154bAFC6C311f3909080f28438294Cd5184c2924\",\n};\n\n/**\n * Pool-init code hash for PAFI's V3 deployment. Combined with the factory\n * address + sorted tokens + fee, deterministically yields a pool's\n * address via the standard Uniswap V3 CREATE2 derivation.\n */\nexport const V3_POOL_INIT_CODE_HASH: Hex =\n \"0x15380e4800aaa7f219c07d4e07d86cc0e3df225c6a518a1f14f8565f6d9c57c3\";\n\nexport const COMMON_TOKENS: Record<number, Record<string, Address>> = {\n // Base\n 8453: {\n WETH: \"0x4200000000000000000000000000000000000006\",\n USDC: \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n USDT: \"0xfde4C96c8593536E31F229EA8f37b2ADa2699bb2\",\n },\n};\n\nexport const COMMON_POOLS: Record<number, PoolKey[]> = {\n // Base — Uniswap V3 pools (PAFI deployment)\n 8453: [\n // WETH/USDC 0.3%\n {\n token0: \"0x4200000000000000000000000000000000000006\",\n token1: \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n fee: 3000,\n },\n // WETH/USDC 0.05%\n {\n token0: \"0x4200000000000000000000000000000000000006\",\n token1: \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n fee: 500,\n },\n ],\n};\n\nexport const POINT_TOKEN_POOLS: Record<number, Record<Address, PoolKey[]>> = {\n // chainId → pointTokenAddress → PoolKey[]\n};\n\n// -------------------------------------------------------------------------\n// Protocol constants — chain-agnostic (same address on every EVM chain)\n// -------------------------------------------------------------------------\n\n/** ERC-4337 v0.7 EntryPoint — deployed deterministically across all EVM chains. */\nexport const ENTRY_POINT_V07: Address = \"0x0000000071727De22E5E9d8BAf0edAc6f37da032\";\n\n/**\n * ERC-4337 v0.8 EntryPoint — used by Pimlico's `Simple7702Account` impl\n * (`0xe6Cae83BdE06E4c305530e199D7217f42808555B`) and by permissionless's\n * `to7702SimpleSmartAccount`. EIP-7702 delegated EOAs in PAFI's flow\n * point at this EntryPoint, NOT v0.7.\n *\n * Why this matters: account.validateUserOp does\n * `require(msg.sender == entryPoint(), \"account: not from EntryPoint\")`.\n * If the bundler/paymaster sim runs against a different EntryPoint than\n * what the account's `entryPoint()` returns, the require fails and you\n * see `AA23 reverted account: not from EntryPoint`.\n */\nexport const ENTRY_POINT_V08: Address = \"0x4337084d9e255ff0702461cf8895ce9e3b5ff108\";\n\n/** Permit2 — Uniswap's universal approval contract, same address on all EVM chains. */\nexport const PERMIT2_ADDRESS: Address = \"0x000000000022D473030F116dDEE9F6B43aC78BA3\";\n","/**\n * Shared input validator for `verifyMintRequest` /\n * `verifyBurnRequest`'s `options.currentTimeSec`. Centralised so both\n * helpers fail in the same way on bad input — a quiet skip on\n * `NaN` / negative values would defeat the purpose of opting into\n * deadline checking.\n *\n * No-op when `currentTimeSec` is undefined: the caller did not opt in\n * to deadline checking.\n */\nexport function assertValidCurrentTimeSec(\n currentTimeSec: number | undefined,\n): void {\n if (currentTimeSec === undefined) return;\n if (!Number.isFinite(currentTimeSec) || currentTimeSec < 0) {\n throw new Error(\n `verifyDeadline: currentTimeSec must be a finite non-negative number (got ${String(\n currentTimeSec,\n )})`,\n );\n }\n}\n","import { getAddress, parseSignature, recoverTypedDataAddress } from \"viem\";\nimport type { Address, Hex, WalletClient } from \"viem\";\nimport { burnRequestTypes } from \"../constants\";\nimport type {\n BurnRequest,\n EIP712Signature,\n PointTokenDomainConfig,\n SignatureVerification,\n SignatureVerifyOptions,\n} from \"../types\";\nimport { buildDomain } from \"./domain\";\nimport { assertValidCurrentTimeSec } from \"./verifyDeadline\";\n\n/**\n * EIP-712 helpers for `BurnRequest` — consumed by the sig-gated burn\n * path on `PointToken`:\n *\n * burn(address from, uint256 amount, uint256 deadline, bytes burnerSig)\n *\n * Solidity type hash:\n * BurnRequest(address from,uint256 amount,uint256 nonce,uint256 deadline)\n *\n * Issuer backend signs with its burner signer (HSM/KMS). On-chain\n * `msg.sender` must equal `from`, and the recovered signer must be in\n * `burners[]`. Nonce comes from `burnRequestNonces[from]` and is\n * auto-incremented on success.\n */\nexport function buildBurnRequestTypedData(\n domain: PointTokenDomainConfig,\n message: BurnRequest,\n) {\n return {\n domain: buildDomain(domain),\n types: burnRequestTypes,\n primaryType: \"BurnRequest\" as const,\n message,\n };\n}\n\nexport async function signBurnRequest(\n walletClient: WalletClient,\n domain: PointTokenDomainConfig,\n message: BurnRequest,\n): Promise<EIP712Signature> {\n const serialized = await walletClient.signTypedData({\n account: walletClient.account!,\n domain: buildDomain(domain),\n types: burnRequestTypes,\n primaryType: \"BurnRequest\",\n message,\n });\n\n const { v, r, s } = parseSignature(serialized);\n\n return {\n v: Number(v),\n r,\n s,\n serialized,\n };\n}\n\n/**\n * Verify a BurnRequest signature. Symmetric with `verifyMintRequest`:\n * always recovers the signer; opt-in deadline check via\n * `options.currentTimeSec`. See that helper for the full contract.\n */\nexport async function verifyBurnRequest(\n domain: PointTokenDomainConfig,\n message: BurnRequest,\n signature: Hex,\n expectedBurner: Address,\n options?: SignatureVerifyOptions,\n): Promise<SignatureVerification> {\n assertValidCurrentTimeSec(options?.currentTimeSec);\n\n const recoveredAddress = await recoverTypedDataAddress({\n domain: buildDomain(domain),\n types: burnRequestTypes,\n primaryType: \"BurnRequest\",\n message,\n signature,\n });\n\n if (getAddress(recoveredAddress) !== getAddress(expectedBurner)) {\n return { isValid: false, recoveredAddress, reason: \"INVALID_SIGNER\" };\n }\n\n if (\n options?.currentTimeSec !== undefined &&\n message.deadline < BigInt(options.currentTimeSec)\n ) {\n return { isValid: false, recoveredAddress, reason: \"DEADLINE_PASSED\" };\n }\n\n return { isValid: true, recoveredAddress };\n}\n"],"mappings":"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","names":["getAddress","parseSignature","recoverTypedDataAddress","parseSignature","recoverTypedDataAddress","getAddress"]}