@elemental-stv-core/sdk 0.2.0 → 0.4.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.
- package/dist/elemental-lend/index.d.ts +2 -0
- package/dist/elemental-lend/index.d.ts.map +1 -1
- package/dist/elemental-lend/index.js +2 -0
- package/dist/elemental-lend/index.js.map +1 -1
- package/dist/elemental-lend/jupiter-lend.d.ts +4 -0
- package/dist/elemental-lend/jupiter-lend.d.ts.map +1 -1
- package/dist/elemental-lend/jupiter-lend.js +34 -4
- package/dist/elemental-lend/jupiter-lend.js.map +1 -1
- package/dist/elemental-lend/kamino-vault.d.ts +173 -0
- package/dist/elemental-lend/kamino-vault.d.ts.map +1 -0
- package/dist/elemental-lend/kamino-vault.js +460 -0
- package/dist/elemental-lend/kamino-vault.js.map +1 -0
- package/dist/elemental-lend/protocol-actions.d.ts +49 -0
- package/dist/elemental-lend/protocol-actions.d.ts.map +1 -0
- package/dist/elemental-lend/protocol-actions.js +228 -0
- package/dist/elemental-lend/protocol-actions.js.map +1 -0
- package/dist/jlpd-strategy/constants.d.ts +16 -0
- package/dist/jlpd-strategy/constants.d.ts.map +1 -1
- package/dist/jlpd-strategy/constants.js +28 -3
- package/dist/jlpd-strategy/constants.js.map +1 -1
- package/dist/jlpd-strategy/index.d.ts +3 -0
- package/dist/jlpd-strategy/index.d.ts.map +1 -1
- package/dist/jlpd-strategy/index.js +3 -0
- package/dist/jlpd-strategy/index.js.map +1 -1
- package/dist/jlpd-strategy/jlp-data.d.ts +73 -0
- package/dist/jlpd-strategy/jlp-data.d.ts.map +1 -0
- package/dist/jlpd-strategy/jlp-data.js +406 -0
- package/dist/jlpd-strategy/jlp-data.js.map +1 -0
- package/dist/jlpd-strategy/settle-yield.d.ts +54 -0
- package/dist/jlpd-strategy/settle-yield.d.ts.map +1 -0
- package/dist/jlpd-strategy/settle-yield.js +103 -0
- package/dist/jlpd-strategy/settle-yield.js.map +1 -0
- package/dist/jlpd-strategy/swap-jlp.d.ts +153 -0
- package/dist/jlpd-strategy/swap-jlp.d.ts.map +1 -0
- package/dist/jlpd-strategy/swap-jlp.js +465 -0
- package/dist/jlpd-strategy/swap-jlp.js.map +1 -0
- package/dist/p-stv-core/accounts.d.ts.map +1 -1
- package/dist/p-stv-core/accounts.js +14 -10
- package/dist/p-stv-core/accounts.js.map +1 -1
- package/dist/p-stv-core/constants.d.ts +3 -1
- package/dist/p-stv-core/constants.d.ts.map +1 -1
- package/dist/p-stv-core/constants.js +5 -3
- package/dist/p-stv-core/constants.js.map +1 -1
- package/dist/p-stv-core/index.d.ts +4 -0
- package/dist/p-stv-core/index.d.ts.map +1 -1
- package/dist/p-stv-core/index.js +4 -0
- package/dist/p-stv-core/index.js.map +1 -1
- package/dist/p-stv-core/instructions.d.ts +26 -0
- package/dist/p-stv-core/instructions.d.ts.map +1 -1
- package/dist/p-stv-core/instructions.js +37 -6
- package/dist/p-stv-core/instructions.js.map +1 -1
- package/dist/p-stv-core/prices.d.ts +21 -0
- package/dist/p-stv-core/prices.d.ts.map +1 -0
- package/dist/p-stv-core/prices.js +78 -0
- package/dist/p-stv-core/prices.js.map +1 -0
- package/dist/p-stv-core/remaining-accounts.d.ts +99 -0
- package/dist/p-stv-core/remaining-accounts.d.ts.map +1 -0
- package/dist/p-stv-core/remaining-accounts.js +262 -0
- package/dist/p-stv-core/remaining-accounts.js.map +1 -0
- package/dist/p-stv-core/send-tx.d.ts +56 -0
- package/dist/p-stv-core/send-tx.d.ts.map +1 -0
- package/dist/p-stv-core/send-tx.js +299 -0
- package/dist/p-stv-core/send-tx.js.map +1 -0
- package/dist/p-stv-core/sol-wrap.d.ts +35 -0
- package/dist/p-stv-core/sol-wrap.d.ts.map +1 -0
- package/dist/p-stv-core/sol-wrap.js +95 -0
- package/dist/p-stv-core/sol-wrap.js.map +1 -0
- package/dist/p-stv-core/types.d.ts +16 -1
- package/dist/p-stv-core/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,460 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Kamino kVault account builders for deposit/withdraw.
|
|
4
|
+
*
|
|
5
|
+
* Builds the remaining_accounts arrays needed by elemental-lend's
|
|
6
|
+
* kvault_deposit and kvault_withdraw instructions.
|
|
7
|
+
*
|
|
8
|
+
* For deposit: 11 fixed accounts derived from vault_state PDAs.
|
|
9
|
+
* For withdraw: 21 fixed accounts — first 12 derivable, then 9 KLend-specific
|
|
10
|
+
* accounts read from vault_state and reserve on-chain data.
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.KVAULT_STALENESS_THRESHOLD = exports.KAMINO_GLOBAL_CONFIG = exports.KLEND_PROGRAM = void 0;
|
|
14
|
+
exports.findKvaultTokenVault = findKvaultTokenVault;
|
|
15
|
+
exports.findKvaultAuthority = findKvaultAuthority;
|
|
16
|
+
exports.findKvaultSharesMint = findKvaultSharesMint;
|
|
17
|
+
exports.findKvaultEventAuthority = findKvaultEventAuthority;
|
|
18
|
+
exports.findLendingMarketAuthority = findLendingMarketAuthority;
|
|
19
|
+
exports.readVaultAllocation = readVaultAllocation;
|
|
20
|
+
exports.readReserveAccounts = readReserveAccounts;
|
|
21
|
+
exports.buildKvaultDepositAccounts = buildKvaultDepositAccounts;
|
|
22
|
+
exports.buildKvaultWithdrawReserveConfig = buildKvaultWithdrawReserveConfig;
|
|
23
|
+
exports.buildKvaultWithdrawAccounts = buildKvaultWithdrawAccounts;
|
|
24
|
+
exports.readKvaultLastFeeChargeTs = readKvaultLastFeeChargeTs;
|
|
25
|
+
exports.isKvaultStale = isKvaultStale;
|
|
26
|
+
exports.findStaleKvaults = findStaleKvaults;
|
|
27
|
+
exports.buildKaminoInvestIx = buildKaminoInvestIx;
|
|
28
|
+
exports.buildKaminoInvestIxsIfStale = buildKaminoInvestIxsIfStale;
|
|
29
|
+
const web3_js_1 = require("@solana/web3.js");
|
|
30
|
+
const constants_1 = require("./constants");
|
|
31
|
+
// ---------------------------------------------------------------------------
|
|
32
|
+
// Constants
|
|
33
|
+
// ---------------------------------------------------------------------------
|
|
34
|
+
/** KLend program ID */
|
|
35
|
+
exports.KLEND_PROGRAM = new web3_js_1.PublicKey("KLend2g3cP87fffoy8q1mQqGKjrxjC8boSyAYavgmjD");
|
|
36
|
+
/** Kamino Vault global config (singleton, mainnet) */
|
|
37
|
+
exports.KAMINO_GLOBAL_CONFIG = new web3_js_1.PublicKey("BKyTcUe6daNG8HbgBix2ugdRHbykG2dK9hPBBqhUyoEX");
|
|
38
|
+
/** SPL Token program */
|
|
39
|
+
const SPL_TOKEN_PROGRAM = new web3_js_1.PublicKey("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA");
|
|
40
|
+
/** Sysvar Instructions */
|
|
41
|
+
const SYSVAR_INSTRUCTIONS = new web3_js_1.PublicKey("Sysvar1nstructions1111111111111111111111111");
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
// PDA Derivation Helpers
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
/** Derive token_vault PDA: ["token_vault", vault_state] under Kamino Vault */
|
|
46
|
+
function findKvaultTokenVault(vaultState) {
|
|
47
|
+
return web3_js_1.PublicKey.findProgramAddressSync([Buffer.from("token_vault"), vaultState.toBuffer()], constants_1.KAMINO_VAULT_PROGRAM);
|
|
48
|
+
}
|
|
49
|
+
/** Derive base_vault_authority PDA: ["authority", vault_state] under Kamino Vault */
|
|
50
|
+
function findKvaultAuthority(vaultState) {
|
|
51
|
+
return web3_js_1.PublicKey.findProgramAddressSync([Buffer.from("authority"), vaultState.toBuffer()], constants_1.KAMINO_VAULT_PROGRAM);
|
|
52
|
+
}
|
|
53
|
+
/** Derive shares_mint PDA: ["shares", vault_state] under Kamino Vault */
|
|
54
|
+
function findKvaultSharesMint(vaultState) {
|
|
55
|
+
return web3_js_1.PublicKey.findProgramAddressSync([Buffer.from("shares"), vaultState.toBuffer()], constants_1.KAMINO_VAULT_PROGRAM);
|
|
56
|
+
}
|
|
57
|
+
/** Derive event_authority PDA: ["__event_authority"] under Kamino Vault */
|
|
58
|
+
function findKvaultEventAuthority() {
|
|
59
|
+
return web3_js_1.PublicKey.findProgramAddressSync([Buffer.from("__event_authority")], constants_1.KAMINO_VAULT_PROGRAM);
|
|
60
|
+
}
|
|
61
|
+
/** Derive lending_market_authority PDA: ["lma", lending_market] under KLend */
|
|
62
|
+
function findLendingMarketAuthority(lendingMarket) {
|
|
63
|
+
return web3_js_1.PublicKey.findProgramAddressSync([Buffer.from("lma"), lendingMarket.toBuffer()], exports.KLEND_PROGRAM);
|
|
64
|
+
}
|
|
65
|
+
// ---------------------------------------------------------------------------
|
|
66
|
+
// VaultState / Reserve Data Readers
|
|
67
|
+
// ---------------------------------------------------------------------------
|
|
68
|
+
/**
|
|
69
|
+
* Kamino VaultState layout offsets (from account data start, including 8-byte discriminator).
|
|
70
|
+
*
|
|
71
|
+
* VaultAllocation[0] starts at offset 312:
|
|
72
|
+
* [312..344] reserve (Pubkey)
|
|
73
|
+
* [344..376] ctokenVault (Pubkey)
|
|
74
|
+
* Each VaultAllocation is 2160 bytes. Index N starts at 312 + N*2160.
|
|
75
|
+
*/
|
|
76
|
+
const VAULT_ALLOCATION_OFFSET = 312; // 8 disc + 304 struct offset
|
|
77
|
+
const VAULT_ALLOCATION_SIZE = 2160;
|
|
78
|
+
/**
|
|
79
|
+
* KLend Reserve layout offsets (from account data start, including 8-byte discriminator).
|
|
80
|
+
* [32..64] lendingMarket (Pubkey)
|
|
81
|
+
* [160..192] liquidity.supplyVault (Pubkey)
|
|
82
|
+
* [408..440] liquidity.tokenProgram (Pubkey)
|
|
83
|
+
* [2560..2592] collateral.mintPubkey (Pubkey)
|
|
84
|
+
*/
|
|
85
|
+
const RESERVE_LENDING_MARKET_OFFSET = 32;
|
|
86
|
+
const RESERVE_LIQUIDITY_SUPPLY_OFFSET = 160;
|
|
87
|
+
const RESERVE_LIQUIDITY_TOKEN_PROGRAM_OFFSET = 408;
|
|
88
|
+
const RESERVE_COLLATERAL_MINT_OFFSET = 2560;
|
|
89
|
+
/** Read a Pubkey from a Buffer at a given offset */
|
|
90
|
+
function readPubkey(data, offset) {
|
|
91
|
+
return new web3_js_1.PublicKey(data.slice(offset, offset + 32));
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Read the first VaultAllocation's reserve and ctokenVault from VaultState data.
|
|
95
|
+
*
|
|
96
|
+
* @param vaultStateData - Raw account data (including 8-byte discriminator)
|
|
97
|
+
* @param allocationIndex - Which allocation slot to read (default 0)
|
|
98
|
+
*/
|
|
99
|
+
function readVaultAllocation(vaultStateData, allocationIndex = 0) {
|
|
100
|
+
const base = VAULT_ALLOCATION_OFFSET + allocationIndex * VAULT_ALLOCATION_SIZE;
|
|
101
|
+
if (vaultStateData.length < base + 64) {
|
|
102
|
+
throw new Error(`VaultState data too short for allocation ${allocationIndex}: need ${base + 64}, got ${vaultStateData.length}`);
|
|
103
|
+
}
|
|
104
|
+
return {
|
|
105
|
+
reserve: readPubkey(vaultStateData, base),
|
|
106
|
+
ctokenVault: readPubkey(vaultStateData, base + 32),
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Read KLend-specific accounts from a Reserve account's raw data.
|
|
111
|
+
*
|
|
112
|
+
* @param reserveData - Raw KLend Reserve account data (including 8-byte discriminator)
|
|
113
|
+
*/
|
|
114
|
+
function readReserveAccounts(reserveData) {
|
|
115
|
+
if (reserveData.length < RESERVE_COLLATERAL_MINT_OFFSET + 32) {
|
|
116
|
+
throw new Error(`Reserve data too short: need ${RESERVE_COLLATERAL_MINT_OFFSET + 32}, got ${reserveData.length}`);
|
|
117
|
+
}
|
|
118
|
+
return {
|
|
119
|
+
lendingMarket: readPubkey(reserveData, RESERVE_LENDING_MARKET_OFFSET),
|
|
120
|
+
reserveLiquiditySupply: readPubkey(reserveData, RESERVE_LIQUIDITY_SUPPLY_OFFSET),
|
|
121
|
+
reserveCollateralMint: readPubkey(reserveData, RESERVE_COLLATERAL_MINT_OFFSET),
|
|
122
|
+
reserveCollateralTokenProgram: readPubkey(reserveData, RESERVE_LIQUIDITY_TOKEN_PROGRAM_OFFSET),
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
// ---------------------------------------------------------------------------
|
|
126
|
+
// Deposit Account Builder (11 fixed accounts)
|
|
127
|
+
// ---------------------------------------------------------------------------
|
|
128
|
+
/**
|
|
129
|
+
* Build the 11 remaining_accounts for elemental-lend's kvault_deposit instruction.
|
|
130
|
+
*
|
|
131
|
+
* Account order matches kamino_vault::deposit_accounts:
|
|
132
|
+
* 0. strategy_state PDA (signer, mut)
|
|
133
|
+
* 1. vault_state (mut)
|
|
134
|
+
* 2. token_vault (mut) — PDA ["token_vault", vault_state]
|
|
135
|
+
* 3. token_mint — base token mint
|
|
136
|
+
* 4. base_vault_authority — PDA ["authority", vault_state]
|
|
137
|
+
* 5. shares_mint (mut) — PDA ["shares", vault_state]
|
|
138
|
+
* 6. user_token_ata (mut) — strategy's base ATA
|
|
139
|
+
* 7. user_shares_ata (mut) — strategy's kvToken ATA
|
|
140
|
+
* 8. klend_program
|
|
141
|
+
* 9. token_program — SPL Token
|
|
142
|
+
* 10. shares_token_program — SPL Token
|
|
143
|
+
*
|
|
144
|
+
* After the 11 fixed accounts, callers should append reserve accounts for refresh.
|
|
145
|
+
*/
|
|
146
|
+
function buildKvaultDepositAccounts(vaultState, strategyStatePda, strategyBaseAta, strategySharesAta, baseMint, reserves = []) {
|
|
147
|
+
const [tokenVault] = findKvaultTokenVault(vaultState);
|
|
148
|
+
const [authority] = findKvaultAuthority(vaultState);
|
|
149
|
+
const [sharesMint] = findKvaultSharesMint(vaultState);
|
|
150
|
+
const [eventAuthority] = findKvaultEventAuthority();
|
|
151
|
+
const accounts = [
|
|
152
|
+
{ pubkey: strategyStatePda, isSigner: true, isWritable: true }, // 0
|
|
153
|
+
{ pubkey: vaultState, isSigner: false, isWritable: true }, // 1
|
|
154
|
+
{ pubkey: tokenVault, isSigner: false, isWritable: true }, // 2
|
|
155
|
+
{ pubkey: baseMint, isSigner: false, isWritable: false }, // 3
|
|
156
|
+
{ pubkey: authority, isSigner: false, isWritable: false }, // 4
|
|
157
|
+
{ pubkey: sharesMint, isSigner: false, isWritable: true }, // 5
|
|
158
|
+
{ pubkey: strategyBaseAta, isSigner: false, isWritable: true }, // 6
|
|
159
|
+
{ pubkey: strategySharesAta, isSigner: false, isWritable: true }, // 7
|
|
160
|
+
{ pubkey: exports.KLEND_PROGRAM, isSigner: false, isWritable: false }, // 8
|
|
161
|
+
{ pubkey: SPL_TOKEN_PROGRAM, isSigner: false, isWritable: false }, // 9
|
|
162
|
+
{ pubkey: SPL_TOKEN_PROGRAM, isSigner: false, isWritable: false }, // 10
|
|
163
|
+
{ pubkey: eventAuthority, isSigner: false, isWritable: false }, // 11 (Anchor event CPI)
|
|
164
|
+
{ pubkey: constants_1.KAMINO_VAULT_PROGRAM, isSigner: false, isWritable: false }, // 12 (program self-ref)
|
|
165
|
+
];
|
|
166
|
+
// Append reserve accounts for KLend batch refresh (writable), then unique lending markets (readonly).
|
|
167
|
+
// Kamino's cpi_refresh_reserves uses .take(reserves_count) to get just the reserves,
|
|
168
|
+
// then reads lending_market from each reserve's data for the CPI. The lending_market
|
|
169
|
+
// AccountInfo must be in the transaction but after the reserves.
|
|
170
|
+
const seenMarkets = new Set();
|
|
171
|
+
for (const { reserve } of reserves) {
|
|
172
|
+
accounts.push({ pubkey: reserve, isSigner: false, isWritable: true });
|
|
173
|
+
}
|
|
174
|
+
for (const { lendingMarket } of reserves) {
|
|
175
|
+
const key = lendingMarket.toBase58();
|
|
176
|
+
if (!seenMarkets.has(key)) {
|
|
177
|
+
seenMarkets.add(key);
|
|
178
|
+
accounts.push({ pubkey: lendingMarket, isSigner: false, isWritable: false });
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return accounts;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Build the KvaultWithdrawReserveConfig from raw on-chain data.
|
|
185
|
+
*
|
|
186
|
+
* @param vaultStateData - Raw Kamino VaultState account data
|
|
187
|
+
* @param reserveData - Raw KLend Reserve account data
|
|
188
|
+
* @param allocationIndex - VaultAllocation index (default 0)
|
|
189
|
+
*/
|
|
190
|
+
function buildKvaultWithdrawReserveConfig(vaultStateData, reserveData, allocationIndex = 0) {
|
|
191
|
+
const alloc = readVaultAllocation(vaultStateData, allocationIndex);
|
|
192
|
+
const res = readReserveAccounts(reserveData);
|
|
193
|
+
const [lendingMarketAuthority] = findLendingMarketAuthority(res.lendingMarket);
|
|
194
|
+
return {
|
|
195
|
+
reserve: alloc.reserve,
|
|
196
|
+
ctokenVault: alloc.ctokenVault,
|
|
197
|
+
lendingMarket: res.lendingMarket,
|
|
198
|
+
lendingMarketAuthority,
|
|
199
|
+
reserveLiquiditySupply: res.reserveLiquiditySupply,
|
|
200
|
+
reserveCollateralMint: res.reserveCollateralMint,
|
|
201
|
+
reserveCollateralTokenProgram: res.reserveCollateralTokenProgram,
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Build the 21 remaining_accounts for elemental-lend's kvault_withdraw instruction.
|
|
206
|
+
*
|
|
207
|
+
* Account order matches kamino_vault::withdraw_accounts:
|
|
208
|
+
* WithdrawFromAvailable (0-11):
|
|
209
|
+
* 0. strategy_state PDA (signer, mut)
|
|
210
|
+
* 1. vault_state (mut)
|
|
211
|
+
* 2. global_config
|
|
212
|
+
* 3. token_vault (mut)
|
|
213
|
+
* 4. base_vault_authority
|
|
214
|
+
* 5. user_token_ata (mut) — strategy's base ATA
|
|
215
|
+
* 6. token_mint (mut)
|
|
216
|
+
* 7. user_shares_ata (mut) — strategy's kvToken ATA
|
|
217
|
+
* 8. shares_mint (mut)
|
|
218
|
+
* 9. token_program
|
|
219
|
+
* 10. shares_token_program
|
|
220
|
+
* 11. klend_program
|
|
221
|
+
* WithdrawFromInvested (12-20):
|
|
222
|
+
* 12. vault_state (mut, dup)
|
|
223
|
+
* 13. reserve (mut)
|
|
224
|
+
* 14. ctoken_vault (mut)
|
|
225
|
+
* 15. lending_market
|
|
226
|
+
* 16. lending_market_authority
|
|
227
|
+
* 17. reserve_liquidity_supply (mut)
|
|
228
|
+
* 18. reserve_collateral_mint (mut)
|
|
229
|
+
* 19. reserve_collateral_token_program
|
|
230
|
+
* 20. instruction_sysvar_account
|
|
231
|
+
*
|
|
232
|
+
* After the 21 fixed accounts, callers should append reserve accounts for refresh.
|
|
233
|
+
*/
|
|
234
|
+
function buildKvaultWithdrawAccounts(vaultState, strategyStatePda, strategyBaseAta, strategySharesAta, baseMint, reserveConfig, globalConfig = exports.KAMINO_GLOBAL_CONFIG) {
|
|
235
|
+
const [tokenVault] = findKvaultTokenVault(vaultState);
|
|
236
|
+
const [authority] = findKvaultAuthority(vaultState);
|
|
237
|
+
const [sharesMint] = findKvaultSharesMint(vaultState);
|
|
238
|
+
const [eventAuthority] = findKvaultEventAuthority();
|
|
239
|
+
return [
|
|
240
|
+
// WithdrawFromAvailable (0-11)
|
|
241
|
+
{ pubkey: strategyStatePda, isSigner: true, isWritable: true }, // 0
|
|
242
|
+
{ pubkey: vaultState, isSigner: false, isWritable: true }, // 1
|
|
243
|
+
{ pubkey: globalConfig, isSigner: false, isWritable: false }, // 2
|
|
244
|
+
{ pubkey: tokenVault, isSigner: false, isWritable: true }, // 3
|
|
245
|
+
{ pubkey: authority, isSigner: false, isWritable: false }, // 4
|
|
246
|
+
{ pubkey: strategyBaseAta, isSigner: false, isWritable: true }, // 5
|
|
247
|
+
{ pubkey: baseMint, isSigner: false, isWritable: true }, // 6
|
|
248
|
+
{ pubkey: strategySharesAta, isSigner: false, isWritable: true }, // 7
|
|
249
|
+
{ pubkey: sharesMint, isSigner: false, isWritable: true }, // 8
|
|
250
|
+
{ pubkey: SPL_TOKEN_PROGRAM, isSigner: false, isWritable: false }, // 9
|
|
251
|
+
{ pubkey: SPL_TOKEN_PROGRAM, isSigner: false, isWritable: false }, // 10
|
|
252
|
+
{ pubkey: exports.KLEND_PROGRAM, isSigner: false, isWritable: false }, // 11
|
|
253
|
+
// WithdrawFromAvailable event CPI (12-13)
|
|
254
|
+
{ pubkey: eventAuthority, isSigner: false, isWritable: false }, // 12
|
|
255
|
+
{ pubkey: constants_1.KAMINO_VAULT_PROGRAM, isSigner: false, isWritable: false }, // 13
|
|
256
|
+
// WithdrawFromInvested (14-22)
|
|
257
|
+
{ pubkey: vaultState, isSigner: false, isWritable: true }, // 14 (dup)
|
|
258
|
+
{ pubkey: reserveConfig.reserve, isSigner: false, isWritable: true }, // 15
|
|
259
|
+
{ pubkey: reserveConfig.ctokenVault, isSigner: false, isWritable: true }, // 16
|
|
260
|
+
{ pubkey: reserveConfig.lendingMarket, isSigner: false, isWritable: false }, // 17
|
|
261
|
+
{ pubkey: reserveConfig.lendingMarketAuthority, isSigner: false, isWritable: false }, // 18
|
|
262
|
+
{ pubkey: reserveConfig.reserveLiquiditySupply, isSigner: false, isWritable: true }, // 19
|
|
263
|
+
{ pubkey: reserveConfig.reserveCollateralMint, isSigner: false, isWritable: true }, // 20
|
|
264
|
+
{ pubkey: reserveConfig.reserveCollateralTokenProgram, isSigner: false, isWritable: false }, // 21
|
|
265
|
+
{ pubkey: SYSVAR_INSTRUCTIONS, isSigner: false, isWritable: false }, // 22
|
|
266
|
+
// Withdraw event CPI (23-24)
|
|
267
|
+
{ pubkey: eventAuthority, isSigner: false, isWritable: false }, // 23
|
|
268
|
+
{ pubkey: constants_1.KAMINO_VAULT_PROGRAM, isSigner: false, isWritable: false }, // 24
|
|
269
|
+
];
|
|
270
|
+
}
|
|
271
|
+
// ---------------------------------------------------------------------------
|
|
272
|
+
// Kamino kVault Staleness Check
|
|
273
|
+
// ---------------------------------------------------------------------------
|
|
274
|
+
/** Offset of `last_fee_charge_timestamp` (u64) in Kamino VaultState account data */
|
|
275
|
+
const KVAULT_LAST_FEE_CHARGE_TS_OFFSET = 272; // 8 disc + 264
|
|
276
|
+
/** Minimum data length to read `last_fee_charge_timestamp` */
|
|
277
|
+
const KVAULT_MIN_READ_SIZE = KVAULT_LAST_FEE_CHARGE_TS_OFFSET + 8;
|
|
278
|
+
/** Staleness threshold in seconds (matches elemental-lend KVAULT_STALENESS_THRESHOLD) */
|
|
279
|
+
exports.KVAULT_STALENESS_THRESHOLD = 120;
|
|
280
|
+
/**
|
|
281
|
+
* Read `last_fee_charge_timestamp` from raw Kamino VaultState account data.
|
|
282
|
+
* Returns undefined if data is too short.
|
|
283
|
+
*/
|
|
284
|
+
function readKvaultLastFeeChargeTs(data) {
|
|
285
|
+
if (data.length < KVAULT_MIN_READ_SIZE)
|
|
286
|
+
return undefined;
|
|
287
|
+
const buf = Buffer.from(data);
|
|
288
|
+
// Read as u64 LE — timestamp fits in a regular number
|
|
289
|
+
return Number(buf.readBigUInt64LE(KVAULT_LAST_FEE_CHARGE_TS_OFFSET));
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Check if a Kamino kVault is stale (needs an `invest` call to refresh).
|
|
293
|
+
*
|
|
294
|
+
* @param vaultStateData - Raw account data for the Kamino VaultState
|
|
295
|
+
* @param currentSlotTimestamp - Current cluster timestamp (seconds)
|
|
296
|
+
* @returns true if the vault is stale (last_fee_charge_timestamp is older than threshold)
|
|
297
|
+
*/
|
|
298
|
+
function isKvaultStale(vaultStateData, currentSlotTimestamp) {
|
|
299
|
+
const ts = readKvaultLastFeeChargeTs(vaultStateData);
|
|
300
|
+
if (ts === undefined)
|
|
301
|
+
return true; // can't read — assume stale
|
|
302
|
+
return (currentSlotTimestamp - ts) > exports.KVAULT_STALENESS_THRESHOLD;
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Check if any registered kVault protocol is stale and return the stale vault states.
|
|
306
|
+
*
|
|
307
|
+
* @param connection - Solana connection
|
|
308
|
+
* @param protocols - Protocol pubkeys from the lend strategy state
|
|
309
|
+
* @returns Array of stale kVault state pubkeys
|
|
310
|
+
*/
|
|
311
|
+
async function findStaleKvaults(connection, protocols) {
|
|
312
|
+
if (protocols.length === 0)
|
|
313
|
+
return [];
|
|
314
|
+
const [accountInfos, slot] = await Promise.all([
|
|
315
|
+
connection.getMultipleAccountsInfo(protocols),
|
|
316
|
+
connection.getSlot("confirmed"),
|
|
317
|
+
]);
|
|
318
|
+
// Estimate timestamp from slot (not exact, but close enough for staleness)
|
|
319
|
+
const epochInfo = await connection.getEpochInfo("confirmed");
|
|
320
|
+
const blockTime = await connection.getBlockTime(slot);
|
|
321
|
+
const currentTs = blockTime ?? Math.floor(Date.now() / 1000);
|
|
322
|
+
const stale = [];
|
|
323
|
+
for (let i = 0; i < protocols.length; i++) {
|
|
324
|
+
const info = accountInfos[i];
|
|
325
|
+
if (!info)
|
|
326
|
+
continue;
|
|
327
|
+
// Only check accounts owned by Kamino Vault program
|
|
328
|
+
if (!info.owner.equals(constants_1.KAMINO_VAULT_PROGRAM))
|
|
329
|
+
continue;
|
|
330
|
+
if (isKvaultStale(info.data, currentTs)) {
|
|
331
|
+
stale.push(protocols[i]);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
void epochInfo; // suppress unused warning
|
|
335
|
+
return stale;
|
|
336
|
+
}
|
|
337
|
+
// ---------------------------------------------------------------------------
|
|
338
|
+
// Kamino Invest Instruction Builder
|
|
339
|
+
// ---------------------------------------------------------------------------
|
|
340
|
+
/** Anchor discriminator: sha256("global:invest")[..8] */
|
|
341
|
+
const IX_INVEST = Buffer.from([13, 245, 180, 103, 254, 182, 121, 4]);
|
|
342
|
+
/** PDA seed for ctoken_vault: ["ctoken_vault", vault_state, reserve] */
|
|
343
|
+
const CTOKEN_VAULT_SEED = Buffer.from("ctoken_vault");
|
|
344
|
+
/** PDA seed for whitelisted_reserves: ["whitelisted_reserves", reserve] */
|
|
345
|
+
const WHITELISTED_RESERVES_SEED = Buffer.from("whitelisted_reserves");
|
|
346
|
+
/**
|
|
347
|
+
* Build a Kamino `invest` instruction to refresh a stale kVault.
|
|
348
|
+
*
|
|
349
|
+
* `invest` is permissionless — anyone can call it. It refreshes the vault's
|
|
350
|
+
* `last_fee_charge_timestamp` which is required for elemental-lend's update_aum
|
|
351
|
+
* staleness check (120s threshold).
|
|
352
|
+
*
|
|
353
|
+
* @param payer - Transaction signer (pays for any crank fee, usually 0)
|
|
354
|
+
* @param payerTokenAccount - Payer's base token ATA (for crank fee)
|
|
355
|
+
* @param vaultState - Kamino vault_state pubkey
|
|
356
|
+
* @param baseMint - Base token mint (e.g., USDC)
|
|
357
|
+
* @param vaultStateData - Raw vault_state account data (for reading allocation)
|
|
358
|
+
* @param reserveData - Raw KLend reserve account data (for reading lending_market, etc.)
|
|
359
|
+
* @param allocationIndex - Which vault allocation to invest (default 0)
|
|
360
|
+
*/
|
|
361
|
+
function buildKaminoInvestIx(payer, payerTokenAccount, vaultState, baseMint, vaultStateData, reserveData, allocationIndex = 0) {
|
|
362
|
+
const alloc = readVaultAllocation(vaultStateData, allocationIndex);
|
|
363
|
+
const res = readReserveAccounts(reserveData);
|
|
364
|
+
const [lendingMarketAuthority] = findLendingMarketAuthority(res.lendingMarket);
|
|
365
|
+
const [tokenVault] = findKvaultTokenVault(vaultState);
|
|
366
|
+
const [authority] = findKvaultAuthority(vaultState);
|
|
367
|
+
// ctoken_vault PDA: ["ctoken_vault", vault_state, reserve] under Kamino
|
|
368
|
+
const [ctokenVault] = web3_js_1.PublicKey.findProgramAddressSync([CTOKEN_VAULT_SEED, vaultState.toBuffer(), alloc.reserve.toBuffer()], constants_1.KAMINO_VAULT_PROGRAM);
|
|
369
|
+
// reserve_whitelist_entry PDA: ["whitelisted_reserves", reserve] under Kamino (optional)
|
|
370
|
+
const [reserveWhitelist] = web3_js_1.PublicKey.findProgramAddressSync([WHITELISTED_RESERVES_SEED, alloc.reserve.toBuffer()], constants_1.KAMINO_VAULT_PROGRAM);
|
|
371
|
+
const keys = [
|
|
372
|
+
{ pubkey: payer, isSigner: true, isWritable: true }, // 0: payer
|
|
373
|
+
{ pubkey: payerTokenAccount, isSigner: false, isWritable: true }, // 1: payer_token_account
|
|
374
|
+
{ pubkey: vaultState, isSigner: false, isWritable: true }, // 2: vault_state
|
|
375
|
+
{ pubkey: tokenVault, isSigner: false, isWritable: true }, // 3: token_vault
|
|
376
|
+
{ pubkey: baseMint, isSigner: false, isWritable: true }, // 4: token_mint
|
|
377
|
+
{ pubkey: authority, isSigner: false, isWritable: true }, // 5: base_vault_authority
|
|
378
|
+
{ pubkey: ctokenVault, isSigner: false, isWritable: true }, // 6: ctoken_vault
|
|
379
|
+
{ pubkey: alloc.reserve, isSigner: false, isWritable: true }, // 7: reserve
|
|
380
|
+
{ pubkey: res.lendingMarket, isSigner: false, isWritable: false }, // 8: lending_market
|
|
381
|
+
{ pubkey: lendingMarketAuthority, isSigner: false, isWritable: false }, // 9: lending_market_authority
|
|
382
|
+
{ pubkey: res.reserveLiquiditySupply, isSigner: false, isWritable: true }, // 10: reserve_liquidity_supply
|
|
383
|
+
{ pubkey: res.reserveCollateralMint, isSigner: false, isWritable: true }, // 11: reserve_collateral_mint
|
|
384
|
+
{ pubkey: reserveWhitelist, isSigner: false, isWritable: false }, // 12: reserve_whitelist_entry (optional)
|
|
385
|
+
{ pubkey: exports.KLEND_PROGRAM, isSigner: false, isWritable: false }, // 13: klend_program
|
|
386
|
+
{ pubkey: SPL_TOKEN_PROGRAM, isSigner: false, isWritable: false }, // 14: reserve_collateral_token_program
|
|
387
|
+
{ pubkey: SPL_TOKEN_PROGRAM, isSigner: false, isWritable: false }, // 15: token_program
|
|
388
|
+
{ pubkey: SYSVAR_INSTRUCTIONS, isSigner: false, isWritable: false }, // 16: instruction_sysvar_account
|
|
389
|
+
];
|
|
390
|
+
// Append ALL reserves for batch refresh, then lending_market at the end.
|
|
391
|
+
// cpi_refresh_reserves uses .take(reserves_count) to get just reserves.
|
|
392
|
+
// The lending_market must be in the transaction but AFTER reserves.
|
|
393
|
+
const allReserves = [];
|
|
394
|
+
for (let ai = 0; ai < 10; ai++) {
|
|
395
|
+
try {
|
|
396
|
+
const a = readVaultAllocation(vaultStateData, ai);
|
|
397
|
+
if (a.reserve.equals(web3_js_1.PublicKey.default))
|
|
398
|
+
break;
|
|
399
|
+
allReserves.push(a.reserve);
|
|
400
|
+
}
|
|
401
|
+
catch {
|
|
402
|
+
break;
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
for (const r of allReserves) {
|
|
406
|
+
keys.push({ pubkey: r, isSigner: false, isWritable: true });
|
|
407
|
+
}
|
|
408
|
+
// Lending market after reserves (for CPI resolution, not counted as a reserve)
|
|
409
|
+
keys.push({ pubkey: res.lendingMarket, isSigner: false, isWritable: false });
|
|
410
|
+
return new web3_js_1.TransactionInstruction({
|
|
411
|
+
programId: constants_1.KAMINO_VAULT_PROGRAM,
|
|
412
|
+
keys,
|
|
413
|
+
data: IX_INVEST,
|
|
414
|
+
});
|
|
415
|
+
}
|
|
416
|
+
/**
|
|
417
|
+
* Build Kamino `invest` instructions for all stale kVaults in a lend strategy.
|
|
418
|
+
*
|
|
419
|
+
* Checks each registered protocol for staleness and returns invest instructions
|
|
420
|
+
* for any that are stale.
|
|
421
|
+
*
|
|
422
|
+
* @param connection - Solana connection
|
|
423
|
+
* @param payer - Transaction signer
|
|
424
|
+
* @param baseMint - Base token mint
|
|
425
|
+
* @param protocols - Registered protocol pubkeys from lend strategy state
|
|
426
|
+
*/
|
|
427
|
+
async function buildKaminoInvestIxsIfStale(connection, payer, baseMint, protocols) {
|
|
428
|
+
const staleVaults = await findStaleKvaults(connection, protocols);
|
|
429
|
+
if (staleVaults.length === 0)
|
|
430
|
+
return [];
|
|
431
|
+
const TOKEN_PROG = new web3_js_1.PublicKey("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA");
|
|
432
|
+
const ATA_PROG = new web3_js_1.PublicKey("ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL");
|
|
433
|
+
// Payer's base ATA (for crank fee — usually 0)
|
|
434
|
+
const [payerAta] = web3_js_1.PublicKey.findProgramAddressSync([payer.toBuffer(), TOKEN_PROG.toBuffer(), baseMint.toBuffer()], ATA_PROG);
|
|
435
|
+
const ixs = [];
|
|
436
|
+
for (const vaultState of staleVaults) {
|
|
437
|
+
try {
|
|
438
|
+
// Fetch vault_state and its first reserve
|
|
439
|
+
const vaultInfo = await connection.getAccountInfo(vaultState);
|
|
440
|
+
if (!vaultInfo)
|
|
441
|
+
continue;
|
|
442
|
+
const alloc = readVaultAllocation(vaultInfo.data, 0);
|
|
443
|
+
if (alloc.reserve.equals(web3_js_1.PublicKey.default))
|
|
444
|
+
continue;
|
|
445
|
+
const reserveInfo = await connection.getAccountInfo(alloc.reserve);
|
|
446
|
+
if (!reserveInfo)
|
|
447
|
+
continue;
|
|
448
|
+
// Validate reserve is owned by KLend (skip if migrated/closed)
|
|
449
|
+
if (!reserveInfo.owner.equals(exports.KLEND_PROGRAM))
|
|
450
|
+
continue;
|
|
451
|
+
ixs.push(buildKaminoInvestIx(payer, payerAta, vaultState, baseMint, vaultInfo.data, reserveInfo.data, 0));
|
|
452
|
+
}
|
|
453
|
+
catch {
|
|
454
|
+
// Skip vault if any account data is unreadable
|
|
455
|
+
continue;
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
return ixs;
|
|
459
|
+
}
|
|
460
|
+
//# sourceMappingURL=kamino-vault.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kamino-vault.js","sourceRoot":"","sources":["../../src/elemental-lend/kamino-vault.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Protocol action transaction builders for Elemental Lend.
|
|
3
|
+
*
|
|
4
|
+
* Builds complete instruction arrays for deposit/withdraw to/from
|
|
5
|
+
* Kamino kVault and Jupiter Lend protocols. Ready to pass to sendSmartTx.
|
|
6
|
+
*/
|
|
7
|
+
import { Connection, PublicKey, TransactionInstruction } from "@solana/web3.js";
|
|
8
|
+
/**
|
|
9
|
+
* Minimal connection interface to avoid nominal type mismatches when the
|
|
10
|
+
* consumer has a different version of @solana/web3.js installed.
|
|
11
|
+
*/
|
|
12
|
+
export type ProtocolActionConnection = Pick<Connection, "getAccountInfo" | "getMultipleAccountsInfo">;
|
|
13
|
+
import type { JupiterLendPool } from "./jupiter-lend";
|
|
14
|
+
export type ProtocolType = "Kamino kVault" | "Jupiter Lend";
|
|
15
|
+
export type ProtocolAction = "deposit" | "withdraw";
|
|
16
|
+
export interface ProtocolActionArgs {
|
|
17
|
+
connection: ProtocolActionConnection;
|
|
18
|
+
/** Manager wallet (signer) */
|
|
19
|
+
manager: PublicKey;
|
|
20
|
+
/** Lend strategy state PDA (derived from baseMint if not provided) */
|
|
21
|
+
strategyState?: PublicKey;
|
|
22
|
+
/** Protocol address (Kamino vault_state or Jupiter Lend lending account) */
|
|
23
|
+
protocol: PublicKey;
|
|
24
|
+
protocolType: ProtocolType;
|
|
25
|
+
action: ProtocolAction;
|
|
26
|
+
/** Amount in base token units (e.g. USDC lamports) */
|
|
27
|
+
amount: bigint;
|
|
28
|
+
baseMint: PublicKey;
|
|
29
|
+
/** Token program for the base mint (defaults to SPL Token) */
|
|
30
|
+
tokenProgram?: PublicKey;
|
|
31
|
+
/** Jupiter Lend pool config (defaults to USDC_POOL) */
|
|
32
|
+
jupLendPool?: JupiterLendPool;
|
|
33
|
+
/** Elemental Lend program ID (defaults to PROGRAM_ID) */
|
|
34
|
+
programId?: PublicKey;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Build complete instruction array for a protocol deposit or withdraw.
|
|
38
|
+
*
|
|
39
|
+
* Returns instructions including a compute budget instruction (400k CU)
|
|
40
|
+
* and the protocol-specific instruction with all accounts resolved.
|
|
41
|
+
*
|
|
42
|
+
* For Kamino kVault withdraw: reads vault_state on-chain to convert
|
|
43
|
+
* base amount to kvToken shares, and reads KLend reserves for the
|
|
44
|
+
* withdraw accounts.
|
|
45
|
+
*
|
|
46
|
+
* @returns TransactionInstruction[] ready for sendSmartTx
|
|
47
|
+
*/
|
|
48
|
+
export declare function buildProtocolActionIxs(args: ProtocolActionArgs): Promise<TransactionInstruction[]>;
|
|
49
|
+
//# sourceMappingURL=protocol-actions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol-actions.d.ts","sourceRoot":"","sources":["../../src/elemental-lend/protocol-actions.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,UAAU,EACV,SAAS,EACT,sBAAsB,EACvB,MAAM,iBAAiB,CAAC;AAGzB;;;GAGG;AACH,MAAM,MAAM,wBAAwB,GAAG,IAAI,CAAC,UAAU,EAClD,gBAAgB,GAChB,yBAAyB,CAC5B,CAAC;AAsBF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAsBtD,MAAM,MAAM,YAAY,GAAG,eAAe,GAAG,cAAc,CAAC;AAC5D,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,UAAU,CAAC;AAEpD,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,wBAAwB,CAAC;IACrC,8BAA8B;IAC9B,OAAO,EAAE,SAAS,CAAC;IACnB,sEAAsE;IACtE,aAAa,CAAC,EAAE,SAAS,CAAC;IAC1B,4EAA4E;IAC5E,QAAQ,EAAE,SAAS,CAAC;IACpB,YAAY,EAAE,YAAY,CAAC;IAC3B,MAAM,EAAE,cAAc,CAAC;IACvB,sDAAsD;IACtD,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,SAAS,CAAC;IACpB,8DAA8D;IAC9D,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,uDAAuD;IACvD,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,yDAAyD;IACzD,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAMD;;;;;;;;;;;GAWG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAmDnC"}
|