@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.js CHANGED
@@ -204,6 +204,8 @@ __export(index_exports, {
204
204
  PROJECT_0_PROFILE_ID: () => PROJECT_0_PROFILE_ID,
205
205
  PYTH_PRICE_UPDATE_V2_DISCRIMINATOR: () => PYTH_PRICE_UPDATE_V2_DISCRIMINATOR,
206
206
  PYTH_RECEIVER_PROGRAM: () => PYTH_RECEIVER_PROGRAM,
207
+ SANCTUM_MULTI_STAKE_POOL_PROGRAM: () => SANCTUM_MULTI_STAKE_POOL_PROGRAM,
208
+ SANCTUM_SPL_STAKE_POOL_PROGRAM: () => SANCTUM_SPL_STAKE_POOL_PROGRAM,
207
209
  SAVE_API_BASE: () => SAVE_API_BASE,
208
210
  SAVE_CREATOR: () => SAVE_CREATOR,
209
211
  SAVE_DEFAULT_AVG_SLOT_SECONDS: () => SAVE_DEFAULT_AVG_SLOT_SECONDS,
@@ -245,6 +247,8 @@ __export(index_exports, {
245
247
  SPL_STAKE_POOL_PROGRAM: () => SPL_STAKE_POOL_PROGRAM,
246
248
  STABLECOIN_SYMBOLS: () => STABLECOIN_SYMBOLS,
247
249
  STAKE_ACCOUNT_RENT_EXEMPT_LAMPORTS: () => STAKE_ACCOUNT_RENT_EXEMPT_LAMPORTS,
250
+ STAKE_POOL_DEPOSIT_ROSTER: () => STAKE_POOL_DEPOSIT_ROSTER,
251
+ STAKE_POOL_PROGRAMS: () => STAKE_POOL_PROGRAMS,
248
252
  SVM_LENDERS: () => import_lender_registry2.SVM_LENDERS,
249
253
  TERM_PROFILES: () => TERM_PROFILES,
250
254
  WSOL_MINT: () => WSOL_MINT,
@@ -332,6 +336,7 @@ __export(index_exports, {
332
336
  decodeVestingSchedule: () => decodeVestingSchedule,
333
337
  decodeYieldPool: () => decodeYieldPool,
334
338
  denominationOf: () => denominationOf,
339
+ depositSolOut: () => depositSolOut,
335
340
  deriveLayerTotals: () => deriveLayerTotals,
336
341
  deriveLoopscalePrices: () => deriveLoopscalePrices,
337
342
  deriveP0Mode: () => deriveP0Mode,
@@ -492,6 +497,7 @@ __export(index_exports, {
492
497
  p0MultipointBaseRate: () => p0MultipointBaseRate,
493
498
  p0NeedsVenueMultiplier: () => p0NeedsVenueMultiplier,
494
499
  p0Rates: () => p0Rates,
500
+ p0RewardsOf: () => p0RewardsOf,
495
501
  p0StateSemantics: () => p0StateSemantics,
496
502
  p0SupplyCapTokens: () => p0SupplyCapTokens,
497
503
  p0Utilization: () => p0Utilization,
@@ -554,6 +560,7 @@ __export(index_exports, {
554
560
  seniorCooldownPdas: () => seniorCooldownPdas,
555
561
  settlementBatchPdas: () => settlementBatchPdas,
556
562
  solsticeOriginRow: () => solsticeOriginRow,
563
+ stakePoolDepositEntry: () => stakePoolDepositEntry,
557
564
  strategyMode: () => strategyMode,
558
565
  strategyNameOf: () => strategyNameOf,
559
566
  strategyPdas: () => strategyPdas,
@@ -8438,9 +8445,10 @@ var LENDING_MARKET = {
8438
8445
  };
8439
8446
  var key = (b, off) => (0, import_svm_kit.encodeBase58)(b.subarray(off, off + 32));
8440
8447
  var NULL_PUBKEY = "11111111111111111111111111111111";
8448
+ var NULL_SENTINEL = "nu11111111111111111111111111111111111111111";
8441
8449
  var optionalKey = (b, off, name) => {
8442
8450
  const k = key(b, off);
8443
- return k === NULL_PUBKEY ? {} : { [name]: k };
8451
+ return k === NULL_PUBKEY || k === NULL_SENTINEL ? {} : { [name]: k };
8444
8452
  };
8445
8453
  var u64 = (b, off) => new DataView(b.buffer, b.byteOffset).getBigUint64(off, true);
8446
8454
  var i64 = (b, off) => new DataView(b.buffer, b.byteOffset).getBigInt64(off, true);
@@ -20627,7 +20635,7 @@ function createP0Api(opts = {}) {
20627
20635
  return {
20628
20636
  banks: () => get("/banks/db"),
20629
20637
  banksMeta: () => get("/banks/meta"),
20630
- /** bank → `{ campaigns: [...] }`. */
20638
+ /** bank → `{ campaigns: [...] }` — the reward campaigns (`p0RewardsOf`). */
20631
20639
  emissions: () => get("/emissions"),
20632
20640
  luts: () => get("/luts")
20633
20641
  };
@@ -36080,8 +36088,17 @@ function p0CurveKnots(c) {
36080
36088
  // src/vaults/lst/stakePool.ts
36081
36089
  var import_svm_kit10 = require("@1delta/svm-kit");
36082
36090
  var SPL_STAKE_POOL_PROGRAM = "SPoo1Ku8WFXoNDMHPsrGSTSG1Y47rzgn41SLUNakuHy";
36091
+ var SANCTUM_SPL_STAKE_POOL_PROGRAM = "SP12tWFxD9oJsVWNavTTBZvMbA6gkAmxtVgxdqvyvhY";
36092
+ var SANCTUM_MULTI_STAKE_POOL_PROGRAM = "SPMBzsVUuoHA4Jm6KunbsotaahvVikZs1JyTW6iJvbn";
36093
+ var STAKE_POOL_PROGRAMS = [
36094
+ SPL_STAKE_POOL_PROGRAM,
36095
+ SANCTUM_SPL_STAKE_POOL_PROGRAM,
36096
+ SANCTUM_MULTI_STAKE_POOL_PROGRAM
36097
+ ];
36083
36098
  var OFFSET_RESERVE_STAKE = 130;
36084
36099
  var OFFSET_POOL_MINT = 162;
36100
+ var OFFSET_MANAGER_FEE_ACCOUNT = 194;
36101
+ var OFFSET_TOKEN_PROGRAM = 226;
36085
36102
  var OFFSET_TOTAL_LAMPORTS = 258;
36086
36103
  var OFFSET_POOL_TOKEN_SUPPLY = 266;
36087
36104
  var OFFSET_LAST_UPDATE_EPOCH = 274;
@@ -36111,6 +36128,12 @@ function decodeStakePool(data) {
36111
36128
  reserveStake: (0, import_svm_kit10.encodeBase58)(
36112
36129
  data.slice(OFFSET_RESERVE_STAKE, OFFSET_RESERVE_STAKE + 32)
36113
36130
  ),
36131
+ managerFeeAccount: (0, import_svm_kit10.encodeBase58)(
36132
+ data.slice(OFFSET_MANAGER_FEE_ACCOUNT, OFFSET_MANAGER_FEE_ACCOUNT + 32)
36133
+ ),
36134
+ tokenProgramId: (0, import_svm_kit10.encodeBase58)(
36135
+ data.slice(OFFSET_TOKEN_PROGRAM, OFFSET_TOKEN_PROGRAM + 32)
36136
+ ),
36114
36137
  totalLamports: u642(data, OFFSET_TOTAL_LAMPORTS),
36115
36138
  poolTokenSupply: u642(data, OFFSET_POOL_TOKEN_SUPPLY),
36116
36139
  lastUpdateEpoch: u642(data, OFFSET_LAST_UPDATE_EPOCH)
@@ -36129,13 +36152,15 @@ function decodeStakePool(data) {
36129
36152
  r.u8();
36130
36153
  const solDepositAuthority = readOptionPubkey(r);
36131
36154
  const solDeposit = readFee(r);
36132
- r.u8();
36133
- skipOptionPubkey(r);
36155
+ const solReferralFee = r.u8();
36156
+ const solWithdrawAuthority = readOptionPubkey(r);
36134
36157
  const solWithdrawal = readFee(r);
36135
36158
  skipFutureFee(r);
36136
36159
  out.lastEpochPoolTokenSupply = r.u64();
36137
36160
  out.lastEpochTotalLamports = r.u64();
36138
36161
  out.solDepositAuthority = solDepositAuthority;
36162
+ out.solReferralFee = solReferralFee;
36163
+ out.solWithdrawAuthority = solWithdrawAuthority;
36139
36164
  out.fees = {
36140
36165
  epoch,
36141
36166
  stakeDeposit,
@@ -36150,11 +36175,11 @@ function decodeStakePool(data) {
36150
36175
  var feeBps = (f) => f.denominator === 0n ? 0 : Number(f.numerator * 10000n / f.denominator);
36151
36176
  async function readStakePools(rpc, stakePools, opts = {}) {
36152
36177
  const { slot, accounts } = await rpc.readAccounts(stakePools, { encoding: "base64" });
36153
- const program = opts.programId ?? SPL_STAKE_POOL_PROGRAM;
36178
+ const programs = opts.programId ? [opts.programId] : STAKE_POOL_PROGRAMS;
36154
36179
  const pools = accounts.map((a) => {
36155
- if (!a || a.owner !== program) return null;
36180
+ if (!a || !programs.includes(a.owner)) return null;
36156
36181
  try {
36157
- return decodeStakePool((0, import_svm_kit10.fromBase64)(a.data[0]));
36182
+ return { ...decodeStakePool((0, import_svm_kit10.fromBase64)(a.data[0])), program: a.owner };
36158
36183
  } catch {
36159
36184
  return null;
36160
36185
  }
@@ -36598,6 +36623,26 @@ function p0EmodeRoster(banks, symbolOf = (b) => b.tokenSymbol ?? b.mint.slice(0,
36598
36623
  }
36599
36624
  return { tags, unrepresented };
36600
36625
  }
36626
+ function p0RewardsOf(bank, campaigns) {
36627
+ const by = /* @__PURE__ */ new Map();
36628
+ for (const c of campaigns ?? []) {
36629
+ if (c.bankAddresses?.length && !c.bankAddresses.includes(bank)) continue;
36630
+ const mint = c.rewardMints?.[0];
36631
+ const apr = Number(c.rate) * 100;
36632
+ if (!mint || !Number.isFinite(apr) || apr <= 0) continue;
36633
+ const side = c.rateBasis === "deposits" ? "supply" : c.rateBasis === "borrows" || c.rateBasis === "liabilities" ? "borrow" : null;
36634
+ if (!side) continue;
36635
+ const e = by.get(mint) ?? { supply: 0, borrow: 0 };
36636
+ e[side] += apr;
36637
+ by.set(mint, e);
36638
+ }
36639
+ return [...by].map(([asset, e]) => ({
36640
+ asset,
36641
+ depositRate: e.supply,
36642
+ variableBorrowRate: e.borrow,
36643
+ stableBorrowRate: 0
36644
+ }));
36645
+ }
36601
36646
  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;
36602
36647
  var p0NeedsVenueMultiplier = (b) => b.config.assetTag >= P0_ASSET_TAG.kamino;
36603
36648
  var p0BankRef = (b) => ({
@@ -36807,7 +36852,7 @@ function convertP0Bank(inp, ctx) {
36807
36852
  variableBorrowRate: wrapped ? 0 : rates.borrowAprPercent,
36808
36853
  stableBorrowRate: 0,
36809
36854
  intrinsicYield: inp.venue?.supplyAprPercent ?? 0,
36810
- rewards: [],
36855
+ rewards: p0RewardsOf(b.address, inp.campaigns),
36811
36856
  decimals,
36812
36857
  config,
36813
36858
  collateralActive,
@@ -36897,7 +36942,12 @@ function convertP0Group(inp) {
36897
36942
  continue;
36898
36943
  }
36899
36944
  const row = convertP0Bank(
36900
- { bank: b, price: inp.prices?.[b.address], venue },
36945
+ {
36946
+ bank: b,
36947
+ price: inp.prices?.[b.address],
36948
+ venue,
36949
+ campaigns: inp.emissions?.[b.address]?.campaigns
36950
+ },
36901
36951
  {
36902
36952
  lenderKey,
36903
36953
  group: g,
@@ -36951,6 +37001,12 @@ async function fetchProject0Public(opts = {}) {
36951
37001
  const source = opts.source ?? "chain";
36952
37002
  const roster = opts.roster ?? "scan";
36953
37003
  const rpc = source === "chain" || roster === "scan" || !opts.prices?.cacheOnly ? opts.rpc ?? (0, import_svm_kit13.createSvmRpc)() : opts.rpc;
37004
+ const emissionsP = opts.emissions === false ? Promise.resolve(void 0) : opts.emissions ? Promise.resolve(opts.emissions) : api.emissions().catch((e) => {
37005
+ console.warn(
37006
+ `[project0] /api/emissions failed, rows served without rewards: ${e?.message ?? e}`
37007
+ );
37008
+ return void 0;
37009
+ });
36954
37010
  const out = {};
36955
37011
  for (const group of groups) {
36956
37012
  let banks = [];
@@ -37029,7 +37085,8 @@ async function fetchProject0Public(opts = {}) {
37029
37085
  meta,
37030
37086
  tokenList: opts.tokenList,
37031
37087
  slot,
37032
- includeDead: opts.includeDead
37088
+ includeDead: opts.includeDead,
37089
+ emissions: await emissionsP
37033
37090
  });
37034
37091
  if (!Object.keys(conv.data).length) {
37035
37092
  console.warn(`[project0] group ${group}: no banks served`);
@@ -37541,6 +37598,8 @@ async function fetchJupiterPrices(mints, tokenList = {}, opts = {}) {
37541
37598
  for (const [mint, r] of Object.entries(res ?? {})) {
37542
37599
  const p = num(r?.usdPrice);
37543
37600
  if (!(p > 0)) continue;
37601
+ if (opts.minLiquidityUsd !== void 0 && !(num(r?.liquidity) >= opts.minLiquidityUsd))
37602
+ continue;
37544
37603
  byMint[mint] = p;
37545
37604
  const stock = num(r?.stockData?.price);
37546
37605
  if (stock > 0) stockPriceByMint[mint] = stock;
@@ -65330,6 +65389,7 @@ async function readHumaChainState(rpc, pool = HUMA_POOL) {
65330
65389
  mint: HUMA_PST_MINT,
65331
65390
  assets: state.mode_states[classicIdx]?.assets ?? 0n,
65332
65391
  cumulativeYields: state.mode_states[classicIdx]?.cumulative_yields ?? 0n,
65392
+ assetsRefreshedAt: state.mode_states[classicIdx]?.assets_refreshed_at ?? 0n,
65333
65393
  supply: mintSupply2(mintData),
65334
65394
  liquidAssetsDeployed: state.liquid_assets_deployed,
65335
65395
  poolCash,
@@ -65976,6 +66036,84 @@ async function fetchLstVaults(opts = {}) {
65976
66036
  });
65977
66037
  }
65978
66038
 
66039
+ // src/vaults/lst/depositSol.ts
66040
+ var STAKE_POOL_DEPOSIT_ROSTER = [
66041
+ {
66042
+ symbol: "JitoSOL",
66043
+ mint: "J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn",
66044
+ stakePool: "Jito4APyf642JPZPx3hGc6WWJ8zPKtRbRs4P815Awbb",
66045
+ program: SPL_STAKE_POOL_PROGRAM,
66046
+ lookupTable: "9v1qSjEzDQ6J4RxzGRXVVyD1CeDTwv4vdDYADsRB7sjY"
66047
+ },
66048
+ {
66049
+ symbol: "bSOL",
66050
+ mint: "bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1",
66051
+ stakePool: "stk9ApL5HeVAwPLr3TLhDXdZS8ptVu7zp6ov8HFDuMi",
66052
+ program: SPL_STAKE_POOL_PROGRAM,
66053
+ lookupTable: "2QRB1SxadngWnqKkEYcSzwPZQnmBgqu5LDD8xdmaNZZD"
66054
+ },
66055
+ {
66056
+ symbol: "vSOL",
66057
+ mint: "vSoLxydx6akxyMD9XEcPvGYNGq6Nn66oqVb3UkGkei7",
66058
+ stakePool: "Fu9BYC6tWBo1KMKaP3CFoKfRhqv9akmy3DuYwnCyWiyC",
66059
+ program: SPL_STAKE_POOL_PROGRAM,
66060
+ lookupTable: "9nXBzkk2dPk41DXWgYjNmDkz65HWKpzJCUQKXVhFTUnE"
66061
+ },
66062
+ {
66063
+ symbol: "BNSOL",
66064
+ mint: "BNso1VUJnh4zcfpZa6986Ea66P6TCp59hvtNJ8b1X85",
66065
+ stakePool: "Hr9pzexrBge3vgmBNRR8u42CNQgBXdHm4UkUN2DH4a7r",
66066
+ program: SPL_STAKE_POOL_PROGRAM,
66067
+ lookupTable: "GZjbDvfUhpqAjatr1JPLLxFbHqwxaQSpMw5UsoUa4DbU"
66068
+ },
66069
+ {
66070
+ symbol: "JupSOL",
66071
+ mint: "jupSoLaHXQiZZTSfEWMTRRgpnyFm8f6sZdosWBjx93v",
66072
+ stakePool: "8VpRhuxa7sUUepdY3kQiTmX9rS5vx4WgaXiAnXq4KCtr",
66073
+ program: SANCTUM_MULTI_STAKE_POOL_PROGRAM,
66074
+ lookupTable: "7A1unBgYZLqPx642iuRZoum4yBebq5i4mxsVeq6oTSWQ"
66075
+ },
66076
+ {
66077
+ symbol: "dSOL",
66078
+ mint: "Dso1bDeDjCQxTrWHqUUi63oBvV7Mdm6WaobLbQ7gnPQ",
66079
+ stakePool: "9mhGNSPArRMHpLDMSmxAvuoizBqtBGqYdT8WGuqgxNdn",
66080
+ program: SANCTUM_SPL_STAKE_POOL_PROGRAM,
66081
+ lookupTable: "GV4LPz2QM9Yksb6uZPcAM1pSDBkcky9Hw4fyAkMsSWWP"
66082
+ },
66083
+ {
66084
+ symbol: "hSOL",
66085
+ mint: "he1iusmfkpAdwvxLNGV8Y1iSbj4rUy6yMhEA3fotn9A",
66086
+ stakePool: "3wK2g8ZdzAH8FJ7PKr2RcvGh7V9VYson5hrVsJM5Lmws",
66087
+ program: SANCTUM_SPL_STAKE_POOL_PROGRAM,
66088
+ lookupTable: "54tcUC2CFF1SfH9tnZDic5eSZoSpm4iNtDxvPyBKRgwa"
66089
+ },
66090
+ {
66091
+ symbol: "bbSOL",
66092
+ mint: "Bybit2vBJGhPF52GBdNaQfUJ6ZpThSgHBobjWZpLPb4B",
66093
+ stakePool: "2aMLkB5p5gVvCwKkdSo5eZAL1WwhZbxezQr1wxiynRhq",
66094
+ program: SANCTUM_SPL_STAKE_POOL_PROGRAM,
66095
+ lookupTable: "98N4QqCpkjpXZ1acsKvBx4p7B5sLQQYpfJ4MaDkU1iHf"
66096
+ }
66097
+ ];
66098
+ var stakePoolDepositEntry = (mint) => STAKE_POOL_DEPOSIT_ROSTER.find((e) => e.mint === mint);
66099
+ function depositSolOut(pool, lamports, opts = {}) {
66100
+ if (!pool.fees || pool.solReferralFee === void 0)
66101
+ return { refused: "no-tail" };
66102
+ if (pool.solDepositAuthority) return { refused: "permissioned" };
66103
+ if (opts.currentEpoch !== void 0 && pool.lastUpdateEpoch < opts.currentEpoch)
66104
+ return { refused: "stale" };
66105
+ const minted = pool.totalLamports === 0n || pool.poolTokenSupply === 0n ? lamports : lamports * pool.poolTokenSupply / pool.totalLamports;
66106
+ const { numerator, denominator } = pool.fees.solDeposit;
66107
+ const fee = denominator === 0n ? 0n : minted * numerator / denominator;
66108
+ const referral = fee * BigInt(pool.solReferralFee) / 100n;
66109
+ const out = minted - fee + (opts.referrerIsDepositor !== false ? referral : 0n);
66110
+ if (minted - fee <= 0n) return { refused: "too-small" };
66111
+ return {
66112
+ out,
66113
+ feeBps: minted === 0n ? 0 : Number(minted - out) * 1e4 / Number(minted)
66114
+ };
66115
+ }
66116
+
65979
66117
  // src/vaults/origin.ts
65980
66118
  function common4626(r, provider, redemptionType) {
65981
66119
  const priced = r.priceUsd !== void 0 && Number.isFinite(r.priceUsd);
@@ -69459,6 +69597,8 @@ function project0TermAdapter(row, group) {
69459
69597
  PROJECT_0_PROFILE_ID,
69460
69598
  PYTH_PRICE_UPDATE_V2_DISCRIMINATOR,
69461
69599
  PYTH_RECEIVER_PROGRAM,
69600
+ SANCTUM_MULTI_STAKE_POOL_PROGRAM,
69601
+ SANCTUM_SPL_STAKE_POOL_PROGRAM,
69462
69602
  SAVE_API_BASE,
69463
69603
  SAVE_CREATOR,
69464
69604
  SAVE_DEFAULT_AVG_SLOT_SECONDS,
@@ -69500,6 +69640,8 @@ function project0TermAdapter(row, group) {
69500
69640
  SPL_STAKE_POOL_PROGRAM,
69501
69641
  STABLECOIN_SYMBOLS,
69502
69642
  STAKE_ACCOUNT_RENT_EXEMPT_LAMPORTS,
69643
+ STAKE_POOL_DEPOSIT_ROSTER,
69644
+ STAKE_POOL_PROGRAMS,
69503
69645
  SVM_LENDERS,
69504
69646
  TERM_PROFILES,
69505
69647
  WSOL_MINT,
@@ -69587,6 +69729,7 @@ function project0TermAdapter(row, group) {
69587
69729
  decodeVestingSchedule,
69588
69730
  decodeYieldPool,
69589
69731
  denominationOf,
69732
+ depositSolOut,
69590
69733
  deriveLayerTotals,
69591
69734
  deriveLoopscalePrices,
69592
69735
  deriveP0Mode,
@@ -69747,6 +69890,7 @@ function project0TermAdapter(row, group) {
69747
69890
  p0MultipointBaseRate,
69748
69891
  p0NeedsVenueMultiplier,
69749
69892
  p0Rates,
69893
+ p0RewardsOf,
69750
69894
  p0StateSemantics,
69751
69895
  p0SupplyCapTokens,
69752
69896
  p0Utilization,
@@ -69809,6 +69953,7 @@ function project0TermAdapter(row, group) {
69809
69953
  seniorCooldownPdas,
69810
69954
  settlementBatchPdas,
69811
69955
  solsticeOriginRow,
69956
+ stakePoolDepositEntry,
69812
69957
  strategyMode,
69813
69958
  strategyNameOf,
69814
69959
  strategyPdas,