@temporalabs/treasury 0.1.2 → 0.1.4
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/README.md +45 -13
- package/THIRD_PARTY_NOTICES.connect-page.md +494 -24
- package/THIRD_PARTY_NOTICES.md +579 -6
- package/dist/cli.js +28 -5
- package/dist/cli.js.map +1 -1
- package/dist/client.d.ts +50 -209
- package/dist/client.js +66 -11
- package/dist/client.js.map +1 -1
- package/dist/config/earn.d.ts +16 -1
- package/dist/config/earn.js +16 -1
- package/dist/config/earn.js.map +1 -1
- package/dist/connect/ack.d.ts +88 -1
- package/dist/connect/ack.js +177 -6
- package/dist/connect/ack.js.map +1 -1
- package/dist/connect/commands.d.ts +30 -0
- package/dist/connect/commands.js +846 -88
- package/dist/connect/commands.js.map +1 -1
- package/dist/connect/config.d.ts +7 -5
- package/dist/connect/config.js +8 -6
- package/dist/connect/config.js.map +1 -1
- package/dist/connect/gate-solana.d.ts +8 -0
- package/dist/connect/gate-solana.js +147 -0
- package/dist/connect/gate-solana.js.map +1 -0
- package/dist/connect/http.d.ts +17 -2
- package/dist/connect/http.js +45 -13
- package/dist/connect/http.js.map +1 -1
- package/dist/connect/page.d.ts +1 -1
- package/dist/connect/page.js +2 -2
- package/dist/connect/page.js.map +1 -1
- package/dist/connect/session.d.ts +40 -1
- package/dist/connect/session.js +243 -2
- package/dist/connect/session.js.map +1 -1
- package/dist/connect/solana.d.ts +112 -0
- package/dist/connect/solana.js +370 -0
- package/dist/connect/solana.js.map +1 -0
- package/dist/connect-page.js +835 -671
- package/dist/disclosures.d.ts +7 -4
- package/dist/disclosures.js +7 -4
- package/dist/disclosures.js.map +1 -1
- package/dist/earn/commands.js +127 -54
- package/dist/earn/commands.js.map +1 -1
- package/dist/earn/solana.d.ts +278 -0
- package/dist/earn/solana.js +316 -0
- package/dist/earn/solana.js.map +1 -0
- package/dist/guide.d.ts +15 -0
- package/dist/guide.js +50 -0
- package/dist/guide.js.map +1 -0
- package/dist/links.js +2 -0
- package/dist/links.js.map +1 -1
- package/dist/position.d.ts +3 -2
- package/dist/position.js +6 -3
- package/dist/position.js.map +1 -1
- package/dist/quote.js +2 -2
- package/dist/quote.js.map +1 -1
- package/dist/redact.js +7 -1
- package/dist/redact.js.map +1 -1
- package/dist/registry-schema.d.ts +79 -2
- package/dist/registry-schema.js +77 -1
- package/dist/registry-schema.js.map +1 -1
- package/dist/registry.d.ts +21 -1
- package/dist/registry.js +48 -10
- package/dist/registry.js.map +1 -1
- package/dist/solana/constants.d.ts +49 -0
- package/dist/solana/constants.js +50 -0
- package/dist/solana/constants.js.map +1 -0
- package/dist/solana/kvault.d.ts +99 -0
- package/dist/solana/kvault.js +192 -0
- package/dist/solana/kvault.js.map +1 -0
- package/dist/solana/layout.d.ts +143 -0
- package/dist/solana/layout.js +209 -0
- package/dist/solana/layout.js.map +1 -0
- package/dist/solana/rpc.d.ts +24 -0
- package/dist/solana/rpc.js +66 -0
- package/dist/solana/rpc.js.map +1 -0
- package/dist/solana/vault.d.ts +153 -0
- package/dist/solana/vault.js +322 -0
- package/dist/solana/vault.js.map +1 -0
- package/dist/treasury.mjs +37410 -27965
- package/dist/version.js +5 -10
- package/dist/version.js.map +1 -1
- package/llms.txt +637 -0
- package/package.json +14 -8
- package/registry/vaults.json +113 -0
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A Kamino vault on Solana, read and simulated: what the earn commands report for `chain: "solana"`.
|
|
3
|
+
*
|
|
4
|
+
* Every verdict here comes from the chain. Amounts out of a quote, a pre-flight or a position's exit are
|
|
5
|
+
* read from a SIMULATED transaction's post-state — the token balance the user's account would hold after
|
|
6
|
+
* it — never computed from a rule this client restates. That matters on this program in particular:
|
|
7
|
+
* measured on mainnet on 2026-10-11, each `withdraw` INSTRUCTION keeps up to 0.001 USDC in the vault (one
|
|
8
|
+
* instruction: 10,000 base units paid 9,000, 2,000,000 kept 1,000; the same 2,000,000 as two instructions
|
|
9
|
+
* kept 1,929; a two-leg full exit kept 1,000), and one worth 0.001 USDC or less is refused (error 7049). The
|
|
10
|
+
* cause is the vault program's GLOBAL withdrawal penalty — its global config account
|
|
11
|
+
* (BKyTcUe6daNG8HbgBix2ugdRHbykG2dK9hPBBqhUyoEX) holds `withdrawalPenaltyLamports` = 1000 and
|
|
12
|
+
* `withdrawalPenaltyBps` = 0 — while this vault's own penalty settings read 0. Kamino can change the global
|
|
13
|
+
* value, and how it combines across legs is not a rule this client restates: a simulated quote is exact.
|
|
14
|
+
*/
|
|
15
|
+
import { address } from "@solana/kit";
|
|
16
|
+
import { formatAmount, parseAmount } from "../units.js";
|
|
17
|
+
import { describeError } from "../redact.js";
|
|
18
|
+
import { decodeReserve, decodeVaultState, vaultHoldings } from "./layout.js";
|
|
19
|
+
import { associatedTokenAccount, compileUnsigned, DISCRIMINATORS, createAtaIdempotentIx, depositIx, setComputeUnitLimitIx, withdrawIx, } from "./kvault.js";
|
|
20
|
+
import { DEFAULT_PUBKEY, KVAULT_PROGRAM_ID, MAX_COMPUTE_UNITS, MAX_TRANSACTION_BYTES } from "./constants.js";
|
|
21
|
+
const b64 = (data) => new Uint8Array(Buffer.from(data[0], "base64"));
|
|
22
|
+
/**
|
|
23
|
+
* Reads the vault state and its reserves, and refuses a row the chain disagrees with: the registry's asset,
|
|
24
|
+
* share mint and decimals are claims, and the vault state is the authority over them.
|
|
25
|
+
*/
|
|
26
|
+
export async function readVault(rpc, entry) {
|
|
27
|
+
const first = await rpc.getAccountInfo(address(entry.address), { encoding: "base64" }).send();
|
|
28
|
+
if (!first.value)
|
|
29
|
+
throw new Error(`no account at ${entry.address} on this cluster — the endpoint is not Solana mainnet, or the registry row is wrong`);
|
|
30
|
+
const state = decodeVaultState(b64(first.value.data));
|
|
31
|
+
const disagree = [];
|
|
32
|
+
if (state.tokenMint !== entry.asset.address)
|
|
33
|
+
disagree.push(`asset ${entry.asset.address} != the vault's token mint ${state.tokenMint}`);
|
|
34
|
+
if (state.sharesMint !== entry.sharesMint)
|
|
35
|
+
disagree.push(`sharesMint ${entry.sharesMint} != the vault's ${state.sharesMint}`);
|
|
36
|
+
if (Number(state.tokenMintDecimals) !== entry.asset.decimals)
|
|
37
|
+
disagree.push(`asset decimals ${entry.asset.decimals} != ${state.tokenMintDecimals}`);
|
|
38
|
+
if (Number(state.sharesMintDecimals) !== entry.shareDecimals)
|
|
39
|
+
disagree.push(`shareDecimals ${entry.shareDecimals} != ${state.sharesMintDecimals}`);
|
|
40
|
+
if (disagree.length > 0)
|
|
41
|
+
throw new Error(`the registry row for ${entry.symbol} disagrees with the chain: ${disagree.join("; ")}`);
|
|
42
|
+
const keys = state.allocations.map((a) => address(a.reserve));
|
|
43
|
+
const res = keys.length === 0 ? { value: [], context: first.context } : await rpc.getMultipleAccounts(keys, { encoding: "base64" }).send();
|
|
44
|
+
const reserves = new Map();
|
|
45
|
+
res.value.forEach((acc, i) => {
|
|
46
|
+
if (!acc)
|
|
47
|
+
throw new Error(`the vault allocates to reserve ${keys[i]}, which does not exist on this cluster`);
|
|
48
|
+
reserves.set(keys[i], decodeReserve(b64(acc.data)));
|
|
49
|
+
});
|
|
50
|
+
return {
|
|
51
|
+
entry,
|
|
52
|
+
state,
|
|
53
|
+
reserves,
|
|
54
|
+
holdings: vaultHoldings(state, reserves),
|
|
55
|
+
accounts: {
|
|
56
|
+
vaultState: entry.address,
|
|
57
|
+
tokenVault: state.tokenVault,
|
|
58
|
+
tokenMint: state.tokenMint,
|
|
59
|
+
baseVaultAuthority: state.baseVaultAuthority,
|
|
60
|
+
sharesMint: state.sharesMint,
|
|
61
|
+
vaultReserves: state.allocations.map((a) => ({ reserve: a.reserve, lendingMarket: reserves.get(a.reserve).lendingMarket })),
|
|
62
|
+
},
|
|
63
|
+
slot: BigInt(res.context.slot),
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
/** What one share is worth in the asset, as a decimal string at the asset's precision (stored reserve state). */
|
|
67
|
+
export function sharePrice(v) {
|
|
68
|
+
if (v.state.sharesIssued === 0n)
|
|
69
|
+
return formatAmount(10n ** BigInt(v.entry.asset.decimals), v.entry.asset.decimals);
|
|
70
|
+
return formatAmount((v.holdings.netAum * 10n ** BigInt(v.entry.shareDecimals)) / v.state.sharesIssued, v.entry.asset.decimals);
|
|
71
|
+
}
|
|
72
|
+
/** An SPL token account's balance, or 0 when the account does not exist. */
|
|
73
|
+
export async function tokenBalance(rpc, account) {
|
|
74
|
+
const r = await rpc.getAccountInfo(address(account), { encoding: "base64" }).send();
|
|
75
|
+
if (!r.value)
|
|
76
|
+
return { exists: false, amount: 0n };
|
|
77
|
+
return { exists: true, amount: splAmount(b64(r.value.data)) };
|
|
78
|
+
}
|
|
79
|
+
/** The `amount` of an SPL token account: a u64 at offset 64. */
|
|
80
|
+
function splAmount(data) {
|
|
81
|
+
if (data.length < 72)
|
|
82
|
+
throw new Error(`a token account is at least 72 bytes, got ${data.length}`);
|
|
83
|
+
return new DataView(data.buffer, data.byteOffset, data.byteLength).getBigUint64(64, true);
|
|
84
|
+
}
|
|
85
|
+
/* ─────────────────────────── building ─────────────────────────── */
|
|
86
|
+
/**
|
|
87
|
+
* Compute-unit limits. Measured by simulation on mainnet, 2026-10-11, with two funded reserves: a deposit
|
|
88
|
+
* used about 115,000 units; a withdrawal about 144,000 paid from idle, 186,000 when it disinvests from one
|
|
89
|
+
* reserve, and 346,000 for a two-leg exit. The limits (400,000 per leg) leave room and cost nothing unless a
|
|
90
|
+
* priority fee is set.
|
|
91
|
+
*/
|
|
92
|
+
export const DEPOSIT_COMPUTE_UNITS = 400_000;
|
|
93
|
+
export const WITHDRAW_COMPUTE_UNITS_PER_RESERVE = 400_000;
|
|
94
|
+
/**
|
|
95
|
+
* Refuses while the vault requires a co-signer. Kamino's program lets a "permissioning authority" be set on a
|
|
96
|
+
* vault, after which it must co-sign every deposit AND every withdrawal; this client builds single-signer
|
|
97
|
+
* transactions only, so it cannot move money in or out while one is set. Unset today; checked on every build.
|
|
98
|
+
*/
|
|
99
|
+
export function assertNoCoSigner(v) {
|
|
100
|
+
const refusal = coSignerRefusal(v);
|
|
101
|
+
if (refusal)
|
|
102
|
+
throw new Error(`refused: ${refusal} Nothing was prepared.`);
|
|
103
|
+
}
|
|
104
|
+
/** Why the vault refuses this client while a co-signer is set, or `undefined` when none is. */
|
|
105
|
+
function coSignerRefusal(v) {
|
|
106
|
+
if (v.state.permissioningAuthority === DEFAULT_PUBKEY)
|
|
107
|
+
return undefined;
|
|
108
|
+
return `${v.entry.symbol} now requires a co-signer (permissioning authority ${v.state.permissioningAuthority}) for every deposit and withdrawal, and this client builds single-signer transactions only.`;
|
|
109
|
+
}
|
|
110
|
+
/** The deposit: create the user's share account if it is missing, then deposit `amount` base units. */
|
|
111
|
+
export async function depositInstructions(v, user, amount) {
|
|
112
|
+
assertNoCoSigner(v);
|
|
113
|
+
return [
|
|
114
|
+
setComputeUnitLimitIx(DEPOSIT_COMPUTE_UNITS),
|
|
115
|
+
await createAtaIdempotentIx(user, v.state.sharesMint),
|
|
116
|
+
await depositIx({
|
|
117
|
+
...v.accounts,
|
|
118
|
+
user,
|
|
119
|
+
userTokenAta: await associatedTokenAccount(user, v.state.tokenMint),
|
|
120
|
+
userSharesAta: await associatedTokenAccount(user, v.state.sharesMint),
|
|
121
|
+
maxAmount: amount,
|
|
122
|
+
}),
|
|
123
|
+
];
|
|
124
|
+
}
|
|
125
|
+
function reserveAccounts(v, reserve) {
|
|
126
|
+
const r = v.reserves.get(reserve);
|
|
127
|
+
return { reserve, lendingMarket: r.lendingMarket, liquiditySupplyVault: r.liquiditySupplyVault, collateralMint: r.collateralMint };
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* The withdrawal of `shares`: the account's USDC account if it is missing, then one `withdraw` per reserve
|
|
131
|
+
* it needs. Each pays from the vault's idle balance
|
|
132
|
+
* first and then from its named reserve, so the shares are split across reserves in order of what each can
|
|
133
|
+
* release now (the vault's position in it, capped by the reserve's own available liquidity). A vault with no
|
|
134
|
+
* reserves cannot be withdrawn from by this program's instruction, and is refused.
|
|
135
|
+
*
|
|
136
|
+
* ⚠️ The program CAPS a leg that asks for more than it can pay rather than reverting it (measured: a leg
|
|
137
|
+
* oversized by 500,000 shares succeeded, paid the leg's maximum and left the excess shares with the user).
|
|
138
|
+
* So every build path simulates the withdrawal and refuses it unless every share burns, less rounding
|
|
139
|
+
* (`simulateWithdrawal`, `partialWithdrawal`). A reserve's state can still move between that simulation and the send, and then the
|
|
140
|
+
* transaction lands paying less, with no error; `verifySolanaLanded` reports that as a partial withdrawal.
|
|
141
|
+
*/
|
|
142
|
+
export async function withdrawInstructions(v, user, shares) {
|
|
143
|
+
assertNoCoSigner(v);
|
|
144
|
+
if (v.state.allocations.length === 0)
|
|
145
|
+
throw new Error(`${v.entry.symbol} has no reserve, and a withdrawal names one`);
|
|
146
|
+
if (shares <= 0n)
|
|
147
|
+
throw new Error("a withdrawal of 0 shares");
|
|
148
|
+
const userTokenAta = await associatedTokenAccount(user, v.state.tokenMint);
|
|
149
|
+
const userSharesAta = await associatedTokenAccount(user, v.state.sharesMint);
|
|
150
|
+
const perShareNum = v.holdings.netAum;
|
|
151
|
+
const perShareDen = v.state.sharesIssued === 0n ? 1n : v.state.sharesIssued;
|
|
152
|
+
const capacity = (reserve) => {
|
|
153
|
+
const held = v.holdings.byReserve.get(reserve) ?? 0n;
|
|
154
|
+
const avail = v.reserves.get(reserve).totalAvailableAmount;
|
|
155
|
+
return held < avail ? held : avail;
|
|
156
|
+
};
|
|
157
|
+
const order = [...v.state.allocations.map((a) => a.reserve)].sort((a, b) => (capacity(b) > capacity(a) ? 1 : capacity(b) < capacity(a) ? -1 : 0));
|
|
158
|
+
const legs = [];
|
|
159
|
+
let left = shares;
|
|
160
|
+
let idle = v.holdings.idle;
|
|
161
|
+
for (const [i, reserve] of order.entries()) {
|
|
162
|
+
if (left === 0n)
|
|
163
|
+
break;
|
|
164
|
+
const tokens = idle + capacity(reserve);
|
|
165
|
+
const fits = perShareNum === 0n ? left : (tokens * perShareDen) / perShareNum;
|
|
166
|
+
// The last reserve in ORDER takes the rest. Counting the legs pushed so far missed it whenever an earlier
|
|
167
|
+
// reserve could release nothing (no leg pushed), and the rest then became a second leg on order[0].
|
|
168
|
+
const take = i === order.length - 1 || fits >= left ? left : fits;
|
|
169
|
+
if (take > 0n)
|
|
170
|
+
legs.push({ reserve, shares: take });
|
|
171
|
+
left -= take;
|
|
172
|
+
idle = 0n;
|
|
173
|
+
}
|
|
174
|
+
// The account's own USDC account must exist for the program to pay into; create it if it does not
|
|
175
|
+
// (idempotent: nothing happens when it exists, which is the usual case for an account that deposited).
|
|
176
|
+
const ixs = [
|
|
177
|
+
setComputeUnitLimitIx(Math.min(MAX_COMPUTE_UNITS, WITHDRAW_COMPUTE_UNITS_PER_RESERVE * legs.length)),
|
|
178
|
+
await createAtaIdempotentIx(user, v.state.tokenMint),
|
|
179
|
+
];
|
|
180
|
+
for (const leg of legs) {
|
|
181
|
+
ixs.push(await withdrawIx({ ...v.accounts, user, userTokenAta, userSharesAta, sharesAmount: leg.shares, reserve: reserveAccounts(v, leg.reserve) }));
|
|
182
|
+
}
|
|
183
|
+
return ixs;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Simulates an unsigned transaction against the RPC's current state. `sigVerify: false` lets the signer slot
|
|
187
|
+
* be any address (nothing is signed); `replaceRecentBlockhash` makes the blockhash irrelevant. READ-ONLY:
|
|
188
|
+
* nothing lands, nothing is paid.
|
|
189
|
+
*/
|
|
190
|
+
export async function simulate(rpc, ixs, feePayer, watch) {
|
|
191
|
+
const tx = compileUnsigned(ixs, feePayer, { blockhash: "11111111111111111111111111111111", lastValidBlockHeight: 0n });
|
|
192
|
+
if (tx.bytes > MAX_TRANSACTION_BYTES)
|
|
193
|
+
throw new Error(`the transaction is ${tx.bytes} bytes, over Solana's ${MAX_TRANSACTION_BYTES}-byte limit`);
|
|
194
|
+
const res = await rpc
|
|
195
|
+
.simulateTransaction(tx.base64, {
|
|
196
|
+
encoding: "base64",
|
|
197
|
+
sigVerify: false,
|
|
198
|
+
replaceRecentBlockhash: true,
|
|
199
|
+
commitment: "confirmed",
|
|
200
|
+
accounts: { addresses: watch.map((a) => address(a)), encoding: "base64" },
|
|
201
|
+
})
|
|
202
|
+
.send();
|
|
203
|
+
const after = new Map();
|
|
204
|
+
(res.value.accounts ?? []).forEach((acc, i) => after.set(watch[i], acc ? splAmount(b64(acc.data)) : null));
|
|
205
|
+
return { ok: res.value.err === null, err: res.value.err, logs: res.value.logs ?? [], unitsConsumed: res.value.unitsConsumed ?? null, slot: BigInt(res.context.slot), after };
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Simulates a withdrawal and reads, from the account's own token accounts, what it would pay and how many shares
|
|
209
|
+
* it would burn. The program caps a leg it cannot pay in full rather than failing it (see `withdrawInstructions`),
|
|
210
|
+
* so `burned` short of the shares asked for means the transaction would land as a partial withdrawal. Both are
|
|
211
|
+
* `undefined` when the simulation fails or the account's USDC account would not exist. `legs` is the number of
|
|
212
|
+
* withdraw instructions.
|
|
213
|
+
*/
|
|
214
|
+
export async function simulateWithdrawal(rpc, v, user, ixs) {
|
|
215
|
+
const tokenAta = await associatedTokenAccount(user, v.state.tokenMint);
|
|
216
|
+
const sharesAta = await associatedTokenAccount(user, v.state.sharesMint);
|
|
217
|
+
const [token, held] = await Promise.all([tokenBalance(rpc, tokenAta), tokenBalance(rpc, sharesAta)]);
|
|
218
|
+
const sim = await simulate(rpc, ixs, user, [tokenAta, sharesAta]);
|
|
219
|
+
const legs = ixs.filter((ix) => isWithdrawInstruction(ix.programAddress, ix.data)).length;
|
|
220
|
+
const tokenAfter = sim.after.get(tokenAta);
|
|
221
|
+
if (!sim.ok || tokenAfter === null || tokenAfter === undefined)
|
|
222
|
+
return { sim, legs };
|
|
223
|
+
return { sim, received: tokenAfter - token.amount, burned: held.amount - (sim.after.get(sharesAta) ?? 0n), legs };
|
|
224
|
+
}
|
|
225
|
+
/** A kVault withdraw instruction: the program's address and the instruction's discriminator. */
|
|
226
|
+
export function isWithdrawInstruction(programAddress, data) {
|
|
227
|
+
return programAddress === KVAULT_PROGRAM_ID && data !== undefined && DISCRIMINATORS.withdraw.every((x, i) => data[i] === x);
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Why a simulated withdrawal that burns fewer shares than asked for is refused, or `undefined` when it burns them
|
|
231
|
+
* all. Up to one share unit per withdraw instruction is rounding, not a capped leg: the program floors what a
|
|
232
|
+
* leg pays and then ceils the shares that payment burns, which comes out one unit short when a share is worth
|
|
233
|
+
* less than one base unit of the asset. A capped leg falls short by the part its reserve could not pay.
|
|
234
|
+
*/
|
|
235
|
+
export function partialWithdrawal(asked, burned, legs, shareDecimals, slot) {
|
|
236
|
+
if (burned + BigInt(legs) >= asked)
|
|
237
|
+
return undefined;
|
|
238
|
+
return `the simulated withdrawal at slot ${slot} burns ${formatAmount(burned, shareDecimals)} of the ${formatAmount(asked, shareDecimals)} shares asked for: a reserve cannot pay its full part now, so it would land as a partial withdrawal. Ask the operator whether to withdraw a smaller amount, or try again later`;
|
|
239
|
+
}
|
|
240
|
+
/** One line for a failed simulation: the program's error and the last log lines that say why. */
|
|
241
|
+
export function describeSimulation(s) {
|
|
242
|
+
const err = JSON.stringify(s.err, (_k, x) => (typeof x === "bigint" ? x.toString() : x));
|
|
243
|
+
const why = s.logs.filter((l) => /error|failed|insufficient|exceed|cap|Error Message/i.test(l)).slice(-3);
|
|
244
|
+
return why.length > 0 ? `${err} — ${why.join(" | ")}` : err;
|
|
245
|
+
}
|
|
246
|
+
/** A fee payer with no SOL, or a transaction it cannot pay for: the account itself cannot send anything yet. */
|
|
247
|
+
const NO_FEE_ACCOUNT = /AccountNotFound|InvalidAccountForFee|InsufficientFundsForFee|insufficient lamports/i;
|
|
248
|
+
/** The token transfer refused: the account has no USDC account, or less USDC than asked. */
|
|
249
|
+
const NO_TOKENS = /insufficient funds|InsufficientFunds|custom program error: 0x1\b|AccountNotInitialized|invalid account data for instruction/i;
|
|
250
|
+
/** What `earn status --account` and `earn quote --direction deposit` report on Solana. */
|
|
251
|
+
export async function preflightDepositSolana(rpc, entry, account, amountHuman) {
|
|
252
|
+
const amount = parseAmount(amountHuman ?? "1", entry.asset.decimals, `deposit amount (${entry.asset.symbol})`);
|
|
253
|
+
const findings = [];
|
|
254
|
+
let v;
|
|
255
|
+
try {
|
|
256
|
+
v = await readVault(rpc, entry);
|
|
257
|
+
}
|
|
258
|
+
catch (e) {
|
|
259
|
+
return { vault: entry.symbol, depositor: account, status: "UNRESOLVED", canDeposit: false, findings: [`vault read failed: ${describeError(e)}`] };
|
|
260
|
+
}
|
|
261
|
+
findings.push(`identity OK at slot ${v.slot}: token mint ${v.state.tokenMint}, share mint ${v.state.sharesMint}, ${v.state.allocations.length} reserve(s)`);
|
|
262
|
+
// A co-signer refuses every deposit this client can build: a verdict about the vault, given in full.
|
|
263
|
+
const coSigner = coSignerRefusal(v);
|
|
264
|
+
if (coSigner)
|
|
265
|
+
return { vault: entry.symbol, depositor: account, status: "REVERTED_OTHER", canDeposit: false, findings: [...findings, coSigner] };
|
|
266
|
+
const tokenAta = await associatedTokenAccount(account, v.state.tokenMint);
|
|
267
|
+
const sharesAta = await associatedTokenAccount(account, v.state.sharesMint);
|
|
268
|
+
let held;
|
|
269
|
+
let shares;
|
|
270
|
+
try {
|
|
271
|
+
[held, shares] = await Promise.all([tokenBalance(rpc, tokenAta), tokenBalance(rpc, sharesAta)]);
|
|
272
|
+
}
|
|
273
|
+
catch (e) {
|
|
274
|
+
return { vault: entry.symbol, depositor: account, status: "UNRESOLVED", canDeposit: false, findings: [...findings, `balance reads failed: ${describeError(e)}`] };
|
|
275
|
+
}
|
|
276
|
+
const cap = v.state.depositCap;
|
|
277
|
+
const overCap = cap !== 0n && v.holdings.aumIncludingFees + amount > cap;
|
|
278
|
+
if (overCap) {
|
|
279
|
+
findings.push(`the vault's deposit cap is ${formatAmount(cap, entry.asset.decimals)} ${entry.asset.symbol} and it holds ${formatAmount(v.holdings.aumIncludingFees, entry.asset.decimals)}: this deposit would exceed it`);
|
|
280
|
+
}
|
|
281
|
+
if (!held.exists)
|
|
282
|
+
findings.push(`the account has no ${entry.asset.symbol} token account yet, so it holds no ${entry.asset.symbol} on Solana`);
|
|
283
|
+
else if (held.amount < amount)
|
|
284
|
+
findings.push(`the account holds ${formatAmount(held.amount, entry.asset.decimals)} ${entry.asset.symbol}, less than the ${formatAmount(amount, entry.asset.decimals)} asked`);
|
|
285
|
+
let sim;
|
|
286
|
+
try {
|
|
287
|
+
sim = await simulate(rpc, await depositInstructions(v, account, amount), account, [sharesAta]);
|
|
288
|
+
}
|
|
289
|
+
catch (e) {
|
|
290
|
+
return { vault: entry.symbol, depositor: account, status: "UNRESOLVED", canDeposit: false, findings: [...findings, `simulation failed to run: ${describeError(e)}`] };
|
|
291
|
+
}
|
|
292
|
+
const balances = { asset: formatAmount(held.amount, entry.asset.decimals), shares: formatAmount(shares.amount, entry.shareDecimals) };
|
|
293
|
+
const base = { vault: entry.symbol, depositor: account, balances, quotes: { sharePriceInAssets: `${sharePrice(v)} ${entry.asset.symbol} per share` }, measuredAtSlot: Number(sim.slot) };
|
|
294
|
+
if (sim.ok) {
|
|
295
|
+
const minted = (sim.after.get(sharesAta) ?? 0n) - shares.amount;
|
|
296
|
+
findings.push(`simulated deposit succeeds at slot ${sim.slot}: ${formatAmount(minted, entry.shareDecimals)} shares (${sim.unitsConsumed ?? "?"} compute units)`);
|
|
297
|
+
return { ...base, status: "OPEN_READY", canDeposit: true, expectedSharesRaw: minted, findings };
|
|
298
|
+
}
|
|
299
|
+
const why = describeSimulation(sim);
|
|
300
|
+
const text = `${why} ${sim.logs.join(" ")}`;
|
|
301
|
+
// canDeposit is a yes only when the simulation reached the vault and the vault did not refuse. One that
|
|
302
|
+
// stopped at the fee never reached it, and a deposit over the cap would be refused there once funded.
|
|
303
|
+
if (NO_FEE_ACCOUNT.test(text)) {
|
|
304
|
+
findings.push(`the account cannot pay a transaction fee: it holds no SOL (${why}). It needs SOL for the fee and for its share account's rent, about 0.003 SOL in all. The simulation stopped there, before the vault, so whether the vault takes this deposit was not checked`);
|
|
305
|
+
return { ...base, status: "NEEDS_FUNDS", canDeposit: false, findings };
|
|
306
|
+
}
|
|
307
|
+
if (NO_TOKENS.test(text)) {
|
|
308
|
+
findings.push(overCap
|
|
309
|
+
? `the deposit stopped at the account's own ${entry.asset.symbol} (${why}), and it is over the vault's deposit cap, so the vault would refuse it once funded`
|
|
310
|
+
: `the deposit stopped at the account's own ${entry.asset.symbol} (${why}): the vault did not refuse the account; it needs ${entry.asset.symbol} on Solana`);
|
|
311
|
+
return { ...base, status: "NEEDS_FUNDS", canDeposit: !overCap, findings };
|
|
312
|
+
}
|
|
313
|
+
findings.push(`simulated deposit reverted: ${why}`);
|
|
314
|
+
return { ...base, status: "REVERTED_OTHER", canDeposit: false, findings };
|
|
315
|
+
}
|
|
316
|
+
/** A fresh blockhash: what an unsigned transaction is bound to, and the block height it expires after. */
|
|
317
|
+
export async function freshLifetime(rpc) {
|
|
318
|
+
const [{ value }, height] = await Promise.all([rpc.getLatestBlockhash({ commitment: "confirmed" }).send(), rpc.getBlockHeight({ commitment: "confirmed" }).send()]);
|
|
319
|
+
return { blockhash: value.blockhash, lastValidBlockHeight: BigInt(value.lastValidBlockHeight), currentBlockHeight: BigInt(height) };
|
|
320
|
+
}
|
|
321
|
+
export { compileUnsigned };
|
|
322
|
+
//# sourceMappingURL=vault.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault.js","sourceRoot":"","sources":["../../src/solana/vault.ts"],"names":[],"mappings":"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"}
|