@continuumdao/ctm-mpc-defi 0.2.1 → 0.2.2

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 (57) hide show
  1. package/dist/agent/catalog.cjs +62 -11
  2. package/dist/agent/catalog.cjs.map +1 -1
  3. package/dist/agent/catalog.d.ts +27 -1
  4. package/dist/agent/catalog.js +61 -12
  5. package/dist/agent/catalog.js.map +1 -1
  6. package/dist/agent/skills/curve-dao/SKILL.md +2 -1
  7. package/dist/chains/evm/index.cjs +54 -0
  8. package/dist/chains/evm/index.cjs.map +1 -1
  9. package/dist/chains/evm/index.d.ts +13 -1
  10. package/dist/chains/evm/index.js +52 -2
  11. package/dist/chains/evm/index.js.map +1 -1
  12. package/dist/core/index.cjs +64 -0
  13. package/dist/core/index.cjs.map +1 -1
  14. package/dist/core/index.d.ts +20 -1
  15. package/dist/core/index.js +56 -1
  16. package/dist/core/index.js.map +1 -1
  17. package/dist/index.cjs +131 -0
  18. package/dist/index.cjs.map +1 -1
  19. package/dist/index.d.ts +2 -2
  20. package/dist/index.js +120 -2
  21. package/dist/index.js.map +1 -1
  22. package/dist/protocols/evm/aave-v4/index.cjs +766 -6
  23. package/dist/protocols/evm/aave-v4/index.cjs.map +1 -1
  24. package/dist/protocols/evm/aave-v4/index.d.ts +417 -1
  25. package/dist/protocols/evm/aave-v4/index.js +741 -8
  26. package/dist/protocols/evm/aave-v4/index.js.map +1 -1
  27. package/dist/protocols/evm/curve-dao/index.cjs +233 -7
  28. package/dist/protocols/evm/curve-dao/index.cjs.map +1 -1
  29. package/dist/protocols/evm/curve-dao/index.d.ts +66 -1
  30. package/dist/protocols/evm/curve-dao/index.js +227 -9
  31. package/dist/protocols/evm/curve-dao/index.js.map +1 -1
  32. package/dist/protocols/evm/ethena/index.cjs +104 -0
  33. package/dist/protocols/evm/ethena/index.cjs.map +1 -1
  34. package/dist/protocols/evm/ethena/index.d.ts +46 -1
  35. package/dist/protocols/evm/ethena/index.js +99 -1
  36. package/dist/protocols/evm/ethena/index.js.map +1 -1
  37. package/dist/protocols/evm/euler-v2/index.cjs +2334 -37
  38. package/dist/protocols/evm/euler-v2/index.cjs.map +1 -1
  39. package/dist/protocols/evm/euler-v2/index.d.ts +464 -1
  40. package/dist/protocols/evm/euler-v2/index.js +2286 -39
  41. package/dist/protocols/evm/euler-v2/index.js.map +1 -1
  42. package/dist/protocols/evm/lido/index.cjs +110 -0
  43. package/dist/protocols/evm/lido/index.cjs.map +1 -1
  44. package/dist/protocols/evm/lido/index.d.ts +33 -2
  45. package/dist/protocols/evm/lido/index.js +107 -2
  46. package/dist/protocols/evm/lido/index.js.map +1 -1
  47. package/dist/protocols/evm/maple/index.cjs +83 -0
  48. package/dist/protocols/evm/maple/index.cjs.map +1 -1
  49. package/dist/protocols/evm/maple/index.d.ts +22 -1
  50. package/dist/protocols/evm/maple/index.js +82 -1
  51. package/dist/protocols/evm/maple/index.js.map +1 -1
  52. package/dist/protocols/evm/sky/index.cjs +217 -0
  53. package/dist/protocols/evm/sky/index.cjs.map +1 -1
  54. package/dist/protocols/evm/sky/index.d.ts +56 -1
  55. package/dist/protocols/evm/sky/index.js +210 -2
  56. package/dist/protocols/evm/sky/index.js.map +1 -1
  57. package/package.json +1 -1
@@ -211,7 +211,62 @@ declare function buildSkySusdsDepositFromUsdsBatch(args: {
211
211
  messageToSign: string;
212
212
  }>;
213
213
 
214
+ /** Debt in USDS wei matching `wipeAll` rounding (`_divup(art * rate, RAY)`). */
215
+ declare function skyUsdsDebtWeiFromUrnArt(art: bigint, rate: bigint): bigint;
216
+ type SkyLockstakePositionRow = {
217
+ index: number;
218
+ urn: Address;
219
+ inkWei: bigint;
220
+ art: bigint;
221
+ debtUsdsWei: bigint;
222
+ farm: Address;
223
+ /** Human-readable SKY locked */
224
+ skyLocked: string;
225
+ /** Human-readable USDS debt */
226
+ debtUsds: string;
227
+ /**
228
+ * Remaining borrow headroom in USD for UI only: `(SKY locked × SKY/USD × SKY_LOCKSTAKE_UI_COLLATERAL_FACTOR) − debtUSD`.
229
+ * Does not reflect on-chain liquidation price, oracle lag, stability fees, or protocol collateralization rules.
230
+ */
231
+ borrowLimitUsdApprox: number | null;
232
+ /** SKY/USD used only for the approximation above (same source as the dialog, e.g. CoinGecko). */
233
+ skyPriceUsd: number | null;
234
+ };
235
+ declare function loadSkyLockstakePositions(args: {
236
+ rpcUrl: string;
237
+ owner: Address;
238
+ skyUsd: number | null;
239
+ }): Promise<SkyLockstakePositionRow[]>;
240
+ /** ERC-20 paid by `LockstakeEngine.getReward` for this urn’s farm (farm-dependent; read on-chain). */
241
+ declare function readSkyLockstakeFarmRewardsToken(args: {
242
+ rpcUrl: string;
243
+ farm: Address;
244
+ }): Promise<Address>;
245
+
246
+ declare function readSusdsVaultShareBalanceWei(args: {
247
+ rpcUrl: string;
248
+ owner: Address;
249
+ }): Promise<bigint>;
250
+ declare function readSusdsVaultDecimals(args: {
251
+ rpcUrl: string;
252
+ }): Promise<number>;
253
+ /** Approximate USDS out for `sharesWei` at current vault exchange rate (same block rules as `redeem`). */
254
+ declare function readSusdsPreviewRedeemAssetsWei(args: {
255
+ rpcUrl: string;
256
+ sharesWei: bigint;
257
+ }): Promise<bigint>;
258
+ declare function formatSusdsSharesHuman(sharesWei: bigint, decimals: number): string;
259
+
260
+ /** CoinGecko simple token price for SKY on Ethereum (USD). */
261
+ declare function fetchSkyUsdFromCoinGecko(): Promise<number | null>;
262
+
263
+ /**
264
+ * Chains where Sky LockStake Engine multisign flows are implemented.
265
+ * Sky tokens exist on other networks; LockStake staking/borrow in this app tracks engine deployments only.
266
+ */
267
+ declare function loadSkyLockstakeSupportedChainIds(): ReadonlySet<number>;
268
+
214
269
  declare const SKY_PROTOCOL_ID = "sky";
215
270
  declare const skyProtocolModule: ProtocolModule;
216
271
 
217
- export { SKY_ETHEREUM_MAINNET, SKY_ETHEREUM_MAINNET_CHAIN_ID, SKY_LOCKSTAKE_DEFAULT_FARM_MAINNET, SKY_LOCKSTAKE_DEFAULT_FARM_REF, SKY_LOCKSTAKE_ENGINE_MAINNET, SKY_LOCKSTAKE_MULTICALL_FALLBACK_GAS, SKY_LOCKSTAKE_UI_COLLATERAL_FACTOR, SKY_LS_SKY_ERC20_MAINNET, SKY_PROTOCOL_ID, SKY_TOKEN_DECIMALS, SUSDS_VAULT_ERC4626_MAINNET, type SkyMultisignBatchStep, type SkyMultisignChainDetailRow, USDS_DECIMALS, USDS_ETHEREUM_MAINNET, appendSerializedSkyBatch, buildSkyLockstakeCloseBatch, buildSkyLockstakeDrawBatch, buildSkyLockstakeGetRewardBatch, buildSkyLockstakeStakePositionBatch, buildSkyLockstakeWipeBatch, buildSkySusdsDepositFromUsdsBatch, buildSkySusdsRedeemToUsdsBatch, isSkyLockstakeIsolationEstimateGasFragileBatchStep, resolveSkyLockstakeBatchStepGasFromSignRequest, skyProtocolModule };
272
+ export { SKY_ETHEREUM_MAINNET, SKY_ETHEREUM_MAINNET_CHAIN_ID, SKY_LOCKSTAKE_DEFAULT_FARM_MAINNET, SKY_LOCKSTAKE_DEFAULT_FARM_REF, SKY_LOCKSTAKE_ENGINE_MAINNET, SKY_LOCKSTAKE_MULTICALL_FALLBACK_GAS, SKY_LOCKSTAKE_UI_COLLATERAL_FACTOR, SKY_LS_SKY_ERC20_MAINNET, SKY_PROTOCOL_ID, SKY_TOKEN_DECIMALS, SUSDS_VAULT_ERC4626_MAINNET, type SkyLockstakePositionRow, type SkyMultisignBatchStep, type SkyMultisignChainDetailRow, USDS_DECIMALS, USDS_ETHEREUM_MAINNET, appendSerializedSkyBatch, buildSkyLockstakeCloseBatch, buildSkyLockstakeDrawBatch, buildSkyLockstakeGetRewardBatch, buildSkyLockstakeStakePositionBatch, buildSkyLockstakeWipeBatch, buildSkySusdsDepositFromUsdsBatch, buildSkySusdsRedeemToUsdsBatch, fetchSkyUsdFromCoinGecko, formatSusdsSharesHuman, isSkyLockstakeIsolationEstimateGasFragileBatchStep, loadSkyLockstakePositions, loadSkyLockstakeSupportedChainIds, readSkyLockstakeFarmRewardsToken, readSusdsPreviewRedeemAssetsWei, readSusdsVaultDecimals, readSusdsVaultShareBalanceWei, resolveSkyLockstakeBatchStepGasFromSignRequest, skyProtocolModule, skyUsdsDebtWeiFromUrnArt };
@@ -1,4 +1,4 @@
1
- import { parseAbi, defineChain, createPublicClient, http, getAddress, parseUnits, encodeFunctionData, decodeFunctionData, parseGwei, serializeTransaction, keccak256 } from 'viem';
1
+ import { parseAbi, defineChain, createPublicClient, http, getAddress, parseUnits, encodeFunctionData, decodeFunctionData, formatUnits, parseGwei, serializeTransaction, keccak256 } from 'viem';
2
2
  import { fetchChainFeeParams, gasLimitFromEstimateAndChainConfig, gweiToDecimalString, proposalTxParamsToFeeSnapshot, alignEip1559FeesWithLatestBase, getClientIdFromKeyGenResult } from '@continuumdao/continuum-node-sdk';
3
3
 
4
4
  // src/core/registry.ts
@@ -1205,6 +1205,214 @@ async function buildSkySusdsDepositFromUsdsBatch(args) {
1205
1205
  purposePrefix,
1206
1206
  keyGen: args.keyGen});
1207
1207
  }
1208
+ var RAY = 10n ** 27n;
1209
+ var engineAbi2 = parseAbi([
1210
+ "function ownerUrnsCount(address usr) view returns (uint256)",
1211
+ "function ownerUrns(address owner, uint256 index) view returns (address urn)",
1212
+ "function urnFarms(address urn) view returns (address farm)",
1213
+ "function ilk() view returns (bytes32)",
1214
+ "function vat() view returns (address)"
1215
+ ]);
1216
+ var vatAbi = parseAbi([
1217
+ "function urns(bytes32 ilk, address urn) view returns (uint256 ink, uint256 art)",
1218
+ "function ilks(bytes32 ilk) view returns (uint256 Art, uint256 rate, uint256 spot, uint256 line, uint256 dust)"
1219
+ ]);
1220
+ function skyClient(rpcUrl) {
1221
+ const rpc = rpcUrl.trim();
1222
+ const ch = defineChain({
1223
+ id: 1,
1224
+ name: "Ethereum",
1225
+ nativeCurrency: { decimals: 18, name: "Ether", symbol: "ETH" },
1226
+ rpcUrls: { default: { http: [rpc] } }
1227
+ });
1228
+ return createPublicClient({ chain: ch, transport: http(rpc) });
1229
+ }
1230
+ function skyUsdsDebtWeiFromUrnArt(art, rate) {
1231
+ if (art === 0n || rate === 0n) return 0n;
1232
+ return (art * rate + RAY - 1n) / RAY;
1233
+ }
1234
+ async function loadSkyLockstakePositions(args) {
1235
+ const client = skyClient(args.rpcUrl);
1236
+ const engine = getAddress(SKY_LOCKSTAKE_ENGINE_MAINNET);
1237
+ const ilk = await client.readContract({
1238
+ address: engine,
1239
+ abi: engineAbi2,
1240
+ functionName: "ilk"
1241
+ });
1242
+ const vat = await client.readContract({
1243
+ address: engine,
1244
+ abi: engineAbi2,
1245
+ functionName: "vat"
1246
+ });
1247
+ const count = await client.readContract({
1248
+ address: engine,
1249
+ abi: engineAbi2,
1250
+ functionName: "ownerUrnsCount",
1251
+ args: [args.owner]
1252
+ });
1253
+ const n = Number(count);
1254
+ if (!Number.isFinite(n) || n <= 0) return [];
1255
+ const ilkInfo = await client.readContract({
1256
+ address: vat,
1257
+ abi: vatAbi,
1258
+ functionName: "ilks",
1259
+ args: [ilk]
1260
+ });
1261
+ const rate = ilkInfo[1];
1262
+ const rows = [];
1263
+ for (let index = 0; index < n; index++) {
1264
+ const urn = await client.readContract({
1265
+ address: engine,
1266
+ abi: engineAbi2,
1267
+ functionName: "ownerUrns",
1268
+ args: [args.owner, BigInt(index)]
1269
+ });
1270
+ if (!urn || urn === "0x0000000000000000000000000000000000000000") continue;
1271
+ const u = await client.readContract({
1272
+ address: vat,
1273
+ abi: vatAbi,
1274
+ functionName: "urns",
1275
+ args: [ilk, urn]
1276
+ });
1277
+ const inkWei = u[0];
1278
+ const art = u[1];
1279
+ const debtUsdsWei = skyUsdsDebtWeiFromUrnArt(art, rate);
1280
+ const farm = await client.readContract({
1281
+ address: engine,
1282
+ abi: engineAbi2,
1283
+ functionName: "urnFarms",
1284
+ args: [urn]
1285
+ });
1286
+ const skyHuman = Number(formatUnits(inkWei, SKY_TOKEN_DECIMALS));
1287
+ const debtHuman = Number(formatUnits(debtUsdsWei, USDS_DECIMALS));
1288
+ let borrowLimitUsdApprox = null;
1289
+ if (args.skyUsd != null && Number.isFinite(args.skyUsd) && args.skyUsd > 0) {
1290
+ const collateralUsd = skyHuman * args.skyUsd;
1291
+ const maxDebtUsd = collateralUsd * SKY_LOCKSTAKE_UI_COLLATERAL_FACTOR;
1292
+ borrowLimitUsdApprox = Math.max(0, maxDebtUsd - debtHuman);
1293
+ }
1294
+ rows.push({
1295
+ index,
1296
+ urn,
1297
+ inkWei,
1298
+ art,
1299
+ debtUsdsWei,
1300
+ farm,
1301
+ skyLocked: formatUnits(inkWei, SKY_TOKEN_DECIMALS),
1302
+ debtUsds: formatUnits(debtUsdsWei, USDS_DECIMALS),
1303
+ borrowLimitUsdApprox,
1304
+ skyPriceUsd: args.skyUsd
1305
+ });
1306
+ }
1307
+ return rows;
1308
+ }
1309
+ var farmRewardsTokenAbi = parseAbi(["function rewardsToken() view returns (address)"]);
1310
+ async function readSkyLockstakeFarmRewardsToken(args) {
1311
+ const client = skyClient(args.rpcUrl);
1312
+ const farm = getAddress(args.farm);
1313
+ const zero = "0x0000000000000000000000000000000000000000";
1314
+ if (farm.toLowerCase() === zero.toLowerCase()) {
1315
+ throw new Error("Farm address is zero.");
1316
+ }
1317
+ const tok = await client.readContract({
1318
+ address: farm,
1319
+ abi: farmRewardsTokenAbi,
1320
+ functionName: "rewardsToken"
1321
+ });
1322
+ return getAddress(tok);
1323
+ }
1324
+ var vaultAbi = parseAbi([
1325
+ "function balanceOf(address account) view returns (uint256)",
1326
+ "function decimals() view returns (uint8)",
1327
+ "function previewRedeem(uint256 shares) view returns (uint256 assets)"
1328
+ ]);
1329
+ async function readSusdsVaultShareBalanceWei(args) {
1330
+ const rpc = args.rpcUrl.trim();
1331
+ const ch = defineChain({
1332
+ id: 1,
1333
+ name: "Ethereum",
1334
+ nativeCurrency: { decimals: 18, name: "Ether", symbol: "ETH" },
1335
+ rpcUrls: { default: { http: [rpc] } }
1336
+ });
1337
+ const client = createPublicClient({ chain: ch, transport: http(rpc) });
1338
+ const vault = getAddress(SUSDS_VAULT_ERC4626_MAINNET);
1339
+ return client.readContract({
1340
+ address: vault,
1341
+ abi: vaultAbi,
1342
+ functionName: "balanceOf",
1343
+ args: [args.owner]
1344
+ });
1345
+ }
1346
+ async function readSusdsVaultDecimals(args) {
1347
+ const rpc = args.rpcUrl.trim();
1348
+ const ch = defineChain({
1349
+ id: 1,
1350
+ name: "Ethereum",
1351
+ nativeCurrency: { decimals: 18, name: "Ether", symbol: "ETH" },
1352
+ rpcUrls: { default: { http: [rpc] } }
1353
+ });
1354
+ const client = createPublicClient({ chain: ch, transport: http(rpc) });
1355
+ const vault = getAddress(SUSDS_VAULT_ERC4626_MAINNET);
1356
+ const d = await client.readContract({
1357
+ address: vault,
1358
+ abi: vaultAbi,
1359
+ functionName: "decimals"
1360
+ });
1361
+ return Number(d);
1362
+ }
1363
+ async function readSusdsPreviewRedeemAssetsWei(args) {
1364
+ if (args.sharesWei <= 0n) return 0n;
1365
+ const rpc = args.rpcUrl.trim();
1366
+ const ch = defineChain({
1367
+ id: 1,
1368
+ name: "Ethereum",
1369
+ nativeCurrency: { decimals: 18, name: "Ether", symbol: "ETH" },
1370
+ rpcUrls: { default: { http: [rpc] } }
1371
+ });
1372
+ const client = createPublicClient({ chain: ch, transport: http(rpc) });
1373
+ const vault = getAddress(SUSDS_VAULT_ERC4626_MAINNET);
1374
+ return client.readContract({
1375
+ address: vault,
1376
+ abi: vaultAbi,
1377
+ functionName: "previewRedeem",
1378
+ args: [args.sharesWei]
1379
+ });
1380
+ }
1381
+ function formatSusdsSharesHuman(sharesWei, decimals) {
1382
+ return formatUnits(sharesWei, decimals);
1383
+ }
1384
+
1385
+ // src/core/defiProxy.ts
1386
+ var coingeckoProxyUrl;
1387
+ function getCoingeckoProxyUrl() {
1388
+ return coingeckoProxyUrl;
1389
+ }
1390
+
1391
+ // src/protocols/evm/sky/usdPrice.ts
1392
+ async function fetchSkyUsdFromCoinGecko() {
1393
+ try {
1394
+ const addr = getAddress(SKY_ETHEREUM_MAINNET).toLowerCase();
1395
+ const url = "https://api.coingecko.com/api/v3/simple/token_price/ethereum?contract_addresses=" + encodeURIComponent(addr) + "&vs_currencies=usd";
1396
+ const proxy = getCoingeckoProxyUrl();
1397
+ const res = proxy ? await fetch(proxy, {
1398
+ method: "POST",
1399
+ headers: { "content-type": "application/json" },
1400
+ body: JSON.stringify({ platform: "ethereum", contractAddress: addr })
1401
+ }) : await fetch(url, { cache: "no-store" });
1402
+ if (!res.ok) return null;
1403
+ const raw = await res.json();
1404
+ const row = raw[addr];
1405
+ const n = row?.usd;
1406
+ return typeof n === "number" && Number.isFinite(n) && n > 0 ? n : null;
1407
+ } catch {
1408
+ return null;
1409
+ }
1410
+ }
1411
+
1412
+ // src/protocols/evm/sky/loadLockstakeSupportedChainIds.ts
1413
+ function loadSkyLockstakeSupportedChainIds() {
1414
+ return /* @__PURE__ */ new Set([1]);
1415
+ }
1208
1416
 
1209
1417
  // src/protocols/evm/sky/index.ts
1210
1418
  var SKY_PROTOCOL_ID = "sky";
@@ -1229,6 +1437,6 @@ var skyProtocolModule = {
1229
1437
  };
1230
1438
  registerProtocolModule(skyProtocolModule);
1231
1439
 
1232
- export { SKY_ETHEREUM_MAINNET, SKY_ETHEREUM_MAINNET_CHAIN_ID, SKY_LOCKSTAKE_DEFAULT_FARM_MAINNET, SKY_LOCKSTAKE_DEFAULT_FARM_REF, SKY_LOCKSTAKE_ENGINE_MAINNET, SKY_LOCKSTAKE_MULTICALL_FALLBACK_GAS, SKY_LOCKSTAKE_UI_COLLATERAL_FACTOR, SKY_LS_SKY_ERC20_MAINNET, SKY_PROTOCOL_ID, SKY_TOKEN_DECIMALS, SUSDS_VAULT_ERC4626_MAINNET, USDS_DECIMALS, USDS_ETHEREUM_MAINNET, appendSerializedSkyBatch, buildSkyLockstakeCloseBatch, buildSkyLockstakeDrawBatch, buildSkyLockstakeGetRewardBatch, buildSkyLockstakeStakePositionBatch, buildSkyLockstakeWipeBatch, buildSkySusdsDepositFromUsdsBatch, buildSkySusdsRedeemToUsdsBatch, isSkyLockstakeIsolationEstimateGasFragileBatchStep, resolveSkyLockstakeBatchStepGasFromSignRequest, skyProtocolModule };
1440
+ export { SKY_ETHEREUM_MAINNET, SKY_ETHEREUM_MAINNET_CHAIN_ID, SKY_LOCKSTAKE_DEFAULT_FARM_MAINNET, SKY_LOCKSTAKE_DEFAULT_FARM_REF, SKY_LOCKSTAKE_ENGINE_MAINNET, SKY_LOCKSTAKE_MULTICALL_FALLBACK_GAS, SKY_LOCKSTAKE_UI_COLLATERAL_FACTOR, SKY_LS_SKY_ERC20_MAINNET, SKY_PROTOCOL_ID, SKY_TOKEN_DECIMALS, SUSDS_VAULT_ERC4626_MAINNET, USDS_DECIMALS, USDS_ETHEREUM_MAINNET, appendSerializedSkyBatch, buildSkyLockstakeCloseBatch, buildSkyLockstakeDrawBatch, buildSkyLockstakeGetRewardBatch, buildSkyLockstakeStakePositionBatch, buildSkyLockstakeWipeBatch, buildSkySusdsDepositFromUsdsBatch, buildSkySusdsRedeemToUsdsBatch, fetchSkyUsdFromCoinGecko, formatSusdsSharesHuman, isSkyLockstakeIsolationEstimateGasFragileBatchStep, loadSkyLockstakePositions, loadSkyLockstakeSupportedChainIds, readSkyLockstakeFarmRewardsToken, readSusdsPreviewRedeemAssetsWei, readSusdsVaultDecimals, readSusdsVaultShareBalanceWei, resolveSkyLockstakeBatchStepGasFromSignRequest, skyProtocolModule, skyUsdsDebtWeiFromUrnArt };
1233
1441
  //# sourceMappingURL=index.js.map
1234
1442
  //# sourceMappingURL=index.js.map