@pafi-dev/core 0.10.0 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/README.md +23 -70
  2. package/dist/abi/index.cjs +2 -2
  3. package/dist/abi/index.cjs.map +1 -1
  4. package/dist/abi/index.d.cts +58 -106
  5. package/dist/abi/index.d.ts +58 -106
  6. package/dist/abi/index.js +3 -3
  7. package/dist/{chunk-J7EYOLMI.js → chunk-H3X3FYUU.js} +1 -1
  8. package/dist/chunk-H3X3FYUU.js.map +1 -0
  9. package/dist/{chunk-4NTU7XGP.cjs → chunk-NT2ZPF72.cjs} +53 -23
  10. package/dist/chunk-NT2ZPF72.cjs.map +1 -0
  11. package/dist/{chunk-BBQLGBOD.cjs → chunk-TRYGIC2I.cjs} +1 -1
  12. package/dist/{chunk-BBQLGBOD.cjs.map → chunk-TRYGIC2I.cjs.map} +1 -1
  13. package/dist/{chunk-RVSW7I6U.js → chunk-UEO4YN6T.js} +52 -22
  14. package/dist/chunk-UEO4YN6T.js.map +1 -0
  15. package/dist/{chunk-MIQA46E3.cjs → chunk-XXLIIWIF.cjs} +45 -53
  16. package/dist/chunk-XXLIIWIF.cjs.map +1 -0
  17. package/dist/{chunk-CWH4KOUW.js → chunk-ZJXXCG5P.js} +45 -53
  18. package/dist/chunk-ZJXXCG5P.js.map +1 -0
  19. package/dist/contract/index.cjs +2 -2
  20. package/dist/contract/index.d.cts +4 -5
  21. package/dist/contract/index.d.ts +4 -5
  22. package/dist/contract/index.js +1 -1
  23. package/dist/eip712/index.cjs +2 -2
  24. package/dist/eip712/index.d.cts +30 -5
  25. package/dist/eip712/index.d.ts +30 -5
  26. package/dist/eip712/index.js +1 -1
  27. package/dist/index.cjs +144 -125
  28. package/dist/index.cjs.map +1 -1
  29. package/dist/index.d.cts +185 -118
  30. package/dist/index.d.ts +185 -118
  31. package/dist/index.js +129 -110
  32. package/dist/index.js.map +1 -1
  33. package/dist/{types-B3UivyQ1.d.cts → types-C17pznGz.d.cts} +72 -21
  34. package/dist/{types-B3UivyQ1.d.ts → types-C17pznGz.d.ts} +72 -21
  35. package/package.json +6 -5
  36. package/dist/chunk-4NTU7XGP.cjs.map +0 -1
  37. package/dist/chunk-CWH4KOUW.js.map +0 -1
  38. package/dist/chunk-J7EYOLMI.js.map +0 -1
  39. package/dist/chunk-MIQA46E3.cjs.map +0 -1
  40. package/dist/chunk-RVSW7I6U.js.map +0 -1
package/dist/index.js CHANGED
@@ -19,8 +19,8 @@ import {
19
19
  permit2Abi,
20
20
  pointTokenFactoryAbi,
21
21
  universalRouterAbi,
22
- v4QuoterAbi
23
- } from "./chunk-CWH4KOUW.js";
22
+ v3QuoterV2Abi
23
+ } from "./chunk-ZJXXCG5P.js";
24
24
  import {
25
25
  getBurnRequestNonce,
26
26
  getIssuer,
@@ -36,7 +36,7 @@ import {
36
36
  isMinter,
37
37
  issuerRegistryGetIssuerFlatAbi,
38
38
  verifyMintCap
39
- } from "./chunk-J7EYOLMI.js";
39
+ } from "./chunk-H3X3FYUU.js";
40
40
  import {
41
41
  issuerRegistryAbi,
42
42
  mintFeeWrapperAbi,
@@ -50,9 +50,12 @@ import {
50
50
  Eip712DomainMismatchError,
51
51
  PERMIT2_ADDRESS,
52
52
  POINT_TOKEN_POOLS,
53
+ QUOTER_V2_ADDRESSES,
53
54
  SUPPORTED_CHAINS,
54
55
  UNIVERSAL_ROUTER_ADDRESSES,
55
- V4_QUOTER_ADDRESSES,
56
+ V3_FACTORY_ADDRESSES,
57
+ V3_POOL_INIT_CODE_HASH,
58
+ V3_SWAP_ROUTER_ADDRESSES,
56
59
  assertDomainMatchesContract,
57
60
  buildBurnRequestTypedData,
58
61
  buildDomain,
@@ -63,7 +66,7 @@ import {
63
66
  signMintRequest,
64
67
  verifyBurnRequest,
65
68
  verifyMintRequest
66
- } from "./chunk-RVSW7I6U.js";
69
+ } from "./chunk-UEO4YN6T.js";
67
70
  import {
68
71
  pointTokenAbi
69
72
  } from "./chunk-UCO5DXD6.js";
@@ -119,41 +122,43 @@ var PafiSdkError = class extends Error {
119
122
  this.name = new.target.name;
120
123
  }
121
124
  };
122
- var PafiSDKError = class extends Error {
123
- constructor(message) {
124
- super(message);
125
- this.name = "PafiSDKError";
126
- }
127
- };
128
- var ConfigurationError = class extends PafiSDKError {
125
+ var ConfigurationError = class extends PafiSdkError {
126
+ httpStatus = "service_unavailable";
127
+ code = "CONFIGURATION_ERROR";
128
+ type = "server_error";
129
129
  constructor(message) {
130
130
  super(message);
131
- this.name = "ConfigurationError";
132
131
  }
133
132
  };
134
- var SigningError = class extends PafiSDKError {
133
+ var SigningError = class extends PafiSdkError {
134
+ httpStatus = "service_unavailable";
135
+ code = "SIGNING_FAILED";
136
+ type = "server_error";
135
137
  constructor(message) {
136
138
  super(message);
137
- this.name = "SigningError";
138
139
  }
139
140
  };
140
- var SimulationError = class extends PafiSDKError {
141
+ var SimulationError = class extends PafiSdkError {
142
+ httpStatus = "unprocessable";
143
+ code = "SIMULATION_FAILED";
144
+ type = "business_logic_error";
145
+ operation;
146
+ reason;
141
147
  constructor(operation, reason) {
142
148
  super(`Simulation failed for ${operation}: ${reason}`);
143
149
  this.operation = operation;
144
150
  this.reason = reason;
145
- this.name = "SimulationError";
146
151
  }
147
- operation;
148
- reason;
149
152
  };
150
- var ApiError = class extends PafiSDKError {
151
- constructor(message, status) {
153
+ var ApiError = class extends PafiSdkError {
154
+ httpStatus = "service_unavailable";
155
+ code = "API_ERROR";
156
+ type = "service_unavailable_error";
157
+ upstreamStatus;
158
+ constructor(message, upstreamStatus) {
152
159
  super(message);
153
- this.status = status;
154
- this.name = "ApiError";
160
+ this.upstreamStatus = upstreamStatus;
155
161
  }
156
- status;
157
162
  };
158
163
  var OracleStaleError = class extends PafiSdkError {
159
164
  httpStatus = "service_unavailable";
@@ -625,48 +630,6 @@ function getDummySignatureFor7702(impl) {
625
630
  return DUMMY_SIGNATURE_V07;
626
631
  }
627
632
 
628
- // src/paymaster/config.ts
629
- var _config = null;
630
- var _deprecationWarned = false;
631
- function warnDeprecated(fn) {
632
- if (_deprecationWarned) return;
633
- _deprecationWarned = true;
634
- console.warn(
635
- `[PAFI] DEPRECATION: \`${fn}\` from @pafi-dev/core/paymaster has been deprecated since v0.7.1 and will be removed in the next major bump (v1.0). Use \`PafiBackendClient\` from @pafi-dev/issuer/pafi-backend instead.`
636
- );
637
- }
638
- function setPaymasterConfig(config) {
639
- warnDeprecated("setPaymasterConfig");
640
- if (!config.pafiBackendUrl) {
641
- throw new Error("setPaymasterConfig: pafiBackendUrl is required");
642
- }
643
- if (!config.issuerId) {
644
- throw new Error("setPaymasterConfig: issuerId is required");
645
- }
646
- if (!config.apiKey) {
647
- throw new Error("setPaymasterConfig: apiKey is required");
648
- }
649
- if (!config.feeRecipient) {
650
- throw new Error("setPaymasterConfig: feeRecipient is required");
651
- }
652
- _config = { ...config };
653
- }
654
- function getPaymasterConfig() {
655
- warnDeprecated("getPaymasterConfig");
656
- if (!_config) {
657
- throw new Error(
658
- "PaymasterConfig not initialized \u2014 call setPaymasterConfig() at application boot before invoking any batch builder"
659
- );
660
- }
661
- return _config;
662
- }
663
- function _resetPaymasterConfigForTests() {
664
- _config = null;
665
- }
666
- function isPaymasterConfigured() {
667
- return _config !== null;
668
- }
669
-
670
633
  // src/utils/checkEthAndBranch.ts
671
634
  var DEFAULT_MARGIN_BPS = 11e3;
672
635
  async function checkEthAndBranch(params) {
@@ -678,6 +641,70 @@ async function checkEthAndBranch(params) {
678
641
  return balance >= required ? "normal" : "paymaster";
679
642
  }
680
643
 
644
+ // src/utils/v3Path.ts
645
+ import { concatHex, getAddress as getAddress2, getContractAddress, keccak256 as keccak2562, pad as pad2, toHex as toHex2 } from "viem";
646
+ function encodeV3Path(path) {
647
+ const { tokens, fees } = path;
648
+ if (tokens.length < 2) {
649
+ throw new Error(
650
+ `encodeV3Path: tokens must contain at least 2 addresses, got ${tokens.length}`
651
+ );
652
+ }
653
+ if (tokens.length !== fees.length + 1) {
654
+ throw new Error(
655
+ `encodeV3Path: tokens.length must equal fees.length + 1, got tokens=${tokens.length} fees=${fees.length}`
656
+ );
657
+ }
658
+ const parts = [];
659
+ for (let i = 0; i < fees.length; i++) {
660
+ parts.push(tokens[i].toLowerCase());
661
+ const fee = fees[i];
662
+ if (!Number.isInteger(fee) || fee < 0 || fee > 16777215) {
663
+ throw new Error(
664
+ `encodeV3Path: fees[${i}] must be a uint24 (0..16777215), got ${fee}`
665
+ );
666
+ }
667
+ parts.push(pad2(toHex2(fee), { size: 3 }));
668
+ }
669
+ parts.push(tokens[tokens.length - 1].toLowerCase());
670
+ return concatHex(parts);
671
+ }
672
+ function encodeV3PathReversed(path) {
673
+ return encodeV3Path({
674
+ tokens: [...path.tokens].reverse(),
675
+ fees: [...path.fees].reverse()
676
+ });
677
+ }
678
+ function computeV3PoolAddress(params) {
679
+ const { factory, tokenA, tokenB, fee, initCodeHash } = params;
680
+ if (!Number.isInteger(fee) || fee < 0 || fee > 16777215) {
681
+ throw new Error(
682
+ `computeV3PoolAddress: fee must be a uint24, got ${fee}`
683
+ );
684
+ }
685
+ const a = getAddress2(tokenA).toLowerCase();
686
+ const b = getAddress2(tokenB).toLowerCase();
687
+ if (a === b) {
688
+ throw new Error(
689
+ `computeV3PoolAddress: tokenA and tokenB must differ, got ${a}`
690
+ );
691
+ }
692
+ const [token0, token1] = a < b ? [tokenA, tokenB] : [tokenB, tokenA];
693
+ const salt = keccak2562(
694
+ concatHex([
695
+ pad2(getAddress2(token0), { size: 32 }),
696
+ pad2(getAddress2(token1), { size: 32 }),
697
+ pad2(toHex2(fee), { size: 32 })
698
+ ])
699
+ );
700
+ return getContractAddress({
701
+ opcode: "CREATE2",
702
+ from: factory,
703
+ bytecodeHash: initCodeHash,
704
+ salt
705
+ });
706
+ }
707
+
681
708
  // src/delegation/checkDelegation.ts
682
709
  var EIP7702_MAGIC = "0xef0100";
683
710
  function parseEip7702DelegatedAddress(code) {
@@ -743,14 +770,14 @@ async function getAaNonce(client, userAddress) {
743
770
  }
744
771
 
745
772
  // src/delegation/computeAuthorizationHash.ts
746
- import { concat as concat2, keccak256 as keccak2562, toRlp } from "viem";
773
+ import { concat as concat2, keccak256 as keccak2563, toRlp } from "viem";
747
774
  function computeAuthorizationHash(chainId, address, nonce) {
748
775
  const rlpEncoded = toRlp([
749
776
  toMinimalHex(BigInt(chainId)),
750
777
  address,
751
778
  toMinimalHex(nonce)
752
779
  ]);
753
- return keccak2562(concat2(["0x05", rlpEncoded]));
780
+ return keccak2563(concat2(["0x05", rlpEncoded]));
754
781
  }
755
782
  function isDelegatedToTarget(code, target) {
756
783
  if (!code || code === "0x") return false;
@@ -797,31 +824,13 @@ function buildEip7702Authorization(params) {
797
824
  // src/contracts/real/addresses.ts
798
825
  var PLACEHOLDER_DEAD = (suffix) => `0x000000000000000000000000000000000000${suffix.toLowerCase().padStart(4, "0")}`;
799
826
  var CONTRACT_ADDRESSES = {
800
- // Base mainnet — v1.6 redeploy (2026-05-07)
801
- // registry: IssuerRegistry 0xAB1d1e117c41636f30bb10194Fe6B774B6Da9E01
802
- // factory: PointTokenFactory 0xA08274458b43E7D6F4ff61ddFe8A9852c6531085
803
- // oracle: MintingOracle 0x2f4cf8C5F8b41efC970c5b46a5d905CeA1f871a0
804
- // tokenImpl: PointToken (impl) 0xc41c3F8A0380c7760Ee1209d6d19C4b81dE994e4
805
- // mintFeeWrapper: MintFeeWrapper 0xD324EE2e3220B23d1b1BfbB85f5bC1EF2E917B93
806
- // mockUsdt: MockERC20 0x3F7e71B150e97316Bb9f363A32c19CcD36ac2382
807
- // batchExecutor: Pimlico Simple7702 0xe6Cae83BdE06E4c305530e199D7217f42808555B (unchanged from v1.5)
808
- //
809
- // pointToken: PER-ISSUER, not chain-level. Each issuer deploys their
810
- // own clone via PointTokenFactory.createToken() and tracks the address
811
- // separately (env var, DB, or factory readout). This field is a
812
- // historical leftover from v1.4 single-issuer days and has no SDK
813
- // consumer — kept as dead-zero so any code that mistakenly reads it
814
- // fails loudly instead of silently routing to a stale token.
815
- // Known clones (informational, NOT to be used as a default):
816
- // gg56 (Test Point / TPT) — 0x855c2046AD49AcF9B3B32557176FfCB1a1A38A22
827
+ // Base mainnet — live deployment
817
828
  8453: {
818
- pointToken: PLACEHOLDER_DEAD("dead"),
819
829
  batchExecutor: "0xe6Cae83BdE06E4c305530e199D7217f42808555B",
820
830
  usdt: "0x3F7e71B150e97316Bb9f363A32c19CcD36ac2382",
821
831
  issuerRegistry: "0xAB1d1e117c41636f30bb10194Fe6B774B6Da9E01",
822
832
  mintingOracle: "0x2f4cf8C5F8b41efC970c5b46a5d905CeA1f871a0",
823
833
  mintFeeWrapper: "0xD324EE2e3220B23d1b1BfbB85f5bC1EF2E917B93",
824
- pafiHook: PLACEHOLDER_DEAD("dead"),
825
834
  chainlinkEthUsd: "0x71041dddad3595F9CEd3DcCFBe3D1F4b0a16Bb70",
826
835
  orderlyRelay: "0xDA082DAce1522c185aeB5A713FcA6fa6B6E99e7f",
827
836
  pafiFeeRecipient: "0xa3F71eadEd101513a0151007590020dCFD7C495e",
@@ -830,13 +839,11 @@ var CONTRACT_ADDRESSES = {
830
839
  // Base Sepolia — not in active use; placeholders kept so the map
831
840
  // compiles for tooling that enumerates chains.
832
841
  84532: {
833
- pointToken: PLACEHOLDER_DEAD("dead"),
834
842
  batchExecutor: PLACEHOLDER_DEAD("de01"),
835
843
  usdt: PLACEHOLDER_DEAD("dead"),
836
844
  issuerRegistry: PLACEHOLDER_DEAD("dead"),
837
845
  mintingOracle: PLACEHOLDER_DEAD("dead"),
838
846
  mintFeeWrapper: PLACEHOLDER_DEAD("dead"),
839
- pafiHook: PLACEHOLDER_DEAD("dead"),
840
847
  chainlinkEthUsd: PLACEHOLDER_DEAD("de02"),
841
848
  orderlyRelay: PLACEHOLDER_DEAD("de03"),
842
849
  pafiFeeRecipient: PLACEHOLDER_DEAD("de04"),
@@ -1004,7 +1011,7 @@ import { parseAbi as parseAbi3 } from "viem";
1004
1011
 
1005
1012
  // src/subgraph/pools.ts
1006
1013
  import { isAddress } from "viem";
1007
- var PAFI_SUBGRAPH_URL = "https://graph-base-mainnet.pacificfinance.org/subgraphs/name/pafi-subgraph-v3";
1014
+ var PAFI_SUBGRAPH_URL = "https://graph-base-mainnet.pacificfinance.org/subgraphs/name/pafi-subgraph-v4";
1008
1015
  var POOL_QUERY = `
1009
1016
  query GetPoolForPointToken($id: ID!) {
1010
1017
  pafiToken(id: $id) {
@@ -1012,15 +1019,13 @@ var POOL_QUERY = `
1012
1019
  pool {
1013
1020
  id
1014
1021
  feeTier
1015
- tickSpacing
1016
- hooks
1017
1022
  token0 { id }
1018
1023
  token1 { id }
1019
1024
  }
1020
1025
  }
1021
1026
  }
1022
1027
  `;
1023
- function sortCurrencies(a, b) {
1028
+ function sortTokens(a, b) {
1024
1029
  return a.toLowerCase() < b.toLowerCase() ? [a, b] : [b, a];
1025
1030
  }
1026
1031
  async function fetchPafiPools(_chainId, pointTokenAddress, subgraphUrl = PAFI_SUBGRAPH_URL) {
@@ -1042,7 +1047,16 @@ async function fetchPafiPools(_chainId, pointTokenAddress, subgraphUrl = PAFI_SU
1042
1047
  console.warn(`[fetchPafiPools] subgraph returned ${response.status}`);
1043
1048
  return [];
1044
1049
  }
1045
- const json = await response.json();
1050
+ let json;
1051
+ try {
1052
+ json = await response.json();
1053
+ } catch (err) {
1054
+ console.warn(
1055
+ "[fetchPafiPools] subgraph returned non-JSON:",
1056
+ err.message
1057
+ );
1058
+ return [];
1059
+ }
1046
1060
  if (json.errors && json.errors.length > 0) {
1047
1061
  console.warn(
1048
1062
  "[fetchPafiPools] subgraph errors:",
@@ -1052,20 +1066,18 @@ async function fetchPafiPools(_chainId, pointTokenAddress, subgraphUrl = PAFI_SU
1052
1066
  }
1053
1067
  const pool = json.data?.pafiToken?.pool;
1054
1068
  if (!pool) return [];
1055
- if (!isAddress(pool.hooks) || !isAddress(pool.token0.id) || !isAddress(pool.token1.id) || !Number.isFinite(Number(pool.feeTier)) || !Number.isFinite(Number(pool.tickSpacing))) {
1069
+ if (!isAddress(pool.token0.id) || !isAddress(pool.token1.id) || !Number.isFinite(Number(pool.feeTier))) {
1056
1070
  console.error("[fetchPafiPools] invalid pool data in subgraph response \u2014 skipping");
1057
1071
  return [];
1058
1072
  }
1059
- const [currency0, currency1] = sortCurrencies(
1073
+ const [token0, token1] = sortTokens(
1060
1074
  pool.token0.id,
1061
1075
  pool.token1.id
1062
1076
  );
1063
1077
  return [{
1064
- currency0,
1065
- currency1,
1066
- fee: Number(pool.feeTier),
1067
- tickSpacing: Number(pool.tickSpacing),
1068
- hooks: pool.hooks
1078
+ token0,
1079
+ token1,
1080
+ fee: Number(pool.feeTier)
1069
1081
  }];
1070
1082
  }
1071
1083
 
@@ -1499,9 +1511,15 @@ var PafiSDK = class {
1499
1511
  const domain = await this.getDomain();
1500
1512
  return signMintRequest(this.requireSigner(), domain, message);
1501
1513
  }
1502
- async verifyMintRequest(message, signature, expectedMinter) {
1514
+ async verifyMintRequest(message, signature, expectedMinter, options) {
1503
1515
  const domain = await this.getDomain();
1504
- return verifyMintRequest(domain, message, signature, expectedMinter);
1516
+ return verifyMintRequest(
1517
+ domain,
1518
+ message,
1519
+ signature,
1520
+ expectedMinter,
1521
+ options
1522
+ );
1505
1523
  }
1506
1524
  // -------------------------------------------------------------------------
1507
1525
  // Contract reads
@@ -1563,8 +1581,8 @@ export {
1563
1581
  POINT_TOKEN_POOLS,
1564
1582
  pointTokenAbi as POINT_TOKEN_V2_ABI,
1565
1583
  PafiSDK,
1566
- PafiSDKError,
1567
1584
  PafiSdkError,
1585
+ QUOTER_V2_ADDRESSES,
1568
1586
  SDK_ERROR_HTTP_STATUS_CODE,
1569
1587
  SIMPLE_7702_IMPL_BASE_MAINNET,
1570
1588
  SPONSOR_AUTH_DOMAIN_ANCHOR_BASE_MAINNET,
@@ -1575,10 +1593,11 @@ export {
1575
1593
  SimulationError,
1576
1594
  TOKEN_HASHES,
1577
1595
  UNIVERSAL_ROUTER_ADDRESSES,
1578
- V4_QUOTER_ADDRESSES,
1596
+ V3_FACTORY_ADDRESSES,
1597
+ V3_POOL_INIT_CODE_HASH,
1598
+ V3_SWAP_ROUTER_ADDRESSES,
1579
1599
  ValidationError,
1580
1600
  ZERO_VALUE,
1581
- _resetPaymasterConfigForTests,
1582
1601
  assembleUserOperation,
1583
1602
  assertDomainMatchesContract,
1584
1603
  buildAndSignSponsorAuth,
@@ -1600,6 +1619,7 @@ export {
1600
1619
  computeAuthorizationHash,
1601
1620
  computeCallDataHash,
1602
1621
  computeUserOpHash,
1622
+ computeV3PoolAddress,
1603
1623
  createLoginMessage,
1604
1624
  createPafiProxyTransport,
1605
1625
  decodeBatchExecuteCalls,
@@ -1607,6 +1627,8 @@ export {
1607
1627
  delegateDirect,
1608
1628
  detectDelegateImpl,
1609
1629
  encodeBatchExecute,
1630
+ encodeV3Path,
1631
+ encodeV3PathReversed,
1610
1632
  erc20Abi,
1611
1633
  erc20ApproveOp,
1612
1634
  erc20BurnOp,
@@ -1623,7 +1645,6 @@ export {
1623
1645
  getMintRequestNonce,
1624
1646
  getPafiServiceUrls,
1625
1647
  getPafiWebModalAdapter,
1626
- getPaymasterConfig,
1627
1648
  getPointTokenBalance,
1628
1649
  getPointTokenIssuer,
1629
1650
  getIssuer as getPointTokenIssuerAddress,
@@ -1634,7 +1655,6 @@ export {
1634
1655
  isDelegatedTo,
1635
1656
  isDelegatedToTarget,
1636
1657
  isMinter,
1637
- isPaymasterConfigured,
1638
1658
  isPaymasterError,
1639
1659
  issuerRegistryAbi,
1640
1660
  issuerRegistryGetIssuerFlatAbi,
@@ -1654,13 +1674,12 @@ export {
1654
1674
  sendWithPaymasterFallback,
1655
1675
  serializeUserOpToJsonRpc,
1656
1676
  setPafiWebModalAdapter,
1657
- setPaymasterConfig,
1658
1677
  signBurnRequest,
1659
1678
  signMintRequest,
1660
1679
  signSponsorAuth,
1661
1680
  splitAuthorizationSig,
1662
1681
  universalRouterAbi,
1663
- v4QuoterAbi,
1682
+ v3QuoterV2Abi,
1664
1683
  verifyBurnRequest,
1665
1684
  verifyLoginMessage,
1666
1685
  verifyMintCap,