@1delta/margin-fetcher-sol 0.0.3 → 0.0.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/index.mjs CHANGED
@@ -7894,9 +7894,10 @@ var LENDING_MARKET = {
7894
7894
  };
7895
7895
  var key = (b, off) => encodeBase58(b.subarray(off, off + 32));
7896
7896
  var NULL_PUBKEY = "11111111111111111111111111111111";
7897
+ var NULL_SENTINEL = "nu11111111111111111111111111111111111111111";
7897
7898
  var optionalKey = (b, off, name) => {
7898
7899
  const k = key(b, off);
7899
- return k === NULL_PUBKEY ? {} : { [name]: k };
7900
+ return k === NULL_PUBKEY || k === NULL_SENTINEL ? {} : { [name]: k };
7900
7901
  };
7901
7902
  var u64 = (b, off) => new DataView(b.buffer, b.byteOffset).getBigUint64(off, true);
7902
7903
  var i64 = (b, off) => new DataView(b.buffer, b.byteOffset).getBigInt64(off, true);
@@ -20083,7 +20084,7 @@ function createP0Api(opts = {}) {
20083
20084
  return {
20084
20085
  banks: () => get("/banks/db"),
20085
20086
  banksMeta: () => get("/banks/meta"),
20086
- /** bank → `{ campaigns: [...] }`. */
20087
+ /** bank → `{ campaigns: [...] }` — the reward campaigns (`p0RewardsOf`). */
20087
20088
  emissions: () => get("/emissions"),
20088
20089
  luts: () => get("/luts")
20089
20090
  };
@@ -35541,8 +35542,17 @@ function p0CurveKnots(c) {
35541
35542
  // src/vaults/lst/stakePool.ts
35542
35543
  import { BorshReader, encodeBase58 as encodeBase584, fromBase64 as fromBase647 } from "@1delta/svm-kit";
35543
35544
  var SPL_STAKE_POOL_PROGRAM = "SPoo1Ku8WFXoNDMHPsrGSTSG1Y47rzgn41SLUNakuHy";
35545
+ var SANCTUM_SPL_STAKE_POOL_PROGRAM = "SP12tWFxD9oJsVWNavTTBZvMbA6gkAmxtVgxdqvyvhY";
35546
+ var SANCTUM_MULTI_STAKE_POOL_PROGRAM = "SPMBzsVUuoHA4Jm6KunbsotaahvVikZs1JyTW6iJvbn";
35547
+ var STAKE_POOL_PROGRAMS = [
35548
+ SPL_STAKE_POOL_PROGRAM,
35549
+ SANCTUM_SPL_STAKE_POOL_PROGRAM,
35550
+ SANCTUM_MULTI_STAKE_POOL_PROGRAM
35551
+ ];
35544
35552
  var OFFSET_RESERVE_STAKE = 130;
35545
35553
  var OFFSET_POOL_MINT = 162;
35554
+ var OFFSET_MANAGER_FEE_ACCOUNT = 194;
35555
+ var OFFSET_TOKEN_PROGRAM = 226;
35546
35556
  var OFFSET_TOTAL_LAMPORTS = 258;
35547
35557
  var OFFSET_POOL_TOKEN_SUPPLY = 266;
35548
35558
  var OFFSET_LAST_UPDATE_EPOCH = 274;
@@ -35572,6 +35582,12 @@ function decodeStakePool(data) {
35572
35582
  reserveStake: encodeBase584(
35573
35583
  data.slice(OFFSET_RESERVE_STAKE, OFFSET_RESERVE_STAKE + 32)
35574
35584
  ),
35585
+ managerFeeAccount: encodeBase584(
35586
+ data.slice(OFFSET_MANAGER_FEE_ACCOUNT, OFFSET_MANAGER_FEE_ACCOUNT + 32)
35587
+ ),
35588
+ tokenProgramId: encodeBase584(
35589
+ data.slice(OFFSET_TOKEN_PROGRAM, OFFSET_TOKEN_PROGRAM + 32)
35590
+ ),
35575
35591
  totalLamports: u642(data, OFFSET_TOTAL_LAMPORTS),
35576
35592
  poolTokenSupply: u642(data, OFFSET_POOL_TOKEN_SUPPLY),
35577
35593
  lastUpdateEpoch: u642(data, OFFSET_LAST_UPDATE_EPOCH)
@@ -35590,13 +35606,15 @@ function decodeStakePool(data) {
35590
35606
  r.u8();
35591
35607
  const solDepositAuthority = readOptionPubkey(r);
35592
35608
  const solDeposit = readFee(r);
35593
- r.u8();
35594
- skipOptionPubkey(r);
35609
+ const solReferralFee = r.u8();
35610
+ const solWithdrawAuthority = readOptionPubkey(r);
35595
35611
  const solWithdrawal = readFee(r);
35596
35612
  skipFutureFee(r);
35597
35613
  out.lastEpochPoolTokenSupply = r.u64();
35598
35614
  out.lastEpochTotalLamports = r.u64();
35599
35615
  out.solDepositAuthority = solDepositAuthority;
35616
+ out.solReferralFee = solReferralFee;
35617
+ out.solWithdrawAuthority = solWithdrawAuthority;
35600
35618
  out.fees = {
35601
35619
  epoch,
35602
35620
  stakeDeposit,
@@ -35611,11 +35629,11 @@ function decodeStakePool(data) {
35611
35629
  var feeBps = (f) => f.denominator === 0n ? 0 : Number(f.numerator * 10000n / f.denominator);
35612
35630
  async function readStakePools(rpc, stakePools, opts = {}) {
35613
35631
  const { slot, accounts } = await rpc.readAccounts(stakePools, { encoding: "base64" });
35614
- const program = opts.programId ?? SPL_STAKE_POOL_PROGRAM;
35632
+ const programs = opts.programId ? [opts.programId] : STAKE_POOL_PROGRAMS;
35615
35633
  const pools = accounts.map((a) => {
35616
- if (!a || a.owner !== program) return null;
35634
+ if (!a || !programs.includes(a.owner)) return null;
35617
35635
  try {
35618
- return decodeStakePool(fromBase647(a.data[0]));
35636
+ return { ...decodeStakePool(fromBase647(a.data[0])), program: a.owner };
35619
35637
  } catch {
35620
35638
  return null;
35621
35639
  }
@@ -36057,6 +36075,26 @@ function p0EmodeRoster(banks, symbolOf = (b) => b.tokenSymbol ?? b.mint.slice(0,
36057
36075
  }
36058
36076
  return { tags, unrepresented };
36059
36077
  }
36078
+ function p0RewardsOf(bank, campaigns) {
36079
+ const by = /* @__PURE__ */ new Map();
36080
+ for (const c of campaigns ?? []) {
36081
+ if (c.bankAddresses?.length && !c.bankAddresses.includes(bank)) continue;
36082
+ const mint = c.rewardMints?.[0];
36083
+ const apr = Number(c.rate) * 100;
36084
+ if (!mint || !Number.isFinite(apr) || apr <= 0) continue;
36085
+ const side = c.rateBasis === "deposits" ? "supply" : c.rateBasis === "borrows" || c.rateBasis === "liabilities" ? "borrow" : null;
36086
+ if (!side) continue;
36087
+ const e = by.get(mint) ?? { supply: 0, borrow: 0 };
36088
+ e[side] += apr;
36089
+ by.set(mint, e);
36090
+ }
36091
+ return [...by].map(([asset, e]) => ({
36092
+ asset,
36093
+ depositRate: e.supply,
36094
+ variableBorrowRate: e.borrow,
36095
+ stableBorrowRate: 0
36096
+ }));
36097
+ }
36060
36098
  var wrappedName = (tag) => tag === P0_ASSET_TAG.staked ? "staked" : tag === P0_ASSET_TAG.kamino ? "kamino" : tag === P0_ASSET_TAG.drift ? "drift" : tag === P0_ASSET_TAG.solend ? "solend" : tag === P0_ASSET_TAG.juplend ? "juplend" : null;
36061
36099
  var p0NeedsVenueMultiplier = (b) => b.config.assetTag >= P0_ASSET_TAG.kamino;
36062
36100
  var p0BankRef = (b) => ({
@@ -36266,7 +36304,7 @@ function convertP0Bank(inp, ctx) {
36266
36304
  variableBorrowRate: wrapped ? 0 : rates.borrowAprPercent,
36267
36305
  stableBorrowRate: 0,
36268
36306
  intrinsicYield: inp.venue?.supplyAprPercent ?? 0,
36269
- rewards: [],
36307
+ rewards: p0RewardsOf(b.address, inp.campaigns),
36270
36308
  decimals,
36271
36309
  config,
36272
36310
  collateralActive,
@@ -36356,7 +36394,12 @@ function convertP0Group(inp) {
36356
36394
  continue;
36357
36395
  }
36358
36396
  const row = convertP0Bank(
36359
- { bank: b, price: inp.prices?.[b.address], venue },
36397
+ {
36398
+ bank: b,
36399
+ price: inp.prices?.[b.address],
36400
+ venue,
36401
+ campaigns: inp.emissions?.[b.address]?.campaigns
36402
+ },
36360
36403
  {
36361
36404
  lenderKey,
36362
36405
  group: g,
@@ -36410,6 +36453,12 @@ async function fetchProject0Public(opts = {}) {
36410
36453
  const source = opts.source ?? "chain";
36411
36454
  const roster = opts.roster ?? "scan";
36412
36455
  const rpc = source === "chain" || roster === "scan" || !opts.prices?.cacheOnly ? opts.rpc ?? createSvmRpc2() : opts.rpc;
36456
+ const emissionsP = opts.emissions === false ? Promise.resolve(void 0) : opts.emissions ? Promise.resolve(opts.emissions) : api.emissions().catch((e) => {
36457
+ console.warn(
36458
+ `[project0] /api/emissions failed, rows served without rewards: ${e?.message ?? e}`
36459
+ );
36460
+ return void 0;
36461
+ });
36413
36462
  const out = {};
36414
36463
  for (const group of groups) {
36415
36464
  let banks = [];
@@ -36488,7 +36537,8 @@ async function fetchProject0Public(opts = {}) {
36488
36537
  meta,
36489
36538
  tokenList: opts.tokenList,
36490
36539
  slot,
36491
- includeDead: opts.includeDead
36540
+ includeDead: opts.includeDead,
36541
+ emissions: await emissionsP
36492
36542
  });
36493
36543
  if (!Object.keys(conv.data).length) {
36494
36544
  console.warn(`[project0] group ${group}: no banks served`);
@@ -36990,6 +37040,8 @@ async function fetchJupiterPrices(mints, tokenList = {}, opts = {}) {
36990
37040
  for (const [mint, r] of Object.entries(res ?? {})) {
36991
37041
  const p = num(r?.usdPrice);
36992
37042
  if (!(p > 0)) continue;
37043
+ if (opts.minLiquidityUsd !== void 0 && !(num(r?.liquidity) >= opts.minLiquidityUsd))
37044
+ continue;
36993
37045
  byMint[mint] = p;
36994
37046
  const stock = num(r?.stockData?.price);
36995
37047
  if (stock > 0) stockPriceByMint[mint] = stock;
@@ -64799,6 +64851,7 @@ async function readHumaChainState(rpc, pool = HUMA_POOL) {
64799
64851
  mint: HUMA_PST_MINT,
64800
64852
  assets: state.mode_states[classicIdx]?.assets ?? 0n,
64801
64853
  cumulativeYields: state.mode_states[classicIdx]?.cumulative_yields ?? 0n,
64854
+ assetsRefreshedAt: state.mode_states[classicIdx]?.assets_refreshed_at ?? 0n,
64802
64855
  supply: mintSupply2(mintData),
64803
64856
  liquidAssetsDeployed: state.liquid_assets_deployed,
64804
64857
  poolCash,
@@ -65442,6 +65495,84 @@ async function fetchLstVaults(opts = {}) {
65442
65495
  });
65443
65496
  }
65444
65497
 
65498
+ // src/vaults/lst/depositSol.ts
65499
+ var STAKE_POOL_DEPOSIT_ROSTER = [
65500
+ {
65501
+ symbol: "JitoSOL",
65502
+ mint: "J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn",
65503
+ stakePool: "Jito4APyf642JPZPx3hGc6WWJ8zPKtRbRs4P815Awbb",
65504
+ program: SPL_STAKE_POOL_PROGRAM,
65505
+ lookupTable: "9v1qSjEzDQ6J4RxzGRXVVyD1CeDTwv4vdDYADsRB7sjY"
65506
+ },
65507
+ {
65508
+ symbol: "bSOL",
65509
+ mint: "bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1",
65510
+ stakePool: "stk9ApL5HeVAwPLr3TLhDXdZS8ptVu7zp6ov8HFDuMi",
65511
+ program: SPL_STAKE_POOL_PROGRAM,
65512
+ lookupTable: "2QRB1SxadngWnqKkEYcSzwPZQnmBgqu5LDD8xdmaNZZD"
65513
+ },
65514
+ {
65515
+ symbol: "vSOL",
65516
+ mint: "vSoLxydx6akxyMD9XEcPvGYNGq6Nn66oqVb3UkGkei7",
65517
+ stakePool: "Fu9BYC6tWBo1KMKaP3CFoKfRhqv9akmy3DuYwnCyWiyC",
65518
+ program: SPL_STAKE_POOL_PROGRAM,
65519
+ lookupTable: "9nXBzkk2dPk41DXWgYjNmDkz65HWKpzJCUQKXVhFTUnE"
65520
+ },
65521
+ {
65522
+ symbol: "BNSOL",
65523
+ mint: "BNso1VUJnh4zcfpZa6986Ea66P6TCp59hvtNJ8b1X85",
65524
+ stakePool: "Hr9pzexrBge3vgmBNRR8u42CNQgBXdHm4UkUN2DH4a7r",
65525
+ program: SPL_STAKE_POOL_PROGRAM,
65526
+ lookupTable: "GZjbDvfUhpqAjatr1JPLLxFbHqwxaQSpMw5UsoUa4DbU"
65527
+ },
65528
+ {
65529
+ symbol: "JupSOL",
65530
+ mint: "jupSoLaHXQiZZTSfEWMTRRgpnyFm8f6sZdosWBjx93v",
65531
+ stakePool: "8VpRhuxa7sUUepdY3kQiTmX9rS5vx4WgaXiAnXq4KCtr",
65532
+ program: SANCTUM_MULTI_STAKE_POOL_PROGRAM,
65533
+ lookupTable: "7A1unBgYZLqPx642iuRZoum4yBebq5i4mxsVeq6oTSWQ"
65534
+ },
65535
+ {
65536
+ symbol: "dSOL",
65537
+ mint: "Dso1bDeDjCQxTrWHqUUi63oBvV7Mdm6WaobLbQ7gnPQ",
65538
+ stakePool: "9mhGNSPArRMHpLDMSmxAvuoizBqtBGqYdT8WGuqgxNdn",
65539
+ program: SANCTUM_SPL_STAKE_POOL_PROGRAM,
65540
+ lookupTable: "GV4LPz2QM9Yksb6uZPcAM1pSDBkcky9Hw4fyAkMsSWWP"
65541
+ },
65542
+ {
65543
+ symbol: "hSOL",
65544
+ mint: "he1iusmfkpAdwvxLNGV8Y1iSbj4rUy6yMhEA3fotn9A",
65545
+ stakePool: "3wK2g8ZdzAH8FJ7PKr2RcvGh7V9VYson5hrVsJM5Lmws",
65546
+ program: SANCTUM_SPL_STAKE_POOL_PROGRAM,
65547
+ lookupTable: "54tcUC2CFF1SfH9tnZDic5eSZoSpm4iNtDxvPyBKRgwa"
65548
+ },
65549
+ {
65550
+ symbol: "bbSOL",
65551
+ mint: "Bybit2vBJGhPF52GBdNaQfUJ6ZpThSgHBobjWZpLPb4B",
65552
+ stakePool: "2aMLkB5p5gVvCwKkdSo5eZAL1WwhZbxezQr1wxiynRhq",
65553
+ program: SANCTUM_SPL_STAKE_POOL_PROGRAM,
65554
+ lookupTable: "98N4QqCpkjpXZ1acsKvBx4p7B5sLQQYpfJ4MaDkU1iHf"
65555
+ }
65556
+ ];
65557
+ var stakePoolDepositEntry = (mint) => STAKE_POOL_DEPOSIT_ROSTER.find((e) => e.mint === mint);
65558
+ function depositSolOut(pool, lamports, opts = {}) {
65559
+ if (!pool.fees || pool.solReferralFee === void 0)
65560
+ return { refused: "no-tail" };
65561
+ if (pool.solDepositAuthority) return { refused: "permissioned" };
65562
+ if (opts.currentEpoch !== void 0 && pool.lastUpdateEpoch < opts.currentEpoch)
65563
+ return { refused: "stale" };
65564
+ const minted = pool.totalLamports === 0n || pool.poolTokenSupply === 0n ? lamports : lamports * pool.poolTokenSupply / pool.totalLamports;
65565
+ const { numerator, denominator } = pool.fees.solDeposit;
65566
+ const fee = denominator === 0n ? 0n : minted * numerator / denominator;
65567
+ const referral = fee * BigInt(pool.solReferralFee) / 100n;
65568
+ const out = minted - fee + (opts.referrerIsDepositor !== false ? referral : 0n);
65569
+ if (minted - fee <= 0n) return { refused: "too-small" };
65570
+ return {
65571
+ out,
65572
+ feeBps: minted === 0n ? 0 : Number(minted - out) * 1e4 / Number(minted)
65573
+ };
65574
+ }
65575
+
65445
65576
  // src/vaults/origin.ts
65446
65577
  function common4626(r, provider, redemptionType) {
65447
65578
  const priced = r.priceUsd !== void 0 && Number.isFinite(r.priceUsd);
@@ -68912,6 +69043,8 @@ export {
68912
69043
  PROJECT_0_PROFILE_ID,
68913
69044
  PYTH_PRICE_UPDATE_V2_DISCRIMINATOR,
68914
69045
  PYTH_RECEIVER_PROGRAM,
69046
+ SANCTUM_MULTI_STAKE_POOL_PROGRAM,
69047
+ SANCTUM_SPL_STAKE_POOL_PROGRAM,
68915
69048
  SAVE_API_BASE,
68916
69049
  SAVE_CREATOR,
68917
69050
  SAVE_DEFAULT_AVG_SLOT_SECONDS,
@@ -68953,6 +69086,8 @@ export {
68953
69086
  SPL_STAKE_POOL_PROGRAM,
68954
69087
  STABLECOIN_SYMBOLS,
68955
69088
  STAKE_ACCOUNT_RENT_EXEMPT_LAMPORTS,
69089
+ STAKE_POOL_DEPOSIT_ROSTER,
69090
+ STAKE_POOL_PROGRAMS,
68956
69091
  SVM_LENDERS,
68957
69092
  TERM_PROFILES,
68958
69093
  WSOL_MINT,
@@ -69040,6 +69175,7 @@ export {
69040
69175
  decodeVestingSchedule,
69041
69176
  decodeYieldPool,
69042
69177
  denominationOf,
69178
+ depositSolOut,
69043
69179
  deriveLayerTotals,
69044
69180
  deriveLoopscalePrices,
69045
69181
  deriveP0Mode,
@@ -69200,6 +69336,7 @@ export {
69200
69336
  p0MultipointBaseRate,
69201
69337
  p0NeedsVenueMultiplier,
69202
69338
  p0Rates,
69339
+ p0RewardsOf,
69203
69340
  p0StateSemantics,
69204
69341
  p0SupplyCapTokens,
69205
69342
  p0Utilization,
@@ -69262,6 +69399,7 @@ export {
69262
69399
  seniorCooldownPdas,
69263
69400
  settlementBatchPdas,
69264
69401
  solsticeOriginRow,
69402
+ stakePoolDepositEntry,
69265
69403
  strategyMode,
69266
69404
  strategyNameOf,
69267
69405
  strategyPdas,