@pafi-dev/core 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +171 -71
- package/dist/{chunk-KJKDLD7N.cjs → chunk-2PY5RNVS.cjs} +11 -11
- package/dist/{chunk-KJKDLD7N.cjs.map → chunk-2PY5RNVS.cjs.map} +1 -1
- package/dist/{chunk-DMW67WBU.cjs → chunk-52SZJDFT.cjs} +6 -2
- package/dist/chunk-52SZJDFT.cjs.map +1 -0
- package/dist/{chunk-Z2V525IS.cjs → chunk-ARZSGP5Y.cjs} +6 -6
- package/dist/{chunk-Z2V525IS.cjs.map → chunk-ARZSGP5Y.cjs.map} +1 -1
- package/dist/{chunk-I2P3TIP7.js → chunk-N5M3BLOV.js} +2 -2
- package/dist/{chunk-73CQTNLB.js → chunk-S5CCEO4O.js} +6 -2
- package/dist/{chunk-73CQTNLB.js.map → chunk-S5CCEO4O.js.map} +1 -1
- package/dist/{chunk-543IPI6E.js → chunk-T6Y32SNK.js} +5 -3
- package/dist/chunk-T6Y32SNK.js.map +1 -0
- package/dist/{chunk-DUY7Z2AI.js → chunk-WTWG6QXP.js} +2 -2
- package/dist/{chunk-TYIEMGMY.cjs → chunk-YU7MFR6Y.cjs} +6 -4
- package/dist/chunk-YU7MFR6Y.cjs.map +1 -0
- package/dist/eip712/index.cjs +3 -3
- package/dist/eip712/index.js +2 -2
- package/dist/{index-CzBaRIqs.d.cts → index-BEx-Q1bW.d.cts} +1 -7
- package/dist/{index-C1FGQ004.d.ts → index-r4xCdQO7.d.ts} +1 -7
- package/dist/index.cjs +68 -34
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +32 -23
- package/dist/index.d.ts +32 -23
- package/dist/index.js +66 -32
- package/dist/index.js.map +1 -1
- package/dist/quoting/index.cjs +3 -3
- package/dist/quoting/index.js +2 -2
- package/dist/swap/index.cjs +3 -2
- package/dist/swap/index.cjs.map +1 -1
- package/dist/swap/index.d.cts +1 -1
- package/dist/swap/index.d.ts +1 -1
- package/dist/swap/index.js +2 -1
- package/package.json +12 -12
- package/dist/chunk-543IPI6E.js.map +0 -1
- package/dist/chunk-DMW67WBU.cjs.map +0 -1
- package/dist/chunk-TYIEMGMY.cjs.map +0 -1
- /package/dist/{chunk-I2P3TIP7.js.map → chunk-N5M3BLOV.js.map} +0 -0
- /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
|
-
|
|
3
|
+
[](https://www.npmjs.com/package/@pafi-dev/core)
|
|
4
|
+
[](https://opensource.org/licenses/Apache-2.0)
|
|
4
5
|
|
|
5
|
-
|
|
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
|
-
##
|
|
30
|
+
## Modules
|
|
19
31
|
|
|
20
|
-
|
|
|
32
|
+
| Import path | What it provides |
|
|
21
33
|
|---|---|
|
|
22
|
-
| `
|
|
23
|
-
| `
|
|
24
|
-
| `
|
|
25
|
-
| `
|
|
26
|
-
| `
|
|
27
|
-
| `
|
|
28
|
-
| `
|
|
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
|
|
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
|
|
49
|
+
import { getContractAddresses, POINT_TOKEN_FACTORY_ADDRESSES } from "@pafi-dev/core";
|
|
39
50
|
|
|
40
|
-
const addrs = getContractAddresses(8453);
|
|
41
|
-
// addrs.
|
|
42
|
-
// addrs.
|
|
43
|
-
// addrs.
|
|
44
|
-
// addrs.
|
|
45
|
-
// addrs.
|
|
46
|
-
// addrs.
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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
|
|
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
|
|
78
|
+
import { signMintRequest, verifyMintRequest } from "@pafi-dev/core";
|
|
58
79
|
|
|
59
80
|
const domain = {
|
|
60
|
-
name: "
|
|
81
|
+
name: "GG56 Points", // must match PointToken.name() on-chain
|
|
61
82
|
chainId: 8453,
|
|
62
|
-
verifyingContract:
|
|
83
|
+
verifyingContract: addrs.pointToken,
|
|
63
84
|
};
|
|
64
85
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
to: "0xUser",
|
|
86
|
+
const { signature } = await signMintRequest(issuerWalletClient, domain, {
|
|
87
|
+
to: userAddress,
|
|
68
88
|
amount: 500n * 10n ** 18n,
|
|
69
|
-
nonce:
|
|
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
|
-
//
|
|
74
|
-
const { valid } = await verifyMintRequest(domain, request, signature,
|
|
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
|
-
##
|
|
99
|
+
## SponsorAuth — paymaster 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 {
|
|
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,
|
|
89
|
-
|
|
153
|
+
publicClient,
|
|
154
|
+
8453,
|
|
155
|
+
addrs.pointToken,
|
|
156
|
+
addrs.usdt,
|
|
90
157
|
500n * 10n ** 18n,
|
|
91
|
-
pools, // from
|
|
158
|
+
pools, // PoolKey[] from issuer backend GET /pools
|
|
92
159
|
);
|
|
93
160
|
|
|
94
|
-
// Build
|
|
161
|
+
// 2. Build unsigned UserOp
|
|
95
162
|
const userOp = buildSwapWithGasDeduction({
|
|
96
163
|
chainId: 8453,
|
|
97
|
-
sender:
|
|
164
|
+
sender: userAddress,
|
|
98
165
|
pointTokenAddress: addrs.pointToken,
|
|
99
166
|
usdtAddress: addrs.usdt,
|
|
100
|
-
universalRouterAddress:
|
|
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:
|
|
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
|
-
##
|
|
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
|
-
|
|
119
|
-
|
|
120
|
-
|
|
187
|
+
buildDelegationUserOp,
|
|
188
|
+
getAaNonce,
|
|
189
|
+
getContractAddresses,
|
|
190
|
+
BATCH_EXECUTOR_ADDRESS_BASE_MAINNET,
|
|
121
191
|
} from "@pafi-dev/core";
|
|
122
192
|
|
|
123
|
-
const
|
|
193
|
+
const aaNonce = await getAaNonce(publicClient, userAddress);
|
|
124
194
|
|
|
125
|
-
const userOp =
|
|
126
|
-
|
|
127
|
-
|
|
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:
|
|
213
|
+
address: userAddress,
|
|
149
214
|
domain: "app.gg56.com",
|
|
150
215
|
chainId: 8453,
|
|
151
|
-
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
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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-
|
|
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
|
-
|
|
81
|
-
|
|
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
|
|
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(
|
|
14
|
-
const pointPools = _nullishCoalesce(_optionalChain([
|
|
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, () => (
|
|
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(
|
|
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-
|
|
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":"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","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-
|
|
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-
|
|
136
|
+
//# sourceMappingURL=chunk-N5M3BLOV.js.map
|