@pafi-dev/core 0.3.0-beta.4 → 0.3.0-beta.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/abi/index.cjs +2 -6
- package/dist/abi/index.cjs.map +1 -1
- package/dist/abi/index.d.cts +1 -286
- package/dist/abi/index.d.ts +1 -286
- package/dist/abi/index.js +1 -5
- package/dist/{chunk-5YH4D7QF.js → chunk-7UBO7DY5.js} +1 -1
- package/dist/{chunk-FGKLDKJK.cjs → chunk-ALCWYDVG.cjs} +1 -1
- package/dist/{chunk-FGKLDKJK.cjs.map → chunk-ALCWYDVG.cjs.map} +1 -1
- package/dist/{chunk-X3I5XWAR.cjs → chunk-CQCSQPWG.cjs} +2 -15
- package/dist/chunk-CQCSQPWG.cjs.map +1 -0
- package/dist/{chunk-CXFUP2YK.cjs → chunk-EDR5SFJN.cjs} +46 -6
- package/dist/chunk-EDR5SFJN.cjs.map +1 -0
- package/dist/{chunk-VQSRCMMK.js → chunk-QGO6X6LG.js} +2 -15
- package/dist/chunk-QGO6X6LG.js.map +1 -0
- package/dist/{chunk-IK4UK7KT.js → chunk-W23EJNYG.js} +44 -4
- package/dist/chunk-W23EJNYG.js.map +1 -0
- package/dist/contract/index.cjs +2 -5
- package/dist/contract/index.cjs.map +1 -1
- package/dist/contract/index.d.cts +2 -4
- package/dist/contract/index.d.ts +2 -4
- package/dist/contract/index.js +1 -4
- package/dist/eip712/index.d.cts +1 -1
- package/dist/eip712/index.d.ts +1 -1
- package/dist/{index-BYL8Nn-n.d.ts → index-B06IJlHe.d.ts} +1 -1
- package/dist/{index-B5OJ9Kcx.d.cts → index-B7pGBych.d.cts} +1 -1
- package/dist/index.cjs +36 -122
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +64 -115
- package/dist/index.d.ts +64 -115
- package/dist/index.js +34 -120
- package/dist/index.js.map +1 -1
- package/dist/quoting/index.d.cts +1 -1
- package/dist/quoting/index.d.ts +1 -1
- package/dist/swap/index.cjs +2 -3
- package/dist/swap/index.cjs.map +1 -1
- package/dist/swap/index.d.cts +2 -2
- package/dist/swap/index.d.ts +2 -2
- package/dist/swap/index.js +1 -2
- package/dist/{types-DGDlKiDe.d.ts → types-b5_Tokjl.d.cts} +1 -17
- package/dist/{types-DGDlKiDe.d.cts → types-b5_Tokjl.d.ts} +1 -17
- package/package.json +1 -1
- package/dist/chunk-27V32VNM.cjs +0 -370
- package/dist/chunk-27V32VNM.cjs.map +0 -1
- package/dist/chunk-4RYBJLF3.js +0 -370
- package/dist/chunk-4RYBJLF3.js.map +0 -1
- package/dist/chunk-5QJZT7VB.cjs +0 -46
- package/dist/chunk-5QJZT7VB.cjs.map +0 -1
- package/dist/chunk-CXFUP2YK.cjs.map +0 -1
- package/dist/chunk-IK4UK7KT.js.map +0 -1
- package/dist/chunk-L74CZAVQ.cjs +0 -99
- package/dist/chunk-L74CZAVQ.cjs.map +0 -1
- package/dist/chunk-P56TUGTS.js +0 -46
- package/dist/chunk-P56TUGTS.js.map +0 -1
- package/dist/chunk-VQSRCMMK.js.map +0 -1
- package/dist/chunk-X3I5XWAR.cjs.map +0 -1
- package/dist/chunk-X4IXUTTD.js +0 -99
- package/dist/chunk-X4IXUTTD.js.map +0 -1
- package/dist/relay/index.cjs +0 -19
- package/dist/relay/index.cjs.map +0 -1
- package/dist/relay/index.d.cts +0 -75
- package/dist/relay/index.d.ts +0 -75
- package/dist/relay/index.js +0 -19
- package/dist/relay/index.js.map +0 -1
- /package/dist/{chunk-5YH4D7QF.js.map → chunk-7UBO7DY5.js.map} +0 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Address, Hex, PublicClient } from 'viem';
|
|
2
|
-
import { Q as QuoteResult,
|
|
2
|
+
import { Q as QuoteResult, d as PathKey } from './types-b5_Tokjl.js';
|
|
3
3
|
|
|
4
4
|
declare function checkAllowance(client: PublicClient, token: Address, owner: Address, spender: Address): Promise<bigint>;
|
|
5
5
|
/**
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Address, Hex, PublicClient } from 'viem';
|
|
2
|
-
import { Q as QuoteResult,
|
|
2
|
+
import { Q as QuoteResult, d as PathKey } from './types-b5_Tokjl.cjs';
|
|
3
3
|
|
|
4
4
|
declare function checkAllowance(client: PublicClient, token: Address, owner: Address, spender: Address): Promise<bigint>;
|
|
5
5
|
/**
|
package/dist/index.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _chunkALCWYDVGcjs = require('./chunk-ALCWYDVG.cjs');
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
|
|
@@ -17,8 +17,7 @@ var _chunkGWLEEXM4cjs = require('./chunk-GWLEEXM4.cjs');
|
|
|
17
17
|
|
|
18
18
|
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
var _chunkX3I5XWARcjs = require('./chunk-X3I5XWAR.cjs');
|
|
20
|
+
var _chunkCQCSQPWGcjs = require('./chunk-CQCSQPWG.cjs');
|
|
22
21
|
|
|
23
22
|
|
|
24
23
|
|
|
@@ -65,10 +64,6 @@ var _chunkDMW67WBUcjs = require('./chunk-DMW67WBU.cjs');
|
|
|
65
64
|
|
|
66
65
|
|
|
67
66
|
|
|
68
|
-
var _chunkL74CZAVQcjs = require('./chunk-L74CZAVQ.cjs');
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
var _chunk27V32VNMcjs = require('./chunk-27V32VNM.cjs');
|
|
72
67
|
|
|
73
68
|
|
|
74
69
|
|
|
@@ -88,22 +83,13 @@ var _chunk27V32VNMcjs = require('./chunk-27V32VNM.cjs');
|
|
|
88
83
|
|
|
89
84
|
|
|
90
85
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
var _chunkCXFUP2YKcjs = require('./chunk-CXFUP2YK.cjs');
|
|
86
|
+
var _chunkEDR5SFJNcjs = require('./chunk-EDR5SFJN.cjs');
|
|
94
87
|
|
|
95
88
|
|
|
96
89
|
|
|
97
90
|
|
|
98
91
|
var _chunkIPXARZ6Fcjs = require('./chunk-IPXARZ6F.cjs');
|
|
99
92
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
var _chunk5QJZT7VBcjs = require('./chunk-5QJZT7VB.cjs');
|
|
106
|
-
|
|
107
93
|
// src/index.ts
|
|
108
94
|
var _viem = require('viem');
|
|
109
95
|
|
|
@@ -154,9 +140,9 @@ async function checkEthAndBranch(params) {
|
|
|
154
140
|
return balance >= required ? "normal" : "paymaster";
|
|
155
141
|
}
|
|
156
142
|
|
|
157
|
-
// src/contracts/
|
|
143
|
+
// src/contracts/real/pointToken.ts
|
|
158
144
|
|
|
159
|
-
var
|
|
145
|
+
var POINT_TOKEN_ABI = _viem.parseAbi.call(void 0, [
|
|
160
146
|
// --- Mint paths ---
|
|
161
147
|
"function mint(address to, uint256 amount) external",
|
|
162
148
|
"function mint(address to, uint256 amount, uint256 deadline, bytes minterSig) external",
|
|
@@ -199,23 +185,23 @@ var MOCK_POINT_TOKEN_V2_ABI = _viem.parseAbi.call(void 0, [
|
|
|
199
185
|
"event MintingOracleUpdated(address indexed mintingOracle)"
|
|
200
186
|
]);
|
|
201
187
|
|
|
202
|
-
// src/contracts/
|
|
203
|
-
var
|
|
204
|
-
var
|
|
188
|
+
// src/contracts/real/batchExecutor.ts
|
|
189
|
+
var BATCH_EXECUTOR_ADDRESS_BASE_SEPOLIA = "0x000000000000000000000000000000000000DE01";
|
|
190
|
+
var BATCH_EXECUTOR_ADDRESS_BASE_MAINNET = "0x000000000000000000000000000000000000DE02";
|
|
205
191
|
|
|
206
|
-
// src/contracts/
|
|
207
|
-
var
|
|
208
|
-
var
|
|
192
|
+
// src/contracts/real/addresses.ts
|
|
193
|
+
var PLACEHOLDER_DEAD = (suffix) => `0x000000000000000000000000000000000000${suffix.toLowerCase().padStart(4, "0")}`;
|
|
194
|
+
var CONTRACT_ADDRESSES = {
|
|
209
195
|
// Base mainnet — SC-delivered 2026-04-21
|
|
210
196
|
// registry: IssuerRegistry 0xda2D3338CF70F462Ac175F5f2edfa45660CA4f31
|
|
211
|
-
// factory: PointTokenFactory 0x36c0BAb2faBE45EfA6d13001143e43A266Af673B
|
|
197
|
+
// factory: PointTokenFactory 0x36c0BAb2faBE45EfA6d13001143e43A266Af673B
|
|
212
198
|
// oracle: MintingOracle 0xD85165939C700E51c8a45099316C6482634C2Ab9
|
|
213
|
-
// tokenImpl: PointToken (impl) 0x2e6FB1B0C1A51abb83eC974890126a64eC02E995
|
|
199
|
+
// tokenImpl: PointToken (impl) 0x2e6FB1B0C1A51abb83eC974890126a64eC02E995
|
|
214
200
|
// mockUsdt: MockERC20 0x5d313485Ba59C3bb91e1A9C0C11782F0b83d5dcd
|
|
215
201
|
// POINT: PointToken instance 0x7d25E7156E51F865D522fd3ef257a6B5DD41b97e
|
|
216
202
|
8453: {
|
|
217
203
|
pointToken: "0x7d25E7156E51F865D522fd3ef257a6B5DD41b97e",
|
|
218
|
-
batchExecutor:
|
|
204
|
+
batchExecutor: PLACEHOLDER_DEAD("de02"),
|
|
219
205
|
// ⏳ pending SC delivery
|
|
220
206
|
usdt: "0x5d313485Ba59C3bb91e1A9C0C11782F0b83d5dcd",
|
|
221
207
|
issuerRegistry: "0xda2D3338CF70F462Ac175F5f2edfa45660CA4f31",
|
|
@@ -224,26 +210,26 @@ var MOCK_ADDRESSES = {
|
|
|
224
210
|
// Base Sepolia — not in active use; placeholders kept so the map
|
|
225
211
|
// compiles for tooling that enumerates chains.
|
|
226
212
|
84532: {
|
|
227
|
-
pointToken:
|
|
228
|
-
batchExecutor:
|
|
229
|
-
usdt:
|
|
230
|
-
issuerRegistry:
|
|
231
|
-
mintingOracle:
|
|
213
|
+
pointToken: PLACEHOLDER_DEAD("dead"),
|
|
214
|
+
batchExecutor: PLACEHOLDER_DEAD("de01"),
|
|
215
|
+
usdt: PLACEHOLDER_DEAD("dead"),
|
|
216
|
+
issuerRegistry: PLACEHOLDER_DEAD("dead"),
|
|
217
|
+
mintingOracle: PLACEHOLDER_DEAD("dead")
|
|
232
218
|
}
|
|
233
219
|
};
|
|
234
220
|
var POINT_TOKEN_FACTORY_ADDRESSES = {
|
|
235
221
|
8453: "0x36c0BAb2faBE45EfA6d13001143e43A266Af673B",
|
|
236
|
-
84532:
|
|
222
|
+
84532: PLACEHOLDER_DEAD("dead")
|
|
237
223
|
};
|
|
238
224
|
var POINT_TOKEN_IMPL_ADDRESSES = {
|
|
239
225
|
8453: "0x2e6FB1B0C1A51abb83eC974890126a64eC02E995",
|
|
240
|
-
84532:
|
|
226
|
+
84532: PLACEHOLDER_DEAD("dead")
|
|
241
227
|
};
|
|
242
|
-
function
|
|
243
|
-
const addrs =
|
|
228
|
+
function getContractAddresses(chainId) {
|
|
229
|
+
const addrs = CONTRACT_ADDRESSES[chainId];
|
|
244
230
|
if (!addrs) {
|
|
245
231
|
throw new Error(
|
|
246
|
-
`
|
|
232
|
+
`getContractAddresses: no addresses for chainId ${chainId}. Supported: ${Object.keys(CONTRACT_ADDRESSES).join(", ")}`
|
|
247
233
|
);
|
|
248
234
|
}
|
|
249
235
|
return addrs;
|
|
@@ -376,10 +362,8 @@ var PafiSDK = class {
|
|
|
376
362
|
|
|
377
363
|
|
|
378
364
|
|
|
379
|
-
|
|
380
365
|
constructor(config) {
|
|
381
366
|
this._pointTokenAddress = config.pointTokenAddress;
|
|
382
|
-
this._relayContractAddress = config.relayContractAddress;
|
|
383
367
|
this._signer = config.signer;
|
|
384
368
|
this._chainId = config.chainId;
|
|
385
369
|
if (config.provider) {
|
|
@@ -396,9 +380,6 @@ var PafiSDK = class {
|
|
|
396
380
|
setPointTokenAddress(address) {
|
|
397
381
|
this._pointTokenAddress = address;
|
|
398
382
|
}
|
|
399
|
-
setRelayContractAddress(address) {
|
|
400
|
-
this._relayContractAddress = address;
|
|
401
|
-
}
|
|
402
383
|
setSigner(signer) {
|
|
403
384
|
this._signer = signer;
|
|
404
385
|
}
|
|
@@ -410,25 +391,25 @@ var PafiSDK = class {
|
|
|
410
391
|
// -------------------------------------------------------------------------
|
|
411
392
|
requirePointToken() {
|
|
412
393
|
if (!this._pointTokenAddress) {
|
|
413
|
-
throw new (0,
|
|
394
|
+
throw new (0, _chunkEDR5SFJNcjs.ConfigurationError)("pointTokenAddress not set");
|
|
414
395
|
}
|
|
415
396
|
return this._pointTokenAddress;
|
|
416
397
|
}
|
|
417
398
|
requireProvider() {
|
|
418
399
|
if (!this._provider) {
|
|
419
|
-
throw new (0,
|
|
400
|
+
throw new (0, _chunkEDR5SFJNcjs.ConfigurationError)("provider not set");
|
|
420
401
|
}
|
|
421
402
|
return this._provider;
|
|
422
403
|
}
|
|
423
404
|
requireSigner() {
|
|
424
405
|
if (!this._signer) {
|
|
425
|
-
throw new (0,
|
|
406
|
+
throw new (0, _chunkEDR5SFJNcjs.ConfigurationError)("signer not set");
|
|
426
407
|
}
|
|
427
408
|
return this._signer;
|
|
428
409
|
}
|
|
429
410
|
requireChainId() {
|
|
430
411
|
if (this._chainId === void 0) {
|
|
431
|
-
throw new (0,
|
|
412
|
+
throw new (0, _chunkEDR5SFJNcjs.ConfigurationError)("chainId not set");
|
|
432
413
|
}
|
|
433
414
|
return this._chainId;
|
|
434
415
|
}
|
|
@@ -439,24 +420,16 @@ var PafiSDK = class {
|
|
|
439
420
|
const provider = this.requireProvider();
|
|
440
421
|
const pointToken = this.requirePointToken();
|
|
441
422
|
const chainId = this.requireChainId();
|
|
442
|
-
const name = await
|
|
423
|
+
const name = await _chunkCQCSQPWGcjs.getTokenName.call(void 0, provider, pointToken);
|
|
443
424
|
return { name, verifyingContract: pointToken, chainId };
|
|
444
425
|
}
|
|
445
426
|
// -------------------------------------------------------------------------
|
|
446
427
|
// EIP-712 — delegates to pure functions
|
|
447
428
|
// -------------------------------------------------------------------------
|
|
448
|
-
/**
|
|
449
|
-
* Build the EIP-712 typed data for a MintRequest.
|
|
450
|
-
* Pass the result to any external signer (Privy, WalletConnect, etc.).
|
|
451
|
-
*/
|
|
452
429
|
async buildMintRequestTypedData(message) {
|
|
453
430
|
const domain = await this.getDomain();
|
|
454
431
|
return _chunkKJKDLD7Ncjs.buildMintRequestTypedData.call(void 0, domain, message);
|
|
455
432
|
}
|
|
456
|
-
/**
|
|
457
|
-
* Build the EIP-712 typed data for a ReceiverConsent.
|
|
458
|
-
* Pass the result to any external signer (Privy, WalletConnect, etc.).
|
|
459
|
-
*/
|
|
460
433
|
async buildReceiverConsentTypedData(message) {
|
|
461
434
|
const domain = await this.getDomain();
|
|
462
435
|
return _chunkKJKDLD7Ncjs.buildReceiverConsentTypedData.call(void 0, domain, message);
|
|
@@ -481,29 +454,20 @@ var PafiSDK = class {
|
|
|
481
454
|
// Contract reads
|
|
482
455
|
// -------------------------------------------------------------------------
|
|
483
456
|
async getMintRequestNonce(receiver) {
|
|
484
|
-
return
|
|
457
|
+
return _chunkCQCSQPWGcjs.getMintRequestNonce.call(void 0,
|
|
485
458
|
this.requireProvider(),
|
|
486
459
|
this.requirePointToken(),
|
|
487
460
|
receiver
|
|
488
461
|
);
|
|
489
462
|
}
|
|
490
463
|
async getReceiverConsentNonce(receiver) {
|
|
491
|
-
return
|
|
464
|
+
return _chunkCQCSQPWGcjs.getReceiverConsentNonce.call(void 0,
|
|
492
465
|
this.requireProvider(),
|
|
493
466
|
this.requirePointToken(),
|
|
494
467
|
receiver
|
|
495
468
|
);
|
|
496
469
|
}
|
|
497
470
|
// -------------------------------------------------------------------------
|
|
498
|
-
// Relay calldata — delegates to pure functions
|
|
499
|
-
// -------------------------------------------------------------------------
|
|
500
|
-
encodeMintAndSwap(mint, swap) {
|
|
501
|
-
return _chunkL74CZAVQcjs.encodeMintAndSwap.call(void 0, mint, swap);
|
|
502
|
-
}
|
|
503
|
-
decodeMintAndSwap(calldata) {
|
|
504
|
-
return _chunkL74CZAVQcjs.decodeMintAndSwap.call(void 0, calldata);
|
|
505
|
-
}
|
|
506
|
-
// -------------------------------------------------------------------------
|
|
507
471
|
// Quoting — delegates to pure functions
|
|
508
472
|
// -------------------------------------------------------------------------
|
|
509
473
|
/**
|
|
@@ -531,43 +495,11 @@ var PafiSDK = class {
|
|
|
531
495
|
* The caller provides `minAmountOut` after applying their own slippage.
|
|
532
496
|
*/
|
|
533
497
|
buildSwapFromQuote(params) {
|
|
534
|
-
return
|
|
535
|
-
}
|
|
536
|
-
/**
|
|
537
|
-
* Build Relay SwapParams + extData from a quote result.
|
|
538
|
-
* Returns ready-to-use args for `Relay.mintAndSwap`.
|
|
539
|
-
*/
|
|
540
|
-
buildRelaySwapParams(params) {
|
|
541
|
-
return _chunkL74CZAVQcjs.buildRelaySwapParams.call(void 0, params);
|
|
542
|
-
}
|
|
543
|
-
/**
|
|
544
|
-
* Encode extData for ReceiverConsent and MintParams.
|
|
545
|
-
* extData = abi.encode(minAmountOut, feeInUsdt)
|
|
546
|
-
*/
|
|
547
|
-
encodeExtData(minAmountOut, feeInUsdt) {
|
|
548
|
-
return _chunkL74CZAVQcjs.encodeExtData.call(void 0, minAmountOut, feeInUsdt);
|
|
498
|
+
return _chunkEDR5SFJNcjs.buildSwapFromQuote.call(void 0, params);
|
|
549
499
|
}
|
|
550
500
|
// -------------------------------------------------------------------------
|
|
551
501
|
// Simulation — dry-run via eth_call (no gas spent)
|
|
552
502
|
// -------------------------------------------------------------------------
|
|
553
|
-
/**
|
|
554
|
-
* Simulate a Relay.mintAndSwap call. Catches reverts (bad signatures,
|
|
555
|
-
* expired deadlines, insufficient mint cap, pool errors) before submitting.
|
|
556
|
-
*
|
|
557
|
-
* @param relayAddress - Relay contract address
|
|
558
|
-
* @param mint - MintParams with real signatures
|
|
559
|
-
* @param swap - SwapParams (path + deadline)
|
|
560
|
-
* @param from - Relayer address that will submit the tx
|
|
561
|
-
*/
|
|
562
|
-
async simulateMintAndSwap(relayAddress, mint, swap, from) {
|
|
563
|
-
return _chunkL74CZAVQcjs.simulateMintAndSwap.call(void 0,
|
|
564
|
-
this.requireProvider(),
|
|
565
|
-
relayAddress,
|
|
566
|
-
mint,
|
|
567
|
-
swap,
|
|
568
|
-
from
|
|
569
|
-
);
|
|
570
|
-
}
|
|
571
503
|
/**
|
|
572
504
|
* Simulate a UniversalRouter.execute swap call. Catches reverts (bad
|
|
573
505
|
* approvals, insufficient balance, pool errors) before submitting.
|
|
@@ -579,7 +511,7 @@ var PafiSDK = class {
|
|
|
579
511
|
* @param from - Address that will execute the swap
|
|
580
512
|
*/
|
|
581
513
|
async simulateSwap(routerAddress, commands, inputs, deadline, from) {
|
|
582
|
-
return
|
|
514
|
+
return _chunkEDR5SFJNcjs.simulateSwap.call(void 0,
|
|
583
515
|
this.requireProvider(),
|
|
584
516
|
routerAddress,
|
|
585
517
|
commands,
|
|
@@ -590,23 +522,13 @@ var PafiSDK = class {
|
|
|
590
522
|
}
|
|
591
523
|
// -------------------------------------------------------------------------
|
|
592
524
|
// Auth — EIP-4361 login helpers (offline, stateless)
|
|
593
|
-
//
|
|
594
|
-
// These are convenience wrappers around the pure functions in
|
|
595
|
-
// `./auth/loginMessage.ts`. They do NOT hit the network — the caller is
|
|
596
|
-
// responsible for fetching the nonce, POSTing the signed message, and
|
|
597
|
-
// storing the JWT returned by the issuer backend.
|
|
598
525
|
// -------------------------------------------------------------------------
|
|
599
|
-
/**
|
|
600
|
-
* Build an EIP-4361 login message for the current signer + chain. The
|
|
601
|
-
* caller supplies the issuer-specific fields (domain, nonce, uri); the SDK
|
|
602
|
-
* fills in the wallet address and chain id from its own config.
|
|
603
|
-
*/
|
|
604
526
|
async createLoginMessage(params) {
|
|
605
527
|
const signer = this.requireSigner();
|
|
606
528
|
const chainId = this.requireChainId();
|
|
607
529
|
const account = signer.account;
|
|
608
530
|
if (!account) {
|
|
609
|
-
throw new (0,
|
|
531
|
+
throw new (0, _chunkEDR5SFJNcjs.ConfigurationError)("signer has no account attached");
|
|
610
532
|
}
|
|
611
533
|
return _chunkGWLEEXM4cjs.createLoginMessage.call(void 0, { ...params, address: account.address, chainId });
|
|
612
534
|
}
|
|
@@ -615,7 +537,7 @@ var PafiSDK = class {
|
|
|
615
537
|
const signer = this.requireSigner();
|
|
616
538
|
const account = signer.account;
|
|
617
539
|
if (!account) {
|
|
618
|
-
throw new (0,
|
|
540
|
+
throw new (0, _chunkEDR5SFJNcjs.ConfigurationError)("signer has no account attached");
|
|
619
541
|
}
|
|
620
542
|
return signer.signMessage({ account, message });
|
|
621
543
|
}
|
|
@@ -712,13 +634,5 @@ var PafiSDK = class {
|
|
|
712
634
|
|
|
713
635
|
|
|
714
636
|
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
exports.ApiError = _chunk5QJZT7VBcjs.ApiError; exports.BATCH_EXECUTOR_ABI = _chunkCXFUP2YKcjs.BATCH_EXECUTOR_ABI; exports.BATCH_EXECUTOR_ADDRESS_BASE_MAINNET = MOCK_BATCH_EXECUTOR_ADDRESS_BASE_MAINNET; exports.BATCH_EXECUTOR_ADDRESS_BASE_SEPOLIA = MOCK_BATCH_EXECUTOR_ADDRESS_BASE_SEPOLIA; exports.COMMON_POOLS = _chunkDMW67WBUcjs.COMMON_POOLS; exports.COMMON_TOKENS = _chunkDMW67WBUcjs.COMMON_TOKENS; exports.CONTRACT_ADDRESSES = MOCK_ADDRESSES; exports.ConfigurationError = _chunk5QJZT7VBcjs.ConfigurationError; exports.ENTRY_POINT_V07 = ENTRY_POINT_V07; exports.POINT_TOKEN_FACTORY_ADDRESSES = POINT_TOKEN_FACTORY_ADDRESSES; exports.POINT_TOKEN_IMPL_ADDRESSES = POINT_TOKEN_IMPL_ADDRESSES; exports.POINT_TOKEN_POOLS = _chunkDMW67WBUcjs.POINT_TOKEN_POOLS; exports.POINT_TOKEN_V2_ABI = MOCK_POINT_TOKEN_V2_ABI; exports.PafiSDK = PafiSDK; exports.PafiSDKError = _chunk5QJZT7VBcjs.PafiSDKError; exports.SETTLE_ALL = _chunkCXFUP2YKcjs.SETTLE_ALL; exports.SUPPORTED_CHAINS = _chunkDMW67WBUcjs.SUPPORTED_CHAINS; exports.SWAP_EXACT_IN = _chunkCXFUP2YKcjs.SWAP_EXACT_IN; exports.SigningError = _chunk5QJZT7VBcjs.SigningError; exports.SimulationError = _chunk5QJZT7VBcjs.SimulationError; exports.TAKE_ALL = _chunkCXFUP2YKcjs.TAKE_ALL; exports.UNIVERSAL_ROUTER_ADDRESSES = _chunkDMW67WBUcjs.UNIVERSAL_ROUTER_ADDRESSES; exports.V4_QUOTER_ADDRESSES = _chunkDMW67WBUcjs.V4_QUOTER_ADDRESSES; exports.V4_SWAP = _chunkCXFUP2YKcjs.V4_SWAP; exports.ZERO_VALUE = ZERO_VALUE; exports._resetPaymasterConfigForTests = _resetPaymasterConfigForTests; exports.assembleUserOperation = _chunkCXFUP2YKcjs.assembleUserOperation; exports.buildAllPaths = _chunkZ2V525IScjs.buildAllPaths; exports.buildBurnRequestTypedData = _chunkKJKDLD7Ncjs.buildBurnRequestTypedData; exports.buildDomain = _chunkKJKDLD7Ncjs.buildDomain; exports.buildErc20ApprovalCalldata = _chunkCXFUP2YKcjs.buildErc20ApprovalCalldata; exports.buildMintRequestTypedData = _chunkKJKDLD7Ncjs.buildMintRequestTypedData; exports.buildPartialUserOperation = _chunkCXFUP2YKcjs.buildPartialUserOperation; exports.buildPermit2ApprovalCalldata = _chunkCXFUP2YKcjs.buildPermit2ApprovalCalldata; exports.buildReceiverConsentTypedData = _chunkKJKDLD7Ncjs.buildReceiverConsentTypedData; exports.buildRelaySwapParams = _chunkL74CZAVQcjs.buildRelaySwapParams; exports.buildSwapFromQuote = _chunkCXFUP2YKcjs.buildSwapFromQuote; exports.buildSwapWithGasDeduction = _chunkCXFUP2YKcjs.buildSwapWithGasDeduction; exports.buildUniversalRouterExecuteArgs = _chunkCXFUP2YKcjs.buildUniversalRouterExecuteArgs; exports.buildV4SwapInput = _chunkCXFUP2YKcjs.buildV4SwapInput; exports.burnRequestTypes = _chunkDMW67WBUcjs.burnRequestTypes; exports.checkAllowance = _chunkCXFUP2YKcjs.checkAllowance; exports.checkEthAndBranch = checkEthAndBranch; exports.combineRoutes = _chunkZ2V525IScjs.combineRoutes; exports.createLoginMessage = _chunkGWLEEXM4cjs.createLoginMessage; exports.decodeExtData = _chunkL74CZAVQcjs.decodeExtData; exports.decodeMintAndSwap = _chunkL74CZAVQcjs.decodeMintAndSwap; exports.encodeBatchExecute = _chunkCXFUP2YKcjs.encodeBatchExecute; exports.encodeExtData = _chunkL74CZAVQcjs.encodeExtData; exports.encodeMintAndSwap = _chunkL74CZAVQcjs.encodeMintAndSwap; exports.erc20Abi = _chunkIPXARZ6Fcjs.erc20Abi; exports.erc20ApproveOp = _chunkCXFUP2YKcjs.erc20ApproveOp; exports.erc20BurnOp = _chunkCXFUP2YKcjs.erc20BurnOp; exports.erc20TransferOp = _chunkCXFUP2YKcjs.erc20TransferOp; exports.findBestQuote = _chunkZ2V525IScjs.findBestQuote; exports.getContractAddresses = getMockAddresses; exports.getIssuer = _chunkX3I5XWARcjs.getIssuer2; exports.getMintRequestNonce = _chunkX3I5XWARcjs.getMintRequestNonce; exports.getPafiWebModalAdapter = getPafiWebModalAdapter; exports.getPaymasterConfig = getPaymasterConfig; exports.getPointTokenBalance = _chunkX3I5XWARcjs.getPointTokenBalance; exports.getPointTokenIssuer = _chunkX3I5XWARcjs.getPointTokenIssuer; exports.getPointTokenIssuerAddress = _chunkX3I5XWARcjs.getIssuer; exports.getReceiverConsentNonce = _chunkX3I5XWARcjs.getReceiverConsentNonce; exports.getTokenName = _chunkX3I5XWARcjs.getTokenName; exports.getUsdt = _chunkX3I5XWARcjs.getUsdt; exports.isActiveIssuer = _chunkX3I5XWARcjs.isActiveIssuer; exports.isMinter = _chunkX3I5XWARcjs.isMinter; exports.isPaymasterConfigured = isPaymasterConfigured; exports.issuerRegistryAbi = _chunkS2XRFFP3cjs.issuerRegistryAbi; exports.mintRequestTypes = _chunkDMW67WBUcjs.mintRequestTypes; exports.mintingOracleAbi = _chunkS2XRFFP3cjs.mintingOracleAbi; exports.openPafiWebModal = openPafiWebModal; exports.openWebPopup = openWebPopup; exports.parseLoginMessage = _chunkGWLEEXM4cjs.parseLoginMessage; exports.permit2Abi = _chunkIPXARZ6Fcjs.permit2Abi; exports.pointTokenAbi = _chunkS2XRFFP3cjs.pointTokenAbi; exports.pointTokenFactoryAbi = _chunkFGKLDKJKcjs.pointTokenFactoryAbi; exports.quoteBestRoute = _chunkZ2V525IScjs.quoteBestRoute; exports.quoteExactInput = _chunkZ2V525IScjs.quoteExactInput; exports.quoteExactInputSingle = _chunkZ2V525IScjs.quoteExactInputSingle; exports.rawCallOp = _chunkCXFUP2YKcjs.rawCallOp; exports.receiverConsentTypes = _chunkDMW67WBUcjs.receiverConsentTypes; exports.relayAbi = _chunk27V32VNMcjs.relayAbi; exports.setPafiWebModalAdapter = setPafiWebModalAdapter; exports.setPaymasterConfig = setPaymasterConfig; exports.signBurnRequest = _chunkKJKDLD7Ncjs.signBurnRequest; exports.signMintRequest = _chunkKJKDLD7Ncjs.signMintRequest; exports.signReceiverConsent = _chunkKJKDLD7Ncjs.signReceiverConsent; exports.simulateMintAndSwap = _chunkL74CZAVQcjs.simulateMintAndSwap; exports.simulateSwap = _chunkCXFUP2YKcjs.simulateSwap; exports.universalRouterAbi = _chunkIPXARZ6Fcjs.universalRouterAbi; exports.v4QuoterAbi = _chunkCL3QSI4Ocjs.v4QuoterAbi; exports.verifyBurnRequest = _chunkKJKDLD7Ncjs.verifyBurnRequest; exports.verifyLoginMessage = _chunkGWLEEXM4cjs.verifyLoginMessage; exports.verifyMintCap = _chunkX3I5XWARcjs.verifyMintCap; exports.verifyMintRequest = _chunkKJKDLD7Ncjs.verifyMintRequest; exports.verifyReceiverConsent = _chunkKJKDLD7Ncjs.verifyReceiverConsent; exports.webPopupAdapter = webPopupAdapter;
|
|
637
|
+
exports.ApiError = _chunkEDR5SFJNcjs.ApiError; exports.BATCH_EXECUTOR_ABI = _chunkEDR5SFJNcjs.BATCH_EXECUTOR_ABI; exports.BATCH_EXECUTOR_ADDRESS_BASE_MAINNET = BATCH_EXECUTOR_ADDRESS_BASE_MAINNET; exports.BATCH_EXECUTOR_ADDRESS_BASE_SEPOLIA = BATCH_EXECUTOR_ADDRESS_BASE_SEPOLIA; exports.COMMON_POOLS = _chunkDMW67WBUcjs.COMMON_POOLS; exports.COMMON_TOKENS = _chunkDMW67WBUcjs.COMMON_TOKENS; exports.CONTRACT_ADDRESSES = CONTRACT_ADDRESSES; exports.ConfigurationError = _chunkEDR5SFJNcjs.ConfigurationError; exports.ENTRY_POINT_V07 = ENTRY_POINT_V07; exports.POINT_TOKEN_FACTORY_ADDRESSES = POINT_TOKEN_FACTORY_ADDRESSES; exports.POINT_TOKEN_IMPL_ADDRESSES = POINT_TOKEN_IMPL_ADDRESSES; exports.POINT_TOKEN_POOLS = _chunkDMW67WBUcjs.POINT_TOKEN_POOLS; exports.POINT_TOKEN_V2_ABI = POINT_TOKEN_ABI; exports.PafiSDK = PafiSDK; exports.PafiSDKError = _chunkEDR5SFJNcjs.PafiSDKError; exports.SETTLE_ALL = _chunkEDR5SFJNcjs.SETTLE_ALL; exports.SUPPORTED_CHAINS = _chunkDMW67WBUcjs.SUPPORTED_CHAINS; exports.SWAP_EXACT_IN = _chunkEDR5SFJNcjs.SWAP_EXACT_IN; exports.SigningError = _chunkEDR5SFJNcjs.SigningError; exports.SimulationError = _chunkEDR5SFJNcjs.SimulationError; exports.TAKE_ALL = _chunkEDR5SFJNcjs.TAKE_ALL; exports.UNIVERSAL_ROUTER_ADDRESSES = _chunkDMW67WBUcjs.UNIVERSAL_ROUTER_ADDRESSES; exports.V4_QUOTER_ADDRESSES = _chunkDMW67WBUcjs.V4_QUOTER_ADDRESSES; exports.V4_SWAP = _chunkEDR5SFJNcjs.V4_SWAP; exports.ZERO_VALUE = ZERO_VALUE; exports._resetPaymasterConfigForTests = _resetPaymasterConfigForTests; exports.assembleUserOperation = _chunkEDR5SFJNcjs.assembleUserOperation; exports.buildAllPaths = _chunkZ2V525IScjs.buildAllPaths; exports.buildBurnRequestTypedData = _chunkKJKDLD7Ncjs.buildBurnRequestTypedData; exports.buildDomain = _chunkKJKDLD7Ncjs.buildDomain; exports.buildErc20ApprovalCalldata = _chunkEDR5SFJNcjs.buildErc20ApprovalCalldata; exports.buildMintRequestTypedData = _chunkKJKDLD7Ncjs.buildMintRequestTypedData; exports.buildPartialUserOperation = _chunkEDR5SFJNcjs.buildPartialUserOperation; exports.buildPermit2ApprovalCalldata = _chunkEDR5SFJNcjs.buildPermit2ApprovalCalldata; exports.buildReceiverConsentTypedData = _chunkKJKDLD7Ncjs.buildReceiverConsentTypedData; exports.buildSwapFromQuote = _chunkEDR5SFJNcjs.buildSwapFromQuote; exports.buildSwapWithGasDeduction = _chunkEDR5SFJNcjs.buildSwapWithGasDeduction; exports.buildUniversalRouterExecuteArgs = _chunkEDR5SFJNcjs.buildUniversalRouterExecuteArgs; exports.buildV4SwapInput = _chunkEDR5SFJNcjs.buildV4SwapInput; exports.burnRequestTypes = _chunkDMW67WBUcjs.burnRequestTypes; exports.checkAllowance = _chunkEDR5SFJNcjs.checkAllowance; exports.checkEthAndBranch = checkEthAndBranch; exports.combineRoutes = _chunkZ2V525IScjs.combineRoutes; exports.createLoginMessage = _chunkGWLEEXM4cjs.createLoginMessage; exports.encodeBatchExecute = _chunkEDR5SFJNcjs.encodeBatchExecute; exports.erc20Abi = _chunkIPXARZ6Fcjs.erc20Abi; exports.erc20ApproveOp = _chunkEDR5SFJNcjs.erc20ApproveOp; exports.erc20BurnOp = _chunkEDR5SFJNcjs.erc20BurnOp; exports.erc20TransferOp = _chunkEDR5SFJNcjs.erc20TransferOp; exports.findBestQuote = _chunkZ2V525IScjs.findBestQuote; exports.getContractAddresses = getContractAddresses; exports.getIssuer = _chunkCQCSQPWGcjs.getIssuer2; exports.getMintRequestNonce = _chunkCQCSQPWGcjs.getMintRequestNonce; exports.getPafiWebModalAdapter = getPafiWebModalAdapter; exports.getPaymasterConfig = getPaymasterConfig; exports.getPointTokenBalance = _chunkCQCSQPWGcjs.getPointTokenBalance; exports.getPointTokenIssuer = _chunkCQCSQPWGcjs.getPointTokenIssuer; exports.getPointTokenIssuerAddress = _chunkCQCSQPWGcjs.getIssuer; exports.getReceiverConsentNonce = _chunkCQCSQPWGcjs.getReceiverConsentNonce; exports.getTokenName = _chunkCQCSQPWGcjs.getTokenName; exports.isActiveIssuer = _chunkCQCSQPWGcjs.isActiveIssuer; exports.isMinter = _chunkCQCSQPWGcjs.isMinter; exports.isPaymasterConfigured = isPaymasterConfigured; exports.issuerRegistryAbi = _chunkS2XRFFP3cjs.issuerRegistryAbi; exports.mintRequestTypes = _chunkDMW67WBUcjs.mintRequestTypes; exports.mintingOracleAbi = _chunkS2XRFFP3cjs.mintingOracleAbi; exports.openPafiWebModal = openPafiWebModal; exports.openWebPopup = openWebPopup; exports.parseLoginMessage = _chunkGWLEEXM4cjs.parseLoginMessage; exports.permit2Abi = _chunkIPXARZ6Fcjs.permit2Abi; exports.pointTokenAbi = _chunkS2XRFFP3cjs.pointTokenAbi; exports.pointTokenFactoryAbi = _chunkALCWYDVGcjs.pointTokenFactoryAbi; exports.quoteBestRoute = _chunkZ2V525IScjs.quoteBestRoute; exports.quoteExactInput = _chunkZ2V525IScjs.quoteExactInput; exports.quoteExactInputSingle = _chunkZ2V525IScjs.quoteExactInputSingle; exports.rawCallOp = _chunkEDR5SFJNcjs.rawCallOp; exports.receiverConsentTypes = _chunkDMW67WBUcjs.receiverConsentTypes; exports.setPafiWebModalAdapter = setPafiWebModalAdapter; exports.setPaymasterConfig = setPaymasterConfig; exports.signBurnRequest = _chunkKJKDLD7Ncjs.signBurnRequest; exports.signMintRequest = _chunkKJKDLD7Ncjs.signMintRequest; exports.signReceiverConsent = _chunkKJKDLD7Ncjs.signReceiverConsent; exports.simulateSwap = _chunkEDR5SFJNcjs.simulateSwap; exports.universalRouterAbi = _chunkIPXARZ6Fcjs.universalRouterAbi; exports.v4QuoterAbi = _chunkCL3QSI4Ocjs.v4QuoterAbi; exports.verifyBurnRequest = _chunkKJKDLD7Ncjs.verifyBurnRequest; exports.verifyLoginMessage = _chunkGWLEEXM4cjs.verifyLoginMessage; exports.verifyMintCap = _chunkCQCSQPWGcjs.verifyMintCap; exports.verifyMintRequest = _chunkKJKDLD7Ncjs.verifyMintRequest; exports.verifyReceiverConsent = _chunkKJKDLD7Ncjs.verifyReceiverConsent; exports.webPopupAdapter = webPopupAdapter;
|
|
724
638
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/phitran/Pacific-Finance/pafi-backend/pafi-sdk/packages/core/dist/index.cjs","../src/index.ts","../src/userop/types.ts","../src/paymaster/config.ts","../src/utils/checkEthAndBranch.ts","../src/contracts/mocks/pointTokenV2.mock.ts","../src/contracts/mocks/batchExecutor.mock.ts","../src/contracts/mocks/addresses.mock.ts","../src/web-handoff/webPopup.ts","../src/web-handoff/index.ts"],"names":[],"mappings":"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EAAA;AACxB,IAAA;AACgB,MAAA;AACrB,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACF,IAAA;AACF,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBmB,EAAA;AACiB,IAAA;AACE,IAAA;AACb,IAAA;AACT,IAAA;AACiD,MAAA;AAC/D,IAAA;AAC0E,IAAA;AAC5E,EAAA;AAAA;AAGsD,EAAA;AAClB,IAAA;AACX,IAAA;AACT,IAAA;AACiD,MAAA;AAC/D,IAAA;AAC8C,IAAA;AAChD,EAAA;AACF;AD4MkH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/Users/phitran/Pacific-Finance/pafi-backend/pafi-sdk/packages/core/dist/index.cjs","sourcesContent":[null,"import { createPublicClient, http } from \"viem\";\nimport type { Address, Hex, PublicClient, WalletClient } from \"viem\";\n\n// -------------------------------------------------------------------------\n// Re-export all sub-modules\n// -------------------------------------------------------------------------\nexport * from \"./types\";\nexport * from \"./constants\";\nexport * from \"./errors\";\nexport * from \"./abi/index\";\nexport * from \"./eip712/index\";\nexport * from \"./relay/index\";\nexport * from \"./contract/index\";\nexport * from \"./quoting/index\";\nexport * from \"./swap/index\";\nexport * from \"./auth/index\";\n\n// v1.4 — Account Abstraction primitives (EIP-7702 + ERC-4337 v0.7)\nexport * from \"./userop/index\";\nexport * from \"./paymaster/index\";\nexport * from \"./utils/index\";\n\n// v1.4 — Contract ABIs + addresses. ABI matches deployed PointToken on\n// Base mainnet; only `batchExecutor` address + Base Sepolia row remain\n// placeholder. EIP-712 helpers live under `./eip712/` and are already\n// exported above — not re-exported here. See `src/contracts/mocks/README.md`.\n// Consumers: `import { POINT_TOKEN_V2_ABI, CONTRACT_ADDRESSES, ... } from '@pafi-dev/core'`\nexport * from \"./contracts/index\";\n\n// v1.5 — PAFI Web handoff (mobile + desktop modal helper).\n// `openPafiWebModal()` + adapter registry for platform-specific UX.\nexport * from \"./web-handoff/index\";\n\n// -------------------------------------------------------------------------\n// Internal imports for PafiSDK class\n// -------------------------------------------------------------------------\nimport { buildMintRequestTypedData, signMintRequest, verifyMintRequest } from \"./eip712/mintRequest\";\nimport {\n buildReceiverConsentTypedData,\n signReceiverConsent,\n verifyReceiverConsent,\n} from \"./eip712/receiverConsent\";\nimport {\n getMintRequestNonce,\n getReceiverConsentNonce,\n getTokenName,\n} from \"./contract/pointToken\";\nimport {\n encodeMintAndSwap,\n decodeMintAndSwap,\n encodeExtData,\n buildRelaySwapParams,\n} from \"./relay/calldata\";\nimport { findBestQuote } from \"./quoting/quote\";\nimport {\n buildSwapFromQuote,\n buildUniversalRouterExecuteArgs,\n} from \"./swap/universalRouter\";\nimport { simulateMintAndSwap } from \"./relay/simulate\";\nimport { simulateSwap } from \"./swap/simulate\";\nimport type { SimulationResult } from \"./relay/simulate\";\nimport type { SwapSimulationResult } from \"./swap/simulate\";\nimport { createLoginMessage } from \"./auth/loginMessage\";\nimport type { LoginMessageParams } from \"./auth/types\";\nimport { ConfigurationError } from \"./errors\";\nimport type {\n BestQuote,\n EIP712Signature,\n MintParams,\n MintRequest,\n PafiSDKConfig,\n PathKey,\n PointTokenDomainConfig,\n PoolKey,\n QuoteResult,\n ReceiverConsent,\n SignatureVerification,\n SwapParams,\n} from \"./types\";\n\n// -------------------------------------------------------------------------\n// PafiSDK — convenience class wrapping all contract + crypto primitives.\n//\n// This class is HTTP-client-free on purpose. It covers signing, verifying,\n// contract reads, and calldata encoding — the things that need a signer\n// or a provider but no HTTP layer. The issuer backend defines its own HTTP\n// contract via `@pafi/issuer`; frontends build `fetch()` calls against\n// those types directly.\n// -------------------------------------------------------------------------\n\nexport class PafiSDK {\n private _pointTokenAddress?: Address;\n private _relayContractAddress?: Address;\n private _signer?: WalletClient;\n private _provider?: PublicClient;\n private _chainId?: number;\n\n constructor(config: PafiSDKConfig) {\n this._pointTokenAddress = config.pointTokenAddress;\n this._relayContractAddress = config.relayContractAddress;\n this._signer = config.signer;\n this._chainId = config.chainId;\n\n if (config.provider) {\n this._provider = config.provider;\n } else if (config.rpcUrl) {\n this._provider = createPublicClient({\n transport: http(config.rpcUrl),\n });\n }\n }\n\n // -------------------------------------------------------------------------\n // Setters\n // -------------------------------------------------------------------------\n\n setPointTokenAddress(address: Address): void {\n this._pointTokenAddress = address;\n }\n\n setRelayContractAddress(address: Address): void {\n this._relayContractAddress = address;\n }\n\n setSigner(signer: WalletClient): void {\n this._signer = signer;\n }\n\n setProvider(provider: PublicClient): void {\n this._provider = provider;\n }\n\n // -------------------------------------------------------------------------\n // Private guards\n // -------------------------------------------------------------------------\n\n private requirePointToken(): Address {\n if (!this._pointTokenAddress) {\n throw new ConfigurationError(\"pointTokenAddress not set\");\n }\n return this._pointTokenAddress;\n }\n\n private requireProvider(): PublicClient {\n if (!this._provider) {\n throw new ConfigurationError(\"provider not set\");\n }\n return this._provider;\n }\n\n private requireSigner(): WalletClient {\n if (!this._signer) {\n throw new ConfigurationError(\"signer not set\");\n }\n return this._signer;\n }\n\n private requireChainId(): number {\n if (this._chainId === undefined) {\n throw new ConfigurationError(\"chainId not set\");\n }\n return this._chainId;\n }\n\n // -------------------------------------------------------------------------\n // Domain\n // -------------------------------------------------------------------------\n\n async getDomain(): Promise<PointTokenDomainConfig> {\n const provider = this.requireProvider();\n const pointToken = this.requirePointToken();\n const chainId = this.requireChainId();\n const name = await getTokenName(provider, pointToken);\n return { name, verifyingContract: pointToken, chainId };\n }\n\n // -------------------------------------------------------------------------\n // EIP-712 — delegates to pure functions\n // -------------------------------------------------------------------------\n\n /**\n * Build the EIP-712 typed data for a MintRequest.\n * Pass the result to any external signer (Privy, WalletConnect, etc.).\n */\n async buildMintRequestTypedData(message: MintRequest) {\n const domain = await this.getDomain();\n return buildMintRequestTypedData(domain, message);\n }\n\n /**\n * Build the EIP-712 typed data for a ReceiverConsent.\n * Pass the result to any external signer (Privy, WalletConnect, etc.).\n */\n async buildReceiverConsentTypedData(message: ReceiverConsent) {\n const domain = await this.getDomain();\n return buildReceiverConsentTypedData(domain, message);\n }\n\n async signMintRequest(message: MintRequest): Promise<EIP712Signature> {\n const domain = await this.getDomain();\n return signMintRequest(this.requireSigner(), domain, message);\n }\n\n async verifyMintRequest(\n message: MintRequest,\n signature: Hex,\n expectedMinter: Address,\n ): Promise<SignatureVerification> {\n const domain = await this.getDomain();\n return verifyMintRequest(domain, message, signature, expectedMinter);\n }\n\n async signReceiverConsent(\n message: ReceiverConsent,\n ): Promise<EIP712Signature> {\n const domain = await this.getDomain();\n return signReceiverConsent(this.requireSigner(), domain, message);\n }\n\n async verifyReceiverConsent(\n message: ReceiverConsent,\n signature: Hex,\n expectedReceiver: Address,\n ): Promise<SignatureVerification> {\n const domain = await this.getDomain();\n return verifyReceiverConsent(domain, message, signature, expectedReceiver);\n }\n\n // -------------------------------------------------------------------------\n // Contract reads\n // -------------------------------------------------------------------------\n\n async getMintRequestNonce(receiver: Address): Promise<bigint> {\n return getMintRequestNonce(\n this.requireProvider(),\n this.requirePointToken(),\n receiver,\n );\n }\n\n async getReceiverConsentNonce(receiver: Address): Promise<bigint> {\n return getReceiverConsentNonce(\n this.requireProvider(),\n this.requirePointToken(),\n receiver,\n );\n }\n\n // -------------------------------------------------------------------------\n // Relay calldata — delegates to pure functions\n // -------------------------------------------------------------------------\n\n encodeMintAndSwap(mint: MintParams, swap: SwapParams): Hex {\n return encodeMintAndSwap(mint, swap);\n }\n\n decodeMintAndSwap(calldata: Hex): { mint: MintParams; swap: SwapParams } {\n return decodeMintAndSwap(calldata);\n }\n\n // -------------------------------------------------------------------------\n // Quoting — delegates to pure functions\n // -------------------------------------------------------------------------\n\n /**\n * Find the best swap route from `tokenIn` to `tokenOut`.\n * Merges `pools` with COMMON_POOLS for the configured chain, builds all\n * paths, and quotes via a single multicall RPC call.\n */\n async findBestQuote(\n tokenIn: Address,\n tokenOut: Address,\n exactAmount: bigint,\n pools: PoolKey[] = [],\n quoterAddress?: Address,\n maxHops?: number,\n ): Promise<BestQuote> {\n return findBestQuote(\n this.requireProvider(),\n this.requireChainId(),\n tokenIn,\n tokenOut,\n exactAmount,\n pools,\n quoterAddress,\n maxHops,\n );\n }\n\n // -------------------------------------------------------------------------\n // Swap building — delegates to pure functions\n // -------------------------------------------------------------------------\n\n /**\n * Build UniversalRouter execute args from a quote result.\n * The caller provides `minAmountOut` after applying their own slippage.\n */\n buildSwapFromQuote(params: {\n quote: QuoteResult;\n currencyIn: Address;\n currencyOut: Address;\n amountIn: bigint;\n minAmountOut: bigint;\n }): { commands: Hex; inputs: Hex[] } {\n return buildSwapFromQuote(params);\n }\n\n /**\n * Build Relay SwapParams + extData from a quote result.\n * Returns ready-to-use args for `Relay.mintAndSwap`.\n */\n buildRelaySwapParams(params: {\n quote: { path: PathKey[] };\n minAmountOut: bigint;\n feeInUsdt: bigint;\n deadline: bigint;\n }): { swapParams: SwapParams; extData: Hex } {\n return buildRelaySwapParams(params);\n }\n\n /**\n * Encode extData for ReceiverConsent and MintParams.\n * extData = abi.encode(minAmountOut, feeInUsdt)\n */\n encodeExtData(minAmountOut: bigint, feeInUsdt: bigint): Hex {\n return encodeExtData(minAmountOut, feeInUsdt);\n }\n\n // -------------------------------------------------------------------------\n // Simulation — dry-run via eth_call (no gas spent)\n // -------------------------------------------------------------------------\n\n /**\n * Simulate a Relay.mintAndSwap call. Catches reverts (bad signatures,\n * expired deadlines, insufficient mint cap, pool errors) before submitting.\n *\n * @param relayAddress - Relay contract address\n * @param mint - MintParams with real signatures\n * @param swap - SwapParams (path + deadline)\n * @param from - Relayer address that will submit the tx\n */\n async simulateMintAndSwap(\n relayAddress: Address,\n mint: MintParams,\n swap: SwapParams,\n from: Address,\n ): Promise<SimulationResult> {\n return simulateMintAndSwap(\n this.requireProvider(),\n relayAddress,\n mint,\n swap,\n from,\n );\n }\n\n /**\n * Simulate a UniversalRouter.execute swap call. Catches reverts (bad\n * approvals, insufficient balance, pool errors) before submitting.\n *\n * @param routerAddress - UniversalRouter contract address\n * @param commands - Packed command bytes (from buildSwapFromQuote)\n * @param inputs - Encoded inputs (from buildSwapFromQuote)\n * @param deadline - Unix timestamp\n * @param from - Address that will execute the swap\n */\n async simulateSwap(\n routerAddress: Address,\n commands: Hex,\n inputs: Hex[],\n deadline: bigint,\n from: Address,\n ): Promise<SwapSimulationResult> {\n return simulateSwap(\n this.requireProvider(),\n routerAddress,\n commands,\n inputs,\n deadline,\n from,\n );\n }\n\n // -------------------------------------------------------------------------\n // Auth — EIP-4361 login helpers (offline, stateless)\n //\n // These are convenience wrappers around the pure functions in\n // `./auth/loginMessage.ts`. They do NOT hit the network — the caller is\n // responsible for fetching the nonce, POSTing the signed message, and\n // storing the JWT returned by the issuer backend.\n // -------------------------------------------------------------------------\n\n /**\n * Build an EIP-4361 login message for the current signer + chain. The\n * caller supplies the issuer-specific fields (domain, nonce, uri); the SDK\n * fills in the wallet address and chain id from its own config.\n */\n async createLoginMessage(\n params: Omit<LoginMessageParams, \"address\" | \"chainId\">,\n ): Promise<string> {\n const signer = this.requireSigner();\n const chainId = this.requireChainId();\n const account = signer.account;\n if (!account) {\n throw new ConfigurationError(\"signer has no account attached\");\n }\n return createLoginMessage({ ...params, address: account.address, chainId });\n }\n\n /** Sign a login message string with the current signer (personal_sign) */\n async signLoginMessage(message: string): Promise<Hex> {\n const signer = this.requireSigner();\n const account = signer.account;\n if (!account) {\n throw new ConfigurationError(\"signer has no account attached\");\n }\n return signer.signMessage({ account, message });\n }\n}\n","import type { Address, Hex } from \"viem\";\n\n/**\n * ERC-4337 v0.7 EntryPoint standard address (deployed deterministically\n * at the same address across chains).\n * https://eips.ethereum.org/EIPS/eip-4337\n */\nexport const ENTRY_POINT_V07: Address =\n \"0x0000000071727De22E5E9d8BAf0edAc6f37da032\";\n\n/**\n * A single call inside a batch. `BatchExecutor.execute(Call[])` iterates\n * and invokes each one. When the batch runs via EIP-7702 delegation,\n * `msg.sender` for each call is the user's EOA.\n */\nexport interface Operation {\n target: Address;\n value: bigint;\n data: Hex;\n}\n\n/**\n * Paymaster fields attached to a UserOperation. Populated by the\n * Coinbase Paymaster (via PAFI Backend proxy) before the user signs.\n */\nexport interface PaymasterFields {\n paymaster: Address;\n paymasterData: Hex;\n paymasterVerificationGasLimit: bigint;\n paymasterPostOpGasLimit: bigint;\n}\n\n/**\n * Partial UserOp used during preparation — before paymaster fields are\n * attached or the user signs.\n */\nexport interface PartialUserOperation {\n sender: Address;\n nonce: bigint;\n callData: Hex;\n callGasLimit: bigint;\n verificationGasLimit: bigint;\n preVerificationGas: bigint;\n maxFeePerGas: bigint;\n maxPriorityFeePerGas: bigint;\n}\n\n/**\n * Full ERC-4337 v0.7 UserOperation, ready for bundler submission.\n */\nexport interface UserOperation extends PartialUserOperation {\n paymaster: Address;\n paymasterData: Hex;\n paymasterVerificationGasLimit: bigint;\n paymasterPostOpGasLimit: bigint;\n signature: Hex;\n}\n\n/**\n * Receipt returned by a bundler after a UserOp lands on-chain.\n */\nexport interface UserOpReceipt {\n userOpHash: Hex;\n success: boolean;\n txHash: Hex;\n blockNumber: bigint;\n gasUsed: bigint;\n /** Effective gas cost paid (wei). */\n actualGasCost: bigint;\n}\n\n/**\n * Sentinel operation value used in tests + docs when `Operation.value`\n * is irrelevant (ERC-20 transfers, for example).\n */\nexport const ZERO_VALUE = 0n;\n","import type { PaymasterConfig } from \"./types\";\n\n/**\n * Module-level paymaster config. Read by batch builders (via\n * `getPaymasterConfig()`) and by `@pafi/issuer` `RelayService` when\n * building UserOps.\n *\n * Consumers call `setPaymasterConfig()` once at application boot. All\n * subsequent helpers that need the feeRecipient / issuer identity /\n * backend URL pull from here.\n *\n * This is global state by design — making every batch builder take a\n * config param would clutter every call site. The alternative (a\n * context/service) has more ceremony than this flow justifies.\n */\nlet _config: PaymasterConfig | null = null;\n\n/**\n * Set the application-wide paymaster config. Safe to call multiple\n * times (later calls override earlier). Throws if required fields\n * are missing.\n */\nexport function setPaymasterConfig(config: PaymasterConfig): void {\n if (!config.pafiBackendUrl) {\n throw new Error(\"setPaymasterConfig: pafiBackendUrl is required\");\n }\n if (!config.issuerId) {\n throw new Error(\"setPaymasterConfig: issuerId is required\");\n }\n if (!config.apiKey) {\n throw new Error(\"setPaymasterConfig: apiKey is required\");\n }\n if (!config.feeRecipient) {\n throw new Error(\"setPaymasterConfig: feeRecipient is required\");\n }\n _config = { ...config };\n}\n\n/**\n * Get the current paymaster config. Throws if `setPaymasterConfig()`\n * has not been called yet — this surfaces boot-order bugs early\n * instead of failing with \"paymaster.feeRecipient is undefined\" at\n * the point of use.\n */\nexport function getPaymasterConfig(): PaymasterConfig {\n if (!_config) {\n throw new Error(\n \"PaymasterConfig not initialized — call setPaymasterConfig() at application boot before invoking any batch builder\",\n );\n }\n return _config;\n}\n\n/** Test helper — clear the singleton. */\nexport function _resetPaymasterConfigForTests(): void {\n _config = null;\n}\n\n/** Check whether paymaster config has been initialized. */\nexport function isPaymasterConfigured(): boolean {\n return _config !== null;\n}\n","import type { Address, PublicClient } from \"viem\";\n\n/**\n * Submission path chosen by `checkEthAndBranch`.\n * - `normal`: initiator has enough ETH; submit via `walletClient.writeContract`\n * or a plain `eth_sendRawTransaction`. No paymaster round-trip.\n * - `paymaster`: initiator doesn't have enough ETH; wrap the batch as a\n * UserOperation and route through PAFI Backend → Coinbase Paymaster\n * → Bundler.\n */\nexport type SubmissionPath = \"normal\" | \"paymaster\";\n\nexport interface CheckEthAndBranchParams {\n /** viem PublicClient bound to the target chain. */\n client: PublicClient;\n /** The address whose ETH balance we check. */\n initiator: Address;\n /** Estimated gas cost in wei for the upcoming tx. */\n estimatedGasWei: bigint;\n /**\n * Optional safety margin multiplier (basis points). Defaults to\n * 11_000 (110%) — the initiator needs 10% above the estimate to\n * qualify for the normal path. Prevents edge cases where gas price\n * spikes between estimation and submission cause a \"has enough\"\n * decision to fail at broadcast time.\n */\n marginBps?: number;\n}\n\nconst DEFAULT_MARGIN_BPS = 11_000;\n\n/**\n * Step 3 of the Generalized Flow ([SPONSORED_PATH_FLOW.md §2]):\n * choose between the normal path (initiator pays ETH directly) and the\n * paymaster path (bundler + Coinbase Paymaster).\n *\n * Intentionally synchronous in spirit — the only network call is\n * `getBalance`. Callers can parallelize it with other reads.\n */\nexport async function checkEthAndBranch(\n params: CheckEthAndBranchParams,\n): Promise<SubmissionPath> {\n const marginBps = params.marginBps ?? DEFAULT_MARGIN_BPS;\n const required =\n (params.estimatedGasWei * BigInt(marginBps)) / 10_000n;\n\n const balance = await params.client.getBalance({\n address: params.initiator,\n });\n\n return balance >= required ? \"normal\" : \"paymaster\";\n}\n","import { parseAbi } from \"viem\";\n\n/**\n * ⚠️ PARTIAL MOCK — `PointToken` ABI.\n *\n * As of 2026-04-21 this matches the deployed Base mainnet contract\n * (POINT at `0x7d25E7156E51F865D522fd3ef257a6B5DD41b97e`). The ABI\n * itself is no longer mocked — kept under `mocks/` only because the\n * rest of the folder is still mock (pending BatchExecutor real address).\n * Once Phase B completes, this file moves to `contracts/real/`.\n *\n * ## Mint — two paths\n *\n * Path 1 — Direct (whitelisted minter):\n * mint(address to, uint256 amount)\n * - msg.sender must be in minters[]\n * - Used by off-chain services that hold a minter key\n *\n * Path 2 — Sig-gated (gasless, v1.4 sponsored flow):\n * mint(address to, uint256 amount, uint256 deadline, bytes minterSig)\n * - msg.sender MUST equal `to` (the receiver)\n * - minterSig is an EIP-712 MintRequest signature from a whitelisted minter\n * - Consumes `mintRequestNonces[to]`\n * - This is the path v1.4 uses: issuer backend signs, user submits\n * via EIP-7702 + Coinbase Paymaster\n *\n * ## Burn — mirror structure\n *\n * Path 1: burn(address from, uint256 amount) — whitelisted burner\n * Path 2: burn(address from, uint256 amount, uint256 deadline, bytes burnerSig)\n * — msg.sender must equal `from`, burnerSig from whitelisted burner,\n * consumes `burnRequestNonces[from]`\n *\n * Either burn path emits `Transfer(from → 0x0)` so BurnIndexer semantics\n * don't depend on which path was taken.\n *\n * ## EIP-712 type hashes (from contract source)\n *\n * MintRequest(address to,uint256 amount,uint256 nonce,uint256 deadline)\n * BurnRequest(address from,uint256 amount,uint256 nonce,uint256 deadline)\n *\n * Domain: EIP-712 standard — name = ERC-20 token name, version = \"1\",\n * chainId, verifyingContract = this PointToken address.\n */\nexport const MOCK_POINT_TOKEN_V2_ABI = parseAbi([\n // --- Mint paths ---\n \"function mint(address to, uint256 amount) external\",\n \"function mint(address to, uint256 amount, uint256 deadline, bytes minterSig) external\",\n\n // --- Burn paths ---\n \"function burn(address from, uint256 amount) external\",\n \"function burn(address from, uint256 amount, uint256 deadline, bytes burnerSig) external\",\n\n // --- Authorization reads ---\n \"function minters(address account) external view returns (bool)\",\n \"function burners(address account) external view returns (bool)\",\n\n // --- Authorization writes (owner-only; used by provisioning scripts) ---\n \"function addMinter(address minter) external\",\n \"function removeMinter(address minter) external\",\n \"function addBurner(address burner) external\",\n \"function removeBurner(address burner) external\",\n\n // --- Nonces (sig-gated paths) ---\n \"function mintRequestNonces(address receiver) external view returns (uint256)\",\n \"function burnRequestNonces(address from) external view returns (uint256)\",\n\n // --- Oracle ---\n \"function mintingOracle() external view returns (address)\",\n \"function setMintingOracle(address _mintingOracle) external\",\n\n // --- Issuer ---\n \"function issuer() external view returns (address)\",\n\n // --- Standard ERC-20 reads ---\n \"function balanceOf(address account) external view returns (uint256)\",\n \"function totalSupply() external view returns (uint256)\",\n \"function name() external view returns (string)\",\n \"function symbol() external view returns (string)\",\n \"function decimals() external view returns (uint8)\",\n\n // --- EIP-712 domain (for off-chain sig verification) ---\n \"function DOMAIN_SEPARATOR() external view returns (bytes32)\",\n \"function eip712Domain() external view returns (bytes1 fields, string name, string version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] extensions)\",\n\n // --- Events ---\n // PointIndexer filters Transfer(from=0x0) for mints\n // BurnIndexer filters Transfer(to=0x0) for burns\n \"event Transfer(address indexed from, address indexed to, uint256 value)\",\n \"event MinterAdded(address indexed minter)\",\n \"event MinterRemoved(address indexed minter)\",\n \"event BurnerAdded(address indexed burner)\",\n \"event BurnerRemoved(address indexed burner)\",\n \"event MintingOracleUpdated(address indexed mintingOracle)\",\n] as const);\n","import { parseAbi } from \"viem\";\nimport type { Address } from \"viem\";\n\n/**\n * ⚠️ MOCK — placeholder BatchExecutor address.\n *\n * Real deployment:\n * - Coinbase may pre-deploy a canonical BatchExecutor that we target\n * via EIP-7702 delegation (see blocker B2 in V1.4_V1.5_READINESS.md)\n * - Otherwise PAFI deploys a minimal one and publishes the address\n *\n * The ABI itself (`execute(Call[])`) is stable and lives under\n * `../../userop/batchExecute.ts` — that's the real one, unchanged\n * by the mock swap. Only the **address** is mocked here.\n *\n * Pattern: checksum address with hex \"DEAD0001\" suffix per chain so\n * it's obvious in logs which chain is using a mock.\n */\n\n// Base Sepolia (testnet)\nexport const MOCK_BATCH_EXECUTOR_ADDRESS_BASE_SEPOLIA =\n \"0x000000000000000000000000000000000000DE01\" as Address;\n\n// Base mainnet\nexport const MOCK_BATCH_EXECUTOR_ADDRESS_BASE_MAINNET =\n \"0x000000000000000000000000000000000000DE02\" as Address;\n\n// Re-export the real ABI from userop module (not mocked — ABI is stable)\nexport { BATCH_EXECUTOR_ABI } from \"../../userop/batchExecute\";\n","import type { Address } from \"viem\";\n\n/**\n * ⚠️ PARTIAL MOCK — per-chain contract addresses for the v1.4 flow.\n *\n * As of 2026-04-21 SC team delivered the first round of deployed\n * addresses on Base mainnet. `batchExecutor` is still pending (not\n * part of the first deploy batch) so that single field remains a\n * placeholder until Phase B.\n *\n * Chain id map:\n * - 8453 Base mainnet — SC-delivered (see below)\n * - 84532 Base Sepolia — not in use; placeholders only\n *\n * v1.4 notes:\n * - No `relayerV2` — flow dropped the intermediate Relayer contract.\n * User submits UserOp that calls `PointToken.mint(...)` directly.\n * - `pointToken` here is the live deployed POINT instance (clone\n * from PointTokenFactory) — not the implementation. The impl\n * lives at tokenImpl and is only referenced by the factory.\n * - `usdt` is the MockERC20 (dev USDT) used by Uniswap pools.\n *\n * Swap workflow when BatchExecutor lands:\n * 1. Replace `batchExecutor` placeholder with real address\n * 2. Keep structure — consumers already import from the same key\n * 3. Bump core to `0.3.0-beta.N+1`\n */\n\n/**\n * Per-chain contract addresses.\n */\nexport interface ContractAddresses {\n pointToken: Address;\n batchExecutor: Address;\n usdt: Address;\n issuerRegistry: Address;\n mintingOracle: Address;\n}\n\nconst MOCK_PLACEHOLDER = (suffix: string): Address =>\n `0x000000000000000000000000000000000000${suffix.toLowerCase().padStart(4, \"0\")}` as Address;\n\nexport const MOCK_ADDRESSES: Record<number, ContractAddresses> = {\n // Base mainnet — SC-delivered 2026-04-21\n // registry: IssuerRegistry 0xda2D3338CF70F462Ac175F5f2edfa45660CA4f31\n // factory: PointTokenFactory 0x36c0BAb2faBE45EfA6d13001143e43A266Af673B (not stored here — consumers read via factory ABI)\n // oracle: MintingOracle 0xD85165939C700E51c8a45099316C6482634C2Ab9\n // tokenImpl: PointToken (impl) 0x2e6FB1B0C1A51abb83eC974890126a64eC02E995 (referenced by factory, not called directly)\n // mockUsdt: MockERC20 0x5d313485Ba59C3bb91e1A9C0C11782F0b83d5dcd\n // POINT: PointToken instance 0x7d25E7156E51F865D522fd3ef257a6B5DD41b97e\n 8453: {\n pointToken: \"0x7d25E7156E51F865D522fd3ef257a6B5DD41b97e\",\n batchExecutor: MOCK_PLACEHOLDER(\"de01\"), // ⏳ pending SC delivery\n usdt: \"0x5d313485Ba59C3bb91e1A9C0C11782F0b83d5dcd\",\n issuerRegistry: \"0xda2D3338CF70F462Ac175F5f2edfa45660CA4f31\",\n mintingOracle: \"0xD85165939C700E51c8a45099316C6482634C2Ab9\",\n },\n // Base Sepolia — not in active use; placeholders kept so the map\n // compiles for tooling that enumerates chains.\n 84532: {\n pointToken: MOCK_PLACEHOLDER(\"dead\"),\n batchExecutor: MOCK_PLACEHOLDER(\"dead\"),\n usdt: MOCK_PLACEHOLDER(\"dead\"),\n issuerRegistry: MOCK_PLACEHOLDER(\"dead\"),\n mintingOracle: MOCK_PLACEHOLDER(\"dead\"),\n },\n};\n\n/**\n * PointTokenFactory address — separate from `ContractAddresses`\n * because it's only used at provisioning time (issuer onboard +\n * token creation), not in the hot mint/burn path.\n */\nexport const POINT_TOKEN_FACTORY_ADDRESSES: Record<number, Address> = {\n 8453: \"0x36c0BAb2faBE45EfA6d13001143e43A266Af673B\",\n 84532: MOCK_PLACEHOLDER(\"dead\"),\n};\n\n/**\n * PointToken implementation address — the EIP-1167 clone target used\n * by PointTokenFactory. Exposed for observability / proxy verification;\n * consumers should never call this directly.\n */\nexport const POINT_TOKEN_IMPL_ADDRESSES: Record<number, Address> = {\n 8453: \"0x2e6FB1B0C1A51abb83eC974890126a64eC02E995\",\n 84532: MOCK_PLACEHOLDER(\"dead\"),\n};\n\n/**\n * Lookup helper — throws if the chain isn't in the map so callers fail\n * loudly on misconfiguration instead of silently using `undefined`.\n */\nexport function getMockAddresses(chainId: number): ContractAddresses {\n const addrs = MOCK_ADDRESSES[chainId];\n if (!addrs) {\n throw new Error(\n `getMockAddresses: no mock addresses for chainId ${chainId}. ` +\n `Supported: ${Object.keys(MOCK_ADDRESSES).join(\", \")}`,\n );\n }\n return addrs;\n}\n","import type {\n ModalOpenOptions,\n PafiWebModalAdapter,\n PafiWebModalHandle,\n} from \"./types\";\n\nconst DEFAULT_WIDTH = 900;\nconst DEFAULT_HEIGHT = 700;\nconst DEFAULT_NAME = \"pafi-web\";\n\n/**\n * Web browser popup adapter. Opens the given URL in a centered\n * `window.open()` popup, polls for close, and optionally forwards\n * `postMessage` events back to the caller.\n *\n * Runtime requirement: `window.open` must exist. Throws if called\n * under Node / SSR / React Native — use `setPafiWebModalAdapter()` to\n * provide a platform-specific adapter in those environments.\n *\n * ## Popup blocking\n *\n * Browsers block `window.open()` unless it happens inside a user\n * gesture (click handler). Callers MUST wire this into a direct click\n * handler — wrapping it in a `setTimeout` or async await before the\n * open call will trigger the blocker.\n */\nexport function openWebPopup(\n url: string,\n options: ModalOpenOptions = {},\n): PafiWebModalHandle {\n if (typeof window === \"undefined\" || typeof window.open !== \"function\") {\n throw new Error(\n \"openWebPopup: `window.open` is not available in this runtime. \" +\n \"Register a platform adapter via setPafiWebModalAdapter() instead.\",\n );\n }\n\n const width = options.width ?? DEFAULT_WIDTH;\n const height = options.height ?? DEFAULT_HEIGHT;\n const name = options.windowName ?? DEFAULT_NAME;\n\n // Center on the screen — works in all major browsers. Falls back\n // gracefully if `screen.availWidth`/`screenX` are unavailable.\n const screenW = window.screen?.availWidth ?? window.innerWidth;\n const screenH = window.screen?.availHeight ?? window.innerHeight;\n const left = Math.max(0, Math.floor((screenW - width) / 2));\n const top = Math.max(0, Math.floor((screenH - height) / 2));\n\n const features = [\n `width=${width}`,\n `height=${height}`,\n `left=${left}`,\n `top=${top}`,\n \"resizable=yes\",\n \"scrollbars=yes\",\n \"noopener=no\", // we need opener.postMessage to work\n ].join(\",\");\n\n const popup = window.open(url, name, features);\n if (!popup) {\n throw new Error(\n \"openWebPopup: popup was blocked. Ensure this call runs inside a user gesture (click handler).\",\n );\n }\n\n // Set up state + listeners --------------------------------------------\n\n let closed = false;\n let pollId: ReturnType<typeof setInterval> | null = null;\n let messageListener: ((e: MessageEvent) => void) | null = null;\n\n const dispose = (): void => {\n if (closed) return;\n closed = true;\n if (pollId !== null) {\n clearInterval(pollId);\n pollId = null;\n }\n if (messageListener) {\n window.removeEventListener(\"message\", messageListener);\n messageListener = null;\n }\n options.onClose?.();\n };\n\n // Poll every 500ms for popup close — there's no `close` event.\n // Stops when `popup.closed` flips to true OR our handle is closed.\n pollId = setInterval(() => {\n if (popup.closed) {\n dispose();\n }\n }, 500);\n\n // Wire postMessage filtering by origin — secure-by-default. An\n // empty or missing `allowedOrigins` rejects ALL messages; the\n // caller must explicitly whitelist PAFI Web's host(s) before any\n // payload is delivered. This prevents a compromised popup (via\n // opener leak or redirect) from impersonating PAFI Web.\n if (options.onMessage) {\n const allowed = options.allowedOrigins ?? [];\n const onMessage = options.onMessage;\n messageListener = (event: MessageEvent): void => {\n if (event.source !== popup) return;\n if (!allowed.includes(event.origin)) return;\n onMessage(event.data, event.origin);\n };\n window.addEventListener(\"message\", messageListener);\n }\n\n // Handle object -------------------------------------------------------\n\n return {\n get isOpen(): boolean {\n return !closed && !popup.closed;\n },\n close(): void {\n if (closed) return;\n try {\n popup.close();\n } catch {\n // Some browsers block close() unless the popup was opened by\n // the same document. Dispose our listeners anyway.\n }\n dispose();\n },\n focus(): void {\n if (closed || popup.closed) return;\n try {\n popup.focus();\n } catch {\n // No-op on failure — focus is best-effort.\n }\n },\n postMessage(data: unknown): void {\n if (closed || popup.closed) return;\n try {\n // targetOrigin '*' is fine here because the caller owns the\n // data being sent. For security on the receiving side, the\n // PAFI Web page should check event.origin itself.\n popup.postMessage(data, \"*\");\n } catch {\n // No-op.\n }\n },\n };\n}\n\n/**\n * The web popup packaged as a {@link PafiWebModalAdapter} so callers\n * can register it explicitly (e.g. in a test harness).\n */\nexport const webPopupAdapter: PafiWebModalAdapter = {\n open(url, options) {\n return openWebPopup(url, options);\n },\n};\n","import { openWebPopup } from \"./webPopup\";\nimport type {\n ModalOpenOptions,\n PafiWebModalAdapter,\n PafiWebModalHandle,\n} from \"./types\";\n\nexport type {\n ModalOpenOptions,\n PafiWebModalAdapter,\n PafiWebModalHandle,\n} from \"./types\";\nexport { openWebPopup, webPopupAdapter } from \"./webPopup\";\n\n/**\n * Module-level adapter registry — allows platform consumers (React\n * Native, Electron, Tauri, etc.) to plug in their own handoff\n * implementation without forking the SDK.\n *\n * Callers set this once at app boot; `openPafiWebModal()` below uses\n * whatever is registered, or falls back to the web popup adapter\n * when `window.open` is available.\n */\nlet registeredAdapter: PafiWebModalAdapter | null = null;\n\n/**\n * Register the adapter used by `openPafiWebModal()`. Typically called\n * once during app initialization — mobile apps register a\n * SFSafariViewController / Chrome Custom Tabs adapter, desktop apps\n * can leave it unset (web popup is the default).\n *\n * Pass `null` to unregister and fall back to the default.\n */\nexport function setPafiWebModalAdapter(\n adapter: PafiWebModalAdapter | null,\n): void {\n registeredAdapter = adapter;\n}\n\n/**\n * Return the currently registered adapter, or `null` when none is set.\n * Useful for tests that want to snapshot-and-restore the adapter.\n */\nexport function getPafiWebModalAdapter(): PafiWebModalAdapter | null {\n return registeredAdapter;\n}\n\n/**\n * Open PAFI Web in the host platform's appropriate UX:\n *\n * - Browser (window.open): centered popup, 900×700 by default\n * - React Native (with adapter registered): SFSafariViewController\n * / Chrome Custom Tabs via `react-native-inappbrowser-reborn` or\n * `expo-web-browser`\n * - Desktop (with adapter registered): custom BrowserWindow / new tab\n *\n * Resolution order:\n * 1. If an adapter was registered via `setPafiWebModalAdapter()`, use it.\n * 2. Else if `window.open` is available, use the built-in web popup.\n * 3. Else throw with a clear error pointing at the adapter registry.\n *\n * @example\n * ```ts\n * // User clicks \"Trade on PAFI\" button\n * button.addEventListener('click', async () => {\n * const modal = await openPafiWebModal('https://app.pacificfinance.org', {\n * allowedOrigins: ['https://app.pacificfinance.org'],\n * onMessage: (data, origin) => {\n * if (typeof data === 'object' && data && 'txHash' in data) {\n * console.log('Swap confirmed:', data.txHash);\n * modal.close();\n * }\n * },\n * onClose: () => {\n * console.log('User closed modal');\n * },\n * });\n * });\n * ```\n */\nexport async function openPafiWebModal(\n url: string,\n options: ModalOpenOptions = {},\n): Promise<PafiWebModalHandle> {\n if (!url || typeof url !== \"string\") {\n throw new Error(\"openPafiWebModal: `url` is required\");\n }\n\n if (registeredAdapter) {\n return Promise.resolve(registeredAdapter.open(url, options));\n }\n\n if (typeof window !== \"undefined\" && typeof window.open === \"function\") {\n return openWebPopup(url, options);\n }\n\n throw new Error(\n \"openPafiWebModal: no adapter registered and `window.open` is unavailable. \" +\n \"Call `setPafiWebModalAdapter()` with a platform-specific adapter (e.g. SFSafariViewController on iOS) during app boot.\",\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["/Users/phitran/Pacific-Finance/pafi-backend/pafi-sdk/packages/core/dist/index.cjs","../src/index.ts","../src/userop/types.ts","../src/paymaster/config.ts","../src/utils/checkEthAndBranch.ts","../src/contracts/real/pointToken.ts","../src/contracts/real/batchExecutor.ts","../src/contracts/real/addresses.ts","../src/web-handoff/webPopup.ts","../src/web-handoff/index.ts"],"names":[],"mappings":"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AAA;AAE8D,EAAA;AACxB,IAAA;AACgB,IAAA;AACtD,EAAA;AAEsE,EAAA;AAChC,IAAA;AACwB,IAAA;AAC9D,EAAA;AAMkC,EAAA;AACI,IAAA;AAC+B,IAAA;AACrE,EAAA;AAI4B,EAAA;AACU,IAAA;AAC4B,IAAA;AAClE,EAAA;AAMkC,EAAA;AACI,IAAA;AACqC,IAAA;AAC3E,EAAA;AAAA;AAAA;AAAA;AAM8D,EAAA;AACrD,IAAA;AACgB,MAAA;AACE,MAAA;AACvB,MAAA;AACF,IAAA;AACF,EAAA;AAEkE,EAAA;AACzD,IAAA;AACgB,MAAA;AACE,MAAA;AACvB,MAAA;AACF,IAAA;AACF,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBsB,EAAA;AACb,IAAA;AACgB,MAAA;AACD,MAAA;AACpB,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACF,IAAA;AACF,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBqC,EAAA;AACH,IAAA;AAClC,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsBiC,EAAA;AACxB,IAAA;AACgB,MAAA;AACrB,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACF,IAAA;AACF,EAAA;AAAA;AAAA;AAAA;AAQmB,EAAA;AACiB,IAAA;AACE,IAAA;AACb,IAAA;AACT,IAAA;AACiD,MAAA;AAC/D,IAAA;AAC0E,IAAA;AAC5E,EAAA;AAAA;AAGsD,EAAA;AAClB,IAAA;AACX,IAAA;AACT,IAAA;AACiD,MAAA;AAC/D,IAAA;AAC8C,IAAA;AAChD,EAAA;AACF;AD2NkH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/Users/phitran/Pacific-Finance/pafi-backend/pafi-sdk/packages/core/dist/index.cjs","sourcesContent":[null,"import { createPublicClient, http } from \"viem\";\nimport type { Address, Hex, PublicClient, WalletClient } from \"viem\";\n\n// -------------------------------------------------------------------------\n// Re-export all sub-modules\n// -------------------------------------------------------------------------\nexport * from \"./types\";\nexport * from \"./constants\";\nexport * from \"./errors\";\nexport * from \"./abi/index\";\nexport * from \"./eip712/index\";\nexport * from \"./contract/index\";\nexport * from \"./quoting/index\";\nexport * from \"./swap/index\";\nexport * from \"./auth/index\";\n\n// v1.4 — Account Abstraction primitives (EIP-7702 + ERC-4337 v0.7)\nexport * from \"./userop/index\";\nexport * from \"./paymaster/index\";\nexport * from \"./utils/index\";\n\n// v1.4 — Contract ABIs + addresses. ABI matches deployed PointToken on\n// Base mainnet; only `batchExecutor` address + Base Sepolia row remain\n// placeholder. EIP-712 helpers live under `./eip712/` and are already\n// exported above — not re-exported here.\n// Consumers: `import { POINT_TOKEN_V2_ABI, CONTRACT_ADDRESSES, ... } from '@pafi-dev/core'`\nexport * from \"./contracts/index\";\n\n// v1.5 — PAFI Web handoff (mobile + desktop modal helper).\n// `openPafiWebModal()` + adapter registry for platform-specific UX.\nexport * from \"./web-handoff/index\";\n\n// -------------------------------------------------------------------------\n// Internal imports for PafiSDK class\n// -------------------------------------------------------------------------\nimport { buildMintRequestTypedData, signMintRequest, verifyMintRequest } from \"./eip712/mintRequest\";\nimport {\n buildReceiverConsentTypedData,\n signReceiverConsent,\n verifyReceiverConsent,\n} from \"./eip712/receiverConsent\";\nimport {\n getMintRequestNonce,\n getReceiverConsentNonce,\n getTokenName,\n} from \"./contract/pointToken\";\nimport { findBestQuote } from \"./quoting/quote\";\nimport {\n buildSwapFromQuote,\n buildUniversalRouterExecuteArgs,\n} from \"./swap/universalRouter\";\nimport { simulateSwap } from \"./swap/simulate\";\nimport type { SwapSimulationResult } from \"./swap/simulate\";\nimport { createLoginMessage } from \"./auth/loginMessage\";\nimport type { LoginMessageParams } from \"./auth/types\";\nimport { ConfigurationError } from \"./errors\";\nimport type {\n BestQuote,\n EIP712Signature,\n MintRequest,\n PafiSDKConfig,\n PointTokenDomainConfig,\n PoolKey,\n QuoteResult,\n ReceiverConsent,\n SignatureVerification,\n} from \"./types\";\n\n// -------------------------------------------------------------------------\n// PafiSDK — convenience class wrapping all contract + crypto primitives.\n//\n// This class is HTTP-client-free on purpose. It covers signing, verifying,\n// contract reads, and calldata encoding — the things that need a signer\n// or a provider but no HTTP layer. The issuer backend defines its own HTTP\n// contract via `@pafi/issuer`; frontends build `fetch()` calls against\n// those types directly.\n// -------------------------------------------------------------------------\n\nexport class PafiSDK {\n private _pointTokenAddress?: Address;\n private _signer?: WalletClient;\n private _provider?: PublicClient;\n private _chainId?: number;\n\n constructor(config: PafiSDKConfig) {\n this._pointTokenAddress = config.pointTokenAddress;\n this._signer = config.signer;\n this._chainId = config.chainId;\n\n if (config.provider) {\n this._provider = config.provider;\n } else if (config.rpcUrl) {\n this._provider = createPublicClient({\n transport: http(config.rpcUrl),\n });\n }\n }\n\n // -------------------------------------------------------------------------\n // Setters\n // -------------------------------------------------------------------------\n\n setPointTokenAddress(address: Address): void {\n this._pointTokenAddress = address;\n }\n\n setSigner(signer: WalletClient): void {\n this._signer = signer;\n }\n\n setProvider(provider: PublicClient): void {\n this._provider = provider;\n }\n\n // -------------------------------------------------------------------------\n // Private guards\n // -------------------------------------------------------------------------\n\n private requirePointToken(): Address {\n if (!this._pointTokenAddress) {\n throw new ConfigurationError(\"pointTokenAddress not set\");\n }\n return this._pointTokenAddress;\n }\n\n private requireProvider(): PublicClient {\n if (!this._provider) {\n throw new ConfigurationError(\"provider not set\");\n }\n return this._provider;\n }\n\n private requireSigner(): WalletClient {\n if (!this._signer) {\n throw new ConfigurationError(\"signer not set\");\n }\n return this._signer;\n }\n\n private requireChainId(): number {\n if (this._chainId === undefined) {\n throw new ConfigurationError(\"chainId not set\");\n }\n return this._chainId;\n }\n\n // -------------------------------------------------------------------------\n // Domain\n // -------------------------------------------------------------------------\n\n async getDomain(): Promise<PointTokenDomainConfig> {\n const provider = this.requireProvider();\n const pointToken = this.requirePointToken();\n const chainId = this.requireChainId();\n const name = await getTokenName(provider, pointToken);\n return { name, verifyingContract: pointToken, chainId };\n }\n\n // -------------------------------------------------------------------------\n // EIP-712 — delegates to pure functions\n // -------------------------------------------------------------------------\n\n async buildMintRequestTypedData(message: MintRequest) {\n const domain = await this.getDomain();\n return buildMintRequestTypedData(domain, message);\n }\n\n async buildReceiverConsentTypedData(message: ReceiverConsent) {\n const domain = await this.getDomain();\n return buildReceiverConsentTypedData(domain, message);\n }\n\n async signMintRequest(message: MintRequest): Promise<EIP712Signature> {\n const domain = await this.getDomain();\n return signMintRequest(this.requireSigner(), domain, message);\n }\n\n async verifyMintRequest(\n message: MintRequest,\n signature: Hex,\n expectedMinter: Address,\n ): Promise<SignatureVerification> {\n const domain = await this.getDomain();\n return verifyMintRequest(domain, message, signature, expectedMinter);\n }\n\n async signReceiverConsent(\n message: ReceiverConsent,\n ): Promise<EIP712Signature> {\n const domain = await this.getDomain();\n return signReceiverConsent(this.requireSigner(), domain, message);\n }\n\n async verifyReceiverConsent(\n message: ReceiverConsent,\n signature: Hex,\n expectedReceiver: Address,\n ): Promise<SignatureVerification> {\n const domain = await this.getDomain();\n return verifyReceiverConsent(domain, message, signature, expectedReceiver);\n }\n\n // -------------------------------------------------------------------------\n // Contract reads\n // -------------------------------------------------------------------------\n\n async getMintRequestNonce(receiver: Address): Promise<bigint> {\n return getMintRequestNonce(\n this.requireProvider(),\n this.requirePointToken(),\n receiver,\n );\n }\n\n async getReceiverConsentNonce(receiver: Address): Promise<bigint> {\n return getReceiverConsentNonce(\n this.requireProvider(),\n this.requirePointToken(),\n receiver,\n );\n }\n\n // -------------------------------------------------------------------------\n // Quoting — delegates to pure functions\n // -------------------------------------------------------------------------\n\n /**\n * Find the best swap route from `tokenIn` to `tokenOut`.\n * Merges `pools` with COMMON_POOLS for the configured chain, builds all\n * paths, and quotes via a single multicall RPC call.\n */\n async findBestQuote(\n tokenIn: Address,\n tokenOut: Address,\n exactAmount: bigint,\n pools: PoolKey[] = [],\n quoterAddress?: Address,\n maxHops?: number,\n ): Promise<BestQuote> {\n return findBestQuote(\n this.requireProvider(),\n this.requireChainId(),\n tokenIn,\n tokenOut,\n exactAmount,\n pools,\n quoterAddress,\n maxHops,\n );\n }\n\n // -------------------------------------------------------------------------\n // Swap building — delegates to pure functions\n // -------------------------------------------------------------------------\n\n /**\n * Build UniversalRouter execute args from a quote result.\n * The caller provides `minAmountOut` after applying their own slippage.\n */\n buildSwapFromQuote(params: {\n quote: QuoteResult;\n currencyIn: Address;\n currencyOut: Address;\n amountIn: bigint;\n minAmountOut: bigint;\n }): { commands: Hex; inputs: Hex[] } {\n return buildSwapFromQuote(params);\n }\n\n // -------------------------------------------------------------------------\n // Simulation — dry-run via eth_call (no gas spent)\n // -------------------------------------------------------------------------\n\n /**\n * Simulate a UniversalRouter.execute swap call. Catches reverts (bad\n * approvals, insufficient balance, pool errors) before submitting.\n *\n * @param routerAddress - UniversalRouter contract address\n * @param commands - Packed command bytes (from buildSwapFromQuote)\n * @param inputs - Encoded inputs (from buildSwapFromQuote)\n * @param deadline - Unix timestamp\n * @param from - Address that will execute the swap\n */\n async simulateSwap(\n routerAddress: Address,\n commands: Hex,\n inputs: Hex[],\n deadline: bigint,\n from: Address,\n ): Promise<SwapSimulationResult> {\n return simulateSwap(\n this.requireProvider(),\n routerAddress,\n commands,\n inputs,\n deadline,\n from,\n );\n }\n\n // -------------------------------------------------------------------------\n // Auth — EIP-4361 login helpers (offline, stateless)\n // -------------------------------------------------------------------------\n\n async createLoginMessage(\n params: Omit<LoginMessageParams, \"address\" | \"chainId\">,\n ): Promise<string> {\n const signer = this.requireSigner();\n const chainId = this.requireChainId();\n const account = signer.account;\n if (!account) {\n throw new ConfigurationError(\"signer has no account attached\");\n }\n return createLoginMessage({ ...params, address: account.address, chainId });\n }\n\n /** Sign a login message string with the current signer (personal_sign) */\n async signLoginMessage(message: string): Promise<Hex> {\n const signer = this.requireSigner();\n const account = signer.account;\n if (!account) {\n throw new ConfigurationError(\"signer has no account attached\");\n }\n return signer.signMessage({ account, message });\n }\n}\n\n// Expose the `buildUniversalRouterExecuteArgs` helper for consumers that\n// build swap calldata directly (e.g. v1.5 sponsored swap flow).\nexport { buildUniversalRouterExecuteArgs };\n","import type { Address, Hex } from \"viem\";\n\n/**\n * ERC-4337 v0.7 EntryPoint standard address (deployed deterministically\n * at the same address across chains).\n * https://eips.ethereum.org/EIPS/eip-4337\n */\nexport const ENTRY_POINT_V07: Address =\n \"0x0000000071727De22E5E9d8BAf0edAc6f37da032\";\n\n/**\n * A single call inside a batch. `BatchExecutor.execute(Call[])` iterates\n * and invokes each one. When the batch runs via EIP-7702 delegation,\n * `msg.sender` for each call is the user's EOA.\n */\nexport interface Operation {\n target: Address;\n value: bigint;\n data: Hex;\n}\n\n/**\n * Paymaster fields attached to a UserOperation. Populated by the\n * Coinbase Paymaster (via PAFI Backend proxy) before the user signs.\n */\nexport interface PaymasterFields {\n paymaster: Address;\n paymasterData: Hex;\n paymasterVerificationGasLimit: bigint;\n paymasterPostOpGasLimit: bigint;\n}\n\n/**\n * Partial UserOp used during preparation — before paymaster fields are\n * attached or the user signs.\n */\nexport interface PartialUserOperation {\n sender: Address;\n nonce: bigint;\n callData: Hex;\n callGasLimit: bigint;\n verificationGasLimit: bigint;\n preVerificationGas: bigint;\n maxFeePerGas: bigint;\n maxPriorityFeePerGas: bigint;\n}\n\n/**\n * Full ERC-4337 v0.7 UserOperation, ready for bundler submission.\n */\nexport interface UserOperation extends PartialUserOperation {\n paymaster: Address;\n paymasterData: Hex;\n paymasterVerificationGasLimit: bigint;\n paymasterPostOpGasLimit: bigint;\n signature: Hex;\n}\n\n/**\n * Receipt returned by a bundler after a UserOp lands on-chain.\n */\nexport interface UserOpReceipt {\n userOpHash: Hex;\n success: boolean;\n txHash: Hex;\n blockNumber: bigint;\n gasUsed: bigint;\n /** Effective gas cost paid (wei). */\n actualGasCost: bigint;\n}\n\n/**\n * Sentinel operation value used in tests + docs when `Operation.value`\n * is irrelevant (ERC-20 transfers, for example).\n */\nexport const ZERO_VALUE = 0n;\n","import type { PaymasterConfig } from \"./types\";\n\n/**\n * Module-level paymaster config. Read by batch builders (via\n * `getPaymasterConfig()`) and by `@pafi/issuer` `RelayService` when\n * building UserOps.\n *\n * Consumers call `setPaymasterConfig()` once at application boot. All\n * subsequent helpers that need the feeRecipient / issuer identity /\n * backend URL pull from here.\n *\n * This is global state by design — making every batch builder take a\n * config param would clutter every call site. The alternative (a\n * context/service) has more ceremony than this flow justifies.\n */\nlet _config: PaymasterConfig | null = null;\n\n/**\n * Set the application-wide paymaster config. Safe to call multiple\n * times (later calls override earlier). Throws if required fields\n * are missing.\n */\nexport function setPaymasterConfig(config: PaymasterConfig): void {\n if (!config.pafiBackendUrl) {\n throw new Error(\"setPaymasterConfig: pafiBackendUrl is required\");\n }\n if (!config.issuerId) {\n throw new Error(\"setPaymasterConfig: issuerId is required\");\n }\n if (!config.apiKey) {\n throw new Error(\"setPaymasterConfig: apiKey is required\");\n }\n if (!config.feeRecipient) {\n throw new Error(\"setPaymasterConfig: feeRecipient is required\");\n }\n _config = { ...config };\n}\n\n/**\n * Get the current paymaster config. Throws if `setPaymasterConfig()`\n * has not been called yet — this surfaces boot-order bugs early\n * instead of failing with \"paymaster.feeRecipient is undefined\" at\n * the point of use.\n */\nexport function getPaymasterConfig(): PaymasterConfig {\n if (!_config) {\n throw new Error(\n \"PaymasterConfig not initialized — call setPaymasterConfig() at application boot before invoking any batch builder\",\n );\n }\n return _config;\n}\n\n/** Test helper — clear the singleton. */\nexport function _resetPaymasterConfigForTests(): void {\n _config = null;\n}\n\n/** Check whether paymaster config has been initialized. */\nexport function isPaymasterConfigured(): boolean {\n return _config !== null;\n}\n","import type { Address, PublicClient } from \"viem\";\n\n/**\n * Submission path chosen by `checkEthAndBranch`.\n * - `normal`: initiator has enough ETH; submit via `walletClient.writeContract`\n * or a plain `eth_sendRawTransaction`. No paymaster round-trip.\n * - `paymaster`: initiator doesn't have enough ETH; wrap the batch as a\n * UserOperation and route through PAFI Backend → Coinbase Paymaster\n * → Bundler.\n */\nexport type SubmissionPath = \"normal\" | \"paymaster\";\n\nexport interface CheckEthAndBranchParams {\n /** viem PublicClient bound to the target chain. */\n client: PublicClient;\n /** The address whose ETH balance we check. */\n initiator: Address;\n /** Estimated gas cost in wei for the upcoming tx. */\n estimatedGasWei: bigint;\n /**\n * Optional safety margin multiplier (basis points). Defaults to\n * 11_000 (110%) — the initiator needs 10% above the estimate to\n * qualify for the normal path. Prevents edge cases where gas price\n * spikes between estimation and submission cause a \"has enough\"\n * decision to fail at broadcast time.\n */\n marginBps?: number;\n}\n\nconst DEFAULT_MARGIN_BPS = 11_000;\n\n/**\n * Step 3 of the Generalized Flow ([SPONSORED_PATH_FLOW.md §2]):\n * choose between the normal path (initiator pays ETH directly) and the\n * paymaster path (bundler + Coinbase Paymaster).\n *\n * Intentionally synchronous in spirit — the only network call is\n * `getBalance`. Callers can parallelize it with other reads.\n */\nexport async function checkEthAndBranch(\n params: CheckEthAndBranchParams,\n): Promise<SubmissionPath> {\n const marginBps = params.marginBps ?? DEFAULT_MARGIN_BPS;\n const required =\n (params.estimatedGasWei * BigInt(marginBps)) / 10_000n;\n\n const balance = await params.client.getBalance({\n address: params.initiator,\n });\n\n return balance >= required ? \"normal\" : \"paymaster\";\n}\n","import { parseAbi } from \"viem\";\n\n/**\n * Real `PointToken` ABI — matches the contract deployed on Base mainnet\n * (POINT at `0x7d25E7156E51F865D522fd3ef257a6B5DD41b97e`). Sourced from\n * the Solidity contract shipped by the SC team 2026-04-21.\n *\n * ## Mint — two paths\n *\n * Path 1 — Direct (whitelisted minter):\n * mint(address to, uint256 amount)\n * - msg.sender must be in minters[]\n * - Used by off-chain services that hold a minter key\n *\n * Path 2 — Sig-gated (gasless, v1.4 sponsored flow):\n * mint(address to, uint256 amount, uint256 deadline, bytes minterSig)\n * - msg.sender MUST equal `to` (the receiver)\n * - minterSig is an EIP-712 MintRequest signature from a whitelisted minter\n * - Consumes `mintRequestNonces[to]`\n * - This is the path v1.4 uses: issuer backend signs, user submits\n * via EIP-7702 + Coinbase Paymaster\n *\n * ## Burn — mirror structure\n *\n * Path 1: burn(address from, uint256 amount) — whitelisted burner\n * Path 2: burn(address from, uint256 amount, uint256 deadline, bytes burnerSig)\n * — msg.sender must equal `from`, burnerSig from whitelisted burner,\n * consumes `burnRequestNonces[from]`\n *\n * Either burn path emits `Transfer(from → 0x0)` so BurnIndexer semantics\n * don't depend on which path was taken.\n *\n * ## EIP-712 type hashes (from contract source)\n *\n * MintRequest(address to,uint256 amount,uint256 nonce,uint256 deadline)\n * BurnRequest(address from,uint256 amount,uint256 nonce,uint256 deadline)\n *\n * Domain: EIP-712 standard — name = ERC-20 token name, version = \"1\",\n * chainId, verifyingContract = this PointToken address.\n */\nexport const POINT_TOKEN_ABI = parseAbi([\n // --- Mint paths ---\n \"function mint(address to, uint256 amount) external\",\n \"function mint(address to, uint256 amount, uint256 deadline, bytes minterSig) external\",\n\n // --- Burn paths ---\n \"function burn(address from, uint256 amount) external\",\n \"function burn(address from, uint256 amount, uint256 deadline, bytes burnerSig) external\",\n\n // --- Authorization reads ---\n \"function minters(address account) external view returns (bool)\",\n \"function burners(address account) external view returns (bool)\",\n\n // --- Authorization writes (owner-only; used by provisioning scripts) ---\n \"function addMinter(address minter) external\",\n \"function removeMinter(address minter) external\",\n \"function addBurner(address burner) external\",\n \"function removeBurner(address burner) external\",\n\n // --- Nonces (sig-gated paths) ---\n \"function mintRequestNonces(address receiver) external view returns (uint256)\",\n \"function burnRequestNonces(address from) external view returns (uint256)\",\n\n // --- Oracle ---\n \"function mintingOracle() external view returns (address)\",\n \"function setMintingOracle(address _mintingOracle) external\",\n\n // --- Issuer ---\n \"function issuer() external view returns (address)\",\n\n // --- Standard ERC-20 reads ---\n \"function balanceOf(address account) external view returns (uint256)\",\n \"function totalSupply() external view returns (uint256)\",\n \"function name() external view returns (string)\",\n \"function symbol() external view returns (string)\",\n \"function decimals() external view returns (uint8)\",\n\n // --- EIP-712 domain (for off-chain sig verification) ---\n \"function DOMAIN_SEPARATOR() external view returns (bytes32)\",\n \"function eip712Domain() external view returns (bytes1 fields, string name, string version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] extensions)\",\n\n // --- Events ---\n // PointIndexer filters Transfer(from=0x0) for mints\n // BurnIndexer filters Transfer(to=0x0) for burns\n \"event Transfer(address indexed from, address indexed to, uint256 value)\",\n \"event MinterAdded(address indexed minter)\",\n \"event MinterRemoved(address indexed minter)\",\n \"event BurnerAdded(address indexed burner)\",\n \"event BurnerRemoved(address indexed burner)\",\n \"event MintingOracleUpdated(address indexed mintingOracle)\",\n] as const);\n","import type { Address } from \"viem\";\n\n/**\n * BatchExecutor delegation target addresses.\n *\n * ## Status\n *\n * Per-chain addresses are **still placeholder** (`0x...DE01` / `DE02`)\n * pending the SC team's Phase B delivery. When Coinbase publishes a\n * canonical BatchExecutor, or PAFI deploys its own and publishes the\n * address, swap the constants below — callers already import from here\n * so no wiring changes.\n *\n * The ABI (`execute(Call[])`) itself is real and stable — it lives\n * under `../../userop/batchExecute.ts` and is re-exported below so\n * consumers can grab both ABI + address from one import path.\n *\n * ## Why checksum with DEAD0001 / DEAD0002 suffix\n *\n * The placeholder pattern makes the fact-of-mockness obvious in logs\n * and block explorers. A request targeting `0x...DE01` is impossible\n * to confuse with a production contract.\n */\n\n// Base Sepolia (testnet) — placeholder\nexport const BATCH_EXECUTOR_ADDRESS_BASE_SEPOLIA =\n \"0x000000000000000000000000000000000000DE01\" as Address;\n\n// Base mainnet — placeholder (pending SC delivery)\nexport const BATCH_EXECUTOR_ADDRESS_BASE_MAINNET =\n \"0x000000000000000000000000000000000000DE02\" as Address;\n\n// The ABI itself is fully real — re-exported from userop/ for\n// convenience so consumers don't need two imports.\nexport { BATCH_EXECUTOR_ABI } from \"../../userop/batchExecute\";\n","import type { Address } from \"viem\";\n\n/**\n * Per-chain deployed contract addresses — v1.4 flow.\n *\n * ## Status (2026-04-21)\n *\n * Base mainnet (8453): all SC-delivered and real, EXCEPT `batchExecutor`\n * which is still a `0x...DE02` placeholder pending the Phase B delivery.\n * Base Sepolia (84532): entire row is placeholder — not in active use.\n *\n * ## What lives where\n *\n * pointToken — live POINT instance (clone of PointToken impl)\n * batchExecutor — EIP-7702 delegation target (PLACEHOLDER)\n * usdt — MockERC20 used by Uniswap pools\n * issuerRegistry — registry of all issuers on this chain\n * mintingOracle — per-issuer mint cap enforcer\n *\n * PointTokenFactory + PointToken implementation addresses live in\n * separate exports below — they're only needed at provisioning /\n * observability time, not in the hot mint/burn path, so excluded from\n * the per-chain bundle.\n *\n * ## Swap workflow when BatchExecutor lands\n *\n * 1. Replace `batchExecutor` placeholder with real address\n * 2. Structure / imports don't change — callers are stable\n * 3. Bump core to next beta and update release notes\n */\nexport interface ContractAddresses {\n pointToken: Address;\n batchExecutor: Address;\n usdt: Address;\n issuerRegistry: Address;\n mintingOracle: Address;\n}\n\nconst PLACEHOLDER_DEAD = (suffix: string): Address =>\n `0x000000000000000000000000000000000000${suffix.toLowerCase().padStart(4, \"0\")}` as Address;\n\nexport const CONTRACT_ADDRESSES: Record<number, ContractAddresses> = {\n // Base mainnet — SC-delivered 2026-04-21\n // registry: IssuerRegistry 0xda2D3338CF70F462Ac175F5f2edfa45660CA4f31\n // factory: PointTokenFactory 0x36c0BAb2faBE45EfA6d13001143e43A266Af673B\n // oracle: MintingOracle 0xD85165939C700E51c8a45099316C6482634C2Ab9\n // tokenImpl: PointToken (impl) 0x2e6FB1B0C1A51abb83eC974890126a64eC02E995\n // mockUsdt: MockERC20 0x5d313485Ba59C3bb91e1A9C0C11782F0b83d5dcd\n // POINT: PointToken instance 0x7d25E7156E51F865D522fd3ef257a6B5DD41b97e\n 8453: {\n pointToken: \"0x7d25E7156E51F865D522fd3ef257a6B5DD41b97e\",\n batchExecutor: PLACEHOLDER_DEAD(\"de02\"), // ⏳ pending SC delivery\n usdt: \"0x5d313485Ba59C3bb91e1A9C0C11782F0b83d5dcd\",\n issuerRegistry: \"0xda2D3338CF70F462Ac175F5f2edfa45660CA4f31\",\n mintingOracle: \"0xD85165939C700E51c8a45099316C6482634C2Ab9\",\n },\n // Base Sepolia — not in active use; placeholders kept so the map\n // compiles for tooling that enumerates chains.\n 84532: {\n pointToken: PLACEHOLDER_DEAD(\"dead\"),\n batchExecutor: PLACEHOLDER_DEAD(\"de01\"),\n usdt: PLACEHOLDER_DEAD(\"dead\"),\n issuerRegistry: PLACEHOLDER_DEAD(\"dead\"),\n mintingOracle: PLACEHOLDER_DEAD(\"dead\"),\n },\n};\n\n/**\n * PointTokenFactory address — separate from `ContractAddresses` because\n * it's only used at provisioning time (issuer onboard + token creation),\n * not in the hot mint/burn path.\n */\nexport const POINT_TOKEN_FACTORY_ADDRESSES: Record<number, Address> = {\n 8453: \"0x36c0BAb2faBE45EfA6d13001143e43A266Af673B\",\n 84532: PLACEHOLDER_DEAD(\"dead\"),\n};\n\n/**\n * PointToken implementation address — the EIP-1167 clone target used\n * by PointTokenFactory. Exposed for observability / proxy verification;\n * consumers should never call this directly.\n */\nexport const POINT_TOKEN_IMPL_ADDRESSES: Record<number, Address> = {\n 8453: \"0x2e6FB1B0C1A51abb83eC974890126a64eC02E995\",\n 84532: PLACEHOLDER_DEAD(\"dead\"),\n};\n\n/**\n * Lookup helper — throws if the chain isn't in the map so callers fail\n * loudly on misconfiguration instead of silently using `undefined`.\n */\nexport function getContractAddresses(chainId: number): ContractAddresses {\n const addrs = CONTRACT_ADDRESSES[chainId];\n if (!addrs) {\n throw new Error(\n `getContractAddresses: no addresses for chainId ${chainId}. ` +\n `Supported: ${Object.keys(CONTRACT_ADDRESSES).join(\", \")}`,\n );\n }\n return addrs;\n}\n","import type {\n ModalOpenOptions,\n PafiWebModalAdapter,\n PafiWebModalHandle,\n} from \"./types\";\n\nconst DEFAULT_WIDTH = 900;\nconst DEFAULT_HEIGHT = 700;\nconst DEFAULT_NAME = \"pafi-web\";\n\n/**\n * Web browser popup adapter. Opens the given URL in a centered\n * `window.open()` popup, polls for close, and optionally forwards\n * `postMessage` events back to the caller.\n *\n * Runtime requirement: `window.open` must exist. Throws if called\n * under Node / SSR / React Native — use `setPafiWebModalAdapter()` to\n * provide a platform-specific adapter in those environments.\n *\n * ## Popup blocking\n *\n * Browsers block `window.open()` unless it happens inside a user\n * gesture (click handler). Callers MUST wire this into a direct click\n * handler — wrapping it in a `setTimeout` or async await before the\n * open call will trigger the blocker.\n */\nexport function openWebPopup(\n url: string,\n options: ModalOpenOptions = {},\n): PafiWebModalHandle {\n if (typeof window === \"undefined\" || typeof window.open !== \"function\") {\n throw new Error(\n \"openWebPopup: `window.open` is not available in this runtime. \" +\n \"Register a platform adapter via setPafiWebModalAdapter() instead.\",\n );\n }\n\n const width = options.width ?? DEFAULT_WIDTH;\n const height = options.height ?? DEFAULT_HEIGHT;\n const name = options.windowName ?? DEFAULT_NAME;\n\n // Center on the screen — works in all major browsers. Falls back\n // gracefully if `screen.availWidth`/`screenX` are unavailable.\n const screenW = window.screen?.availWidth ?? window.innerWidth;\n const screenH = window.screen?.availHeight ?? window.innerHeight;\n const left = Math.max(0, Math.floor((screenW - width) / 2));\n const top = Math.max(0, Math.floor((screenH - height) / 2));\n\n const features = [\n `width=${width}`,\n `height=${height}`,\n `left=${left}`,\n `top=${top}`,\n \"resizable=yes\",\n \"scrollbars=yes\",\n \"noopener=no\", // we need opener.postMessage to work\n ].join(\",\");\n\n const popup = window.open(url, name, features);\n if (!popup) {\n throw new Error(\n \"openWebPopup: popup was blocked. Ensure this call runs inside a user gesture (click handler).\",\n );\n }\n\n // Set up state + listeners --------------------------------------------\n\n let closed = false;\n let pollId: ReturnType<typeof setInterval> | null = null;\n let messageListener: ((e: MessageEvent) => void) | null = null;\n\n const dispose = (): void => {\n if (closed) return;\n closed = true;\n if (pollId !== null) {\n clearInterval(pollId);\n pollId = null;\n }\n if (messageListener) {\n window.removeEventListener(\"message\", messageListener);\n messageListener = null;\n }\n options.onClose?.();\n };\n\n // Poll every 500ms for popup close — there's no `close` event.\n // Stops when `popup.closed` flips to true OR our handle is closed.\n pollId = setInterval(() => {\n if (popup.closed) {\n dispose();\n }\n }, 500);\n\n // Wire postMessage filtering by origin — secure-by-default. An\n // empty or missing `allowedOrigins` rejects ALL messages; the\n // caller must explicitly whitelist PAFI Web's host(s) before any\n // payload is delivered. This prevents a compromised popup (via\n // opener leak or redirect) from impersonating PAFI Web.\n if (options.onMessage) {\n const allowed = options.allowedOrigins ?? [];\n const onMessage = options.onMessage;\n messageListener = (event: MessageEvent): void => {\n if (event.source !== popup) return;\n if (!allowed.includes(event.origin)) return;\n onMessage(event.data, event.origin);\n };\n window.addEventListener(\"message\", messageListener);\n }\n\n // Handle object -------------------------------------------------------\n\n return {\n get isOpen(): boolean {\n return !closed && !popup.closed;\n },\n close(): void {\n if (closed) return;\n try {\n popup.close();\n } catch {\n // Some browsers block close() unless the popup was opened by\n // the same document. Dispose our listeners anyway.\n }\n dispose();\n },\n focus(): void {\n if (closed || popup.closed) return;\n try {\n popup.focus();\n } catch {\n // No-op on failure — focus is best-effort.\n }\n },\n postMessage(data: unknown): void {\n if (closed || popup.closed) return;\n try {\n // targetOrigin '*' is fine here because the caller owns the\n // data being sent. For security on the receiving side, the\n // PAFI Web page should check event.origin itself.\n popup.postMessage(data, \"*\");\n } catch {\n // No-op.\n }\n },\n };\n}\n\n/**\n * The web popup packaged as a {@link PafiWebModalAdapter} so callers\n * can register it explicitly (e.g. in a test harness).\n */\nexport const webPopupAdapter: PafiWebModalAdapter = {\n open(url, options) {\n return openWebPopup(url, options);\n },\n};\n","import { openWebPopup } from \"./webPopup\";\nimport type {\n ModalOpenOptions,\n PafiWebModalAdapter,\n PafiWebModalHandle,\n} from \"./types\";\n\nexport type {\n ModalOpenOptions,\n PafiWebModalAdapter,\n PafiWebModalHandle,\n} from \"./types\";\nexport { openWebPopup, webPopupAdapter } from \"./webPopup\";\n\n/**\n * Module-level adapter registry — allows platform consumers (React\n * Native, Electron, Tauri, etc.) to plug in their own handoff\n * implementation without forking the SDK.\n *\n * Callers set this once at app boot; `openPafiWebModal()` below uses\n * whatever is registered, or falls back to the web popup adapter\n * when `window.open` is available.\n */\nlet registeredAdapter: PafiWebModalAdapter | null = null;\n\n/**\n * Register the adapter used by `openPafiWebModal()`. Typically called\n * once during app initialization — mobile apps register a\n * SFSafariViewController / Chrome Custom Tabs adapter, desktop apps\n * can leave it unset (web popup is the default).\n *\n * Pass `null` to unregister and fall back to the default.\n */\nexport function setPafiWebModalAdapter(\n adapter: PafiWebModalAdapter | null,\n): void {\n registeredAdapter = adapter;\n}\n\n/**\n * Return the currently registered adapter, or `null` when none is set.\n * Useful for tests that want to snapshot-and-restore the adapter.\n */\nexport function getPafiWebModalAdapter(): PafiWebModalAdapter | null {\n return registeredAdapter;\n}\n\n/**\n * Open PAFI Web in the host platform's appropriate UX:\n *\n * - Browser (window.open): centered popup, 900×700 by default\n * - React Native (with adapter registered): SFSafariViewController\n * / Chrome Custom Tabs via `react-native-inappbrowser-reborn` or\n * `expo-web-browser`\n * - Desktop (with adapter registered): custom BrowserWindow / new tab\n *\n * Resolution order:\n * 1. If an adapter was registered via `setPafiWebModalAdapter()`, use it.\n * 2. Else if `window.open` is available, use the built-in web popup.\n * 3. Else throw with a clear error pointing at the adapter registry.\n *\n * @example\n * ```ts\n * // User clicks \"Trade on PAFI\" button\n * button.addEventListener('click', async () => {\n * const modal = await openPafiWebModal('https://app.pacificfinance.org', {\n * allowedOrigins: ['https://app.pacificfinance.org'],\n * onMessage: (data, origin) => {\n * if (typeof data === 'object' && data && 'txHash' in data) {\n * console.log('Swap confirmed:', data.txHash);\n * modal.close();\n * }\n * },\n * onClose: () => {\n * console.log('User closed modal');\n * },\n * });\n * });\n * ```\n */\nexport async function openPafiWebModal(\n url: string,\n options: ModalOpenOptions = {},\n): Promise<PafiWebModalHandle> {\n if (!url || typeof url !== \"string\") {\n throw new Error(\"openPafiWebModal: `url` is required\");\n }\n\n if (registeredAdapter) {\n return Promise.resolve(registeredAdapter.open(url, options));\n }\n\n if (typeof window !== \"undefined\" && typeof window.open === \"function\") {\n return openWebPopup(url, options);\n }\n\n throw new Error(\n \"openPafiWebModal: no adapter registered and `window.open` is unavailable. \" +\n \"Call `setPafiWebModalAdapter()` with a platform-specific adapter (e.g. SFSafariViewController on iOS) during app boot.\",\n );\n}\n"]}
|