@pafi-dev/core 0.4.0 → 0.5.1

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 (38) hide show
  1. package/README.md +171 -71
  2. package/dist/{chunk-KJKDLD7N.cjs → chunk-2PY5RNVS.cjs} +11 -11
  3. package/dist/{chunk-KJKDLD7N.cjs.map → chunk-2PY5RNVS.cjs.map} +1 -1
  4. package/dist/{chunk-DMW67WBU.cjs → chunk-52SZJDFT.cjs} +6 -2
  5. package/dist/chunk-52SZJDFT.cjs.map +1 -0
  6. package/dist/{chunk-Z2V525IS.cjs → chunk-ARZSGP5Y.cjs} +6 -6
  7. package/dist/{chunk-Z2V525IS.cjs.map → chunk-ARZSGP5Y.cjs.map} +1 -1
  8. package/dist/{chunk-I2P3TIP7.js → chunk-N5M3BLOV.js} +2 -2
  9. package/dist/{chunk-73CQTNLB.js → chunk-S5CCEO4O.js} +6 -2
  10. package/dist/{chunk-73CQTNLB.js.map → chunk-S5CCEO4O.js.map} +1 -1
  11. package/dist/{chunk-543IPI6E.js → chunk-T6Y32SNK.js} +5 -3
  12. package/dist/chunk-T6Y32SNK.js.map +1 -0
  13. package/dist/{chunk-DUY7Z2AI.js → chunk-WTWG6QXP.js} +2 -2
  14. package/dist/{chunk-TYIEMGMY.cjs → chunk-YU7MFR6Y.cjs} +6 -4
  15. package/dist/chunk-YU7MFR6Y.cjs.map +1 -0
  16. package/dist/eip712/index.cjs +3 -3
  17. package/dist/eip712/index.js +2 -2
  18. package/dist/{index-CzBaRIqs.d.cts → index-BEx-Q1bW.d.cts} +1 -7
  19. package/dist/{index-C1FGQ004.d.ts → index-r4xCdQO7.d.ts} +1 -7
  20. package/dist/index.cjs +90 -35
  21. package/dist/index.cjs.map +1 -1
  22. package/dist/index.d.cts +95 -23
  23. package/dist/index.d.ts +95 -23
  24. package/dist/index.js +76 -21
  25. package/dist/index.js.map +1 -1
  26. package/dist/quoting/index.cjs +3 -3
  27. package/dist/quoting/index.js +2 -2
  28. package/dist/swap/index.cjs +3 -2
  29. package/dist/swap/index.cjs.map +1 -1
  30. package/dist/swap/index.d.cts +1 -1
  31. package/dist/swap/index.d.ts +1 -1
  32. package/dist/swap/index.js +2 -1
  33. package/package.json +1 -1
  34. package/dist/chunk-543IPI6E.js.map +0 -1
  35. package/dist/chunk-DMW67WBU.cjs.map +0 -1
  36. package/dist/chunk-TYIEMGMY.cjs.map +0 -1
  37. /package/dist/{chunk-I2P3TIP7.js.map → chunk-N5M3BLOV.js.map} +0 -0
  38. /package/dist/{chunk-DUY7Z2AI.js.map → chunk-WTWG6QXP.js.map} +0 -0
package/README.md CHANGED
@@ -1,140 +1,205 @@
1
1
  # @pafi-dev/core
2
2
 
3
- Core TypeScript SDK for the PAFI point token system. Provides EIP-712 signing/verification, contract ABIs + addresses, UserOp building, swap/perp calldata encoding, and on-chain quoting.
3
+ [![npm](https://img.shields.io/npm/v/@pafi-dev/core)](https://www.npmjs.com/package/@pafi-dev/core)
4
+ [![License: Apache-2.0](https://img.shields.io/badge/License-Apache--2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
4
5
 
5
- **Version:** `0.3.0-beta.10` Base mainnet ready.
6
+ Core TypeScript SDK for the PAFI point token system. Covers EIP-712 signing, contract addresses + ABIs, ERC-4337 UserOp building, swap/perp calldata encoding, and on-chain quoting.
7
+
8
+ **No HTTP client.** Safe to use in both browser (frontend) and Node.js (issuer backend).
9
+
10
+ ---
11
+
12
+ ## Requirements
13
+
14
+ - Node.js >= 18
15
+ - TypeScript >= 5.0
16
+ - `viem` ^2.0.0 (peer dependency)
6
17
 
7
18
  ---
8
19
 
9
20
  ## Installation
10
21
 
11
22
  ```bash
23
+ npm install @pafi-dev/core viem
24
+ # or
12
25
  pnpm add @pafi-dev/core viem
13
- # viem ^2.0.0 is a required peer dependency
14
26
  ```
15
27
 
16
28
  ---
17
29
 
18
- ## What this package covers
30
+ ## Modules
19
31
 
20
- | Module | What it does |
32
+ | Import path | What it provides |
21
33
  |---|---|
22
- | `eip712/` | Build + sign + verify `MintRequest` and `BurnRequest` EIP-712 typed data |
23
- | `contracts/` | Deployed contract addresses (Base mainnet 8453) + ABIs |
24
- | `userop/` | `encodeBatchExecute()`, `buildPartialUserOperation()`, `BATCH_EXECUTOR_ABI` |
25
- | `swap/` | `buildSwapWithGasDeduction()` — PT→USDT via UniversalRouter |
26
- | `perp/` | `buildPerpDepositWithGasDeduction()` — USDC deposit to Orderly Vault |
27
- | `quoting/` | `findBestQuote()` on-chain V4 Quoter multicall |
28
- | `auth/` | `createLoginMessage()` — EIP-4361 SIWE message builder |
29
- | `utils/` | `computeAccountId()` — Orderly perp account ID |
30
-
31
- **This package is HTTP-client-free.** It covers signing, calldata encoding, and on-chain reads only — no fetch calls. Use on both frontend and issuer backend.
34
+ | `@pafi-dev/core` | All exports below |
35
+ | `@pafi-dev/core/eip712` | `signMintRequest`, `verifyMintRequest`, `signBurnRequest`, `signReceiverConsent` |
36
+ | `@pafi-dev/core/contract` | `getContractAddresses()`, ABIs, address constants |
37
+ | `@pafi-dev/core/swap` | `buildSwapWithGasDeduction()` — PT→USDT via UniversalRouter |
38
+ | `@pafi-dev/core/quoting` | `findBestQuote()` — on-chain V4 Quoter multicall |
39
+ | `@pafi-dev/core/auth` | `createLoginMessage()`, `signSponsorAuth()`, `verifySponsorAuth()` |
40
+ | `@pafi-dev/core/relay` | `buildDelegationUserOp()`, `getAaNonce()` |
32
41
 
33
42
  ---
34
43
 
35
- ## Contract addresses (Base mainnet 8453)
44
+ ## Contract addresses
45
+
46
+ All deployed PAFI contract addresses live in one place, keyed by `chainId`:
36
47
 
37
48
  ```ts
38
- import { getContractAddresses, POINT_TOKEN_FACTORY_ADDRESSES, POINT_TOKEN_IMPL_ADDRESSES } from "@pafi-dev/core";
49
+ import { getContractAddresses, POINT_TOKEN_FACTORY_ADDRESSES } from "@pafi-dev/core";
39
50
 
40
- const addrs = getContractAddresses(8453);
41
- // addrs.issuerRegistry = "0xda2D3338CF70F462Ac175F5f2edfa45660CA4f31"
42
- // addrs.mintingOracle = "0xD85165939C700E51c8a45099316C6482634C2Ab9"
43
- // addrs.pafiHook = "0x870cAF9882d3160602AaC1769C2B264A2d8EC044"
44
- // addrs.usdt = "0x5d313485Ba59C3bb91e1A9C0C11782F0b83d5dcd"
45
- // addrs.batchExecutor = "0x7702cb554e6bFb442cb743A7dF23154544a7176C"
46
- // addrs.pointToken = "0x7d25E7156E51F865D522fd3ef257a6B5DD41b97e"
47
-
48
- // POINT_TOKEN_FACTORY_ADDRESSES[8453] = "0x36c0BAb2faBE45EfA6d13001143e43A266Af673B"
49
- // POINT_TOKEN_IMPL_ADDRESSES[8453] = "0x2e6FB1B0C1A51abb83eC974890126a64eC02E995"
51
+ const addrs = getContractAddresses(8453); // Base mainnet
52
+ // addrs.pointToken "0x7d25E7156E51F865D522fd3ef257a6B5DD41b97e"
53
+ // addrs.issuerRegistry "0xda2D3338CF70F462Ac175F5f2edfa45660CA4f31"
54
+ // addrs.mintingOracle "0xD85165939C700E51c8a45099316C6482634C2Ab9"
55
+ // addrs.pafiHook "0x870cAF9882d3160602AaC1769C2B264A2d8EC044"
56
+ // addrs.usdt "0x5d313485Ba59C3bb91e1A9C0C11782F0b83d5dcd"
57
+ // addrs.batchExecutor "0x7702cb554e6bFb442cb743A7dF23154544a7176C"
58
+
59
+ POINT_TOKEN_FACTORY_ADDRESSES[8453] // "0x36c0BAb2faBE45EfA6d13001143e43A266Af673B"
60
+ ```
61
+
62
+ Protocol constants (same on all EVM chains):
63
+
64
+ ```ts
65
+ import { ENTRY_POINT_V07, PERMIT2_ADDRESS } from "@pafi-dev/core";
66
+ // ENTRY_POINT_V07 "0x0000000071727De22E5E9d8BAf0edAc6f37da032"
67
+ // PERMIT2_ADDRESS "0x000000000022D473030F116dDEE9F6B43aC78BA3"
50
68
  ```
51
69
 
52
70
  ---
53
71
 
54
- ## EIP-712 signing (issuer backend)
72
+ ## EIP-712 signing
73
+
74
+ Used by the **issuer backend** to sign mint/burn authorization. The frontend
75
+ sends the signature alongside the UserOp to the Relay contract.
55
76
 
56
77
  ```ts
57
- import { signMintRequest, verifyMintRequest, signBurnRequest } from "@pafi-dev/core";
78
+ import { signMintRequest, verifyMintRequest } from "@pafi-dev/core";
58
79
 
59
80
  const domain = {
60
- name: "Test Point", // must match PointToken.name() on-chain
81
+ name: "GG56 Points", // must match PointToken.name() on-chain
61
82
  chainId: 8453,
62
- verifyingContract: "0x7d25E7156E51F865D522fd3ef257a6B5DD41b97e",
83
+ verifyingContract: addrs.pointToken,
63
84
  };
64
85
 
65
- // Sign MintRequest (issuer backend)
66
- const { signature } = await signMintRequest(walletClient, domain, {
67
- to: "0xUser",
86
+ const { signature } = await signMintRequest(issuerWalletClient, domain, {
87
+ to: userAddress,
68
88
  amount: 500n * 10n ** 18n,
69
- nonce: 0n,
70
- deadline: BigInt(Math.floor(Date.now() / 1000) + 900),
89
+ nonce: await getMintRequestNonce(publicClient, addrs.pointToken, userAddress),
90
+ deadline: BigInt(Math.floor(Date.now() / 1000) + 900), // 15 min
71
91
  });
72
92
 
73
- // Verify (optional offline check)
74
- const { valid } = await verifyMintRequest(domain, request, signature, expectedMinter);
93
+ // Offline verification (optional Relay contract verifies on-chain)
94
+ const { valid } = await verifyMintRequest(domain, request, signature, expectedSigner);
75
95
  ```
76
96
 
77
97
  ---
78
98
 
79
- ## Swap calldata PT -> USDT
99
+ ## SponsorAuthpaymaster authorization
100
+
101
+ The issuer backend signs a `SponsorAuth` payload so the PAFI paymaster proxy can
102
+ verify the request is authorized before spending gas on behalf of the user.
80
103
 
81
104
  ```ts
82
- import { buildSwapWithGasDeduction, findBestQuote, getContractAddresses } from "@pafi-dev/core";
105
+ import {
106
+ signSponsorAuth,
107
+ verifySponsorAuth,
108
+ computeCallDataHash,
109
+ type SponsorAuthPayload,
110
+ } from "@pafi-dev/core";
111
+
112
+ // Issuer backend: build + sign
113
+ const payload: SponsorAuthPayload = {
114
+ chainId: 8453,
115
+ sender: userAddress,
116
+ callDataHash: computeCallDataHash(userOp.callData),
117
+ nonce: BigInt(Date.now()) * 1_000_000n + BigInt(Math.floor(Math.random() * 1_000_000)),
118
+ expiresAt: Math.floor(Date.now() / 1000) + 600, // 10 min
119
+ scenario: "mint", // "mint" | "burn" | "swap"
120
+ issuerId: "gg56",
121
+ };
122
+
123
+ const sig = await signSponsorAuth(issuerWalletClient, payload);
124
+
125
+ // Paymaster proxy: verify before forwarding to Pimlico
126
+ const result = await verifySponsorAuth(payload, sig, expectedIssuerAddress);
127
+ // result.ok true/false
128
+ // result.reason "EXPIRED" | "INVALID_SIGNER" | "INVALID_SIGNATURE_FORMAT"
129
+ ```
130
+
131
+ ---
132
+
133
+ ## Swap calldata — PT → USDT
134
+
135
+ Builds the `callData` for a `BatchExecutor.execute()` call that:
136
+ 1. Approves Permit2
137
+ 2. Sets a Permit2 allowance for UniversalRouter
138
+ 3. Swaps PT → USDT via UniversalRouter
139
+ 4. Optionally deducts a gas fee in PT
140
+
141
+ ```ts
142
+ import {
143
+ buildSwapWithGasDeduction,
144
+ findBestQuote,
145
+ getContractAddresses,
146
+ UNIVERSAL_ROUTER_ADDRESSES,
147
+ } from "@pafi-dev/core";
83
148
 
84
149
  const addrs = getContractAddresses(8453);
85
150
 
86
- // Quote (on-chain V4 Quoter multicall)
151
+ // 1. Quote (on-chain V4 Quoter multicall — read-only)
87
152
  const quote = await findBestQuote(
88
- publicClient, 8453,
89
- addrs.pointToken, addrs.usdt,
153
+ publicClient,
154
+ 8453,
155
+ addrs.pointToken,
156
+ addrs.usdt,
90
157
  500n * 10n ** 18n,
91
- pools, // from gg56-backend POST /swap response
158
+ pools, // PoolKey[] from issuer backend GET /pools
92
159
  );
93
160
 
94
- // Build BatchExecutor callData
161
+ // 2. Build unsigned UserOp
95
162
  const userOp = buildSwapWithGasDeduction({
96
163
  chainId: 8453,
97
- sender: "0xUser",
164
+ sender: userAddress,
98
165
  pointTokenAddress: addrs.pointToken,
99
166
  usdtAddress: addrs.usdt,
100
- universalRouterAddress: "0xUniversalRouter...",
167
+ universalRouterAddress: UNIVERSAL_ROUTER_ADDRESSES[8453],
101
168
  pafiHookAddress: addrs.pafiHook,
102
169
  quote,
103
170
  slippageBps: 50,
104
171
  deadline: BigInt(Math.floor(Date.now() / 1000) + 300),
105
- aaNonce: 0n,
172
+ aaNonce: await getAaNonce(publicClient, userAddress),
106
173
  batchExecutorAddress: addrs.batchExecutor,
107
- gasFeePt: 0n,
174
+ gasFeePt: 0n, // set > 0 to deduct operator fee in PT
108
175
  });
109
- // userOp.callData -> BatchExecutor.execute([approve, swap])
110
176
  ```
111
177
 
112
178
  ---
113
179
 
114
- ## Perp deposit calldata — USDC -> Orderly
180
+ ## EIP-7702 delegation
181
+
182
+ One-time setup: sponsors the EIP-7702 delegation so the user's EOA gains
183
+ `BatchExecutor` capabilities without spending native ETH.
115
184
 
116
185
  ```ts
117
186
  import {
118
- buildPerpDepositWithGasDeduction,
119
- computeAccountId,
120
- BROKER_HASHES, TOKEN_HASHES, ORDERLY_VAULT_ADDRESSES,
187
+ buildDelegationUserOp,
188
+ getAaNonce,
189
+ getContractAddresses,
190
+ BATCH_EXECUTOR_ADDRESS_BASE_MAINNET,
121
191
  } from "@pafi-dev/core";
122
192
 
123
- const accountId = computeAccountId("0xUser", BROKER_HASHES["woofi_pro"]);
193
+ const aaNonce = await getAaNonce(publicClient, userAddress);
124
194
 
125
- const userOp = buildPerpDepositWithGasDeduction({
126
- chainId: 8453,
127
- sender: "0xUser",
128
- usdcAddress: "0xUSDC...",
129
- vaultAddress: ORDERLY_VAULT_ADDRESSES[8453],
130
- amount: 100n * 10n ** 6n,
131
- accountId,
132
- brokerHash: BROKER_HASHES["woofi_pro"],
133
- tokenHash: TOKEN_HASHES["USDC"],
134
- layerZeroFee: layerZeroFeeWei, // from Vault.getDepositFee()
135
- aaNonce: 0n,
136
- batchExecutorAddress: addrs.batchExecutor,
195
+ const userOp = buildDelegationUserOp({
196
+ userAddress,
197
+ aaNonce,
137
198
  });
199
+
200
+ // Then: sign the EIP-7702 authorization off-chain via Privy
201
+ // const authorization = await signAuthorization({ contractAddress: BATCH_EXECUTOR_ADDRESS_BASE_MAINNET, ... });
202
+ // await smartClient.sendTransaction({ to: userAddress, data: "0x", authorization });
138
203
  ```
139
204
 
140
205
  ---
@@ -145,26 +210,61 @@ const userOp = buildPerpDepositWithGasDeduction({
145
210
  import { createLoginMessage } from "@pafi-dev/core";
146
211
 
147
212
  const message = createLoginMessage({
148
- address: "0xUser",
213
+ address: userAddress,
149
214
  domain: "app.gg56.com",
150
215
  chainId: 8453,
151
- nonce: "abc123", // from GET /auth/nonce
216
+ nonce: nonceFromServer, // GET /auth/nonce
152
217
  issuedAt: new Date().toISOString(),
153
218
  uri: "https://app.gg56.com",
154
219
  });
220
+
221
+ // User signs with wallet, then POST /auth/login { message, signature }
222
+ ```
223
+
224
+ ---
225
+
226
+ ## Perp deposit calldata — USDC → Orderly
227
+
228
+ ```ts
229
+ import {
230
+ buildPerpDepositWithGasDeduction,
231
+ computeAccountId,
232
+ BROKER_HASHES,
233
+ TOKEN_HASHES,
234
+ ORDERLY_VAULT_ADDRESSES,
235
+ } from "@pafi-dev/core";
236
+
237
+ const accountId = computeAccountId(userAddress, BROKER_HASHES["woofi_pro"]);
238
+
239
+ const userOp = buildPerpDepositWithGasDeduction({
240
+ chainId: 8453,
241
+ sender: userAddress,
242
+ usdcAddress: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
243
+ vaultAddress: ORDERLY_VAULT_ADDRESSES[8453],
244
+ amount: 100n * 10n ** 6n,
245
+ accountId,
246
+ brokerHash: BROKER_HASHES["woofi_pro"],
247
+ tokenHash: TOKEN_HASHES["USDC"],
248
+ layerZeroFee: await vault.getDepositFee(),
249
+ aaNonce: await getAaNonce(publicClient, userAddress),
250
+ batchExecutorAddress: addrs.batchExecutor,
251
+ });
155
252
  ```
156
253
 
157
254
  ---
158
255
 
159
256
  ## Changelog
160
257
 
258
+ ### 0.4.0
259
+ - `sponsorAuth` module added — `signSponsorAuth`, `verifySponsorAuth`, `computeCallDataHash`
260
+ - `PERMIT2_ADDRESS` and `ENTRY_POINT_V07` centralised in `constants.ts`
261
+ - `BATCH_EXECUTOR_ADDRESS_BASE_*` derived from `addresses.ts` — no duplicate hardcoding
262
+
161
263
  ### 0.3.0-beta.10
162
- - Removed `sponsor-auth/` module (PAFI-signed EIP-712 SponsorAuth — superseded by Pimlico proxy)
163
264
  - All Base mainnet contract addresses live and verified against deployed contracts
164
265
 
165
266
  ### 0.3.0-beta.8/9
166
267
  - Full 4-scenario UserOp builders (mint, burn, swap, perp_deposit)
167
- - Added `SponsorAuth` signing helpers (removed in beta.10)
168
268
 
169
269
  ### 0.3.0-alpha.0
170
270
  - Initial EIP-7702 BatchExecutor support, UserOp primitives
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- var _chunkDMW67WBUcjs = require('./chunk-DMW67WBU.cjs');
5
+ var _chunk52SZJDFTcjs = require('./chunk-52SZJDFT.cjs');
6
6
 
7
7
  // src/eip712/domain.ts
8
8
  function buildDomain(config) {
@@ -19,7 +19,7 @@ var _viem = require('viem');
19
19
  function buildMintRequestTypedData(domain, message) {
20
20
  return {
21
21
  domain: buildDomain(domain),
22
- types: _chunkDMW67WBUcjs.mintRequestTypes,
22
+ types: _chunk52SZJDFTcjs.mintRequestTypes,
23
23
  primaryType: "MintRequest",
24
24
  message
25
25
  };
@@ -28,7 +28,7 @@ async function signMintRequest(walletClient, domain, message) {
28
28
  const serialized = await walletClient.signTypedData({
29
29
  account: walletClient.account,
30
30
  domain: buildDomain(domain),
31
- types: _chunkDMW67WBUcjs.mintRequestTypes,
31
+ types: _chunk52SZJDFTcjs.mintRequestTypes,
32
32
  primaryType: "MintRequest",
33
33
  message
34
34
  });
@@ -43,7 +43,7 @@ async function signMintRequest(walletClient, domain, message) {
43
43
  async function verifyMintRequest(domain, message, signature, expectedMinter) {
44
44
  const recoveredAddress = await _viem.recoverTypedDataAddress.call(void 0, {
45
45
  domain: buildDomain(domain),
46
- types: _chunkDMW67WBUcjs.mintRequestTypes,
46
+ types: _chunk52SZJDFTcjs.mintRequestTypes,
47
47
  primaryType: "MintRequest",
48
48
  message,
49
49
  signature
@@ -57,7 +57,7 @@ async function verifyMintRequest(domain, message, signature, expectedMinter) {
57
57
  function buildBurnRequestTypedData(domain, message) {
58
58
  return {
59
59
  domain: buildDomain(domain),
60
- types: _chunkDMW67WBUcjs.burnRequestTypes,
60
+ types: _chunk52SZJDFTcjs.burnRequestTypes,
61
61
  primaryType: "BurnRequest",
62
62
  message
63
63
  };
@@ -66,7 +66,7 @@ async function signBurnRequest(walletClient, domain, message) {
66
66
  const serialized = await walletClient.signTypedData({
67
67
  account: walletClient.account,
68
68
  domain: buildDomain(domain),
69
- types: _chunkDMW67WBUcjs.burnRequestTypes,
69
+ types: _chunk52SZJDFTcjs.burnRequestTypes,
70
70
  primaryType: "BurnRequest",
71
71
  message
72
72
  });
@@ -81,7 +81,7 @@ async function signBurnRequest(walletClient, domain, message) {
81
81
  async function verifyBurnRequest(domain, message, signature, expectedBurner) {
82
82
  const recoveredAddress = await _viem.recoverTypedDataAddress.call(void 0, {
83
83
  domain: buildDomain(domain),
84
- types: _chunkDMW67WBUcjs.burnRequestTypes,
84
+ types: _chunk52SZJDFTcjs.burnRequestTypes,
85
85
  primaryType: "BurnRequest",
86
86
  message,
87
87
  signature
@@ -95,7 +95,7 @@ async function verifyBurnRequest(domain, message, signature, expectedBurner) {
95
95
  function buildReceiverConsentTypedData(domain, message) {
96
96
  return {
97
97
  domain: buildDomain(domain),
98
- types: _chunkDMW67WBUcjs.receiverConsentTypes,
98
+ types: _chunk52SZJDFTcjs.receiverConsentTypes,
99
99
  primaryType: "ReceiverConsent",
100
100
  message
101
101
  };
@@ -104,7 +104,7 @@ async function signReceiverConsent(walletClient, domain, message) {
104
104
  const serialized = await walletClient.signTypedData({
105
105
  account: walletClient.account,
106
106
  domain: buildDomain(domain),
107
- types: _chunkDMW67WBUcjs.receiverConsentTypes,
107
+ types: _chunk52SZJDFTcjs.receiverConsentTypes,
108
108
  primaryType: "ReceiverConsent",
109
109
  message
110
110
  });
@@ -119,7 +119,7 @@ async function signReceiverConsent(walletClient, domain, message) {
119
119
  async function verifyReceiverConsent(domain, message, signature, expectedReceiver) {
120
120
  const recoveredAddress = await _viem.recoverTypedDataAddress.call(void 0, {
121
121
  domain: buildDomain(domain),
122
- types: _chunkDMW67WBUcjs.receiverConsentTypes,
122
+ types: _chunk52SZJDFTcjs.receiverConsentTypes,
123
123
  primaryType: "ReceiverConsent",
124
124
  message,
125
125
  signature
@@ -140,4 +140,4 @@ async function verifyReceiverConsent(domain, message, signature, expectedReceive
140
140
 
141
141
 
142
142
  exports.buildDomain = buildDomain; 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;
143
- //# sourceMappingURL=chunk-KJKDLD7N.cjs.map
143
+ //# sourceMappingURL=chunk-2PY5RNVS.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/phitran/Pacific-Finance/pafi-backend/pafi-sdk/packages/core/dist/chunk-KJKDLD7N.cjs","../src/eip712/domain.ts","../src/eip712/mintRequest.ts","../src/eip712/burnRequest.ts","../src/eip712/receiverConsent.ts"],"names":["parseSignature","recoverTypedDataAddress","getAddress"],"mappings":"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","file":"/Users/phitran/Pacific-Finance/pafi-backend/pafi-sdk/packages/core/dist/chunk-KJKDLD7N.cjs","sourcesContent":[null,"import type { PointTokenDomainConfig } from \"../types\";\n\nexport function buildDomain(config: PointTokenDomainConfig) {\n return {\n name: config.name,\n version: \"1\" as const,\n chainId: config.chainId,\n verifyingContract: config.verifyingContract,\n };\n}\n","import { getAddress, parseSignature, recoverTypedDataAddress } from \"viem\";\nimport type { Address, Hex, WalletClient } from \"viem\";\nimport { mintRequestTypes } from \"../constants\";\nimport type { EIP712Signature, MintRequest, PointTokenDomainConfig, SignatureVerification } from \"../types\";\nimport { buildDomain } from \"./domain\";\n\n/**\n * Build the EIP-712 typed data object for a MintRequest.\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: \"MintRequest\" as const,\n message,\n };\n}\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: \"MintRequest\",\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\nexport async function verifyMintRequest(\n domain: PointTokenDomainConfig,\n message: MintRequest,\n signature: Hex,\n expectedMinter: Address,\n): Promise<SignatureVerification> {\n const recoveredAddress = await recoverTypedDataAddress({\n domain: buildDomain(domain),\n types: mintRequestTypes,\n primaryType: \"MintRequest\",\n message,\n signature,\n });\n\n const isValid = getAddress(recoveredAddress) === getAddress(expectedMinter);\n\n return { isValid, recoveredAddress };\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} from \"../types\";\nimport { buildDomain } from \"./domain\";\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\nexport async function verifyBurnRequest(\n domain: PointTokenDomainConfig,\n message: BurnRequest,\n signature: Hex,\n expectedBurner: Address,\n): Promise<SignatureVerification> {\n const recoveredAddress = await recoverTypedDataAddress({\n domain: buildDomain(domain),\n types: burnRequestTypes,\n primaryType: \"BurnRequest\",\n message,\n signature,\n });\n\n const isValid = getAddress(recoveredAddress) === getAddress(expectedBurner);\n\n return { isValid, recoveredAddress };\n}\n","import { getAddress, parseSignature, recoverTypedDataAddress } from \"viem\";\nimport type { Address, Hex, WalletClient } from \"viem\";\nimport { receiverConsentTypes } from \"../constants\";\nimport type { EIP712Signature, PointTokenDomainConfig, ReceiverConsent, SignatureVerification } from \"../types\";\nimport { buildDomain } from \"./domain\";\n\n/**\n * Build the EIP-712 typed data object for a ReceiverConsent.\n * Returns the standard `{ domain, types, primaryType, message }` structure\n * that any EIP-712 signer (viem, ethers, Privy, WalletConnect) can consume.\n */\nexport function buildReceiverConsentTypedData(\n domain: PointTokenDomainConfig,\n message: ReceiverConsent,\n) {\n return {\n domain: buildDomain(domain),\n types: receiverConsentTypes,\n primaryType: \"ReceiverConsent\" as const,\n message,\n };\n}\n\nexport async function signReceiverConsent(\n walletClient: WalletClient,\n domain: PointTokenDomainConfig,\n message: ReceiverConsent,\n): Promise<EIP712Signature> {\n const serialized = await walletClient.signTypedData({\n account: walletClient.account!,\n domain: buildDomain(domain),\n types: receiverConsentTypes,\n primaryType: \"ReceiverConsent\",\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\nexport async function verifyReceiverConsent(\n domain: PointTokenDomainConfig,\n message: ReceiverConsent,\n signature: Hex,\n expectedReceiver: Address,\n): Promise<SignatureVerification> {\n const recoveredAddress = await recoverTypedDataAddress({\n domain: buildDomain(domain),\n types: receiverConsentTypes,\n primaryType: \"ReceiverConsent\",\n message,\n signature,\n });\n\n const isValid = getAddress(recoveredAddress) === getAddress(expectedReceiver);\n\n return { isValid, recoveredAddress };\n}\n"]}
1
+ {"version":3,"sources":["/Users/phitran/Pacific-Finance/pafi-backend/pafi-sdk/packages/core/dist/chunk-2PY5RNVS.cjs","../src/eip712/domain.ts","../src/eip712/mintRequest.ts","../src/eip712/burnRequest.ts","../src/eip712/receiverConsent.ts"],"names":["parseSignature","recoverTypedDataAddress","getAddress"],"mappings":"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","file":"/Users/phitran/Pacific-Finance/pafi-backend/pafi-sdk/packages/core/dist/chunk-2PY5RNVS.cjs","sourcesContent":[null,"import type { PointTokenDomainConfig } from \"../types\";\n\nexport function buildDomain(config: PointTokenDomainConfig) {\n return {\n name: config.name,\n version: \"1\" as const,\n chainId: config.chainId,\n verifyingContract: config.verifyingContract,\n };\n}\n","import { getAddress, parseSignature, recoverTypedDataAddress } from \"viem\";\nimport type { Address, Hex, WalletClient } from \"viem\";\nimport { mintRequestTypes } from \"../constants\";\nimport type { EIP712Signature, MintRequest, PointTokenDomainConfig, SignatureVerification } from \"../types\";\nimport { buildDomain } from \"./domain\";\n\n/**\n * Build the EIP-712 typed data object for a MintRequest.\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: \"MintRequest\" as const,\n message,\n };\n}\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: \"MintRequest\",\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\nexport async function verifyMintRequest(\n domain: PointTokenDomainConfig,\n message: MintRequest,\n signature: Hex,\n expectedMinter: Address,\n): Promise<SignatureVerification> {\n const recoveredAddress = await recoverTypedDataAddress({\n domain: buildDomain(domain),\n types: mintRequestTypes,\n primaryType: \"MintRequest\",\n message,\n signature,\n });\n\n const isValid = getAddress(recoveredAddress) === getAddress(expectedMinter);\n\n return { isValid, recoveredAddress };\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} from \"../types\";\nimport { buildDomain } from \"./domain\";\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\nexport async function verifyBurnRequest(\n domain: PointTokenDomainConfig,\n message: BurnRequest,\n signature: Hex,\n expectedBurner: Address,\n): Promise<SignatureVerification> {\n const recoveredAddress = await recoverTypedDataAddress({\n domain: buildDomain(domain),\n types: burnRequestTypes,\n primaryType: \"BurnRequest\",\n message,\n signature,\n });\n\n const isValid = getAddress(recoveredAddress) === getAddress(expectedBurner);\n\n return { isValid, recoveredAddress };\n}\n","import { getAddress, parseSignature, recoverTypedDataAddress } from \"viem\";\nimport type { Address, Hex, WalletClient } from \"viem\";\nimport { receiverConsentTypes } from \"../constants\";\nimport type { EIP712Signature, PointTokenDomainConfig, ReceiverConsent, SignatureVerification } from \"../types\";\nimport { buildDomain } from \"./domain\";\n\n/**\n * Build the EIP-712 typed data object for a ReceiverConsent.\n * Returns the standard `{ domain, types, primaryType, message }` structure\n * that any EIP-712 signer (viem, ethers, Privy, WalletConnect) can consume.\n */\nexport function buildReceiverConsentTypedData(\n domain: PointTokenDomainConfig,\n message: ReceiverConsent,\n) {\n return {\n domain: buildDomain(domain),\n types: receiverConsentTypes,\n primaryType: \"ReceiverConsent\" as const,\n message,\n };\n}\n\nexport async function signReceiverConsent(\n walletClient: WalletClient,\n domain: PointTokenDomainConfig,\n message: ReceiverConsent,\n): Promise<EIP712Signature> {\n const serialized = await walletClient.signTypedData({\n account: walletClient.account!,\n domain: buildDomain(domain),\n types: receiverConsentTypes,\n primaryType: \"ReceiverConsent\",\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\nexport async function verifyReceiverConsent(\n domain: PointTokenDomainConfig,\n message: ReceiverConsent,\n signature: Hex,\n expectedReceiver: Address,\n): Promise<SignatureVerification> {\n const recoveredAddress = await recoverTypedDataAddress({\n domain: buildDomain(domain),\n types: receiverConsentTypes,\n primaryType: \"ReceiverConsent\",\n message,\n signature,\n });\n\n const isValid = getAddress(recoveredAddress) === getAddress(expectedReceiver);\n\n return { isValid, recoveredAddress };\n}\n"]}
@@ -66,6 +66,8 @@ var COMMON_POOLS = {
66
66
  var POINT_TOKEN_POOLS = {
67
67
  // chainId → pointTokenAddress → PoolKey[]
68
68
  };
69
+ var ENTRY_POINT_V07 = "0x0000000071727De22E5E9d8BAf0edAc6f37da032";
70
+ var PERMIT2_ADDRESS = "0x000000000022D473030F116dDEE9F6B43aC78BA3";
69
71
 
70
72
 
71
73
 
@@ -77,5 +79,7 @@ var POINT_TOKEN_POOLS = {
77
79
 
78
80
 
79
81
 
80
- 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;
81
- //# sourceMappingURL=chunk-DMW67WBU.cjs.map
82
+
83
+
84
+ 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.PERMIT2_ADDRESS = PERMIT2_ADDRESS;
85
+ //# sourceMappingURL=chunk-52SZJDFT.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/phitran/Pacific-Finance/pafi-backend/pafi-sdk/packages/core/dist/chunk-52SZJDFT.cjs","../src/constants.ts"],"names":[],"mappings":"AAAA;ACOO,IAAM,iBAAA,EAAmB;AAAA,EAC9B,WAAA,EAAa;AAAA,IACX,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,UAAU,CAAA;AAAA,IAC9B,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,UAAU,CAAA;AAAA,IAClC,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,UAAU,CAAA;AAAA,IACjC,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,UAAU;AAAA,EACtC;AACF,CAAA;AAEO,IAAM,iBAAA,EAAmB;AAAA,EAC9B,WAAA,EAAa;AAAA,IACX,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,UAAU,CAAA;AAAA,IAChC,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,UAAU,CAAA;AAAA,IAClC,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,UAAU,CAAA;AAAA,IACjC,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,UAAU;AAAA,EACtC;AACF,CAAA;AAEO,IAAM,qBAAA,EAAuB;AAAA,EAClC,eAAA,EAAiB;AAAA,IACf,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,UAAU,CAAA;AAAA,IACtC,EAAE,IAAA,EAAM,kBAAA,EAAoB,IAAA,EAAM,UAAU,CAAA;AAAA,IAC5C,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,UAAU,CAAA;AAAA,IAClC,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,UAAU,CAAA;AAAA,IACjC,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,UAAU,CAAA;AAAA,IACpC,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,QAAQ;AAAA,EACnC;AACF,CAAA;AAMO,IAAM,iBAAA,EAAgD;AAAA,EAC3D,IAAA,EAAM,EAAE,IAAA,EAAM,OAAO;AACvB,CAAA;AAEO,IAAM,oBAAA,EAA+C;AAAA,EAC1D,IAAA,EAAM;AACR,CAAA;AAEO,IAAM,2BAAA,EAAsD;AAAA,EACjE,IAAA,EAAM;AACR,CAAA;AAEO,IAAM,cAAA,EAAyD;AAAA;AAAA,EAEpE,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,4CAAA;AAAA,IACN,IAAA,EAAM,4CAAA;AAAA,IACN,IAAA,EAAM;AAAA,EACR;AACF,CAAA;AAEO,IAAM,aAAA,EAA0C;AAAA;AAAA,EAErD,IAAA,EAAM;AAAA;AAAA,IAEJ;AAAA,MACE,SAAA,EAAW,4CAAA;AAAA,MACX,SAAA,EAAW,4CAAA;AAAA,MACX,GAAA,EAAK,GAAA;AAAA,MACL,WAAA,EAAa,EAAA;AAAA,MACb,KAAA,EAAO;AAAA,IACT,CAAA;AAAA;AAAA,IAEA;AAAA,MACE,SAAA,EAAW,4CAAA;AAAA,MACX,SAAA,EAAW,4CAAA;AAAA,MACX,GAAA,EAAK,GAAA;AAAA,MACL,WAAA,EAAa,EAAA;AAAA,MACb,KAAA,EAAO;AAAA,IACT;AAAA,EACF;AACF,CAAA;AAEO,IAAM,kBAAA,EAAgE;AAAA;AAE7E,CAAA;AAOO,IAAM,gBAAA,EAA2B,4CAAA;AAGjC,IAAM,gBAAA,EAA2B,4CAAA;ADzBxC;AACA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,ggBAAC","file":"/Users/phitran/Pacific-Finance/pafi-backend/pafi-sdk/packages/core/dist/chunk-52SZJDFT.cjs","sourcesContent":[null,"import type { Address } from \"viem\";\nimport type { ChainConfig, PoolKey } from \"./types\";\n\n// -------------------------------------------------------------------------\n// EIP-712 type definitions for viem\n// -------------------------------------------------------------------------\n\nexport const mintRequestTypes = {\n MintRequest: [\n { name: \"to\", 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\nexport const receiverConsentTypes = {\n ReceiverConsent: [\n { name: \"onBehalfOf\", type: \"address\" },\n { name: \"originalReceiver\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n { name: \"nonce\", type: \"uint256\" },\n { name: \"deadline\", type: \"uint256\" },\n { name: \"extData\", type: \"bytes\" },\n ],\n} as const;\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\nexport const V4_QUOTER_ADDRESSES: Record<number, Address> = {\n 8453: \"0x0d5e0f971ed27fbff6c2837bf31316121532048d\",\n};\n\nexport const UNIVERSAL_ROUTER_ADDRESSES: Record<number, Address> = {\n 8453: \"0x6ff5693b99212da76ad316178a184ab56d299b43\",\n};\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 — existing Uniswap V4 pools\n 8453: [\n // WETH/USDC 0.3%\n {\n currency0: \"0x4200000000000000000000000000000000000006\",\n currency1: \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n fee: 3000,\n tickSpacing: 60,\n hooks: \"0x0000000000000000000000000000000000000000\",\n },\n // WETH/USDC 0.05%\n {\n currency0: \"0x4200000000000000000000000000000000000006\",\n currency1: \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n fee: 500,\n tickSpacing: 10,\n hooks: \"0x0000000000000000000000000000000000000000\",\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/** Permit2 — Uniswap's universal approval contract, same address on all EVM chains. */\nexport const PERMIT2_ADDRESS: Address = \"0x000000000022D473030F116dDEE9F6B43aC78BA3\";\n"]}
@@ -5,13 +5,13 @@ var _chunkCL3QSI4Ocjs = require('./chunk-CL3QSI4O.cjs');
5
5
 
6
6
 
7
7
 
8
- var _chunkDMW67WBUcjs = require('./chunk-DMW67WBU.cjs');
8
+ var _chunk52SZJDFTcjs = require('./chunk-52SZJDFT.cjs');
9
9
 
10
10
  // src/quoting/routes.ts
11
11
  var ZERO_ADDRESS = "0x0000000000000000000000000000000000000000";
12
12
  function combineRoutes(chainId, pointTokenAddress) {
13
- const commonPools = _nullishCoalesce(_chunkDMW67WBUcjs.COMMON_POOLS[chainId], () => ( []));
14
- const pointPools = _nullishCoalesce(_optionalChain([_chunkDMW67WBUcjs.POINT_TOKEN_POOLS, 'access', _ => _[chainId], 'optionalAccess', _2 => _2[pointTokenAddress]]), () => ( []));
13
+ const commonPools = _nullishCoalesce(_chunk52SZJDFTcjs.COMMON_POOLS[chainId], () => ( []));
14
+ const pointPools = _nullishCoalesce(_optionalChain([_chunk52SZJDFTcjs.POINT_TOKEN_POOLS, 'access', _ => _[chainId], 'optionalAccess', _2 => _2[pointTokenAddress]]), () => ( []));
15
15
  return [...pointPools, ...commonPools];
16
16
  }
17
17
  function buildAllPaths(pools, tokenIn, tokenOut, maxHops = 3) {
@@ -112,11 +112,11 @@ async function quoteBestRoute(client, quoterAddress, exactCurrency, routes, exac
112
112
  return { bestRoute, allRoutes };
113
113
  }
114
114
  async function findBestQuote(client, chainId, tokenIn, tokenOut, exactAmount, pools = [], quoterAddress, maxHops = 3) {
115
- const quoter = _nullishCoalesce(quoterAddress, () => ( _chunkDMW67WBUcjs.V4_QUOTER_ADDRESSES[chainId]));
115
+ const quoter = _nullishCoalesce(quoterAddress, () => ( _chunk52SZJDFTcjs.V4_QUOTER_ADDRESSES[chainId]));
116
116
  if (!quoter) {
117
117
  throw new Error(`No V4 Quoter address configured for chain ${chainId}`);
118
118
  }
119
- const commonPools = _nullishCoalesce(_chunkDMW67WBUcjs.COMMON_POOLS[chainId], () => ( []));
119
+ const commonPools = _nullishCoalesce(_chunk52SZJDFTcjs.COMMON_POOLS[chainId], () => ( []));
120
120
  const allPools = [...pools, ...commonPools];
121
121
  const paths = buildAllPaths(allPools, tokenIn, tokenOut, maxHops);
122
122
  if (paths.length === 0) {
@@ -133,4 +133,4 @@ async function findBestQuote(client, chainId, tokenIn, tokenOut, exactAmount, po
133
133
 
134
134
 
135
135
  exports.combineRoutes = combineRoutes; exports.buildAllPaths = buildAllPaths; exports.quoteExactInput = quoteExactInput; exports.quoteExactInputSingle = quoteExactInputSingle; exports.quoteBestRoute = quoteBestRoute; exports.findBestQuote = findBestQuote;
136
- //# sourceMappingURL=chunk-Z2V525IS.cjs.map
136
+ //# sourceMappingURL=chunk-ARZSGP5Y.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/phitran/Pacific-Finance/pafi-backend/pafi-sdk/packages/core/dist/chunk-Z2V525IS.cjs","../src/quoting/routes.ts","../src/quoting/quote.ts"],"names":[],"mappings":"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","file":"/Users/phitran/Pacific-Finance/pafi-backend/pafi-sdk/packages/core/dist/chunk-Z2V525IS.cjs","sourcesContent":[null,"import type { Address } from \"viem\";\nimport type { PathKey, PoolKey } from \"../types\";\nimport { COMMON_POOLS, POINT_TOKEN_POOLS } from \"../constants\";\n\nconst ZERO_ADDRESS = \"0x0000000000000000000000000000000000000000\" as Address;\n\n/**\n * Combine point-token-specific pools and common pools for a given chain.\n * Point token pools are listed first so callers can prioritise them.\n */\nexport function combineRoutes(\n chainId: number,\n pointTokenAddress: Address,\n): PoolKey[] {\n const commonPools = COMMON_POOLS[chainId] ?? [];\n const pointPools = POINT_TOKEN_POOLS[chainId]?.[pointTokenAddress] ?? [];\n return [...pointPools, ...commonPools];\n}\n\n/**\n * Build all possible swap paths from `tokenIn` to `tokenOut` using the given\n * pools. Returns an array of PathKey[] routes (each up to `maxHops` hops).\n *\n * Supports both direct single-hop routes and multi-hop routes through\n * intermediate tokens. Each pool is used at most once per path.\n *\n * @param pools - Available pools to route through\n * @param tokenIn - Input token address\n * @param tokenOut - Desired output token address\n * @param maxHops - Maximum number of hops (default 3)\n */\nexport function buildAllPaths(\n pools: PoolKey[],\n tokenIn: Address,\n tokenOut: Address,\n maxHops = 3,\n): PathKey[][] {\n const results: PathKey[][] = [];\n\n function dfs(\n currentToken: Address,\n currentPath: PathKey[],\n usedPoolIndices: Set<number>,\n ) {\n if (currentPath.length > maxHops) return;\n\n // Check if we've reached the destination\n if (\n currentPath.length > 0 &&\n currentToken.toLowerCase() === tokenOut.toLowerCase()\n ) {\n results.push([...currentPath]);\n return;\n }\n\n for (let i = 0; i < pools.length; i++) {\n if (usedPoolIndices.has(i)) continue;\n\n const pool = pools[i]!;\n const c0 = pool.currency0.toLowerCase();\n const c1 = pool.currency1.toLowerCase();\n const curr = currentToken.toLowerCase();\n\n let nextToken: Address | null = null;\n if (curr === c0) {\n nextToken = pool.currency1 as Address;\n } else if (curr === c1) {\n nextToken = pool.currency0 as Address;\n }\n\n if (!nextToken) continue;\n\n const hop: PathKey = {\n intermediateCurrency: nextToken,\n fee: pool.fee,\n tickSpacing: pool.tickSpacing,\n hooks: pool.hooks ?? ZERO_ADDRESS,\n hookData: \"0x\",\n };\n\n usedPoolIndices.add(i);\n currentPath.push(hop);\n dfs(nextToken, currentPath, usedPoolIndices);\n currentPath.pop();\n usedPoolIndices.delete(i);\n }\n }\n\n dfs(tokenIn, [], new Set());\n return results;\n}\n","import type { Address, PublicClient } from \"viem\";\nimport type { BestQuote, PathKey, PoolKey, QuoteResult } from \"../types\";\nimport { v4QuoterAbi } from \"../abi/v4Quoter\";\nimport { buildAllPaths } from \"./routes\";\nimport { COMMON_POOLS, V4_QUOTER_ADDRESSES } from \"../constants\";\n\n/**\n * Quote exact-input for a multi-hop path.\n */\nexport async function quoteExactInput(\n client: PublicClient,\n quoterAddress: Address,\n exactCurrency: Address,\n path: PathKey[],\n exactAmount: bigint,\n): Promise<QuoteResult> {\n const [amountOut, gasEstimate] = await client.readContract({\n address: quoterAddress,\n abi: v4QuoterAbi,\n functionName: \"quoteExactInput\",\n args: [{ exactCurrency, path, exactAmount: BigInt(exactAmount) as unknown as number }],\n }) as [bigint, bigint];\n\n return { amountOut, gasEstimate, path };\n}\n\n/**\n * Quote exact-input for a single-hop swap, given an explicit PoolKey and direction.\n */\nexport async function quoteExactInputSingle(\n client: PublicClient,\n quoterAddress: Address,\n poolKey: PoolKey,\n zeroForOne: boolean,\n exactAmount: bigint,\n hookData: `0x${string}`,\n): Promise<{ amountOut: bigint; gasEstimate: bigint }> {\n const [amountOut, gasEstimate] = await client.readContract({\n address: quoterAddress,\n abi: v4QuoterAbi,\n functionName: \"quoteExactInputSingle\",\n args: [\n {\n poolKey,\n zeroForOne,\n exactAmount: BigInt(exactAmount) as unknown as number,\n hookData,\n },\n ],\n }) as [bigint, bigint];\n\n return { amountOut, gasEstimate };\n}\n\n/**\n * Try multiple PathKey[] routes and return the best quote plus all results.\n * Routes that fail (e.g. pool does not exist) are silently skipped.\n *\n * Uses viem multicall to batch all quotes into a single RPC call for speed.\n */\nexport async function quoteBestRoute(\n client: PublicClient,\n quoterAddress: Address,\n exactCurrency: Address,\n routes: PathKey[][],\n exactAmount: bigint,\n): Promise<BestQuote> {\n const results = await client.multicall({\n contracts: routes.map((path) => ({\n address: quoterAddress,\n abi: v4QuoterAbi,\n functionName: \"quoteExactInput\" as const,\n args: [\n {\n exactCurrency,\n path,\n exactAmount: BigInt(exactAmount) as unknown as number,\n },\n ],\n })),\n allowFailure: true,\n });\n\n const allRoutes: QuoteResult[] = [];\n for (let i = 0; i < results.length; i++) {\n const r = results[i]!;\n if (r.status === \"success\") {\n const [amountOut, gasEstimate] = r.result as unknown as [bigint, bigint];\n allRoutes.push({ amountOut, gasEstimate, path: routes[i]! });\n }\n }\n\n if (allRoutes.length === 0) {\n throw new Error(\"No valid routes found\");\n }\n\n const bestRoute = allRoutes.reduce((best, current) =>\n current.amountOut > best.amountOut ? current : best,\n );\n\n return { bestRoute, allRoutes };\n}\n\n/**\n * Find and quote the best swap route from `tokenIn` to `tokenOut`.\n *\n * Combines the caller's `pools` with `COMMON_POOLS[chainId]`, builds all\n * possible paths (up to `maxHops`), then quotes them all via a single\n * multicall and returns the best result.\n *\n * @param client - viem PublicClient\n * @param chainId - Chain ID (used to look up COMMON_POOLS and V4_QUOTER_ADDRESSES)\n * @param tokenIn - Input token address\n * @param tokenOut - Desired output token address\n * @param exactAmount - Exact input amount\n * @param pools - Additional pools to consider (e.g. point-token-specific)\n * @param quoterAddress - Override the default V4 Quoter address for this chain\n * @param maxHops - Maximum number of hops per path (default 3)\n */\nexport async function findBestQuote(\n client: PublicClient,\n chainId: number,\n tokenIn: Address,\n tokenOut: Address,\n exactAmount: bigint,\n pools: PoolKey[] = [],\n quoterAddress?: Address,\n maxHops = 3,\n): Promise<BestQuote> {\n const quoter = quoterAddress ?? V4_QUOTER_ADDRESSES[chainId];\n if (!quoter) {\n throw new Error(`No V4 Quoter address configured for chain ${chainId}`);\n }\n\n const commonPools = COMMON_POOLS[chainId] ?? [];\n const allPools = [...pools, ...commonPools];\n const paths = buildAllPaths(allPools, tokenIn, tokenOut, maxHops);\n\n if (paths.length === 0) {\n throw new Error(`No paths found from ${tokenIn} to ${tokenOut}`);\n }\n\n return quoteBestRoute(client, quoter, tokenIn, paths, exactAmount);\n}\n"]}
1
+ {"version":3,"sources":["/Users/phitran/Pacific-Finance/pafi-backend/pafi-sdk/packages/core/dist/chunk-ARZSGP5Y.cjs","../src/quoting/routes.ts","../src/quoting/quote.ts"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACF,wDAA6B;AAC7B;AACA;ACLA,IAAM,aAAA,EAAe,4CAAA;AAMd,SAAS,aAAA,CACd,OAAA,EACA,iBAAA,EACW;AACX,EAAA,MAAM,YAAA,mBAAc,8BAAA,CAAa,OAAO,CAAA,UAAK,CAAC,GAAA;AAC9C,EAAA,MAAM,WAAA,mCAAa,mCAAA,mBAAkB,OAAO,CAAA,4BAAA,CAAI,iBAAiB,GAAA,UAAK,CAAC,GAAA;AACvE,EAAA,OAAO,CAAC,GAAG,UAAA,EAAY,GAAG,WAAW,CAAA;AACvC;AAcO,SAAS,aAAA,CACd,KAAA,EACA,OAAA,EACA,QAAA,EACA,QAAA,EAAU,CAAA,EACG;AACb,EAAA,MAAM,QAAA,EAAuB,CAAC,CAAA;AAE9B,EAAA,SAAS,GAAA,CACP,YAAA,EACA,WAAA,EACA,eAAA,EACA;AACA,IAAA,GAAA,CAAI,WAAA,CAAY,OAAA,EAAS,OAAA,EAAS,MAAA;AAGlC,IAAA,GAAA,CACE,WAAA,CAAY,OAAA,EAAS,EAAA,GACrB,YAAA,CAAa,WAAA,CAAY,EAAA,IAAM,QAAA,CAAS,WAAA,CAAY,CAAA,EACpD;AACA,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAC,GAAG,WAAW,CAAC,CAAA;AAC7B,MAAA,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAA,IAAS,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,KAAA,CAAM,MAAA,EAAQ,CAAA,EAAA,EAAK;AACrC,MAAA,GAAA,CAAI,eAAA,CAAgB,GAAA,CAAI,CAAC,CAAA,EAAG,QAAA;AAE5B,MAAA,MAAM,KAAA,EAAO,KAAA,CAAM,CAAC,CAAA;AACpB,MAAA,MAAM,GAAA,EAAK,IAAA,CAAK,SAAA,CAAU,WAAA,CAAY,CAAA;AACtC,MAAA,MAAM,GAAA,EAAK,IAAA,CAAK,SAAA,CAAU,WAAA,CAAY,CAAA;AACtC,MAAA,MAAM,KAAA,EAAO,YAAA,CAAa,WAAA,CAAY,CAAA;AAEtC,MAAA,IAAI,UAAA,EAA4B,IAAA;AAChC,MAAA,GAAA,CAAI,KAAA,IAAS,EAAA,EAAI;AACf,QAAA,UAAA,EAAY,IAAA,CAAK,SAAA;AAAA,MACnB,EAAA,KAAA,GAAA,CAAW,KAAA,IAAS,EAAA,EAAI;AACtB,QAAA,UAAA,EAAY,IAAA,CAAK,SAAA;AAAA,MACnB;AAEA,MAAA,GAAA,CAAI,CAAC,SAAA,EAAW,QAAA;AAEhB,MAAA,MAAM,IAAA,EAAe;AAAA,QACnB,oBAAA,EAAsB,SAAA;AAAA,QACtB,GAAA,EAAK,IAAA,CAAK,GAAA;AAAA,QACV,WAAA,EAAa,IAAA,CAAK,WAAA;AAAA,QAClB,KAAA,mBAAO,IAAA,CAAK,KAAA,UAAS,cAAA;AAAA,QACrB,QAAA,EAAU;AAAA,MACZ,CAAA;AAEA,MAAA,eAAA,CAAgB,GAAA,CAAI,CAAC,CAAA;AACrB,MAAA,WAAA,CAAY,IAAA,CAAK,GAAG,CAAA;AACpB,MAAA,GAAA,CAAI,SAAA,EAAW,WAAA,EAAa,eAAe,CAAA;AAC3C,MAAA,WAAA,CAAY,GAAA,CAAI,CAAA;AAChB,MAAA,eAAA,CAAgB,MAAA,CAAO,CAAC,CAAA;AAAA,IAC1B;AAAA,EACF;AAEA,EAAA,GAAA,CAAI,OAAA,EAAS,CAAC,CAAA,kBAAG,IAAI,GAAA,CAAI,CAAC,CAAA;AAC1B,EAAA,OAAO,OAAA;AACT;ADpCA;AACA;AE9CA,MAAA,SAAsB,eAAA,CACpB,MAAA,EACA,aAAA,EACA,aAAA,EACA,IAAA,EACA,WAAA,EACsB;AACtB,EAAA,MAAM,CAAC,SAAA,EAAW,WAAW,EAAA,EAAI,MAAM,MAAA,CAAO,YAAA,CAAa;AAAA,IACzD,OAAA,EAAS,aAAA;AAAA,IACT,GAAA,EAAK,6BAAA;AAAA,IACL,YAAA,EAAc,iBAAA;AAAA,IACd,IAAA,EAAM,CAAC,EAAE,aAAA,EAAe,IAAA,EAAM,WAAA,EAAa,MAAA,CAAO,WAAW,EAAuB,CAAC;AAAA,EACvF,CAAC,CAAA;AAED,EAAA,OAAO,EAAE,SAAA,EAAW,WAAA,EAAa,KAAK,CAAA;AACxC;AAKA,MAAA,SAAsB,qBAAA,CACpB,MAAA,EACA,aAAA,EACA,OAAA,EACA,UAAA,EACA,WAAA,EACA,QAAA,EACqD;AACrD,EAAA,MAAM,CAAC,SAAA,EAAW,WAAW,EAAA,EAAI,MAAM,MAAA,CAAO,YAAA,CAAa;AAAA,IACzD,OAAA,EAAS,aAAA;AAAA,IACT,GAAA,EAAK,6BAAA;AAAA,IACL,YAAA,EAAc,uBAAA;AAAA,IACd,IAAA,EAAM;AAAA,MACJ;AAAA,QACE,OAAA;AAAA,QACA,UAAA;AAAA,QACA,WAAA,EAAa,MAAA,CAAO,WAAW,CAAA;AAAA,QAC/B;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,EAAE,SAAA,EAAW,YAAY,CAAA;AAClC;AAQA,MAAA,SAAsB,cAAA,CACpB,MAAA,EACA,aAAA,EACA,aAAA,EACA,MAAA,EACA,WAAA,EACoB;AACpB,EAAA,MAAM,QAAA,EAAU,MAAM,MAAA,CAAO,SAAA,CAAU;AAAA,IACrC,SAAA,EAAW,MAAA,CAAO,GAAA,CAAI,CAAC,IAAA,EAAA,GAAA,CAAU;AAAA,MAC/B,OAAA,EAAS,aAAA;AAAA,MACT,GAAA,EAAK,6BAAA;AAAA,MACL,YAAA,EAAc,iBAAA;AAAA,MACd,IAAA,EAAM;AAAA,QACJ;AAAA,UACE,aAAA;AAAA,UACA,IAAA;AAAA,UACA,WAAA,EAAa,MAAA,CAAO,WAAW;AAAA,QACjC;AAAA,MACF;AAAA,IACF,CAAA,CAAE,CAAA;AAAA,IACF,YAAA,EAAc;AAAA,EAChB,CAAC,CAAA;AAED,EAAA,MAAM,UAAA,EAA2B,CAAC,CAAA;AAClC,EAAA,IAAA,CAAA,IAAS,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,OAAA,CAAQ,MAAA,EAAQ,CAAA,EAAA,EAAK;AACvC,IAAA,MAAM,EAAA,EAAI,OAAA,CAAQ,CAAC,CAAA;AACnB,IAAA,GAAA,CAAI,CAAA,CAAE,OAAA,IAAW,SAAA,EAAW;AAC1B,MAAA,MAAM,CAAC,SAAA,EAAW,WAAW,EAAA,EAAI,CAAA,CAAE,MAAA;AACnC,MAAA,SAAA,CAAU,IAAA,CAAK,EAAE,SAAA,EAAW,WAAA,EAAa,IAAA,EAAM,MAAA,CAAO,CAAC,EAAG,CAAC,CAAA;AAAA,IAC7D;AAAA,EACF;AAEA,EAAA,GAAA,CAAI,SAAA,CAAU,OAAA,IAAW,CAAA,EAAG;AAC1B,IAAA,MAAM,IAAI,KAAA,CAAM,uBAAuB,CAAA;AAAA,EACzC;AAEA,EAAA,MAAM,UAAA,EAAY,SAAA,CAAU,MAAA;AAAA,IAAO,CAAC,IAAA,EAAM,OAAA,EAAA,GACxC,OAAA,CAAQ,UAAA,EAAY,IAAA,CAAK,UAAA,EAAY,QAAA,EAAU;AAAA,EACjD,CAAA;AAEA,EAAA,OAAO,EAAE,SAAA,EAAW,UAAU,CAAA;AAChC;AAkBA,MAAA,SAAsB,aAAA,CACpB,MAAA,EACA,OAAA,EACA,OAAA,EACA,QAAA,EACA,WAAA,EACA,MAAA,EAAmB,CAAC,CAAA,EACpB,aAAA,EACA,QAAA,EAAU,CAAA,EACU;AACpB,EAAA,MAAM,OAAA,mBAAS,aAAA,UAAiB,qCAAA,CAAoB,OAAO,GAAA;AAC3D,EAAA,GAAA,CAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0CAAA,EAA6C,OAAO,CAAA,CAAA;AACtE,EAAA;AAE8C,EAAA;AACJ,EAAA;AACsB,EAAA;AAExC,EAAA;AACyC,IAAA;AACjE,EAAA;AAEiE,EAAA;AACnE;AFjByE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/Users/phitran/Pacific-Finance/pafi-backend/pafi-sdk/packages/core/dist/chunk-ARZSGP5Y.cjs","sourcesContent":[null,"import type { Address } from \"viem\";\nimport type { PathKey, PoolKey } from \"../types\";\nimport { COMMON_POOLS, POINT_TOKEN_POOLS } from \"../constants\";\n\nconst ZERO_ADDRESS = \"0x0000000000000000000000000000000000000000\" as Address;\n\n/**\n * Combine point-token-specific pools and common pools for a given chain.\n * Point token pools are listed first so callers can prioritise them.\n */\nexport function combineRoutes(\n chainId: number,\n pointTokenAddress: Address,\n): PoolKey[] {\n const commonPools = COMMON_POOLS[chainId] ?? [];\n const pointPools = POINT_TOKEN_POOLS[chainId]?.[pointTokenAddress] ?? [];\n return [...pointPools, ...commonPools];\n}\n\n/**\n * Build all possible swap paths from `tokenIn` to `tokenOut` using the given\n * pools. Returns an array of PathKey[] routes (each up to `maxHops` hops).\n *\n * Supports both direct single-hop routes and multi-hop routes through\n * intermediate tokens. Each pool is used at most once per path.\n *\n * @param pools - Available pools to route through\n * @param tokenIn - Input token address\n * @param tokenOut - Desired output token address\n * @param maxHops - Maximum number of hops (default 3)\n */\nexport function buildAllPaths(\n pools: PoolKey[],\n tokenIn: Address,\n tokenOut: Address,\n maxHops = 3,\n): PathKey[][] {\n const results: PathKey[][] = [];\n\n function dfs(\n currentToken: Address,\n currentPath: PathKey[],\n usedPoolIndices: Set<number>,\n ) {\n if (currentPath.length > maxHops) return;\n\n // Check if we've reached the destination\n if (\n currentPath.length > 0 &&\n currentToken.toLowerCase() === tokenOut.toLowerCase()\n ) {\n results.push([...currentPath]);\n return;\n }\n\n for (let i = 0; i < pools.length; i++) {\n if (usedPoolIndices.has(i)) continue;\n\n const pool = pools[i]!;\n const c0 = pool.currency0.toLowerCase();\n const c1 = pool.currency1.toLowerCase();\n const curr = currentToken.toLowerCase();\n\n let nextToken: Address | null = null;\n if (curr === c0) {\n nextToken = pool.currency1 as Address;\n } else if (curr === c1) {\n nextToken = pool.currency0 as Address;\n }\n\n if (!nextToken) continue;\n\n const hop: PathKey = {\n intermediateCurrency: nextToken,\n fee: pool.fee,\n tickSpacing: pool.tickSpacing,\n hooks: pool.hooks ?? ZERO_ADDRESS,\n hookData: \"0x\",\n };\n\n usedPoolIndices.add(i);\n currentPath.push(hop);\n dfs(nextToken, currentPath, usedPoolIndices);\n currentPath.pop();\n usedPoolIndices.delete(i);\n }\n }\n\n dfs(tokenIn, [], new Set());\n return results;\n}\n","import type { Address, PublicClient } from \"viem\";\nimport type { BestQuote, PathKey, PoolKey, QuoteResult } from \"../types\";\nimport { v4QuoterAbi } from \"../abi/v4Quoter\";\nimport { buildAllPaths } from \"./routes\";\nimport { COMMON_POOLS, V4_QUOTER_ADDRESSES } from \"../constants\";\n\n/**\n * Quote exact-input for a multi-hop path.\n */\nexport async function quoteExactInput(\n client: PublicClient,\n quoterAddress: Address,\n exactCurrency: Address,\n path: PathKey[],\n exactAmount: bigint,\n): Promise<QuoteResult> {\n const [amountOut, gasEstimate] = await client.readContract({\n address: quoterAddress,\n abi: v4QuoterAbi,\n functionName: \"quoteExactInput\",\n args: [{ exactCurrency, path, exactAmount: BigInt(exactAmount) as unknown as number }],\n }) as [bigint, bigint];\n\n return { amountOut, gasEstimate, path };\n}\n\n/**\n * Quote exact-input for a single-hop swap, given an explicit PoolKey and direction.\n */\nexport async function quoteExactInputSingle(\n client: PublicClient,\n quoterAddress: Address,\n poolKey: PoolKey,\n zeroForOne: boolean,\n exactAmount: bigint,\n hookData: `0x${string}`,\n): Promise<{ amountOut: bigint; gasEstimate: bigint }> {\n const [amountOut, gasEstimate] = await client.readContract({\n address: quoterAddress,\n abi: v4QuoterAbi,\n functionName: \"quoteExactInputSingle\",\n args: [\n {\n poolKey,\n zeroForOne,\n exactAmount: BigInt(exactAmount) as unknown as number,\n hookData,\n },\n ],\n }) as [bigint, bigint];\n\n return { amountOut, gasEstimate };\n}\n\n/**\n * Try multiple PathKey[] routes and return the best quote plus all results.\n * Routes that fail (e.g. pool does not exist) are silently skipped.\n *\n * Uses viem multicall to batch all quotes into a single RPC call for speed.\n */\nexport async function quoteBestRoute(\n client: PublicClient,\n quoterAddress: Address,\n exactCurrency: Address,\n routes: PathKey[][],\n exactAmount: bigint,\n): Promise<BestQuote> {\n const results = await client.multicall({\n contracts: routes.map((path) => ({\n address: quoterAddress,\n abi: v4QuoterAbi,\n functionName: \"quoteExactInput\" as const,\n args: [\n {\n exactCurrency,\n path,\n exactAmount: BigInt(exactAmount) as unknown as number,\n },\n ],\n })),\n allowFailure: true,\n });\n\n const allRoutes: QuoteResult[] = [];\n for (let i = 0; i < results.length; i++) {\n const r = results[i]!;\n if (r.status === \"success\") {\n const [amountOut, gasEstimate] = r.result as unknown as [bigint, bigint];\n allRoutes.push({ amountOut, gasEstimate, path: routes[i]! });\n }\n }\n\n if (allRoutes.length === 0) {\n throw new Error(\"No valid routes found\");\n }\n\n const bestRoute = allRoutes.reduce((best, current) =>\n current.amountOut > best.amountOut ? current : best,\n );\n\n return { bestRoute, allRoutes };\n}\n\n/**\n * Find and quote the best swap route from `tokenIn` to `tokenOut`.\n *\n * Combines the caller's `pools` with `COMMON_POOLS[chainId]`, builds all\n * possible paths (up to `maxHops`), then quotes them all via a single\n * multicall and returns the best result.\n *\n * @param client - viem PublicClient\n * @param chainId - Chain ID (used to look up COMMON_POOLS and V4_QUOTER_ADDRESSES)\n * @param tokenIn - Input token address\n * @param tokenOut - Desired output token address\n * @param exactAmount - Exact input amount\n * @param pools - Additional pools to consider (e.g. point-token-specific)\n * @param quoterAddress - Override the default V4 Quoter address for this chain\n * @param maxHops - Maximum number of hops per path (default 3)\n */\nexport async function findBestQuote(\n client: PublicClient,\n chainId: number,\n tokenIn: Address,\n tokenOut: Address,\n exactAmount: bigint,\n pools: PoolKey[] = [],\n quoterAddress?: Address,\n maxHops = 3,\n): Promise<BestQuote> {\n const quoter = quoterAddress ?? V4_QUOTER_ADDRESSES[chainId];\n if (!quoter) {\n throw new Error(`No V4 Quoter address configured for chain ${chainId}`);\n }\n\n const commonPools = COMMON_POOLS[chainId] ?? [];\n const allPools = [...pools, ...commonPools];\n const paths = buildAllPaths(allPools, tokenIn, tokenOut, maxHops);\n\n if (paths.length === 0) {\n throw new Error(`No paths found from ${tokenIn} to ${tokenOut}`);\n }\n\n return quoteBestRoute(client, quoter, tokenIn, paths, exactAmount);\n}\n"]}
@@ -5,7 +5,7 @@ import {
5
5
  COMMON_POOLS,
6
6
  POINT_TOKEN_POOLS,
7
7
  V4_QUOTER_ADDRESSES
8
- } from "./chunk-73CQTNLB.js";
8
+ } from "./chunk-S5CCEO4O.js";
9
9
 
10
10
  // src/quoting/routes.ts
11
11
  var ZERO_ADDRESS = "0x0000000000000000000000000000000000000000";
@@ -133,4 +133,4 @@ export {
133
133
  quoteBestRoute,
134
134
  findBestQuote
135
135
  };
136
- //# sourceMappingURL=chunk-I2P3TIP7.js.map
136
+ //# sourceMappingURL=chunk-N5M3BLOV.js.map