@pearcurve/sdk 0.0.0-stage → 0.1.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 (113) hide show
  1. package/LICENSE +64 -0
  2. package/README.md +122 -2
  3. package/dist/abis/json/collateralTokenRegistry.json +257 -0
  4. package/dist/abis/json/errors.json +1034 -0
  5. package/dist/abis/json/feeManager.json +668 -0
  6. package/dist/abis/json/intentRegistry.json +1169 -0
  7. package/dist/abis/json/intentRegistryViews.json +958 -0
  8. package/dist/abis/json/loanAssetRegistry.json +220 -0
  9. package/dist/abis/json/loanHealthViewer.json +176 -0
  10. package/dist/abis/json/loanManager.json +1404 -0
  11. package/dist/abis/json/loanMarketCaps.json +1642 -0
  12. package/dist/abis/json/loanPositionToken.json +650 -0
  13. package/dist/abis/json/main.json +1951 -0
  14. package/dist/abis/json/matchingEngine.json +2060 -0
  15. package/dist/abis/json/priceOracle.json +453 -0
  16. package/dist/abis/json/protocolViewer.json +959 -0
  17. package/dist/abis/json/secondaryMarket.json +1348 -0
  18. package/dist/abis/json/strategyRegistry.json +237 -0
  19. package/dist/abis/json/termCurveOracle.json +346 -0
  20. package/dist/abis/json/yieldSource.json +298 -0
  21. package/dist/abis/json/yieldSourceRegistry.json +295 -0
  22. package/dist/abis.d.ts +21 -0
  23. package/dist/abis.d.ts.map +1 -0
  24. package/dist/abis.js +39 -0
  25. package/dist/abis.js.map +1 -0
  26. package/dist/borrowerSubmitPreflight.d.ts +14 -0
  27. package/dist/borrowerSubmitPreflight.d.ts.map +1 -0
  28. package/dist/borrowerSubmitPreflight.js +28 -0
  29. package/dist/borrowerSubmitPreflight.js.map +1 -0
  30. package/dist/bps.d.ts +11 -0
  31. package/dist/bps.d.ts.map +1 -0
  32. package/dist/bps.js +25 -0
  33. package/dist/bps.js.map +1 -0
  34. package/dist/clients.d.ts +23 -0
  35. package/dist/clients.d.ts.map +1 -0
  36. package/dist/clients.js +59 -0
  37. package/dist/clients.js.map +1 -0
  38. package/dist/decodeError.d.ts +24 -0
  39. package/dist/decodeError.d.ts.map +1 -0
  40. package/dist/decodeError.js +358 -0
  41. package/dist/decodeError.js.map +1 -0
  42. package/dist/encoding.d.ts +18 -0
  43. package/dist/encoding.d.ts.map +1 -0
  44. package/dist/encoding.js +94 -0
  45. package/dist/encoding.js.map +1 -0
  46. package/dist/index.d.ts +18 -0
  47. package/dist/index.d.ts.map +1 -0
  48. package/dist/index.js +18 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/lenderSubmitPreflight.d.ts +20 -0
  51. package/dist/lenderSubmitPreflight.d.ts.map +1 -0
  52. package/dist/lenderSubmitPreflight.js +42 -0
  53. package/dist/lenderSubmitPreflight.js.map +1 -0
  54. package/dist/loanPositions.d.ts +23 -0
  55. package/dist/loanPositions.d.ts.map +1 -0
  56. package/dist/loanPositions.js +37 -0
  57. package/dist/loanPositions.js.map +1 -0
  58. package/dist/marketStats.d.ts +70 -0
  59. package/dist/marketStats.d.ts.map +1 -0
  60. package/dist/marketStats.js +117 -0
  61. package/dist/marketStats.js.map +1 -0
  62. package/dist/networkConfig.d.ts +48 -0
  63. package/dist/networkConfig.d.ts.map +1 -0
  64. package/dist/networkConfig.js +48 -0
  65. package/dist/networkConfig.js.map +1 -0
  66. package/dist/pause.d.ts +20 -0
  67. package/dist/pause.d.ts.map +1 -0
  68. package/dist/pause.js +40 -0
  69. package/dist/pause.js.map +1 -0
  70. package/dist/reads.d.ts +187 -0
  71. package/dist/reads.d.ts.map +1 -0
  72. package/dist/reads.js +353 -0
  73. package/dist/reads.js.map +1 -0
  74. package/dist/strategies.d.ts +14 -0
  75. package/dist/strategies.d.ts.map +1 -0
  76. package/dist/strategies.js +49 -0
  77. package/dist/strategies.js.map +1 -0
  78. package/dist/txGas.d.ts +19 -0
  79. package/dist/txGas.d.ts.map +1 -0
  80. package/dist/txGas.js +37 -0
  81. package/dist/txGas.js.map +1 -0
  82. package/dist/types.d.ts +69 -0
  83. package/dist/types.d.ts.map +1 -0
  84. package/dist/types.js +11 -0
  85. package/dist/types.js.map +1 -0
  86. package/dist/yieldMigrationPreflight.d.ts +29 -0
  87. package/dist/yieldMigrationPreflight.d.ts.map +1 -0
  88. package/dist/yieldMigrationPreflight.js +61 -0
  89. package/dist/yieldMigrationPreflight.js.map +1 -0
  90. package/dist/yieldSources.d.ts +33 -0
  91. package/dist/yieldSources.d.ts.map +1 -0
  92. package/dist/yieldSources.js +106 -0
  93. package/dist/yieldSources.js.map +1 -0
  94. package/package.json +47 -4
  95. package/src/abis/json/collateralTokenRegistry.json +257 -0
  96. package/src/abis/json/errors.json +1034 -0
  97. package/src/abis/json/feeManager.json +668 -0
  98. package/src/abis/json/intentRegistry.json +1169 -0
  99. package/src/abis/json/intentRegistryViews.json +958 -0
  100. package/src/abis/json/loanAssetRegistry.json +220 -0
  101. package/src/abis/json/loanHealthViewer.json +176 -0
  102. package/src/abis/json/loanManager.json +1404 -0
  103. package/src/abis/json/loanMarketCaps.json +1642 -0
  104. package/src/abis/json/loanPositionToken.json +650 -0
  105. package/src/abis/json/main.json +1951 -0
  106. package/src/abis/json/matchingEngine.json +2060 -0
  107. package/src/abis/json/priceOracle.json +453 -0
  108. package/src/abis/json/protocolViewer.json +959 -0
  109. package/src/abis/json/secondaryMarket.json +1348 -0
  110. package/src/abis/json/strategyRegistry.json +237 -0
  111. package/src/abis/json/termCurveOracle.json +346 -0
  112. package/src/abis/json/yieldSource.json +298 -0
  113. package/src/abis/json/yieldSourceRegistry.json +295 -0
@@ -0,0 +1,49 @@
1
+ import { Contract } from 'ethers';
2
+ import { getFeeManager, getMain, getStrategyRegistry } from './clients.js';
3
+ const creditStrategyAbi = [
4
+ {
5
+ type: 'function',
6
+ name: 'name',
7
+ inputs: [],
8
+ outputs: [{ name: '', type: 'string' }],
9
+ stateMutability: 'view',
10
+ },
11
+ {
12
+ type: 'function',
13
+ name: 'strategyType',
14
+ inputs: [],
15
+ outputs: [{ name: '', type: 'string' }],
16
+ stateMutability: 'view',
17
+ },
18
+ ];
19
+ /** Approved strategies from `Main.strategyRegistry()` → `getStrategies()` + `ICreditStrategy` metadata. */
20
+ export async function fetchApprovedStrategiesFromMain(mainAddress, runner) {
21
+ const main = getMain(mainAddress, runner);
22
+ const registryAddr = (await main.strategyRegistry());
23
+ if (!registryAddr || registryAddr === '0x0000000000000000000000000000000000000000')
24
+ return [];
25
+ const registry = getStrategyRegistry(registryAddr, runner);
26
+ const addrs = (await registry.getStrategies());
27
+ if (!addrs?.length)
28
+ return [];
29
+ const rows = await Promise.all(addrs.map(async (addr) => {
30
+ const strategy = new Contract(addr, creditStrategyAbi, runner);
31
+ const [name, strategyType] = await Promise.all([
32
+ strategy.name(),
33
+ strategy.strategyType(),
34
+ ]);
35
+ return { address: addr, name: String(name), strategyType: String(strategyType) };
36
+ }));
37
+ return rows;
38
+ }
39
+ /** `Main.feeManager()` address. */
40
+ export async function readFeeManagerAddressFromMain(mainAddress, runner) {
41
+ const main = getMain(mainAddress, runner);
42
+ return (await main.feeManager());
43
+ }
44
+ /** `FeeManager.maxSolverTipBps()`. */
45
+ export async function readMaxSolverTipBps(feeManagerAddress, runner) {
46
+ const fm = getFeeManager(feeManagerAddress, runner);
47
+ return fm.maxSolverTipBps();
48
+ }
49
+ //# sourceMappingURL=strategies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strategies.js","sourceRoot":"","sources":["../src/strategies.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAuB,MAAM,QAAQ,CAAA;AAEtD,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAG1E,MAAM,iBAAiB,GAAG;IACxB;QACE,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,MAAM;QACZ,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QACvC,eAAe,EAAE,MAAM;KACxB;IACD;QACE,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,cAAc;QACpB,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QACvC,eAAe,EAAE,MAAM;KACxB;CACO,CAAA;AAQV,2GAA2G;AAC3G,MAAM,CAAC,KAAK,UAAU,+BAA+B,CACnD,WAAoB,EACpB,MAAsB;IAEtB,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,CAAA;IACzC,MAAM,YAAY,GAAG,CAAC,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAY,CAAA;IAC/D,IAAI,CAAC,YAAY,IAAI,YAAY,KAAK,4CAA4C;QAAE,OAAO,EAAE,CAAA;IAE7F,MAAM,QAAQ,GAAG,mBAAmB,CAAC,YAAY,EAAE,MAAM,CAAC,CAAA;IAC1D,MAAM,KAAK,GAAG,CAAC,MAAM,QAAQ,CAAC,aAAa,EAAE,CAAc,CAAA;IAC3D,IAAI,CAAC,KAAK,EAAE,MAAM;QAAE,OAAO,EAAE,CAAA;IAE7B,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,GAAG,CAC5B,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACvB,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE,iBAAiB,EAAE,MAAM,CAAC,CAAA;QAC9D,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC7C,QAAQ,CAAC,IAAI,EAAqB;YAClC,QAAQ,CAAC,YAAY,EAAqB;SAC3C,CAAC,CAAA;QACF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,CAAC,EAAE,CAAA;IAClF,CAAC,CAAC,CACH,CAAA;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,mCAAmC;AACnC,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,WAAoB,EACpB,MAAsB;IAEtB,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,CAAA;IACzC,OAAO,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAY,CAAA;AAC7C,CAAC;AAED,sCAAsC;AACtC,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,iBAA0B,EAC1B,MAAsB;IAEtB,MAAM,EAAE,GAAG,aAAa,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAA;IACnD,OAAO,EAAE,CAAC,eAAe,EAAqB,CAAA;AAChD,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * **Transaction gas limits on Base L2** — not protocol deployments.
3
+ *
4
+ * Base (and Base Sepolia) reject transactions whose gas limit exceeds this value
5
+ * (RPC / execution error: "exceeds maximum per-transaction gas limit").
6
+ * Use when setting `gasLimit` overrides with ethers or any signer on those networks.
7
+ *
8
+ * **Contract addresses per chain** live in `networkConfig.ts` (`deployments`, `getDeployment`).
9
+ *
10
+ * @see https://docs.base.org/base-chain/network-information/troubleshooting-transactions
11
+ */
12
+ export declare const BASE_FAMILY_MAX_TX_GAS = 25000000n;
13
+ export declare const BASE_MAINNET_CHAIN_ID = 8453;
14
+ export declare const BASE_SEPOLIA_CHAIN_ID = 84532;
15
+ export declare function isBaseFamilyChain(chainId: bigint | number | null | undefined): boolean;
16
+ export declare function capGasForBaseFamily(chainId: bigint | number | null | undefined, gas: bigint | null | undefined): bigint | null | undefined;
17
+ /** Headroom for execution variance; still clamped to Base max tx gas. */
18
+ export declare function gasWithBufferForBaseFamily(chainId: bigint | number | null | undefined, gas: bigint | null | undefined, bufferBps?: bigint): bigint | undefined;
19
+ //# sourceMappingURL=txGas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"txGas.d.ts","sourceRoot":"","sources":["../src/txGas.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,eAAO,MAAM,sBAAsB,YAAc,CAAA;AAEjD,eAAO,MAAM,qBAAqB,OAAO,CAAA;AACzC,eAAO,MAAM,qBAAqB,QAAQ,CAAA;AAQ1C,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAGtF;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,EAC3C,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC7B,MAAM,GAAG,IAAI,GAAG,SAAS,CAG3B;AAED,yEAAyE;AACzE,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,EAC3C,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC9B,SAAS,GAAE,MAAc,GACxB,MAAM,GAAG,SAAS,CAKpB"}
package/dist/txGas.js ADDED
@@ -0,0 +1,37 @@
1
+ /**
2
+ * **Transaction gas limits on Base L2** — not protocol deployments.
3
+ *
4
+ * Base (and Base Sepolia) reject transactions whose gas limit exceeds this value
5
+ * (RPC / execution error: "exceeds maximum per-transaction gas limit").
6
+ * Use when setting `gasLimit` overrides with ethers or any signer on those networks.
7
+ *
8
+ * **Contract addresses per chain** live in `networkConfig.ts` (`deployments`, `getDeployment`).
9
+ *
10
+ * @see https://docs.base.org/base-chain/network-information/troubleshooting-transactions
11
+ */
12
+ export const BASE_FAMILY_MAX_TX_GAS = 25000000n;
13
+ export const BASE_MAINNET_CHAIN_ID = 8453;
14
+ export const BASE_SEPOLIA_CHAIN_ID = 84532;
15
+ const BASE_FAMILY_IDS = new Set([BASE_MAINNET_CHAIN_ID, BASE_SEPOLIA_CHAIN_ID]);
16
+ function chainIdToNumber(chainId) {
17
+ return typeof chainId === 'bigint' ? Number(chainId) : chainId;
18
+ }
19
+ export function isBaseFamilyChain(chainId) {
20
+ if (chainId == null)
21
+ return false;
22
+ return BASE_FAMILY_IDS.has(chainIdToNumber(chainId));
23
+ }
24
+ export function capGasForBaseFamily(chainId, gas) {
25
+ if (!isBaseFamilyChain(chainId) || gas == null)
26
+ return gas;
27
+ return gas > BASE_FAMILY_MAX_TX_GAS ? BASE_FAMILY_MAX_TX_GAS : gas;
28
+ }
29
+ /** Headroom for execution variance; still clamped to Base max tx gas. */
30
+ export function gasWithBufferForBaseFamily(chainId, gas, bufferBps = 1500n) {
31
+ if (gas == null)
32
+ return undefined;
33
+ const withBuf = (gas * (10000n + bufferBps)) / 10000n;
34
+ const capped = capGasForBaseFamily(chainId, withBuf);
35
+ return capped === null || capped === undefined ? undefined : capped;
36
+ }
37
+ //# sourceMappingURL=txGas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"txGas.js","sourceRoot":"","sources":["../src/txGas.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,SAAW,CAAA;AAEjD,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAA;AACzC,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,CAAA;AAE1C,MAAM,eAAe,GAAG,IAAI,GAAG,CAAS,CAAC,qBAAqB,EAAE,qBAAqB,CAAC,CAAC,CAAA;AAEvF,SAAS,eAAe,CAAC,OAAwB;IAC/C,OAAO,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAA;AAChE,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAA2C;IAC3E,IAAI,OAAO,IAAI,IAAI;QAAE,OAAO,KAAK,CAAA;IACjC,OAAO,eAAe,CAAC,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAA;AACtD,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,OAA2C,EAC3C,GAA8B;IAE9B,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,IAAI;QAAE,OAAO,GAAG,CAAA;IAC1D,OAAO,GAAG,GAAG,sBAAsB,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,GAAG,CAAA;AACpE,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,0BAA0B,CACxC,OAA2C,EAC3C,GAA8B,EAC9B,YAAoB,KAAK;IAEzB,IAAI,GAAG,IAAI,IAAI;QAAE,OAAO,SAAS,CAAA;IACjC,MAAM,OAAO,GAAG,CAAC,GAAG,GAAG,CAAC,MAAO,GAAG,SAAS,CAAC,CAAC,GAAG,MAAO,CAAA;IACvD,MAAM,MAAM,GAAG,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IACpD,OAAO,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAA;AACrE,CAAC"}
@@ -0,0 +1,69 @@
1
+ /** Checksummed or lower-case `0x` address string. */
2
+ export type Address = string;
3
+ /** Zero address sentinel used for wallet-mode lender intents (no yield source deposit). */
4
+ export declare const WALLET_MODE_YIELD_SOURCE: Address;
5
+ /**
6
+ * Returns true if a lender intent uses wallet mode — i.e. `yieldSource` is the zero address.
7
+ * In wallet mode, funds are pulled from the lender's wallet via `transferFrom` at match time
8
+ * rather than from a yield source. The lender must approve the LoanManager for the asset.
9
+ */
10
+ export declare function isWalletModeLenderIntent(params: {
11
+ yieldSource: Address;
12
+ }): boolean;
13
+ /**
14
+ * Per-collateral LTV / LLTV in **basis points** (100% = 10_000).
15
+ * On-chain `Types.CollateralConfig` uses **`uint16`** for both fields (packing); protocol caps at 10_000 bps.
16
+ */
17
+ export interface CollateralConfig {
18
+ token: Address;
19
+ /** Origination LTV cap, 1–10_000 bps. */
20
+ ltv: bigint;
21
+ /** Liquidation LTV threshold, 0–10_000 bps (`0` = no LLTV-based liquidation for this collateral). */
22
+ lltv: bigint;
23
+ }
24
+ /** Mirrors `LenderIntentParams` in `src/core/Types.sol`. */
25
+ export interface LenderIntentParams {
26
+ asset: Address;
27
+ minPrincipal: bigint;
28
+ maxPrincipal: bigint;
29
+ minRate: bigint;
30
+ minDuration: bigint;
31
+ maxDuration: bigint;
32
+ collateralToken: Address;
33
+ /** Origination LTV cap, 1–10_000 bps. */
34
+ ltv: bigint;
35
+ /** Liquidation LTV threshold, 1–10_000 bps. */
36
+ lltv: bigint;
37
+ expiry: bigint;
38
+ yieldSource: Address;
39
+ allowPartialFill: boolean;
40
+ /** 0 = unlimited; cap on cumulative fill by one borrower wallet. */
41
+ maxPerBorrowerAddress: bigint;
42
+ earlyRepaymentFeeBps: bigint;
43
+ blockEarlyRepayment: boolean;
44
+ callbackReceiver: Address;
45
+ }
46
+ /** Mirrors `BorrowerIntentParams` in `src/core/Types.sol`. */
47
+ export interface BorrowerIntentParams {
48
+ asset: Address;
49
+ principal: bigint;
50
+ maxRate: bigint;
51
+ duration: bigint;
52
+ collateral: Address;
53
+ maxCollateralAmount: bigint;
54
+ expiry: bigint;
55
+ autoRefinanceThresholdRate: bigint;
56
+ solverTipBps: bigint;
57
+ }
58
+ /** On-chain solver batch referencing existing intent IDs (`Types.SolverSolution`). */
59
+ export interface SolverSolution {
60
+ lenderIntentIds: bigint[];
61
+ borrowerIntentIds: bigint[];
62
+ agreedRates: bigint[];
63
+ fillAmounts: bigint[];
64
+ solverTip: bigint;
65
+ solver: Address;
66
+ deadline: bigint;
67
+ signature: string;
68
+ }
69
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,MAAM,MAAM,OAAO,GAAG,MAAM,CAAA;AAE5B,2FAA2F;AAC3F,eAAO,MAAM,wBAAwB,EAAE,OAAsD,CAAA;AAE7F;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE;IAAE,WAAW,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAElF;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAA;IACd,yCAAyC;IACzC,GAAG,EAAE,MAAM,CAAA;IACX,qGAAqG;IACrG,IAAI,EAAE,MAAM,CAAA;CACb;AAED,4DAA4D;AAC5D,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,OAAO,CAAA;IACd,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,eAAe,EAAE,OAAO,CAAA;IACxB,yCAAyC;IACzC,GAAG,EAAE,MAAM,CAAA;IACX,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,OAAO,CAAA;IACpB,gBAAgB,EAAE,OAAO,CAAA;IACzB,oEAAoE;IACpE,qBAAqB,EAAE,MAAM,CAAA;IAC7B,oBAAoB,EAAE,MAAM,CAAA;IAC5B,mBAAmB,EAAE,OAAO,CAAA;IAC5B,gBAAgB,EAAE,OAAO,CAAA;CAC1B;AAED,8DAA8D;AAC9D,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,OAAO,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,OAAO,CAAA;IACnB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,MAAM,EAAE,MAAM,CAAA;IACd,0BAA0B,EAAE,MAAM,CAAA;IAClC,YAAY,EAAE,MAAM,CAAA;CACrB;AAED,sFAAsF;AACtF,MAAM,WAAW,cAAc;IAC7B,eAAe,EAAE,MAAM,EAAE,CAAA;IACzB,iBAAiB,EAAE,MAAM,EAAE,CAAA;IAC3B,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,OAAO,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;CAClB"}
package/dist/types.js ADDED
@@ -0,0 +1,11 @@
1
+ /** Zero address sentinel used for wallet-mode lender intents (no yield source deposit). */
2
+ export const WALLET_MODE_YIELD_SOURCE = '0x0000000000000000000000000000000000000000';
3
+ /**
4
+ * Returns true if a lender intent uses wallet mode — i.e. `yieldSource` is the zero address.
5
+ * In wallet mode, funds are pulled from the lender's wallet via `transferFrom` at match time
6
+ * rather than from a yield source. The lender must approve the LoanManager for the asset.
7
+ */
8
+ export function isWalletModeLenderIntent(params) {
9
+ return !params.yieldSource || params.yieldSource === WALLET_MODE_YIELD_SOURCE;
10
+ }
11
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAGA,2FAA2F;AAC3F,MAAM,CAAC,MAAM,wBAAwB,GAAY,4CAA4C,CAAA;AAE7F;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CAAC,MAAgC;IACvE,OAAO,CAAC,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW,KAAK,wBAAwB,CAAA;AAC/E,CAAC"}
@@ -0,0 +1,29 @@
1
+ import type { Provider } from 'ethers';
2
+ export type YieldMigrationPreflightParams = {
3
+ viewsAddress: string;
4
+ owner: string;
5
+ fromSource: string;
6
+ asset: string;
7
+ /** Shares to migrate (same units as Main.migrateYieldSource). */
8
+ shares: bigint;
9
+ /** Lender intent ids to retarget; empty for liquidity-only migration. */
10
+ lenderIntentIds: bigint[];
11
+ };
12
+ export type YieldMigrationPreflightResult = {
13
+ maxMigratable: bigint;
14
+ balance: bigint;
15
+ committed: bigint;
16
+ retargetRemaining: bigint;
17
+ assetsPreview: bigint;
18
+ intentIds: bigint[];
19
+ intentRemaining: bigint[];
20
+ };
21
+ /**
22
+ * Read-only preflight for `Main.migrateYieldSource(..., lenderIntentIds)`.
23
+ */
24
+ export declare function previewYieldMigration(provider: Provider, p: YieldMigrationPreflightParams): Promise<YieldMigrationPreflightResult>;
25
+ /**
26
+ * Throws if migration would hit `YieldWithdrawWouldInsolventIntents` / `MigrationInsufficientForRetarget`.
27
+ */
28
+ export declare function assertYieldMigration(provider: Provider, p: YieldMigrationPreflightParams): Promise<YieldMigrationPreflightResult>;
29
+ //# sourceMappingURL=yieldMigrationPreflight.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yieldMigrationPreflight.d.ts","sourceRoot":"","sources":["../src/yieldMigrationPreflight.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAGtC,MAAM,MAAM,6BAA6B,GAAG;IAC1C,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,iEAAiE;IACjE,MAAM,EAAE,MAAM,CAAA;IACd,yEAAyE;IACzE,eAAe,EAAE,MAAM,EAAE,CAAA;CAC1B,CAAA;AAED,MAAM,MAAM,6BAA6B,GAAG;IAC1C,aAAa,EAAE,MAAM,CAAA;IACrB,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,iBAAiB,EAAE,MAAM,CAAA;IACzB,aAAa,EAAE,MAAM,CAAA;IACrB,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,eAAe,EAAE,MAAM,EAAE,CAAA;CAC1B,CAAA;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,QAAQ,EAClB,CAAC,EAAE,6BAA6B,GAC/B,OAAO,CAAC,6BAA6B,CAAC,CAqCxC;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,QAAQ,EAClB,CAAC,EAAE,6BAA6B,GAC/B,OAAO,CAAC,6BAA6B,CAAC,CA2BxC"}
@@ -0,0 +1,61 @@
1
+ import { Contract, getAddress } from 'ethers';
2
+ import { intentRegistryViewsAbi, yieldSourceAbi } from './abis.js';
3
+ /**
4
+ * Read-only preflight for `Main.migrateYieldSource(..., lenderIntentIds)`.
5
+ */
6
+ export async function previewYieldMigration(provider, p) {
7
+ const views = new Contract(getAddress(p.viewsAddress), intentRegistryViewsAbi, provider);
8
+ const from = getAddress(p.fromSource);
9
+ const owner = getAddress(p.owner);
10
+ const asset = getAddress(p.asset);
11
+ const [maxMigratable, intentIds, intentRemaining] = await Promise.all([
12
+ views.maxMigratableBalance(owner, from, asset),
13
+ views.getLenderIntentsAtYieldSource(owner, from, asset).then((r) => r[0]),
14
+ views.getLenderIntentsAtYieldSource(owner, from, asset).then((r) => r[1]),
15
+ ]);
16
+ const ys = new Contract(from, yieldSourceAbi, provider);
17
+ const balance = (await ys.balanceOf(owner, asset));
18
+ const assetsPreview = (await ys.convertToAssets(p.shares, asset));
19
+ const committed = balance > maxMigratable ? balance - maxMigratable : 0n;
20
+ let retargetRemaining = 0n;
21
+ if (p.lenderIntentIds.length > 0) {
22
+ const idSet = new Set(p.lenderIntentIds.map((id) => id.toString()));
23
+ for (let i = 0; i < intentIds.length; i++) {
24
+ const id = intentIds[i];
25
+ if (idSet.has(id.toString())) {
26
+ retargetRemaining += intentRemaining[i];
27
+ }
28
+ }
29
+ }
30
+ return {
31
+ maxMigratable,
32
+ balance,
33
+ committed,
34
+ retargetRemaining,
35
+ assetsPreview,
36
+ intentIds: intentIds.map((x) => BigInt(x)),
37
+ intentRemaining: intentRemaining.map((x) => BigInt(x)),
38
+ };
39
+ }
40
+ /**
41
+ * Throws if migration would hit `YieldWithdrawWouldInsolventIntents` / `MigrationInsufficientForRetarget`.
42
+ */
43
+ export async function assertYieldMigration(provider, p) {
44
+ const preview = await previewYieldMigration(provider, p);
45
+ const { assetsPreview, retargetRemaining, maxMigratable, committed, balance } = preview;
46
+ if (p.lenderIntentIds.length === 0) {
47
+ if (assetsPreview > maxMigratable) {
48
+ throw new Error(`Migration exceeds free liquidity: ${assetsPreview.toString()} assets but only ${maxMigratable.toString()} migratable (${committed.toString()} reserved by lender intents). Retarget intents or cancel them first.`);
49
+ }
50
+ return preview;
51
+ }
52
+ if (assetsPreview < retargetRemaining) {
53
+ throw new Error(`Migration assets (${assetsPreview.toString()}) must cover selected intents' remaining capacity (${retargetRemaining.toString()}).`);
54
+ }
55
+ const minBalanceAfter = committed > retargetRemaining ? committed - retargetRemaining : 0n;
56
+ if (balance < assetsPreview + minBalanceAfter) {
57
+ throw new Error(`Migration would insolvent remaining intents at source: balance ${balance.toString()}, out ${assetsPreview.toString()}, need ${minBalanceAfter.toString()} left after withdraw.`);
58
+ }
59
+ return preview;
60
+ }
61
+ //# sourceMappingURL=yieldMigrationPreflight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yieldMigrationPreflight.js","sourceRoot":"","sources":["../src/yieldMigrationPreflight.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { Contract, type ContractRunner } from 'ethers';
2
+ import type { Address } from './types.js';
3
+ /** One registry-listed yield source with on-chain APY (bps) for `asset`. */
4
+ export type SupportedYieldSourceApy = {
5
+ address: Address;
6
+ name: string;
7
+ /** Annual supply APY in basis points (10_000 = 100%); null if `currentApy` reverted. */
8
+ apyBps: bigint | null;
9
+ /** Set when `currentApy` could not be read (e.g. unsupported asset for that venue). */
10
+ error?: string;
11
+ };
12
+ /**
13
+ * Addresses still marked approved on the registry.
14
+ * @dev `getApprovedSources()` returns the full registration list; removed sources stay in the array with `approvedSources(addr) == false`.
15
+ */
16
+ export declare function listApprovedYieldSourceAddresses(registry: Contract): Promise<Address[]>;
17
+ /**
18
+ * For each approved yield source, reads `name()` and `currentApy(asset)` via `IYieldSource`.
19
+ * Per-source failures on `currentApy` yield `apyBps: null` and `error` instead of throwing.
20
+ */
21
+ export declare function fetchSupportedYieldSourceApys(registry: Contract, asset: Address): Promise<SupportedYieldSourceApy[]>;
22
+ /** Same as {@link fetchSupportedYieldSourceApys} but resolves the registry from `Main.yieldSourceRegistry()`. */
23
+ export declare function fetchSupportedYieldSourceApysFromMain(main: Contract, asset: Address): Promise<SupportedYieldSourceApy[]>;
24
+ /**
25
+ * Keep multi-asset sources (e.g. Aave) and Compound comets whose `baseAsset()` matches `asset`.
26
+ * Compound detection uses `baseAsset()` — not `name()` — so filtering works when name reads fail.
27
+ */
28
+ export declare function filterYieldSourcesForAsset(rows: SupportedYieldSourceApy[], asset: Address, runner: ContractRunner): Promise<SupportedYieldSourceApy[]>;
29
+ /**
30
+ * All approved yield adapters applicable to one loan asset (registry-driven; APY may be null).
31
+ */
32
+ export declare function fetchYieldSourcesForAsset(main: Contract, asset: Address): Promise<SupportedYieldSourceApy[]>;
33
+ //# sourceMappingURL=yieldSources.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yieldSources.d.ts","sourceRoot":"","sources":["../src/yieldSources.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,cAAc,EAAE,MAAM,QAAQ,CAAA;AAGtD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAEzC,4EAA4E;AAC5E,MAAM,MAAM,uBAAuB,GAAG;IACpC,OAAO,EAAE,OAAO,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,wFAAwF;IACxF,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,uFAAuF;IACvF,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAQD;;;GAGG;AACH,wBAAsB,gCAAgC,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAa7F;AAED;;;GAGG;AACH,wBAAsB,6BAA6B,CACjD,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,uBAAuB,EAAE,CAAC,CAsBpC;AAED,iHAAiH;AACjH,wBAAsB,qCAAqC,CACzD,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,uBAAuB,EAAE,CAAC,CAKpC;AAgBD;;;GAGG;AACH,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,uBAAuB,EAAE,EAC/B,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,uBAAuB,EAAE,CAAC,CAcpC;AAED;;GAEG;AACH,wBAAsB,yBAAyB,CAC7C,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,uBAAuB,EAAE,CAAC,CAKpC"}
@@ -0,0 +1,106 @@
1
+ import { Contract } from 'ethers';
2
+ import { yieldSourceAbi, yieldSourceRegistryAbi } from './abis.js';
3
+ function runnerOrThrow(c) {
4
+ const r = c.runner;
5
+ if (!r)
6
+ throw new Error('Contract has no runner (attach a provider or signer).');
7
+ return r;
8
+ }
9
+ /**
10
+ * Addresses still marked approved on the registry.
11
+ * @dev `getApprovedSources()` returns the full registration list; removed sources stay in the array with `approvedSources(addr) == false`.
12
+ */
13
+ export async function listApprovedYieldSourceAddresses(registry) {
14
+ const raw = await registry.getApprovedSources();
15
+ const approved = [];
16
+ const seen = new Set();
17
+ for (const addr of raw) {
18
+ const lower = addr.toLowerCase();
19
+ if (seen.has(lower))
20
+ continue;
21
+ if (await registry.approvedSources(addr)) {
22
+ seen.add(lower);
23
+ approved.push(addr);
24
+ }
25
+ }
26
+ return approved;
27
+ }
28
+ /**
29
+ * For each approved yield source, reads `name()` and `currentApy(asset)` via `IYieldSource`.
30
+ * Per-source failures on `currentApy` yield `apyBps: null` and `error` instead of throwing.
31
+ */
32
+ export async function fetchSupportedYieldSourceApys(registry, asset) {
33
+ const runner = runnerOrThrow(registry);
34
+ const addrs = await listApprovedYieldSourceAddresses(registry);
35
+ const out = [];
36
+ for (const addr of addrs) {
37
+ const source = new Contract(addr, yieldSourceAbi, runner);
38
+ let name = '';
39
+ try {
40
+ name = await source.name();
41
+ }
42
+ catch {
43
+ // ignore; leave empty
44
+ }
45
+ try {
46
+ const apyBps = await source.currentApy(asset);
47
+ out.push({ address: addr, name, apyBps });
48
+ }
49
+ catch (e) {
50
+ const msg = e instanceof Error ? e.message : 'currentApy reverted';
51
+ out.push({ address: addr, name, apyBps: null, error: msg });
52
+ }
53
+ }
54
+ return out;
55
+ }
56
+ /** Same as {@link fetchSupportedYieldSourceApys} but resolves the registry from `Main.yieldSourceRegistry()`. */
57
+ export async function fetchSupportedYieldSourceApysFromMain(main, asset) {
58
+ const runner = runnerOrThrow(main);
59
+ const regAddr = await main.yieldSourceRegistry();
60
+ const registry = new Contract(regAddr, yieldSourceRegistryAbi, runner);
61
+ return fetchSupportedYieldSourceApys(registry, asset);
62
+ }
63
+ const COMPOUND_BASE_ASSET_ABI = ['function baseAsset() view returns (address)'];
64
+ function dedupeYieldSourceRows(rows) {
65
+ const seen = new Set();
66
+ const out = [];
67
+ for (const row of rows) {
68
+ const key = row.address.toLowerCase();
69
+ if (seen.has(key))
70
+ continue;
71
+ seen.add(key);
72
+ out.push(row);
73
+ }
74
+ return out;
75
+ }
76
+ /**
77
+ * Keep multi-asset sources (e.g. Aave) and Compound comets whose `baseAsset()` matches `asset`.
78
+ * Compound detection uses `baseAsset()` — not `name()` — so filtering works when name reads fail.
79
+ */
80
+ export async function filterYieldSourcesForAsset(rows, asset, runner) {
81
+ const assetLower = asset.toLowerCase();
82
+ /** Sequential — parallel baseAsset() bursts trigger Alchemy 429 in dev. */
83
+ const filtered = [];
84
+ for (const row of rows) {
85
+ try {
86
+ const c = new Contract(row.address, COMPOUND_BASE_ASSET_ABI, runner);
87
+ const baseAsset = String(await c.baseAsset()).toLowerCase();
88
+ if (baseAsset === assetLower)
89
+ filtered.push(row);
90
+ }
91
+ catch {
92
+ filtered.push(row);
93
+ }
94
+ }
95
+ return filtered;
96
+ }
97
+ /**
98
+ * All approved yield adapters applicable to one loan asset (registry-driven; APY may be null).
99
+ */
100
+ export async function fetchYieldSourcesForAsset(main, asset) {
101
+ const runner = runnerOrThrow(main);
102
+ const rowsRaw = await fetchSupportedYieldSourceApysFromMain(main, asset);
103
+ const deduped = dedupeYieldSourceRows(rowsRaw);
104
+ return filterYieldSourcesForAsset(deduped, asset, runner);
105
+ }
106
+ //# sourceMappingURL=yieldSources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yieldSources.js","sourceRoot":"","sources":["../src/yieldSources.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,49 @@
1
1
  {
2
2
  "name": "@pearcurve/sdk",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.0",
4
+ "description": "TypeScript SDK for Pearcurve protocol (ethers, calldata helpers)",
5
+ "license": "SEE LICENSE IN LICENSE",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/pearcurve/pearcurve-sdk.git"
9
+ },
10
+ "type": "module",
11
+ "main": "./dist/index.js",
12
+ "types": "./dist/index.d.ts",
13
+ "exports": {
14
+ ".": {
15
+ "types": "./dist/index.d.ts",
16
+ "import": "./dist/index.js"
17
+ }
18
+ },
19
+ "files": [
20
+ "dist",
21
+ "src/abis/json"
22
+ ],
23
+ "scripts": {
24
+ "sync-abis": "node ./scripts/sync-abis.mjs",
25
+ "publish:sdk": "node ./scripts/publish-sdk.mjs",
26
+ "sync-deployments": "node ./scripts/sync-deployments.mjs",
27
+ "normalize-abis": "node ./scripts/normalize-abis.mjs",
28
+ "build": "rm -rf dist && tsc",
29
+ "prepack": "npm run build",
30
+ "test": "vitest run",
31
+ "test:watch": "vitest"
32
+ },
33
+ "peerDependencies": {
34
+ "ethers": "^6.16.0"
35
+ },
36
+ "devDependencies": {
37
+ "@types/node": "^22.10.0",
38
+ "ethers": "^6.16.0",
39
+ "tsx": "^4.19.0",
40
+ "typescript": "^5.7.2",
41
+ "vitest": "^3.0.0"
42
+ },
43
+ "engines": {
44
+ "node": ">=20.10"
45
+ },
46
+ "publishConfig": {
47
+ "access": "public"
48
+ }
49
+ }